@skillsmith/core 0.12.0 → 0.12.2

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 (290) hide show
  1. package/CHANGELOG.md +166 -1
  2. package/README.md +7 -8
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/api/client.d.ts +5 -3
  5. package/dist/src/api/client.d.ts.map +1 -1
  6. package/dist/src/api/client.js +23 -33
  7. package/dist/src/api/client.js.map +1 -1
  8. package/dist/src/api/client.registry-sync.d.ts +28 -0
  9. package/dist/src/api/client.registry-sync.d.ts.map +1 -0
  10. package/dist/src/api/client.registry-sync.js +36 -0
  11. package/dist/src/api/client.registry-sync.js.map +1 -0
  12. package/dist/src/api/client.test.js +185 -0
  13. package/dist/src/api/client.test.js.map +1 -1
  14. package/dist/src/api/client.toSkill.d.ts +16 -0
  15. package/dist/src/api/client.toSkill.d.ts.map +1 -0
  16. package/dist/src/api/client.toSkill.js +46 -0
  17. package/dist/src/api/client.toSkill.js.map +1 -0
  18. package/dist/src/api/client.types.d.ts +22 -0
  19. package/dist/src/api/client.types.d.ts.map +1 -1
  20. package/dist/src/api/index.d.ts +1 -1
  21. package/dist/src/api/index.d.ts.map +1 -1
  22. package/dist/src/api/index.js.map +1 -1
  23. package/dist/src/api/schemas.d.ts +28 -0
  24. package/dist/src/api/schemas.d.ts.map +1 -1
  25. package/dist/src/api/schemas.js +13 -0
  26. package/dist/src/api/schemas.js.map +1 -1
  27. package/dist/src/audit/remote-audit.d.ts +85 -0
  28. package/dist/src/audit/remote-audit.d.ts.map +1 -1
  29. package/dist/src/audit/remote-audit.js +126 -3
  30. package/dist/src/audit/remote-audit.js.map +1 -1
  31. package/dist/src/audit/remote-audit.test.js +217 -1
  32. package/dist/src/audit/remote-audit.test.js.map +1 -1
  33. package/dist/src/config/index.d.ts +1 -0
  34. package/dist/src/config/index.d.ts.map +1 -1
  35. package/dist/src/config/index.js.map +1 -1
  36. package/dist/src/config/token-credentials.d.ts +20 -0
  37. package/dist/src/config/token-credentials.d.ts.map +1 -1
  38. package/dist/src/config/token-credentials.js +59 -0
  39. package/dist/src/config/token-credentials.js.map +1 -1
  40. package/dist/src/config/token-credentials.test.d.ts +3 -0
  41. package/dist/src/config/token-credentials.test.d.ts.map +1 -1
  42. package/dist/src/config/token-credentials.test.js +68 -0
  43. package/dist/src/config/token-credentials.test.js.map +1 -1
  44. package/dist/src/db/migration-runner.d.ts.map +1 -1
  45. package/dist/src/db/migration-runner.js +6 -0
  46. package/dist/src/db/migration-runner.js.map +1 -1
  47. package/dist/src/db/migrations/v18-skill-versions-real-content-hash.d.ts +36 -0
  48. package/dist/src/db/migrations/v18-skill-versions-real-content-hash.d.ts.map +1 -0
  49. package/dist/src/db/migrations/v18-skill-versions-real-content-hash.js +38 -0
  50. package/dist/src/db/migrations/v18-skill-versions-real-content-hash.js.map +1 -0
  51. package/dist/src/db/schema.d.ts +1 -1
  52. package/dist/src/db/schema.d.ts.map +1 -1
  53. package/dist/src/db/schema.js +3 -1
  54. package/dist/src/db/schema.js.map +1 -1
  55. package/dist/src/exports/services.d.ts +3 -7
  56. package/dist/src/exports/services.d.ts.map +1 -1
  57. package/dist/src/exports/services.install.d.ts +18 -0
  58. package/dist/src/exports/services.install.d.ts.map +1 -0
  59. package/dist/src/exports/services.install.js +62 -0
  60. package/dist/src/exports/services.install.js.map +1 -0
  61. package/dist/src/exports/services.js +12 -32
  62. package/dist/src/exports/services.js.map +1 -1
  63. package/dist/src/exports/types.d.ts +1 -1
  64. package/dist/src/exports/types.d.ts.map +1 -1
  65. package/dist/src/index.d.ts +6 -6
  66. package/dist/src/index.d.ts.map +1 -1
  67. package/dist/src/index.js +8 -5
  68. package/dist/src/index.js.map +1 -1
  69. package/dist/src/install/agent-config-merge.json.d.ts +5 -4
  70. package/dist/src/install/agent-config-merge.json.d.ts.map +1 -1
  71. package/dist/src/install/agent-config-merge.json.js +10 -9
  72. package/dist/src/install/agent-config-merge.json.js.map +1 -1
  73. package/dist/src/install/agent-config-merge.types.d.ts +11 -1
  74. package/dist/src/install/agent-config-merge.types.d.ts.map +1 -1
  75. package/dist/src/install/agent-config-merge.types.js.map +1 -1
  76. package/dist/src/install/agent-harness-targets.d.ts +30 -2
  77. package/dist/src/install/agent-harness-targets.d.ts.map +1 -1
  78. package/dist/src/install/agent-harness-targets.js +17 -0
  79. package/dist/src/install/agent-harness-targets.js.map +1 -1
  80. package/dist/src/install/agent-manifest-path-guard.d.ts +28 -3
  81. package/dist/src/install/agent-manifest-path-guard.d.ts.map +1 -1
  82. package/dist/src/install/agent-manifest-path-guard.js +59 -3
  83. package/dist/src/install/agent-manifest-path-guard.js.map +1 -1
  84. package/dist/src/install/agent-manifest-path-guard.test.js +27 -1
  85. package/dist/src/install/agent-manifest-path-guard.test.js.map +1 -1
  86. package/dist/src/install/agent-pack-installer.antigravity-mcp.d.ts +74 -0
  87. package/dist/src/install/agent-pack-installer.antigravity-mcp.d.ts.map +1 -0
  88. package/dist/src/install/agent-pack-installer.antigravity-mcp.js +106 -0
  89. package/dist/src/install/agent-pack-installer.antigravity-mcp.js.map +1 -0
  90. package/dist/src/install/agent-pack-installer.antigravity-mcp.test.d.ts +2 -0
  91. package/dist/src/install/agent-pack-installer.antigravity-mcp.test.d.ts.map +1 -0
  92. package/dist/src/install/agent-pack-installer.antigravity-mcp.test.js +157 -0
  93. package/dist/src/install/agent-pack-installer.antigravity-mcp.test.js.map +1 -0
  94. package/dist/src/install/agent-pack-installer.cursor-mcp.d.ts +53 -0
  95. package/dist/src/install/agent-pack-installer.cursor-mcp.d.ts.map +1 -0
  96. package/dist/src/install/agent-pack-installer.cursor-mcp.js +207 -0
  97. package/dist/src/install/agent-pack-installer.cursor-mcp.js.map +1 -0
  98. package/dist/src/install/agent-pack-installer.cursor-mcp.test.d.ts +2 -0
  99. package/dist/src/install/agent-pack-installer.cursor-mcp.test.d.ts.map +1 -0
  100. package/dist/src/install/agent-pack-installer.cursor-mcp.test.js +285 -0
  101. package/dist/src/install/agent-pack-installer.cursor-mcp.test.js.map +1 -0
  102. package/dist/src/install/agent-pack-installer.d.ts +8 -0
  103. package/dist/src/install/agent-pack-installer.d.ts.map +1 -1
  104. package/dist/src/install/agent-pack-installer.entry.d.ts +120 -3
  105. package/dist/src/install/agent-pack-installer.entry.d.ts.map +1 -1
  106. package/dist/src/install/agent-pack-installer.entry.js +166 -3
  107. package/dist/src/install/agent-pack-installer.entry.js.map +1 -1
  108. package/dist/src/install/agent-pack-installer.js +97 -3
  109. package/dist/src/install/agent-pack-installer.js.map +1 -1
  110. package/dist/src/install/agent-pack-installer.types.d.ts +27 -0
  111. package/dist/src/install/agent-pack-installer.types.d.ts.map +1 -1
  112. package/dist/src/install/agent-pack-installer.types.js +6 -0
  113. package/dist/src/install/agent-pack-installer.types.js.map +1 -1
  114. package/dist/src/install/agent-pack-installer.workspace-scope.test.d.ts +2 -0
  115. package/dist/src/install/agent-pack-installer.workspace-scope.test.d.ts.map +1 -0
  116. package/dist/src/install/agent-pack-installer.workspace-scope.test.js +148 -0
  117. package/dist/src/install/agent-pack-installer.workspace-scope.test.js.map +1 -0
  118. package/dist/src/install/agent-pack-uninstaller.d.ts +18 -7
  119. package/dist/src/install/agent-pack-uninstaller.d.ts.map +1 -1
  120. package/dist/src/install/agent-pack-uninstaller.js +59 -9
  121. package/dist/src/install/agent-pack-uninstaller.js.map +1 -1
  122. package/dist/src/install/agent-pack-uninstaller.test.js +74 -1
  123. package/dist/src/install/agent-pack-uninstaller.test.js.map +1 -1
  124. package/dist/src/install/fan-out.d.ts.map +1 -1
  125. package/dist/src/install/fan-out.js +6 -0
  126. package/dist/src/install/fan-out.js.map +1 -1
  127. package/dist/src/install/index.d.ts +2 -0
  128. package/dist/src/install/index.d.ts.map +1 -1
  129. package/dist/src/install/index.js +2 -0
  130. package/dist/src/install/index.js.map +1 -1
  131. package/dist/src/install/workspace-scope.d.ts +207 -0
  132. package/dist/src/install/workspace-scope.d.ts.map +1 -0
  133. package/dist/src/install/workspace-scope.js +275 -0
  134. package/dist/src/install/workspace-scope.js.map +1 -0
  135. package/dist/src/install/workspace-scope.test.d.ts +2 -0
  136. package/dist/src/install/workspace-scope.test.d.ts.map +1 -0
  137. package/dist/src/install/workspace-scope.test.js +378 -0
  138. package/dist/src/install/workspace-scope.test.js.map +1 -0
  139. package/dist/src/security/__tests__/pathValidation.test.js +30 -1
  140. package/dist/src/security/__tests__/pathValidation.test.js.map +1 -1
  141. package/dist/src/services/SubagentGenerator.client-profiles.d.ts +258 -0
  142. package/dist/src/services/SubagentGenerator.client-profiles.d.ts.map +1 -0
  143. package/dist/src/services/SubagentGenerator.client-profiles.js +260 -0
  144. package/dist/src/services/SubagentGenerator.client-profiles.js.map +1 -0
  145. package/dist/src/services/SubagentGenerator.d.ts +19 -41
  146. package/dist/src/services/SubagentGenerator.d.ts.map +1 -1
  147. package/dist/src/services/SubagentGenerator.helpers.d.ts +64 -0
  148. package/dist/src/services/SubagentGenerator.helpers.d.ts.map +1 -0
  149. package/dist/src/services/SubagentGenerator.helpers.js +228 -0
  150. package/dist/src/services/SubagentGenerator.helpers.js.map +1 -0
  151. package/dist/src/services/SubagentGenerator.js +66 -208
  152. package/dist/src/services/SubagentGenerator.js.map +1 -1
  153. package/dist/src/services/SubagentGenerator.types.d.ts +45 -0
  154. package/dist/src/services/SubagentGenerator.types.d.ts.map +1 -0
  155. package/dist/src/services/SubagentGenerator.types.js +14 -0
  156. package/dist/src/services/SubagentGenerator.types.js.map +1 -0
  157. package/dist/src/services/TransformationService.d.ts +18 -61
  158. package/dist/src/services/TransformationService.d.ts.map +1 -1
  159. package/dist/src/services/TransformationService.js +29 -17
  160. package/dist/src/services/TransformationService.js.map +1 -1
  161. package/dist/src/services/TransformationService.types.d.ts +74 -0
  162. package/dist/src/services/TransformationService.types.d.ts.map +1 -0
  163. package/dist/src/services/TransformationService.types.js +8 -0
  164. package/dist/src/services/TransformationService.types.js.map +1 -0
  165. package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.d.ts +5 -0
  166. package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.d.ts.map +1 -0
  167. package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.js +72 -0
  168. package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.js.map +1 -0
  169. package/dist/src/services/__tests__/SubagentGenerator.helpers.test.d.ts +2 -0
  170. package/dist/src/services/__tests__/SubagentGenerator.helpers.test.d.ts.map +1 -0
  171. package/dist/src/services/__tests__/SubagentGenerator.helpers.test.js +61 -0
  172. package/dist/src/services/__tests__/SubagentGenerator.helpers.test.js.map +1 -0
  173. package/dist/src/services/__tests__/SubagentGenerator.test.js +155 -0
  174. package/dist/src/services/__tests__/SubagentGenerator.test.js.map +1 -1
  175. package/dist/src/services/__tests__/TransformationService.test.js +48 -0
  176. package/dist/src/services/__tests__/TransformationService.test.js.map +1 -1
  177. package/dist/src/services/agent-pack/agent-pack.test.js +1 -0
  178. package/dist/src/services/agent-pack/agent-pack.test.js.map +1 -1
  179. package/dist/src/services/agent-pack/prompt-source.d.ts +1 -1
  180. package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -1
  181. package/dist/src/services/agent-pack/prompt-source.js +10 -3
  182. package/dist/src/services/agent-pack/prompt-source.js.map +1 -1
  183. package/dist/src/services/agent-pack/types.d.ts +26 -2
  184. package/dist/src/services/agent-pack/types.d.ts.map +1 -1
  185. package/dist/src/services/agent-pack/types.js +13 -0
  186. package/dist/src/services/agent-pack/types.js.map +1 -1
  187. package/dist/src/services/agent-tool-profile.d.ts.map +1 -1
  188. package/dist/src/services/agent-tool-profile.js +7 -0
  189. package/dist/src/services/agent-tool-profile.js.map +1 -1
  190. package/dist/src/services/agent-tool-profile.test.js +2 -2
  191. package/dist/src/services/skill-content-comparison.d.ts +71 -0
  192. package/dist/src/services/skill-content-comparison.d.ts.map +1 -0
  193. package/dist/src/services/skill-content-comparison.js +90 -0
  194. package/dist/src/services/skill-content-comparison.js.map +1 -0
  195. package/dist/src/services/skill-content-comparison.test.d.ts +6 -0
  196. package/dist/src/services/skill-content-comparison.test.d.ts.map +1 -0
  197. package/dist/src/services/skill-content-comparison.test.js +83 -0
  198. package/dist/src/services/skill-content-comparison.test.js.map +1 -0
  199. package/dist/src/services/skill-identity-classification.d.ts +202 -0
  200. package/dist/src/services/skill-identity-classification.d.ts.map +1 -0
  201. package/dist/src/services/skill-identity-classification.js +295 -0
  202. package/dist/src/services/skill-identity-classification.js.map +1 -0
  203. package/dist/src/services/skill-identity-classification.test.d.ts +6 -0
  204. package/dist/src/services/skill-identity-classification.test.d.ts.map +1 -0
  205. package/dist/src/services/skill-identity-classification.test.js +314 -0
  206. package/dist/src/services/skill-identity-classification.test.js.map +1 -0
  207. package/dist/src/services/skill-installation.content.d.ts.map +1 -1
  208. package/dist/src/services/skill-installation.content.js +6 -1
  209. package/dist/src/services/skill-installation.content.js.map +1 -1
  210. package/dist/src/services/skill-installation.helpers.d.ts +8 -15
  211. package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
  212. package/dist/src/services/skill-installation.helpers.js +11 -105
  213. package/dist/src/services/skill-installation.helpers.js.map +1 -1
  214. package/dist/src/services/skill-installation.helpers.test.js +106 -1
  215. package/dist/src/services/skill-installation.helpers.test.js.map +1 -1
  216. package/dist/src/services/skill-installation.service.js +1 -1
  217. package/dist/src/services/skill-installation.service.js.map +1 -1
  218. package/dist/src/services/skill-installation.types.d.ts +33 -0
  219. package/dist/src/services/skill-installation.types.d.ts.map +1 -1
  220. package/dist/src/services/skill-installation.types.js.map +1 -1
  221. package/dist/src/services/skill-installation.uninstall.d.ts +84 -0
  222. package/dist/src/services/skill-installation.uninstall.d.ts.map +1 -0
  223. package/dist/src/services/skill-installation.uninstall.js +252 -0
  224. package/dist/src/services/skill-installation.uninstall.js.map +1 -0
  225. package/dist/src/services/skill-manifest.d.ts +41 -0
  226. package/dist/src/services/skill-manifest.d.ts.map +1 -1
  227. package/dist/src/services/skill-manifest.js +93 -0
  228. package/dist/src/services/skill-manifest.js.map +1 -1
  229. package/dist/src/services/skill-manifest.test.js +27 -0
  230. package/dist/src/services/skill-manifest.test.js.map +1 -1
  231. package/dist/src/sync/SyncEngine.d.ts.map +1 -1
  232. package/dist/src/sync/SyncEngine.js +69 -77
  233. package/dist/src/sync/SyncEngine.js.map +1 -1
  234. package/dist/src/telemetry/agent-marker.d.ts +8 -0
  235. package/dist/src/telemetry/agent-marker.d.ts.map +1 -1
  236. package/dist/src/telemetry/agent-marker.js +7 -0
  237. package/dist/src/telemetry/agent-marker.js.map +1 -1
  238. package/dist/src/telemetry/agent-marker.test.js +7 -1
  239. package/dist/src/telemetry/agent-marker.test.js.map +1 -1
  240. package/dist/src/telemetry/index.d.ts +1 -1
  241. package/dist/src/telemetry/index.d.ts.map +1 -1
  242. package/dist/src/telemetry/index.js +1 -1
  243. package/dist/src/telemetry/index.js.map +1 -1
  244. package/dist/src/telemetry/wrap.d.ts +6 -0
  245. package/dist/src/telemetry/wrap.d.ts.map +1 -1
  246. package/dist/src/telemetry/wrap.js +65 -10
  247. package/dist/src/telemetry/wrap.js.map +1 -1
  248. package/dist/src/telemetry/wrap.test.js +81 -1
  249. package/dist/src/telemetry/wrap.test.js.map +1 -1
  250. package/dist/src/telemetry/wrap.tool-call-sink.test.d.ts +26 -0
  251. package/dist/src/telemetry/wrap.tool-call-sink.test.d.ts.map +1 -0
  252. package/dist/src/telemetry/wrap.tool-call-sink.test.js +162 -0
  253. package/dist/src/telemetry/wrap.tool-call-sink.test.js.map +1 -0
  254. package/dist/src/types/skill.d.ts +9 -1
  255. package/dist/src/types/skill.d.ts.map +1 -1
  256. package/dist/src/utils/index.d.ts +1 -1
  257. package/dist/src/utils/index.d.ts.map +1 -1
  258. package/dist/src/utils/index.js +1 -1
  259. package/dist/src/utils/index.js.map +1 -1
  260. package/dist/src/utils/version-check.d.ts +61 -0
  261. package/dist/src/utils/version-check.d.ts.map +1 -1
  262. package/dist/src/utils/version-check.js +78 -1
  263. package/dist/src/utils/version-check.js.map +1 -1
  264. package/dist/src/utils/version-check.test.js +130 -1
  265. package/dist/src/utils/version-check.test.js.map +1 -1
  266. package/dist/tests/db/migration-runner-race.test.js +19 -9
  267. package/dist/tests/db/migration-runner-race.test.js.map +1 -1
  268. package/dist/tests/install/fan-out.test.js +27 -0
  269. package/dist/tests/install/fan-out.test.js.map +1 -1
  270. package/dist/tests/skill-scanner/allowlist.test.js +7 -1
  271. package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
  272. package/dist/tests/sync/SyncEngine.abort.test.js +15 -11
  273. package/dist/tests/sync/SyncEngine.abort.test.js.map +1 -1
  274. package/dist/tests/sync/SyncEngine.status.test.js +1 -1
  275. package/dist/tests/sync/SyncEngine.status.test.js.map +1 -1
  276. package/dist/tests/sync/SyncEngine.test.d.ts +11 -2
  277. package/dist/tests/sync/SyncEngine.test.d.ts.map +1 -1
  278. package/dist/tests/sync/SyncEngine.test.js +164 -13
  279. package/dist/tests/sync/SyncEngine.test.js.map +1 -1
  280. package/dist/tests/unit/migrations/migration-v18.test.d.ts +16 -0
  281. package/dist/tests/unit/migrations/migration-v18.test.d.ts.map +1 -0
  282. package/dist/tests/unit/migrations/migration-v18.test.js +192 -0
  283. package/dist/tests/unit/migrations/migration-v18.test.js.map +1 -0
  284. package/dist/tests/unit/services/skill-installation.content.test.js +65 -1
  285. package/dist/tests/unit/services/skill-installation.content.test.js.map +1 -1
  286. package/dist/tests/unit/services/skill-installation.service.test.js +9 -8
  287. package/dist/tests/unit/services/skill-installation.service.test.js.map +1 -1
  288. package/dist/tests/unit/sync-engine.source-aware.test.js +5 -5
  289. package/dist/tests/unit/sync-engine.source-aware.test.js.map +1 -1
  290. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"skill-installation.types.js","sourceRoot":"","sources":["../../../src/services/skill-installation.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyQH,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,iDAAiD;AACjD,MAAM,CAAC,MAAM,0BAA0B,GAAsC;IAC3E,QAAQ,EAAE;QACR,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,SAAS;KAC5B;IACD,OAAO,EAAE;QACP,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,SAAS;KAC5B;IACD,SAAS,EAAE;QACT,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,SAAS;KAC5B;IACD,KAAK,EAAE;QACL,aAAa,EAAE,GAAG;QAClB,gBAAgB,EAAE,UAAU;KAC7B;IACD,YAAY,EAAE;QACZ,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,OAAO;KAC1B;IACD,OAAO,EAAE;QACP,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,OAAO;KAC1B;IACD,6BAA6B;IAC7B,QAAQ,EAAE;QACR,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,SAAS;KAC5B;IACD,UAAU,EAAE;QACV,aAAa,EAAE,EAAE,EAAE,+DAA+D;QAClF,gBAAgB,EAAE,OAAO;KAC1B;CACF,CAAA"}
1
+ {"version":3,"file":"skill-installation.types.js","sourceRoot":"","sources":["../../../src/services/skill-installation.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0SH,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,iDAAiD;AACjD,MAAM,CAAC,MAAM,0BAA0B,GAAsC;IAC3E,QAAQ,EAAE;QACR,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,SAAS;KAC5B;IACD,OAAO,EAAE;QACP,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,SAAS;KAC5B;IACD,SAAS,EAAE;QACT,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,SAAS;KAC5B;IACD,KAAK,EAAE;QACL,aAAa,EAAE,GAAG;QAClB,gBAAgB,EAAE,UAAU;KAC7B;IACD,YAAY,EAAE;QACZ,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,OAAO;KAC1B;IACD,OAAO,EAAE;QACP,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,OAAO;KAC1B;IACD,6BAA6B;IAC7B,QAAQ,EAAE;QACR,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,SAAS;KAC5B;IACD,UAAU,EAAE;QACV,aAAa,EAAE,EAAE,EAAE,+DAA+D;QAClF,gBAAgB,EAAE,OAAO;KAC1B;CACF,CAAA"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @fileoverview `performUninstall` — manifest-aware skill removal, including
3
+ * ADR-139 (SMI-6274 Wave 4)'s untracked-skill adoption.
4
+ * @module @skillsmith/core/services/skill-installation.uninstall
5
+ *
6
+ * Split out of `skill-installation.helpers.ts` to stay under the 500-line
7
+ * standard once ADR-139's adoption logic was added — mirrors the existing
8
+ * `skill-installation.io.ts` sibling-split convention. `performUninstall`
9
+ * has exactly one internal consumer (`skill-installation.service.ts`) and
10
+ * is not part of `@skillsmith/core`'s public export surface.
11
+ */
12
+ import type { SkillDependencyRepository } from '../repositories/SkillDependencyRepository.js';
13
+ import type { ProgressCallback, UninstallResult } from './skill-installation.types.js';
14
+ import type { ManifestManager } from './skill-manifest.js';
15
+ import { type ClientId } from '../install/paths.js';
16
+ import type { SkillManifestEntry } from './skill-installation.types.js';
17
+ /**
18
+ * ADR-139 (SMI-6274 Wave 4): build a manifest entry for a skill found on
19
+ * disk with no manifest record — "adoption." Every field is reconstructed
20
+ * from what is directly observable on disk; fields that genuinely cannot
21
+ * be recovered this way (the originating registry version/source) are
22
+ * recorded as `'unknown'` rather than guessed, so a later `update` sees
23
+ * `'unknown'` and falls through to confidence-gated source recovery
24
+ * instead of silently trusting a wrong version (ADR-139 point 1).
25
+ *
26
+ * Exported (not just used by {@link performUninstall}) so `update`'s own
27
+ * adoption path (`packages/cli/src/commands/manage.update.ts`) reuses the
28
+ * IDENTICAL reconstruction logic rather than a second, driftable copy —
29
+ * GPT-5.6-Sol PR review, ADR-139 follow-up: `update` previously never
30
+ * adopted an untracked skill at all, only `remove` did.
31
+ */
32
+ export declare function buildAdoptedManifestEntry(skillName: string, installPath: string): Promise<SkillManifestEntry>;
33
+ /**
34
+ * ADR-139 (SMI-6274 Wave 4) / GPT-5.6-Sol PR review round 4: adopt an
35
+ * untracked skill (present on disk, no manifest entry) by writing a
36
+ * reconstructed manifest entry — race-safe against a concurrent writer
37
+ * (e.g. a real `install()`, or another concurrent `update()`) tracking the
38
+ * SAME skill between the caller's own (unlocked) manifest read and this
39
+ * call's lock-acquired write.
40
+ *
41
+ * Single shared implementation for BOTH adoption call sites —
42
+ * {@link performUninstall} (this file, calls it directly) and
43
+ * `getSkillDiff` (`packages/cli/src/commands/manage.update.ts`, via this
44
+ * function's re-export at the `@skillsmith/core` package root). Round 3's
45
+ * confirmation review found a CLI-package-local copy of this exact
46
+ * race-safety logic (`manage.update.helpers.ts`'s now-removed
47
+ * `adoptUntrackedSkill`) had drifted from `performUninstall`'s own
48
+ * still-non-race-safe inline version — importing a CLI file into `core`
49
+ * would be a layering violation, so the fix moves the ONE race-safe
50
+ * implementation here, alongside {@link buildAdoptedManifestEntry}, instead
51
+ * of maintaining two copies of the same logic.
52
+ *
53
+ * The `updateSafely()` callback checks `current.installedSkills[manifestKey]`
54
+ * INSIDE the callback, against the FRESH, lock-acquired state it's handed —
55
+ * never a caller's own stale, unlocked read: if a real entry is already
56
+ * there by the time the lock is held, that entry wins and the guessed one
57
+ * is discarded entirely (never written) — a concurrent legitimate
58
+ * `install()` must never be clobbered by a same-tick adoption's guess.
59
+ *
60
+ * Returns the entry now in the manifest (freshly adopted, or a real one a
61
+ * concurrent writer got there first with) plus whether OUR write happened,
62
+ * or `{ adoptionError }` if the write itself failed — naming the skill,
63
+ * path, and manifest (via `manifest.path`), per ADR-139 point 1's stated
64
+ * failure contract.
65
+ */
66
+ export declare function adoptUntrackedSkillEntry(skillName: string, skillDirName: string, installPath: string, manifestKey: string, manifest: ManifestManager): Promise<{
67
+ entry: SkillManifestEntry;
68
+ adopted: boolean;
69
+ } | {
70
+ adoptionError: string;
71
+ }>;
72
+ /** Perform skill uninstall with manifest awareness and orphan fallback. */
73
+ export declare function performUninstall(params: {
74
+ skillName: string;
75
+ force: boolean;
76
+ skillsDir: string;
77
+ manifest: ManifestManager;
78
+ skillDependencyRepo: SkillDependencyRepository;
79
+ onProgress: ProgressCallback;
80
+ /** SMI-5894 Wave 1 Step 3: defaults to the canonical client for callers
81
+ * that don't yet resolve a client (preserves pre-existing behavior). */
82
+ client?: ClientId;
83
+ }): Promise<UninstallResult>;
84
+ //# sourceMappingURL=skill-installation.uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-installation.uninstall.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAA;AAC7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAGtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAEvE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAsC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAmCtF;AAED,2EAA2E;AAC3E,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,eAAe,CAAA;IACzB,mBAAmB,EAAE,yBAAyB,CAAA;IAC9C,UAAU,EAAE,gBAAgB,CAAA;IAC5B;6EACyE;IACzE,MAAM,CAAC,EAAE,QAAQ,CAAA;CAClB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgI3B"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * @fileoverview `performUninstall` — manifest-aware skill removal, including
3
+ * ADR-139 (SMI-6274 Wave 4)'s untracked-skill adoption.
4
+ * @module @skillsmith/core/services/skill-installation.uninstall
5
+ *
6
+ * Split out of `skill-installation.helpers.ts` to stay under the 500-line
7
+ * standard once ADR-139's adoption logic was added — mirrors the existing
8
+ * `skill-installation.io.ts` sibling-split convention. `performUninstall`
9
+ * has exactly one internal consumer (`skill-installation.service.ts`) and
10
+ * is not part of `@skillsmith/core`'s public export surface.
11
+ */
12
+ import * as fs from 'fs/promises';
13
+ import * as path from 'path';
14
+ import { checkForModifications } from './skill-installation.io.js';
15
+ import { hashContent, manifestKeyFor } from './skill-installation.helpers.js';
16
+ import { CANONICAL_CLIENT } from '../install/paths.js';
17
+ /**
18
+ * ADR-139 (SMI-6274 Wave 4): build a manifest entry for a skill found on
19
+ * disk with no manifest record — "adoption." Every field is reconstructed
20
+ * from what is directly observable on disk; fields that genuinely cannot
21
+ * be recovered this way (the originating registry version/source) are
22
+ * recorded as `'unknown'` rather than guessed, so a later `update` sees
23
+ * `'unknown'` and falls through to confidence-gated source recovery
24
+ * instead of silently trusting a wrong version (ADR-139 point 1).
25
+ *
26
+ * Exported (not just used by {@link performUninstall}) so `update`'s own
27
+ * adoption path (`packages/cli/src/commands/manage.update.ts`) reuses the
28
+ * IDENTICAL reconstruction logic rather than a second, driftable copy —
29
+ * GPT-5.6-Sol PR review, ADR-139 follow-up: `update` previously never
30
+ * adopted an untracked skill at all, only `remove` did.
31
+ */
32
+ export async function buildAdoptedManifestEntry(skillName, installPath) {
33
+ const dirStat = await fs.stat(installPath);
34
+ // installedAt is set to the NEWEST top-level file mtime (falling back to
35
+ // the directory's own mtime when it has no files), mirroring exactly the
36
+ // scan `checkForModifications` (skill-installation.io.ts) performs — a
37
+ // directory's own mtime can legitimately be OLDER than a file inside it
38
+ // last touched, which would otherwise make an adopted skill look
39
+ // "modified" (and thus require force=true) on the very next removal
40
+ // attempt, immediately after adoption.
41
+ let newestMtimeMs = dirStat.mtime.getTime();
42
+ try {
43
+ const entries = await fs.readdir(installPath, { withFileTypes: true });
44
+ for (const entry of entries) {
45
+ if (!entry.isFile())
46
+ continue;
47
+ const fileStat = await fs.stat(path.join(installPath, entry.name));
48
+ if (fileStat.mtime.getTime() > newestMtimeMs)
49
+ newestMtimeMs = fileStat.mtime.getTime();
50
+ }
51
+ }
52
+ catch {
53
+ // Fall back to the directory's own mtime — best-effort.
54
+ }
55
+ const nowIso = new Date(newestMtimeMs).toISOString();
56
+ let contentHash;
57
+ try {
58
+ const skillMd = await fs.readFile(path.join(installPath, 'SKILL.md'), 'utf-8');
59
+ contentHash = hashContent(skillMd);
60
+ }
61
+ catch {
62
+ contentHash = undefined;
63
+ }
64
+ return {
65
+ id: skillName,
66
+ name: skillName,
67
+ version: 'unknown',
68
+ source: 'unknown',
69
+ installPath,
70
+ installedAt: nowIso,
71
+ lastUpdated: nowIso,
72
+ ...(contentHash !== undefined && { contentHash }),
73
+ };
74
+ }
75
+ /**
76
+ * ADR-139 (SMI-6274 Wave 4) / GPT-5.6-Sol PR review round 4: adopt an
77
+ * untracked skill (present on disk, no manifest entry) by writing a
78
+ * reconstructed manifest entry — race-safe against a concurrent writer
79
+ * (e.g. a real `install()`, or another concurrent `update()`) tracking the
80
+ * SAME skill between the caller's own (unlocked) manifest read and this
81
+ * call's lock-acquired write.
82
+ *
83
+ * Single shared implementation for BOTH adoption call sites —
84
+ * {@link performUninstall} (this file, calls it directly) and
85
+ * `getSkillDiff` (`packages/cli/src/commands/manage.update.ts`, via this
86
+ * function's re-export at the `@skillsmith/core` package root). Round 3's
87
+ * confirmation review found a CLI-package-local copy of this exact
88
+ * race-safety logic (`manage.update.helpers.ts`'s now-removed
89
+ * `adoptUntrackedSkill`) had drifted from `performUninstall`'s own
90
+ * still-non-race-safe inline version — importing a CLI file into `core`
91
+ * would be a layering violation, so the fix moves the ONE race-safe
92
+ * implementation here, alongside {@link buildAdoptedManifestEntry}, instead
93
+ * of maintaining two copies of the same logic.
94
+ *
95
+ * The `updateSafely()` callback checks `current.installedSkills[manifestKey]`
96
+ * INSIDE the callback, against the FRESH, lock-acquired state it's handed —
97
+ * never a caller's own stale, unlocked read: if a real entry is already
98
+ * there by the time the lock is held, that entry wins and the guessed one
99
+ * is discarded entirely (never written) — a concurrent legitimate
100
+ * `install()` must never be clobbered by a same-tick adoption's guess.
101
+ *
102
+ * Returns the entry now in the manifest (freshly adopted, or a real one a
103
+ * concurrent writer got there first with) plus whether OUR write happened,
104
+ * or `{ adoptionError }` if the write itself failed — naming the skill,
105
+ * path, and manifest (via `manifest.path`), per ADR-139 point 1's stated
106
+ * failure contract.
107
+ */
108
+ export async function adoptUntrackedSkillEntry(skillName, skillDirName, installPath, manifestKey, manifest) {
109
+ const adoptedEntry = await buildAdoptedManifestEntry(skillDirName, installPath);
110
+ let resolvedEntry = adoptedEntry;
111
+ let adopted = true;
112
+ try {
113
+ await manifest.updateSafely((current) => {
114
+ const existing = current.installedSkills?.[manifestKey];
115
+ if (existing) {
116
+ resolvedEntry = existing;
117
+ adopted = false;
118
+ return current;
119
+ }
120
+ resolvedEntry = adoptedEntry;
121
+ adopted = true;
122
+ return {
123
+ ...current,
124
+ installedSkills: { ...current.installedSkills, [manifestKey]: adoptedEntry },
125
+ };
126
+ });
127
+ }
128
+ catch (adoptError) {
129
+ return {
130
+ adoptionError: 'Failed to adopt untracked skill "' +
131
+ skillName +
132
+ '" at ' +
133
+ installPath +
134
+ ' into manifest ' +
135
+ manifest.path +
136
+ ': ' +
137
+ (adoptError instanceof Error ? adoptError.message : String(adoptError)),
138
+ };
139
+ }
140
+ return { entry: resolvedEntry, adopted };
141
+ }
142
+ /** Perform skill uninstall with manifest awareness and orphan fallback. */
143
+ export async function performUninstall(params) {
144
+ const { skillName, force, skillsDir, manifest, skillDependencyRepo, onProgress, client = CANONICAL_CLIENT, } = params;
145
+ const manifestKey = manifestKeyFor(skillName, client);
146
+ try {
147
+ onProgress('manifest', 'Loading manifest');
148
+ const manifestData = await manifest.load();
149
+ let skillEntry = manifestData.installedSkills[manifestKey];
150
+ let adopted = false;
151
+ if (!skillEntry) {
152
+ const potentialPath = path.join(skillsDir, skillName);
153
+ try {
154
+ await fs.access(potentialPath);
155
+ }
156
+ catch {
157
+ return { success: false, skillName, message: 'Skill "' + skillName + '" is not installed.' };
158
+ }
159
+ // ADR-139 (SMI-6274 Wave 4): a skill present on disk with no manifest
160
+ // entry is ADOPTED — reconciled by writing a manifest entry derived
161
+ // from disk — rather than requiring force=true just to remove it (the
162
+ // previous behavior). This closes the "untracked install" recovery
163
+ // gap ADR-139 point 1 requires: `update`/`remove` must not fail
164
+ // obscurely on an untracked skill.
165
+ //
166
+ // GPT-5.6-Sol PR review round 4: routed through the shared, race-safe
167
+ // {@link adoptUntrackedSkillEntry} instead of an inline write — this
168
+ // call site previously wrote the guessed entry unconditionally,
169
+ // without re-checking the manifest state under lock, so a concurrent
170
+ // real `install()` landing in that window could be silently
171
+ // clobbered. `adopted` now reflects whether OUR guess actually won
172
+ // (false when a concurrent writer's real entry was found instead).
173
+ onProgress('adopt', 'Adopting untracked skill (no manifest entry found)');
174
+ const adoptResult = await adoptUntrackedSkillEntry(skillName, skillName, potentialPath, manifestKey, manifest);
175
+ if ('adoptionError' in adoptResult) {
176
+ // Only if adoption itself fails does the command error — naming the
177
+ // skill, the path, and the manifest it tried to write (ADR-139
178
+ // point 1's stated failure contract).
179
+ return { success: false, skillName, message: adoptResult.adoptionError };
180
+ }
181
+ skillEntry = adoptResult.entry;
182
+ adopted = adoptResult.adopted;
183
+ }
184
+ const installPath = skillEntry.installPath;
185
+ if (!force) {
186
+ onProgress('check', 'Checking for modifications');
187
+ const modified = await checkForModifications(installPath, skillEntry.installedAt);
188
+ if (modified) {
189
+ return {
190
+ success: false,
191
+ skillName,
192
+ message: 'Skill "' +
193
+ skillName +
194
+ '" has been modified since installation. Use force=true to remove anyway.',
195
+ warning: 'Local modifications will be lost if you force uninstall.',
196
+ };
197
+ }
198
+ }
199
+ onProgress('remove', 'Removing skill directory');
200
+ try {
201
+ await fs.rm(installPath, { recursive: true, force: true });
202
+ }
203
+ catch (error) {
204
+ if (error.code !== 'ENOENT')
205
+ throw error;
206
+ }
207
+ try {
208
+ skillDependencyRepo.clearAll(skillEntry.id);
209
+ }
210
+ catch {
211
+ // Table may not exist pre-migration
212
+ }
213
+ onProgress('manifest', 'Updating manifest');
214
+ // SMI-6007: route the final mutation through updateSafely() (lock +
215
+ // fresh re-read + save) instead of saving the `manifestData` snapshot
216
+ // loaded above. That snapshot can be stale by the time we get here —
217
+ // filesystem cleanup and the dependency-repo clear happened in between —
218
+ // so saving it directly could clobber an *unrelated* manifest entry
219
+ // written by a concurrent install/uninstall in that window. This closes
220
+ // that lost-update hazard for entries other than this one.
221
+ //
222
+ // Scope: this does NOT make the full uninstall sequence (lookup ->
223
+ // filesystem cleanup -> manifest mutation) atomic. A concurrent
224
+ // operation racing on the SAME key (e.g. a reinstall of this exact
225
+ // skill while its uninstall is mid-flight) can still leave disk and
226
+ // manifest inconsistent — only the unrelated-entry data loss is fixed
227
+ // here, not full transactional safety across the whole method.
228
+ await manifest.updateSafely((current) => {
229
+ const next = { ...current, installedSkills: { ...current.installedSkills } };
230
+ delete next.installedSkills[manifestKey];
231
+ return next;
232
+ });
233
+ onProgress('done', 'Uninstall complete');
234
+ return {
235
+ success: true,
236
+ skillName,
237
+ message: 'Skill "' + skillName + '" has been uninstalled successfully.',
238
+ removedPath: installPath,
239
+ ...(adopted && {
240
+ warning: 'This skill had no manifest entry (untracked) — it was adopted from disk state before removal.',
241
+ }),
242
+ };
243
+ }
244
+ catch (error) {
245
+ return {
246
+ success: false,
247
+ skillName,
248
+ message: error instanceof Error ? error.message : 'Unknown error during uninstall',
249
+ };
250
+ }
251
+ }
252
+ //# sourceMappingURL=skill-installation.uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-installation.uninstall.js","sourceRoot":"","sources":["../../../src/services/skill-installation.uninstall.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,39 @@
4
4
  * @see SMI-3483: Extracted from skill-installation.service.ts to meet 500-line standard
5
5
  */
6
6
  import type { SkillManifest } from './skill-installation.types.js';
7
+ /**
8
+ * SMI-6343 Wave 1 — runtime backstop for the test-fixture manifest leak.
9
+ *
10
+ * `vitest.setup.ts` redirects `$HOME`/`%USERPROFILE%` to a per-run temp
11
+ * directory so that homedir-derived manifest paths land in a sandbox. This
12
+ * guard is the defense-in-depth half: if a test ever resolves a manifest path
13
+ * under the developer's REAL home anyway — a hardcoded `/Users/<me>/...`, a
14
+ * captured-before-setup constant, a config that somehow skipped the preset —
15
+ * it fails loudly at the write boundary instead of silently corrupting
16
+ * `~/.skillsmith/manifest.json`.
17
+ *
18
+ * Ground truth for "the real home" is `SKILLSMITH_TEST_REAL_HOME`, captured by
19
+ * `vitest.setup.ts` BEFORE it installs the sandbox. `os.homedir()` is useless
20
+ * here (it returns the sandbox once the override is in place); `os.userInfo()`
21
+ * reads the password-file entry and ignores `$HOME`, so it is the fallback for
22
+ * the case where the env var is missing — which itself means the sandbox never
23
+ * ran, exactly when the guard matters most.
24
+ *
25
+ * Only active under `process.env.VITEST`. Production code paths are untouched.
26
+ *
27
+ * Exported (adversarial-review finding, SMI-6343 follow-up) because
28
+ * `ManifestManager` is not the only homedir-defaulting manifest writer in the
29
+ * repo — `packages/mcp-server/src/tools/install.helpers.manifest.ts`,
30
+ * `packages/cli/src/utils/manifest.ts`, and
31
+ * `packages/core/src/install/fan-out.ts` each have their own raw-`fs`
32
+ * save/lock functions with the identical `os.homedir()`-derived path and no
33
+ * override parameter, so they need the same guard. Reusing this one function
34
+ * (rather than three independent copies) is the CLAUDE.md-documented
35
+ * duplicate-security-gate fix: one gate implementation is far harder to
36
+ * regress than four.
37
+ */
38
+ export declare function realHomeUnderTest(): string | undefined;
39
+ export declare function assertNotRealUserHome(manifestPath: string, operation: string): void;
7
40
  /**
8
41
  * Manages the skill manifest file (~/.skillsmith/manifest.json) with
9
42
  * file-level locking for concurrent access safety (CLI + MCP server).
@@ -11,6 +44,14 @@ import type { SkillManifest } from './skill-installation.types.js';
11
44
  export declare class ManifestManager {
12
45
  private readonly manifestPath;
13
46
  constructor(manifestPath: string);
47
+ /**
48
+ * ADR-139 (SMI-6274 Wave 4): the manifest path this instance was
49
+ * constructed with — read-only accessor for callers that need to name it
50
+ * in a diagnostic message (e.g. `performUninstall`'s adoption-failure
51
+ * error, which must name the skill, the path, AND the manifest it tried
52
+ * to write, per ADR-139 point 1).
53
+ */
54
+ get path(): string;
14
55
  /**
15
56
  * SMI-6007: distinguishes "no manifest yet" (ENOENT — legitimate first-run
16
57
  * case, safe to synthesize an empty manifest) from "a manifest file exists
@@ -1 +1 @@
1
- {"version":3,"file":"skill-manifest.d.ts","sourceRoot":"","sources":["../../../src/services/skill-manifest.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAKlE;;;GAGG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,MAAM;IAEjD;;;;;;;;;OASG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;IAuBpC;;;;;;;;;;OAUG;IACG,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB5C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B5B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,YAAY,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAUxF"}
1
+ {"version":3,"file":"skill-manifest.d.ts","sourceRoot":"","sources":["../../../src/services/skill-manifest.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAKlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAWtD;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAyBnF;AAED;;;GAGG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,MAAM;IAEjD;;;;;;OAMG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;;OASG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;IAuBpC;;;;;;;;;;OAUG;IACG,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB5C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC5B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B,YAAY,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAUxF"}
@@ -4,10 +4,80 @@
4
4
  * @see SMI-3483: Extracted from skill-installation.service.ts to meet 500-line standard
5
5
  */
6
6
  import * as fs from 'fs/promises';
7
+ import * as os from 'os';
7
8
  import * as path from 'path';
8
9
  import { randomUUID } from 'node:crypto';
9
10
  const MANIFEST_LOCK_TIMEOUT_MS = 30000;
10
11
  const MANIFEST_LOCK_RETRY_MS = 100;
12
+ /**
13
+ * SMI-6343 Wave 1 — runtime backstop for the test-fixture manifest leak.
14
+ *
15
+ * `vitest.setup.ts` redirects `$HOME`/`%USERPROFILE%` to a per-run temp
16
+ * directory so that homedir-derived manifest paths land in a sandbox. This
17
+ * guard is the defense-in-depth half: if a test ever resolves a manifest path
18
+ * under the developer's REAL home anyway — a hardcoded `/Users/<me>/...`, a
19
+ * captured-before-setup constant, a config that somehow skipped the preset —
20
+ * it fails loudly at the write boundary instead of silently corrupting
21
+ * `~/.skillsmith/manifest.json`.
22
+ *
23
+ * Ground truth for "the real home" is `SKILLSMITH_TEST_REAL_HOME`, captured by
24
+ * `vitest.setup.ts` BEFORE it installs the sandbox. `os.homedir()` is useless
25
+ * here (it returns the sandbox once the override is in place); `os.userInfo()`
26
+ * reads the password-file entry and ignores `$HOME`, so it is the fallback for
27
+ * the case where the env var is missing — which itself means the sandbox never
28
+ * ran, exactly when the guard matters most.
29
+ *
30
+ * Only active under `process.env.VITEST`. Production code paths are untouched.
31
+ *
32
+ * Exported (adversarial-review finding, SMI-6343 follow-up) because
33
+ * `ManifestManager` is not the only homedir-defaulting manifest writer in the
34
+ * repo — `packages/mcp-server/src/tools/install.helpers.manifest.ts`,
35
+ * `packages/cli/src/utils/manifest.ts`, and
36
+ * `packages/core/src/install/fan-out.ts` each have their own raw-`fs`
37
+ * save/lock functions with the identical `os.homedir()`-derived path and no
38
+ * override parameter, so they need the same guard. Reusing this one function
39
+ * (rather than three independent copies) is the CLAUDE.md-documented
40
+ * duplicate-security-gate fix: one gate implementation is far harder to
41
+ * regress than four.
42
+ */
43
+ export function realHomeUnderTest() {
44
+ const captured = process.env.SKILLSMITH_TEST_REAL_HOME;
45
+ if (captured)
46
+ return captured;
47
+ try {
48
+ return os.userInfo().homedir;
49
+ }
50
+ catch {
51
+ // Some containers have no passwd entry for the effective uid. Without a
52
+ // ground truth there is nothing to compare against — degrade to no guard
53
+ // rather than throwing from a guard.
54
+ return undefined;
55
+ }
56
+ }
57
+ export function assertNotRealUserHome(manifestPath, operation) {
58
+ if (!process.env.VITEST)
59
+ return;
60
+ const realHome = realHomeUnderTest();
61
+ if (!realHome)
62
+ return;
63
+ const resolvedHome = path.resolve(realHome);
64
+ const resolvedPath = path.resolve(manifestPath);
65
+ const isUnderRealHome = resolvedPath === resolvedHome || resolvedPath.startsWith(resolvedHome + path.sep);
66
+ if (!isUnderRealHome)
67
+ return;
68
+ throw new Error('SMI-6343: refusing to ' +
69
+ operation +
70
+ ' a manifest inside the real user home during a test run.\n' +
71
+ ' Offending path: ' +
72
+ resolvedPath +
73
+ '\n Real home: ' +
74
+ resolvedHome +
75
+ '\n' +
76
+ 'Tests must never touch ~/.skillsmith/manifest.json. Pass an explicit ' +
77
+ 'manifestPath (e.g. from createIsolatedManifestPath() in ' +
78
+ 'packages/mcp-server/tests/integration/setup.ts, or any os.tmpdir()-based ' +
79
+ 'path) instead of letting it default to os.homedir().');
80
+ }
11
81
  /**
12
82
  * Manages the skill manifest file (~/.skillsmith/manifest.json) with
13
83
  * file-level locking for concurrent access safety (CLI + MCP server).
@@ -17,6 +87,16 @@ export class ManifestManager {
17
87
  constructor(manifestPath) {
18
88
  this.manifestPath = manifestPath;
19
89
  }
90
+ /**
91
+ * ADR-139 (SMI-6274 Wave 4): the manifest path this instance was
92
+ * constructed with — read-only accessor for callers that need to name it
93
+ * in a diagnostic message (e.g. `performUninstall`'s adoption-failure
94
+ * error, which must name the skill, the path, AND the manifest it tried
95
+ * to write, per ADR-139 point 1).
96
+ */
97
+ get path() {
98
+ return this.manifestPath;
99
+ }
20
100
  /**
21
101
  * SMI-6007: distinguishes "no manifest yet" (ENOENT — legitimate first-run
22
102
  * case, safe to synthesize an empty manifest) from "a manifest file exists
@@ -60,6 +140,7 @@ export class ManifestManager {
60
140
  * `sqljsDriver.ts`'s `persist()`, SMI-5997) — the error is never swallowed.
61
141
  */
62
142
  async save(manifest) {
143
+ assertNotRealUserHome(this.manifestPath, 'write');
63
144
  await fs.mkdir(path.dirname(this.manifestPath), { recursive: true });
64
145
  const tempPath = this.manifestPath + '.tmp.' + process.pid + '.' + randomUUID();
65
146
  try {
@@ -77,6 +158,10 @@ export class ManifestManager {
77
158
  }
78
159
  }
79
160
  async acquireLock() {
161
+ // Guarded here as well as in save(): updateSafely() acquires the lock
162
+ // BEFORE it loads, so without this the guard would fire only after a
163
+ // `manifest.json.lock` file had already been created in the real home.
164
+ assertNotRealUserHome(this.manifestPath, 'lock');
80
165
  const lockPath = this.manifestPath + '.lock';
81
166
  const startTime = Date.now();
82
167
  await fs.mkdir(path.dirname(this.manifestPath), { recursive: true });
@@ -107,6 +192,14 @@ export class ManifestManager {
107
192
  throw new Error('Failed to acquire manifest lock after ' + MANIFEST_LOCK_TIMEOUT_MS + 'ms');
108
193
  }
109
194
  async releaseLock() {
195
+ // Guarded (adversarial-review finding, SMI-6343 follow-up): a caller that
196
+ // invokes releaseLock() directly against a real-home-derived path (a
197
+ // cleanup helper, an afterEach) would otherwise delete a lock a live
198
+ // skillsmith process is holding on the real manifest, silently breaking
199
+ // that process's mutual exclusion. save()/acquireLock() reach this only
200
+ // through updateSafely()'s already-guarded acquireLock(), so this is
201
+ // belt-and-suspenders for a caller that skips that path.
202
+ assertNotRealUserHome(this.manifestPath, 'unlock');
110
203
  try {
111
204
  await fs.unlink(this.manifestPath + '.lock');
112
205
  }
@@ -1 +1 @@
1
- {"version":3,"file":"skill-manifest.js","sourceRoot":"","sources":["../../../src/services/skill-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-manifest.js","sourceRoot":"","sources":["../../../src/services/skill-manifest.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,wBAAwB,GAAG,KAAK,CAAA;AACtC,MAAM,sBAAsB,GAAG,GAAG,CAAA;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAA;IACtD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,yEAAyE;QACzE,qCAAqC;QACrC,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB,EAAE,SAAiB;IAC3E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM;QAAE,OAAM;IAC/B,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IACpC,IAAI,CAAC,QAAQ;QAAE,OAAM;IAErB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAC/C,MAAM,eAAe,GACnB,YAAY,KAAK,YAAY,IAAI,YAAY,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;IACnF,IAAI,CAAC,eAAe;QAAE,OAAM;IAE5B,MAAM,IAAI,KAAK,CACb,wBAAwB;QACtB,SAAS;QACT,4DAA4D;QAC5D,oBAAoB;QACpB,YAAY;QACZ,sBAAsB;QACtB,YAAY;QACZ,IAAI;QACJ,uEAAuE;QACvE,0DAA0D;QAC1D,2EAA2E;QAC3E,sDAAsD,CACzD,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,YAAoB;QAApB,iBAAY,GAAZ,YAAY,CAAQ;IAAG,CAAC;IAErD;;;;;;OAMG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,OAAe,CAAA;QACnB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAAA;YAClD,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,mBAAmB;gBACjB,IAAI,CAAC,YAAY;gBACjB,sCAAsC;gBACtC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC3D,CAAA;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,IAAI,CAAC,QAAuB;QAChC,qBAAqB,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QACjD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,UAAU,EAAE,CAAA;QAC/E,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC/D,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,sEAAsE;QACtE,qEAAqE;QACrE,uEAAuE;QACvE,qBAAqB,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,GAAG,OAAO,CAAA;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAE5B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEpE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,wBAAwB,EAAE,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;gBACjE,OAAM;YACR,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACvD,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;wBACrC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,wBAAwB,EAAE,CAAC;4BAC1D,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;4BACzC,SAAQ;wBACV,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,SAAQ;oBACV,CAAC;oBACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAA;gBAC7E,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,wBAAwB,GAAG,IAAI,CAAC,CAAA;IAC7F,CAAC;IAED,KAAK,CAAC,WAAW;QACf,0EAA0E;QAC1E,qEAAqE;QACrE,qEAAqE;QACrE,wEAAwE;QACxE,wEAAwE;QACxE,qEAAqE;QACrE,yDAAyD;QACzD,qBAAqB,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;QAClD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,CAAA;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAoD;QACrE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;YAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAClC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC1B,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QAC1B,CAAC;IACH,CAAC;CACF"}
@@ -198,5 +198,32 @@ describe('ManifestManager concurrency hardening (SMI-6007)', () => {
198
198
  expect(files.some((f) => f.includes('.tmp.'))).toBe(false);
199
199
  });
200
200
  });
201
+ // SMI-6343 Wave 1 follow-up (adversarial review): releaseLock() was
202
+ // previously unguarded. save()/acquireLock() already refuse a real-home
203
+ // path (their own guard), so updateSafely() never reaches releaseLock()
204
+ // for a real-home path via that route — this exists for a caller that
205
+ // invokes releaseLock() directly (a cleanup helper, an afterEach) on a
206
+ // real-home-derived path, which would otherwise delete a lock a live
207
+ // skillsmith process is holding.
208
+ describe('releaseLock() real-home write guard', () => {
209
+ it('refuses to unlock when the manifest path resolves under the (simulated) real home', async () => {
210
+ const previous = process.env.SKILLSMITH_TEST_REAL_HOME;
211
+ process.env.SKILLSMITH_TEST_REAL_HOME = tmpDir;
212
+ try {
213
+ await expect(manager.releaseLock()).rejects.toThrow(/SMI-6343/);
214
+ }
215
+ finally {
216
+ if (previous === undefined)
217
+ delete process.env.SKILLSMITH_TEST_REAL_HOME;
218
+ else
219
+ process.env.SKILLSMITH_TEST_REAL_HOME = previous;
220
+ }
221
+ });
222
+ it('still unlocks normally when the manifest path is NOT under the real home', async () => {
223
+ await manager.acquireLock();
224
+ await expect(manager.releaseLock()).resolves.toBeUndefined();
225
+ await expect(fs.access(manifestPath + '.lock')).rejects.toThrow();
226
+ });
227
+ });
201
228
  });
202
229
  //# sourceMappingURL=skill-manifest.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-manifest.test.js","sourceRoot":"","sources":["../../../src/services/skill-manifest.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-manifest.test.js","sourceRoot":"","sources":["../../../src/services/skill-manifest.test.ts"],"names":[],"mappings":"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"}