@skillsmith/mcp-server 0.4.13 → 0.5.0

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 (391) hide show
  1. package/CHANGELOG.md +32 -4
  2. package/README.md +89 -13
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/__tests__/compare.test.js +5 -5
  5. package/dist/src/__tests__/compare.test.js.map +1 -1
  6. package/dist/src/__tests__/context-listeners.test.d.ts +12 -0
  7. package/dist/src/__tests__/context-listeners.test.d.ts.map +1 -0
  8. package/dist/src/__tests__/context-listeners.test.js +87 -0
  9. package/dist/src/__tests__/context-listeners.test.js.map +1 -0
  10. package/dist/src/__tests__/context.test.js +84 -82
  11. package/dist/src/__tests__/context.test.js.map +1 -1
  12. package/dist/src/__tests__/get-skill.api-path.test.js +21 -14
  13. package/dist/src/__tests__/get-skill.api-path.test.js.map +1 -1
  14. package/dist/src/__tests__/get-skill.test.js +5 -5
  15. package/dist/src/__tests__/get-skill.test.js.map +1 -1
  16. package/dist/src/__tests__/index-local.test.js +5 -5
  17. package/dist/src/__tests__/index-local.test.js.map +1 -1
  18. package/dist/src/__tests__/recommend-online-path.test.js +5 -5
  19. package/dist/src/__tests__/recommend-online-path.test.js.map +1 -1
  20. package/dist/src/__tests__/recommend.test.js +9 -9
  21. package/dist/src/__tests__/recommend.test.js.map +1 -1
  22. package/dist/src/__tests__/search-compatible-with.test.d.ts +10 -0
  23. package/dist/src/__tests__/search-compatible-with.test.d.ts.map +1 -0
  24. package/dist/src/__tests__/search-compatible-with.test.js +96 -0
  25. package/dist/src/__tests__/search-compatible-with.test.js.map +1 -0
  26. package/dist/src/__tests__/search-online-path.test.js +5 -5
  27. package/dist/src/__tests__/search-online-path.test.js.map +1 -1
  28. package/dist/src/__tests__/search.test.js +16 -101
  29. package/dist/src/__tests__/search.test.js.map +1 -1
  30. package/dist/src/__tests__/test-utils.d.ts +18 -3
  31. package/dist/src/__tests__/test-utils.d.ts.map +1 -1
  32. package/dist/src/__tests__/test-utils.js +24 -7
  33. package/dist/src/__tests__/test-utils.js.map +1 -1
  34. package/dist/src/audit/audit-history.d.ts +77 -0
  35. package/dist/src/audit/audit-history.d.ts.map +1 -0
  36. package/dist/src/audit/audit-history.js +98 -0
  37. package/dist/src/audit/audit-history.js.map +1 -0
  38. package/dist/src/audit/audit-report-writer.d.ts +82 -0
  39. package/dist/src/audit/audit-report-writer.d.ts.map +1 -0
  40. package/dist/src/audit/audit-report-writer.js +241 -0
  41. package/dist/src/audit/audit-report-writer.js.map +1 -0
  42. package/dist/src/audit/audit-suggestions.d.ts +52 -0
  43. package/dist/src/audit/audit-suggestions.d.ts.map +1 -0
  44. package/dist/src/audit/audit-suggestions.js +90 -0
  45. package/dist/src/audit/audit-suggestions.js.map +1 -0
  46. package/dist/src/audit/bootstrap-unmanaged.d.ts +66 -0
  47. package/dist/src/audit/bootstrap-unmanaged.d.ts.map +1 -0
  48. package/dist/src/audit/bootstrap-unmanaged.js +91 -0
  49. package/dist/src/audit/bootstrap-unmanaged.js.map +1 -0
  50. package/dist/src/audit/collision-detector.d.ts +72 -0
  51. package/dist/src/audit/collision-detector.d.ts.map +1 -0
  52. package/dist/src/audit/collision-detector.helpers.d.ts +63 -0
  53. package/dist/src/audit/collision-detector.helpers.d.ts.map +1 -0
  54. package/dist/src/audit/collision-detector.helpers.js +141 -0
  55. package/dist/src/audit/collision-detector.helpers.js.map +1 -0
  56. package/dist/src/audit/collision-detector.js +172 -0
  57. package/dist/src/audit/collision-detector.js.map +1 -0
  58. package/dist/src/audit/collision-detector.semantic.helpers.d.ts +49 -0
  59. package/dist/src/audit/collision-detector.semantic.helpers.d.ts.map +1 -0
  60. package/dist/src/audit/collision-detector.semantic.helpers.js +121 -0
  61. package/dist/src/audit/collision-detector.semantic.helpers.js.map +1 -0
  62. package/dist/src/audit/collision-detector.types.d.ts +70 -0
  63. package/dist/src/audit/collision-detector.types.d.ts.map +1 -0
  64. package/dist/src/audit/collision-detector.types.js +9 -0
  65. package/dist/src/audit/collision-detector.types.js.map +1 -0
  66. package/dist/src/audit/edit-applier.d.ts +64 -0
  67. package/dist/src/audit/edit-applier.d.ts.map +1 -0
  68. package/dist/src/audit/edit-applier.js +233 -0
  69. package/dist/src/audit/edit-applier.js.map +1 -0
  70. package/dist/src/audit/edit-applier.types.d.ts +72 -0
  71. package/dist/src/audit/edit-applier.types.d.ts.map +1 -0
  72. package/dist/src/audit/edit-applier.types.js +13 -0
  73. package/dist/src/audit/edit-applier.types.js.map +1 -0
  74. package/dist/src/audit/edit-suggester.d.ts +63 -0
  75. package/dist/src/audit/edit-suggester.d.ts.map +1 -0
  76. package/dist/src/audit/edit-suggester.js +326 -0
  77. package/dist/src/audit/edit-suggester.js.map +1 -0
  78. package/dist/src/audit/edit-suggester.types.d.ts +148 -0
  79. package/dist/src/audit/edit-suggester.types.d.ts.map +1 -0
  80. package/dist/src/audit/edit-suggester.types.js +17 -0
  81. package/dist/src/audit/edit-suggester.types.js.map +1 -0
  82. package/dist/src/audit/framework-adapter.d.ts +54 -0
  83. package/dist/src/audit/framework-adapter.d.ts.map +1 -0
  84. package/dist/src/audit/framework-adapter.js +251 -0
  85. package/dist/src/audit/framework-adapter.js.map +1 -0
  86. package/dist/src/audit/framework-adapter.types.d.ts +162 -0
  87. package/dist/src/audit/framework-adapter.types.d.ts.map +1 -0
  88. package/dist/src/audit/framework-adapter.types.js +31 -0
  89. package/dist/src/audit/framework-adapter.types.js.map +1 -0
  90. package/dist/src/audit/index.d.ts +46 -0
  91. package/dist/src/audit/index.d.ts.map +1 -0
  92. package/dist/src/audit/index.js +44 -0
  93. package/dist/src/audit/index.js.map +1 -0
  94. package/dist/src/audit/install-preflight.d.ts +99 -0
  95. package/dist/src/audit/install-preflight.d.ts.map +1 -0
  96. package/dist/src/audit/install-preflight.js +320 -0
  97. package/dist/src/audit/install-preflight.js.map +1 -0
  98. package/dist/src/audit/namespace-audit.types.d.ts +100 -0
  99. package/dist/src/audit/namespace-audit.types.d.ts.map +1 -0
  100. package/dist/src/audit/namespace-audit.types.js +20 -0
  101. package/dist/src/audit/namespace-audit.types.js.map +1 -0
  102. package/dist/src/audit/namespace-overrides.d.ts +79 -0
  103. package/dist/src/audit/namespace-overrides.d.ts.map +1 -0
  104. package/dist/src/audit/namespace-overrides.js +228 -0
  105. package/dist/src/audit/namespace-overrides.js.map +1 -0
  106. package/dist/src/audit/namespace-overrides.types.d.ts +115 -0
  107. package/dist/src/audit/namespace-overrides.types.d.ts.map +1 -0
  108. package/dist/src/audit/namespace-overrides.types.js +26 -0
  109. package/dist/src/audit/namespace-overrides.types.js.map +1 -0
  110. package/dist/src/audit/rename-engine.apply-paths.d.ts +54 -0
  111. package/dist/src/audit/rename-engine.apply-paths.d.ts.map +1 -0
  112. package/dist/src/audit/rename-engine.apply-paths.js +126 -0
  113. package/dist/src/audit/rename-engine.apply-paths.js.map +1 -0
  114. package/dist/src/audit/rename-engine.d.ts +59 -0
  115. package/dist/src/audit/rename-engine.d.ts.map +1 -0
  116. package/dist/src/audit/rename-engine.helpers.d.ts +63 -0
  117. package/dist/src/audit/rename-engine.helpers.d.ts.map +1 -0
  118. package/dist/src/audit/rename-engine.helpers.js +224 -0
  119. package/dist/src/audit/rename-engine.helpers.js.map +1 -0
  120. package/dist/src/audit/rename-engine.js +393 -0
  121. package/dist/src/audit/rename-engine.js.map +1 -0
  122. package/dist/src/audit/rename-engine.types.d.ts +157 -0
  123. package/dist/src/audit/rename-engine.types.d.ts.map +1 -0
  124. package/dist/src/audit/rename-engine.types.js +15 -0
  125. package/dist/src/audit/rename-engine.types.js.map +1 -0
  126. package/dist/src/audit/run-inventory-audit.d.ts +95 -0
  127. package/dist/src/audit/run-inventory-audit.d.ts.map +1 -0
  128. package/dist/src/audit/run-inventory-audit.js +245 -0
  129. package/dist/src/audit/run-inventory-audit.js.map +1 -0
  130. package/dist/src/audit/suggestion-chain.d.ts +89 -0
  131. package/dist/src/audit/suggestion-chain.d.ts.map +1 -0
  132. package/dist/src/audit/suggestion-chain.js +121 -0
  133. package/dist/src/audit/suggestion-chain.js.map +1 -0
  134. package/dist/src/audit-tool-dispatch.d.ts +61 -0
  135. package/dist/src/audit-tool-dispatch.d.ts.map +1 -0
  136. package/dist/src/audit-tool-dispatch.js +114 -0
  137. package/dist/src/audit-tool-dispatch.js.map +1 -0
  138. package/dist/src/index.js +1 -1
  139. package/dist/src/index.js.map +1 -1
  140. package/dist/src/indexer/LocalIndexer.d.ts +8 -1
  141. package/dist/src/indexer/LocalIndexer.d.ts.map +1 -1
  142. package/dist/src/indexer/LocalIndexer.js +42 -38
  143. package/dist/src/indexer/LocalIndexer.js.map +1 -1
  144. package/dist/src/middleware/__tests__/license.gate.test.js +21 -2
  145. package/dist/src/middleware/__tests__/license.gate.test.js.map +1 -1
  146. package/dist/src/middleware/license.gate.d.ts +14 -0
  147. package/dist/src/middleware/license.gate.d.ts.map +1 -1
  148. package/dist/src/middleware/license.gate.js +52 -1
  149. package/dist/src/middleware/license.gate.js.map +1 -1
  150. package/dist/src/onboarding/install-assets.d.ts.map +1 -1
  151. package/dist/src/onboarding/install-assets.js +11 -5
  152. package/dist/src/onboarding/install-assets.js.map +1 -1
  153. package/dist/src/tool-dispatch.d.ts.map +1 -1
  154. package/dist/src/tool-dispatch.js +6 -4
  155. package/dist/src/tool-dispatch.js.map +1 -1
  156. package/dist/src/tools/analytics.service.test.js +6 -4
  157. package/dist/src/tools/analytics.service.test.js.map +1 -1
  158. package/dist/src/tools/apply-namespace-rename.d.ts +71 -0
  159. package/dist/src/tools/apply-namespace-rename.d.ts.map +1 -0
  160. package/dist/src/tools/apply-namespace-rename.js +137 -0
  161. package/dist/src/tools/apply-namespace-rename.js.map +1 -0
  162. package/dist/src/tools/apply-namespace-rename.types.d.ts +46 -0
  163. package/dist/src/tools/apply-namespace-rename.types.d.ts.map +1 -0
  164. package/dist/src/tools/apply-namespace-rename.types.js +9 -0
  165. package/dist/src/tools/apply-namespace-rename.types.js.map +1 -0
  166. package/dist/src/tools/apply-recommended-edit.d.ts +50 -0
  167. package/dist/src/tools/apply-recommended-edit.d.ts.map +1 -0
  168. package/dist/src/tools/apply-recommended-edit.js +112 -0
  169. package/dist/src/tools/apply-recommended-edit.js.map +1 -0
  170. package/dist/src/tools/apply-recommended-edit.types.d.ts +49 -0
  171. package/dist/src/tools/apply-recommended-edit.types.d.ts.map +1 -0
  172. package/dist/src/tools/apply-recommended-edit.types.js +14 -0
  173. package/dist/src/tools/apply-recommended-edit.types.js.map +1 -0
  174. package/dist/src/tools/audit-tools.d.ts +4 -4
  175. package/dist/src/tools/compliance-tools.service.test.js +6 -4
  176. package/dist/src/tools/compliance-tools.service.test.js.map +1 -1
  177. package/dist/src/tools/install.backup-gc.d.ts +61 -0
  178. package/dist/src/tools/install.backup-gc.d.ts.map +1 -0
  179. package/dist/src/tools/install.backup-gc.js +166 -0
  180. package/dist/src/tools/install.backup-gc.js.map +1 -0
  181. package/dist/src/tools/install.conflict-helpers.d.ts +29 -2
  182. package/dist/src/tools/install.conflict-helpers.d.ts.map +1 -1
  183. package/dist/src/tools/install.conflict-helpers.js +37 -4
  184. package/dist/src/tools/install.conflict-helpers.js.map +1 -1
  185. package/dist/src/tools/install.d.ts +15 -1
  186. package/dist/src/tools/install.d.ts.map +1 -1
  187. package/dist/src/tools/install.js +162 -7
  188. package/dist/src/tools/install.js.map +1 -1
  189. package/dist/src/tools/install.ledger-replay.d.ts +52 -0
  190. package/dist/src/tools/install.ledger-replay.d.ts.map +1 -0
  191. package/dist/src/tools/install.ledger-replay.js +88 -0
  192. package/dist/src/tools/install.ledger-replay.js.map +1 -0
  193. package/dist/src/tools/install.namespace-gate.d.ts +68 -0
  194. package/dist/src/tools/install.namespace-gate.d.ts.map +1 -0
  195. package/dist/src/tools/install.namespace-gate.js +129 -0
  196. package/dist/src/tools/install.namespace-gate.js.map +1 -0
  197. package/dist/src/tools/install.test.js +71 -1
  198. package/dist/src/tools/install.test.js.map +1 -1
  199. package/dist/src/tools/install.tool.d.ts +17 -0
  200. package/dist/src/tools/install.tool.d.ts.map +1 -1
  201. package/dist/src/tools/install.tool.js +19 -1
  202. package/dist/src/tools/install.tool.js.map +1 -1
  203. package/dist/src/tools/install.types.d.ts +35 -1
  204. package/dist/src/tools/install.types.d.ts.map +1 -1
  205. package/dist/src/tools/install.types.js +24 -2
  206. package/dist/src/tools/install.types.js.map +1 -1
  207. package/dist/src/tools/namespace-audit/telemetry.d.ts +80 -0
  208. package/dist/src/tools/namespace-audit/telemetry.d.ts.map +1 -0
  209. package/dist/src/tools/namespace-audit/telemetry.js +129 -0
  210. package/dist/src/tools/namespace-audit/telemetry.js.map +1 -0
  211. package/dist/src/tools/outdated.test.js +2 -2
  212. package/dist/src/tools/outdated.test.js.map +1 -1
  213. package/dist/src/tools/publish-private.test.js +2 -2
  214. package/dist/src/tools/publish-private.test.js.map +1 -1
  215. package/dist/src/tools/recommend.types.d.ts +2 -2
  216. package/dist/src/tools/search.d.ts +2 -2
  217. package/dist/src/tools/search.js +3 -3
  218. package/dist/src/tools/search.js.map +1 -1
  219. package/dist/src/tools/skill-audit.test.js +2 -2
  220. package/dist/src/tools/skill-audit.test.js.map +1 -1
  221. package/dist/src/tools/skill-diff.d.ts +1 -1
  222. package/dist/src/tools/skill-inventory-audit.d.ts +67 -0
  223. package/dist/src/tools/skill-inventory-audit.d.ts.map +1 -0
  224. package/dist/src/tools/skill-inventory-audit.js +112 -0
  225. package/dist/src/tools/skill-inventory-audit.js.map +1 -0
  226. package/dist/src/tools/skill-inventory-audit.types.d.ts +67 -0
  227. package/dist/src/tools/skill-inventory-audit.types.d.ts.map +1 -0
  228. package/dist/src/tools/skill-inventory-audit.types.js +14 -0
  229. package/dist/src/tools/skill-inventory-audit.types.js.map +1 -0
  230. package/dist/src/tools/skill-pack-audit.d.ts.map +1 -1
  231. package/dist/src/tools/skill-pack-audit.helpers.d.ts.map +1 -1
  232. package/dist/src/tools/skill-pack-audit.helpers.js +15 -2
  233. package/dist/src/tools/skill-pack-audit.helpers.js.map +1 -1
  234. package/dist/src/tools/skill-pack-audit.js +15 -1
  235. package/dist/src/tools/skill-pack-audit.js.map +1 -1
  236. package/dist/src/tools/skill-rescan.d.ts.map +1 -1
  237. package/dist/src/tools/skill-rescan.js +4 -2
  238. package/dist/src/tools/skill-rescan.js.map +1 -1
  239. package/dist/src/tools/suggest.d.ts +2 -2
  240. package/dist/src/tools/uninstall.d.ts +1 -1
  241. package/dist/src/tools/uninstall.d.ts.map +1 -1
  242. package/dist/src/tools/uninstall.js +17 -3
  243. package/dist/src/tools/uninstall.js.map +1 -1
  244. package/dist/src/tools/validate.types.d.ts +10 -1
  245. package/dist/src/tools/validate.types.d.ts.map +1 -1
  246. package/dist/src/tools/validate.types.js +10 -1
  247. package/dist/src/tools/validate.types.js.map +1 -1
  248. package/dist/src/utils/installed-skills.d.ts.map +1 -1
  249. package/dist/src/utils/installed-skills.js +8 -6
  250. package/dist/src/utils/installed-skills.js.map +1 -1
  251. package/dist/src/utils/local-inventory.d.ts +29 -0
  252. package/dist/src/utils/local-inventory.d.ts.map +1 -0
  253. package/dist/src/utils/local-inventory.helpers.d.ts +96 -0
  254. package/dist/src/utils/local-inventory.helpers.d.ts.map +1 -0
  255. package/dist/src/utils/local-inventory.helpers.js +279 -0
  256. package/dist/src/utils/local-inventory.helpers.js.map +1 -0
  257. package/dist/src/utils/local-inventory.js +202 -0
  258. package/dist/src/utils/local-inventory.js.map +1 -0
  259. package/dist/src/utils/local-inventory.types.d.ts +100 -0
  260. package/dist/src/utils/local-inventory.types.d.ts.map +1 -0
  261. package/dist/src/utils/local-inventory.types.js +9 -0
  262. package/dist/src/utils/local-inventory.types.js.map +1 -0
  263. package/dist/src/webhooks/stripe-webhook-endpoint.d.ts +12 -0
  264. package/dist/src/webhooks/stripe-webhook-endpoint.d.ts.map +1 -1
  265. package/dist/src/webhooks/stripe-webhook-endpoint.js +30 -9
  266. package/dist/src/webhooks/stripe-webhook-endpoint.js.map +1 -1
  267. package/dist/src/webhooks/webhook-endpoint.d.ts +13 -0
  268. package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -1
  269. package/dist/src/webhooks/webhook-endpoint.js +31 -9
  270. package/dist/src/webhooks/webhook-endpoint.js.map +1 -1
  271. package/dist/tests/compare.test.js +5 -5
  272. package/dist/tests/compare.test.js.map +1 -1
  273. package/dist/tests/context-async-listeners.test.d.ts +12 -0
  274. package/dist/tests/context-async-listeners.test.d.ts.map +1 -0
  275. package/dist/tests/context-async-listeners.test.js +62 -0
  276. package/dist/tests/context-async-listeners.test.js.map +1 -0
  277. package/dist/tests/e2e/compare.e2e.test.js +9 -3
  278. package/dist/tests/e2e/compare.e2e.test.js.map +1 -1
  279. package/dist/tests/e2e/install-flow.e2e.test.js +9 -3
  280. package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -1
  281. package/dist/tests/e2e/recommend.e2e.test.js +9 -3
  282. package/dist/tests/e2e/recommend.e2e.test.js.map +1 -1
  283. package/dist/tests/e2e/skill-flow.e2e.test.js +17 -5
  284. package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -1
  285. package/dist/tests/e2e/suggest.e2e.test.js +11 -3
  286. package/dist/tests/e2e/suggest.e2e.test.js.map +1 -1
  287. package/dist/tests/integration/audit-roundtrip.test.d.ts +29 -0
  288. package/dist/tests/integration/audit-roundtrip.test.d.ts.map +1 -0
  289. package/dist/tests/integration/audit-roundtrip.test.js +214 -0
  290. package/dist/tests/integration/audit-roundtrip.test.js.map +1 -0
  291. package/dist/tests/integration/install-namespace.integration.test.d.ts +14 -0
  292. package/dist/tests/integration/install-namespace.integration.test.d.ts.map +1 -0
  293. package/dist/tests/integration/install-namespace.integration.test.js +414 -0
  294. package/dist/tests/integration/install-namespace.integration.test.js.map +1 -0
  295. package/dist/tests/performance/search-performance.test.js +9 -3
  296. package/dist/tests/performance/search-performance.test.js.map +1 -1
  297. package/dist/tests/tools.test.js +5 -5
  298. package/dist/tests/tools.test.js.map +1 -1
  299. package/dist/tests/unit/apply-namespace-rename.test.d.ts +24 -0
  300. package/dist/tests/unit/apply-namespace-rename.test.d.ts.map +1 -0
  301. package/dist/tests/unit/apply-namespace-rename.test.js +205 -0
  302. package/dist/tests/unit/apply-namespace-rename.test.js.map +1 -0
  303. package/dist/tests/unit/apply-recommended-edit.test.d.ts +28 -0
  304. package/dist/tests/unit/apply-recommended-edit.test.d.ts.map +1 -0
  305. package/dist/tests/unit/apply-recommended-edit.test.js +229 -0
  306. package/dist/tests/unit/apply-recommended-edit.test.js.map +1 -0
  307. package/dist/tests/unit/audit-history.test.d.ts +11 -0
  308. package/dist/tests/unit/audit-history.test.d.ts.map +1 -0
  309. package/dist/tests/unit/audit-history.test.js +183 -0
  310. package/dist/tests/unit/audit-history.test.js.map +1 -0
  311. package/dist/tests/unit/audit-report-writer.test.d.ts +7 -0
  312. package/dist/tests/unit/audit-report-writer.test.d.ts.map +1 -0
  313. package/dist/tests/unit/audit-report-writer.test.js +249 -0
  314. package/dist/tests/unit/audit-report-writer.test.js.map +1 -0
  315. package/dist/tests/unit/audit-tool-dispatch.test.d.ts +17 -0
  316. package/dist/tests/unit/audit-tool-dispatch.test.d.ts.map +1 -0
  317. package/dist/tests/unit/audit-tool-dispatch.test.js +133 -0
  318. package/dist/tests/unit/audit-tool-dispatch.test.js.map +1 -0
  319. package/dist/tests/unit/collision-detector.semantic.test.d.ts +12 -0
  320. package/dist/tests/unit/collision-detector.semantic.test.d.ts.map +1 -0
  321. package/dist/tests/unit/collision-detector.semantic.test.js +281 -0
  322. package/dist/tests/unit/collision-detector.semantic.test.js.map +1 -0
  323. package/dist/tests/unit/collision-detector.test.d.ts +8 -0
  324. package/dist/tests/unit/collision-detector.test.d.ts.map +1 -0
  325. package/dist/tests/unit/collision-detector.test.js +266 -0
  326. package/dist/tests/unit/collision-detector.test.js.map +1 -0
  327. package/dist/tests/unit/edit-applier.test.d.ts +17 -0
  328. package/dist/tests/unit/edit-applier.test.d.ts.map +1 -0
  329. package/dist/tests/unit/edit-applier.test.js +165 -0
  330. package/dist/tests/unit/edit-applier.test.js.map +1 -0
  331. package/dist/tests/unit/edit-suggester.fixtures.d.ts +38 -0
  332. package/dist/tests/unit/edit-suggester.fixtures.d.ts.map +1 -0
  333. package/dist/tests/unit/edit-suggester.fixtures.js +84 -0
  334. package/dist/tests/unit/edit-suggester.fixtures.js.map +1 -0
  335. package/dist/tests/unit/edit-suggester.test.d.ts +17 -0
  336. package/dist/tests/unit/edit-suggester.test.d.ts.map +1 -0
  337. package/dist/tests/unit/edit-suggester.test.js +356 -0
  338. package/dist/tests/unit/edit-suggester.test.js.map +1 -0
  339. package/dist/tests/unit/framework-adapter.test.d.ts +30 -0
  340. package/dist/tests/unit/framework-adapter.test.d.ts.map +1 -0
  341. package/dist/tests/unit/framework-adapter.test.js +221 -0
  342. package/dist/tests/unit/framework-adapter.test.js.map +1 -0
  343. package/dist/tests/unit/install-preflight.test.d.ts +17 -0
  344. package/dist/tests/unit/install-preflight.test.d.ts.map +1 -0
  345. package/dist/tests/unit/install-preflight.test.js +270 -0
  346. package/dist/tests/unit/install-preflight.test.js.map +1 -0
  347. package/dist/tests/unit/install.backup-gc.test.d.ts +18 -0
  348. package/dist/tests/unit/install.backup-gc.test.d.ts.map +1 -0
  349. package/dist/tests/unit/install.backup-gc.test.js +177 -0
  350. package/dist/tests/unit/install.backup-gc.test.js.map +1 -0
  351. package/dist/tests/unit/install.ledger-replay.test.d.ts +12 -0
  352. package/dist/tests/unit/install.ledger-replay.test.d.ts.map +1 -0
  353. package/dist/tests/unit/install.ledger-replay.test.js +98 -0
  354. package/dist/tests/unit/install.ledger-replay.test.js.map +1 -0
  355. package/dist/tests/unit/local-inventory.test.d.ts +8 -0
  356. package/dist/tests/unit/local-inventory.test.d.ts.map +1 -0
  357. package/dist/tests/unit/local-inventory.test.js +165 -0
  358. package/dist/tests/unit/local-inventory.test.js.map +1 -0
  359. package/dist/tests/unit/namespace-audit-telemetry.test.d.ts +10 -0
  360. package/dist/tests/unit/namespace-audit-telemetry.test.d.ts.map +1 -0
  361. package/dist/tests/unit/namespace-audit-telemetry.test.js +215 -0
  362. package/dist/tests/unit/namespace-audit-telemetry.test.js.map +1 -0
  363. package/dist/tests/unit/namespace-overrides.test.d.ts +18 -0
  364. package/dist/tests/unit/namespace-overrides.test.d.ts.map +1 -0
  365. package/dist/tests/unit/namespace-overrides.test.js +210 -0
  366. package/dist/tests/unit/namespace-overrides.test.js.map +1 -0
  367. package/dist/tests/unit/rename-engine.test.d.ts +26 -0
  368. package/dist/tests/unit/rename-engine.test.d.ts.map +1 -0
  369. package/dist/tests/unit/rename-engine.test.js +367 -0
  370. package/dist/tests/unit/rename-engine.test.js.map +1 -0
  371. package/dist/tests/unit/skill-inventory-audit.test.d.ts +20 -0
  372. package/dist/tests/unit/skill-inventory-audit.test.d.ts.map +1 -0
  373. package/dist/tests/unit/skill-inventory-audit.test.js +299 -0
  374. package/dist/tests/unit/skill-inventory-audit.test.js.map +1 -0
  375. package/dist/tests/unit/skill-pack-audit.helpers.test.d.ts +11 -0
  376. package/dist/tests/unit/skill-pack-audit.helpers.test.d.ts.map +1 -0
  377. package/dist/tests/unit/skill-pack-audit.helpers.test.js +61 -0
  378. package/dist/tests/unit/skill-pack-audit.helpers.test.js.map +1 -0
  379. package/dist/tests/unit/skill-pack-audit.test.js +1 -1
  380. package/dist/tests/unit/skill-pack-audit.test.js.map +1 -1
  381. package/dist/tests/unit/suggestion-chain.test.d.ts +17 -0
  382. package/dist/tests/unit/suggestion-chain.test.d.ts.map +1 -0
  383. package/dist/tests/unit/suggestion-chain.test.js +191 -0
  384. package/dist/tests/unit/suggestion-chain.test.js.map +1 -0
  385. package/dist/tests/webhooks/standalone-shutdown.test.d.ts +12 -0
  386. package/dist/tests/webhooks/standalone-shutdown.test.d.ts.map +1 -0
  387. package/dist/tests/webhooks/standalone-shutdown.test.js +91 -0
  388. package/dist/tests/webhooks/standalone-shutdown.test.js.map +1 -0
  389. package/package.json +17 -4
  390. package/server.json +3 -3
  391. package/src/assets/skills/skillsmith/SKILL.md +2 -2
@@ -0,0 +1,205 @@
1
+ /**
2
+ * @fileoverview Unit tests for SMI-4590 Wave 4 PR 4 — `apply_namespace_rename`
3
+ * MCP tool.
4
+ * @module @skillsmith/mcp-server/tests/unit/apply-namespace-rename
5
+ *
6
+ * Plan: docs/internal/implementation/smi-4590-cli-mcp-framework-adapter.md §2
7
+ * + §Tests `apply-namespace-rename.test.ts`.
8
+ *
9
+ * Coverage (mirrors the spec checklist):
10
+ * 1. `action: 'apply'` round-trips via the suggested name.
11
+ * 2. `action: 'custom'` uses `customName`.
12
+ * 3. `action: 'custom'` without `customName` → Zod validation error.
13
+ * 4. `action: 'skip'` → no-op success.
14
+ * 5. Missing `auditId` → `namespace.audit.history_not_found`.
15
+ * 6. Missing `collisionId` → `namespace.audit.collision_not_found`.
16
+ * 7. Idempotent re-apply → `fromPath === toPath`.
17
+ *
18
+ * Pattern: drive a real `skill_inventory_audit` first to populate a fresh
19
+ * `~/.skillsmith/audits/<auditId>/` (history + suggestions) under a temp
20
+ * HOME, then exercise the apply tool. Avoids re-deriving the audit-write
21
+ * path under test.
22
+ */
23
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
24
+ import * as fs from 'node:fs';
25
+ import * as os from 'node:os';
26
+ import * as path from 'node:path';
27
+ import { skillInventoryAudit } from '../../src/tools/skill-inventory-audit.js';
28
+ import { applyNamespaceRename } from '../../src/tools/apply-namespace-rename.js';
29
+ beforeEach(() => {
30
+ vi.stubGlobal('fetch', vi.fn().mockResolvedValue(new Response(null, { status: 200 })));
31
+ });
32
+ afterEach(() => {
33
+ vi.unstubAllGlobals();
34
+ vi.restoreAllMocks();
35
+ });
36
+ let TEST_HOME;
37
+ let PREV_HOME;
38
+ beforeEach(() => {
39
+ TEST_HOME = fs.mkdtempSync(path.join(os.tmpdir(), 'skillsmith-apply-rename-'));
40
+ PREV_HOME = process.env['HOME'];
41
+ process.env['HOME'] = TEST_HOME;
42
+ });
43
+ afterEach(() => {
44
+ if (PREV_HOME !== undefined)
45
+ process.env['HOME'] = PREV_HOME;
46
+ else
47
+ delete process.env['HOME'];
48
+ if (TEST_HOME && fs.existsSync(TEST_HOME)) {
49
+ fs.rmSync(TEST_HOME, { recursive: true, force: true });
50
+ }
51
+ });
52
+ function plantSkill(home, identifier) {
53
+ const dir = path.join(home, '.claude', 'skills', identifier);
54
+ fs.mkdirSync(dir, { recursive: true });
55
+ const filePath = path.join(dir, 'SKILL.md');
56
+ fs.writeFileSync(filePath, `---\nname: ${identifier}\ndescription: fixture\n---\n`, 'utf-8');
57
+ return filePath;
58
+ }
59
+ function plantCommand(home, identifier) {
60
+ const dir = path.join(home, '.claude', 'commands');
61
+ fs.mkdirSync(dir, { recursive: true });
62
+ const filePath = path.join(dir, `${identifier}.md`);
63
+ fs.writeFileSync(filePath, `# ${identifier}\nbody\n`, 'utf-8');
64
+ return filePath;
65
+ }
66
+ /**
67
+ * Set up an audit with one exact collision (skill `ship` + command `ship`).
68
+ * Returns the audit response — the caller picks `renameSuggestions[0]`
69
+ * for the apply call.
70
+ */
71
+ async function seedAuditWithCollision() {
72
+ plantSkill(TEST_HOME, 'ship');
73
+ const cmdPath = plantCommand(TEST_HOME, 'ship');
74
+ // Command planted second; force its mtime ahead so the suggestion
75
+ // targets the command (file-rename path is simpler to assert).
76
+ const future = new Date(Date.now() + 60_000);
77
+ fs.utimesSync(cmdPath, future, future);
78
+ const response = await skillInventoryAudit({ homeDir: TEST_HOME });
79
+ if (!('auditId' in response)) {
80
+ throw new Error(`expected SkillInventoryAuditResponse, got error: ${JSON.stringify(response)}`);
81
+ }
82
+ return response;
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // Tests
86
+ // ---------------------------------------------------------------------------
87
+ describe('apply_namespace_rename — action: skip', () => {
88
+ it('returns success without mutating disk', async () => {
89
+ const audit = await seedAuditWithCollision();
90
+ const cmdPath = path.join(TEST_HOME, '.claude', 'commands', 'ship.md');
91
+ const before = fs.readFileSync(cmdPath, 'utf-8');
92
+ const response = await applyNamespaceRename({
93
+ auditId: audit.auditId,
94
+ collisionId: audit.renameSuggestions[0].collisionId,
95
+ action: 'skip',
96
+ });
97
+ expect(response.success).toBe(true);
98
+ expect(response.result).toBeUndefined();
99
+ // File untouched.
100
+ expect(fs.readFileSync(cmdPath, 'utf-8')).toBe(before);
101
+ });
102
+ });
103
+ describe('apply_namespace_rename — action: apply', () => {
104
+ it('renames the file via the suggested name and returns the Wave 2 result', async () => {
105
+ const audit = await seedAuditWithCollision();
106
+ const suggestion = audit.renameSuggestions[0];
107
+ const cmdPath = path.join(TEST_HOME, '.claude', 'commands', 'ship.md');
108
+ expect(fs.existsSync(cmdPath)).toBe(true);
109
+ const response = await applyNamespaceRename({
110
+ auditId: audit.auditId,
111
+ collisionId: suggestion.collisionId,
112
+ action: 'apply',
113
+ });
114
+ expect(response.success).toBe(true);
115
+ expect(response.result).toBeDefined();
116
+ expect(response.result?.success).toBe(true);
117
+ // Source path no longer exists; target does.
118
+ expect(fs.existsSync(cmdPath)).toBe(false);
119
+ expect(fs.existsSync(response.result.toPath)).toBe(true);
120
+ });
121
+ });
122
+ describe('apply_namespace_rename — action: custom', () => {
123
+ it('renames the file via the custom name', async () => {
124
+ const audit = await seedAuditWithCollision();
125
+ const suggestion = audit.renameSuggestions[0];
126
+ const response = await applyNamespaceRename({
127
+ auditId: audit.auditId,
128
+ collisionId: suggestion.collisionId,
129
+ action: 'custom',
130
+ customName: 'ship-custom-explicit',
131
+ });
132
+ expect(response.success).toBe(true);
133
+ expect(response.result?.success).toBe(true);
134
+ expect(response.result?.toPath).toContain('ship-custom-explicit.md');
135
+ });
136
+ it('rejects custom action without customName via Zod refinement', async () => {
137
+ const audit = await seedAuditWithCollision();
138
+ const suggestion = audit.renameSuggestions[0];
139
+ const response = await applyNamespaceRename({
140
+ auditId: audit.auditId,
141
+ collisionId: suggestion.collisionId,
142
+ action: 'custom',
143
+ // customName intentionally omitted
144
+ });
145
+ expect(response.success).toBe(false);
146
+ expect(response.errorCode).toBe('namespace.audit.invalid_input');
147
+ expect(response.error).toContain('customName is required');
148
+ });
149
+ it('rejects customName when action !== "custom" (clean-surface guard)', async () => {
150
+ const audit = await seedAuditWithCollision();
151
+ const suggestion = audit.renameSuggestions[0];
152
+ const response = await applyNamespaceRename({
153
+ auditId: audit.auditId,
154
+ collisionId: suggestion.collisionId,
155
+ action: 'apply',
156
+ customName: 'should-not-be-here',
157
+ });
158
+ expect(response.success).toBe(false);
159
+ expect(response.errorCode).toBe('namespace.audit.invalid_input');
160
+ });
161
+ });
162
+ describe('apply_namespace_rename — failure modes', () => {
163
+ it('returns history_not_found for an unknown auditId', async () => {
164
+ const response = await applyNamespaceRename({
165
+ auditId: 'AUDITDOESNTEXIST00000000',
166
+ collisionId: 'whatever',
167
+ action: 'apply',
168
+ });
169
+ expect(response.success).toBe(false);
170
+ expect(response.errorCode).toBe('namespace.audit.history_not_found');
171
+ });
172
+ it('returns collision_not_found when collisionId is unknown in audit', async () => {
173
+ const audit = await seedAuditWithCollision();
174
+ const response = await applyNamespaceRename({
175
+ auditId: audit.auditId,
176
+ collisionId: 'collisionDoesNotExist',
177
+ action: 'apply',
178
+ });
179
+ expect(response.success).toBe(false);
180
+ expect(response.errorCode).toBe('namespace.audit.collision_not_found');
181
+ });
182
+ });
183
+ describe('apply_namespace_rename — idempotent re-apply', () => {
184
+ it('returns fromPath === toPath on second call (Wave 2 ledger no-op)', async () => {
185
+ const audit = await seedAuditWithCollision();
186
+ const suggestion = audit.renameSuggestions[0];
187
+ const first = await applyNamespaceRename({
188
+ auditId: audit.auditId,
189
+ collisionId: suggestion.collisionId,
190
+ action: 'apply',
191
+ });
192
+ expect(first.success).toBe(true);
193
+ expect(first.result?.success).toBe(true);
194
+ const second = await applyNamespaceRename({
195
+ auditId: audit.auditId,
196
+ collisionId: suggestion.collisionId,
197
+ action: 'apply',
198
+ });
199
+ expect(second.success).toBe(true);
200
+ expect(second.result?.success).toBe(true);
201
+ expect(second.result?.fromPath).toBe(second.result?.toPath);
202
+ expect(second.result?.backupPath).toBe('');
203
+ });
204
+ });
205
+ //# sourceMappingURL=apply-namespace-rename.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-namespace-rename.test.js","sourceRoot":"","sources":["../../../tests/unit/apply-namespace-rename.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @fileoverview Unit tests for SMI-4590 Wave 4 PR 4 — `apply_recommended_edit`
3
+ * MCP tool + conditional registration in `audit-tool-dispatch`.
4
+ * @module @skillsmith/mcp-server/tests/unit/apply-recommended-edit
5
+ *
6
+ * Plan: docs/internal/implementation/smi-4590-cli-mcp-framework-adapter.md §3
7
+ * + §Tests `apply-recommended-edit.test.ts`.
8
+ *
9
+ * Coverage:
10
+ * 1. Valid `auditId` + `collisionId` with `pattern: 'add_domain_qualifier'`
11
+ * → file mutated, response success.
12
+ * 2. `collisionId` not in audit → typed error.
13
+ * 3. Edit with `pattern: 'narrow_scope'` (not in registry) → typed error
14
+ * `edit.template_not_in_apply_registry`, file unchanged.
15
+ * 4. **Tool registration**: live registry (non-empty) → name IS in
16
+ * `AUDIT_TOOL_NAMES`.
17
+ * 5. **Tool registration**: empty registry (mocked at module load) → name
18
+ * NOT in `AUDIT_TOOL_NAMES`.
19
+ * 6. Stale `before` snippet (file changed after audit) → typed error
20
+ * `edit.subcall_failed` carrying inner `edit.stale_before`.
21
+ *
22
+ * Pattern: write `~/.skillsmith/audits/<auditId>/suggestions.json` directly
23
+ * with a fixture `RecommendedEdit`. Drives the tool against a hand-rolled
24
+ * audit dir without depending on the semantic-pass pipeline (which would
25
+ * require OverlapDetector + EmbeddingService setup at the unit level).
26
+ */
27
+ export {};
28
+ //# sourceMappingURL=apply-recommended-edit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-recommended-edit.test.d.ts","sourceRoot":"","sources":["../../../tests/unit/apply-recommended-edit.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * @fileoverview Unit tests for SMI-4590 Wave 4 PR 4 — `apply_recommended_edit`
3
+ * MCP tool + conditional registration in `audit-tool-dispatch`.
4
+ * @module @skillsmith/mcp-server/tests/unit/apply-recommended-edit
5
+ *
6
+ * Plan: docs/internal/implementation/smi-4590-cli-mcp-framework-adapter.md §3
7
+ * + §Tests `apply-recommended-edit.test.ts`.
8
+ *
9
+ * Coverage:
10
+ * 1. Valid `auditId` + `collisionId` with `pattern: 'add_domain_qualifier'`
11
+ * → file mutated, response success.
12
+ * 2. `collisionId` not in audit → typed error.
13
+ * 3. Edit with `pattern: 'narrow_scope'` (not in registry) → typed error
14
+ * `edit.template_not_in_apply_registry`, file unchanged.
15
+ * 4. **Tool registration**: live registry (non-empty) → name IS in
16
+ * `AUDIT_TOOL_NAMES`.
17
+ * 5. **Tool registration**: empty registry (mocked at module load) → name
18
+ * NOT in `AUDIT_TOOL_NAMES`.
19
+ * 6. Stale `before` snippet (file changed after audit) → typed error
20
+ * `edit.subcall_failed` carrying inner `edit.stale_before`.
21
+ *
22
+ * Pattern: write `~/.skillsmith/audits/<auditId>/suggestions.json` directly
23
+ * with a fixture `RecommendedEdit`. Drives the tool against a hand-rolled
24
+ * audit dir without depending on the semantic-pass pipeline (which would
25
+ * require OverlapDetector + EmbeddingService setup at the unit level).
26
+ */
27
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
28
+ import * as fs from 'node:fs';
29
+ import * as os from 'node:os';
30
+ import * as path from 'node:path';
31
+ import { applyRecommendedEditTool } from '../../src/tools/apply-recommended-edit.js';
32
+ import { writeAuditSuggestions } from '../../src/audit/audit-suggestions.js';
33
+ import { writeAuditHistory } from '../../src/audit/audit-history.js';
34
+ beforeEach(() => {
35
+ vi.stubGlobal('fetch', vi.fn().mockResolvedValue(new Response(null, { status: 200 })));
36
+ });
37
+ afterEach(() => {
38
+ vi.unstubAllGlobals();
39
+ vi.restoreAllMocks();
40
+ });
41
+ let TEST_HOME;
42
+ let PREV_HOME;
43
+ beforeEach(() => {
44
+ TEST_HOME = fs.mkdtempSync(path.join(os.tmpdir(), 'skillsmith-apply-edit-'));
45
+ PREV_HOME = process.env['HOME'];
46
+ process.env['HOME'] = TEST_HOME;
47
+ });
48
+ afterEach(() => {
49
+ if (PREV_HOME !== undefined)
50
+ process.env['HOME'] = PREV_HOME;
51
+ else
52
+ delete process.env['HOME'];
53
+ if (TEST_HOME && fs.existsSync(TEST_HOME)) {
54
+ fs.rmSync(TEST_HOME, { recursive: true, force: true });
55
+ }
56
+ });
57
+ /**
58
+ * Plant a SKILL.md fixture at `<home>/.claude/skills/<id>/SKILL.md` whose
59
+ * description body matches a single-line edit window. Returns the file path.
60
+ */
61
+ function plantSkillForEdit(home, identifier, description) {
62
+ const dir = path.join(home, '.claude', 'skills', identifier);
63
+ fs.mkdirSync(dir, { recursive: true });
64
+ const filePath = path.join(dir, 'SKILL.md');
65
+ const content = `---\nname: ${identifier}\ndescription: ${description}\n---\n\n# ${identifier}\n`;
66
+ fs.writeFileSync(filePath, content, 'utf-8');
67
+ return filePath;
68
+ }
69
+ /** Locate the 1-indexed line containing `description: <text>` in the file. */
70
+ function findDescriptionLine(filePath, description) {
71
+ const lines = fs.readFileSync(filePath, 'utf-8').split('\n');
72
+ for (let i = 0; i < lines.length; i++) {
73
+ if (lines[i] === `description: ${description}`)
74
+ return i + 1;
75
+ }
76
+ throw new Error('description line not found');
77
+ }
78
+ /**
79
+ * Persist a fixture audit + suggestions pair under HOME's
80
+ * `.skillsmith/audits/<auditId>/`. Returns the auditId + collisionId so
81
+ * the tool call can FK against them.
82
+ */
83
+ async function seedAuditWithEdit(filePath, description, pattern = 'add_domain_qualifier') {
84
+ const auditId = '01J6Z3M0CK4N0R3MCDEFGHJK10'; // ULID-shaped fixture
85
+ const collisionId = 'collisionFixture0';
86
+ // Write a minimal InventoryAuditResult so readAuditHistory + the
87
+ // result.json path are populated. The tool only reads suggestions.json
88
+ // for edit lookup, but the `<auditDir>` exists check is shared.
89
+ const lineNumber = findDescriptionLine(filePath, description);
90
+ const edit = {
91
+ collisionId,
92
+ category: 'description_overlap',
93
+ pattern,
94
+ filePath,
95
+ lineRange: { start: lineNumber, end: lineNumber },
96
+ before: `description: ${description}`,
97
+ after: `description: ${description} (qualified)`,
98
+ rationale: 'unit fixture rationale',
99
+ applyAction: 'recommended_edit',
100
+ applyMode: 'apply_with_confirmation',
101
+ otherEntry: { identifier: 'partner-skill', sourcePath: '/tmp/partner.md' },
102
+ };
103
+ await writeAuditHistory({
104
+ auditId,
105
+ inventory: [],
106
+ exactCollisions: [],
107
+ genericFlags: [],
108
+ semanticCollisions: [],
109
+ summary: {
110
+ totalEntries: 0,
111
+ totalFlags: 0,
112
+ errorCount: 0,
113
+ warningCount: 0,
114
+ durationMs: 0,
115
+ passDurations: { exact: 0, generic: 0, semantic: 0 },
116
+ },
117
+ });
118
+ await writeAuditSuggestions(auditId, [], [edit]);
119
+ return { auditId, collisionId, edit };
120
+ }
121
+ // ---------------------------------------------------------------------------
122
+ // Tests
123
+ // ---------------------------------------------------------------------------
124
+ describe('apply_recommended_edit — happy path', () => {
125
+ it('mutates the file when pattern is in APPLY_TEMPLATE_REGISTRY', async () => {
126
+ const description = 'deploy code to production';
127
+ const filePath = plantSkillForEdit(TEST_HOME, 'fixture', description);
128
+ const { auditId, collisionId } = await seedAuditWithEdit(filePath, description);
129
+ const response = await applyRecommendedEditTool({ auditId, collisionId });
130
+ expect(response.success).toBe(true);
131
+ expect(response.result?.success).toBe(true);
132
+ // File mutated: original line replaced with the templated version.
133
+ const fileBody = fs.readFileSync(filePath, 'utf-8');
134
+ expect(fileBody).toContain('description: deploy code to production (qualified)');
135
+ });
136
+ });
137
+ describe('apply_recommended_edit — registry guard', () => {
138
+ it('rejects pattern: "narrow_scope" with edit.template_not_in_apply_registry', async () => {
139
+ const description = 'narrow this scope please';
140
+ const filePath = plantSkillForEdit(TEST_HOME, 'fixture-narrow', description);
141
+ const { auditId, collisionId } = await seedAuditWithEdit(filePath, description, 'narrow_scope');
142
+ const before = fs.readFileSync(filePath, 'utf-8');
143
+ const response = await applyRecommendedEditTool({ auditId, collisionId });
144
+ expect(response.success).toBe(false);
145
+ expect(response.errorCode).toBe('edit.template_not_in_apply_registry');
146
+ // File untouched — registry guard rejects before any mutation.
147
+ expect(fs.readFileSync(filePath, 'utf-8')).toBe(before);
148
+ });
149
+ });
150
+ describe('apply_recommended_edit — failure modes', () => {
151
+ it('returns history_not_found for an unknown auditId', async () => {
152
+ const response = await applyRecommendedEditTool({
153
+ auditId: 'AUDITDOESNTEXIST00000000',
154
+ collisionId: 'whatever',
155
+ });
156
+ expect(response.success).toBe(false);
157
+ expect(response.errorCode).toBe('namespace.audit.history_not_found');
158
+ });
159
+ it('returns collision_not_found when collisionId is unknown', async () => {
160
+ const description = 'fixture description';
161
+ const filePath = plantSkillForEdit(TEST_HOME, 'fixture-x', description);
162
+ const { auditId } = await seedAuditWithEdit(filePath, description);
163
+ const response = await applyRecommendedEditTool({
164
+ auditId,
165
+ collisionId: 'unknownCollision000',
166
+ });
167
+ expect(response.success).toBe(false);
168
+ expect(response.errorCode).toBe('namespace.audit.collision_not_found');
169
+ });
170
+ it('returns subcall_failed with inner edit.stale_before when the file was modified after audit', async () => {
171
+ const description = 'file will drift';
172
+ const filePath = plantSkillForEdit(TEST_HOME, 'fixture-stale', description);
173
+ const { auditId, collisionId } = await seedAuditWithEdit(filePath, description);
174
+ // Mutate the file out from under the recorded `before`.
175
+ fs.writeFileSync(filePath, `---\nname: fixture-stale\ndescription: completely different now\n---\n`, 'utf-8');
176
+ const response = await applyRecommendedEditTool({ auditId, collisionId });
177
+ expect(response.success).toBe(false);
178
+ expect(response.errorCode).toBe('edit.subcall_failed');
179
+ expect(response.error).toContain('edit.stale_before');
180
+ });
181
+ });
182
+ describe('apply_recommended_edit — Zod validation', () => {
183
+ it('rejects unknown top-level fields', async () => {
184
+ const response = await applyRecommendedEditTool({
185
+ auditId: 'A',
186
+ collisionId: 'B',
187
+ bogus: true,
188
+ });
189
+ expect(response.success).toBe(false);
190
+ expect(response.errorCode).toBe('namespace.audit.invalid_input');
191
+ });
192
+ });
193
+ // ---------------------------------------------------------------------------
194
+ // Conditional registration (audit-tool-dispatch.AUDIT_TOOL_NAMES)
195
+ // ---------------------------------------------------------------------------
196
+ describe('audit-tool-dispatch — apply_recommended_edit conditional registration', () => {
197
+ it('lists apply_recommended_edit when APPLY_TEMPLATE_REGISTRY is non-empty (live state)', async () => {
198
+ // Live state: registry contains 'add_domain_qualifier'.
199
+ const dispatch = await import('../../src/audit-tool-dispatch.js');
200
+ expect(dispatch.AUDIT_TOOL_NAMES.has('apply_recommended_edit')).toBe(true);
201
+ expect(dispatch.isAuditToolName('apply_recommended_edit')).toBe(true);
202
+ });
203
+ it('omits apply_recommended_edit when APPLY_TEMPLATE_REGISTRY is empty', async () => {
204
+ // Defense-in-depth: when the registry is empty (rollback), the
205
+ // dispatcher must hide the tool. Mock the module BEFORE importing the
206
+ // dispatcher fresh to exercise the module-init guard.
207
+ vi.resetModules();
208
+ vi.doMock('../../src/audit/edit-applier.js', async (importOriginal) => {
209
+ const actual = (await importOriginal());
210
+ return {
211
+ ...actual,
212
+ APPLY_TEMPLATE_REGISTRY: new Set(),
213
+ };
214
+ });
215
+ try {
216
+ const dispatch = await import('../../src/audit-tool-dispatch.js');
217
+ expect(dispatch.AUDIT_TOOL_NAMES.has('apply_recommended_edit')).toBe(false);
218
+ expect(dispatch.isAuditToolName('apply_recommended_edit')).toBe(false);
219
+ // Sibling tools still listed.
220
+ expect(dispatch.AUDIT_TOOL_NAMES.has('skill_inventory_audit')).toBe(true);
221
+ expect(dispatch.AUDIT_TOOL_NAMES.has('apply_namespace_rename')).toBe(true);
222
+ }
223
+ finally {
224
+ vi.doUnmock('../../src/audit/edit-applier.js');
225
+ vi.resetModules();
226
+ }
227
+ });
228
+ });
229
+ //# sourceMappingURL=apply-recommended-edit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-recommended-edit.test.js","sourceRoot":"","sources":["../../../tests/unit/apply-recommended-edit.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAA;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAA;AAG5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAEpE,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;AACxF,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,gBAAgB,EAAE,CAAA;IACrB,EAAE,CAAC,eAAe,EAAE,CAAA;AACtB,CAAC,CAAC,CAAA;AAEF,IAAI,SAAiB,CAAA;AACrB,IAAI,SAA6B,CAAA;AAEjC,UAAU,CAAC,GAAG,EAAE;IACd,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAA;IAC5E,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;AACjC,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,GAAG,EAAE;IACb,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;;QACvD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,IAAI,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC;AACH,CAAC,CAAC,CAAA;AAEF;;;GAGG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,UAAkB,EAAE,WAAmB;IAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;IAC5D,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,cAAc,UAAU,kBAAkB,WAAW,cAAc,UAAU,IAAI,CAAA;IACjG,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC5C,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,8EAA8E;AAC9E,SAAS,mBAAmB,CAAC,QAAgB,EAAE,WAAmB;IAChE,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,WAAW,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAC9D,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;AAC/C,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,iBAAiB,CAC9B,QAAgB,EAChB,WAAmB,EACnB,UAA+B,sBAAsB;IAErD,MAAM,OAAO,GAAG,4BAAuC,CAAA,CAAC,sBAAsB;IAC9E,MAAM,WAAW,GAAG,mBAAkC,CAAA;IACtD,iEAAiE;IACjE,uEAAuE;IACvE,gEAAgE;IAChE,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAC7D,MAAM,IAAI,GAAoB;QAC5B,WAAW;QACX,QAAQ,EAAE,qBAAqB;QAC/B,OAAO;QACP,QAAQ;QACR,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE;QACjD,MAAM,EAAE,gBAAgB,WAAW,EAAE;QACrC,KAAK,EAAE,gBAAgB,WAAW,cAAc;QAChD,SAAS,EAAE,wBAAwB;QACnC,WAAW,EAAE,kBAAkB;QAC/B,SAAS,EAAE,yBAAyB;QACpC,UAAU,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE;KAC3E,CAAA;IACD,MAAM,iBAAiB,CAAC;QACtB,OAAO;QACP,SAAS,EAAE,EAAE;QACb,eAAe,EAAE,EAAE;QACnB,YAAY,EAAE,EAAE;QAChB,kBAAkB,EAAE,EAAE;QACtB,OAAO,EAAE;YACP,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;SACrD;KACF,CAAC,CAAA;IACF,MAAM,qBAAqB,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAChD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;AACvC,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,WAAW,GAAG,2BAA2B,CAAA;QAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;QACrE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;QAE/E,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;QACzE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3C,mEAAmE;QACnE,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,oDAAoD,CAAC,CAAA;IAClF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,WAAW,GAAG,0BAA0B,CAAA;QAC9C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAA;QAC5E,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,CAAC,CAAA;QAC/F,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAEjD,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;QACzE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;QACtE,+DAA+D;QAC/D,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC;YAC9C,OAAO,EAAE,0BAA0B;YACnC,WAAW,EAAE,UAAU;SACxB,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,WAAW,GAAG,qBAAqB,CAAA;QACzC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;QACvE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;QAClE,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC;YAC9C,OAAO;YACP,WAAW,EAAE,qBAAqB;SACnC,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC1G,MAAM,WAAW,GAAG,iBAAiB,CAAA;QACrC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,EAAE,eAAe,EAAE,WAAW,CAAC,CAAA;QAC3E,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;QAE/E,wDAAwD;QACxD,EAAE,CAAC,aAAa,CACd,QAAQ,EACR,wEAAwE,EACxE,OAAO,CACR,CAAA;QAED,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;QACzE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QACtD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC;YAC9C,OAAO,EAAE,GAAG;YACZ,WAAW,EAAE,GAAG;YAChB,KAAK,EAAE,IAAI;SACD,CAAC,CAAA;QACb,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAE9E,QAAQ,CAAC,uEAAuE,EAAE,GAAG,EAAE;IACrF,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,wDAAwD;QACxD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAA;QACjE,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1E,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,+DAA+D;QAC/D,sEAAsE;QACtE,sDAAsD;QACtD,EAAE,CAAC,YAAY,EAAE,CAAA;QACjB,EAAE,CAAC,MAAM,CAAC,iCAAiC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;YACpE,MAAM,MAAM,GAAG,CAAC,MAAM,cAAc,EAAE,CAA4B,CAAA;YAClE,OAAO;gBACL,GAAG,MAAM;gBACT,uBAAuB,EAAE,IAAI,GAAG,EAAuB;aACxD,CAAA;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAA;YACjE,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC3E,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACtE,8BAA8B;YAC9B,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzE,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5E,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAA;YAC9C,EAAE,CAAC,YAAY,EAAE,CAAA;QACnB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Unit tests for SMI-4587 Wave 1 Step 3 — audit history persistence.
3
+ * Covers ULID format, atomic write, round-trip, mkdir-on-first-run
4
+ * (E-MISS-2), and the `claude_md_rule` collisionId special case (E-CONF-1).
5
+ *
6
+ * The CLAUDE.md scan caveat report-section test (D-ANTI-1) and the
7
+ * `audit_mode: 'off'` skip-write test (P-ANTI-1) live in subsequent PRs
8
+ * since they depend on the report-writer / audit-mode resolver.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=audit-history.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-history.test.d.ts","sourceRoot":"","sources":["../../../tests/unit/audit-history.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}