@skillsmith/core 0.4.13 → 0.4.15
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.
- package/README.md +2 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analytics/storage.d.ts +8 -2
- package/dist/src/analytics/storage.d.ts.map +1 -1
- package/dist/src/analytics/storage.js +16 -5
- package/dist/src/analytics/storage.js.map +1 -1
- package/dist/src/analytics/usage-tracker.d.ts +8 -2
- package/dist/src/analytics/usage-tracker.d.ts.map +1 -1
- package/dist/src/analytics/usage-tracker.js +24 -11
- package/dist/src/analytics/usage-tracker.js.map +1 -1
- package/dist/src/api/client.d.ts +1 -0
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.health.d.ts +26 -0
- package/dist/src/api/client.health.d.ts.map +1 -0
- package/dist/src/api/client.health.js +74 -0
- package/dist/src/api/client.health.js.map +1 -0
- package/dist/src/api/client.js +3 -51
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/benchmarks/IndexBenchmark.js +2 -2
- package/dist/src/benchmarks/IndexBenchmark.js.map +1 -1
- package/dist/src/benchmarks/SearchBenchmark.js +2 -2
- package/dist/src/benchmarks/SearchBenchmark.js.map +1 -1
- package/dist/src/benchmarks/cacheBenchmark.js +2 -2
- package/dist/src/benchmarks/cacheBenchmark.js.map +1 -1
- package/dist/src/benchmarks/embeddingBenchmark.js +1 -1
- package/dist/src/benchmarks/embeddingBenchmark.js.map +1 -1
- package/dist/src/cache/CacheManager.d.ts +13 -2
- package/dist/src/cache/CacheManager.d.ts.map +1 -1
- package/dist/src/cache/CacheManager.js +27 -6
- package/dist/src/cache/CacheManager.js.map +1 -1
- package/dist/src/cache/TieredCache.d.ts +15 -2
- package/dist/src/cache/TieredCache.d.ts.map +1 -1
- package/dist/src/cache/TieredCache.js +52 -70
- package/dist/src/cache/TieredCache.js.map +1 -1
- package/dist/src/cache/index.d.ts +12 -0
- package/dist/src/cache/index.d.ts.map +1 -1
- package/dist/src/cache/index.js +20 -1
- package/dist/src/cache/index.js.map +1 -1
- package/dist/src/cache/sqlite.d.ts +15 -1
- package/dist/src/cache/sqlite.d.ts.map +1 -1
- package/dist/src/cache/sqlite.js +22 -4
- package/dist/src/cache/sqlite.js.map +1 -1
- package/dist/src/db/createDatabase.d.ts +9 -1
- package/dist/src/db/createDatabase.d.ts.map +1 -1
- package/dist/src/db/createDatabase.js +21 -1
- package/dist/src/db/createDatabase.js.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.js +5 -2
- package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
- package/dist/src/db/migrations/v5-skill-versions.d.ts +30 -0
- package/dist/src/db/migrations/v5-skill-versions.d.ts.map +1 -0
- package/dist/src/db/migrations/v5-skill-versions.js +45 -0
- package/dist/src/db/migrations/v5-skill-versions.js.map +1 -0
- package/dist/src/db/migrations/v5b-change-type.d.ts +19 -0
- package/dist/src/db/migrations/v5b-change-type.d.ts.map +1 -0
- package/dist/src/db/migrations/v5b-change-type.js +22 -0
- package/dist/src/db/migrations/v5b-change-type.js.map +1 -0
- package/dist/src/db/migrations/v6-advisories.d.ts +32 -0
- package/dist/src/db/migrations/v6-advisories.d.ts.map +1 -0
- package/dist/src/db/migrations/v6-advisories.js +53 -0
- package/dist/src/db/migrations/v6-advisories.js.map +1 -0
- package/dist/src/db/migrations/v7-compatibility.d.ts +21 -0
- package/dist/src/db/migrations/v7-compatibility.d.ts.map +1 -0
- package/dist/src/db/migrations/v7-compatibility.js +23 -0
- package/dist/src/db/migrations/v7-compatibility.js.map +1 -0
- package/dist/src/db/migrations/v8-co-installs.d.ts +21 -0
- package/dist/src/db/migrations/v8-co-installs.d.ts.map +1 -0
- package/dist/src/db/migrations/v8-co-installs.js +33 -0
- package/dist/src/db/migrations/v8-co-installs.js.map +1 -0
- package/dist/src/db/schema.d.ts +6 -11
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +38 -17
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.d.ts +14 -0
- package/dist/src/embeddings/hnsw-store.d.ts.map +1 -1
- package/dist/src/embeddings/hnsw-store.helpers.d.ts +4 -4
- package/dist/src/embeddings/hnsw-store.helpers.d.ts.map +1 -1
- package/dist/src/embeddings/hnsw-store.helpers.js +5 -5
- package/dist/src/embeddings/hnsw-store.helpers.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.js +32 -4
- package/dist/src/embeddings/hnsw-store.js.map +1 -1
- package/dist/src/embeddings/index.d.ts +15 -1
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js +24 -4
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/exports/repositories.d.ts +5 -0
- package/dist/src/exports/repositories.d.ts.map +1 -1
- package/dist/src/exports/repositories.js +17 -0
- package/dist/src/exports/repositories.js.map +1 -1
- package/dist/src/exports/types.d.ts +1 -1
- package/dist/src/exports/types.d.ts.map +1 -1
- package/dist/src/exports/types.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/SkillParser.d.ts +2 -0
- package/dist/src/indexer/SkillParser.d.ts.map +1 -1
- package/dist/src/indexer/SkillParser.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts +8 -2
- package/dist/src/learning/PatternStore.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.d.ts +19 -1
- package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.js +51 -0
- package/dist/src/learning/PatternStore.helpers.js.map +1 -1
- package/dist/src/learning/PatternStore.js +19 -39
- package/dist/src/learning/PatternStore.js.map +1 -1
- package/dist/src/repositories/AdvisoryRepository.d.ts +80 -0
- package/dist/src/repositories/AdvisoryRepository.d.ts.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.js +128 -0
- package/dist/src/repositories/AdvisoryRepository.js.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.test.d.ts +6 -0
- package/dist/src/repositories/AdvisoryRepository.test.d.ts.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.test.js +149 -0
- package/dist/src/repositories/AdvisoryRepository.test.js.map +1 -0
- package/dist/src/repositories/CoInstallRepository.d.ts +68 -0
- package/dist/src/repositories/CoInstallRepository.d.ts.map +1 -0
- package/dist/src/repositories/CoInstallRepository.js +122 -0
- package/dist/src/repositories/CoInstallRepository.js.map +1 -0
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +16 -5
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/SkillVersionRepository.d.ts +82 -0
- package/dist/src/repositories/SkillVersionRepository.d.ts.map +1 -0
- package/dist/src/repositories/SkillVersionRepository.js +118 -0
- package/dist/src/repositories/SkillVersionRepository.js.map +1 -0
- package/dist/src/search/hybrid.d.ts +15 -4
- package/dist/src/search/hybrid.d.ts.map +1 -1
- package/dist/src/search/hybrid.js +25 -9
- package/dist/src/search/hybrid.js.map +1 -1
- package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
- package/dist/src/services/SearchService.helpers.js +4 -0
- package/dist/src/services/SearchService.helpers.js.map +1 -1
- package/dist/src/services/SearchService.types.d.ts +1 -0
- package/dist/src/services/SearchService.types.d.ts.map +1 -1
- package/dist/src/services/TaskRunner.d.ts +5 -81
- package/dist/src/services/TaskRunner.d.ts.map +1 -1
- package/dist/src/services/TaskRunner.js +7 -68
- package/dist/src/services/TaskRunner.js.map +1 -1
- package/dist/src/services/TaskRunner.process.d.ts +33 -0
- package/dist/src/services/TaskRunner.process.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.process.js +70 -0
- package/dist/src/services/TaskRunner.process.js.map +1 -0
- package/dist/src/services/TaskRunner.types.d.ts +76 -0
- package/dist/src/services/TaskRunner.types.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.types.js +22 -0
- package/dist/src/services/TaskRunner.types.js.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.d.ts +13 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.js +91 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.js.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.d.ts +3 -24
- package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -1
- package/dist/src/services/quarantine/QuarantineService.js +8 -205
- package/dist/src/services/quarantine/QuarantineService.js.map +1 -1
- package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts +57 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.js +211 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.js.map +1 -0
- package/dist/src/session/SessionManager.d.ts +2 -33
- package/dist/src/session/SessionManager.d.ts.map +1 -1
- package/dist/src/session/SessionManager.js +14 -238
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/session/SessionManager.memory.d.ts +67 -0
- package/dist/src/session/SessionManager.memory.d.ts.map +1 -0
- package/dist/src/session/SessionManager.memory.js +262 -0
- package/dist/src/session/SessionManager.memory.js.map +1 -0
- package/dist/src/sync/SyncEngine.d.ts +13 -1
- package/dist/src/sync/SyncEngine.d.ts.map +1 -1
- package/dist/src/sync/SyncEngine.js +50 -1
- package/dist/src/sync/SyncEngine.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts +5 -6
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
- package/dist/src/testing/MultiLLMProvider.js +18 -130
- package/dist/src/testing/MultiLLMProvider.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.metrics.d.ts +33 -0
- package/dist/src/testing/MultiLLMProvider.metrics.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.metrics.js +87 -0
- package/dist/src/testing/MultiLLMProvider.metrics.js.map +1 -0
- package/dist/src/testing/MultiLLMProvider.selection.d.ts +77 -0
- package/dist/src/testing/MultiLLMProvider.selection.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.selection.js +151 -0
- package/dist/src/testing/MultiLLMProvider.selection.js.map +1 -0
- package/dist/src/types/skill.d.ts +10 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +34 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/versioning/change-classifier.d.ts +38 -0
- package/dist/src/versioning/change-classifier.d.ts.map +1 -0
- package/dist/src/versioning/change-classifier.js +187 -0
- package/dist/src/versioning/change-classifier.js.map +1 -0
- package/dist/src/versioning/change-classifier.test.d.ts +6 -0
- package/dist/src/versioning/change-classifier.test.d.ts.map +1 -0
- package/dist/src/versioning/change-classifier.test.js +275 -0
- package/dist/src/versioning/change-classifier.test.js.map +1 -0
- package/dist/src/versioning/update-risk.d.ts +50 -0
- package/dist/src/versioning/update-risk.d.ts.map +1 -0
- package/dist/src/versioning/update-risk.js +80 -0
- package/dist/src/versioning/update-risk.js.map +1 -0
- package/dist/src/versioning/update-risk.test.d.ts +6 -0
- package/dist/src/versioning/update-risk.test.d.ts.map +1 -0
- package/dist/src/versioning/update-risk.test.js +200 -0
- package/dist/src/versioning/update-risk.test.js.map +1 -0
- package/dist/tests/AnalyticsStorage.test.js +2 -2
- package/dist/tests/AnalyticsStorage.test.js.map +1 -1
- package/dist/tests/AuditLogger.edge-cases.test.d.ts +10 -0
- package/dist/tests/AuditLogger.edge-cases.test.d.ts.map +1 -0
- package/dist/tests/AuditLogger.edge-cases.test.js +183 -0
- package/dist/tests/AuditLogger.edge-cases.test.js.map +1 -0
- package/dist/tests/CacheManager.test.d.ts +9 -0
- package/dist/tests/CacheManager.test.d.ts.map +1 -0
- package/dist/tests/CacheManager.test.js +163 -0
- package/dist/tests/CacheManager.test.js.map +1 -0
- package/dist/tests/CacheSecurity.test.js +4 -4
- package/dist/tests/CacheSecurity.test.js.map +1 -1
- package/dist/tests/EmbeddingService.test.js +11 -12
- package/dist/tests/EmbeddingService.test.js.map +1 -1
- package/dist/tests/GitHubIndexer.edge-cases.test.d.ts +10 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.d.ts.map +1 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.js +255 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.js.map +1 -0
- package/dist/tests/HybridSearch.test.d.ts +8 -0
- package/dist/tests/HybridSearch.test.d.ts.map +1 -0
- package/dist/tests/HybridSearch.test.js +48 -0
- package/dist/tests/HybridSearch.test.js.map +1 -0
- package/dist/tests/SearchService.test.js +71 -0
- package/dist/tests/SearchService.test.js.map +1 -1
- package/dist/tests/SkillVersionRepository.test.d.ts +2 -0
- package/dist/tests/SkillVersionRepository.test.d.ts.map +1 -0
- package/dist/tests/SkillVersionRepository.test.js +168 -0
- package/dist/tests/SkillVersionRepository.test.js.map +1 -0
- package/dist/tests/TieredCache.test.js +10 -10
- package/dist/tests/TieredCache.test.js.map +1 -1
- package/dist/tests/UsageTracker.test.js +6 -6
- package/dist/tests/UsageTracker.test.js.map +1 -1
- package/dist/tests/analytics/usage-tracker.test.js +8 -8
- package/dist/tests/analytics/usage-tracker.test.js.map +1 -1
- package/dist/tests/api/client.health.test.d.ts +15 -0
- package/dist/tests/api/client.health.test.d.ts.map +1 -0
- package/dist/tests/api/client.health.test.js +111 -0
- package/dist/tests/api/client.health.test.js.map +1 -0
- package/dist/tests/cache.test.js +7 -9
- package/dist/tests/cache.test.js.map +1 -1
- package/dist/tests/db/betterSqlite3Driver.test.d.ts +8 -0
- package/dist/tests/db/betterSqlite3Driver.test.d.ts.map +1 -0
- package/dist/tests/db/betterSqlite3Driver.test.js +88 -0
- package/dist/tests/db/betterSqlite3Driver.test.js.map +1 -0
- package/dist/tests/db/database-abstraction.test.js +48 -0
- package/dist/tests/db/database-abstraction.test.js.map +1 -1
- package/dist/tests/db/schema-migrations.test.d.ts +10 -0
- package/dist/tests/db/schema-migrations.test.d.ts.map +1 -0
- package/dist/tests/db/schema-migrations.test.js +134 -0
- package/dist/tests/db/schema-migrations.test.js.map +1 -0
- package/dist/tests/db/sqljsDriver.test.d.ts +9 -0
- package/dist/tests/db/sqljsDriver.test.d.ts.map +1 -0
- package/dist/tests/db/sqljsDriver.test.js +75 -0
- package/dist/tests/db/sqljsDriver.test.js.map +1 -0
- package/dist/tests/embeddings/hnsw-store.test.js +27 -24
- package/dist/tests/embeddings/hnsw-store.test.js.map +1 -1
- package/dist/tests/helpers/database.d.ts +32 -0
- package/dist/tests/helpers/database.d.ts.map +1 -0
- package/dist/tests/helpers/database.js +54 -0
- package/dist/tests/helpers/database.js.map +1 -0
- package/dist/tests/learning/PatternStore.helpers.test.d.ts +17 -0
- package/dist/tests/learning/PatternStore.helpers.test.d.ts.map +1 -0
- package/dist/tests/learning/PatternStore.helpers.test.js +301 -0
- package/dist/tests/learning/PatternStore.helpers.test.js.map +1 -0
- package/dist/tests/learning/PatternStore.test.js +9 -0
- package/dist/tests/learning/PatternStore.test.js.map +1 -1
- package/dist/tests/repositories/CoInstallRepository.test.d.ts +9 -0
- package/dist/tests/repositories/CoInstallRepository.test.d.ts.map +1 -0
- package/dist/tests/repositories/CoInstallRepository.test.js +126 -0
- package/dist/tests/repositories/CoInstallRepository.test.js.map +1 -0
- package/dist/tests/routing/LanguageRouter.test.d.ts +9 -0
- package/dist/tests/routing/LanguageRouter.test.d.ts.map +1 -0
- package/dist/tests/routing/LanguageRouter.test.js +150 -0
- package/dist/tests/routing/LanguageRouter.test.js.map +1 -0
- package/dist/tests/session/SessionManager.memory.test.d.ts +11 -0
- package/dist/tests/session/SessionManager.memory.test.d.ts.map +1 -0
- package/dist/tests/session/SessionManager.memory.test.js +219 -0
- package/dist/tests/session/SessionManager.memory.test.js.map +1 -0
- package/dist/tests/sync/SyncEngine.test.js +32 -18
- package/dist/tests/sync/SyncEngine.test.js.map +1 -1
- package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts +13 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.js +149 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.js.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts +15 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.js +249 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.js.map +1 -0
- package/dist/tests/unit/quarantine-query-builder.test.d.ts +10 -0
- package/dist/tests/unit/quarantine-query-builder.test.d.ts.map +1 -0
- package/dist/tests/unit/quarantine-query-builder.test.js +157 -0
- package/dist/tests/unit/quarantine-query-builder.test.js.map +1 -0
- package/package.json +1 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdvisoryRepository.d.ts","sourceRoot":"","sources":["../../../src/repositories/AdvisoryRepository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAM3E;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,EAAE,EAAE,MAAM,CAAA;IACV,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAA;IACf,8BAA8B;IAC9B,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;IAChD,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAA;IACnB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAyBD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAc;gBAEZ,EAAE,EAAE,YAAY;IAQ5B,OAAO,CAAC,aAAa;IAqBrB;;;;;;OAMG;IACH,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAwB7C;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAclC;;;;;OAKG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE;IAgBvD;;;;;OAKG;IACH,mBAAmB,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,EAAE;CA8BxF"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview AdvisoryRepository — vulnerability advisory storage and retrieval
|
|
3
|
+
* @module @skillsmith/core/repositories/AdvisoryRepository
|
|
4
|
+
* @see SMI-skill-version-tracking Wave 3
|
|
5
|
+
*
|
|
6
|
+
* Provides CRUD operations for skill security advisories stored in
|
|
7
|
+
* the skill_advisories table (introduced in migration v6).
|
|
8
|
+
*
|
|
9
|
+
* Design notes:
|
|
10
|
+
* - No FK on skill_id — soft reference, advisory history survives skill removal
|
|
11
|
+
* - upsertAdvisory is idempotent via INSERT OR REPLACE
|
|
12
|
+
* - "Active" advisories are those where withdrawn_at IS NULL
|
|
13
|
+
*/
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Repository
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Repository for reading and writing skill advisory records
|
|
19
|
+
*/
|
|
20
|
+
export class AdvisoryRepository {
|
|
21
|
+
db;
|
|
22
|
+
constructor(db) {
|
|
23
|
+
this.db = db;
|
|
24
|
+
}
|
|
25
|
+
// --------------------------------------------------------------------------
|
|
26
|
+
// Private helpers
|
|
27
|
+
// --------------------------------------------------------------------------
|
|
28
|
+
rowToAdvisory(row) {
|
|
29
|
+
return {
|
|
30
|
+
id: row.id,
|
|
31
|
+
skillId: row.skill_id,
|
|
32
|
+
severity: row.severity,
|
|
33
|
+
title: row.title,
|
|
34
|
+
description: row.description,
|
|
35
|
+
affectedVersions: row.affected_versions ?? undefined,
|
|
36
|
+
patchedVersions: row.patched_versions ?? undefined,
|
|
37
|
+
cweIds: row.cwe_ids ?? undefined,
|
|
38
|
+
advisoryRefs: row.advisory_refs ?? undefined,
|
|
39
|
+
publishedAt: row.published_at,
|
|
40
|
+
withdrawnAt: row.withdrawn_at ?? undefined,
|
|
41
|
+
createdAt: row.created_at,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// --------------------------------------------------------------------------
|
|
45
|
+
// Writes
|
|
46
|
+
// --------------------------------------------------------------------------
|
|
47
|
+
/**
|
|
48
|
+
* Insert or replace an advisory record.
|
|
49
|
+
*
|
|
50
|
+
* Idempotent: re-running with the same id replaces the existing row.
|
|
51
|
+
*
|
|
52
|
+
* @param advisory - Advisory data to persist
|
|
53
|
+
*/
|
|
54
|
+
upsertAdvisory(advisory) {
|
|
55
|
+
this.db
|
|
56
|
+
.prepare(`INSERT OR REPLACE INTO skill_advisories
|
|
57
|
+
(id, skill_id, severity, title, description,
|
|
58
|
+
affected_versions, patched_versions, cwe_ids, advisory_refs,
|
|
59
|
+
published_at, withdrawn_at)
|
|
60
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
61
|
+
.run(advisory.id, advisory.skillId, advisory.severity, advisory.title, advisory.description, advisory.affectedVersions ?? null, advisory.patchedVersions ?? null, advisory.cweIds ?? null, advisory.advisoryRefs ?? null, advisory.publishedAt, advisory.withdrawnAt ?? null);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Mark an advisory as withdrawn by setting withdrawn_at to the current time.
|
|
65
|
+
*
|
|
66
|
+
* @param id - Advisory identifier to withdraw
|
|
67
|
+
*/
|
|
68
|
+
withdrawAdvisory(id) {
|
|
69
|
+
this.db
|
|
70
|
+
.prepare(`UPDATE skill_advisories
|
|
71
|
+
SET withdrawn_at = datetime('now')
|
|
72
|
+
WHERE id = ?`)
|
|
73
|
+
.run(id);
|
|
74
|
+
}
|
|
75
|
+
// --------------------------------------------------------------------------
|
|
76
|
+
// Reads
|
|
77
|
+
// --------------------------------------------------------------------------
|
|
78
|
+
/**
|
|
79
|
+
* Get all active (non-withdrawn) advisories for a specific skill.
|
|
80
|
+
*
|
|
81
|
+
* @param skillId - Registry skill identifier
|
|
82
|
+
* @returns Array of active SkillAdvisory records ordered by published_at DESC
|
|
83
|
+
*/
|
|
84
|
+
getAdvisoriesForSkill(skillId) {
|
|
85
|
+
const rows = this.db
|
|
86
|
+
.prepare(`SELECT id, skill_id, severity, title, description,
|
|
87
|
+
affected_versions, patched_versions, cwe_ids, advisory_refs,
|
|
88
|
+
published_at, withdrawn_at, created_at
|
|
89
|
+
FROM skill_advisories
|
|
90
|
+
WHERE skill_id = ?
|
|
91
|
+
AND withdrawn_at IS NULL
|
|
92
|
+
ORDER BY published_at DESC`)
|
|
93
|
+
.all(skillId);
|
|
94
|
+
return rows.map((r) => this.rowToAdvisory(r));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get all active advisories, optionally filtered by severity.
|
|
98
|
+
*
|
|
99
|
+
* @param severity - Optional severity filter; omit to return all active advisories
|
|
100
|
+
* @returns Array of active SkillAdvisory records ordered by published_at DESC
|
|
101
|
+
*/
|
|
102
|
+
getActiveAdvisories(severity) {
|
|
103
|
+
let rows;
|
|
104
|
+
if (severity) {
|
|
105
|
+
rows = this.db
|
|
106
|
+
.prepare(`SELECT id, skill_id, severity, title, description,
|
|
107
|
+
affected_versions, patched_versions, cwe_ids, advisory_refs,
|
|
108
|
+
published_at, withdrawn_at, created_at
|
|
109
|
+
FROM skill_advisories
|
|
110
|
+
WHERE withdrawn_at IS NULL
|
|
111
|
+
AND severity = ?
|
|
112
|
+
ORDER BY published_at DESC`)
|
|
113
|
+
.all(severity);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
rows = this.db
|
|
117
|
+
.prepare(`SELECT id, skill_id, severity, title, description,
|
|
118
|
+
affected_versions, patched_versions, cwe_ids, advisory_refs,
|
|
119
|
+
published_at, withdrawn_at, created_at
|
|
120
|
+
FROM skill_advisories
|
|
121
|
+
WHERE withdrawn_at IS NULL
|
|
122
|
+
ORDER BY published_at DESC`)
|
|
123
|
+
.all();
|
|
124
|
+
}
|
|
125
|
+
return rows.map((r) => this.rowToAdvisory(r));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=AdvisoryRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdvisoryRepository.js","sourceRoot":"","sources":["../../../src/repositories/AdvisoryRepository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAyDH,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACrB,EAAE,CAAc;IAExB,YAAY,EAAgB;QAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAErE,aAAa,CAAC,GAAgB;QACpC,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,gBAAgB,EAAE,GAAG,CAAC,iBAAiB,IAAI,SAAS;YACpD,eAAe,EAAE,GAAG,CAAC,gBAAgB,IAAI,SAAS;YAClD,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;YAChC,YAAY,EAAE,GAAG,CAAC,aAAa,IAAI,SAAS;YAC5C,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,WAAW,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;YAC1C,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAA;IACH,CAAC;IAED,6EAA6E;IAC7E,SAAS;IACT,6EAA6E;IAE7E;;;;;;OAMG;IACH,cAAc,CAAC,QAAuB;QACpC,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;;;kDAI0C,CAC3C;aACA,GAAG,CACF,QAAQ,CAAC,EAAE,EACX,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,gBAAgB,IAAI,IAAI,EACjC,QAAQ,CAAC,eAAe,IAAI,IAAI,EAChC,QAAQ,CAAC,MAAM,IAAI,IAAI,EACvB,QAAQ,CAAC,YAAY,IAAI,IAAI,EAC7B,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,WAAW,IAAI,IAAI,CAC7B,CAAA;IACL,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,EAAU;QACzB,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;uBAEe,CAChB;aACA,GAAG,CAAC,EAAE,CAAC,CAAA;IACZ,CAAC;IAED,6EAA6E;IAC7E,QAAQ;IACR,6EAA6E;IAE7E;;;;;OAKG;IACH,qBAAqB,CAAC,OAAe;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;;;qCAM6B,CAC9B;aACA,GAAG,CAAC,OAAO,CAAkB,CAAA;QAEhC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,CAAC;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,QAAiD;QACnE,IAAI,IAAmB,CAAA;QAEvB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,GAAG,IAAI,CAAC,EAAE;iBACX,OAAO,CACN;;;;;;uCAM6B,CAC9B;iBACA,GAAG,CAAC,QAAQ,CAAkB,CAAA;QACnC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,CAAC,EAAE;iBACX,OAAO,CACN;;;;;uCAK6B,CAC9B;iBACA,GAAG,EAAmB,CAAA;QAC3B,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdvisoryRepository.test.d.ts","sourceRoot":"","sources":["../../../src/repositories/AdvisoryRepository.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unit tests for AdvisoryRepository
|
|
3
|
+
* @see SMI-skill-version-tracking Wave 3
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
6
|
+
import { createTestDatabase, closeDatabase } from '../../tests/helpers/database.js';
|
|
7
|
+
import { AdvisoryRepository } from './AdvisoryRepository.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Test helpers
|
|
10
|
+
// ============================================================================
|
|
11
|
+
function makeAdvisory(overrides = {}) {
|
|
12
|
+
return {
|
|
13
|
+
id: 'SSA-2026-001',
|
|
14
|
+
skillId: 'community/commit-helper',
|
|
15
|
+
severity: 'high',
|
|
16
|
+
title: 'Prompt injection in commit-helper',
|
|
17
|
+
description: 'Maliciously crafted commit messages can inject arbitrary prompts.',
|
|
18
|
+
publishedAt: '2026-01-15T00:00:00Z',
|
|
19
|
+
...overrides,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Tests
|
|
24
|
+
// ============================================================================
|
|
25
|
+
describe('AdvisoryRepository', () => {
|
|
26
|
+
let db;
|
|
27
|
+
let repo;
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
db = createTestDatabase();
|
|
30
|
+
repo = new AdvisoryRepository(db);
|
|
31
|
+
});
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
closeDatabase(db);
|
|
34
|
+
});
|
|
35
|
+
// --------------------------------------------------------------------------
|
|
36
|
+
// upsertAdvisory
|
|
37
|
+
// --------------------------------------------------------------------------
|
|
38
|
+
describe('upsertAdvisory', () => {
|
|
39
|
+
it('creates a new advisory record', () => {
|
|
40
|
+
const advisory = makeAdvisory();
|
|
41
|
+
repo.upsertAdvisory(advisory);
|
|
42
|
+
const results = repo.getAdvisoriesForSkill('community/commit-helper');
|
|
43
|
+
expect(results).toHaveLength(1);
|
|
44
|
+
expect(results[0].id).toBe('SSA-2026-001');
|
|
45
|
+
expect(results[0].severity).toBe('high');
|
|
46
|
+
expect(results[0].title).toBe('Prompt injection in commit-helper');
|
|
47
|
+
});
|
|
48
|
+
it('replaces an existing advisory on re-upsert (idempotent)', () => {
|
|
49
|
+
repo.upsertAdvisory(makeAdvisory({ title: 'Original title' }));
|
|
50
|
+
repo.upsertAdvisory(makeAdvisory({ title: 'Updated title' }));
|
|
51
|
+
const results = repo.getAdvisoriesForSkill('community/commit-helper');
|
|
52
|
+
expect(results).toHaveLength(1);
|
|
53
|
+
expect(results[0].title).toBe('Updated title');
|
|
54
|
+
});
|
|
55
|
+
it('stores optional JSON fields correctly', () => {
|
|
56
|
+
const advisory = makeAdvisory({
|
|
57
|
+
affectedVersions: '["<1.2.0"]',
|
|
58
|
+
patchedVersions: '[">=1.2.0"]',
|
|
59
|
+
cweIds: '["CWE-77"]',
|
|
60
|
+
advisoryRefs: '["https://example.com/advisory"]',
|
|
61
|
+
});
|
|
62
|
+
repo.upsertAdvisory(advisory);
|
|
63
|
+
const results = repo.getAdvisoriesForSkill('community/commit-helper');
|
|
64
|
+
expect(results[0].affectedVersions).toBe('["<1.2.0"]');
|
|
65
|
+
expect(results[0].patchedVersions).toBe('[">=1.2.0"]');
|
|
66
|
+
expect(results[0].cweIds).toBe('["CWE-77"]');
|
|
67
|
+
expect(results[0].advisoryRefs).toBe('["https://example.com/advisory"]');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
// --------------------------------------------------------------------------
|
|
71
|
+
// getAdvisoriesForSkill
|
|
72
|
+
// --------------------------------------------------------------------------
|
|
73
|
+
describe('getAdvisoriesForSkill', () => {
|
|
74
|
+
it('returns only active (non-withdrawn) advisories for the given skill', () => {
|
|
75
|
+
repo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-001', skillId: 'community/commit-helper' }));
|
|
76
|
+
repo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-002', skillId: 'community/commit-helper' }));
|
|
77
|
+
repo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-003', skillId: 'community/other-skill' }));
|
|
78
|
+
// Withdraw SSA-2026-001
|
|
79
|
+
repo.withdrawAdvisory('SSA-2026-001');
|
|
80
|
+
const results = repo.getAdvisoriesForSkill('community/commit-helper');
|
|
81
|
+
expect(results).toHaveLength(1);
|
|
82
|
+
expect(results[0].id).toBe('SSA-2026-002');
|
|
83
|
+
});
|
|
84
|
+
it('returns empty array when skill has no advisories', () => {
|
|
85
|
+
const results = repo.getAdvisoriesForSkill('community/nonexistent');
|
|
86
|
+
expect(results).toHaveLength(0);
|
|
87
|
+
});
|
|
88
|
+
it('does not return advisories for other skills', () => {
|
|
89
|
+
repo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-004', skillId: 'community/other-skill' }));
|
|
90
|
+
const results = repo.getAdvisoriesForSkill('community/commit-helper');
|
|
91
|
+
expect(results).toHaveLength(0);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
// --------------------------------------------------------------------------
|
|
95
|
+
// getActiveAdvisories
|
|
96
|
+
// --------------------------------------------------------------------------
|
|
97
|
+
describe('getActiveAdvisories', () => {
|
|
98
|
+
beforeEach(() => {
|
|
99
|
+
repo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-010', severity: 'critical', skillId: 'community/skill-a' }));
|
|
100
|
+
repo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-011', severity: 'high', skillId: 'community/skill-b' }));
|
|
101
|
+
repo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-012', severity: 'medium', skillId: 'community/skill-c' }));
|
|
102
|
+
repo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-013', severity: 'low', skillId: 'community/skill-d' }));
|
|
103
|
+
repo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-014', severity: 'high', skillId: 'community/skill-e' }));
|
|
104
|
+
// Withdraw one of the high advisories
|
|
105
|
+
repo.withdrawAdvisory('SSA-2026-014');
|
|
106
|
+
});
|
|
107
|
+
it('returns all active advisories when no severity filter', () => {
|
|
108
|
+
const results = repo.getActiveAdvisories();
|
|
109
|
+
// 4 active (SSA-2026-010 through SSA-2026-013), SSA-2026-014 is withdrawn
|
|
110
|
+
expect(results).toHaveLength(4);
|
|
111
|
+
});
|
|
112
|
+
it('filters by severity when provided', () => {
|
|
113
|
+
const highs = repo.getActiveAdvisories('high');
|
|
114
|
+
expect(highs).toHaveLength(1);
|
|
115
|
+
expect(highs[0].id).toBe('SSA-2026-011');
|
|
116
|
+
});
|
|
117
|
+
it('returns active advisories for the given severity', () => {
|
|
118
|
+
const results = repo.getActiveAdvisories('critical');
|
|
119
|
+
// SSA-2026-010 is still active
|
|
120
|
+
expect(results).toHaveLength(1);
|
|
121
|
+
expect(results[0].id).toBe('SSA-2026-010');
|
|
122
|
+
});
|
|
123
|
+
it('does not return withdrawn advisories in unfiltered results', () => {
|
|
124
|
+
const results = repo.getActiveAdvisories();
|
|
125
|
+
const ids = results.map((r) => r.id);
|
|
126
|
+
expect(ids).not.toContain('SSA-2026-014');
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
// --------------------------------------------------------------------------
|
|
130
|
+
// withdrawAdvisory
|
|
131
|
+
// --------------------------------------------------------------------------
|
|
132
|
+
describe('withdrawAdvisory', () => {
|
|
133
|
+
it('sets withdrawn_at on the advisory', () => {
|
|
134
|
+
repo.upsertAdvisory(makeAdvisory({ id: 'SSA-2026-020' }));
|
|
135
|
+
// Advisory should be active before withdrawal
|
|
136
|
+
const before = repo.getAdvisoriesForSkill('community/commit-helper');
|
|
137
|
+
expect(before).toHaveLength(1);
|
|
138
|
+
repo.withdrawAdvisory('SSA-2026-020');
|
|
139
|
+
// Advisory should no longer appear in active queries
|
|
140
|
+
const after = repo.getAdvisoriesForSkill('community/commit-helper');
|
|
141
|
+
expect(after).toHaveLength(0);
|
|
142
|
+
});
|
|
143
|
+
it('is a no-op for non-existent advisory id', () => {
|
|
144
|
+
// Should not throw
|
|
145
|
+
expect(() => repo.withdrawAdvisory('SSA-9999-999')).not.toThrow();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=AdvisoryRepository.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdvisoryRepository.test.js","sourceRoot":"","sources":["../../../src/repositories/AdvisoryRepository.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAsB,MAAM,yBAAyB,CAAA;AAGhF,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,SAAS,YAAY,CAAC,YAAoC,EAAE;IAC1D,OAAO;QACL,EAAE,EAAE,cAAc;QAClB,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EAAE,mEAAmE;QAChF,WAAW,EAAE,sBAAsB;QACnC,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,EAAgB,CAAA;IACpB,IAAI,IAAwB,CAAA;IAE5B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,GAAG,kBAAkB,EAAE,CAAA;QACzB,IAAI,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,EAAE,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,6EAA6E;IAC7E,iBAAiB;IACjB,6EAA6E;IAE7E,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;YAC/B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;YAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAA;YACrE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACxC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;QACpE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAA;YAC9D,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAA;YAE7D,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAA;YACrE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,QAAQ,GAAG,YAAY,CAAC;gBAC5B,gBAAgB,EAAE,YAAY;gBAC9B,eAAe,EAAE,aAAa;gBAC9B,MAAM,EAAE,YAAY;gBACpB,YAAY,EAAE,kCAAkC;aACjD,CAAC,CAAA;YACF,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;YAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAA;YACrE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YACvD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YACvD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;QAC3E,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,6EAA6E;IAC7E,wBAAwB;IACxB,6EAA6E;IAE7E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAA;YAC7F,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAA;YAC7F,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAA;YAE3F,wBAAwB;YACxB,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAA;YAErC,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAA;YACrE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,CAAA;YACnE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAA;YAE3F,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAA;YACrE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,6EAA6E;IAC7E,sBAAsB;IACtB,6EAA6E;IAE7E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,cAAc,CACjB,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CACzF,CAAA;YACD,IAAI,CAAC,cAAc,CACjB,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CACrF,CAAA;YACD,IAAI,CAAC,cAAc,CACjB,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CACvF,CAAA;YACD,IAAI,CAAC,cAAc,CACjB,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CACpF,CAAA;YACD,IAAI,CAAC,cAAc,CACjB,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CACrF,CAAA;YACD,sCAAsC;YACtC,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;YAC1C,0EAA0E;YAC1E,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;YAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAA;YACpD,+BAA+B;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;YAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACpC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,6EAA6E;IAC7E,mBAAmB;IACnB,6EAA6E;IAE7E,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA;YAEzD,8CAA8C;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAA;YACpE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAE9B,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAA;YAErC,qDAAqD;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAA;YACnE,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,mBAAmB;YACnB,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACnE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CoInstallRepository — session-scoped co-install tracking
|
|
3
|
+
* @module @skillsmith/core/repositories/CoInstallRepository
|
|
4
|
+
* @see SMI-2761: Co-install recommendations
|
|
5
|
+
*
|
|
6
|
+
* Records pairs of skills installed together in the same session.
|
|
7
|
+
* Symmetric: installing (A, B) always creates both (A,B) and (B,A) rows.
|
|
8
|
+
* Surfacing threshold: install_count >= 5 before including in responses.
|
|
9
|
+
*/
|
|
10
|
+
import type { Database as DatabaseType } from '../db/database-interface.js';
|
|
11
|
+
/** A skill summary returned in co-install recommendations */
|
|
12
|
+
export interface CoInstallSummary {
|
|
13
|
+
/** Skill ID (e.g. "anthropic/commit") */
|
|
14
|
+
skillId: string;
|
|
15
|
+
/** Human-readable skill name */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Short description */
|
|
18
|
+
description?: string;
|
|
19
|
+
/** Author slug */
|
|
20
|
+
author?: string;
|
|
21
|
+
/** Number of times installed together with the queried skill */
|
|
22
|
+
installCount: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Repository for reading and writing skill co-install records.
|
|
26
|
+
*
|
|
27
|
+
* Gracefully handles databases where the skill_co_installs table has not been
|
|
28
|
+
* created yet (returns empty results instead of throwing). This allows
|
|
29
|
+
* test contexts that use createDatabase() directly (without running all
|
|
30
|
+
* migrations) to work without errors.
|
|
31
|
+
*/
|
|
32
|
+
export declare class CoInstallRepository {
|
|
33
|
+
private db;
|
|
34
|
+
constructor(db: DatabaseType);
|
|
35
|
+
/**
|
|
36
|
+
* Record a co-install between two skills (both orderings).
|
|
37
|
+
*
|
|
38
|
+
* Uses INSERT OR REPLACE with incremented count so repeated co-installs
|
|
39
|
+
* accumulate. Both (A→B) and (B→A) are written for symmetric queries.
|
|
40
|
+
*
|
|
41
|
+
* @param skillIdA - First skill ID
|
|
42
|
+
* @param skillIdB - Second skill ID
|
|
43
|
+
*/
|
|
44
|
+
recordCoInstall(skillIdA: string, skillIdB: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Record co-installs for all pairs in a set of skills installed together.
|
|
47
|
+
*
|
|
48
|
+
* For N skills, records N*(N-1) rows (each pair in both orderings).
|
|
49
|
+
* No-op when fewer than 2 skill IDs provided.
|
|
50
|
+
*
|
|
51
|
+
* @param skillIds - Array of skill IDs installed in the same session
|
|
52
|
+
*/
|
|
53
|
+
recordSessionCoInstalls(skillIds: string[]): void;
|
|
54
|
+
/**
|
|
55
|
+
* Get the top skills co-installed with a given skill.
|
|
56
|
+
*
|
|
57
|
+
* Joins against the skills table to include name/description/author.
|
|
58
|
+
* Only returns skills with install_count >= minCount (default 5).
|
|
59
|
+
* Returns an empty array when the table does not exist or has no results.
|
|
60
|
+
*
|
|
61
|
+
* @param skillId - The skill to look up co-installs for
|
|
62
|
+
* @param limit - Maximum results to return (default 5)
|
|
63
|
+
* @param minCount - Minimum co-install count to include (default 5)
|
|
64
|
+
* @returns Array of co-installed skill summaries, ordered by count desc
|
|
65
|
+
*/
|
|
66
|
+
getTopCoInstalls(skillId: string, limit?: number, minCount?: number): CoInstallSummary[];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=CoInstallRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoInstallRepository.d.ts","sourceRoot":"","sources":["../../../src/repositories/CoInstallRepository.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAM3E,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAA;CACrB;AAMD;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,EAAE,CAAc;gBAEZ,EAAE,EAAE,YAAY;IAI5B;;;;;;;;OAQG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAsBzD;;;;;;;OAOG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IASjD;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,QAAQ,SAAI,GAAG,gBAAgB,EAAE;CAyC/E"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CoInstallRepository — session-scoped co-install tracking
|
|
3
|
+
* @module @skillsmith/core/repositories/CoInstallRepository
|
|
4
|
+
* @see SMI-2761: Co-install recommendations
|
|
5
|
+
*
|
|
6
|
+
* Records pairs of skills installed together in the same session.
|
|
7
|
+
* Symmetric: installing (A, B) always creates both (A,B) and (B,A) rows.
|
|
8
|
+
* Surfacing threshold: install_count >= 5 before including in responses.
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Repository
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Repository for reading and writing skill co-install records.
|
|
15
|
+
*
|
|
16
|
+
* Gracefully handles databases where the skill_co_installs table has not been
|
|
17
|
+
* created yet (returns empty results instead of throwing). This allows
|
|
18
|
+
* test contexts that use createDatabase() directly (without running all
|
|
19
|
+
* migrations) to work without errors.
|
|
20
|
+
*/
|
|
21
|
+
export class CoInstallRepository {
|
|
22
|
+
db;
|
|
23
|
+
constructor(db) {
|
|
24
|
+
this.db = db;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Record a co-install between two skills (both orderings).
|
|
28
|
+
*
|
|
29
|
+
* Uses INSERT OR REPLACE with incremented count so repeated co-installs
|
|
30
|
+
* accumulate. Both (A→B) and (B→A) are written for symmetric queries.
|
|
31
|
+
*
|
|
32
|
+
* @param skillIdA - First skill ID
|
|
33
|
+
* @param skillIdB - Second skill ID
|
|
34
|
+
*/
|
|
35
|
+
recordCoInstall(skillIdA, skillIdB) {
|
|
36
|
+
if (skillIdA === skillIdB)
|
|
37
|
+
return;
|
|
38
|
+
try {
|
|
39
|
+
const upsert = this.db.prepare(`
|
|
40
|
+
INSERT INTO skill_co_installs (skill_id_a, skill_id_b, install_count, last_updated_at)
|
|
41
|
+
VALUES (?, ?, 1, datetime('now'))
|
|
42
|
+
ON CONFLICT(skill_id_a, skill_id_b)
|
|
43
|
+
DO UPDATE SET
|
|
44
|
+
install_count = install_count + 1,
|
|
45
|
+
last_updated_at = datetime('now')
|
|
46
|
+
`);
|
|
47
|
+
upsert.run(skillIdA, skillIdB);
|
|
48
|
+
upsert.run(skillIdB, skillIdA);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
52
|
+
// Gracefully handle missing table (pre-migration contexts)
|
|
53
|
+
if (msg.includes('no such table'))
|
|
54
|
+
return;
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Record co-installs for all pairs in a set of skills installed together.
|
|
60
|
+
*
|
|
61
|
+
* For N skills, records N*(N-1) rows (each pair in both orderings).
|
|
62
|
+
* No-op when fewer than 2 skill IDs provided.
|
|
63
|
+
*
|
|
64
|
+
* @param skillIds - Array of skill IDs installed in the same session
|
|
65
|
+
*/
|
|
66
|
+
recordSessionCoInstalls(skillIds) {
|
|
67
|
+
if (skillIds.length < 2)
|
|
68
|
+
return;
|
|
69
|
+
for (let i = 0; i < skillIds.length; i++) {
|
|
70
|
+
for (let j = i + 1; j < skillIds.length; j++) {
|
|
71
|
+
this.recordCoInstall(skillIds[i], skillIds[j]);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get the top skills co-installed with a given skill.
|
|
77
|
+
*
|
|
78
|
+
* Joins against the skills table to include name/description/author.
|
|
79
|
+
* Only returns skills with install_count >= minCount (default 5).
|
|
80
|
+
* Returns an empty array when the table does not exist or has no results.
|
|
81
|
+
*
|
|
82
|
+
* @param skillId - The skill to look up co-installs for
|
|
83
|
+
* @param limit - Maximum results to return (default 5)
|
|
84
|
+
* @param minCount - Minimum co-install count to include (default 5)
|
|
85
|
+
* @returns Array of co-installed skill summaries, ordered by count desc
|
|
86
|
+
*/
|
|
87
|
+
getTopCoInstalls(skillId, limit = 5, minCount = 5) {
|
|
88
|
+
try {
|
|
89
|
+
const rows = this.db
|
|
90
|
+
.prepare(`
|
|
91
|
+
SELECT
|
|
92
|
+
c.skill_id_b AS skillId,
|
|
93
|
+
s.name AS name,
|
|
94
|
+
s.description AS description,
|
|
95
|
+
s.author AS author,
|
|
96
|
+
c.install_count AS installCount
|
|
97
|
+
FROM skill_co_installs c
|
|
98
|
+
LEFT JOIN skills s ON s.id = c.skill_id_b
|
|
99
|
+
WHERE c.skill_id_a = ?
|
|
100
|
+
AND c.install_count >= ?
|
|
101
|
+
ORDER BY c.install_count DESC
|
|
102
|
+
LIMIT ?
|
|
103
|
+
`)
|
|
104
|
+
.all(skillId, minCount, limit);
|
|
105
|
+
return rows.map((row) => ({
|
|
106
|
+
skillId: row.skillId,
|
|
107
|
+
name: row.name ?? row.skillId,
|
|
108
|
+
description: row.description ?? undefined,
|
|
109
|
+
author: row.author ?? undefined,
|
|
110
|
+
installCount: row.installCount,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
115
|
+
// Gracefully handle missing table (pre-migration contexts)
|
|
116
|
+
if (msg.includes('no such table'))
|
|
117
|
+
return [];
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=CoInstallRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoInstallRepository.js","sourceRoot":"","sources":["../../../src/repositories/CoInstallRepository.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsBH,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,OAAO,mBAAmB;IACtB,EAAE,CAAc;IAExB,YAAY,EAAgB;QAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,eAAe,CAAC,QAAgB,EAAE,QAAgB;QAChD,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAM;QAEjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;OAO9B,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAC9B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAClE,2DAA2D;YAC3D,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAAE,OAAM;YACzC,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,uBAAuB,CAAC,QAAkB;QACxC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAM;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,OAAe,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;iBACjB,OAAO,CACN;;;;;;;;;;;;;OAaH,CACE;iBACA,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAM7B,CAAA;YAEF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO;gBAC7B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;gBACzC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;gBAC/B,YAAY,EAAE,GAAG,CAAC,YAAY;aAC/B,CAAC,CAAC,CAAA;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAClE,2DAA2D;YAC3D,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAAE,OAAO,EAAE,CAAA;YAC5C,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkillRepository.d.ts","sourceRoot":"","sources":["../../../src/repositories/SkillRepository.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAE3E,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"SkillRepository.d.ts","sourceRoot":"","sources":["../../../src/repositories/SkillRepository.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAE3E,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAuBpG;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAc;gBAEZ,EAAE,EAAE,YAAY;IAK5B,OAAO,CAAC,KAAK,CAYZ;IAED,OAAO,CAAC,iBAAiB;IAoDzB;;OAEG;IACH,OAAO,CAAC,UAAU;IA0BlB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,KAAK;IA0BtC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,EAAE;IA2ChD;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAKlC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAK5C;;;OAGG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC;IAC/E,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC;IA+BjE;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,KAAK,GAAG,IAAI;IA4BzD;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAK3B;;OAEG;IACH,SAAS,IAAI,MAAM;IAKnB;;OAEG;IACH,KAAK,IAAI,MAAM;IAKf;;OAEG;IACH,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAI9B;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAK3B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,KAAK;CASvC"}
|
|
@@ -22,8 +22,8 @@ export class SkillRepository {
|
|
|
22
22
|
// Cast to our custom types for better-sqlite3 compatibility
|
|
23
23
|
this.stmts = {
|
|
24
24
|
insert: this.db.prepare(`
|
|
25
|
-
INSERT INTO skills (id, name, description, author, repo_url, quality_score, trust_tier, tags, risk_score, security_findings_count, security_scanned_at, security_passed, created_at, updated_at)
|
|
26
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now'))
|
|
25
|
+
INSERT INTO skills (id, name, description, author, repo_url, quality_score, trust_tier, tags, risk_score, security_findings_count, security_scanned_at, security_passed, compatibility, created_at, updated_at)
|
|
26
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now'))
|
|
27
27
|
`),
|
|
28
28
|
selectById: this.db.prepare(`
|
|
29
29
|
SELECT * FROM skills WHERE id = ?
|
|
@@ -50,6 +50,7 @@ export class SkillRepository {
|
|
|
50
50
|
security_findings_count = COALESCE(?, security_findings_count),
|
|
51
51
|
security_scanned_at = COALESCE(?, security_scanned_at),
|
|
52
52
|
security_passed = COALESCE(?, security_passed),
|
|
53
|
+
compatibility = COALESCE(?, compatibility),
|
|
53
54
|
updated_at = datetime('now')
|
|
54
55
|
WHERE id = ?
|
|
55
56
|
`),
|
|
@@ -80,6 +81,10 @@ export class SkillRepository {
|
|
|
80
81
|
securityFindingsCount: row.security_findings_count ?? 0,
|
|
81
82
|
securityScannedAt: row.security_scanned_at,
|
|
82
83
|
securityPassed: row.security_passed === null ? null : row.security_passed === 1,
|
|
84
|
+
// SMI-2760: Compatibility tags
|
|
85
|
+
compatibility: row.compatibility && row.compatibility !== '[]'
|
|
86
|
+
? JSON.parse(row.compatibility)
|
|
87
|
+
: undefined,
|
|
83
88
|
createdAt: row.created_at,
|
|
84
89
|
updatedAt: row.updated_at,
|
|
85
90
|
};
|
|
@@ -92,7 +97,9 @@ export class SkillRepository {
|
|
|
92
97
|
const tags = JSON.stringify(input.tags || []);
|
|
93
98
|
this.stmts.insert.run(id, input.name, input.description ?? null, input.author ?? null, input.repoUrl ?? null, input.qualityScore ?? null, input.trustTier ?? 'unknown', tags,
|
|
94
99
|
// SMI-825: Security scan fields
|
|
95
|
-
input.riskScore ?? null, input.securityFindingsCount ?? 0, input.securityScannedAt ?? null, input.securityPassed === undefined ? null : input.securityPassed ? 1 : 0
|
|
100
|
+
input.riskScore ?? null, input.securityFindingsCount ?? 0, input.securityScannedAt ?? null, input.securityPassed === undefined ? null : input.securityPassed ? 1 : 0,
|
|
101
|
+
// SMI-2760: Compatibility tags
|
|
102
|
+
JSON.stringify(input.compatibility || []));
|
|
96
103
|
const row = this.stmts.selectById.get(id);
|
|
97
104
|
return this.rowToSkill(row);
|
|
98
105
|
}
|
|
@@ -108,7 +115,9 @@ export class SkillRepository {
|
|
|
108
115
|
try {
|
|
109
116
|
this.stmts.insert.run(id, input.name, input.description ?? null, input.author ?? null, input.repoUrl ?? null, input.qualityScore ?? null, input.trustTier ?? 'unknown', tags,
|
|
110
117
|
// SMI-825: Security scan fields
|
|
111
|
-
input.riskScore ?? null, input.securityFindingsCount ?? 0, input.securityScannedAt ?? null, input.securityPassed === undefined ? null : input.securityPassed ? 1 : 0
|
|
118
|
+
input.riskScore ?? null, input.securityFindingsCount ?? 0, input.securityScannedAt ?? null, input.securityPassed === undefined ? null : input.securityPassed ? 1 : 0,
|
|
119
|
+
// SMI-2760: Compatibility tags
|
|
120
|
+
JSON.stringify(input.compatibility || []));
|
|
112
121
|
const row = this.stmts.selectById.get(id);
|
|
113
122
|
created.push(this.rowToSkill(row));
|
|
114
123
|
}
|
|
@@ -168,7 +177,9 @@ export class SkillRepository {
|
|
|
168
177
|
const tags = input.tags ? JSON.stringify(input.tags) : null;
|
|
169
178
|
const result = this.stmts.update.run(input.name ?? null, input.description ?? null, input.author ?? null, input.repoUrl ?? null, input.qualityScore ?? null, input.trustTier ?? null, tags,
|
|
170
179
|
// SMI-825: Security scan fields
|
|
171
|
-
input.riskScore ?? null, input.securityFindingsCount ?? null, input.securityScannedAt ?? null, input.securityPassed === undefined ? null : input.securityPassed ? 1 : 0,
|
|
180
|
+
input.riskScore ?? null, input.securityFindingsCount ?? null, input.securityScannedAt ?? null, input.securityPassed === undefined ? null : input.securityPassed ? 1 : 0,
|
|
181
|
+
// SMI-2760: Compatibility tags
|
|
182
|
+
input.compatibility !== undefined ? JSON.stringify(input.compatibility) : null, id);
|
|
172
183
|
if (result.changes === 0) {
|
|
173
184
|
return null;
|
|
174
185
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkillRepository.js","sourceRoot":"","sources":["../../../src/repositories/SkillRepository.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"SkillRepository.js","sourceRoot":"","sources":["../../../src/repositories/SkillRepository.ts"],"names":[],"mappings":"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"}
|