@skillsmith/core 0.4.17 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/api/client.cache.d.ts +34 -0
  4. package/dist/src/api/client.cache.d.ts.map +1 -0
  5. package/dist/src/api/client.cache.js +37 -0
  6. package/dist/src/api/client.cache.js.map +1 -0
  7. package/dist/src/api/client.d.ts +32 -104
  8. package/dist/src/api/client.d.ts.map +1 -1
  9. package/dist/src/api/client.events.d.ts +39 -0
  10. package/dist/src/api/client.events.d.ts.map +1 -0
  11. package/dist/src/api/client.events.js +77 -0
  12. package/dist/src/api/client.events.js.map +1 -0
  13. package/dist/src/api/client.js +65 -52
  14. package/dist/src/api/client.js.map +1 -1
  15. package/dist/src/api/client.types.d.ts +98 -0
  16. package/dist/src/api/client.types.d.ts.map +1 -0
  17. package/dist/src/api/client.types.js +22 -0
  18. package/dist/src/api/client.types.js.map +1 -0
  19. package/dist/src/api/event-batcher.d.ts +81 -0
  20. package/dist/src/api/event-batcher.d.ts.map +1 -0
  21. package/dist/src/api/event-batcher.js +191 -0
  22. package/dist/src/api/event-batcher.js.map +1 -0
  23. package/dist/src/api/index.d.ts +1 -0
  24. package/dist/src/api/index.d.ts.map +1 -1
  25. package/dist/src/api/index.js +2 -0
  26. package/dist/src/api/index.js.map +1 -1
  27. package/dist/src/api/schemas.d.ts +58 -0
  28. package/dist/src/api/schemas.d.ts.map +1 -1
  29. package/dist/src/api/schemas.js +45 -0
  30. package/dist/src/api/schemas.js.map +1 -1
  31. package/dist/src/audit/remote-audit.d.ts +28 -0
  32. package/dist/src/audit/remote-audit.d.ts.map +1 -0
  33. package/dist/src/audit/remote-audit.js +90 -0
  34. package/dist/src/audit/remote-audit.js.map +1 -0
  35. package/dist/src/audit/remote-audit.test.d.ts +2 -0
  36. package/dist/src/audit/remote-audit.test.d.ts.map +1 -0
  37. package/dist/src/audit/remote-audit.test.js +81 -0
  38. package/dist/src/audit/remote-audit.test.js.map +1 -0
  39. package/dist/src/data/generic-triggers.d.ts +24 -0
  40. package/dist/src/data/generic-triggers.d.ts.map +1 -0
  41. package/dist/src/data/generic-triggers.js +19 -0
  42. package/dist/src/data/generic-triggers.js.map +1 -0
  43. package/dist/src/data/generic-triggers.json +35 -0
  44. package/dist/src/db/migration-runner.d.ts +44 -0
  45. package/dist/src/db/migration-runner.d.ts.map +1 -0
  46. package/dist/src/db/migration-runner.js +175 -0
  47. package/dist/src/db/migration-runner.js.map +1 -0
  48. package/dist/src/db/migration.d.ts.map +1 -1
  49. package/dist/src/db/migration.js +2 -1
  50. package/dist/src/db/migration.js.map +1 -1
  51. package/dist/src/db/migrations/v12-risk-score-history.d.ts +10 -0
  52. package/dist/src/db/migrations/v12-risk-score-history.d.ts.map +1 -0
  53. package/dist/src/db/migrations/v12-risk-score-history.js +25 -0
  54. package/dist/src/db/migrations/v12-risk-score-history.js.map +1 -0
  55. package/dist/src/db/migrations/v13-team-tables.d.ts +11 -0
  56. package/dist/src/db/migrations/v13-team-tables.d.ts.map +1 -0
  57. package/dist/src/db/migrations/v13-team-tables.js +14 -0
  58. package/dist/src/db/migrations/v13-team-tables.js.map +1 -0
  59. package/dist/src/db/schema-sql.d.ts +16 -0
  60. package/dist/src/db/schema-sql.d.ts.map +1 -0
  61. package/dist/src/db/schema-sql.js +161 -0
  62. package/dist/src/db/schema-sql.js.map +1 -0
  63. package/dist/src/db/schema.d.ts +7 -32
  64. package/dist/src/db/schema.d.ts.map +1 -1
  65. package/dist/src/db/schema.js +13 -303
  66. package/dist/src/db/schema.js.map +1 -1
  67. package/dist/src/exports/repositories.d.ts +1 -0
  68. package/dist/src/exports/repositories.d.ts.map +1 -1
  69. package/dist/src/exports/repositories.js +4 -0
  70. package/dist/src/exports/repositories.js.map +1 -1
  71. package/dist/src/exports/services.d.ts +2 -1
  72. package/dist/src/exports/services.d.ts.map +1 -1
  73. package/dist/src/exports/services.js +1 -0
  74. package/dist/src/exports/services.js.map +1 -1
  75. package/dist/src/index.d.ts +5 -1
  76. package/dist/src/index.d.ts.map +1 -1
  77. package/dist/src/index.js +5 -1
  78. package/dist/src/index.js.map +1 -1
  79. package/dist/src/repositories/RiskScoreHistoryRepository.d.ts +37 -0
  80. package/dist/src/repositories/RiskScoreHistoryRepository.d.ts.map +1 -0
  81. package/dist/src/repositories/RiskScoreHistoryRepository.js +66 -0
  82. package/dist/src/repositories/RiskScoreHistoryRepository.js.map +1 -0
  83. package/dist/src/scoring/index.d.ts +1 -0
  84. package/dist/src/scoring/index.d.ts.map +1 -1
  85. package/dist/src/scoring/index.js +1 -0
  86. package/dist/src/scoring/index.js.map +1 -1
  87. package/dist/src/scoring/quality-score.d.ts +49 -0
  88. package/dist/src/scoring/quality-score.d.ts.map +1 -0
  89. package/dist/src/scoring/quality-score.js +73 -0
  90. package/dist/src/scoring/quality-score.js.map +1 -0
  91. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +5 -0
  92. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  93. package/dist/src/security/index.d.ts +2 -0
  94. package/dist/src/security/index.d.ts.map +1 -1
  95. package/dist/src/security/index.js +2 -0
  96. package/dist/src/security/index.js.map +1 -1
  97. package/dist/src/security/risk-trend.d.ts +21 -0
  98. package/dist/src/security/risk-trend.d.ts.map +1 -0
  99. package/dist/src/security/risk-trend.js +81 -0
  100. package/dist/src/security/risk-trend.js.map +1 -0
  101. package/dist/src/security/scanner/SecurityScanner.d.ts +2 -0
  102. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  103. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
  104. package/dist/src/security/scanner/SecurityScanner.helpers.js +14 -8
  105. package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
  106. package/dist/src/security/scanner/SecurityScanner.js +55 -1
  107. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  108. package/dist/src/security/scanner/index.d.ts +1 -1
  109. package/dist/src/security/scanner/index.d.ts.map +1 -1
  110. package/dist/src/security/scanner/index.js +1 -1
  111. package/dist/src/security/scanner/index.js.map +1 -1
  112. package/dist/src/security/scanner/patterns.d.ts +6 -0
  113. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  114. package/dist/src/security/scanner/patterns.js +25 -0
  115. package/dist/src/security/scanner/patterns.js.map +1 -1
  116. package/dist/src/security/scanner/types.d.ts +2 -1
  117. package/dist/src/security/scanner/types.d.ts.map +1 -1
  118. package/dist/src/security/scanner/weights.d.ts.map +1 -1
  119. package/dist/src/security/scanner/weights.js +1 -0
  120. package/dist/src/security/scanner/weights.js.map +1 -1
  121. package/dist/src/services/skill-config-schema.d.ts +36 -0
  122. package/dist/src/services/skill-config-schema.d.ts.map +1 -0
  123. package/dist/src/services/skill-config-schema.js +76 -0
  124. package/dist/src/services/skill-config-schema.js.map +1 -0
  125. package/dist/src/services/skill-installation.feedback.d.ts +24 -0
  126. package/dist/src/services/skill-installation.feedback.d.ts.map +1 -0
  127. package/dist/src/services/skill-installation.feedback.js +37 -0
  128. package/dist/src/services/skill-installation.feedback.js.map +1 -0
  129. package/dist/src/services/skill-installation.helpers.d.ts +33 -7
  130. package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
  131. package/dist/src/services/skill-installation.helpers.js +74 -32
  132. package/dist/src/services/skill-installation.helpers.js.map +1 -1
  133. package/dist/src/services/skill-installation.service.d.ts +8 -16
  134. package/dist/src/services/skill-installation.service.d.ts.map +1 -1
  135. package/dist/src/services/skill-installation.service.js +86 -37
  136. package/dist/src/services/skill-installation.service.js.map +1 -1
  137. package/dist/src/services/skill-installation.types.d.ts +22 -0
  138. package/dist/src/services/skill-installation.types.d.ts.map +1 -1
  139. package/dist/src/services/skill-installation.types.js.map +1 -1
  140. package/dist/src/types.d.ts +2 -0
  141. package/dist/src/types.d.ts.map +1 -1
  142. package/dist/tests/SecurityScanner.ai-defence.test.d.ts +6 -0
  143. package/dist/tests/SecurityScanner.ai-defence.test.d.ts.map +1 -0
  144. package/dist/tests/SecurityScanner.ai-defence.test.js +221 -0
  145. package/dist/tests/SecurityScanner.ai-defence.test.js.map +1 -0
  146. package/dist/tests/SecurityScanner.performance.test.d.ts +6 -0
  147. package/dist/tests/SecurityScanner.performance.test.d.ts.map +1 -0
  148. package/dist/tests/SecurityScanner.performance.test.js +132 -0
  149. package/dist/tests/SecurityScanner.performance.test.js.map +1 -0
  150. package/dist/tests/SecurityScanner.scoring.test.d.ts +6 -0
  151. package/dist/tests/SecurityScanner.scoring.test.d.ts.map +1 -0
  152. package/dist/tests/SecurityScanner.scoring.test.js +197 -0
  153. package/dist/tests/SecurityScanner.scoring.test.js.map +1 -0
  154. package/dist/tests/SecurityScanner.test.d.ts +2 -2
  155. package/dist/tests/SecurityScanner.test.js +2 -520
  156. package/dist/tests/SecurityScanner.test.js.map +1 -1
  157. package/dist/tests/SkillMatcher.test.js +5 -5
  158. package/dist/tests/SkillMatcher.test.js.map +1 -1
  159. package/dist/tests/api/client.cache.test.d.ts +8 -0
  160. package/dist/tests/api/client.cache.test.d.ts.map +1 -0
  161. package/dist/tests/api/client.cache.test.js +128 -0
  162. package/dist/tests/api/client.cache.test.js.map +1 -0
  163. package/dist/tests/db/schema-migrations.test.js +8 -6
  164. package/dist/tests/db/schema-migrations.test.js.map +1 -1
  165. package/dist/tests/integration/events-batch-contract.test.d.ts +12 -0
  166. package/dist/tests/integration/events-batch-contract.test.d.ts.map +1 -0
  167. package/dist/tests/integration/events-batch-contract.test.js +69 -0
  168. package/dist/tests/integration/events-batch-contract.test.js.map +1 -0
  169. package/dist/tests/scoring/quality-score.test.d.ts +7 -0
  170. package/dist/tests/scoring/quality-score.test.d.ts.map +1 -0
  171. package/dist/tests/scoring/quality-score.test.js +78 -0
  172. package/dist/tests/scoring/quality-score.test.js.map +1 -0
  173. package/dist/tests/security/ContinuousSecurity.false-positives.test.d.ts +6 -0
  174. package/dist/tests/security/ContinuousSecurity.false-positives.test.d.ts.map +1 -0
  175. package/dist/tests/security/ContinuousSecurity.false-positives.test.js +89 -0
  176. package/dist/tests/security/ContinuousSecurity.false-positives.test.js.map +1 -0
  177. package/dist/tests/security/ContinuousSecurity.performance.test.d.ts +6 -0
  178. package/dist/tests/security/ContinuousSecurity.performance.test.d.ts.map +1 -0
  179. package/dist/tests/security/ContinuousSecurity.performance.test.js +177 -0
  180. package/dist/tests/security/ContinuousSecurity.performance.test.js.map +1 -0
  181. package/dist/tests/security/ContinuousSecurity.reporting.test.d.ts +6 -0
  182. package/dist/tests/security/ContinuousSecurity.reporting.test.d.ts.map +1 -0
  183. package/dist/tests/security/ContinuousSecurity.reporting.test.js +106 -0
  184. package/dist/tests/security/ContinuousSecurity.reporting.test.js.map +1 -0
  185. package/dist/tests/security/ContinuousSecurity.test.d.ts +9 -2
  186. package/dist/tests/security/ContinuousSecurity.test.d.ts.map +1 -1
  187. package/dist/tests/security/ContinuousSecurity.test.js +9 -336
  188. package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
  189. package/dist/tests/security/pii-detection.test.d.ts +7 -0
  190. package/dist/tests/security/pii-detection.test.d.ts.map +1 -0
  191. package/dist/tests/security/pii-detection.test.js +91 -0
  192. package/dist/tests/security/pii-detection.test.js.map +1 -0
  193. package/dist/tests/security/risk-trend.test.d.ts +6 -0
  194. package/dist/tests/security/risk-trend.test.d.ts.map +1 -0
  195. package/dist/tests/security/risk-trend.test.js +68 -0
  196. package/dist/tests/security/risk-trend.test.js.map +1 -0
  197. package/dist/tests/security/scanner-regression-guard.test.d.ts +12 -0
  198. package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -0
  199. package/dist/tests/security/scanner-regression-guard.test.js +111 -0
  200. package/dist/tests/security/scanner-regression-guard.test.js.map +1 -0
  201. package/dist/tests/services/aidefence-feedback.test.d.ts +6 -0
  202. package/dist/tests/services/aidefence-feedback.test.d.ts.map +1 -0
  203. package/dist/tests/services/aidefence-feedback.test.js +115 -0
  204. package/dist/tests/services/aidefence-feedback.test.js.map +1 -0
  205. package/dist/tests/services/dep-quarantine-check.test.d.ts +5 -0
  206. package/dist/tests/services/dep-quarantine-check.test.d.ts.map +1 -0
  207. package/dist/tests/services/dep-quarantine-check.test.js +92 -0
  208. package/dist/tests/services/dep-quarantine-check.test.js.map +1 -0
  209. package/dist/tests/services/skill-config-schema.test.d.ts +5 -0
  210. package/dist/tests/services/skill-config-schema.test.d.ts.map +1 -0
  211. package/dist/tests/services/skill-config-schema.test.js +98 -0
  212. package/dist/tests/services/skill-config-schema.test.js.map +1 -0
  213. package/dist/tests/unit/api-client-events.test.d.ts +10 -0
  214. package/dist/tests/unit/api-client-events.test.d.ts.map +1 -0
  215. package/dist/tests/unit/api-client-events.test.js +73 -0
  216. package/dist/tests/unit/api-client-events.test.js.map +1 -0
  217. package/dist/tests/unit/event-batcher.test.d.ts +13 -0
  218. package/dist/tests/unit/event-batcher.test.d.ts.map +1 -0
  219. package/dist/tests/unit/event-batcher.test.js +155 -0
  220. package/dist/tests/unit/event-batcher.test.js.map +1 -0
  221. package/dist/tests/unit/services/skill-installation-extended.test.d.ts +8 -0
  222. package/dist/tests/unit/services/skill-installation-extended.test.d.ts.map +1 -0
  223. package/dist/tests/unit/services/skill-installation-extended.test.js +423 -0
  224. package/dist/tests/unit/services/skill-installation-extended.test.js.map +1 -0
  225. package/dist/tests/unit/services/skill-installation.service.test.js +0 -390
  226. package/dist/tests/unit/services/skill-installation.service.test.js.map +1 -1
  227. package/package.json +7 -7
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview Migration v13 -- Team visibility and ownership columns
3
+ * @see SMI-3896: Private Skills Publishing
4
+ *
5
+ * Adds `visibility` and `team_id` columns to the skills table so that
6
+ * private skills can be scoped to a team. Community users see only
7
+ * `visibility = 'public'` skills; team members also see skills matching
8
+ * their team_id.
9
+ */
10
+ export const MIGRATION_V13_SQL = `
11
+ ALTER TABLE skills ADD COLUMN visibility TEXT NOT NULL DEFAULT 'public';
12
+ ALTER TABLE skills ADD COLUMN team_id TEXT;
13
+ `;
14
+ //# sourceMappingURL=v13-team-tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v13-team-tables.js","sourceRoot":"","sources":["../../../../src/db/migrations/v13-team-tables.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;CAGhC,CAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SQL constants for database schema and FTS5.
3
+ *
4
+ * Extracted to a standalone module (SMI-3910) so both schema.ts and
5
+ * migration-runner.ts can import them without circular dependencies.
6
+ */
7
+ /**
8
+ * SQL statements for creating the database schema
9
+ */
10
+ export declare const SCHEMA_SQL = "\n-- Enable WAL mode for better concurrent performance\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = NORMAL;\nPRAGMA cache_size = -64000; -- 64MB cache\nPRAGMA temp_store = MEMORY;\n\n-- Schema version tracking\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Skills table - main storage for discovered skills\nCREATE TABLE IF NOT EXISTS skills (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n author TEXT,\n repo_url TEXT UNIQUE,\n quality_score REAL CHECK(quality_score IS NULL OR (quality_score >= 0 AND quality_score <= 1)),\n trust_tier TEXT CHECK(trust_tier IN ('verified', 'community', 'experimental', 'unknown')) DEFAULT 'unknown',\n tags TEXT DEFAULT '[]', -- JSON array of tags\n risk_score INTEGER CHECK(risk_score IS NULL OR (risk_score >= 0 AND risk_score <= 100)), -- SMI-825\n security_findings_count INTEGER DEFAULT 0,\n security_scanned_at TEXT,\n security_passed INTEGER, -- boolean: 1 = passed, 0 = failed, NULL = not scanned\n compatibility TEXT DEFAULT '[]', -- SMI-2760: JSON array of IDE/LLM/platform slugs\n content_hash TEXT, -- SMI-3510: SHA-256 hash of SKILL.md for tamper detection\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- FTS5 virtual table for full-text search with BM25 ranking\nCREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(\n name,\n description,\n tags,\n author,\n content='skills',\n content_rowid='rowid',\n tokenize='porter unicode61'\n);\n\n-- Triggers to keep FTS index in sync with skills table\nCREATE TRIGGER IF NOT EXISTS skills_ai AFTER INSERT ON skills BEGIN\n INSERT INTO skills_fts(rowid, name, description, tags, author)\n VALUES (NEW.rowid, NEW.name, NEW.description, NEW.tags, NEW.author);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS skills_ad AFTER DELETE ON skills BEGIN\n INSERT INTO skills_fts(skills_fts, rowid, name, description, tags, author)\n VALUES ('delete', OLD.rowid, OLD.name, OLD.description, OLD.tags, OLD.author);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS skills_au AFTER UPDATE ON skills BEGIN\n INSERT INTO skills_fts(skills_fts, rowid, name, description, tags, author)\n VALUES ('delete', OLD.rowid, OLD.name, OLD.description, OLD.tags, OLD.author);\n INSERT INTO skills_fts(rowid, name, description, tags, author)\n VALUES (NEW.rowid, NEW.name, NEW.description, NEW.tags, NEW.author);\nEND;\n\n-- Sources table - tracks where skills are discovered from\nCREATE TABLE IF NOT EXISTS sources (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n type TEXT NOT NULL CHECK(type IN ('github', 'gitlab', 'local', 'registry')),\n url TEXT NOT NULL UNIQUE,\n last_sync_at TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Categories table - hierarchical organization of skills\nCREATE TABLE IF NOT EXISTS categories (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n description TEXT,\n parent_id TEXT REFERENCES categories(id) ON DELETE SET NULL,\n skill_count INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Skill-Category junction table\nCREATE TABLE IF NOT EXISTS skill_categories (\n skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,\n category_id TEXT NOT NULL REFERENCES categories(id) ON DELETE CASCADE,\n PRIMARY KEY (skill_id, category_id)\n);\n\n-- Cache table for search results and API responses\nCREATE TABLE IF NOT EXISTS cache (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n expires_at INTEGER, -- Unix timestamp, NULL for no expiry\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Indexes for common query patterns\nCREATE INDEX IF NOT EXISTS idx_skills_author ON skills(author);\nCREATE INDEX IF NOT EXISTS idx_skills_trust_tier ON skills(trust_tier);\nCREATE INDEX IF NOT EXISTS idx_skills_quality_score ON skills(quality_score);\nCREATE INDEX IF NOT EXISTS idx_skills_updated_at ON skills(updated_at);\nCREATE INDEX IF NOT EXISTS idx_skills_created_at ON skills(created_at);\nCREATE INDEX IF NOT EXISTS idx_skills_risk_score ON skills(risk_score);\nCREATE INDEX IF NOT EXISTS idx_skills_security_passed ON skills(security_passed);\nCREATE INDEX IF NOT EXISTS idx_sources_type ON sources(type);\nCREATE INDEX IF NOT EXISTS idx_sources_is_active ON sources(is_active);\nCREATE INDEX IF NOT EXISTS idx_categories_parent ON categories(parent_id);\nCREATE INDEX IF NOT EXISTS idx_cache_expires ON cache(expires_at);\n\n-- SMI-733: Audit logs table for security monitoring\n-- See: docs/security/index.md \u00A73 Audit Logging\nCREATE TABLE IF NOT EXISTS audit_logs (\n id TEXT PRIMARY KEY,\n event_type TEXT NOT NULL,\n timestamp TEXT NOT NULL DEFAULT (datetime('now')),\n actor TEXT,\n resource TEXT,\n action TEXT,\n result TEXT,\n metadata TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_audit_event_type ON audit_logs(event_type);\nCREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit_logs(timestamp);\nCREATE INDEX IF NOT EXISTS idx_audit_resource ON audit_logs(resource);\nCREATE INDEX IF NOT EXISTS idx_audit_result ON audit_logs(result);\nCREATE INDEX IF NOT EXISTS idx_audit_actor ON audit_logs(actor);\n";
11
+ /**
12
+ * SMI-974: Migration SQL for adding FTS5 to existing database
13
+ * Run separately as FTS5 creation can fail if table exists
14
+ */
15
+ export declare const FTS5_MIGRATION_SQL = "\n-- Create FTS5 virtual table if not exists\nCREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(\n name,\n description,\n tags,\n author,\n content='skills',\n content_rowid='rowid',\n tokenize='porter unicode61'\n);\n\n-- Populate FTS from existing skills (safe to run multiple times)\nINSERT OR IGNORE INTO skills_fts(rowid, name, description, tags, author)\nSELECT rowid, name, description, tags, author FROM skills;\n";
16
+ //# sourceMappingURL=schema-sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-sql.d.ts","sourceRoot":"","sources":["../../../src/db/schema-sql.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU,stKAkItB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,wbAe9B,CAAA"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * SQL constants for database schema and FTS5.
3
+ *
4
+ * Extracted to a standalone module (SMI-3910) so both schema.ts and
5
+ * migration-runner.ts can import them without circular dependencies.
6
+ */
7
+ /**
8
+ * SQL statements for creating the database schema
9
+ */
10
+ export const SCHEMA_SQL = `
11
+ -- Enable WAL mode for better concurrent performance
12
+ PRAGMA journal_mode = WAL;
13
+ PRAGMA synchronous = NORMAL;
14
+ PRAGMA cache_size = -64000; -- 64MB cache
15
+ PRAGMA temp_store = MEMORY;
16
+
17
+ -- Schema version tracking
18
+ CREATE TABLE IF NOT EXISTS schema_version (
19
+ version INTEGER PRIMARY KEY,
20
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
21
+ );
22
+
23
+ -- Skills table - main storage for discovered skills
24
+ CREATE TABLE IF NOT EXISTS skills (
25
+ id TEXT PRIMARY KEY,
26
+ name TEXT NOT NULL,
27
+ description TEXT,
28
+ author TEXT,
29
+ repo_url TEXT UNIQUE,
30
+ quality_score REAL CHECK(quality_score IS NULL OR (quality_score >= 0 AND quality_score <= 1)),
31
+ trust_tier TEXT CHECK(trust_tier IN ('verified', 'community', 'experimental', 'unknown')) DEFAULT 'unknown',
32
+ tags TEXT DEFAULT '[]', -- JSON array of tags
33
+ risk_score INTEGER CHECK(risk_score IS NULL OR (risk_score >= 0 AND risk_score <= 100)), -- SMI-825
34
+ security_findings_count INTEGER DEFAULT 0,
35
+ security_scanned_at TEXT,
36
+ security_passed INTEGER, -- boolean: 1 = passed, 0 = failed, NULL = not scanned
37
+ compatibility TEXT DEFAULT '[]', -- SMI-2760: JSON array of IDE/LLM/platform slugs
38
+ content_hash TEXT, -- SMI-3510: SHA-256 hash of SKILL.md for tamper detection
39
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
40
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
41
+ );
42
+
43
+ -- FTS5 virtual table for full-text search with BM25 ranking
44
+ CREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(
45
+ name,
46
+ description,
47
+ tags,
48
+ author,
49
+ content='skills',
50
+ content_rowid='rowid',
51
+ tokenize='porter unicode61'
52
+ );
53
+
54
+ -- Triggers to keep FTS index in sync with skills table
55
+ CREATE TRIGGER IF NOT EXISTS skills_ai AFTER INSERT ON skills BEGIN
56
+ INSERT INTO skills_fts(rowid, name, description, tags, author)
57
+ VALUES (NEW.rowid, NEW.name, NEW.description, NEW.tags, NEW.author);
58
+ END;
59
+
60
+ CREATE TRIGGER IF NOT EXISTS skills_ad AFTER DELETE ON skills BEGIN
61
+ INSERT INTO skills_fts(skills_fts, rowid, name, description, tags, author)
62
+ VALUES ('delete', OLD.rowid, OLD.name, OLD.description, OLD.tags, OLD.author);
63
+ END;
64
+
65
+ CREATE TRIGGER IF NOT EXISTS skills_au AFTER UPDATE ON skills BEGIN
66
+ INSERT INTO skills_fts(skills_fts, rowid, name, description, tags, author)
67
+ VALUES ('delete', OLD.rowid, OLD.name, OLD.description, OLD.tags, OLD.author);
68
+ INSERT INTO skills_fts(rowid, name, description, tags, author)
69
+ VALUES (NEW.rowid, NEW.name, NEW.description, NEW.tags, NEW.author);
70
+ END;
71
+
72
+ -- Sources table - tracks where skills are discovered from
73
+ CREATE TABLE IF NOT EXISTS sources (
74
+ id TEXT PRIMARY KEY,
75
+ name TEXT NOT NULL,
76
+ type TEXT NOT NULL CHECK(type IN ('github', 'gitlab', 'local', 'registry')),
77
+ url TEXT NOT NULL UNIQUE,
78
+ last_sync_at TEXT,
79
+ is_active INTEGER NOT NULL DEFAULT 1,
80
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
81
+ );
82
+
83
+ -- Categories table - hierarchical organization of skills
84
+ CREATE TABLE IF NOT EXISTS categories (
85
+ id TEXT PRIMARY KEY,
86
+ name TEXT NOT NULL UNIQUE,
87
+ description TEXT,
88
+ parent_id TEXT REFERENCES categories(id) ON DELETE SET NULL,
89
+ skill_count INTEGER NOT NULL DEFAULT 0,
90
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
91
+ );
92
+
93
+ -- Skill-Category junction table
94
+ CREATE TABLE IF NOT EXISTS skill_categories (
95
+ skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
96
+ category_id TEXT NOT NULL REFERENCES categories(id) ON DELETE CASCADE,
97
+ PRIMARY KEY (skill_id, category_id)
98
+ );
99
+
100
+ -- Cache table for search results and API responses
101
+ CREATE TABLE IF NOT EXISTS cache (
102
+ key TEXT PRIMARY KEY,
103
+ value TEXT NOT NULL,
104
+ expires_at INTEGER, -- Unix timestamp, NULL for no expiry
105
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
106
+ );
107
+
108
+ -- Indexes for common query patterns
109
+ CREATE INDEX IF NOT EXISTS idx_skills_author ON skills(author);
110
+ CREATE INDEX IF NOT EXISTS idx_skills_trust_tier ON skills(trust_tier);
111
+ CREATE INDEX IF NOT EXISTS idx_skills_quality_score ON skills(quality_score);
112
+ CREATE INDEX IF NOT EXISTS idx_skills_updated_at ON skills(updated_at);
113
+ CREATE INDEX IF NOT EXISTS idx_skills_created_at ON skills(created_at);
114
+ CREATE INDEX IF NOT EXISTS idx_skills_risk_score ON skills(risk_score);
115
+ CREATE INDEX IF NOT EXISTS idx_skills_security_passed ON skills(security_passed);
116
+ CREATE INDEX IF NOT EXISTS idx_sources_type ON sources(type);
117
+ CREATE INDEX IF NOT EXISTS idx_sources_is_active ON sources(is_active);
118
+ CREATE INDEX IF NOT EXISTS idx_categories_parent ON categories(parent_id);
119
+ CREATE INDEX IF NOT EXISTS idx_cache_expires ON cache(expires_at);
120
+
121
+ -- SMI-733: Audit logs table for security monitoring
122
+ -- See: docs/security/index.md §3 Audit Logging
123
+ CREATE TABLE IF NOT EXISTS audit_logs (
124
+ id TEXT PRIMARY KEY,
125
+ event_type TEXT NOT NULL,
126
+ timestamp TEXT NOT NULL DEFAULT (datetime('now')),
127
+ actor TEXT,
128
+ resource TEXT,
129
+ action TEXT,
130
+ result TEXT,
131
+ metadata TEXT,
132
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
133
+ );
134
+
135
+ CREATE INDEX IF NOT EXISTS idx_audit_event_type ON audit_logs(event_type);
136
+ CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit_logs(timestamp);
137
+ CREATE INDEX IF NOT EXISTS idx_audit_resource ON audit_logs(resource);
138
+ CREATE INDEX IF NOT EXISTS idx_audit_result ON audit_logs(result);
139
+ CREATE INDEX IF NOT EXISTS idx_audit_actor ON audit_logs(actor);
140
+ `;
141
+ /**
142
+ * SMI-974: Migration SQL for adding FTS5 to existing database
143
+ * Run separately as FTS5 creation can fail if table exists
144
+ */
145
+ export const FTS5_MIGRATION_SQL = `
146
+ -- Create FTS5 virtual table if not exists
147
+ CREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(
148
+ name,
149
+ description,
150
+ tags,
151
+ author,
152
+ content='skills',
153
+ content_rowid='rowid',
154
+ tokenize='porter unicode61'
155
+ );
156
+
157
+ -- Populate FTS from existing skills (safe to run multiple times)
158
+ INSERT OR IGNORE INTO skills_fts(rowid, name, description, tags, author)
159
+ SELECT rowid, name, description, tags, author FROM skills;
160
+ `;
161
+ //# sourceMappingURL=schema-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-sql.js","sourceRoot":"","sources":["../../../src/db/schema-sql.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkIzB,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;CAejC,CAAA"}
@@ -7,43 +7,20 @@
7
7
  * - Sources, Categories, and Cache tables
8
8
  * - WAL mode for performance
9
9
  * - Indexes for common query patterns
10
+ *
11
+ * SQL constants live in schema-sql.ts (SMI-3910) to avoid circular imports
12
+ * with migration-runner.ts. This file re-exports them for backward compat.
10
13
  */
11
14
  import type { Database } from './database-interface.js';
15
+ export { SCHEMA_SQL, FTS5_MIGRATION_SQL } from './schema-sql.js';
16
+ export { MIGRATIONS, getSchemaVersion, runMigrations, runMigrationsSafe, } from './migration-runner.js';
17
+ export type { Migration } from './migration-runner.js';
12
18
  export type DatabaseType = Database;
13
- export declare const SCHEMA_VERSION = 11;
14
- /**
15
- * SQL statements for creating the database schema
16
- */
17
- export declare const SCHEMA_SQL = "\n-- Enable WAL mode for better concurrent performance\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = NORMAL;\nPRAGMA cache_size = -64000; -- 64MB cache\nPRAGMA temp_store = MEMORY;\n\n-- Schema version tracking\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Skills table - main storage for discovered skills\nCREATE TABLE IF NOT EXISTS skills (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n author TEXT,\n repo_url TEXT UNIQUE,\n quality_score REAL CHECK(quality_score IS NULL OR (quality_score >= 0 AND quality_score <= 1)),\n trust_tier TEXT CHECK(trust_tier IN ('verified', 'community', 'experimental', 'unknown')) DEFAULT 'unknown',\n tags TEXT DEFAULT '[]', -- JSON array of tags\n risk_score INTEGER CHECK(risk_score IS NULL OR (risk_score >= 0 AND risk_score <= 100)), -- SMI-825\n security_findings_count INTEGER DEFAULT 0,\n security_scanned_at TEXT,\n security_passed INTEGER, -- boolean: 1 = passed, 0 = failed, NULL = not scanned\n compatibility TEXT DEFAULT '[]', -- SMI-2760: JSON array of IDE/LLM/platform slugs\n content_hash TEXT, -- SMI-3510: SHA-256 hash of SKILL.md for tamper detection\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- FTS5 virtual table for full-text search with BM25 ranking\nCREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(\n name,\n description,\n tags,\n author,\n content='skills',\n content_rowid='rowid',\n tokenize='porter unicode61'\n);\n\n-- Triggers to keep FTS index in sync with skills table\nCREATE TRIGGER IF NOT EXISTS skills_ai AFTER INSERT ON skills BEGIN\n INSERT INTO skills_fts(rowid, name, description, tags, author)\n VALUES (NEW.rowid, NEW.name, NEW.description, NEW.tags, NEW.author);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS skills_ad AFTER DELETE ON skills BEGIN\n INSERT INTO skills_fts(skills_fts, rowid, name, description, tags, author)\n VALUES ('delete', OLD.rowid, OLD.name, OLD.description, OLD.tags, OLD.author);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS skills_au AFTER UPDATE ON skills BEGIN\n INSERT INTO skills_fts(skills_fts, rowid, name, description, tags, author)\n VALUES ('delete', OLD.rowid, OLD.name, OLD.description, OLD.tags, OLD.author);\n INSERT INTO skills_fts(rowid, name, description, tags, author)\n VALUES (NEW.rowid, NEW.name, NEW.description, NEW.tags, NEW.author);\nEND;\n\n-- Sources table - tracks where skills are discovered from\nCREATE TABLE IF NOT EXISTS sources (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n type TEXT NOT NULL CHECK(type IN ('github', 'gitlab', 'local', 'registry')),\n url TEXT NOT NULL UNIQUE,\n last_sync_at TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Categories table - hierarchical organization of skills\nCREATE TABLE IF NOT EXISTS categories (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n description TEXT,\n parent_id TEXT REFERENCES categories(id) ON DELETE SET NULL,\n skill_count INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Skill-Category junction table\nCREATE TABLE IF NOT EXISTS skill_categories (\n skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,\n category_id TEXT NOT NULL REFERENCES categories(id) ON DELETE CASCADE,\n PRIMARY KEY (skill_id, category_id)\n);\n\n-- Cache table for search results and API responses\nCREATE TABLE IF NOT EXISTS cache (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n expires_at INTEGER, -- Unix timestamp, NULL for no expiry\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Indexes for common query patterns\nCREATE INDEX IF NOT EXISTS idx_skills_author ON skills(author);\nCREATE INDEX IF NOT EXISTS idx_skills_trust_tier ON skills(trust_tier);\nCREATE INDEX IF NOT EXISTS idx_skills_quality_score ON skills(quality_score);\nCREATE INDEX IF NOT EXISTS idx_skills_updated_at ON skills(updated_at);\nCREATE INDEX IF NOT EXISTS idx_skills_created_at ON skills(created_at);\nCREATE INDEX IF NOT EXISTS idx_skills_risk_score ON skills(risk_score);\nCREATE INDEX IF NOT EXISTS idx_skills_security_passed ON skills(security_passed);\nCREATE INDEX IF NOT EXISTS idx_sources_type ON sources(type);\nCREATE INDEX IF NOT EXISTS idx_sources_is_active ON sources(is_active);\nCREATE INDEX IF NOT EXISTS idx_categories_parent ON categories(parent_id);\nCREATE INDEX IF NOT EXISTS idx_cache_expires ON cache(expires_at);\n\n-- SMI-733: Audit logs table for security monitoring\n-- See: docs/security/index.md \u00A73 Audit Logging\nCREATE TABLE IF NOT EXISTS audit_logs (\n id TEXT PRIMARY KEY,\n event_type TEXT NOT NULL,\n timestamp TEXT NOT NULL DEFAULT (datetime('now')),\n actor TEXT,\n resource TEXT,\n action TEXT,\n result TEXT,\n metadata TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_audit_event_type ON audit_logs(event_type);\nCREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit_logs(timestamp);\nCREATE INDEX IF NOT EXISTS idx_audit_resource ON audit_logs(resource);\nCREATE INDEX IF NOT EXISTS idx_audit_result ON audit_logs(result);\nCREATE INDEX IF NOT EXISTS idx_audit_actor ON audit_logs(actor);\n";
18
- /**
19
- * Migration definitions for schema upgrades
20
- */
21
- export interface Migration {
22
- version: number;
23
- description: string;
24
- sql: string;
25
- }
26
- export declare const MIGRATIONS: Migration[];
27
- /**
28
- * SMI-974: Migration SQL for adding FTS5 to existing database
29
- * Run separately as FTS5 creation can fail if table exists
30
- */
31
- export declare const FTS5_MIGRATION_SQL = "\n-- Create FTS5 virtual table if not exists\nCREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(\n name,\n description,\n tags,\n author,\n content='skills',\n content_rowid='rowid',\n tokenize='porter unicode61'\n);\n\n-- Populate FTS from existing skills (safe to run multiple times)\nINSERT OR IGNORE INTO skills_fts(rowid, name, description, tags, author)\nSELECT rowid, name, description, tags, author FROM skills;\n";
19
+ export declare const SCHEMA_VERSION = 13;
32
20
  /**
33
21
  * Initialize the database with the complete schema
34
22
  */
35
23
  export declare function initializeSchema(db: DatabaseType): void;
36
- /**
37
- * Get the current schema version from the database
38
- */
39
- export declare function getSchemaVersion(db: DatabaseType): number;
40
- /**
41
- * Run pending migrations to upgrade the schema
42
- * Handles duplicate column errors gracefully since the initial schema
43
- * already includes all columns, but migrations need to support databases
44
- * created by other means (e.g., Phase 5 import scripts)
45
- */
46
- export declare function runMigrations(db: DatabaseType): number;
47
24
  /** @deprecated Use createDatabaseAsync() — requires better-sqlite3 native module. */
48
25
  export declare function createDatabase(path?: string): DatabaseType;
49
26
  /**
@@ -51,8 +28,6 @@ export declare function createDatabase(path?: string): DatabaseType;
51
28
  * @deprecated Use openDatabaseAsync() for cross-platform WASM support.
52
29
  */
53
30
  export declare function openDatabase(path: string): DatabaseType;
54
- /** SMI-974: Run migrations with error handling for existing columns */
55
- export declare function runMigrationsSafe(db: DatabaseType): number;
56
31
  /**
57
32
  * Close the database connection safely
58
33
  */
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAevD,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAA;AAGnC,eAAO,MAAM,cAAc,KAAK,CAAA;AAEhC;;GAEG;AACH,eAAO,MAAM,UAAU,stKAkItB,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,eAAO,MAAM,UAAU,EAAE,SAAS,EAwDjC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,wbAe9B,CAAA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAMvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CASzD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAyBtD;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAmB,GAAG,YAAY,CAUtE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA2BvD;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAqC1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAEpD;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,GAAE,MAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAU1F;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA0B3E"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAOvD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAIhE,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAKtD,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAA;AAKnC,eAAO,MAAM,cAAc,KAAK,CAAA;AAEhC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAMvD;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAmB,GAAG,YAAY,CAUtE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA2BvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAEpD;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,GAAE,MAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAU1F;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA0B3E"}
@@ -7,230 +7,22 @@
7
7
  * - Sources, Categories, and Cache tables
8
8
  * - WAL mode for performance
9
9
  * - Indexes for common query patterns
10
+ *
11
+ * SQL constants live in schema-sql.ts (SMI-3910) to avoid circular imports
12
+ * with migration-runner.ts. This file re-exports them for backward compat.
10
13
  */
11
14
  import { createDatabaseSync, createDatabaseAsync as createDatabaseAsyncFactory, } from './createDatabase.js';
12
- import { MIGRATION_V2_SQL } from './migrations/v2-phase5-columns.js';
13
- import { MIGRATION_V3_SQL } from './migrations/v3-sync-tables.js';
14
- import { MIGRATION_V4_SQL } from './migrations/v4-security-columns.js';
15
- import { MIGRATION_V5_SQL } from './migrations/v5-skill-versions.js';
16
- import { MIGRATION_V5B_SQL } from './migrations/v5b-change-type.js';
17
- import { MIGRATION_V6_SQL } from './migrations/v6-advisories.js';
18
- import { MIGRATION_V7_SQL } from './migrations/v7-compatibility.js';
19
- import { MIGRATION_V8_SQL } from './migrations/v8-co-installs.js';
20
- import { MIGRATION_V10_SQL } from './migrations/v10-dependencies.js';
15
+ // Re-export SQL constants (SMI-3910: extracted to avoid circular imports)
16
+ export { SCHEMA_SQL, FTS5_MIGRATION_SQL } from './schema-sql.js';
17
+ import { SCHEMA_SQL } from './schema-sql.js';
18
+ // Re-export migration runner functions and types (extracted in SMI-3910)
19
+ export { MIGRATIONS, getSchemaVersion, runMigrations, runMigrationsSafe, } from './migration-runner.js';
20
+ // Re-import for use within this file (openDatabase, openDatabaseAsync)
21
+ import { runMigrationsSafe } from './migration-runner.js';
21
22
  // v11: SMI-3510 content hash verification column
22
- export const SCHEMA_VERSION = 11;
23
- /**
24
- * SQL statements for creating the database schema
25
- */
26
- export const SCHEMA_SQL = `
27
- -- Enable WAL mode for better concurrent performance
28
- PRAGMA journal_mode = WAL;
29
- PRAGMA synchronous = NORMAL;
30
- PRAGMA cache_size = -64000; -- 64MB cache
31
- PRAGMA temp_store = MEMORY;
32
-
33
- -- Schema version tracking
34
- CREATE TABLE IF NOT EXISTS schema_version (
35
- version INTEGER PRIMARY KEY,
36
- applied_at TEXT NOT NULL DEFAULT (datetime('now'))
37
- );
38
-
39
- -- Skills table - main storage for discovered skills
40
- CREATE TABLE IF NOT EXISTS skills (
41
- id TEXT PRIMARY KEY,
42
- name TEXT NOT NULL,
43
- description TEXT,
44
- author TEXT,
45
- repo_url TEXT UNIQUE,
46
- quality_score REAL CHECK(quality_score IS NULL OR (quality_score >= 0 AND quality_score <= 1)),
47
- trust_tier TEXT CHECK(trust_tier IN ('verified', 'community', 'experimental', 'unknown')) DEFAULT 'unknown',
48
- tags TEXT DEFAULT '[]', -- JSON array of tags
49
- risk_score INTEGER CHECK(risk_score IS NULL OR (risk_score >= 0 AND risk_score <= 100)), -- SMI-825
50
- security_findings_count INTEGER DEFAULT 0,
51
- security_scanned_at TEXT,
52
- security_passed INTEGER, -- boolean: 1 = passed, 0 = failed, NULL = not scanned
53
- compatibility TEXT DEFAULT '[]', -- SMI-2760: JSON array of IDE/LLM/platform slugs
54
- content_hash TEXT, -- SMI-3510: SHA-256 hash of SKILL.md for tamper detection
55
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
56
- updated_at TEXT NOT NULL DEFAULT (datetime('now'))
57
- );
58
-
59
- -- FTS5 virtual table for full-text search with BM25 ranking
60
- CREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(
61
- name,
62
- description,
63
- tags,
64
- author,
65
- content='skills',
66
- content_rowid='rowid',
67
- tokenize='porter unicode61'
68
- );
69
-
70
- -- Triggers to keep FTS index in sync with skills table
71
- CREATE TRIGGER IF NOT EXISTS skills_ai AFTER INSERT ON skills BEGIN
72
- INSERT INTO skills_fts(rowid, name, description, tags, author)
73
- VALUES (NEW.rowid, NEW.name, NEW.description, NEW.tags, NEW.author);
74
- END;
75
-
76
- CREATE TRIGGER IF NOT EXISTS skills_ad AFTER DELETE ON skills BEGIN
77
- INSERT INTO skills_fts(skills_fts, rowid, name, description, tags, author)
78
- VALUES ('delete', OLD.rowid, OLD.name, OLD.description, OLD.tags, OLD.author);
79
- END;
80
-
81
- CREATE TRIGGER IF NOT EXISTS skills_au AFTER UPDATE ON skills BEGIN
82
- INSERT INTO skills_fts(skills_fts, rowid, name, description, tags, author)
83
- VALUES ('delete', OLD.rowid, OLD.name, OLD.description, OLD.tags, OLD.author);
84
- INSERT INTO skills_fts(rowid, name, description, tags, author)
85
- VALUES (NEW.rowid, NEW.name, NEW.description, NEW.tags, NEW.author);
86
- END;
87
-
88
- -- Sources table - tracks where skills are discovered from
89
- CREATE TABLE IF NOT EXISTS sources (
90
- id TEXT PRIMARY KEY,
91
- name TEXT NOT NULL,
92
- type TEXT NOT NULL CHECK(type IN ('github', 'gitlab', 'local', 'registry')),
93
- url TEXT NOT NULL UNIQUE,
94
- last_sync_at TEXT,
95
- is_active INTEGER NOT NULL DEFAULT 1,
96
- created_at TEXT NOT NULL DEFAULT (datetime('now'))
97
- );
98
-
99
- -- Categories table - hierarchical organization of skills
100
- CREATE TABLE IF NOT EXISTS categories (
101
- id TEXT PRIMARY KEY,
102
- name TEXT NOT NULL UNIQUE,
103
- description TEXT,
104
- parent_id TEXT REFERENCES categories(id) ON DELETE SET NULL,
105
- skill_count INTEGER NOT NULL DEFAULT 0,
106
- created_at TEXT NOT NULL DEFAULT (datetime('now'))
107
- );
108
-
109
- -- Skill-Category junction table
110
- CREATE TABLE IF NOT EXISTS skill_categories (
111
- skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
112
- category_id TEXT NOT NULL REFERENCES categories(id) ON DELETE CASCADE,
113
- PRIMARY KEY (skill_id, category_id)
114
- );
115
-
116
- -- Cache table for search results and API responses
117
- CREATE TABLE IF NOT EXISTS cache (
118
- key TEXT PRIMARY KEY,
119
- value TEXT NOT NULL,
120
- expires_at INTEGER, -- Unix timestamp, NULL for no expiry
121
- created_at TEXT NOT NULL DEFAULT (datetime('now'))
122
- );
123
-
124
- -- Indexes for common query patterns
125
- CREATE INDEX IF NOT EXISTS idx_skills_author ON skills(author);
126
- CREATE INDEX IF NOT EXISTS idx_skills_trust_tier ON skills(trust_tier);
127
- CREATE INDEX IF NOT EXISTS idx_skills_quality_score ON skills(quality_score);
128
- CREATE INDEX IF NOT EXISTS idx_skills_updated_at ON skills(updated_at);
129
- CREATE INDEX IF NOT EXISTS idx_skills_created_at ON skills(created_at);
130
- CREATE INDEX IF NOT EXISTS idx_skills_risk_score ON skills(risk_score);
131
- CREATE INDEX IF NOT EXISTS idx_skills_security_passed ON skills(security_passed);
132
- CREATE INDEX IF NOT EXISTS idx_sources_type ON sources(type);
133
- CREATE INDEX IF NOT EXISTS idx_sources_is_active ON sources(is_active);
134
- CREATE INDEX IF NOT EXISTS idx_categories_parent ON categories(parent_id);
135
- CREATE INDEX IF NOT EXISTS idx_cache_expires ON cache(expires_at);
136
-
137
- -- SMI-733: Audit logs table for security monitoring
138
- -- See: docs/security/index.md §3 Audit Logging
139
- CREATE TABLE IF NOT EXISTS audit_logs (
140
- id TEXT PRIMARY KEY,
141
- event_type TEXT NOT NULL,
142
- timestamp TEXT NOT NULL DEFAULT (datetime('now')),
143
- actor TEXT,
144
- resource TEXT,
145
- action TEXT,
146
- result TEXT,
147
- metadata TEXT,
148
- created_at TEXT NOT NULL DEFAULT (datetime('now'))
149
- );
150
-
151
- CREATE INDEX IF NOT EXISTS idx_audit_event_type ON audit_logs(event_type);
152
- CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit_logs(timestamp);
153
- CREATE INDEX IF NOT EXISTS idx_audit_resource ON audit_logs(resource);
154
- CREATE INDEX IF NOT EXISTS idx_audit_result ON audit_logs(result);
155
- CREATE INDEX IF NOT EXISTS idx_audit_actor ON audit_logs(actor);
156
- `;
157
- export const MIGRATIONS = [
158
- {
159
- version: 1,
160
- description: 'Initial schema creation',
161
- sql: SCHEMA_SQL,
162
- },
163
- {
164
- version: 2,
165
- description: 'SMI-974: Add missing columns for Phase 5 imported databases',
166
- sql: MIGRATION_V2_SQL,
167
- },
168
- {
169
- version: 3,
170
- description: 'Registry sync tables for local-to-live synchronization',
171
- sql: MIGRATION_V3_SQL,
172
- },
173
- {
174
- version: 4,
175
- description: 'SMI-825: Add security scan columns to skills table',
176
- sql: MIGRATION_V4_SQL,
177
- },
178
- {
179
- version: 5,
180
- description: 'SMI-skill-version-tracking Wave 1: skill_versions table',
181
- sql: MIGRATION_V5_SQL,
182
- },
183
- {
184
- version: 6,
185
- description: 'SMI-skill-version-tracking Wave 2: add change_type to skill_versions',
186
- sql: MIGRATION_V5B_SQL,
187
- },
188
- {
189
- version: 7,
190
- description: 'SMI-skill-version-tracking Wave 3: skill_advisories table',
191
- sql: MIGRATION_V6_SQL,
192
- },
193
- {
194
- version: 8,
195
- description: 'SMI-2760: compatibility column on skills table',
196
- sql: MIGRATION_V7_SQL,
197
- },
198
- {
199
- version: 9,
200
- description: 'SMI-2761: skill_co_installs table for co-install recommendations',
201
- sql: MIGRATION_V8_SQL,
202
- },
203
- {
204
- version: 10,
205
- description: 'Skill dependency intelligence: skill_dependencies table',
206
- sql: MIGRATION_V10_SQL,
207
- },
208
- {
209
- version: 11,
210
- description: 'SMI-3510: content_hash column for tamper detection',
211
- sql: 'ALTER TABLE skills ADD COLUMN content_hash TEXT',
212
- },
213
- ];
214
- /**
215
- * SMI-974: Migration SQL for adding FTS5 to existing database
216
- * Run separately as FTS5 creation can fail if table exists
217
- */
218
- export const FTS5_MIGRATION_SQL = `
219
- -- Create FTS5 virtual table if not exists
220
- CREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(
221
- name,
222
- description,
223
- tags,
224
- author,
225
- content='skills',
226
- content_rowid='rowid',
227
- tokenize='porter unicode61'
228
- );
229
-
230
- -- Populate FTS from existing skills (safe to run multiple times)
231
- INSERT OR IGNORE INTO skills_fts(rowid, name, description, tags, author)
232
- SELECT rowid, name, description, tags, author FROM skills;
233
- `;
23
+ // v12: SMI-3864 risk score history for trend detection
24
+ // v13: SMI-3896 visibility and team_id for private skills
25
+ export const SCHEMA_VERSION = 13;
234
26
  /**
235
27
  * Initialize the database with the complete schema
236
28
  */
@@ -240,49 +32,6 @@ export function initializeSchema(db) {
240
32
  const stmt = db.prepare('INSERT OR REPLACE INTO schema_version (version) VALUES (?)');
241
33
  stmt.run(SCHEMA_VERSION);
242
34
  }
243
- /**
244
- * Get the current schema version from the database
245
- */
246
- export function getSchemaVersion(db) {
247
- try {
248
- const result = db.prepare('SELECT MAX(version) as version FROM schema_version').get();
249
- return result?.version ?? 0;
250
- }
251
- catch {
252
- return 0;
253
- }
254
- }
255
- /**
256
- * Run pending migrations to upgrade the schema
257
- * Handles duplicate column errors gracefully since the initial schema
258
- * already includes all columns, but migrations need to support databases
259
- * created by other means (e.g., Phase 5 import scripts)
260
- */
261
- export function runMigrations(db) {
262
- const currentVersion = getSchemaVersion(db);
263
- let migrationsRun = 0;
264
- for (const migration of MIGRATIONS) {
265
- if (migration.version > currentVersion) {
266
- // Execute each statement separately to handle duplicate column errors
267
- const statements = migration.sql.split(';').filter((s) => s.trim());
268
- for (const stmt of statements) {
269
- try {
270
- db.exec(stmt);
271
- }
272
- catch (error) {
273
- // Ignore "duplicate column" errors - column already exists from initial schema
274
- const msg = error instanceof Error ? error.message : String(error);
275
- if (!msg.includes('duplicate column')) {
276
- throw error;
277
- }
278
- }
279
- }
280
- db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(migration.version);
281
- migrationsRun++;
282
- }
283
- }
284
- return migrationsRun;
285
- }
286
35
  /** @deprecated Use createDatabaseAsync() — requires better-sqlite3 native module. */
287
36
  export function createDatabase(path = ':memory:') {
288
37
  const db = createDatabaseSync(path);
@@ -319,45 +68,6 @@ export function openDatabase(path) {
319
68
  runMigrationsSafe(db);
320
69
  return db;
321
70
  }
322
- /** SMI-974: Run migrations with error handling for existing columns */
323
- export function runMigrationsSafe(db) {
324
- const currentVersion = getSchemaVersion(db);
325
- let migrationsRun = 0;
326
- for (const migration of MIGRATIONS) {
327
- if (migration.version > currentVersion) {
328
- try {
329
- // Try to run migration, but handle "duplicate column" errors gracefully
330
- const statements = migration.sql.split(';').filter((s) => s.trim());
331
- for (const stmt of statements) {
332
- try {
333
- db.exec(stmt);
334
- }
335
- catch (error) {
336
- // Ignore "duplicate column" errors - column already exists
337
- const msg = error instanceof Error ? error.message : String(error);
338
- if (!msg.includes('duplicate column')) {
339
- throw error;
340
- }
341
- }
342
- }
343
- db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(migration.version);
344
- migrationsRun++;
345
- }
346
- catch (error) {
347
- // Log but don't fail on migration errors
348
- console.warn(`Migration ${migration.version} failed:`, error);
349
- }
350
- }
351
- }
352
- // Try to create FTS5 table (may already exist)
353
- try {
354
- db.exec(FTS5_MIGRATION_SQL);
355
- }
356
- catch {
357
- // FTS5 may already exist or have issues - that's ok
358
- }
359
- return migrationsRun;
360
- }
361
71
  /**
362
72
  * Close the database connection safely
363
73
  */
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/db/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/db/schema.ts"],"names":[],"mappings":"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"}
@@ -24,4 +24,5 @@ export { computeUpdateRisk, type RiskLevel, type Recommendation, type UpdateRisk
24
24
  export { AdvisoryRepository, type SkillAdvisory } from '../repositories/AdvisoryRepository.js';
25
25
  export { CoInstallRepository, type CoInstallSummary } from '../repositories/CoInstallRepository.js';
26
26
  export { SkillDependencyRepository } from '../repositories/SkillDependencyRepository.js';
27
+ export { RiskScoreHistoryRepository, type RiskScoreSnapshot, } from '../repositories/RiskScoreHistoryRepository.js';
27
28
  //# sourceMappingURL=repositories.d.ts.map