| 500 | } |
| 501 | |
| 502 | private migrateSkillTables(): void { |
| 503 | this.db.exec(` |
| 504 | CREATE TABLE IF NOT EXISTS skills ( |
| 505 | id TEXT PRIMARY KEY, |
| 506 | name TEXT NOT NULL UNIQUE, |
| 507 | description TEXT NOT NULL DEFAULT '', |
| 508 | version INTEGER NOT NULL DEFAULT 1, |
| 509 | status TEXT NOT NULL DEFAULT 'active', |
| 510 | tags TEXT NOT NULL DEFAULT '[]', |
| 511 | source_type TEXT NOT NULL DEFAULT 'task', |
| 512 | dir_path TEXT NOT NULL DEFAULT '', |
| 513 | installed INTEGER NOT NULL DEFAULT 0, |
| 514 | created_at INTEGER NOT NULL, |
| 515 | updated_at INTEGER NOT NULL |
| 516 | ); |
| 517 | CREATE INDEX IF NOT EXISTS idx_skills_status ON skills(status); |
| 518 | CREATE INDEX IF NOT EXISTS idx_skills_name ON skills(name); |
| 519 | |
| 520 | CREATE TABLE IF NOT EXISTS skill_versions ( |
| 521 | id TEXT PRIMARY KEY, |
| 522 | skill_id TEXT NOT NULL REFERENCES skills(id), |
| 523 | version INTEGER NOT NULL, |
| 524 | content TEXT NOT NULL, |
| 525 | changelog TEXT NOT NULL DEFAULT '', |
| 526 | upgrade_type TEXT NOT NULL DEFAULT 'create', |
| 527 | source_task_id TEXT, |
| 528 | metrics TEXT NOT NULL DEFAULT '{}', |
| 529 | created_at INTEGER NOT NULL, |
| 530 | UNIQUE(skill_id, version) |
| 531 | ); |
| 532 | CREATE INDEX IF NOT EXISTS idx_skill_versions_skill ON skill_versions(skill_id); |
| 533 | |
| 534 | CREATE TABLE IF NOT EXISTS task_skills ( |
| 535 | task_id TEXT NOT NULL REFERENCES tasks(id), |
| 536 | skill_id TEXT NOT NULL REFERENCES skills(id), |
| 537 | relation TEXT NOT NULL DEFAULT 'generated_from', |
| 538 | version_at INTEGER NOT NULL DEFAULT 1, |
| 539 | created_at INTEGER NOT NULL, |
| 540 | PRIMARY KEY (task_id, skill_id) |
| 541 | ); |
| 542 | `); |
| 543 | } |
| 544 | |
| 545 | private migrateSkillId(): void { |
| 546 | const cols = this.db.prepare("PRAGMA table_info(chunks)").all() as Array<{ name: string }>; |