@skillsmith/core 0.9.0 → 0.11.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 (404) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts +23 -0
  4. package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts.map +1 -1
  5. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js +137 -0
  6. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js.map +1 -1
  7. package/dist/src/analysis/tree-sitter/pythonIncremental.js +83 -10
  8. package/dist/src/analysis/tree-sitter/pythonIncremental.js.map +1 -1
  9. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js +6 -1
  10. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js.map +1 -1
  11. package/dist/src/api/client.d.ts.map +1 -1
  12. package/dist/src/api/client.js +6 -0
  13. package/dist/src/api/client.js.map +1 -1
  14. package/dist/src/api/client.test.d.ts +9 -0
  15. package/dist/src/api/client.test.d.ts.map +1 -0
  16. package/dist/src/api/client.test.js +81 -0
  17. package/dist/src/api/client.test.js.map +1 -0
  18. package/dist/src/config/audit-notify-state.d.ts +46 -0
  19. package/dist/src/config/audit-notify-state.d.ts.map +1 -0
  20. package/dist/src/config/audit-notify-state.js +55 -0
  21. package/dist/src/config/audit-notify-state.js.map +1 -0
  22. package/dist/src/config/audit-notify-state.test.d.ts +9 -0
  23. package/dist/src/config/audit-notify-state.test.d.ts.map +1 -0
  24. package/dist/src/config/audit-notify-state.test.js +63 -0
  25. package/dist/src/config/audit-notify-state.test.js.map +1 -0
  26. package/dist/src/config/index.d.ts +10 -0
  27. package/dist/src/config/index.d.ts.map +1 -1
  28. package/dist/src/config/index.js.map +1 -1
  29. package/dist/src/exports/services.d.ts +3 -1
  30. package/dist/src/exports/services.d.ts.map +1 -1
  31. package/dist/src/exports/services.js +9 -1
  32. package/dist/src/exports/services.js.map +1 -1
  33. package/dist/src/index.d.ts +6 -3
  34. package/dist/src/index.d.ts.map +1 -1
  35. package/dist/src/index.js +11 -2
  36. package/dist/src/index.js.map +1 -1
  37. package/dist/src/install/agent-config-merge.json-array.d.ts +29 -0
  38. package/dist/src/install/agent-config-merge.json-array.d.ts.map +1 -0
  39. package/dist/src/install/agent-config-merge.json-array.js +100 -0
  40. package/dist/src/install/agent-config-merge.json-array.js.map +1 -0
  41. package/dist/src/install/agent-config-merge.json.d.ts +37 -0
  42. package/dist/src/install/agent-config-merge.json.d.ts.map +1 -0
  43. package/dist/src/install/agent-config-merge.json.js +134 -0
  44. package/dist/src/install/agent-config-merge.json.js.map +1 -0
  45. package/dist/src/install/agent-config-merge.toml-block.d.ts +48 -0
  46. package/dist/src/install/agent-config-merge.toml-block.d.ts.map +1 -0
  47. package/dist/src/install/agent-config-merge.toml-block.js +107 -0
  48. package/dist/src/install/agent-config-merge.toml-block.js.map +1 -0
  49. package/dist/src/install/agent-config-merge.types.d.ts +87 -0
  50. package/dist/src/install/agent-config-merge.types.d.ts.map +1 -0
  51. package/dist/src/install/agent-config-merge.types.js +83 -0
  52. package/dist/src/install/agent-config-merge.types.js.map +1 -0
  53. package/dist/src/install/agent-config-merge.yaml.d.ts +46 -0
  54. package/dist/src/install/agent-config-merge.yaml.d.ts.map +1 -0
  55. package/dist/src/install/agent-config-merge.yaml.js +133 -0
  56. package/dist/src/install/agent-config-merge.yaml.js.map +1 -0
  57. package/dist/src/install/agent-config-merge.yaml.test.d.ts +2 -0
  58. package/dist/src/install/agent-config-merge.yaml.test.d.ts.map +1 -0
  59. package/dist/src/install/agent-config-merge.yaml.test.js +210 -0
  60. package/dist/src/install/agent-config-merge.yaml.test.js.map +1 -0
  61. package/dist/src/install/agent-harness-targets.d.ts +98 -0
  62. package/dist/src/install/agent-harness-targets.d.ts.map +1 -0
  63. package/dist/src/install/agent-harness-targets.js +154 -0
  64. package/dist/src/install/agent-harness-targets.js.map +1 -0
  65. package/dist/src/install/agent-home-relocate.d.ts +29 -0
  66. package/dist/src/install/agent-home-relocate.d.ts.map +1 -0
  67. package/dist/src/install/agent-home-relocate.js +38 -0
  68. package/dist/src/install/agent-home-relocate.js.map +1 -0
  69. package/dist/src/install/agent-manifest-path-guard.d.ts +55 -0
  70. package/dist/src/install/agent-manifest-path-guard.d.ts.map +1 -0
  71. package/dist/src/install/agent-manifest-path-guard.js +109 -0
  72. package/dist/src/install/agent-manifest-path-guard.js.map +1 -0
  73. package/dist/src/install/agent-manifest-path-guard.test.d.ts +2 -0
  74. package/dist/src/install/agent-manifest-path-guard.test.d.ts.map +1 -0
  75. package/dist/src/install/agent-manifest-path-guard.test.js +72 -0
  76. package/dist/src/install/agent-manifest-path-guard.test.js.map +1 -0
  77. package/dist/src/install/agent-manifest.d.ts +58 -0
  78. package/dist/src/install/agent-manifest.d.ts.map +1 -0
  79. package/dist/src/install/agent-manifest.js +103 -0
  80. package/dist/src/install/agent-manifest.js.map +1 -0
  81. package/dist/src/install/agent-pack-installer.d.ts +39 -0
  82. package/dist/src/install/agent-pack-installer.d.ts.map +1 -0
  83. package/dist/src/install/agent-pack-installer.entry.d.ts +55 -0
  84. package/dist/src/install/agent-pack-installer.entry.d.ts.map +1 -0
  85. package/dist/src/install/agent-pack-installer.entry.js +90 -0
  86. package/dist/src/install/agent-pack-installer.entry.js.map +1 -0
  87. package/dist/src/install/agent-pack-installer.fs-helpers.d.ts +33 -0
  88. package/dist/src/install/agent-pack-installer.fs-helpers.d.ts.map +1 -0
  89. package/dist/src/install/agent-pack-installer.fs-helpers.js +59 -0
  90. package/dist/src/install/agent-pack-installer.fs-helpers.js.map +1 -0
  91. package/dist/src/install/agent-pack-installer.harness.d.ts +66 -0
  92. package/dist/src/install/agent-pack-installer.harness.d.ts.map +1 -0
  93. package/dist/src/install/agent-pack-installer.harness.js +310 -0
  94. package/dist/src/install/agent-pack-installer.harness.js.map +1 -0
  95. package/dist/src/install/agent-pack-installer.js +221 -0
  96. package/dist/src/install/agent-pack-installer.js.map +1 -0
  97. package/dist/src/install/agent-pack-installer.preserve.test.d.ts +11 -0
  98. package/dist/src/install/agent-pack-installer.preserve.test.d.ts.map +1 -0
  99. package/dist/src/install/agent-pack-installer.preserve.test.js +72 -0
  100. package/dist/src/install/agent-pack-installer.preserve.test.js.map +1 -0
  101. package/dist/src/install/agent-pack-installer.test.d.ts +2 -0
  102. package/dist/src/install/agent-pack-installer.test.d.ts.map +1 -0
  103. package/dist/src/install/agent-pack-installer.test.js +350 -0
  104. package/dist/src/install/agent-pack-installer.test.js.map +1 -0
  105. package/dist/src/install/agent-pack-installer.types.d.ts +51 -0
  106. package/dist/src/install/agent-pack-installer.types.d.ts.map +1 -0
  107. package/dist/src/install/agent-pack-installer.types.js +16 -0
  108. package/dist/src/install/agent-pack-installer.types.js.map +1 -0
  109. package/dist/src/install/agent-pack-uninstaller.d.ts +43 -0
  110. package/dist/src/install/agent-pack-uninstaller.d.ts.map +1 -0
  111. package/dist/src/install/agent-pack-uninstaller.js +113 -0
  112. package/dist/src/install/agent-pack-uninstaller.js.map +1 -0
  113. package/dist/src/install/agent-pack-uninstaller.test.d.ts +2 -0
  114. package/dist/src/install/agent-pack-uninstaller.test.d.ts.map +1 -0
  115. package/dist/src/install/agent-pack-uninstaller.test.js +212 -0
  116. package/dist/src/install/agent-pack-uninstaller.test.js.map +1 -0
  117. package/dist/src/install/index.d.ts +7 -0
  118. package/dist/src/install/index.d.ts.map +1 -1
  119. package/dist/src/install/index.js +7 -0
  120. package/dist/src/install/index.js.map +1 -1
  121. package/dist/src/install/paths.d.ts +1 -1
  122. package/dist/src/install/paths.d.ts.map +1 -1
  123. package/dist/src/install/paths.js +4 -0
  124. package/dist/src/install/paths.js.map +1 -1
  125. package/dist/src/install/paths.test.js +15 -0
  126. package/dist/src/install/paths.test.js.map +1 -1
  127. package/dist/src/journal/hash.d.ts +13 -0
  128. package/dist/src/journal/hash.d.ts.map +1 -0
  129. package/dist/src/journal/hash.js +16 -0
  130. package/dist/src/journal/hash.js.map +1 -0
  131. package/dist/src/journal/index.d.ts +15 -0
  132. package/dist/src/journal/index.d.ts.map +1 -0
  133. package/dist/src/journal/index.js +15 -0
  134. package/dist/src/journal/index.js.map +1 -0
  135. package/dist/src/journal/journal.test.d.ts +16 -0
  136. package/dist/src/journal/journal.test.d.ts.map +1 -0
  137. package/dist/src/journal/journal.test.js +171 -0
  138. package/dist/src/journal/journal.test.js.map +1 -0
  139. package/dist/src/journal/path.d.ts +44 -0
  140. package/dist/src/journal/path.d.ts.map +1 -0
  141. package/dist/src/journal/path.js +61 -0
  142. package/dist/src/journal/path.js.map +1 -0
  143. package/dist/src/journal/reader.d.ts +38 -0
  144. package/dist/src/journal/reader.d.ts.map +1 -0
  145. package/dist/src/journal/reader.js +93 -0
  146. package/dist/src/journal/reader.js.map +1 -0
  147. package/dist/src/journal/types.d.ts +87 -0
  148. package/dist/src/journal/types.d.ts.map +1 -0
  149. package/dist/src/journal/types.js +21 -0
  150. package/dist/src/journal/types.js.map +1 -0
  151. package/dist/src/journal/writer.d.ts +52 -0
  152. package/dist/src/journal/writer.d.ts.map +1 -0
  153. package/dist/src/journal/writer.js +125 -0
  154. package/dist/src/journal/writer.js.map +1 -0
  155. package/dist/src/logging/context.d.ts +58 -0
  156. package/dist/src/logging/context.d.ts.map +1 -0
  157. package/dist/src/logging/context.js +62 -0
  158. package/dist/src/logging/context.js.map +1 -0
  159. package/dist/src/logging/context.test.d.ts +14 -0
  160. package/dist/src/logging/context.test.d.ts.map +1 -0
  161. package/dist/src/logging/context.test.js +88 -0
  162. package/dist/src/logging/context.test.js.map +1 -0
  163. package/dist/src/logging/index.d.ts +13 -0
  164. package/dist/src/logging/index.d.ts.map +1 -0
  165. package/dist/src/logging/index.js +12 -0
  166. package/dist/src/logging/index.js.map +1 -0
  167. package/dist/src/logging/logger.d.ts +71 -0
  168. package/dist/src/logging/logger.d.ts.map +1 -0
  169. package/dist/src/logging/logger.js +264 -0
  170. package/dist/src/logging/logger.js.map +1 -0
  171. package/dist/src/logging/logger.test.d.ts +9 -0
  172. package/dist/src/logging/logger.test.d.ts.map +1 -0
  173. package/dist/src/logging/logger.test.js +320 -0
  174. package/dist/src/logging/logger.test.js.map +1 -0
  175. package/dist/src/logging/redact.d.ts +35 -0
  176. package/dist/src/logging/redact.d.ts.map +1 -0
  177. package/dist/src/logging/redact.js +152 -0
  178. package/dist/src/logging/redact.js.map +1 -0
  179. package/dist/src/logging/redact.test.d.ts +8 -0
  180. package/dist/src/logging/redact.test.d.ts.map +1 -0
  181. package/dist/src/logging/redact.test.js +330 -0
  182. package/dist/src/logging/redact.test.js.map +1 -0
  183. package/dist/src/logging/rotation.d.ts +75 -0
  184. package/dist/src/logging/rotation.d.ts.map +1 -0
  185. package/dist/src/logging/rotation.js +284 -0
  186. package/dist/src/logging/rotation.js.map +1 -0
  187. package/dist/src/logging/rotation.test.d.ts +11 -0
  188. package/dist/src/logging/rotation.test.d.ts.map +1 -0
  189. package/dist/src/logging/rotation.test.js +132 -0
  190. package/dist/src/logging/rotation.test.js.map +1 -0
  191. package/dist/src/logging/types.d.ts +69 -0
  192. package/dist/src/logging/types.d.ts.map +1 -0
  193. package/dist/src/logging/types.js +9 -0
  194. package/dist/src/logging/types.js.map +1 -0
  195. package/dist/src/paywall-triggers/index.d.ts +13 -0
  196. package/dist/src/paywall-triggers/index.d.ts.map +1 -0
  197. package/dist/src/paywall-triggers/index.js +13 -0
  198. package/dist/src/paywall-triggers/index.js.map +1 -0
  199. package/dist/src/paywall-triggers/path.d.ts +47 -0
  200. package/dist/src/paywall-triggers/path.d.ts.map +1 -0
  201. package/dist/src/paywall-triggers/path.js +73 -0
  202. package/dist/src/paywall-triggers/path.js.map +1 -0
  203. package/dist/src/paywall-triggers/store.d.ts +75 -0
  204. package/dist/src/paywall-triggers/store.d.ts.map +1 -0
  205. package/dist/src/paywall-triggers/store.js +122 -0
  206. package/dist/src/paywall-triggers/store.js.map +1 -0
  207. package/dist/src/paywall-triggers/store.test.d.ts +2 -0
  208. package/dist/src/paywall-triggers/store.test.d.ts.map +1 -0
  209. package/dist/src/paywall-triggers/store.test.js +121 -0
  210. package/dist/src/paywall-triggers/store.test.js.map +1 -0
  211. package/dist/src/paywall-triggers/types.d.ts +24 -0
  212. package/dist/src/paywall-triggers/types.d.ts.map +1 -0
  213. package/dist/src/paywall-triggers/types.js +13 -0
  214. package/dist/src/paywall-triggers/types.js.map +1 -0
  215. package/dist/src/security/index.d.ts +2 -0
  216. package/dist/src/security/index.d.ts.map +1 -1
  217. package/dist/src/security/index.js +4 -0
  218. package/dist/src/security/index.js.map +1 -1
  219. package/dist/src/security/scanner/SecurityScanner.compound.d.ts +13 -0
  220. package/dist/src/security/scanner/SecurityScanner.compound.d.ts.map +1 -0
  221. package/dist/src/security/scanner/SecurityScanner.compound.js +127 -0
  222. package/dist/src/security/scanner/SecurityScanner.compound.js.map +1 -0
  223. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  224. package/dist/src/security/scanner/SecurityScanner.hostile-update.d.ts +46 -0
  225. package/dist/src/security/scanner/SecurityScanner.hostile-update.d.ts.map +1 -0
  226. package/dist/src/security/scanner/SecurityScanner.hostile-update.js +209 -0
  227. package/dist/src/security/scanner/SecurityScanner.hostile-update.js.map +1 -0
  228. package/dist/src/security/scanner/SecurityScanner.js +10 -1
  229. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  230. package/dist/src/security/scanner/SecurityScanner.pii.d.ts +23 -0
  231. package/dist/src/security/scanner/SecurityScanner.pii.d.ts.map +1 -0
  232. package/dist/src/security/scanner/SecurityScanner.pii.js +152 -0
  233. package/dist/src/security/scanner/SecurityScanner.pii.js.map +1 -0
  234. package/dist/src/security/scanner/SecurityScanner.scanners.d.ts +5 -12
  235. package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -1
  236. package/dist/src/security/scanner/SecurityScanner.scanners.js +63 -137
  237. package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -1
  238. package/dist/src/security/scanner/index.d.ts +2 -1
  239. package/dist/src/security/scanner/index.d.ts.map +1 -1
  240. package/dist/src/security/scanner/index.js +2 -0
  241. package/dist/src/security/scanner/index.js.map +1 -1
  242. package/dist/src/security/scanner/patterns.d.ts +2 -0
  243. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  244. package/dist/src/security/scanner/patterns.js +79 -11
  245. package/dist/src/security/scanner/patterns.js.map +1 -1
  246. package/dist/src/security/scanner/types.d.ts +23 -0
  247. package/dist/src/security/scanner/types.d.ts.map +1 -1
  248. package/dist/src/services/agent-pack/agent-pack.test.d.ts +18 -0
  249. package/dist/src/services/agent-pack/agent-pack.test.d.ts.map +1 -0
  250. package/dist/src/services/agent-pack/agent-pack.test.js +344 -0
  251. package/dist/src/services/agent-pack/agent-pack.test.js.map +1 -0
  252. package/dist/src/services/agent-pack/hooks.d.ts +29 -0
  253. package/dist/src/services/agent-pack/hooks.d.ts.map +1 -0
  254. package/dist/src/services/agent-pack/hooks.js +139 -0
  255. package/dist/src/services/agent-pack/hooks.js.map +1 -0
  256. package/dist/src/services/agent-pack/index.d.ts +26 -0
  257. package/dist/src/services/agent-pack/index.d.ts.map +1 -0
  258. package/dist/src/services/agent-pack/index.js +109 -0
  259. package/dist/src/services/agent-pack/index.js.map +1 -0
  260. package/dist/src/services/agent-pack/prompt-source.d.ts +47 -0
  261. package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -0
  262. package/dist/src/services/agent-pack/prompt-source.js +182 -0
  263. package/dist/src/services/agent-pack/prompt-source.js.map +1 -0
  264. package/dist/src/services/agent-pack/shims.d.ts +40 -0
  265. package/dist/src/services/agent-pack/shims.d.ts.map +1 -0
  266. package/dist/src/services/agent-pack/shims.js +96 -0
  267. package/dist/src/services/agent-pack/shims.js.map +1 -0
  268. package/dist/src/services/agent-pack/skill-md.d.ts +35 -0
  269. package/dist/src/services/agent-pack/skill-md.d.ts.map +1 -0
  270. package/dist/src/services/agent-pack/skill-md.js +89 -0
  271. package/dist/src/services/agent-pack/skill-md.js.map +1 -0
  272. package/dist/src/services/agent-pack/types.d.ts +118 -0
  273. package/dist/src/services/agent-pack/types.d.ts.map +1 -0
  274. package/dist/src/services/agent-pack/types.js +61 -0
  275. package/dist/src/services/agent-pack/types.js.map +1 -0
  276. package/dist/src/services/agent-tool-profile.d.ts +59 -0
  277. package/dist/src/services/agent-tool-profile.d.ts.map +1 -0
  278. package/dist/src/services/agent-tool-profile.js +76 -0
  279. package/dist/src/services/agent-tool-profile.js.map +1 -0
  280. package/dist/src/services/agent-tool-profile.test.d.ts +2 -0
  281. package/dist/src/services/agent-tool-profile.test.d.ts.map +1 -0
  282. package/dist/src/services/agent-tool-profile.test.js +28 -0
  283. package/dist/src/services/agent-tool-profile.test.js.map +1 -0
  284. package/dist/src/services/bundled-sibling-scan.d.ts +111 -0
  285. package/dist/src/services/bundled-sibling-scan.d.ts.map +1 -0
  286. package/dist/src/services/bundled-sibling-scan.js +170 -0
  287. package/dist/src/services/bundled-sibling-scan.js.map +1 -0
  288. package/dist/src/services/skill-installation.io.d.ts +16 -5
  289. package/dist/src/services/skill-installation.io.d.ts.map +1 -1
  290. package/dist/src/services/skill-installation.io.js +63 -22
  291. package/dist/src/services/skill-installation.io.js.map +1 -1
  292. package/dist/src/services/skill-installation.policy.d.ts +96 -0
  293. package/dist/src/services/skill-installation.policy.d.ts.map +1 -0
  294. package/dist/src/services/skill-installation.policy.js +144 -0
  295. package/dist/src/services/skill-installation.policy.js.map +1 -0
  296. package/dist/src/services/skill-installation.service.d.ts.map +1 -1
  297. package/dist/src/services/skill-installation.service.js +9 -3
  298. package/dist/src/services/skill-installation.service.js.map +1 -1
  299. package/dist/src/sources/index.d.ts +1 -0
  300. package/dist/src/sources/index.d.ts.map +1 -1
  301. package/dist/src/sources/index.js +4 -0
  302. package/dist/src/sources/index.js.map +1 -1
  303. package/dist/src/sync/access-token.d.ts +27 -0
  304. package/dist/src/sync/access-token.d.ts.map +1 -0
  305. package/dist/src/sync/access-token.js +40 -0
  306. package/dist/src/sync/access-token.js.map +1 -0
  307. package/dist/src/sync/audit-notify-client.d.ts +83 -0
  308. package/dist/src/sync/audit-notify-client.d.ts.map +1 -0
  309. package/dist/src/sync/audit-notify-client.js +126 -0
  310. package/dist/src/sync/audit-notify-client.js.map +1 -0
  311. package/dist/src/sync/audit-notify-client.test.d.ts +14 -0
  312. package/dist/src/sync/audit-notify-client.test.d.ts.map +1 -0
  313. package/dist/src/sync/audit-notify-client.test.js +133 -0
  314. package/dist/src/sync/audit-notify-client.test.js.map +1 -0
  315. package/dist/src/sync/index.d.ts +2 -1
  316. package/dist/src/sync/index.d.ts.map +1 -1
  317. package/dist/src/sync/index.js +3 -1
  318. package/dist/src/sync/index.js.map +1 -1
  319. package/dist/src/sync/inventory-client.d.ts +16 -0
  320. package/dist/src/sync/inventory-client.d.ts.map +1 -1
  321. package/dist/src/sync/inventory-client.js +59 -16
  322. package/dist/src/sync/inventory-client.js.map +1 -1
  323. package/dist/src/sync/inventory-client.test.js +67 -1
  324. package/dist/src/sync/inventory-client.test.js.map +1 -1
  325. package/dist/src/sync/inventory-collector.d.ts.map +1 -1
  326. package/dist/src/sync/inventory-collector.js +32 -5
  327. package/dist/src/sync/inventory-collector.js.map +1 -1
  328. package/dist/src/sync/inventory-collector.test.js +50 -1
  329. package/dist/src/sync/inventory-collector.test.js.map +1 -1
  330. package/dist/src/sync/inventory-types.d.ts +9 -0
  331. package/dist/src/sync/inventory-types.d.ts.map +1 -1
  332. package/dist/src/sync/inventory-types.js +3 -0
  333. package/dist/src/sync/inventory-types.js.map +1 -1
  334. package/dist/src/telemetry/agent-marker.d.ts +137 -0
  335. package/dist/src/telemetry/agent-marker.d.ts.map +1 -0
  336. package/dist/src/telemetry/agent-marker.js +242 -0
  337. package/dist/src/telemetry/agent-marker.js.map +1 -0
  338. package/dist/src/telemetry/agent-marker.test.d.ts +13 -0
  339. package/dist/src/telemetry/agent-marker.test.d.ts.map +1 -0
  340. package/dist/src/telemetry/agent-marker.test.js +202 -0
  341. package/dist/src/telemetry/agent-marker.test.js.map +1 -0
  342. package/dist/src/telemetry/index.d.ts +2 -1
  343. package/dist/src/telemetry/index.d.ts.map +1 -1
  344. package/dist/src/telemetry/index.js +6 -1
  345. package/dist/src/telemetry/index.js.map +1 -1
  346. package/dist/src/telemetry/posthog.d.ts +25 -0
  347. package/dist/src/telemetry/posthog.d.ts.map +1 -1
  348. package/dist/src/telemetry/posthog.js +10 -1
  349. package/dist/src/telemetry/posthog.js.map +1 -1
  350. package/dist/src/telemetry/wrap.bench.js +5 -0
  351. package/dist/src/telemetry/wrap.bench.js.map +1 -1
  352. package/dist/src/telemetry/wrap.correlation.test.d.ts +20 -0
  353. package/dist/src/telemetry/wrap.correlation.test.d.ts.map +1 -0
  354. package/dist/src/telemetry/wrap.correlation.test.js +174 -0
  355. package/dist/src/telemetry/wrap.correlation.test.js.map +1 -0
  356. package/dist/src/telemetry/wrap.d.ts +28 -7
  357. package/dist/src/telemetry/wrap.d.ts.map +1 -1
  358. package/dist/src/telemetry/wrap.gate.test.d.ts +22 -0
  359. package/dist/src/telemetry/wrap.gate.test.d.ts.map +1 -0
  360. package/dist/src/telemetry/wrap.gate.test.js +202 -0
  361. package/dist/src/telemetry/wrap.gate.test.js.map +1 -0
  362. package/dist/src/telemetry/wrap.js +196 -52
  363. package/dist/src/telemetry/wrap.js.map +1 -1
  364. package/dist/src/telemetry/wrap.marker.test.d.ts +16 -0
  365. package/dist/src/telemetry/wrap.marker.test.d.ts.map +1 -0
  366. package/dist/src/telemetry/wrap.marker.test.js +190 -0
  367. package/dist/src/telemetry/wrap.marker.test.js.map +1 -0
  368. package/dist/src/telemetry/wrap.test.js +14 -0
  369. package/dist/src/telemetry/wrap.test.js.map +1 -1
  370. package/dist/src/types.d.ts +6 -0
  371. package/dist/src/types.d.ts.map +1 -1
  372. package/dist/tests/SecurityScanner.exec.test.js +60 -0
  373. package/dist/tests/SecurityScanner.exec.test.js.map +1 -1
  374. package/dist/tests/security/ContinuousSecurity.test.js +10 -4
  375. package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
  376. package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts +2 -0
  377. package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts.map +1 -0
  378. package/dist/tests/security/SecurityScanner.chmod-evasion.test.js +126 -0
  379. package/dist/tests/security/SecurityScanner.chmod-evasion.test.js.map +1 -0
  380. package/dist/tests/security/chmod-compound.test.d.ts +2 -0
  381. package/dist/tests/security/chmod-compound.test.d.ts.map +1 -0
  382. package/dist/tests/security/chmod-compound.test.js +188 -0
  383. package/dist/tests/security/chmod-compound.test.js.map +1 -0
  384. package/dist/tests/security/pii-detection.test.js +24 -0
  385. package/dist/tests/security/pii-detection.test.js.map +1 -1
  386. package/dist/tests/security/scanner-regression-guard.test.d.ts +23 -7
  387. package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -1
  388. package/dist/tests/security/scanner-regression-guard.test.js +206 -12
  389. package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
  390. package/dist/tests/security/sensitive-path-fp.test.d.ts +2 -0
  391. package/dist/tests/security/sensitive-path-fp.test.d.ts.map +1 -0
  392. package/dist/tests/security/sensitive-path-fp.test.js +142 -0
  393. package/dist/tests/security/sensitive-path-fp.test.js.map +1 -0
  394. package/dist/tests/services/bundled-sibling-scan.test.d.ts +2 -0
  395. package/dist/tests/services/bundled-sibling-scan.test.d.ts.map +1 -0
  396. package/dist/tests/services/bundled-sibling-scan.test.js +139 -0
  397. package/dist/tests/services/bundled-sibling-scan.test.js.map +1 -0
  398. package/dist/tests/unit/services/skill-installation.io.test.js +166 -0
  399. package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -1
  400. package/dist/tests/unit/services/skill-installation.policy.test.d.ts +8 -0
  401. package/dist/tests/unit/services/skill-installation.policy.test.d.ts.map +1 -0
  402. package/dist/tests/unit/services/skill-installation.policy.test.js +151 -0
  403. package/dist/tests/unit/services/skill-installation.policy.test.js.map +1 -0
  404. package/package.json +28 -3
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Per-harness install step for `installAgentPack` (SMI-5456 Wave 1 Step 5).
3
+ *
4
+ * One function per concern (shim, hooks, MCP registration) so the
5
+ * orchestrator (`agent-pack-installer.ts`) stays a readable top-level loop.
6
+ * Every function is additive to `entries`/`report` in place — the caller
7
+ * owns aggregation and the manifest save.
8
+ *
9
+ * @module @skillsmith/core/install/agent-pack-installer.harness
10
+ */
11
+ import { join } from 'node:path';
12
+ import { AGENT_HOOK_TARGETS, AGENT_MCP_TARGETS, AGENT_SHIM_TARGETS, } from './agent-harness-targets.js';
13
+ import { mergeJsonMcpEntry } from './agent-config-merge.json.js';
14
+ import { mergeYamlMcpEntry } from './agent-config-merge.yaml.js';
15
+ import { mergeTomlBlock } from './agent-config-merge.toml-block.js';
16
+ import { mergeJsonArrayEntry } from './agent-config-merge.json-array.js';
17
+ import { CODEX_AGENTS_FOREIGN_HEADER, CODEX_HOOKS_TABLE_CONFLICT_HEADER, CODEX_MCP_FOREIGN_HEADER, buildAgentMcpEntryValue, buildCodexMcpTomlBlock, buildCodexSessionStartHookBlock, buildOpenCodeMcpEntryValue, } from './agent-pack-installer.entry.js';
18
+ import { relocateUnderHome } from './agent-home-relocate.js';
19
+ import { writeOwnedArtifactFile } from './agent-pack-installer.fs-helpers.js';
20
+ /**
21
+ * A merge "succeeded" (our content is present in the file, whether this
22
+ * call wrote it or it already matched) whenever status is 'created',
23
+ * 'updated', OR 'unchanged'. Manifest entries must be pushed for ALL THREE —
24
+ * not just 'created'/'updated' — because the manifest is rebuilt fresh every
25
+ * `installAgentPack` run (`entries: []` at the top of the function): an
26
+ * 'unchanged' result on a re-install is not a no-op from the manifest's
27
+ * perspective, it is "this path is still part of what's installed." Gating
28
+ * the push on 'created'/'updated' only would silently drop that path from
29
+ * the manifest the moment a re-install found it already correct — the
30
+ * P-5 double-install-idempotency test caught this losing 3 of 12 entries.
31
+ * Only 'conflict' (we deliberately left a foreign entry untouched — nothing
32
+ * of ours is there) and 'error' (the write failed) are excluded.
33
+ */
34
+ function mergeSucceeded(status) {
35
+ return status === 'created' || status === 'updated' || status === 'unchanged';
36
+ }
37
+ /** Write the named-agent shim for `harness` when a target exists (claude-code/copilot/opencode). */
38
+ export function installShim(harness, artifact, ctx, report) {
39
+ const target = AGENT_SHIM_TARGETS[harness];
40
+ if (!target || !artifact)
41
+ return;
42
+ const path = relocateUnderHome(target.path, ctx.homeDir);
43
+ const result = writeOwnedArtifactFile({
44
+ path,
45
+ content: artifact.content,
46
+ executable: false,
47
+ backupDir: ctx.backupDir,
48
+ });
49
+ report.shimWritten = true;
50
+ ctx.entries.push({
51
+ path,
52
+ kind: 'shim',
53
+ harness,
54
+ backupPath: result.backupPath,
55
+ executable: false,
56
+ });
57
+ if (result.backupPath)
58
+ report.notes.push(`shim: pre-existing content backed up to ${result.backupPath}`);
59
+ }
60
+ /** Install + wire SessionStart/SessionEnd hook scripts for claude-code/cursor (JSON hook config). */
61
+ export function installJsonHooks(harness, startArtifact, endArtifact, ctx, report) {
62
+ const target = AGENT_HOOK_TARGETS[harness];
63
+ if (!target || !startArtifact || !endArtifact)
64
+ return;
65
+ const scriptDir = relocateUnderHome(target.scriptDir, ctx.homeDir);
66
+ const startPath = join(scriptDir, 'session-start.sh');
67
+ const endPath = join(scriptDir, 'session-end.sh');
68
+ const startResult = writeOwnedArtifactFile({
69
+ path: startPath,
70
+ content: startArtifact.content,
71
+ executable: true,
72
+ backupDir: ctx.backupDir,
73
+ });
74
+ const endResult = writeOwnedArtifactFile({
75
+ path: endPath,
76
+ content: endArtifact.content,
77
+ executable: true,
78
+ backupDir: ctx.backupDir,
79
+ });
80
+ ctx.entries.push({
81
+ path: startPath,
82
+ kind: 'hook-script',
83
+ harness,
84
+ backupPath: startResult.backupPath,
85
+ executable: true,
86
+ }, {
87
+ path: endPath,
88
+ kind: 'hook-script',
89
+ harness,
90
+ backupPath: endResult.backupPath,
91
+ executable: true,
92
+ });
93
+ report.hooksInstalled = true;
94
+ const configPath = relocateUnderHome(target.configPath, ctx.homeDir);
95
+ const startWire = mergeJsonArrayEntry({
96
+ path: configPath,
97
+ keyPath: target.sessionStartKeyPath,
98
+ entry: hookMatcherEntry(startPath),
99
+ isOurEntry: (item) => hookEntryCommand(item) === startPath,
100
+ backupDir: ctx.backupDir,
101
+ alreadyBackedUpPaths: ctx.backedUpPaths,
102
+ });
103
+ const endWire = mergeJsonArrayEntry({
104
+ path: configPath,
105
+ keyPath: target.sessionEndKeyPath,
106
+ entry: hookMatcherEntry(endPath),
107
+ isOurEntry: (item) => hookEntryCommand(item) === endPath,
108
+ backupDir: ctx.backupDir,
109
+ alreadyBackedUpPaths: ctx.backedUpPaths,
110
+ });
111
+ report.hookConfig.push(startWire, endWire);
112
+ if (mergeSucceeded(startWire.status) || mergeSucceeded(endWire.status)) {
113
+ ctx.entries.push({
114
+ path: configPath,
115
+ kind: 'hook-config',
116
+ harness,
117
+ backupPath: startWire.backupPath ?? endWire.backupPath,
118
+ executable: false,
119
+ });
120
+ }
121
+ }
122
+ /**
123
+ * Install hook scripts for Codex (+x) and wire the SessionStart hook into
124
+ * `~/.codex/config.toml` as a marker-delimited `[[hooks.SessionStart]]`
125
+ * array-of-tables block (shape Step-6-verified against
126
+ * developers.openai.com/codex/hooks).
127
+ *
128
+ * SessionStart ONLY — deliberate, do not "complete" this:
129
+ * - Codex has NO SessionEnd event. There is nothing to wire the
130
+ * session-end.sh cleanup script to.
131
+ * - Codex's Stop event fires PER-TURN, not per-session. Wiring the marker
132
+ * cleanup there would delete the agent-mediation marker file after the
133
+ * FIRST turn, silently unmarking every subsequent tool call in the same
134
+ * session and corrupting the mediation-share metric the whole Wave-1
135
+ * bet is measured by.
136
+ * - Cleanup therefore rides the server's 12h marker TTL
137
+ * (`telemetry/agent-marker.ts` `AGENT_MARKER_TTL_MS`) — the same
138
+ * crash-backstop path every harness already relies on.
139
+ *
140
+ * session-end.sh is still installed (inert on Codex — nothing invokes it):
141
+ * it keeps the on-disk script tree identical across hook-capable harnesses
142
+ * and stays manifest-tracked, so uninstall removes it like any other owned
143
+ * file. Zero uninstall complication.
144
+ */
145
+ export function installCodexHooks(startArtifact, endArtifact, ctx, report) {
146
+ const target = AGENT_HOOK_TARGETS.codex;
147
+ if (!target || !startArtifact || !endArtifact)
148
+ return;
149
+ const scriptDir = relocateUnderHome(target.scriptDir, ctx.homeDir);
150
+ const startPath = join(scriptDir, 'session-start.sh');
151
+ const endPath = join(scriptDir, 'session-end.sh');
152
+ const startResult = writeOwnedArtifactFile({
153
+ path: startPath,
154
+ content: startArtifact.content,
155
+ executable: true,
156
+ backupDir: ctx.backupDir,
157
+ });
158
+ const endResult = writeOwnedArtifactFile({
159
+ path: endPath,
160
+ content: endArtifact.content,
161
+ executable: true,
162
+ backupDir: ctx.backupDir,
163
+ });
164
+ ctx.entries.push({
165
+ path: startPath,
166
+ kind: 'hook-script',
167
+ harness: 'codex',
168
+ backupPath: startResult.backupPath,
169
+ executable: true,
170
+ }, {
171
+ path: endPath,
172
+ kind: 'hook-script',
173
+ harness: 'codex',
174
+ backupPath: endResult.backupPath,
175
+ executable: true,
176
+ });
177
+ report.hooksInstalled = true;
178
+ const configPath = relocateUnderHome(target.configPath, ctx.homeDir);
179
+ const wire = mergeTomlBlock({
180
+ path: configPath,
181
+ markerId: 'hooks.SessionStart',
182
+ blockContent: buildCodexSessionStartHookBlock(startPath),
183
+ foreignHeaderPattern: CODEX_HOOKS_TABLE_CONFLICT_HEADER,
184
+ backupDir: ctx.backupDir,
185
+ force: ctx.force,
186
+ alreadyBackedUpPaths: ctx.backedUpPaths,
187
+ });
188
+ report.hookConfig.push(wire);
189
+ if (mergeSucceeded(wire.status)) {
190
+ ctx.entries.push({
191
+ path: configPath,
192
+ kind: 'hook-config',
193
+ harness: 'codex',
194
+ backupPath: wire.backupPath,
195
+ executable: false,
196
+ });
197
+ }
198
+ if (wire.status === 'conflict') {
199
+ report.notes.push(`Codex hook wiring skipped: ${configPath} defines [hooks.SessionStart] as a plain TOML table — appending our [[hooks.SessionStart]] array entry would make the file invalid TOML. Wire ${startPath} manually.`);
200
+ }
201
+ if (wire.status === 'error') {
202
+ report.notes.push(`Codex hook wiring failed at ${configPath}: ${wire.errorMessage}`);
203
+ }
204
+ report.notes.push('Codex: session-end.sh installed but not wired — Codex has no SessionEnd event and its Stop event fires per-turn (wiring cleanup there would break session-scoped mediation marking); marker cleanup rides the server-side 12h TTL.');
205
+ }
206
+ function hookMatcherEntry(scriptPath) {
207
+ return { matcher: '', hooks: [{ type: 'command', command: scriptPath }] };
208
+ }
209
+ function hookEntryCommand(item) {
210
+ if (!item || typeof item !== 'object')
211
+ return undefined;
212
+ const hooks = item.hooks;
213
+ if (!Array.isArray(hooks) || hooks.length === 0)
214
+ return undefined;
215
+ const first = hooks[0];
216
+ if (!first || typeof first !== 'object')
217
+ return undefined;
218
+ const command = first.command;
219
+ return typeof command === 'string' ? command : undefined;
220
+ }
221
+ /**
222
+ * Codex's named-agent "shim" is a `[agents.skillsmith-agent]` TOML entry
223
+ * merged into the same `~/.codex/config.toml` as its MCP registration —
224
+ * the artifact's content (`shims/codex/agents.toml`, rendered by the
225
+ * locked `renderCodexToml`) is already the exact block text to install.
226
+ */
227
+ export function installCodexAgentsShim(artifact, ctx, report) {
228
+ const target = AGENT_MCP_TARGETS.codex;
229
+ if (!artifact)
230
+ return;
231
+ const path = relocateUnderHome(target.path, ctx.homeDir);
232
+ const result = mergeTomlBlock({
233
+ path,
234
+ markerId: 'agents.skillsmith-agent',
235
+ blockContent: artifact.content,
236
+ foreignHeaderPattern: CODEX_AGENTS_FOREIGN_HEADER,
237
+ backupDir: ctx.backupDir,
238
+ force: ctx.force,
239
+ alreadyBackedUpPaths: ctx.backedUpPaths,
240
+ });
241
+ if (mergeSucceeded(result.status)) {
242
+ report.shimWritten = true;
243
+ ctx.entries.push({
244
+ path,
245
+ kind: 'shim',
246
+ harness: 'codex',
247
+ backupPath: result.backupPath,
248
+ executable: false,
249
+ });
250
+ }
251
+ if (result.status === 'conflict') {
252
+ report.notes.push(`Codex agent entry at ${path} already has a hand-written [agents.skillsmith-agent] table — left untouched.`);
253
+ }
254
+ if (result.status === 'error') {
255
+ report.notes.push(`Codex agent entry merge failed at ${path}: ${result.errorMessage}`);
256
+ }
257
+ }
258
+ /** Merge the `skillsmith` MCP server registration for any of the 7 MCP-capable harnesses. */
259
+ export function installMcpConfig(harness, ctx, report) {
260
+ const target = AGENT_MCP_TARGETS[harness];
261
+ const path = relocateUnderHome(target.path, ctx.homeDir);
262
+ // OpenCode's entry schema is structurally different from the mcpServers
263
+ // convention (typed local|remote, command-array, `environment`) — see
264
+ // buildOpenCodeMcpEntryValue.
265
+ const entryValue = harness === 'opencode' ? buildOpenCodeMcpEntryValue() : buildAgentMcpEntryValue();
266
+ const result = target.format === 'json'
267
+ ? mergeJsonMcpEntry({
268
+ path,
269
+ keyPath: target.keyPath,
270
+ entryValue,
271
+ backupDir: ctx.backupDir,
272
+ force: ctx.force,
273
+ alreadyBackedUpPaths: ctx.backedUpPaths,
274
+ })
275
+ : target.format === 'yaml'
276
+ ? mergeYamlMcpEntry({
277
+ path,
278
+ mcpServersKey: target.keyPath[0] ?? 'mcp_servers',
279
+ entryValue,
280
+ backupDir: ctx.backupDir,
281
+ force: ctx.force,
282
+ alreadyBackedUpPaths: ctx.backedUpPaths,
283
+ })
284
+ : mergeTomlBlock({
285
+ path,
286
+ markerId: 'mcp_servers.skillsmith',
287
+ blockContent: buildCodexMcpTomlBlock(),
288
+ foreignHeaderPattern: CODEX_MCP_FOREIGN_HEADER,
289
+ backupDir: ctx.backupDir,
290
+ force: ctx.force,
291
+ alreadyBackedUpPaths: ctx.backedUpPaths,
292
+ });
293
+ report.mcpConfig = result;
294
+ if (mergeSucceeded(result.status)) {
295
+ ctx.entries.push({
296
+ path,
297
+ kind: 'mcp-config',
298
+ harness,
299
+ backupPath: result.backupPath,
300
+ executable: false,
301
+ });
302
+ }
303
+ if (result.status === 'conflict') {
304
+ report.notes.push(`MCP config at ${path} already has a 'skillsmith' entry that doesn't look like ours — left untouched. Re-run with --force to overwrite, or edit ${path} manually.`);
305
+ }
306
+ if (result.status === 'error') {
307
+ report.notes.push(`MCP config merge failed at ${path}: ${result.errorMessage}`);
308
+ }
309
+ }
310
+ //# sourceMappingURL=agent-pack-installer.harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pack-installer.harness.js","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.harness.ts"],"names":[],"mappings":"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"}
@@ -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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"}