/** * Drizzle ORM schema for CLEO skills.db — per-user skills registry. * * Implements section §4 of `docs/architecture/SG-CLEO-SKILLS-architecture-v3.md`: * a global-tier (per-user, NOT per-project) registry that tracks every Claude * Code / cleo skill the local user has installed, regardless of source. * * The four tables modelled here: * - `skills` — registry row per installed skill (Sphere A canonical * ct-* skills, Sphere B user/community/agent-created) * - `skill_usage` — per-invocation telemetry events (Sphere B writes; * Sphere A is opt-out aggregated only — see §5) * - `skill_reviews` — council + grade outcomes from auto-improve loops * - `skill_patches` — diff payload for auto-improve dry-runs/applied * * Database lifecycle: * - Path: consolidated GLOBAL `/cleo.db` (per-user global, NOT * per-project) — shared with the nexus / signaldock domains since E6-L5. * - Opened via the `openDualScopeDb('global')` chokepoint (ADR-068 + D003) * - Migrations live in `packages/core/migrations/drizzle-cleo-global/` (the * legacy `drizzle-skills/` set is dead weight post-E6-L5 — NOT run on the * shared handle; see `skills-db.ts`). * - First-read materialization: see `skills-db.ts#openSkillsDb` * * Scope note for T9651: * This module is schema-only — the runtime (CLI surface) is wired in * downstream tasks under saga SG-CLEO-SKILLS (Sphere B telemetry in T9561, * auto-improve in later epics). The tables here MUST exist so subsequent * tasks can INSERT/SELECT without re-architecting the storage layer. * * ## E6-L5 physical-name consolidation (T11525) * * The four physical table names below carry the `skills_` domain prefix * (`skills_skills`, `skills_skill_usage`, `skills_skill_reviews`, * `skills_skill_patches`) — NOT the former bare names (`skills`, `skill_usage`, * …). This is required because skills.db now consolidates into the shared GLOBAL * `cleo.db` (E6-L5) alongside the signaldock domain, whose own legacy `skills` * catalog table would otherwise COLLIDE with this registry's bare `skills` table. * The consolidated `drizzle-cleo-global` migration creates these prefixed tables * (column-identical to the legacy shape, plus additive enum/timestamp/boolean * CHECK constraints that ACCEPT every value these writers produce), so * `skills-db.ts` (E6-L5) does NOT run the legacy `drizzle-skills` migration on the * shared handle — it simply binds this schema's drizzle queries to the * already-created consolidated tables. The TS export NAMES (`skills`, `skillUsage`, * …) are unchanged so the 18 importing modules compile without edits. * * @task T9651 * @task T11525 - E6-L5 physical-name prefix to share the global cleo.db * @epic T9571 * @epic T11249 * @saga T9560 * @adr ADR-068 (DB-open chokepoint) * @architecture docs/architecture/SG-CLEO-SKILLS-architecture-v3.md §4 */ /** * Provenance of a skill row. * * - `canonical` — Sphere A ct-* skill installed under the XDG canonical * store; ONLY writable by the owner-CI workflow. * - `user` — Sphere B skill authored by the local user. * - `community` — Sphere B skill installed from a public marketplace. * - `agent-created` — Sphere B skill that an agent generated at runtime * (`is_agent_created=true` is also set on the row). * * @architecture v3 §4 `source_type` enum */ export type SkillSourceType = 'canonical' | 'user' | 'community' | 'agent-created'; /** * Lifecycle state of a skill row. * * - `active` — installed and resolvable * - `stale` — present on disk but no longer referenced / superseded * - `archived` — removed (path nulled or moved); `archived_at` populated * * @architecture v3 §4 `lifecycle_state` enum */ export type SkillLifecycleState = 'active' | 'stale' | 'archived'; /** * Skill review outcome (council and/or grade pipelines). * * @architecture v3 §6/§7 (auto-improve) */ export type SkillReviewOutcome = 'approved' | 'rejected' | 'needs-changes'; /** * Skill patch application state. * * @architecture v3 §6/§7 (auto-improve) */ export type SkillPatchStatus = 'proposed' | 'applied' | 'reverted' | 'rejected'; /** * Per-user registry of installed skills. * * One row per (name) — uniqueness is enforced on the `name` column because * Claude Code / cleo resolve skills by name, and shadow-loading is forbidden. * * Provenance is captured via `source_type` (enum) + `is_agent_created` flag * so that the is-canonical resolution logic (see architecture §6) can refuse * mutations against Sphere A rows without re-reading the filesystem manifest. * * Indexes: * - `idx_skills_state` — filter by lifecycle state (cleanup sweeps) * - `idx_skills_source` — top-N selection for council seeding (Sphere A) * * @architecture v3 §4 `skills` table * @task T9651 */ export declare const skills: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: "skills_skills"; schema: undefined; columns: { id: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: true; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; name: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; version: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; sourceType: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string enum"; data: "community" | "user" | "canonical" | "agent-created"; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: ["canonical", "user", "community", "agent-created"]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; sourceUrl: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; installPath: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; canonicalPath: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; installedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; lastUpdatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; lifecycleState: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string enum"; data: "active" | "archived" | "stale"; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: ["active", "stale", "archived"]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; pinned: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "boolean"; data: boolean; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; isAgentCreated: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "boolean"; data: boolean; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; archivedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; archivedFromPath: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skills"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; }; dialect: "sqlite"; }>; /** * Per-event telemetry row written each time a skill is loaded / invoked. * * Anonymous by design — see architecture §5. Aggregated client-side before * being uploaded (or scrubbed into a PR diff) by the owner-CI workflow. * * Index on `(skill_name, observed_at)` accelerates the periodic top-N rollup * that drives the Sphere A council seeding job. * * @architecture v3 §4 + §5 * @task T9651 */ export declare const skillUsage: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: "skills_skill_usage"; schema: undefined; columns: { id: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_usage"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: true; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; skillName: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_usage"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; observedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_usage"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; eventKind: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_usage"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; taskId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_usage"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; projectId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_usage"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; modelId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_usage"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; metadata: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_usage"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; }; dialect: "sqlite"; }>; /** * Council + grade review outcomes (auto-improve quality gate). * * One row per (skill, review_run). `outcome` is the consolidated verdict * from the multi-advisor council pass; `score` carries the numeric grade * if the review ran the rubric pipeline. * * @architecture v3 §6/§7 (auto-improve) * @task T9651 */ export declare const skillReviews: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: "skills_skill_reviews"; schema: undefined; columns: { id: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_reviews"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: true; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; skillName: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_reviews"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; reviewedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_reviews"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; outcome: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_reviews"; dataType: "string enum"; data: "approved" | "rejected" | "needs-changes"; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: ["approved", "rejected", "needs-changes"]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; score: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_reviews"; dataType: "number int53"; data: number; driverParam: number; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; reviewRunId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_reviews"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; summary: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_reviews"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; }; dialect: "sqlite"; }>; /** * Auto-improve patch payload (diff produced by the improvement loop). * * Stores the unified diff in `diff` so reverts are byte-exact. `status` * tracks the lifecycle (`proposed` → `applied` | `reverted` | `rejected`). * * @architecture v3 §6/§7 (auto-improve) * @task T9651 */ export declare const skillPatches: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: "skills_skill_patches"; schema: undefined; columns: { id: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_patches"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: true; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; skillName: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_patches"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; proposedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_patches"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; appliedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_patches"; dataType: "string"; data: string; driverParam: string; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; reviewId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_patches"; dataType: "number int53"; data: number; driverParam: number; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; diff: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_patches"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; status: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_patches"; dataType: "string enum"; data: "proposed" | "applied" | "rejected" | "reverted"; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: ["proposed", "applied", "reverted", "rejected"]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; revertedByPatchId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "skills_skill_patches"; dataType: "number int53"; data: number; driverParam: number; notNull: false; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; }; dialect: "sqlite"; }>; /** Row type for the `skills` table. */ export type SkillRow = typeof skills.$inferSelect; /** Insert type for the `skills` table. */ export type NewSkillRow = typeof skills.$inferInsert; /** Row type for the `skill_usage` table. */ export type SkillUsageRow = typeof skillUsage.$inferSelect; /** Insert type for the `skill_usage` table. */ export type NewSkillUsageRow = typeof skillUsage.$inferInsert; /** Row type for the `skill_reviews` table. */ export type SkillReviewRow = typeof skillReviews.$inferSelect; /** Insert type for the `skill_reviews` table. */ export type NewSkillReviewRow = typeof skillReviews.$inferInsert; /** Row type for the `skill_patches` table. */ export type SkillPatchRow = typeof skillPatches.$inferSelect; /** Insert type for the `skill_patches` table. */ export type NewSkillPatchRow = typeof skillPatches.$inferInsert; //# sourceMappingURL=skills-schema.d.ts.map