@skillsmith/core 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/api/client.d.ts.map +1 -1
  4. package/dist/src/api/client.js +6 -0
  5. package/dist/src/api/client.js.map +1 -1
  6. package/dist/src/api/client.test.d.ts +9 -0
  7. package/dist/src/api/client.test.d.ts.map +1 -0
  8. package/dist/src/api/client.test.js +81 -0
  9. package/dist/src/api/client.test.js.map +1 -0
  10. package/dist/src/exports/services.d.ts +3 -1
  11. package/dist/src/exports/services.d.ts.map +1 -1
  12. package/dist/src/exports/services.js +7 -1
  13. package/dist/src/exports/services.js.map +1 -1
  14. package/dist/src/index.d.ts +3 -3
  15. package/dist/src/index.d.ts.map +1 -1
  16. package/dist/src/index.js +5 -2
  17. package/dist/src/index.js.map +1 -1
  18. package/dist/src/install/agent-config-merge.json-array.d.ts +29 -0
  19. package/dist/src/install/agent-config-merge.json-array.d.ts.map +1 -0
  20. package/dist/src/install/agent-config-merge.json-array.js +100 -0
  21. package/dist/src/install/agent-config-merge.json-array.js.map +1 -0
  22. package/dist/src/install/agent-config-merge.json.d.ts +37 -0
  23. package/dist/src/install/agent-config-merge.json.d.ts.map +1 -0
  24. package/dist/src/install/agent-config-merge.json.js +134 -0
  25. package/dist/src/install/agent-config-merge.json.js.map +1 -0
  26. package/dist/src/install/agent-config-merge.toml-block.d.ts +48 -0
  27. package/dist/src/install/agent-config-merge.toml-block.d.ts.map +1 -0
  28. package/dist/src/install/agent-config-merge.toml-block.js +107 -0
  29. package/dist/src/install/agent-config-merge.toml-block.js.map +1 -0
  30. package/dist/src/install/agent-config-merge.types.d.ts +87 -0
  31. package/dist/src/install/agent-config-merge.types.d.ts.map +1 -0
  32. package/dist/src/install/agent-config-merge.types.js +83 -0
  33. package/dist/src/install/agent-config-merge.types.js.map +1 -0
  34. package/dist/src/install/agent-config-merge.yaml.d.ts +46 -0
  35. package/dist/src/install/agent-config-merge.yaml.d.ts.map +1 -0
  36. package/dist/src/install/agent-config-merge.yaml.js +133 -0
  37. package/dist/src/install/agent-config-merge.yaml.js.map +1 -0
  38. package/dist/src/install/agent-config-merge.yaml.test.d.ts +2 -0
  39. package/dist/src/install/agent-config-merge.yaml.test.d.ts.map +1 -0
  40. package/dist/src/install/agent-config-merge.yaml.test.js +210 -0
  41. package/dist/src/install/agent-config-merge.yaml.test.js.map +1 -0
  42. package/dist/src/install/agent-harness-targets.d.ts +98 -0
  43. package/dist/src/install/agent-harness-targets.d.ts.map +1 -0
  44. package/dist/src/install/agent-harness-targets.js +154 -0
  45. package/dist/src/install/agent-harness-targets.js.map +1 -0
  46. package/dist/src/install/agent-home-relocate.d.ts +29 -0
  47. package/dist/src/install/agent-home-relocate.d.ts.map +1 -0
  48. package/dist/src/install/agent-home-relocate.js +38 -0
  49. package/dist/src/install/agent-home-relocate.js.map +1 -0
  50. package/dist/src/install/agent-manifest-path-guard.d.ts +55 -0
  51. package/dist/src/install/agent-manifest-path-guard.d.ts.map +1 -0
  52. package/dist/src/install/agent-manifest-path-guard.js +109 -0
  53. package/dist/src/install/agent-manifest-path-guard.js.map +1 -0
  54. package/dist/src/install/agent-manifest-path-guard.test.d.ts +2 -0
  55. package/dist/src/install/agent-manifest-path-guard.test.d.ts.map +1 -0
  56. package/dist/src/install/agent-manifest-path-guard.test.js +72 -0
  57. package/dist/src/install/agent-manifest-path-guard.test.js.map +1 -0
  58. package/dist/src/install/agent-manifest.d.ts +58 -0
  59. package/dist/src/install/agent-manifest.d.ts.map +1 -0
  60. package/dist/src/install/agent-manifest.js +103 -0
  61. package/dist/src/install/agent-manifest.js.map +1 -0
  62. package/dist/src/install/agent-pack-installer.d.ts +39 -0
  63. package/dist/src/install/agent-pack-installer.d.ts.map +1 -0
  64. package/dist/src/install/agent-pack-installer.entry.d.ts +55 -0
  65. package/dist/src/install/agent-pack-installer.entry.d.ts.map +1 -0
  66. package/dist/src/install/agent-pack-installer.entry.js +90 -0
  67. package/dist/src/install/agent-pack-installer.entry.js.map +1 -0
  68. package/dist/src/install/agent-pack-installer.fs-helpers.d.ts +33 -0
  69. package/dist/src/install/agent-pack-installer.fs-helpers.d.ts.map +1 -0
  70. package/dist/src/install/agent-pack-installer.fs-helpers.js +59 -0
  71. package/dist/src/install/agent-pack-installer.fs-helpers.js.map +1 -0
  72. package/dist/src/install/agent-pack-installer.harness.d.ts +66 -0
  73. package/dist/src/install/agent-pack-installer.harness.d.ts.map +1 -0
  74. package/dist/src/install/agent-pack-installer.harness.js +310 -0
  75. package/dist/src/install/agent-pack-installer.harness.js.map +1 -0
  76. package/dist/src/install/agent-pack-installer.js +221 -0
  77. package/dist/src/install/agent-pack-installer.js.map +1 -0
  78. package/dist/src/install/agent-pack-installer.preserve.test.d.ts +11 -0
  79. package/dist/src/install/agent-pack-installer.preserve.test.d.ts.map +1 -0
  80. package/dist/src/install/agent-pack-installer.preserve.test.js +72 -0
  81. package/dist/src/install/agent-pack-installer.preserve.test.js.map +1 -0
  82. package/dist/src/install/agent-pack-installer.test.d.ts +2 -0
  83. package/dist/src/install/agent-pack-installer.test.d.ts.map +1 -0
  84. package/dist/src/install/agent-pack-installer.test.js +350 -0
  85. package/dist/src/install/agent-pack-installer.test.js.map +1 -0
  86. package/dist/src/install/agent-pack-installer.types.d.ts +51 -0
  87. package/dist/src/install/agent-pack-installer.types.d.ts.map +1 -0
  88. package/dist/src/install/agent-pack-installer.types.js +16 -0
  89. package/dist/src/install/agent-pack-installer.types.js.map +1 -0
  90. package/dist/src/install/agent-pack-uninstaller.d.ts +43 -0
  91. package/dist/src/install/agent-pack-uninstaller.d.ts.map +1 -0
  92. package/dist/src/install/agent-pack-uninstaller.js +113 -0
  93. package/dist/src/install/agent-pack-uninstaller.js.map +1 -0
  94. package/dist/src/install/agent-pack-uninstaller.test.d.ts +2 -0
  95. package/dist/src/install/agent-pack-uninstaller.test.d.ts.map +1 -0
  96. package/dist/src/install/agent-pack-uninstaller.test.js +212 -0
  97. package/dist/src/install/agent-pack-uninstaller.test.js.map +1 -0
  98. package/dist/src/install/index.d.ts +7 -0
  99. package/dist/src/install/index.d.ts.map +1 -1
  100. package/dist/src/install/index.js +7 -0
  101. package/dist/src/install/index.js.map +1 -1
  102. package/dist/src/install/paths.d.ts +1 -1
  103. package/dist/src/install/paths.d.ts.map +1 -1
  104. package/dist/src/install/paths.js +4 -0
  105. package/dist/src/install/paths.js.map +1 -1
  106. package/dist/src/install/paths.test.js +15 -0
  107. package/dist/src/install/paths.test.js.map +1 -1
  108. package/dist/src/journal/hash.d.ts +13 -0
  109. package/dist/src/journal/hash.d.ts.map +1 -0
  110. package/dist/src/journal/hash.js +16 -0
  111. package/dist/src/journal/hash.js.map +1 -0
  112. package/dist/src/journal/index.d.ts +15 -0
  113. package/dist/src/journal/index.d.ts.map +1 -0
  114. package/dist/src/journal/index.js +15 -0
  115. package/dist/src/journal/index.js.map +1 -0
  116. package/dist/src/journal/journal.test.d.ts +16 -0
  117. package/dist/src/journal/journal.test.d.ts.map +1 -0
  118. package/dist/src/journal/journal.test.js +171 -0
  119. package/dist/src/journal/journal.test.js.map +1 -0
  120. package/dist/src/journal/path.d.ts +44 -0
  121. package/dist/src/journal/path.d.ts.map +1 -0
  122. package/dist/src/journal/path.js +61 -0
  123. package/dist/src/journal/path.js.map +1 -0
  124. package/dist/src/journal/reader.d.ts +38 -0
  125. package/dist/src/journal/reader.d.ts.map +1 -0
  126. package/dist/src/journal/reader.js +93 -0
  127. package/dist/src/journal/reader.js.map +1 -0
  128. package/dist/src/journal/types.d.ts +87 -0
  129. package/dist/src/journal/types.d.ts.map +1 -0
  130. package/dist/src/journal/types.js +21 -0
  131. package/dist/src/journal/types.js.map +1 -0
  132. package/dist/src/journal/writer.d.ts +52 -0
  133. package/dist/src/journal/writer.d.ts.map +1 -0
  134. package/dist/src/journal/writer.js +125 -0
  135. package/dist/src/journal/writer.js.map +1 -0
  136. package/dist/src/paywall-triggers/index.d.ts +13 -0
  137. package/dist/src/paywall-triggers/index.d.ts.map +1 -0
  138. package/dist/src/paywall-triggers/index.js +13 -0
  139. package/dist/src/paywall-triggers/index.js.map +1 -0
  140. package/dist/src/paywall-triggers/path.d.ts +47 -0
  141. package/dist/src/paywall-triggers/path.d.ts.map +1 -0
  142. package/dist/src/paywall-triggers/path.js +73 -0
  143. package/dist/src/paywall-triggers/path.js.map +1 -0
  144. package/dist/src/paywall-triggers/store.d.ts +75 -0
  145. package/dist/src/paywall-triggers/store.d.ts.map +1 -0
  146. package/dist/src/paywall-triggers/store.js +122 -0
  147. package/dist/src/paywall-triggers/store.js.map +1 -0
  148. package/dist/src/paywall-triggers/store.test.d.ts +2 -0
  149. package/dist/src/paywall-triggers/store.test.d.ts.map +1 -0
  150. package/dist/src/paywall-triggers/store.test.js +121 -0
  151. package/dist/src/paywall-triggers/store.test.js.map +1 -0
  152. package/dist/src/paywall-triggers/types.d.ts +24 -0
  153. package/dist/src/paywall-triggers/types.d.ts.map +1 -0
  154. package/dist/src/paywall-triggers/types.js +13 -0
  155. package/dist/src/paywall-triggers/types.js.map +1 -0
  156. package/dist/src/security/scanner/SecurityScanner.compound.d.ts +13 -0
  157. package/dist/src/security/scanner/SecurityScanner.compound.d.ts.map +1 -0
  158. package/dist/src/security/scanner/SecurityScanner.compound.js +127 -0
  159. package/dist/src/security/scanner/SecurityScanner.compound.js.map +1 -0
  160. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  161. package/dist/src/security/scanner/SecurityScanner.js +10 -1
  162. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  163. package/dist/src/security/scanner/SecurityScanner.pii.d.ts +23 -0
  164. package/dist/src/security/scanner/SecurityScanner.pii.d.ts.map +1 -0
  165. package/dist/src/security/scanner/SecurityScanner.pii.js +152 -0
  166. package/dist/src/security/scanner/SecurityScanner.pii.js.map +1 -0
  167. package/dist/src/security/scanner/SecurityScanner.scanners.d.ts +5 -12
  168. package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -1
  169. package/dist/src/security/scanner/SecurityScanner.scanners.js +63 -137
  170. package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -1
  171. package/dist/src/security/scanner/patterns.d.ts +2 -0
  172. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  173. package/dist/src/security/scanner/patterns.js +79 -11
  174. package/dist/src/security/scanner/patterns.js.map +1 -1
  175. package/dist/src/security/scanner/types.d.ts +2 -0
  176. package/dist/src/security/scanner/types.d.ts.map +1 -1
  177. package/dist/src/services/agent-pack/agent-pack.test.d.ts +18 -0
  178. package/dist/src/services/agent-pack/agent-pack.test.d.ts.map +1 -0
  179. package/dist/src/services/agent-pack/agent-pack.test.js +344 -0
  180. package/dist/src/services/agent-pack/agent-pack.test.js.map +1 -0
  181. package/dist/src/services/agent-pack/hooks.d.ts +29 -0
  182. package/dist/src/services/agent-pack/hooks.d.ts.map +1 -0
  183. package/dist/src/services/agent-pack/hooks.js +139 -0
  184. package/dist/src/services/agent-pack/hooks.js.map +1 -0
  185. package/dist/src/services/agent-pack/index.d.ts +26 -0
  186. package/dist/src/services/agent-pack/index.d.ts.map +1 -0
  187. package/dist/src/services/agent-pack/index.js +109 -0
  188. package/dist/src/services/agent-pack/index.js.map +1 -0
  189. package/dist/src/services/agent-pack/prompt-source.d.ts +47 -0
  190. package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -0
  191. package/dist/src/services/agent-pack/prompt-source.js +182 -0
  192. package/dist/src/services/agent-pack/prompt-source.js.map +1 -0
  193. package/dist/src/services/agent-pack/shims.d.ts +40 -0
  194. package/dist/src/services/agent-pack/shims.d.ts.map +1 -0
  195. package/dist/src/services/agent-pack/shims.js +96 -0
  196. package/dist/src/services/agent-pack/shims.js.map +1 -0
  197. package/dist/src/services/agent-pack/skill-md.d.ts +35 -0
  198. package/dist/src/services/agent-pack/skill-md.d.ts.map +1 -0
  199. package/dist/src/services/agent-pack/skill-md.js +89 -0
  200. package/dist/src/services/agent-pack/skill-md.js.map +1 -0
  201. package/dist/src/services/agent-pack/types.d.ts +118 -0
  202. package/dist/src/services/agent-pack/types.d.ts.map +1 -0
  203. package/dist/src/services/agent-pack/types.js +61 -0
  204. package/dist/src/services/agent-pack/types.js.map +1 -0
  205. package/dist/src/services/agent-tool-profile.d.ts +59 -0
  206. package/dist/src/services/agent-tool-profile.d.ts.map +1 -0
  207. package/dist/src/services/agent-tool-profile.js +76 -0
  208. package/dist/src/services/agent-tool-profile.js.map +1 -0
  209. package/dist/src/services/agent-tool-profile.test.d.ts +2 -0
  210. package/dist/src/services/agent-tool-profile.test.d.ts.map +1 -0
  211. package/dist/src/services/agent-tool-profile.test.js +28 -0
  212. package/dist/src/services/agent-tool-profile.test.js.map +1 -0
  213. package/dist/src/services/bundled-sibling-scan.d.ts +111 -0
  214. package/dist/src/services/bundled-sibling-scan.d.ts.map +1 -0
  215. package/dist/src/services/bundled-sibling-scan.js +170 -0
  216. package/dist/src/services/bundled-sibling-scan.js.map +1 -0
  217. package/dist/src/services/skill-installation.io.d.ts +16 -5
  218. package/dist/src/services/skill-installation.io.d.ts.map +1 -1
  219. package/dist/src/services/skill-installation.io.js +44 -20
  220. package/dist/src/services/skill-installation.io.js.map +1 -1
  221. package/dist/src/services/skill-installation.policy.d.ts +96 -0
  222. package/dist/src/services/skill-installation.policy.d.ts.map +1 -0
  223. package/dist/src/services/skill-installation.policy.js +144 -0
  224. package/dist/src/services/skill-installation.policy.js.map +1 -0
  225. package/dist/src/services/skill-installation.service.d.ts.map +1 -1
  226. package/dist/src/services/skill-installation.service.js +9 -3
  227. package/dist/src/services/skill-installation.service.js.map +1 -1
  228. package/dist/src/sources/index.d.ts +1 -0
  229. package/dist/src/sources/index.d.ts.map +1 -1
  230. package/dist/src/sources/index.js +4 -0
  231. package/dist/src/sources/index.js.map +1 -1
  232. package/dist/src/sync/index.d.ts +1 -1
  233. package/dist/src/sync/index.d.ts.map +1 -1
  234. package/dist/src/sync/index.js +1 -1
  235. package/dist/src/sync/index.js.map +1 -1
  236. package/dist/src/sync/inventory-client.d.ts +16 -0
  237. package/dist/src/sync/inventory-client.d.ts.map +1 -1
  238. package/dist/src/sync/inventory-client.js +54 -0
  239. package/dist/src/sync/inventory-client.js.map +1 -1
  240. package/dist/src/sync/inventory-client.test.js +67 -1
  241. package/dist/src/sync/inventory-client.test.js.map +1 -1
  242. package/dist/src/sync/inventory-collector.d.ts.map +1 -1
  243. package/dist/src/sync/inventory-collector.js +32 -5
  244. package/dist/src/sync/inventory-collector.js.map +1 -1
  245. package/dist/src/sync/inventory-collector.test.js +50 -1
  246. package/dist/src/sync/inventory-collector.test.js.map +1 -1
  247. package/dist/src/sync/inventory-types.d.ts +9 -0
  248. package/dist/src/sync/inventory-types.d.ts.map +1 -1
  249. package/dist/src/sync/inventory-types.js +3 -0
  250. package/dist/src/sync/inventory-types.js.map +1 -1
  251. package/dist/src/telemetry/agent-marker.d.ts +137 -0
  252. package/dist/src/telemetry/agent-marker.d.ts.map +1 -0
  253. package/dist/src/telemetry/agent-marker.js +242 -0
  254. package/dist/src/telemetry/agent-marker.js.map +1 -0
  255. package/dist/src/telemetry/agent-marker.test.d.ts +13 -0
  256. package/dist/src/telemetry/agent-marker.test.d.ts.map +1 -0
  257. package/dist/src/telemetry/agent-marker.test.js +202 -0
  258. package/dist/src/telemetry/agent-marker.test.js.map +1 -0
  259. package/dist/src/telemetry/index.d.ts +2 -1
  260. package/dist/src/telemetry/index.d.ts.map +1 -1
  261. package/dist/src/telemetry/index.js +6 -1
  262. package/dist/src/telemetry/index.js.map +1 -1
  263. package/dist/src/telemetry/posthog.d.ts +10 -0
  264. package/dist/src/telemetry/posthog.d.ts.map +1 -1
  265. package/dist/src/telemetry/posthog.js +5 -1
  266. package/dist/src/telemetry/posthog.js.map +1 -1
  267. package/dist/src/telemetry/wrap.d.ts +28 -7
  268. package/dist/src/telemetry/wrap.d.ts.map +1 -1
  269. package/dist/src/telemetry/wrap.gate.test.d.ts +22 -0
  270. package/dist/src/telemetry/wrap.gate.test.d.ts.map +1 -0
  271. package/dist/src/telemetry/wrap.gate.test.js +197 -0
  272. package/dist/src/telemetry/wrap.gate.test.js.map +1 -0
  273. package/dist/src/telemetry/wrap.js +111 -26
  274. package/dist/src/telemetry/wrap.js.map +1 -1
  275. package/dist/src/telemetry/wrap.marker.test.d.ts +16 -0
  276. package/dist/src/telemetry/wrap.marker.test.d.ts.map +1 -0
  277. package/dist/src/telemetry/wrap.marker.test.js +185 -0
  278. package/dist/src/telemetry/wrap.marker.test.js.map +1 -0
  279. package/dist/src/telemetry/wrap.test.js +4 -0
  280. package/dist/src/telemetry/wrap.test.js.map +1 -1
  281. package/dist/tests/SecurityScanner.exec.test.js +60 -0
  282. package/dist/tests/SecurityScanner.exec.test.js.map +1 -1
  283. package/dist/tests/security/ContinuousSecurity.test.js +10 -4
  284. package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
  285. package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts +2 -0
  286. package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts.map +1 -0
  287. package/dist/tests/security/SecurityScanner.chmod-evasion.test.js +126 -0
  288. package/dist/tests/security/SecurityScanner.chmod-evasion.test.js.map +1 -0
  289. package/dist/tests/security/chmod-compound.test.d.ts +2 -0
  290. package/dist/tests/security/chmod-compound.test.d.ts.map +1 -0
  291. package/dist/tests/security/chmod-compound.test.js +188 -0
  292. package/dist/tests/security/chmod-compound.test.js.map +1 -0
  293. package/dist/tests/security/pii-detection.test.js +24 -0
  294. package/dist/tests/security/pii-detection.test.js.map +1 -1
  295. package/dist/tests/security/scanner-regression-guard.test.d.ts +23 -7
  296. package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -1
  297. package/dist/tests/security/scanner-regression-guard.test.js +27 -11
  298. package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
  299. package/dist/tests/security/sensitive-path-fp.test.d.ts +2 -0
  300. package/dist/tests/security/sensitive-path-fp.test.d.ts.map +1 -0
  301. package/dist/tests/security/sensitive-path-fp.test.js +142 -0
  302. package/dist/tests/security/sensitive-path-fp.test.js.map +1 -0
  303. package/dist/tests/services/bundled-sibling-scan.test.d.ts +2 -0
  304. package/dist/tests/services/bundled-sibling-scan.test.d.ts.map +1 -0
  305. package/dist/tests/services/bundled-sibling-scan.test.js +139 -0
  306. package/dist/tests/services/bundled-sibling-scan.test.js.map +1 -0
  307. package/dist/tests/unit/services/skill-installation.io.test.js +166 -0
  308. package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -1
  309. package/dist/tests/unit/services/skill-installation.policy.test.d.ts +8 -0
  310. package/dist/tests/unit/services/skill-installation.policy.test.d.ts.map +1 -0
  311. package/dist/tests/unit/services/skill-installation.policy.test.js +151 -0
  312. package/dist/tests/unit/services/skill-installation.policy.test.js.map +1 -0
  313. package/package.json +23 -3
@@ -0,0 +1,221 @@
1
+ /**
2
+ * `sklx agent install` core orchestration (SMI-5456 Wave 1 Step 5).
3
+ *
4
+ * Generates the pack via `generateAgentPack({ toolProfile: AGENT_TOOL_PROFILE_NAMES })`
5
+ * (QD-2: byte-identical to the committed `packages/mcp-server/src/assets/agent-pack/`
6
+ * tree by determinism, never read from the mcp-server package) and writes:
7
+ * - SKILL.md to the mandatory dual path (claude-code + agents) plus any
8
+ * detected Tier-2/3 harness with its own native skill directory
9
+ * (opencode, hermes, windsurf).
10
+ * - Named-agent shims for every detected harness with a shim target
11
+ * (claude-code always; copilot, opencode when detected; codex via its
12
+ * own TOML-merge "shim").
13
+ * - SessionStart/SessionEnd hooks (+x) for claude-code (always), cursor
14
+ * and codex when detected — hook CONFIG wiring ships for claude-code/
15
+ * cursor (JSON arrays) and codex (SessionStart ONLY, as a
16
+ * marker-delimited `[[hooks.SessionStart]]` TOML block; Codex has no
17
+ * SessionEnd event and its Stop event is per-turn — see
18
+ * `installCodexHooks` in `agent-pack-installer.harness.ts`).
19
+ * - The `skillsmith` MCP server registration (`SKILLSMITH_TOOL_PROFILE=agent`)
20
+ * for every detected MCP-capable harness (all 7), backup-first,
21
+ * idempotent, preserve-and-prompt on a foreign entry.
22
+ *
23
+ * Every write funnels through `writeOwnedArtifactFile` (owned files) or the
24
+ * `agent-config-merge.*` helpers (shared config files), both of which record
25
+ * a manifest entry — `uninstallAgentPack` (SMI-5456) reverses exactly what
26
+ * this function wrote by replaying that manifest, never by re-deriving
27
+ * "what the current generator would produce".
28
+ *
29
+ * @module @skillsmith/core/install/agent-pack-installer
30
+ */
31
+ import { existsSync } from 'node:fs';
32
+ import { homedir } from 'node:os';
33
+ import { join } from 'node:path';
34
+ import { AGENT_PACK_SKILL_NAME, generateAgentPack } from '../services/agent-pack/index.js';
35
+ import { AGENT_TOOL_PROFILE_NAMES } from '../services/agent-tool-profile.js';
36
+ import { CLIENT_NATIVE_PATHS } from './paths.js';
37
+ import { relocateUnderHome } from './agent-home-relocate.js';
38
+ import { writeOwnedArtifactFile } from './agent-pack-installer.fs-helpers.js';
39
+ import { getAgentInstallBackupsDir, getAgentManifestPath, loadAgentManifest, saveAgentManifest, } from './agent-manifest.js';
40
+ import { installCodexAgentsShim, installCodexHooks, installJsonHooks, installMcpConfig, installShim, } from './agent-pack-installer.harness.js';
41
+ import { HARNESS_SUPPORT_TIER, } from './agent-pack-installer.types.js';
42
+ /** Harnesses considered for the SKILL.md pack copy beyond the mandatory dual path. */
43
+ const OPTIONAL_SKILL_PACK_HARNESSES = ['windsurf', 'opencode', 'hermes'];
44
+ function isPresent(nativePath, homeDir) {
45
+ return existsSync(relocateUnderHome(nativePath, homeDir));
46
+ }
47
+ function isCodexPresent(homeDir) {
48
+ return existsSync(relocateUnderHome(join(homedir(), '.codex'), homeDir));
49
+ }
50
+ /** Write the SKILL.md pack to one client's native skill directory (`<dir>/skillsmith-agent/SKILL.md`). */
51
+ function writeSkillPackFor(clientNativePath, content, ctx, harness) {
52
+ const path = join(relocateUnderHome(clientNativePath, ctx.homeDir), AGENT_PACK_SKILL_NAME, 'SKILL.md');
53
+ const result = writeOwnedArtifactFile({
54
+ path,
55
+ content,
56
+ executable: false,
57
+ backupDir: ctx.backupDir,
58
+ });
59
+ ctx.entries.push({
60
+ path,
61
+ kind: 'skill',
62
+ harness,
63
+ backupPath: result.backupPath,
64
+ executable: false,
65
+ });
66
+ }
67
+ function newReport(harness) {
68
+ return {
69
+ harness,
70
+ tier: HARNESS_SUPPORT_TIER[harness] ?? 3,
71
+ detected: false,
72
+ skillPackWritten: false,
73
+ shimWritten: false,
74
+ hooksInstalled: false,
75
+ mcpConfig: null,
76
+ hookConfig: [],
77
+ notes: [],
78
+ };
79
+ }
80
+ /**
81
+ * Carry forward pre-install backup references from a PRIOR install so a
82
+ * re-install cannot silently strand them.
83
+ *
84
+ * A re-install takes NO fresh backup for a path whose owned-file content
85
+ * already matches, nor for a shared-config merge that is a no-op — so this
86
+ * run's freshly-built `entries` record `backupPath: null` for those paths.
87
+ * Persisting that as-is would overwrite the prior manifest's genuine
88
+ * pre-install backup ref with null, and `uninstallAgentPack` would then treat
89
+ * a MODIFIED pre-existing file (e.g. a `~/.claude/settings.json` the user
90
+ * already had) as "created fresh" and DELETE it instead of restoring it —
91
+ * silent user-data loss on the `install → install → uninstall` sequence
92
+ * (SMI-5456 adversarial-review fix, verified by the double-install reversal
93
+ * test).
94
+ *
95
+ * The prior manifest's `backupPath` is the authoritative restore target for a
96
+ * path (the true pre-FIRST-install content), so it WINS over any fresh backup
97
+ * this run may have taken — a mid-lifecycle backup captured on a version-bump
98
+ * re-install would itself contain our own already-merged blocks. `uninstall`
99
+ * clears the manifest to `entries: []`, so an install-AFTER-uninstall carries
100
+ * nothing forward (this run's fresh backups win); only a re-install WITHOUT an
101
+ * intervening uninstall reaches this path. A prior ref whose backup file no
102
+ * longer exists is ignored (nothing to restore from).
103
+ */
104
+ function carryForwardPriorBackups(entries) {
105
+ const priorBackupByPath = new Map();
106
+ for (const prior of loadAgentManifest().entries) {
107
+ if (prior.backupPath && existsSync(prior.backupPath)) {
108
+ priorBackupByPath.set(prior.path, prior.backupPath);
109
+ }
110
+ }
111
+ if (priorBackupByPath.size === 0)
112
+ return entries;
113
+ return entries.map((entry) => {
114
+ const carried = priorBackupByPath.get(entry.path);
115
+ return carried ? { ...entry, backupPath: carried } : entry;
116
+ });
117
+ }
118
+ /**
119
+ * Detect + install the portable Skillsmith Agent pack across every
120
+ * supported harness. See module header for the full per-harness matrix.
121
+ */
122
+ export function installAgentPack(opts = {}) {
123
+ const homeDir = opts.homeDir;
124
+ const force = opts.force ?? false;
125
+ // Manifest/backups dir isolation for tests is via SKILLSMITH_AGENT_INSTALL_DIR
126
+ // (agent-manifest.ts), not `homeDir` — kept separate from harness-target
127
+ // relocation so a test can isolate manifest state without needing a full
128
+ // fake HOME tree.
129
+ const backupDir = getAgentInstallBackupsDir();
130
+ const entries = [];
131
+ const ctx = {
132
+ homeDir,
133
+ force,
134
+ backupDir,
135
+ entries,
136
+ backedUpPaths: new Set(),
137
+ };
138
+ const artifacts = generateAgentPack({ toolProfile: AGENT_TOOL_PROFILE_NAMES });
139
+ const skillArtifact = artifacts.find((a) => a.kind === 'skill');
140
+ const shimByHarness = new Map(artifacts.filter((a) => a.kind === 'shim').map((a) => [a.harness, a]));
141
+ const hookStartByHarness = new Map(artifacts
142
+ .filter((a) => a.kind === 'hook' && a.path.endsWith('session-start.sh'))
143
+ .map((a) => [a.harness, a]));
144
+ const hookEndByHarness = new Map(artifacts
145
+ .filter((a) => a.kind === 'hook' && a.path.endsWith('session-end.sh'))
146
+ .map((a) => [a.harness, a]));
147
+ const detected = {
148
+ 'claude-code': true, // canonical client — always on, mirrors CANONICAL_CLIENT in paths.ts
149
+ cursor: isPresent(CLIENT_NATIVE_PATHS.cursor, homeDir),
150
+ copilot: isPresent(CLIENT_NATIVE_PATHS.copilot, homeDir),
151
+ windsurf: isPresent(CLIENT_NATIVE_PATHS.windsurf, homeDir),
152
+ opencode: isPresent(CLIENT_NATIVE_PATHS.opencode, homeDir),
153
+ hermes: isPresent(CLIENT_NATIVE_PATHS.hermes, homeDir),
154
+ codex: isCodexPresent(homeDir),
155
+ };
156
+ const reports = [];
157
+ const harnessIds = [
158
+ 'claude-code',
159
+ 'cursor',
160
+ 'codex',
161
+ 'copilot',
162
+ 'opencode',
163
+ 'hermes',
164
+ 'windsurf',
165
+ ];
166
+ for (const harness of harnessIds) {
167
+ const report = newReport(harness);
168
+ report.detected = detected[harness];
169
+ const active = report.detected;
170
+ // Skill pack: mandatory dual path regardless of "detected"; optional
171
+ // harnesses only when detected.
172
+ if (harness === 'claude-code' && skillArtifact) {
173
+ writeSkillPackFor(CLIENT_NATIVE_PATHS['claude-code'], skillArtifact.content, ctx, harness);
174
+ report.skillPackWritten = true;
175
+ }
176
+ if (active &&
177
+ OPTIONAL_SKILL_PACK_HARNESSES.includes(harness) &&
178
+ skillArtifact) {
179
+ const nativePath = CLIENT_NATIVE_PATHS[harness];
180
+ writeSkillPackFor(nativePath, skillArtifact.content, ctx, harness);
181
+ report.skillPackWritten = true;
182
+ }
183
+ if (harness === 'claude-code' || active) {
184
+ if (harness === 'claude-code' || harness === 'copilot' || harness === 'opencode') {
185
+ installShim(harness, shimByHarness.get(harness), ctx, report);
186
+ }
187
+ if (harness === 'claude-code' || harness === 'cursor') {
188
+ installJsonHooks(harness, hookStartByHarness.get(harness), hookEndByHarness.get(harness), ctx, report);
189
+ }
190
+ if (harness === 'codex') {
191
+ installCodexHooks(hookStartByHarness.get('codex'), hookEndByHarness.get('codex'), ctx, report);
192
+ installCodexAgentsShim(shimByHarness.get('codex'), ctx, report);
193
+ }
194
+ // `harnessIds` is exactly the 7-member McpHarnessId union (all harnesses
195
+ // considered here support MCP registration) — safe direct cast.
196
+ installMcpConfig(harness, ctx, report);
197
+ }
198
+ reports.push(report);
199
+ }
200
+ // Mandatory dual path for the second (agents) leg — reported alongside
201
+ // claude-code's entry rather than as an 8th standalone harness row, since
202
+ // ~/.agents/skills is a shared open-standard convention, not a harness of
203
+ // its own (Codex's OWN report row covers its config/hook/shim surface).
204
+ if (skillArtifact) {
205
+ writeSkillPackFor(CLIENT_NATIVE_PATHS.agents, skillArtifact.content, ctx, 'agents');
206
+ }
207
+ saveAgentManifest({
208
+ schemaVersion: 1,
209
+ installedAt: new Date().toISOString(),
210
+ packSchemaVersion: 1,
211
+ entries: carryForwardPriorBackups(entries),
212
+ });
213
+ return {
214
+ installedAt: new Date().toISOString(),
215
+ manifestPath: getAgentManifestPath(),
216
+ harnessReports: reports,
217
+ };
218
+ }
219
+ // Re-export so callers (CLI) don't need a second import for manifest inspection.
220
+ export { loadAgentManifest };
221
+ //# sourceMappingURL=agent-pack-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pack-installer.js","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * installAgentPack preserve-existing semantics (SMI-5456).
3
+ *
4
+ * Split from agent-pack-installer.test.ts at the 500-line gate; shares its
5
+ * temp-HOME + manifest-env fixture shape. Covers the non-interactive conflict
6
+ * refusal for a foreign pre-existing `skillsmith` MCP entry and the
7
+ * `force: true` overwrite path (including the manifest-records-a-real-backup
8
+ * invariant that uninstall replay depends on).
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=agent-pack-installer.preserve.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pack-installer.preserve.test.d.ts","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.preserve.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * installAgentPack preserve-existing semantics (SMI-5456).
3
+ *
4
+ * Split from agent-pack-installer.test.ts at the 500-line gate; shares its
5
+ * temp-HOME + manifest-env fixture shape. Covers the non-interactive conflict
6
+ * refusal for a foreign pre-existing `skillsmith` MCP entry and the
7
+ * `force: true` overwrite path (including the manifest-records-a-real-backup
8
+ * invariant that uninstall replay depends on).
9
+ */
10
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
11
+ import { tmpdir } from 'node:os';
12
+ import { join } from 'node:path';
13
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
14
+ import { installAgentPack } from './agent-pack-installer.js';
15
+ import { AGENT_INSTALL_DIR_ENV_VAR, getAgentManifestPath } from './agent-manifest.js';
16
+ let homeDir;
17
+ let manifestDir;
18
+ let prevInstallDirEnv;
19
+ beforeEach(() => {
20
+ homeDir = mkdtempSync(join(tmpdir(), 'skillsmith-agent-install-home-'));
21
+ manifestDir = mkdtempSync(join(tmpdir(), 'skillsmith-agent-install-manifest-'));
22
+ prevInstallDirEnv = process.env[AGENT_INSTALL_DIR_ENV_VAR];
23
+ process.env[AGENT_INSTALL_DIR_ENV_VAR] = manifestDir;
24
+ });
25
+ afterEach(() => {
26
+ rmSync(homeDir, { recursive: true, force: true });
27
+ rmSync(manifestDir, { recursive: true, force: true });
28
+ if (prevInstallDirEnv !== undefined)
29
+ process.env[AGENT_INSTALL_DIR_ENV_VAR] = prevInstallDirEnv;
30
+ else
31
+ delete process.env[AGENT_INSTALL_DIR_ENV_VAR];
32
+ });
33
+ describe('installAgentPack — preserve-existing (non-interactive refusal)', () => {
34
+ it('does not clobber a foreign pre-existing skillsmith MCP entry, and reports a conflict', () => {
35
+ mkdirSync(join(homeDir, '.claude'), { recursive: true });
36
+ const settingsPath = join(homeDir, '.claude', 'settings.json');
37
+ const foreign = {
38
+ mcpServers: {
39
+ skillsmith: { command: 'node', args: ['/some/other/local/path/index.js'] },
40
+ },
41
+ };
42
+ writeFileSync(settingsPath, JSON.stringify(foreign, null, 2));
43
+ const result = installAgentPack({ homeDir });
44
+ const doc = JSON.parse(readFileSync(settingsPath, 'utf-8'));
45
+ expect(doc.mcpServers.skillsmith).toEqual(foreign.mcpServers.skillsmith);
46
+ const report = result.harnessReports.find((r) => r.harness === 'claude-code');
47
+ expect(report?.mcpConfig?.status).toBe('conflict');
48
+ expect(report?.notes.some((n) => n.includes('--force'))).toBe(true);
49
+ });
50
+ it('force: true overwrites the foreign entry and the manifest records a real backup for the file', () => {
51
+ mkdirSync(join(homeDir, '.claude'), { recursive: true });
52
+ const settingsPath = join(homeDir, '.claude', 'settings.json');
53
+ const foreign = { mcpServers: { skillsmith: { command: 'node', args: ['/other'] } } };
54
+ writeFileSync(settingsPath, JSON.stringify(foreign, null, 2));
55
+ const result = installAgentPack({ homeDir, force: true });
56
+ const doc = JSON.parse(readFileSync(settingsPath, 'utf-8'));
57
+ expect(doc.mcpServers.skillsmith.env.SKILLSMITH_TOOL_PROFILE).toBe('agent');
58
+ const report = result.harnessReports.find((r) => r.harness === 'claude-code');
59
+ expect(report?.mcpConfig?.status).toBe('updated');
60
+ // The MCP merge's OWN `mcpConfig.backupPath` can legitimately be null
61
+ // here: claude-code's hook-config merge runs FIRST this install run and
62
+ // is the one that takes the single real backup of settings.json
63
+ // (`alreadyBackedUpPaths` — one backup per file per run, see
64
+ // agent-config-merge.types.ts). What matters for correctness is that the
65
+ // MANIFEST — which uninstall actually replays — records a real backup
66
+ // for settingsPath, regardless of which merge call happened to claim it.
67
+ const manifest = JSON.parse(readFileSync(getAgentManifestPath(), 'utf-8'));
68
+ const settingsEntry = manifest.entries.find((e) => e.path === settingsPath);
69
+ expect(settingsEntry?.backupPath).not.toBeNull();
70
+ });
71
+ });
72
+ //# sourceMappingURL=agent-pack-installer.preserve.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pack-installer.preserve.test.js","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.preserve.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-pack-installer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pack-installer.test.d.ts","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.test.ts"],"names":[],"mappings":""}