@skillsmith/mcp-server 0.4.13 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/CHANGELOG.md +37 -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 +34 -2
  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/compare.types.js +1 -1
  176. package/dist/src/tools/compare.types.js.map +1 -1
  177. package/dist/src/tools/compliance-tools.service.test.js +6 -4
  178. package/dist/src/tools/compliance-tools.service.test.js.map +1 -1
  179. package/dist/src/tools/get-skill.d.ts.map +1 -1
  180. package/dist/src/tools/get-skill.js +1 -1
  181. package/dist/src/tools/get-skill.js.map +1 -1
  182. package/dist/src/tools/install.backup-gc.d.ts +61 -0
  183. package/dist/src/tools/install.backup-gc.d.ts.map +1 -0
  184. package/dist/src/tools/install.backup-gc.js +166 -0
  185. package/dist/src/tools/install.backup-gc.js.map +1 -0
  186. package/dist/src/tools/install.conflict-helpers.d.ts +29 -2
  187. package/dist/src/tools/install.conflict-helpers.d.ts.map +1 -1
  188. package/dist/src/tools/install.conflict-helpers.js +37 -4
  189. package/dist/src/tools/install.conflict-helpers.js.map +1 -1
  190. package/dist/src/tools/install.d.ts +15 -1
  191. package/dist/src/tools/install.d.ts.map +1 -1
  192. package/dist/src/tools/install.js +168 -8
  193. package/dist/src/tools/install.js.map +1 -1
  194. package/dist/src/tools/install.ledger-replay.d.ts +52 -0
  195. package/dist/src/tools/install.ledger-replay.d.ts.map +1 -0
  196. package/dist/src/tools/install.ledger-replay.js +88 -0
  197. package/dist/src/tools/install.ledger-replay.js.map +1 -0
  198. package/dist/src/tools/install.namespace-gate.d.ts +68 -0
  199. package/dist/src/tools/install.namespace-gate.d.ts.map +1 -0
  200. package/dist/src/tools/install.namespace-gate.js +129 -0
  201. package/dist/src/tools/install.namespace-gate.js.map +1 -0
  202. package/dist/src/tools/install.test.js +136 -1
  203. package/dist/src/tools/install.test.js.map +1 -1
  204. package/dist/src/tools/install.tool.d.ts +17 -0
  205. package/dist/src/tools/install.tool.d.ts.map +1 -1
  206. package/dist/src/tools/install.tool.js +19 -1
  207. package/dist/src/tools/install.tool.js.map +1 -1
  208. package/dist/src/tools/install.types.d.ts +35 -1
  209. package/dist/src/tools/install.types.d.ts.map +1 -1
  210. package/dist/src/tools/install.types.js +24 -2
  211. package/dist/src/tools/install.types.js.map +1 -1
  212. package/dist/src/tools/namespace-audit/telemetry.d.ts +80 -0
  213. package/dist/src/tools/namespace-audit/telemetry.d.ts.map +1 -0
  214. package/dist/src/tools/namespace-audit/telemetry.js +129 -0
  215. package/dist/src/tools/namespace-audit/telemetry.js.map +1 -0
  216. package/dist/src/tools/outdated.test.js +2 -2
  217. package/dist/src/tools/outdated.test.js.map +1 -1
  218. package/dist/src/tools/publish-private.test.js +2 -2
  219. package/dist/src/tools/publish-private.test.js.map +1 -1
  220. package/dist/src/tools/recommend.types.d.ts +2 -2
  221. package/dist/src/tools/recommend.types.js +1 -1
  222. package/dist/src/tools/recommend.types.js.map +1 -1
  223. package/dist/src/tools/search.d.ts +2 -2
  224. package/dist/src/tools/search.d.ts.map +1 -1
  225. package/dist/src/tools/search.js +3 -3
  226. package/dist/src/tools/search.js.map +1 -1
  227. package/dist/src/tools/skill-audit.test.js +2 -2
  228. package/dist/src/tools/skill-audit.test.js.map +1 -1
  229. package/dist/src/tools/skill-diff.d.ts +1 -1
  230. package/dist/src/tools/skill-inventory-audit.d.ts +67 -0
  231. package/dist/src/tools/skill-inventory-audit.d.ts.map +1 -0
  232. package/dist/src/tools/skill-inventory-audit.js +112 -0
  233. package/dist/src/tools/skill-inventory-audit.js.map +1 -0
  234. package/dist/src/tools/skill-inventory-audit.types.d.ts +67 -0
  235. package/dist/src/tools/skill-inventory-audit.types.d.ts.map +1 -0
  236. package/dist/src/tools/skill-inventory-audit.types.js +14 -0
  237. package/dist/src/tools/skill-inventory-audit.types.js.map +1 -0
  238. package/dist/src/tools/skill-pack-audit.d.ts.map +1 -1
  239. package/dist/src/tools/skill-pack-audit.helpers.d.ts.map +1 -1
  240. package/dist/src/tools/skill-pack-audit.helpers.js +15 -2
  241. package/dist/src/tools/skill-pack-audit.helpers.js.map +1 -1
  242. package/dist/src/tools/skill-pack-audit.js +15 -1
  243. package/dist/src/tools/skill-pack-audit.js.map +1 -1
  244. package/dist/src/tools/skill-rescan.d.ts.map +1 -1
  245. package/dist/src/tools/skill-rescan.js +4 -2
  246. package/dist/src/tools/skill-rescan.js.map +1 -1
  247. package/dist/src/tools/suggest.d.ts +2 -2
  248. package/dist/src/tools/uninstall.d.ts +1 -1
  249. package/dist/src/tools/uninstall.d.ts.map +1 -1
  250. package/dist/src/tools/uninstall.js +17 -3
  251. package/dist/src/tools/uninstall.js.map +1 -1
  252. package/dist/src/tools/validate.types.d.ts +10 -1
  253. package/dist/src/tools/validate.types.d.ts.map +1 -1
  254. package/dist/src/tools/validate.types.js +11 -2
  255. package/dist/src/tools/validate.types.js.map +1 -1
  256. package/dist/src/utils/installed-skills.d.ts.map +1 -1
  257. package/dist/src/utils/installed-skills.js +8 -6
  258. package/dist/src/utils/installed-skills.js.map +1 -1
  259. package/dist/src/utils/local-inventory.d.ts +29 -0
  260. package/dist/src/utils/local-inventory.d.ts.map +1 -0
  261. package/dist/src/utils/local-inventory.helpers.d.ts +96 -0
  262. package/dist/src/utils/local-inventory.helpers.d.ts.map +1 -0
  263. package/dist/src/utils/local-inventory.helpers.js +279 -0
  264. package/dist/src/utils/local-inventory.helpers.js.map +1 -0
  265. package/dist/src/utils/local-inventory.js +202 -0
  266. package/dist/src/utils/local-inventory.js.map +1 -0
  267. package/dist/src/utils/local-inventory.types.d.ts +100 -0
  268. package/dist/src/utils/local-inventory.types.d.ts.map +1 -0
  269. package/dist/src/utils/local-inventory.types.js +9 -0
  270. package/dist/src/utils/local-inventory.types.js.map +1 -0
  271. package/dist/src/webhooks/stripe-webhook-endpoint.d.ts +12 -0
  272. package/dist/src/webhooks/stripe-webhook-endpoint.d.ts.map +1 -1
  273. package/dist/src/webhooks/stripe-webhook-endpoint.js +30 -9
  274. package/dist/src/webhooks/stripe-webhook-endpoint.js.map +1 -1
  275. package/dist/src/webhooks/webhook-endpoint.d.ts +13 -0
  276. package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -1
  277. package/dist/src/webhooks/webhook-endpoint.js +31 -9
  278. package/dist/src/webhooks/webhook-endpoint.js.map +1 -1
  279. package/dist/tests/compare.test.js +5 -5
  280. package/dist/tests/compare.test.js.map +1 -1
  281. package/dist/tests/context-async-listeners.test.d.ts +12 -0
  282. package/dist/tests/context-async-listeners.test.d.ts.map +1 -0
  283. package/dist/tests/context-async-listeners.test.js +62 -0
  284. package/dist/tests/context-async-listeners.test.js.map +1 -0
  285. package/dist/tests/e2e/compare.e2e.test.js +9 -3
  286. package/dist/tests/e2e/compare.e2e.test.js.map +1 -1
  287. package/dist/tests/e2e/install-flow.e2e.test.js +9 -3
  288. package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -1
  289. package/dist/tests/e2e/recommend.e2e.test.js +9 -3
  290. package/dist/tests/e2e/recommend.e2e.test.js.map +1 -1
  291. package/dist/tests/e2e/skill-flow.e2e.test.js +17 -5
  292. package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -1
  293. package/dist/tests/e2e/suggest.e2e.test.js +11 -3
  294. package/dist/tests/e2e/suggest.e2e.test.js.map +1 -1
  295. package/dist/tests/install-assets.test.d.ts +16 -0
  296. package/dist/tests/install-assets.test.d.ts.map +1 -0
  297. package/dist/tests/install-assets.test.js +72 -0
  298. package/dist/tests/install-assets.test.js.map +1 -0
  299. package/dist/tests/integration/audit-roundtrip.test.d.ts +29 -0
  300. package/dist/tests/integration/audit-roundtrip.test.d.ts.map +1 -0
  301. package/dist/tests/integration/audit-roundtrip.test.js +214 -0
  302. package/dist/tests/integration/audit-roundtrip.test.js.map +1 -0
  303. package/dist/tests/integration/install-namespace.integration.test.d.ts +14 -0
  304. package/dist/tests/integration/install-namespace.integration.test.d.ts.map +1 -0
  305. package/dist/tests/integration/install-namespace.integration.test.js +414 -0
  306. package/dist/tests/integration/install-namespace.integration.test.js.map +1 -0
  307. package/dist/tests/performance/search-performance.test.js +9 -3
  308. package/dist/tests/performance/search-performance.test.js.map +1 -1
  309. package/dist/tests/tool-descriptions.test.d.ts +16 -0
  310. package/dist/tests/tool-descriptions.test.d.ts.map +1 -0
  311. package/dist/tests/tool-descriptions.test.js +63 -0
  312. package/dist/tests/tool-descriptions.test.js.map +1 -0
  313. package/dist/tests/tools.test.js +5 -5
  314. package/dist/tests/tools.test.js.map +1 -1
  315. package/dist/tests/unit/apply-namespace-rename.test.d.ts +24 -0
  316. package/dist/tests/unit/apply-namespace-rename.test.d.ts.map +1 -0
  317. package/dist/tests/unit/apply-namespace-rename.test.js +205 -0
  318. package/dist/tests/unit/apply-namespace-rename.test.js.map +1 -0
  319. package/dist/tests/unit/apply-recommended-edit.test.d.ts +28 -0
  320. package/dist/tests/unit/apply-recommended-edit.test.d.ts.map +1 -0
  321. package/dist/tests/unit/apply-recommended-edit.test.js +229 -0
  322. package/dist/tests/unit/apply-recommended-edit.test.js.map +1 -0
  323. package/dist/tests/unit/audit-history.test.d.ts +11 -0
  324. package/dist/tests/unit/audit-history.test.d.ts.map +1 -0
  325. package/dist/tests/unit/audit-history.test.js +183 -0
  326. package/dist/tests/unit/audit-history.test.js.map +1 -0
  327. package/dist/tests/unit/audit-report-writer.test.d.ts +7 -0
  328. package/dist/tests/unit/audit-report-writer.test.d.ts.map +1 -0
  329. package/dist/tests/unit/audit-report-writer.test.js +249 -0
  330. package/dist/tests/unit/audit-report-writer.test.js.map +1 -0
  331. package/dist/tests/unit/audit-tool-dispatch.test.d.ts +17 -0
  332. package/dist/tests/unit/audit-tool-dispatch.test.d.ts.map +1 -0
  333. package/dist/tests/unit/audit-tool-dispatch.test.js +133 -0
  334. package/dist/tests/unit/audit-tool-dispatch.test.js.map +1 -0
  335. package/dist/tests/unit/collision-detector.semantic.test.d.ts +12 -0
  336. package/dist/tests/unit/collision-detector.semantic.test.d.ts.map +1 -0
  337. package/dist/tests/unit/collision-detector.semantic.test.js +281 -0
  338. package/dist/tests/unit/collision-detector.semantic.test.js.map +1 -0
  339. package/dist/tests/unit/collision-detector.test.d.ts +8 -0
  340. package/dist/tests/unit/collision-detector.test.d.ts.map +1 -0
  341. package/dist/tests/unit/collision-detector.test.js +266 -0
  342. package/dist/tests/unit/collision-detector.test.js.map +1 -0
  343. package/dist/tests/unit/edit-applier.test.d.ts +17 -0
  344. package/dist/tests/unit/edit-applier.test.d.ts.map +1 -0
  345. package/dist/tests/unit/edit-applier.test.js +165 -0
  346. package/dist/tests/unit/edit-applier.test.js.map +1 -0
  347. package/dist/tests/unit/edit-suggester.fixtures.d.ts +38 -0
  348. package/dist/tests/unit/edit-suggester.fixtures.d.ts.map +1 -0
  349. package/dist/tests/unit/edit-suggester.fixtures.js +84 -0
  350. package/dist/tests/unit/edit-suggester.fixtures.js.map +1 -0
  351. package/dist/tests/unit/edit-suggester.test.d.ts +17 -0
  352. package/dist/tests/unit/edit-suggester.test.d.ts.map +1 -0
  353. package/dist/tests/unit/edit-suggester.test.js +356 -0
  354. package/dist/tests/unit/edit-suggester.test.js.map +1 -0
  355. package/dist/tests/unit/framework-adapter.test.d.ts +30 -0
  356. package/dist/tests/unit/framework-adapter.test.d.ts.map +1 -0
  357. package/dist/tests/unit/framework-adapter.test.js +221 -0
  358. package/dist/tests/unit/framework-adapter.test.js.map +1 -0
  359. package/dist/tests/unit/install-preflight.test.d.ts +17 -0
  360. package/dist/tests/unit/install-preflight.test.d.ts.map +1 -0
  361. package/dist/tests/unit/install-preflight.test.js +270 -0
  362. package/dist/tests/unit/install-preflight.test.js.map +1 -0
  363. package/dist/tests/unit/install.backup-gc.test.d.ts +18 -0
  364. package/dist/tests/unit/install.backup-gc.test.d.ts.map +1 -0
  365. package/dist/tests/unit/install.backup-gc.test.js +177 -0
  366. package/dist/tests/unit/install.backup-gc.test.js.map +1 -0
  367. package/dist/tests/unit/install.ledger-replay.test.d.ts +12 -0
  368. package/dist/tests/unit/install.ledger-replay.test.d.ts.map +1 -0
  369. package/dist/tests/unit/install.ledger-replay.test.js +98 -0
  370. package/dist/tests/unit/install.ledger-replay.test.js.map +1 -0
  371. package/dist/tests/unit/local-inventory.test.d.ts +8 -0
  372. package/dist/tests/unit/local-inventory.test.d.ts.map +1 -0
  373. package/dist/tests/unit/local-inventory.test.js +165 -0
  374. package/dist/tests/unit/local-inventory.test.js.map +1 -0
  375. package/dist/tests/unit/namespace-audit-telemetry.test.d.ts +10 -0
  376. package/dist/tests/unit/namespace-audit-telemetry.test.d.ts.map +1 -0
  377. package/dist/tests/unit/namespace-audit-telemetry.test.js +215 -0
  378. package/dist/tests/unit/namespace-audit-telemetry.test.js.map +1 -0
  379. package/dist/tests/unit/namespace-overrides.test.d.ts +18 -0
  380. package/dist/tests/unit/namespace-overrides.test.d.ts.map +1 -0
  381. package/dist/tests/unit/namespace-overrides.test.js +210 -0
  382. package/dist/tests/unit/namespace-overrides.test.js.map +1 -0
  383. package/dist/tests/unit/rename-engine.test.d.ts +26 -0
  384. package/dist/tests/unit/rename-engine.test.d.ts.map +1 -0
  385. package/dist/tests/unit/rename-engine.test.js +367 -0
  386. package/dist/tests/unit/rename-engine.test.js.map +1 -0
  387. package/dist/tests/unit/skill-inventory-audit.test.d.ts +20 -0
  388. package/dist/tests/unit/skill-inventory-audit.test.d.ts.map +1 -0
  389. package/dist/tests/unit/skill-inventory-audit.test.js +299 -0
  390. package/dist/tests/unit/skill-inventory-audit.test.js.map +1 -0
  391. package/dist/tests/unit/skill-pack-audit.helpers.test.d.ts +11 -0
  392. package/dist/tests/unit/skill-pack-audit.helpers.test.d.ts.map +1 -0
  393. package/dist/tests/unit/skill-pack-audit.helpers.test.js +61 -0
  394. package/dist/tests/unit/skill-pack-audit.helpers.test.js.map +1 -0
  395. package/dist/tests/unit/skill-pack-audit.test.js +1 -1
  396. package/dist/tests/unit/skill-pack-audit.test.js.map +1 -1
  397. package/dist/tests/unit/suggestion-chain.test.d.ts +17 -0
  398. package/dist/tests/unit/suggestion-chain.test.d.ts.map +1 -0
  399. package/dist/tests/unit/suggestion-chain.test.js +191 -0
  400. package/dist/tests/unit/suggestion-chain.test.js.map +1 -0
  401. package/dist/tests/webhooks/standalone-shutdown.test.d.ts +12 -0
  402. package/dist/tests/webhooks/standalone-shutdown.test.d.ts.map +1 -0
  403. package/dist/tests/webhooks/standalone-shutdown.test.js +91 -0
  404. package/dist/tests/webhooks/standalone-shutdown.test.js.map +1 -0
  405. package/package.json +17 -4
  406. package/server.json +3 -3
  407. package/src/assets/skills/skillsmith/SKILL.md +109 -80
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collision-detector.semantic.helpers.js","sourceRoot":"","sources":["../../../src/audit/collision-detector.semantic.helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @fileoverview Type vocabulary for the collision detector (SMI-4587 Wave 1 Step 1).
3
+ * @module @skillsmith/mcp-server/audit/collision-detector.types
4
+ *
5
+ * Re-exports the collision flag shapes from local-inventory.types and adds
6
+ * the InventoryAuditResult container. Public surface for Wave 2/3/4.
7
+ */
8
+ import type { AuditId, CollisionId, ExactCollisionFlag, InventoryEntry } from '../utils/local-inventory.types.js';
9
+ export type { AuditId, CollisionId, ExactCollisionFlag, InventoryEntry };
10
+ /**
11
+ * Semantic-overlap collision (filled in by Wave 1 PR2 — Step 6 semantic pass).
12
+ * Type is stable now so the result-writer can reference the field.
13
+ */
14
+ export interface SemanticCollisionFlag {
15
+ kind: 'semantic';
16
+ collisionId: CollisionId;
17
+ entryA: InventoryEntry;
18
+ entryB: InventoryEntry;
19
+ /** From `OverlapDetector.detectOverlap.overlapScore`. */
20
+ cosineScore: number;
21
+ overlappingPhrases: Array<{
22
+ phrase1: string;
23
+ phrase2: string;
24
+ similarity: number;
25
+ }>;
26
+ severity: 'warning';
27
+ reason: string;
28
+ }
29
+ /**
30
+ * Generic-token quality flag — Step 5 in the next PR plumbs this in via the
31
+ * existing `TriggerQualityEntry` from `skill-pack-audit.types.ts`. Aliased
32
+ * here to keep imports stable.
33
+ */
34
+ export interface GenericTokenFlag {
35
+ kind: 'generic';
36
+ collisionId: CollisionId;
37
+ identifier: string;
38
+ entry: InventoryEntry;
39
+ matchedTokens: string[];
40
+ severity: 'warning';
41
+ reason: string;
42
+ }
43
+ /**
44
+ * Top-level result of `detectCollisions`. Contains the inventory snapshot
45
+ * + flags from each pass + summary metrics.
46
+ *
47
+ * Wave 1 PR1 (this PR) populates `auditId`, `inventory`, and
48
+ * `exactCollisions` only. `genericFlags` and `semanticCollisions` are empty
49
+ * arrays until subsequent PRs land Step 5 + Step 6.
50
+ */
51
+ export interface InventoryAuditResult {
52
+ auditId: AuditId;
53
+ inventory: InventoryEntry[];
54
+ exactCollisions: ExactCollisionFlag[];
55
+ genericFlags: GenericTokenFlag[];
56
+ semanticCollisions: SemanticCollisionFlag[];
57
+ summary: {
58
+ totalEntries: number;
59
+ totalFlags: number;
60
+ errorCount: number;
61
+ warningCount: number;
62
+ durationMs: number;
63
+ passDurations: {
64
+ exact: number;
65
+ generic: number;
66
+ semantic: number;
67
+ };
68
+ };
69
+ }
70
+ //# sourceMappingURL=collision-detector.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collision-detector.types.d.ts","sourceRoot":"","sources":["../../../src/audit/collision-detector.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,cAAc,EACf,MAAM,mCAAmC,CAAA;AAE1C,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAA;AAExE;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,cAAc,CAAA;IACtB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAA;IACnB,kBAAkB,EAAE,KAAK,CAAC;QACxB,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf,UAAU,EAAE,MAAM,CAAA;KACnB,CAAC,CAAA;IACF,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAA;IACf,WAAW,EAAE,WAAW,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,cAAc,CAAA;IACrB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,eAAe,EAAE,kBAAkB,EAAE,CAAA;IACrC,YAAY,EAAE,gBAAgB,EAAE,CAAA;IAChC,kBAAkB,EAAE,qBAAqB,EAAE,CAAA;IAC3C,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,aAAa,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;KACpE,CAAA;CACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview Type vocabulary for the collision detector (SMI-4587 Wave 1 Step 1).
3
+ * @module @skillsmith/mcp-server/audit/collision-detector.types
4
+ *
5
+ * Re-exports the collision flag shapes from local-inventory.types and adds
6
+ * the InventoryAuditResult container. Public surface for Wave 2/3/4.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=collision-detector.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collision-detector.types.js","sourceRoot":"","sources":["../../../src/audit/collision-detector.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @fileoverview Edit-applier — file-mutation path for `RecommendedEdit` (SMI-4589 Wave 3 Step 5).
3
+ * @module @skillsmith/mcp-server/audit/edit-applier
4
+ *
5
+ * `applyRecommendedEdit` mutates a SKILL.md or CLAUDE.md file in-place
6
+ * after the per-template gate has cleared. The mutation flow:
7
+ *
8
+ * 1. Registry guard — reject `pattern`s not in `APPLY_TEMPLATE_REGISTRY`.
9
+ * 2. Stale-before guard — verify file content at `lineRange` matches
10
+ * the recorded `before` snippet byte-for-byte.
11
+ * 3. Backup — `createProseBackup(filePath, 'prose-edit')`.
12
+ * 4. Atomic write — write to `<filePath>.tmp` then `fs.rename`.
13
+ * 5. Ledger append — `appendOverride` + `writeLedger` (Wave 2 PR #1).
14
+ * 6. Return `EditApplyResult` with the inline revert summary
15
+ * (decision #10).
16
+ *
17
+ * Per-template gate (ratified 2026-05-01): `APPLY_TEMPLATE_REGISTRY` is
18
+ * a literal allowlist containing only `'add_domain_qualifier'` in v1
19
+ * (4.10/5 from GPT-5.4 reviewer-#2 scoring). Synthetic edits with
20
+ * `pattern: 'narrow_scope'` or `'reword_trigger_verb'` are rejected with
21
+ * `error: 'edit.template_not_in_apply_registry'` and mutate nothing —
22
+ * the regression guard test asserts this. SMI-4593 reauthors the failing
23
+ * templates; when their bodies clear the per-template gate, that issue
24
+ * extends this allowlist.
25
+ *
26
+ * Plan: docs/internal/implementation/smi-4589-edit-suggester.md §5.
27
+ */
28
+ import type { EditApplyResult } from './edit-applier.types.js';
29
+ import type { EditTemplatePattern, RecommendedEdit } from './edit-suggester.types.js';
30
+ /**
31
+ * Allowlist of template patterns whose `apply_with_confirmation` mode is
32
+ * registered for file mutation. Per the per-template gate ratified
33
+ * 2026-05-01, only `add_domain_qualifier` (4.10/5) ships in v1.
34
+ *
35
+ * SMI-4593 extends this set when the failing templates clear the gate
36
+ * post-reauthoring. Plan §6 mandates plan-review verifies this set
37
+ * matches `goal_6.per_template_gate.verdicts` PASS templates exactly.
38
+ *
39
+ * Type-narrow: declared as `ReadonlySet<EditTemplatePattern>` so the
40
+ * runtime check can't drift from the type union.
41
+ */
42
+ export declare const APPLY_TEMPLATE_REGISTRY: ReadonlySet<EditTemplatePattern>;
43
+ export interface ApplyRecommendedEditOptions {
44
+ /**
45
+ * FK into `~/.skillsmith/audits/<auditId>/result.json`. Persisted in
46
+ * the ledger entry so revert can re-derive the original collision
47
+ * context.
48
+ */
49
+ auditId: string;
50
+ /**
51
+ * Apply mode. Only `'apply_with_confirmation'` triggers mutation; any
52
+ * other value is rejected by registry guard ahead of mutation. The
53
+ * argument is preserved for forward-compat with v2 LLM-driven mode.
54
+ */
55
+ mode: 'apply_with_confirmation';
56
+ }
57
+ /**
58
+ * Apply a `RecommendedEdit` to disk. The agent calls this after
59
+ * surfacing the edit + receiving user confirmation. Atomic — failure
60
+ * before mutation leaves the file untouched; failure during mutation
61
+ * leaves the original file in place via tmp-file + rename semantics.
62
+ */
63
+ export declare function applyRecommendedEdit(edit: RecommendedEdit, opts: ApplyRecommendedEditOptions): Promise<EditApplyResult>;
64
+ //# sourceMappingURL=edit-applier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-applier.d.ts","sourceRoot":"","sources":["../../../src/audit/edit-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAErF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,mBAAmB,CACb,CAAA;AAExD,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,IAAI,EAAE,yBAAyB,CAAA;CAChC;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,eAAe,CAAC,CA2I1B"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * @fileoverview Edit-applier — file-mutation path for `RecommendedEdit` (SMI-4589 Wave 3 Step 5).
3
+ * @module @skillsmith/mcp-server/audit/edit-applier
4
+ *
5
+ * `applyRecommendedEdit` mutates a SKILL.md or CLAUDE.md file in-place
6
+ * after the per-template gate has cleared. The mutation flow:
7
+ *
8
+ * 1. Registry guard — reject `pattern`s not in `APPLY_TEMPLATE_REGISTRY`.
9
+ * 2. Stale-before guard — verify file content at `lineRange` matches
10
+ * the recorded `before` snippet byte-for-byte.
11
+ * 3. Backup — `createProseBackup(filePath, 'prose-edit')`.
12
+ * 4. Atomic write — write to `<filePath>.tmp` then `fs.rename`.
13
+ * 5. Ledger append — `appendOverride` + `writeLedger` (Wave 2 PR #1).
14
+ * 6. Return `EditApplyResult` with the inline revert summary
15
+ * (decision #10).
16
+ *
17
+ * Per-template gate (ratified 2026-05-01): `APPLY_TEMPLATE_REGISTRY` is
18
+ * a literal allowlist containing only `'add_domain_qualifier'` in v1
19
+ * (4.10/5 from GPT-5.4 reviewer-#2 scoring). Synthetic edits with
20
+ * `pattern: 'narrow_scope'` or `'reword_trigger_verb'` are rejected with
21
+ * `error: 'edit.template_not_in_apply_registry'` and mutate nothing —
22
+ * the regression guard test asserts this. SMI-4593 reauthors the failing
23
+ * templates; when their bodies clear the per-template gate, that issue
24
+ * extends this allowlist.
25
+ *
26
+ * Plan: docs/internal/implementation/smi-4589-edit-suggester.md §5.
27
+ */
28
+ import * as crypto from 'node:crypto';
29
+ import * as fs from 'node:fs/promises';
30
+ import { appendOverride, readLedger, writeLedger } from './namespace-overrides.js';
31
+ import { createProseBackup } from '../tools/install.conflict-helpers.js';
32
+ /**
33
+ * Allowlist of template patterns whose `apply_with_confirmation` mode is
34
+ * registered for file mutation. Per the per-template gate ratified
35
+ * 2026-05-01, only `add_domain_qualifier` (4.10/5) ships in v1.
36
+ *
37
+ * SMI-4593 extends this set when the failing templates clear the gate
38
+ * post-reauthoring. Plan §6 mandates plan-review verifies this set
39
+ * matches `goal_6.per_template_gate.verdicts` PASS templates exactly.
40
+ *
41
+ * Type-narrow: declared as `ReadonlySet<EditTemplatePattern>` so the
42
+ * runtime check can't drift from the type union.
43
+ */
44
+ export const APPLY_TEMPLATE_REGISTRY = new Set(['add_domain_qualifier']);
45
+ /**
46
+ * Apply a `RecommendedEdit` to disk. The agent calls this after
47
+ * surfacing the edit + receiving user confirmation. Atomic — failure
48
+ * before mutation leaves the file untouched; failure during mutation
49
+ * leaves the original file in place via tmp-file + rename semantics.
50
+ */
51
+ export async function applyRecommendedEdit(edit, opts) {
52
+ // 1. Registry guard. Synthetic edits constructed by tests with a
53
+ // failing-template pattern hit this first — no I/O before reject.
54
+ if (!APPLY_TEMPLATE_REGISTRY.has(edit.pattern)) {
55
+ return {
56
+ success: false,
57
+ collisionId: edit.collisionId,
58
+ pattern: edit.pattern,
59
+ filePath: edit.filePath,
60
+ backupPath: '',
61
+ ledgerEntryId: '',
62
+ summary: '',
63
+ error: {
64
+ kind: 'edit.template_not_in_apply_registry',
65
+ pattern: edit.pattern,
66
+ message: `Template pattern "${edit.pattern}" is not in APPLY_TEMPLATE_REGISTRY; cannot apply. Render in 'manual_review' mode only.`,
67
+ },
68
+ };
69
+ }
70
+ // 2. Stale-before guard. Read the file and verify the snippet at
71
+ // lineRange matches byte-for-byte. Any drift → reject.
72
+ let fileContent;
73
+ try {
74
+ fileContent = await fs.readFile(edit.filePath, 'utf-8');
75
+ }
76
+ catch (err) {
77
+ return failFsError(edit, `read failed: ${err.message}`);
78
+ }
79
+ const fileLines = fileContent.split('\n');
80
+ const startIdx = edit.lineRange.start - 1;
81
+ const endIdx = edit.lineRange.end - 1;
82
+ if (startIdx < 0 || endIdx >= fileLines.length || startIdx > endIdx) {
83
+ return staleBeforeError(edit, 'line range out of bounds');
84
+ }
85
+ const onDiskSnippet = fileLines.slice(startIdx, endIdx + 1).join('\n');
86
+ if (onDiskSnippet !== edit.before) {
87
+ return staleBeforeError(edit, 'before snippet mismatch');
88
+ }
89
+ // 3. Backup BEFORE any mutation. Failure here aborts — never mutate
90
+ // without a recoverable backup.
91
+ let backupPath;
92
+ try {
93
+ const backup = await createProseBackup(edit.filePath, 'prose-edit');
94
+ backupPath = backup.backupPath;
95
+ }
96
+ catch (err) {
97
+ return {
98
+ success: false,
99
+ collisionId: edit.collisionId,
100
+ pattern: edit.pattern,
101
+ filePath: edit.filePath,
102
+ backupPath: '',
103
+ ledgerEntryId: '',
104
+ summary: '',
105
+ error: {
106
+ kind: 'edit.backup_failed',
107
+ reason: err.message,
108
+ message: `Backup failed for ${edit.filePath}; file not mutated.`,
109
+ },
110
+ };
111
+ }
112
+ // 4. Atomic write — splice in the after-snippet at lineRange, write
113
+ // to <filePath>.<random>.tmp, fs.rename.
114
+ const newLines = [
115
+ ...fileLines.slice(0, startIdx),
116
+ ...edit.after.split('\n'),
117
+ ...fileLines.slice(endIdx + 1),
118
+ ];
119
+ const newContent = newLines.join('\n');
120
+ const tmpSuffix = crypto.randomBytes(6).toString('hex');
121
+ const tmpPath = `${edit.filePath}.${tmpSuffix}.tmp`;
122
+ try {
123
+ await fs.writeFile(tmpPath, newContent, 'utf-8');
124
+ await fs.rename(tmpPath, edit.filePath);
125
+ }
126
+ catch (err) {
127
+ // Best-effort tmp cleanup; ENOENT is fine.
128
+ try {
129
+ await fs.rm(tmpPath, { force: true });
130
+ }
131
+ catch {
132
+ /* swallow */
133
+ }
134
+ return {
135
+ success: false,
136
+ collisionId: edit.collisionId,
137
+ pattern: edit.pattern,
138
+ filePath: edit.filePath,
139
+ backupPath,
140
+ ledgerEntryId: '',
141
+ summary: '',
142
+ error: {
143
+ kind: 'edit.fs_error',
144
+ reason: err.message,
145
+ message: `File mutation failed for ${edit.filePath}; backup retained at ${backupPath}.`,
146
+ },
147
+ };
148
+ }
149
+ // 5. Ledger append. We piggyback on the namespace-overrides ledger
150
+ // (Wave 2 PR #1) — same last-write-wins atomic semantics. The
151
+ // `kind` field accepts only `InventoryKind` values; we encode the
152
+ // prose-edit case via `originalIdentifier` = filename + lineRange
153
+ // marker so revert can locate the entry by `auditId`.
154
+ const ledger = await readLedger();
155
+ const lineMarker = `lines:${edit.lineRange.start}-${edit.lineRange.end}`;
156
+ const updated = appendOverride(ledger, {
157
+ skillId: null,
158
+ // SMI-4589 carve-out: prose edits target SKILL.md / CLAUDE.md, not
159
+ // a renamed inventory artifact. We tag the kind by best-fit
160
+ // inventory match — `claude_md_rule` for CLAUDE.md edits, `skill`
161
+ // for SKILL.md edits — to keep the existing ledger union
162
+ // unchanged. Wave 4 / SMI-4590 may extend the union with a
163
+ // `'prose_edit'` discriminator if revert ergonomics demand it.
164
+ kind: edit.category === 'claude_md_trigger_overlap' ? 'claude_md_rule' : 'skill',
165
+ originalIdentifier: `${edit.filePath}:${lineMarker}`,
166
+ renamedTo: `${edit.filePath}:${lineMarker}:prose-edit`,
167
+ originalPath: edit.filePath,
168
+ renamedPath: edit.filePath,
169
+ auditId: opts.auditId,
170
+ reason: edit.rationale,
171
+ });
172
+ if (updated !== ledger) {
173
+ await writeLedger(updated);
174
+ }
175
+ const ledgerEntryId = updated === ledger ? '' : (updated.overrides[updated.overrides.length - 1]?.id ?? '');
176
+ // 6. Return success with the inline revert summary literal.
177
+ return {
178
+ success: true,
179
+ collisionId: edit.collisionId,
180
+ pattern: edit.pattern,
181
+ filePath: edit.filePath,
182
+ backupPath,
183
+ ledgerEntryId,
184
+ summary: buildSummary(edit.filePath, edit.lineRange, opts.auditId),
185
+ };
186
+ }
187
+ /**
188
+ * Inline revert-summary literal (decision #10). Mirrors Wave 2's UX —
189
+ * `sklx audit revert <auditId>` is a Wave 4 (SMI-4590) command surface;
190
+ * if Wave 4 hasn't shipped at the time this fires, the summary remains
191
+ * user-facing copy and the command is a no-op until SMI-4590 lands.
192
+ */
193
+ function buildSummary(filePath, lineRange, auditId) {
194
+ // Always emit `start-end` form even on single-line ranges. The Wave 4
195
+ // CLI surface (`sklx audit revert`) parses the range; a stable two-
196
+ // number form simplifies the parser and matches the literal copy in
197
+ // the plan §5: `"Edited <file> lines <range>. To undo: ..."`.
198
+ const range = `${lineRange.start}-${lineRange.end}`;
199
+ return `Edited ${filePath} lines ${range}. To undo: sklx audit revert ${auditId}`;
200
+ }
201
+ function staleBeforeError(edit, reason) {
202
+ return {
203
+ success: false,
204
+ collisionId: edit.collisionId,
205
+ pattern: edit.pattern,
206
+ filePath: edit.filePath,
207
+ backupPath: '',
208
+ ledgerEntryId: '',
209
+ summary: '',
210
+ error: {
211
+ kind: 'edit.stale_before',
212
+ filePath: edit.filePath,
213
+ message: `Before snippet mismatch for ${edit.filePath} at lines ${edit.lineRange.start}-${edit.lineRange.end} (${reason}). Re-run detection.`,
214
+ },
215
+ };
216
+ }
217
+ function failFsError(edit, reason) {
218
+ return {
219
+ success: false,
220
+ collisionId: edit.collisionId,
221
+ pattern: edit.pattern,
222
+ filePath: edit.filePath,
223
+ backupPath: '',
224
+ ledgerEntryId: '',
225
+ summary: '',
226
+ error: {
227
+ kind: 'edit.fs_error',
228
+ reason,
229
+ message: `File access failed for ${edit.filePath}: ${reason}`,
230
+ },
231
+ };
232
+ }
233
+ //# sourceMappingURL=edit-applier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-applier.js","sourceRoot":"","sources":["../../../src/audit/edit-applier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * @fileoverview Type vocabulary for the edit-applier (SMI-4589 Wave 3 Step 5).
3
+ * @module @skillsmith/mcp-server/audit/edit-applier.types
4
+ *
5
+ * Mirrors `ApplyRenameResult` (Wave 2 PR #2) so heterogeneous suggestion
6
+ * lists (rename + edit) can be displayed uniformly by Wave 4's MCP tool
7
+ * surface. The error union is purpose-narrow — prose-edit failures don't
8
+ * include any rename-engine codes.
9
+ *
10
+ * Plan: docs/internal/implementation/smi-4589-edit-suggester.md §5.
11
+ */
12
+ import type { CollisionId } from './collision-detector.types.js';
13
+ import type { EditTemplatePattern } from './edit-suggester.types.js';
14
+ /**
15
+ * Discriminated errors surfaced by `applyRecommendedEdit`. Callers
16
+ * `switch` on `kind` rather than parsing the message string.
17
+ */
18
+ export type EditApplyError = {
19
+ /** Edit's source template is not in the apply registry allowlist. */
20
+ kind: 'edit.template_not_in_apply_registry';
21
+ pattern: EditTemplatePattern;
22
+ message: string;
23
+ } | {
24
+ /**
25
+ * The file content at `lineRange` no longer matches the recorded
26
+ * `before` snippet — file changed under us between detector run
27
+ * and apply call. The agent should re-run detection and surface
28
+ * the fresh suggestion.
29
+ */
30
+ kind: 'edit.stale_before';
31
+ filePath: string;
32
+ message: string;
33
+ } | {
34
+ kind: 'edit.backup_failed';
35
+ reason: string;
36
+ message: string;
37
+ } | {
38
+ kind: 'edit.fs_error';
39
+ reason: string;
40
+ message: string;
41
+ };
42
+ /**
43
+ * Result of applying a `RecommendedEdit`. `success === false` populates
44
+ * `error`; `success === true` populates `backupPath`, `ledgerEntryId`,
45
+ * and the inline revert summary text.
46
+ */
47
+ export interface EditApplyResult {
48
+ success: boolean;
49
+ collisionId: CollisionId;
50
+ /** Pattern that produced the edit (for log-grep + telemetry). */
51
+ pattern: EditTemplatePattern;
52
+ /** Absolute path to the mutated file. */
53
+ filePath: string;
54
+ /**
55
+ * Backup directory created by `createProseBackup`. Empty string on
56
+ * failure. Backup is retained until the 30-day GC sweep.
57
+ */
58
+ backupPath: string;
59
+ /** ULID of the appended ledger entry (`ovr_…`). Empty string on failure. */
60
+ ledgerEntryId: string;
61
+ /**
62
+ * Inline revert summary (decision #10). Literal text on success:
63
+ *
64
+ * `"Edited <file> lines <range>. To undo: sklx audit revert <auditId>"`
65
+ *
66
+ * Empty string on failure.
67
+ */
68
+ summary: string;
69
+ /** Discriminated error on failure; `undefined` on success. */
70
+ error?: EditApplyError;
71
+ }
72
+ //# sourceMappingURL=edit-applier.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-applier.types.d.ts","sourceRoot":"","sources":["../../../src/audit/edit-applier.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAEpE;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB;IACE,qEAAqE;IACrE,IAAI,EAAE,qCAAqC,CAAA;IAC3C,OAAO,EAAE,mBAAmB,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;CAChB,GACD;IACE;;;;;OAKG;IACH,IAAI,EAAE,mBAAmB,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB,GACD;IACE,IAAI,EAAE,oBAAoB,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,GACD;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAEL;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,iEAAiE;IACjE,OAAO,EAAE,mBAAmB,CAAA;IAC5B,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAA;IACrB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,KAAK,CAAC,EAAE,cAAc,CAAA;CACvB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @fileoverview Type vocabulary for the edit-applier (SMI-4589 Wave 3 Step 5).
3
+ * @module @skillsmith/mcp-server/audit/edit-applier.types
4
+ *
5
+ * Mirrors `ApplyRenameResult` (Wave 2 PR #2) so heterogeneous suggestion
6
+ * lists (rename + edit) can be displayed uniformly by Wave 4's MCP tool
7
+ * surface. The error union is purpose-narrow — prose-edit failures don't
8
+ * include any rename-engine codes.
9
+ *
10
+ * Plan: docs/internal/implementation/smi-4589-edit-suggester.md §5.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=edit-applier.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-applier.types.js","sourceRoot":"","sources":["../../../src/audit/edit-applier.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @fileoverview Edit-suggester core (SMI-4589 Wave 3 Steps 2-3).
3
+ * @module @skillsmith/mcp-server/audit/edit-suggester
4
+ *
5
+ * Takes the semantic-collision flags from Wave 1's `InventoryAuditResult`
6
+ * and produces `RecommendedEdit[]` — templated, deterministic prose-edit
7
+ * suggestions. No LLM calls. No fuzziness.
8
+ *
9
+ * Per-template gate (ratified 2026-05-01): v1 ships only
10
+ * `add_domain_qualifier` (4.10/5 from GPT-5.4 reviewer-#2 scoring). The
11
+ * other two templates (`narrow_scope` 1.70/5, `reword_trigger_verb`
12
+ * 2.35/5) FAILED the gate and are NOT shipped in any form — neither as
13
+ * auto-apply nor as `manual_review`. They route to SMI-4593 for
14
+ * reauthoring. Test cases 2-3 in `edit-suggester.test.ts` assert empty
15
+ * output for collisions that would have matched those failing templates,
16
+ * guarding against accidental re-registration before the gate clears.
17
+ *
18
+ * Dispatch pattern (plan §1):
19
+ * 1. Walk `result.semanticCollisions[]`, collect unique file paths
20
+ * across the surviving template's `applies()` checks.
21
+ * 2. `await Promise.all(uniqueFilePaths.map(fs.readFile))` — single
22
+ * parallel read phase. Latency budget is linear in unique-files,
23
+ * not templates × collisions.
24
+ * 3. Iterate flags; for each, walk templates pre-sorted by descending
25
+ * `priority`; first `applies()` true wins; `generate()` is
26
+ * synchronous over the cached `fileContent`.
27
+ * 4. Filter null results (template matched but generate() couldn't
28
+ * synthesize a valid edit — e.g. file content drifted).
29
+ *
30
+ * Plan: docs/internal/implementation/smi-4589-edit-suggester.md §1, §Steps 2-3.
31
+ */
32
+ import type { InventoryAuditResult } from './collision-detector.types.js';
33
+ import type { EditTemplate, EditTemplatePattern, RecommendedEdit } from './edit-suggester.types.js';
34
+ /**
35
+ * Run the edit-suggester over an `InventoryAuditResult`'s semantic
36
+ * collisions. Returns `RecommendedEdit[]` — one per flag that matches a
37
+ * registered template AND whose template successfully synthesized a
38
+ * non-empty edit.
39
+ *
40
+ * Order of returned edits: same as `result.semanticCollisions[]` input
41
+ * order. Tests assert this stability so PR diffs in the audit-report
42
+ * markdown are deterministic.
43
+ *
44
+ * I/O: reads each unique referenced file ONCE, in parallel, before
45
+ * iterating templates. Templates see only `fileContent` strings, not
46
+ * paths — keeps templates pure and unit-testable without fixtures on
47
+ * disk.
48
+ *
49
+ * Failure model: any per-flag template error (fileRead failure, snippet
50
+ * locate failure, `generate()` returning null) skips that flag silently.
51
+ * The other flags still produce edits. An empty
52
+ * `result.semanticCollisions[]` short-circuits with no I/O.
53
+ */
54
+ export declare function runEditSuggester(result: InventoryAuditResult, opts?: {
55
+ templateOverrides?: ReadonlyArray<EditTemplate>;
56
+ }): Promise<RecommendedEdit[]>;
57
+ /**
58
+ * Public registry-key accessor. Re-exports the pattern strings so the
59
+ * apply-path registry (`edit-applier.ts`) can import a single source of
60
+ * truth instead of stringly-typed literals.
61
+ */
62
+ export declare const V1_TEMPLATE_PATTERNS: ReadonlyArray<EditTemplatePattern>;
63
+ //# sourceMappingURL=edit-suggester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-suggester.d.ts","sourceRoot":"","sources":["../../../src/audit/edit-suggester.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,OAAO,KAAK,EAAE,oBAAoB,EAAyB,MAAM,+BAA+B,CAAA;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAqGnG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,IAAI,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;CAAE,GACzD,OAAO,CAAC,eAAe,EAAE,CAAC,CA8D5B;AA8HD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,mBAAmB,CAEnE,CAAA"}