@skillsmith/core 0.4.14 → 0.4.16

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 (287) hide show
  1. package/README.md +2 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/DependencyMerger.d.ts +39 -0
  4. package/dist/src/analysis/DependencyMerger.d.ts.map +1 -0
  5. package/dist/src/analysis/DependencyMerger.js +191 -0
  6. package/dist/src/analysis/DependencyMerger.js.map +1 -0
  7. package/dist/src/analysis/DependencyMerger.test.d.ts +2 -0
  8. package/dist/src/analysis/DependencyMerger.test.d.ts.map +1 -0
  9. package/dist/src/analysis/DependencyMerger.test.js +258 -0
  10. package/dist/src/analysis/DependencyMerger.test.js.map +1 -0
  11. package/dist/src/analysis/McpReferenceExtractor.d.ts +42 -0
  12. package/dist/src/analysis/McpReferenceExtractor.d.ts.map +1 -0
  13. package/dist/src/analysis/McpReferenceExtractor.js +92 -0
  14. package/dist/src/analysis/McpReferenceExtractor.js.map +1 -0
  15. package/dist/src/analysis/McpReferenceExtractor.test.d.ts +2 -0
  16. package/dist/src/analysis/McpReferenceExtractor.test.d.ts.map +1 -0
  17. package/dist/src/analysis/McpReferenceExtractor.test.js +262 -0
  18. package/dist/src/analysis/McpReferenceExtractor.test.js.map +1 -0
  19. package/dist/src/api/client.d.ts +1 -0
  20. package/dist/src/api/client.d.ts.map +1 -1
  21. package/dist/src/api/client.health.d.ts +26 -0
  22. package/dist/src/api/client.health.d.ts.map +1 -0
  23. package/dist/src/api/client.health.js +74 -0
  24. package/dist/src/api/client.health.js.map +1 -0
  25. package/dist/src/api/client.js +3 -51
  26. package/dist/src/api/client.js.map +1 -1
  27. package/dist/src/api/schemas.d.ts +4 -4
  28. package/dist/src/db/createDatabase.d.ts +9 -1
  29. package/dist/src/db/createDatabase.d.ts.map +1 -1
  30. package/dist/src/db/createDatabase.js +9 -1
  31. package/dist/src/db/createDatabase.js.map +1 -1
  32. package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
  33. package/dist/src/db/drivers/sqljsDriver.js +7 -8
  34. package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
  35. package/dist/src/db/migrations/v10-dependencies.d.ts +18 -0
  36. package/dist/src/db/migrations/v10-dependencies.d.ts.map +1 -0
  37. package/dist/src/db/migrations/v10-dependencies.js +50 -0
  38. package/dist/src/db/migrations/v10-dependencies.js.map +1 -0
  39. package/dist/src/db/migrations/v2-phase5-columns.d.ts +7 -0
  40. package/dist/src/db/migrations/v2-phase5-columns.d.ts.map +1 -0
  41. package/dist/src/db/migrations/v2-phase5-columns.js +16 -0
  42. package/dist/src/db/migrations/v2-phase5-columns.js.map +1 -0
  43. package/dist/src/db/migrations/v3-sync-tables.d.ts +6 -0
  44. package/dist/src/db/migrations/v3-sync-tables.d.ts.map +1 -0
  45. package/dist/src/db/migrations/v3-sync-tables.js +41 -0
  46. package/dist/src/db/migrations/v3-sync-tables.js.map +1 -0
  47. package/dist/src/db/migrations/v4-security-columns.d.ts +7 -0
  48. package/dist/src/db/migrations/v4-security-columns.d.ts.map +1 -0
  49. package/dist/src/db/migrations/v4-security-columns.js +17 -0
  50. package/dist/src/db/migrations/v4-security-columns.js.map +1 -0
  51. package/dist/src/db/migrations/v5b-change-type.d.ts +19 -0
  52. package/dist/src/db/migrations/v5b-change-type.d.ts.map +1 -0
  53. package/dist/src/db/migrations/v5b-change-type.js +22 -0
  54. package/dist/src/db/migrations/v5b-change-type.js.map +1 -0
  55. package/dist/src/db/migrations/v6-advisories.d.ts +32 -0
  56. package/dist/src/db/migrations/v6-advisories.d.ts.map +1 -0
  57. package/dist/src/db/migrations/v6-advisories.js +53 -0
  58. package/dist/src/db/migrations/v6-advisories.js.map +1 -0
  59. package/dist/src/db/migrations/v7-compatibility.d.ts +21 -0
  60. package/dist/src/db/migrations/v7-compatibility.d.ts.map +1 -0
  61. package/dist/src/db/migrations/v7-compatibility.js +23 -0
  62. package/dist/src/db/migrations/v7-compatibility.js.map +1 -0
  63. package/dist/src/db/migrations/v8-co-installs.d.ts +21 -0
  64. package/dist/src/db/migrations/v8-co-installs.d.ts.map +1 -0
  65. package/dist/src/db/migrations/v8-co-installs.js +33 -0
  66. package/dist/src/db/migrations/v8-co-installs.js.map +1 -0
  67. package/dist/src/db/schema.d.ts +5 -16
  68. package/dist/src/db/schema.d.ts.map +1 -1
  69. package/dist/src/db/schema.js +50 -79
  70. package/dist/src/db/schema.js.map +1 -1
  71. package/dist/src/exports/repositories.d.ts +6 -0
  72. package/dist/src/exports/repositories.d.ts.map +1 -1
  73. package/dist/src/exports/repositories.js +21 -0
  74. package/dist/src/exports/repositories.js.map +1 -1
  75. package/dist/src/exports/services.d.ts +2 -0
  76. package/dist/src/exports/services.d.ts.map +1 -1
  77. package/dist/src/exports/services.js +5 -0
  78. package/dist/src/exports/services.js.map +1 -1
  79. package/dist/src/exports/types.d.ts +2 -1
  80. package/dist/src/exports/types.d.ts.map +1 -1
  81. package/dist/src/exports/types.js.map +1 -1
  82. package/dist/src/indexer/GitHubIndexer.d.ts +3 -1
  83. package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
  84. package/dist/src/indexer/GitHubIndexer.js.map +1 -1
  85. package/dist/src/indexer/SkillParser.d.ts +22 -9
  86. package/dist/src/indexer/SkillParser.d.ts.map +1 -1
  87. package/dist/src/indexer/SkillParser.js +17 -10
  88. package/dist/src/indexer/SkillParser.js.map +1 -1
  89. package/dist/src/learning/PatternStore.d.ts +0 -2
  90. package/dist/src/learning/PatternStore.d.ts.map +1 -1
  91. package/dist/src/learning/PatternStore.helpers.d.ts +19 -1
  92. package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -1
  93. package/dist/src/learning/PatternStore.helpers.js +51 -0
  94. package/dist/src/learning/PatternStore.helpers.js.map +1 -1
  95. package/dist/src/learning/PatternStore.js +5 -37
  96. package/dist/src/learning/PatternStore.js.map +1 -1
  97. package/dist/src/repositories/AdvisoryRepository.d.ts +80 -0
  98. package/dist/src/repositories/AdvisoryRepository.d.ts.map +1 -0
  99. package/dist/src/repositories/AdvisoryRepository.js +128 -0
  100. package/dist/src/repositories/AdvisoryRepository.js.map +1 -0
  101. package/dist/src/repositories/AdvisoryRepository.test.d.ts +6 -0
  102. package/dist/src/repositories/AdvisoryRepository.test.d.ts.map +1 -0
  103. package/dist/src/repositories/AdvisoryRepository.test.js +149 -0
  104. package/dist/src/repositories/AdvisoryRepository.test.js.map +1 -0
  105. package/dist/src/repositories/CoInstallRepository.d.ts +68 -0
  106. package/dist/src/repositories/CoInstallRepository.d.ts.map +1 -0
  107. package/dist/src/repositories/CoInstallRepository.js +122 -0
  108. package/dist/src/repositories/CoInstallRepository.js.map +1 -0
  109. package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
  110. package/dist/src/repositories/IndexerRepository.js +5 -1
  111. package/dist/src/repositories/IndexerRepository.js.map +1 -1
  112. package/dist/src/repositories/SkillDependencyRepository.d.ts +73 -0
  113. package/dist/src/repositories/SkillDependencyRepository.d.ts.map +1 -0
  114. package/dist/src/repositories/SkillDependencyRepository.js +199 -0
  115. package/dist/src/repositories/SkillDependencyRepository.js.map +1 -0
  116. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  117. package/dist/src/repositories/SkillRepository.js +16 -5
  118. package/dist/src/repositories/SkillRepository.js.map +1 -1
  119. package/dist/src/scripts/validation/types.d.ts +2 -2
  120. package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
  121. package/dist/src/services/SearchService.helpers.js +4 -0
  122. package/dist/src/services/SearchService.helpers.js.map +1 -1
  123. package/dist/src/services/SearchService.types.d.ts +1 -0
  124. package/dist/src/services/SearchService.types.d.ts.map +1 -1
  125. package/dist/src/services/TaskRunner.d.ts +5 -81
  126. package/dist/src/services/TaskRunner.d.ts.map +1 -1
  127. package/dist/src/services/TaskRunner.js +7 -68
  128. package/dist/src/services/TaskRunner.js.map +1 -1
  129. package/dist/src/services/TaskRunner.process.d.ts +33 -0
  130. package/dist/src/services/TaskRunner.process.d.ts.map +1 -0
  131. package/dist/src/services/TaskRunner.process.js +70 -0
  132. package/dist/src/services/TaskRunner.process.js.map +1 -0
  133. package/dist/src/services/TaskRunner.types.d.ts +76 -0
  134. package/dist/src/services/TaskRunner.types.d.ts.map +1 -0
  135. package/dist/src/services/TaskRunner.types.js +22 -0
  136. package/dist/src/services/TaskRunner.types.js.map +1 -0
  137. package/dist/src/services/__tests__/TaskRunner.process.test.d.ts +13 -0
  138. package/dist/src/services/__tests__/TaskRunner.process.test.d.ts.map +1 -0
  139. package/dist/src/services/__tests__/TaskRunner.process.test.js +91 -0
  140. package/dist/src/services/__tests__/TaskRunner.process.test.js.map +1 -0
  141. package/dist/src/services/quarantine/QuarantineService.d.ts +3 -24
  142. package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -1
  143. package/dist/src/services/quarantine/QuarantineService.js +8 -205
  144. package/dist/src/services/quarantine/QuarantineService.js.map +1 -1
  145. package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts +57 -0
  146. package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts.map +1 -0
  147. package/dist/src/services/quarantine/QuarantineService.multiapproval.js +211 -0
  148. package/dist/src/services/quarantine/QuarantineService.multiapproval.js.map +1 -0
  149. package/dist/src/session/SessionManager.d.ts +2 -33
  150. package/dist/src/session/SessionManager.d.ts.map +1 -1
  151. package/dist/src/session/SessionManager.js +14 -238
  152. package/dist/src/session/SessionManager.js.map +1 -1
  153. package/dist/src/session/SessionManager.memory.d.ts +67 -0
  154. package/dist/src/session/SessionManager.memory.d.ts.map +1 -0
  155. package/dist/src/session/SessionManager.memory.js +262 -0
  156. package/dist/src/session/SessionManager.memory.js.map +1 -0
  157. package/dist/src/sources/SourceIndexer.d.ts +3 -1
  158. package/dist/src/sources/SourceIndexer.d.ts.map +1 -1
  159. package/dist/src/sources/SourceIndexer.js.map +1 -1
  160. package/dist/src/sync/SyncEngine.d.ts +13 -1
  161. package/dist/src/sync/SyncEngine.d.ts.map +1 -1
  162. package/dist/src/sync/SyncEngine.js +50 -1
  163. package/dist/src/sync/SyncEngine.js.map +1 -1
  164. package/dist/src/testing/MultiLLMProvider.d.ts +5 -6
  165. package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
  166. package/dist/src/testing/MultiLLMProvider.js +18 -130
  167. package/dist/src/testing/MultiLLMProvider.js.map +1 -1
  168. package/dist/src/testing/MultiLLMProvider.metrics.d.ts +33 -0
  169. package/dist/src/testing/MultiLLMProvider.metrics.d.ts.map +1 -0
  170. package/dist/src/testing/MultiLLMProvider.metrics.js +87 -0
  171. package/dist/src/testing/MultiLLMProvider.metrics.js.map +1 -0
  172. package/dist/src/testing/MultiLLMProvider.selection.d.ts +77 -0
  173. package/dist/src/testing/MultiLLMProvider.selection.d.ts.map +1 -0
  174. package/dist/src/testing/MultiLLMProvider.selection.js +151 -0
  175. package/dist/src/testing/MultiLLMProvider.selection.js.map +1 -0
  176. package/dist/src/types/dependencies.d.ts +85 -0
  177. package/dist/src/types/dependencies.d.ts.map +1 -0
  178. package/dist/src/types/dependencies.js +11 -0
  179. package/dist/src/types/dependencies.js.map +1 -0
  180. package/dist/src/types/skill.d.ts +13 -0
  181. package/dist/src/types/skill.d.ts.map +1 -1
  182. package/dist/src/types/skill.js.map +1 -1
  183. package/dist/src/types.d.ts +32 -0
  184. package/dist/src/types.d.ts.map +1 -1
  185. package/dist/src/versioning/change-classifier.d.ts +38 -0
  186. package/dist/src/versioning/change-classifier.d.ts.map +1 -0
  187. package/dist/src/versioning/change-classifier.js +187 -0
  188. package/dist/src/versioning/change-classifier.js.map +1 -0
  189. package/dist/src/versioning/change-classifier.test.d.ts +6 -0
  190. package/dist/src/versioning/change-classifier.test.d.ts.map +1 -0
  191. package/dist/src/versioning/change-classifier.test.js +275 -0
  192. package/dist/src/versioning/change-classifier.test.js.map +1 -0
  193. package/dist/src/versioning/update-risk.d.ts +50 -0
  194. package/dist/src/versioning/update-risk.d.ts.map +1 -0
  195. package/dist/src/versioning/update-risk.js +80 -0
  196. package/dist/src/versioning/update-risk.js.map +1 -0
  197. package/dist/src/versioning/update-risk.test.d.ts +6 -0
  198. package/dist/src/versioning/update-risk.test.d.ts.map +1 -0
  199. package/dist/src/versioning/update-risk.test.js +200 -0
  200. package/dist/src/versioning/update-risk.test.js.map +1 -0
  201. package/dist/tests/AuditLogger.edge-cases.test.d.ts +10 -0
  202. package/dist/tests/AuditLogger.edge-cases.test.d.ts.map +1 -0
  203. package/dist/tests/AuditLogger.edge-cases.test.js +183 -0
  204. package/dist/tests/AuditLogger.edge-cases.test.js.map +1 -0
  205. package/dist/tests/CacheManager.test.d.ts +9 -0
  206. package/dist/tests/CacheManager.test.d.ts.map +1 -0
  207. package/dist/tests/CacheManager.test.js +163 -0
  208. package/dist/tests/CacheManager.test.js.map +1 -0
  209. package/dist/tests/DailyIndexPipeline.test.js +3 -3
  210. package/dist/tests/DailyIndexPipeline.test.js.map +1 -1
  211. package/dist/tests/GitHubIndexer.edge-cases.test.d.ts +10 -0
  212. package/dist/tests/GitHubIndexer.edge-cases.test.d.ts.map +1 -0
  213. package/dist/tests/GitHubIndexer.edge-cases.test.js +255 -0
  214. package/dist/tests/GitHubIndexer.edge-cases.test.js.map +1 -0
  215. package/dist/tests/GitHubIndexer.test.js +4 -2
  216. package/dist/tests/GitHubIndexer.test.js.map +1 -1
  217. package/dist/tests/SearchService.test.js +71 -0
  218. package/dist/tests/SearchService.test.js.map +1 -1
  219. package/dist/tests/SkillVersionRepository.test.d.ts +0 -11
  220. package/dist/tests/SkillVersionRepository.test.d.ts.map +1 -1
  221. package/dist/tests/SkillVersionRepository.test.js +131 -194
  222. package/dist/tests/SkillVersionRepository.test.js.map +1 -1
  223. package/dist/tests/api/client.health.test.d.ts +15 -0
  224. package/dist/tests/api/client.health.test.d.ts.map +1 -0
  225. package/dist/tests/api/client.health.test.js +111 -0
  226. package/dist/tests/api/client.health.test.js.map +1 -0
  227. package/dist/tests/db/betterSqlite3Driver.test.d.ts +8 -0
  228. package/dist/tests/db/betterSqlite3Driver.test.d.ts.map +1 -0
  229. package/dist/tests/db/betterSqlite3Driver.test.js +88 -0
  230. package/dist/tests/db/betterSqlite3Driver.test.js.map +1 -0
  231. package/dist/tests/db/database-abstraction.test.js +12 -0
  232. package/dist/tests/db/database-abstraction.test.js.map +1 -1
  233. package/dist/tests/db/schema-migrations.test.d.ts +10 -0
  234. package/dist/tests/db/schema-migrations.test.d.ts.map +1 -0
  235. package/dist/tests/db/schema-migrations.test.js +134 -0
  236. package/dist/tests/db/schema-migrations.test.js.map +1 -0
  237. package/dist/tests/db/sqljsDriver.test.d.ts +9 -0
  238. package/dist/tests/db/sqljsDriver.test.d.ts.map +1 -0
  239. package/dist/tests/db/sqljsDriver.test.js +75 -0
  240. package/dist/tests/db/sqljsDriver.test.js.map +1 -0
  241. package/dist/tests/edge-cases/EdgeCases.test.js +4 -1
  242. package/dist/tests/edge-cases/EdgeCases.test.js.map +1 -1
  243. package/dist/tests/helpers/database.d.ts +32 -0
  244. package/dist/tests/helpers/database.d.ts.map +1 -0
  245. package/dist/tests/helpers/database.js +54 -0
  246. package/dist/tests/helpers/database.js.map +1 -0
  247. package/dist/tests/learning/PatternStore.helpers.test.d.ts +17 -0
  248. package/dist/tests/learning/PatternStore.helpers.test.d.ts.map +1 -0
  249. package/dist/tests/learning/PatternStore.helpers.test.js +301 -0
  250. package/dist/tests/learning/PatternStore.helpers.test.js.map +1 -0
  251. package/dist/tests/repositories/CoInstallRepository.test.d.ts +9 -0
  252. package/dist/tests/repositories/CoInstallRepository.test.d.ts.map +1 -0
  253. package/dist/tests/repositories/CoInstallRepository.test.js +126 -0
  254. package/dist/tests/repositories/CoInstallRepository.test.js.map +1 -0
  255. package/dist/tests/repositories/SkillDependencyRepository.test.d.ts +10 -0
  256. package/dist/tests/repositories/SkillDependencyRepository.test.d.ts.map +1 -0
  257. package/dist/tests/repositories/SkillDependencyRepository.test.js +336 -0
  258. package/dist/tests/repositories/SkillDependencyRepository.test.js.map +1 -0
  259. package/dist/tests/routing/LanguageRouter.test.d.ts +9 -0
  260. package/dist/tests/routing/LanguageRouter.test.d.ts.map +1 -0
  261. package/dist/tests/routing/LanguageRouter.test.js +150 -0
  262. package/dist/tests/routing/LanguageRouter.test.js.map +1 -0
  263. package/dist/tests/session/SessionManager.memory.test.d.ts +11 -0
  264. package/dist/tests/session/SessionManager.memory.test.d.ts.map +1 -0
  265. package/dist/tests/session/SessionManager.memory.test.js +219 -0
  266. package/dist/tests/session/SessionManager.memory.test.js.map +1 -0
  267. package/dist/tests/sources.test.js +1 -1
  268. package/dist/tests/sources.test.js.map +1 -1
  269. package/dist/tests/sync/SyncEngine.test.js +32 -18
  270. package/dist/tests/sync/SyncEngine.test.js.map +1 -1
  271. package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts +13 -0
  272. package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts.map +1 -0
  273. package/dist/tests/testing/MultiLLMProvider.metrics.test.js +149 -0
  274. package/dist/tests/testing/MultiLLMProvider.metrics.test.js.map +1 -0
  275. package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts +15 -0
  276. package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts.map +1 -0
  277. package/dist/tests/testing/MultiLLMProvider.selection.test.js +249 -0
  278. package/dist/tests/testing/MultiLLMProvider.selection.test.js.map +1 -0
  279. package/dist/tests/unit/migrations/v10-dependencies.test.d.ts +6 -0
  280. package/dist/tests/unit/migrations/v10-dependencies.test.d.ts.map +1 -0
  281. package/dist/tests/unit/migrations/v10-dependencies.test.js +166 -0
  282. package/dist/tests/unit/migrations/v10-dependencies.test.js.map +1 -0
  283. package/dist/tests/unit/quarantine-query-builder.test.d.ts +10 -0
  284. package/dist/tests/unit/quarantine-query-builder.test.d.ts.map +1 -0
  285. package/dist/tests/unit/quarantine-query-builder.test.js +157 -0
  286. package/dist/tests/unit/quarantine-query-builder.test.js.map +1 -0
  287. package/package.json +1 -1
@@ -0,0 +1,275 @@
1
+ /**
2
+ * @fileoverview Tests for change-classifier.ts
3
+ * @see SMI-skill-version-tracking Wave 2
4
+ */
5
+ import { describe, it, expect } from 'vitest';
6
+ import { classifyChange } from './change-classifier.js';
7
+ // ============================================================================
8
+ // Fixtures
9
+ // ============================================================================
10
+ const BASE_SKILL = `---
11
+ name: test-skill
12
+ version: 1.0.0
13
+ ---
14
+
15
+ ## Overview
16
+
17
+ This is a test skill.
18
+
19
+ ## Usage
20
+
21
+ Run with /test.
22
+
23
+ ## Configuration
24
+
25
+ Set env vars.
26
+ `;
27
+ const WITH_HEADING_REMOVED = `---
28
+ name: test-skill
29
+ version: 1.0.0
30
+ ---
31
+
32
+ ## Overview
33
+
34
+ This is a test skill.
35
+
36
+ ## Usage
37
+
38
+ Run with /test.
39
+ `;
40
+ const WITH_HEADING_ADDED = `---
41
+ name: test-skill
42
+ version: 1.0.0
43
+ ---
44
+
45
+ ## Overview
46
+
47
+ This is a test skill.
48
+
49
+ ## Usage
50
+
51
+ Run with /test.
52
+
53
+ ## Configuration
54
+
55
+ Set env vars.
56
+
57
+ ## Examples
58
+
59
+ Here are examples.
60
+ `;
61
+ const WITH_BODY_EDIT_ONLY = `---
62
+ name: test-skill
63
+ version: 1.0.0
64
+ ---
65
+
66
+ ## Overview
67
+
68
+ This is an UPDATED test skill.
69
+
70
+ ## Usage
71
+
72
+ Run with /test command.
73
+
74
+ ## Configuration
75
+
76
+ Set your env vars here.
77
+ `;
78
+ const WITH_SEMVER_MAJOR = `---
79
+ name: test-skill
80
+ version: 2.0.0
81
+ ---
82
+
83
+ ## Overview
84
+
85
+ This is a test skill.
86
+
87
+ ## Usage
88
+
89
+ Run with /test.
90
+
91
+ ## Configuration
92
+
93
+ Set env vars.
94
+ `;
95
+ const WITH_SEMVER_MINOR = `---
96
+ name: test-skill
97
+ version: 1.1.0
98
+ ---
99
+
100
+ ## Overview
101
+
102
+ This is a test skill.
103
+
104
+ ## Usage
105
+
106
+ Run with /test.
107
+
108
+ ## Configuration
109
+
110
+ Set env vars.
111
+ `;
112
+ const WITH_SEMVER_PATCH = `---
113
+ name: test-skill
114
+ version: 1.0.1
115
+ ---
116
+
117
+ ## Overview
118
+
119
+ This is a test skill.
120
+
121
+ ## Usage
122
+
123
+ Run with /test.
124
+
125
+ ## Configuration
126
+
127
+ Set env vars.
128
+ `;
129
+ const WITH_DEPENDENCY_REMOVED = `---
130
+ name: test-skill
131
+ version: 1.0.0
132
+ ---
133
+
134
+ ## Overview
135
+
136
+ A test skill with dependencies.
137
+
138
+ ## Dependencies
139
+
140
+ - dep-b
141
+
142
+ ## Usage
143
+
144
+ Run with /test.
145
+ `;
146
+ const WITH_DEPENDENCY_ADDED = `---
147
+ name: test-skill
148
+ version: 1.0.0
149
+ ---
150
+
151
+ ## Overview
152
+
153
+ A test skill with dependencies.
154
+
155
+ ## Dependencies
156
+
157
+ - dep-a
158
+ - dep-b
159
+ - dep-c
160
+
161
+ ## Usage
162
+
163
+ Run with /test.
164
+ `;
165
+ const BASE_WITH_DEPS = `---
166
+ name: test-skill
167
+ version: 1.0.0
168
+ ---
169
+
170
+ ## Overview
171
+
172
+ A test skill with dependencies.
173
+
174
+ ## Dependencies
175
+
176
+ - dep-a
177
+ - dep-b
178
+
179
+ ## Usage
180
+
181
+ Run with /test.
182
+ `;
183
+ // ============================================================================
184
+ // Tests
185
+ // ============================================================================
186
+ describe('classifyChange', () => {
187
+ describe('heading removal → major', () => {
188
+ it('returns major when a heading is removed', () => {
189
+ expect(classifyChange(BASE_SKILL, WITH_HEADING_REMOVED)).toBe('major');
190
+ });
191
+ it('returns major when multiple headings are removed', () => {
192
+ const twoHeadingsGone = `---
193
+ name: test-skill
194
+ version: 1.0.0
195
+ ---
196
+
197
+ ## Overview
198
+
199
+ Only this remains.
200
+ `;
201
+ expect(classifyChange(BASE_SKILL, twoHeadingsGone)).toBe('major');
202
+ });
203
+ });
204
+ describe('heading addition only → minor', () => {
205
+ it('returns minor when a heading is added with no removals', () => {
206
+ expect(classifyChange(BASE_SKILL, WITH_HEADING_ADDED)).toBe('minor');
207
+ });
208
+ });
209
+ describe('body edits only → patch', () => {
210
+ it('returns patch when only body text changes', () => {
211
+ expect(classifyChange(BASE_SKILL, WITH_BODY_EDIT_ONLY)).toBe('patch');
212
+ });
213
+ it('returns patch when content is identical', () => {
214
+ expect(classifyChange(BASE_SKILL, BASE_SKILL)).toBe('patch');
215
+ });
216
+ });
217
+ describe('semver in frontmatter overrides heuristic', () => {
218
+ it('returns major when semver major bumps', () => {
219
+ // semver overrides even if headings look like minor
220
+ expect(classifyChange(BASE_SKILL, WITH_SEMVER_MAJOR)).toBe('major');
221
+ });
222
+ it('returns minor when semver minor bumps', () => {
223
+ expect(classifyChange(BASE_SKILL, WITH_SEMVER_MINOR)).toBe('minor');
224
+ });
225
+ it('returns patch when semver patch bumps', () => {
226
+ expect(classifyChange(BASE_SKILL, WITH_SEMVER_PATCH)).toBe('patch');
227
+ });
228
+ it('semver override applies even when headings were removed (semver wins)', () => {
229
+ // new content: semver 2.0.0 + heading removed — semver says major, heuristic also says major
230
+ const newContent = `---
231
+ name: test-skill
232
+ version: 2.0.0
233
+ ---
234
+
235
+ ## Overview
236
+
237
+ Only overview.
238
+ `;
239
+ expect(classifyChange(BASE_SKILL, newContent)).toBe('major');
240
+ });
241
+ });
242
+ describe('risk score delta > 20 → major', () => {
243
+ it('upgrades to major when risk delta exceeds 20', () => {
244
+ // No heading changes but risk jumped significantly
245
+ expect(classifyChange(BASE_SKILL, WITH_BODY_EDIT_ONLY, 10, 35)).toBe('major');
246
+ });
247
+ it('does not upgrade when risk delta is exactly 20', () => {
248
+ expect(classifyChange(BASE_SKILL, WITH_BODY_EDIT_ONLY, 10, 30)).toBe('patch');
249
+ });
250
+ it('does not upgrade when risk decreases', () => {
251
+ expect(classifyChange(BASE_SKILL, WITH_BODY_EDIT_ONLY, 50, 20)).toBe('patch');
252
+ });
253
+ });
254
+ describe('dependency changes', () => {
255
+ it('returns major when a dependency is removed', () => {
256
+ // No semver change, no heading change, but dep removed
257
+ const base = BASE_WITH_DEPS;
258
+ expect(classifyChange(base, WITH_DEPENDENCY_REMOVED)).toBe('major');
259
+ });
260
+ it('returns minor when a dependency is added', () => {
261
+ const base = BASE_WITH_DEPS;
262
+ expect(classifyChange(base, WITH_DEPENDENCY_ADDED)).toBe('minor');
263
+ });
264
+ });
265
+ describe('error / unknown content', () => {
266
+ it('returns patch for empty content (no headings or semver)', () => {
267
+ expect(classifyChange('', '')).toBe('patch');
268
+ });
269
+ it('returns unknown when classifier throws (simulated by invalid regex-triggering content)', () => {
270
+ // Pass valid strings — classifier should not throw, returns patch
271
+ expect(classifyChange('hello', 'world')).toBe('patch');
272
+ });
273
+ });
274
+ });
275
+ //# sourceMappingURL=change-classifier.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-classifier.test.js","sourceRoot":"","sources":["../../../src/versioning/change-classifier.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @fileoverview Update risk scorer for skill version upgrades
3
+ * @module @skillsmith/core/versioning/update-risk
4
+ * @see SMI-skill-version-tracking Wave 2
5
+ *
6
+ * Produces a RiskLevel and Recommendation for a proposed skill update
7
+ * based on change severity, risk score delta, local modification status,
8
+ * trust tier, and changelog availability.
9
+ *
10
+ * Scoring table (additive):
11
+ * change_type === 'major' → +30
12
+ * riskScoreDelta > 0 → +20
13
+ * hasLocalModifications → +20
14
+ * trustTier === 'verified' → -20
15
+ * hasChangelog → -10
16
+ *
17
+ * Buckets:
18
+ * low 0–20 → auto-update
19
+ * medium 21–40 → review-then-update
20
+ * high 41–60 → manual-review-required
21
+ * critical 61+ → manual-review-required
22
+ */
23
+ export type RiskLevel = 'low' | 'medium' | 'high' | 'critical';
24
+ export type Recommendation = 'auto-update' | 'review-then-update' | 'manual-review-required';
25
+ export interface UpdateRisk {
26
+ /** Human-readable risk bucket */
27
+ level: RiskLevel;
28
+ /** Raw additive risk score (may be negative — clamped to 0 for level mapping) */
29
+ score: number;
30
+ /** Suggested action for the caller */
31
+ recommendation: Recommendation;
32
+ }
33
+ /**
34
+ * Compute the update risk for a pending skill upgrade.
35
+ *
36
+ * @param params.changeType Semantic change type from classifyChange()
37
+ * @param params.riskScoreDelta newRiskScore - oldRiskScore (optional)
38
+ * @param params.hasLocalModifications Whether the user has edited the skill
39
+ * @param params.trustTier Registry trust tier for the skill
40
+ * @param params.hasChangelog Whether the skill includes a changelog entry
41
+ * @returns UpdateRisk with level, score, and recommendation
42
+ */
43
+ export declare function computeUpdateRisk(params: {
44
+ changeType: 'major' | 'minor' | 'patch' | 'unknown';
45
+ riskScoreDelta?: number;
46
+ hasLocalModifications: boolean;
47
+ trustTier: 'verified' | 'community' | 'experimental';
48
+ hasChangelog: boolean;
49
+ }): UpdateRisk;
50
+ //# sourceMappingURL=update-risk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-risk.d.ts","sourceRoot":"","sources":["../../../src/versioning/update-risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;AAC9D,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,oBAAoB,GAAG,wBAAwB,CAAA;AAE5F,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,KAAK,EAAE,SAAS,CAAA;IAChB,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAA;IACb,sCAAsC;IACtC,cAAc,EAAE,cAAc,CAAA;CAC/B;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;IACnD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,OAAO,CAAA;IAC9B,SAAS,EAAE,UAAU,GAAG,WAAW,GAAG,cAAc,CAAA;IACpD,YAAY,EAAE,OAAO,CAAA;CACtB,GAAG,UAAU,CAeb"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @fileoverview Update risk scorer for skill version upgrades
3
+ * @module @skillsmith/core/versioning/update-risk
4
+ * @see SMI-skill-version-tracking Wave 2
5
+ *
6
+ * Produces a RiskLevel and Recommendation for a proposed skill update
7
+ * based on change severity, risk score delta, local modification status,
8
+ * trust tier, and changelog availability.
9
+ *
10
+ * Scoring table (additive):
11
+ * change_type === 'major' → +30
12
+ * riskScoreDelta > 0 → +20
13
+ * hasLocalModifications → +20
14
+ * trustTier === 'verified' → -20
15
+ * hasChangelog → -10
16
+ *
17
+ * Buckets:
18
+ * low 0–20 → auto-update
19
+ * medium 21–40 → review-then-update
20
+ * high 41–60 → manual-review-required
21
+ * critical 61+ → manual-review-required
22
+ */
23
+ // ============================================================================
24
+ // Scoring constants
25
+ // ============================================================================
26
+ const SCORE_MAJOR_CHANGE = 30;
27
+ const SCORE_RISK_DELTA_INCREASE = 20;
28
+ const SCORE_LOCAL_MODIFICATIONS = 20;
29
+ const SCORE_VERIFIED_TRUST = -20;
30
+ const SCORE_HAS_CHANGELOG = -10;
31
+ // ============================================================================
32
+ // Public API
33
+ // ============================================================================
34
+ /**
35
+ * Compute the update risk for a pending skill upgrade.
36
+ *
37
+ * @param params.changeType Semantic change type from classifyChange()
38
+ * @param params.riskScoreDelta newRiskScore - oldRiskScore (optional)
39
+ * @param params.hasLocalModifications Whether the user has edited the skill
40
+ * @param params.trustTier Registry trust tier for the skill
41
+ * @param params.hasChangelog Whether the skill includes a changelog entry
42
+ * @returns UpdateRisk with level, score, and recommendation
43
+ */
44
+ export function computeUpdateRisk(params) {
45
+ const { changeType, riskScoreDelta, hasLocalModifications, trustTier, hasChangelog } = params;
46
+ let score = 0;
47
+ if (changeType === 'major')
48
+ score += SCORE_MAJOR_CHANGE;
49
+ if (typeof riskScoreDelta === 'number' && riskScoreDelta > 0)
50
+ score += SCORE_RISK_DELTA_INCREASE;
51
+ if (hasLocalModifications)
52
+ score += SCORE_LOCAL_MODIFICATIONS;
53
+ if (trustTier === 'verified')
54
+ score += SCORE_VERIFIED_TRUST;
55
+ if (hasChangelog)
56
+ score += SCORE_HAS_CHANGELOG;
57
+ const level = scoreToLevel(score);
58
+ const recommendation = scoreToRecommendation(score);
59
+ return { level, score, recommendation };
60
+ }
61
+ // ============================================================================
62
+ // Helpers
63
+ // ============================================================================
64
+ function scoreToLevel(score) {
65
+ if (score <= 20)
66
+ return 'low';
67
+ if (score <= 40)
68
+ return 'medium';
69
+ if (score <= 60)
70
+ return 'high';
71
+ return 'critical';
72
+ }
73
+ function scoreToRecommendation(score) {
74
+ if (score <= 20)
75
+ return 'auto-update';
76
+ if (score <= 50)
77
+ return 'review-then-update';
78
+ return 'manual-review-required';
79
+ }
80
+ //# sourceMappingURL=update-risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-risk.js","sourceRoot":"","sources":["../../../src/versioning/update-risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAkBH,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,kBAAkB,GAAG,EAAE,CAAA;AAC7B,MAAM,yBAAyB,GAAG,EAAE,CAAA;AACpC,MAAM,yBAAyB,GAAG,EAAE,CAAA;AACpC,MAAM,oBAAoB,GAAG,CAAC,EAAE,CAAA;AAChC,MAAM,mBAAmB,GAAG,CAAC,EAAE,CAAA;AAE/B,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAMjC;IACC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAE7F,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,IAAI,UAAU,KAAK,OAAO;QAAE,KAAK,IAAI,kBAAkB,CAAA;IACvD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,GAAG,CAAC;QAAE,KAAK,IAAI,yBAAyB,CAAA;IAChG,IAAI,qBAAqB;QAAE,KAAK,IAAI,yBAAyB,CAAA;IAC7D,IAAI,SAAS,KAAK,UAAU;QAAE,KAAK,IAAI,oBAAoB,CAAA;IAC3D,IAAI,YAAY;QAAE,KAAK,IAAI,mBAAmB,CAAA;IAE9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;IAEnD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAA;AACzC,CAAC;AAED,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,KAAK,CAAA;IAC7B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAA;IAChC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAA;IAC9B,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,aAAa,CAAA;IACrC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,oBAAoB,CAAA;IAC5C,OAAO,wBAAwB,CAAA;AACjC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Tests for update-risk.ts
3
+ * @see SMI-skill-version-tracking Wave 2
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=update-risk.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-risk.test.d.ts","sourceRoot":"","sources":["../../../src/versioning/update-risk.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * @fileoverview Tests for update-risk.ts
3
+ * @see SMI-skill-version-tracking Wave 2
4
+ */
5
+ import { describe, it, expect } from 'vitest';
6
+ import { computeUpdateRisk } from './update-risk.js';
7
+ describe('computeUpdateRisk', () => {
8
+ describe('score → level mapping', () => {
9
+ it('returns low for score <= 20', () => {
10
+ // community, patch, no local mods, no changelog → 0
11
+ const result = computeUpdateRisk({
12
+ changeType: 'patch',
13
+ hasLocalModifications: false,
14
+ trustTier: 'community',
15
+ hasChangelog: false,
16
+ });
17
+ expect(result.level).toBe('low');
18
+ expect(result.score).toBe(0);
19
+ });
20
+ it('returns medium for score 21–40', () => {
21
+ // major (+30) + verified (-20) + changelog (-10) = 0 → low
22
+ // Let's try: major (+30) + community (0) + changelog (-10) = 20 → low
23
+ // major (+30) + community (0) + no changelog = 30 → medium
24
+ const result = computeUpdateRisk({
25
+ changeType: 'major',
26
+ hasLocalModifications: false,
27
+ trustTier: 'community',
28
+ hasChangelog: false,
29
+ });
30
+ expect(result.level).toBe('medium');
31
+ expect(result.score).toBe(30);
32
+ });
33
+ it('returns high for score 41–60', () => {
34
+ // major (30) + local mods (20) + changelog (-10) = 40 → medium
35
+ // major (30) + local mods (20) = 50 → high
36
+ const result = computeUpdateRisk({
37
+ changeType: 'major',
38
+ hasLocalModifications: true,
39
+ trustTier: 'community',
40
+ hasChangelog: false,
41
+ });
42
+ expect(result.level).toBe('high');
43
+ expect(result.score).toBe(50);
44
+ });
45
+ it('returns critical for score >= 61', () => {
46
+ // major (30) + risk delta (20) + local mods (20) = 70 → critical
47
+ const result = computeUpdateRisk({
48
+ changeType: 'major',
49
+ riskScoreDelta: 10, // positive → +20
50
+ hasLocalModifications: true,
51
+ trustTier: 'community',
52
+ hasChangelog: false,
53
+ });
54
+ expect(result.level).toBe('critical');
55
+ expect(result.score).toBe(70);
56
+ });
57
+ });
58
+ describe('score → recommendation mapping', () => {
59
+ it('returns auto-update for score <= 20', () => {
60
+ const result = computeUpdateRisk({
61
+ changeType: 'patch',
62
+ hasLocalModifications: false,
63
+ trustTier: 'community',
64
+ hasChangelog: false,
65
+ });
66
+ expect(result.recommendation).toBe('auto-update');
67
+ });
68
+ it('returns review-then-update for score 21–50', () => {
69
+ // major (30), community, no local, no changelog = 30
70
+ const result = computeUpdateRisk({
71
+ changeType: 'major',
72
+ hasLocalModifications: false,
73
+ trustTier: 'community',
74
+ hasChangelog: false,
75
+ });
76
+ expect(result.recommendation).toBe('review-then-update');
77
+ });
78
+ it('returns manual-review-required for score >= 51', () => {
79
+ // major (30) + local mods (20) = 50 → review-then-update
80
+ // major (30) + local mods (20) + risk delta (20) = 70 → manual
81
+ const result = computeUpdateRisk({
82
+ changeType: 'major',
83
+ riskScoreDelta: 5, // positive → +20
84
+ hasLocalModifications: true,
85
+ trustTier: 'community',
86
+ hasChangelog: false,
87
+ });
88
+ expect(result.recommendation).toBe('manual-review-required');
89
+ });
90
+ });
91
+ describe('individual score factors', () => {
92
+ it('verified tier reduces score by 20', () => {
93
+ const withCommunity = computeUpdateRisk({
94
+ changeType: 'patch',
95
+ hasLocalModifications: false,
96
+ trustTier: 'community',
97
+ hasChangelog: false,
98
+ });
99
+ const withVerified = computeUpdateRisk({
100
+ changeType: 'patch',
101
+ hasLocalModifications: false,
102
+ trustTier: 'verified',
103
+ hasChangelog: false,
104
+ });
105
+ expect(withVerified.score).toBe(withCommunity.score - 20);
106
+ });
107
+ it('changelog reduces score by 10', () => {
108
+ const withoutChangelog = computeUpdateRisk({
109
+ changeType: 'patch',
110
+ hasLocalModifications: false,
111
+ trustTier: 'community',
112
+ hasChangelog: false,
113
+ });
114
+ const withChangelog = computeUpdateRisk({
115
+ changeType: 'patch',
116
+ hasLocalModifications: false,
117
+ trustTier: 'community',
118
+ hasChangelog: true,
119
+ });
120
+ expect(withChangelog.score).toBe(withoutChangelog.score - 10);
121
+ });
122
+ it('hasLocalModifications adds 20', () => {
123
+ const without = computeUpdateRisk({
124
+ changeType: 'patch',
125
+ hasLocalModifications: false,
126
+ trustTier: 'community',
127
+ hasChangelog: false,
128
+ });
129
+ const with_ = computeUpdateRisk({
130
+ changeType: 'patch',
131
+ hasLocalModifications: true,
132
+ trustTier: 'community',
133
+ hasChangelog: false,
134
+ });
135
+ expect(with_.score).toBe(without.score + 20);
136
+ });
137
+ it('riskScoreDelta > 0 adds 20', () => {
138
+ const without = computeUpdateRisk({
139
+ changeType: 'patch',
140
+ riskScoreDelta: 0,
141
+ hasLocalModifications: false,
142
+ trustTier: 'community',
143
+ hasChangelog: false,
144
+ });
145
+ const with_ = computeUpdateRisk({
146
+ changeType: 'patch',
147
+ riskScoreDelta: 1, // positive
148
+ hasLocalModifications: false,
149
+ trustTier: 'community',
150
+ hasChangelog: false,
151
+ });
152
+ expect(with_.score).toBe(without.score + 20);
153
+ });
154
+ it('negative riskScoreDelta does not add penalty', () => {
155
+ const result = computeUpdateRisk({
156
+ changeType: 'patch',
157
+ riskScoreDelta: -10,
158
+ hasLocalModifications: false,
159
+ trustTier: 'community',
160
+ hasChangelog: false,
161
+ });
162
+ // risk delta ≤ 0 should not add the +20 penalty
163
+ expect(result.score).toBe(0);
164
+ });
165
+ it('undefined riskScoreDelta does not add penalty', () => {
166
+ const result = computeUpdateRisk({
167
+ changeType: 'patch',
168
+ hasLocalModifications: false,
169
+ trustTier: 'community',
170
+ hasChangelog: false,
171
+ });
172
+ expect(result.score).toBe(0);
173
+ });
174
+ });
175
+ describe('combined scenarios', () => {
176
+ it('fully safe update: patch + verified + changelog = -30 → low (clamped to 0 effectively)', () => {
177
+ const result = computeUpdateRisk({
178
+ changeType: 'patch',
179
+ hasLocalModifications: false,
180
+ trustTier: 'verified',
181
+ hasChangelog: true,
182
+ });
183
+ // 0 - 20 - 10 = -30 → level: low (score <= 20)
184
+ expect(result.level).toBe('low');
185
+ expect(result.recommendation).toBe('auto-update');
186
+ });
187
+ it('worst case scenario produces critical + manual-review-required', () => {
188
+ const result = computeUpdateRisk({
189
+ changeType: 'major',
190
+ riskScoreDelta: 50,
191
+ hasLocalModifications: true,
192
+ trustTier: 'experimental',
193
+ hasChangelog: false,
194
+ });
195
+ expect(result.level).toBe('critical');
196
+ expect(result.recommendation).toBe('manual-review-required');
197
+ });
198
+ });
199
+ });
200
+ //# sourceMappingURL=update-risk.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-risk.test.js","sourceRoot":"","sources":["../../../src/versioning/update-risk.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SMI-2756: Wave 3 — AuditLogger edge-case tests
3
+ *
4
+ * Companion file to AuditLogger.test.ts (which exceeds the 500-line limit).
5
+ * Covers: DB write error propagation, log retention via cleanupOldLogs,
6
+ * meta-log written after successful cleanup, query date-range filters,
7
+ * query action-type filter, and export producing valid JSON.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=AuditLogger.edge-cases.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditLogger.edge-cases.test.d.ts","sourceRoot":"","sources":["../../tests/AuditLogger.edge-cases.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}