@skillsmith/core 0.11.6 → 0.12.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 (211) hide show
  1. package/CHANGELOG.md +208 -0
  2. package/README.md +2 -2
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/api/client.types.d.ts +9 -0
  5. package/dist/src/api/client.types.d.ts.map +1 -1
  6. package/dist/src/api/schemas.d.ts +6 -0
  7. package/dist/src/api/schemas.d.ts.map +1 -1
  8. package/dist/src/api/schemas.js +5 -0
  9. package/dist/src/api/schemas.js.map +1 -1
  10. package/dist/src/api/security-summary.d.ts +10 -1
  11. package/dist/src/api/security-summary.d.ts.map +1 -1
  12. package/dist/src/api/security-summary.js +9 -0
  13. package/dist/src/api/security-summary.js.map +1 -1
  14. package/dist/src/api/security-summary.test.js +79 -1
  15. package/dist/src/api/security-summary.test.js.map +1 -1
  16. package/dist/src/api/types.d.ts +9 -0
  17. package/dist/src/api/types.d.ts.map +1 -1
  18. package/dist/src/exports/services.d.ts +2 -2
  19. package/dist/src/exports/services.d.ts.map +1 -1
  20. package/dist/src/exports/services.js +4 -2
  21. package/dist/src/exports/services.js.map +1 -1
  22. package/dist/src/index.d.ts +3 -2
  23. package/dist/src/index.d.ts.map +1 -1
  24. package/dist/src/index.js +8 -2
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/install/agent-config-merge.json-array.d.ts +16 -0
  27. package/dist/src/install/agent-config-merge.json-array.d.ts.map +1 -1
  28. package/dist/src/install/agent-config-merge.json-array.js +32 -3
  29. package/dist/src/install/agent-config-merge.json-array.js.map +1 -1
  30. package/dist/src/install/agent-harness-targets.d.ts +5 -0
  31. package/dist/src/install/agent-harness-targets.d.ts.map +1 -1
  32. package/dist/src/install/agent-harness-targets.js +19 -4
  33. package/dist/src/install/agent-harness-targets.js.map +1 -1
  34. package/dist/src/install/agent-pack-installer.cursor-hooks.d.ts +29 -0
  35. package/dist/src/install/agent-pack-installer.cursor-hooks.d.ts.map +1 -0
  36. package/dist/src/install/agent-pack-installer.cursor-hooks.js +233 -0
  37. package/dist/src/install/agent-pack-installer.cursor-hooks.js.map +1 -0
  38. package/dist/src/install/agent-pack-installer.cursor-hooks.test.d.ts +2 -0
  39. package/dist/src/install/agent-pack-installer.cursor-hooks.test.d.ts.map +1 -0
  40. package/dist/src/install/agent-pack-installer.cursor-hooks.test.js +225 -0
  41. package/dist/src/install/agent-pack-installer.cursor-hooks.test.js.map +1 -0
  42. package/dist/src/install/agent-pack-installer.d.ts +10 -5
  43. package/dist/src/install/agent-pack-installer.d.ts.map +1 -1
  44. package/dist/src/install/agent-pack-installer.harness.d.ts +10 -2
  45. package/dist/src/install/agent-pack-installer.harness.d.ts.map +1 -1
  46. package/dist/src/install/agent-pack-installer.harness.js +9 -2
  47. package/dist/src/install/agent-pack-installer.harness.js.map +1 -1
  48. package/dist/src/install/agent-pack-installer.js +15 -6
  49. package/dist/src/install/agent-pack-installer.js.map +1 -1
  50. package/dist/src/install/agent-pack-installer.test.js +3 -0
  51. package/dist/src/install/agent-pack-installer.test.js.map +1 -1
  52. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +25 -0
  53. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  54. package/dist/src/scripts/skill-scanner/trust-scorer.js +1 -1
  55. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
  56. package/dist/src/security/scanner/SecurityScanner.archive.d.ts +34 -0
  57. package/dist/src/security/scanner/SecurityScanner.archive.d.ts.map +1 -0
  58. package/dist/src/security/scanner/SecurityScanner.archive.js +218 -0
  59. package/dist/src/security/scanner/SecurityScanner.archive.js.map +1 -0
  60. package/dist/src/security/scanner/SecurityScanner.compound.d.ts +1 -0
  61. package/dist/src/security/scanner/SecurityScanner.compound.d.ts.map +1 -1
  62. package/dist/src/security/scanner/SecurityScanner.compound.js +117 -38
  63. package/dist/src/security/scanner/SecurityScanner.compound.js.map +1 -1
  64. package/dist/src/security/scanner/SecurityScanner.d.ts +41 -4
  65. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  66. package/dist/src/security/scanner/SecurityScanner.decoy.d.ts +72 -0
  67. package/dist/src/security/scanner/SecurityScanner.decoy.d.ts.map +1 -0
  68. package/dist/src/security/scanner/SecurityScanner.decoy.js +265 -0
  69. package/dist/src/security/scanner/SecurityScanner.decoy.js.map +1 -0
  70. package/dist/src/security/scanner/SecurityScanner.encoding.d.ts +56 -0
  71. package/dist/src/security/scanner/SecurityScanner.encoding.d.ts.map +1 -0
  72. package/dist/src/security/scanner/SecurityScanner.encoding.js +270 -0
  73. package/dist/src/security/scanner/SecurityScanner.encoding.js.map +1 -0
  74. package/dist/src/security/scanner/SecurityScanner.exec.d.ts +23 -20
  75. package/dist/src/security/scanner/SecurityScanner.exec.d.ts.map +1 -1
  76. package/dist/src/security/scanner/SecurityScanner.exec.js +207 -52
  77. package/dist/src/security/scanner/SecurityScanner.exec.js.map +1 -1
  78. package/dist/src/security/scanner/SecurityScanner.fetch-correlation.d.ts +115 -0
  79. package/dist/src/security/scanner/SecurityScanner.fetch-correlation.d.ts.map +1 -0
  80. package/dist/src/security/scanner/SecurityScanner.fetch-correlation.js +181 -0
  81. package/dist/src/security/scanner/SecurityScanner.fetch-correlation.js.map +1 -0
  82. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +14 -11
  83. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
  84. package/dist/src/security/scanner/SecurityScanner.helpers.js +26 -124
  85. package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
  86. package/dist/src/security/scanner/SecurityScanner.js +114 -36
  87. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  88. package/dist/src/security/scanner/SecurityScanner.paste-host.d.ts +69 -0
  89. package/dist/src/security/scanner/SecurityScanner.paste-host.d.ts.map +1 -0
  90. package/dist/src/security/scanner/SecurityScanner.paste-host.js +342 -0
  91. package/dist/src/security/scanner/SecurityScanner.paste-host.js.map +1 -0
  92. package/dist/src/security/scanner/SecurityScanner.risk-score.d.ts +27 -0
  93. package/dist/src/security/scanner/SecurityScanner.risk-score.d.ts.map +1 -0
  94. package/dist/src/security/scanner/SecurityScanner.risk-score.js +178 -0
  95. package/dist/src/security/scanner/SecurityScanner.risk-score.js.map +1 -0
  96. package/dist/src/security/scanner/SecurityScanner.urls.d.ts +20 -0
  97. package/dist/src/security/scanner/SecurityScanner.urls.d.ts.map +1 -0
  98. package/dist/src/security/scanner/SecurityScanner.urls.js +26 -0
  99. package/dist/src/security/scanner/SecurityScanner.urls.js.map +1 -0
  100. package/dist/src/security/scanner/index.d.ts +2 -2
  101. package/dist/src/security/scanner/index.d.ts.map +1 -1
  102. package/dist/src/security/scanner/index.js +5 -1
  103. package/dist/src/security/scanner/index.js.map +1 -1
  104. package/dist/src/security/scanner/multiline-category-closure.test.js +6 -0
  105. package/dist/src/security/scanner/multiline-category-closure.test.js.map +1 -1
  106. package/dist/src/security/scanner/patterns.d.ts +41 -21
  107. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  108. package/dist/src/security/scanner/patterns.exec.d.ts +89 -0
  109. package/dist/src/security/scanner/patterns.exec.d.ts.map +1 -0
  110. package/dist/src/security/scanner/patterns.exec.js +115 -0
  111. package/dist/src/security/scanner/patterns.exec.js.map +1 -0
  112. package/dist/src/security/scanner/patterns.js +78 -41
  113. package/dist/src/security/scanner/patterns.js.map +1 -1
  114. package/dist/src/security/scanner/types.d.ts +15 -1
  115. package/dist/src/security/scanner/types.d.ts.map +1 -1
  116. package/dist/src/security/scanner/typosquat.d.ts +10 -0
  117. package/dist/src/security/scanner/typosquat.d.ts.map +1 -1
  118. package/dist/src/security/scanner/typosquat.js +5 -1
  119. package/dist/src/security/scanner/typosquat.js.map +1 -1
  120. package/dist/src/security/scanner/weights.d.ts +12 -3
  121. package/dist/src/security/scanner/weights.d.ts.map +1 -1
  122. package/dist/src/security/scanner/weights.js +50 -1
  123. package/dist/src/security/scanner/weights.js.map +1 -1
  124. package/dist/src/services/agent-pack/prompt-source.d.ts +15 -0
  125. package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -1
  126. package/dist/src/services/agent-pack/prompt-source.js +32 -1
  127. package/dist/src/services/agent-pack/prompt-source.js.map +1 -1
  128. package/dist/src/services/agent-pack/skill-md.d.ts.map +1 -1
  129. package/dist/src/services/agent-pack/skill-md.js +9 -1
  130. package/dist/src/services/agent-pack/skill-md.js.map +1 -1
  131. package/dist/src/services/bundled-sibling-scan.d.ts +87 -13
  132. package/dist/src/services/bundled-sibling-scan.d.ts.map +1 -1
  133. package/dist/src/services/bundled-sibling-scan.js +177 -33
  134. package/dist/src/services/bundled-sibling-scan.js.map +1 -1
  135. package/dist/src/services/recommend-guard.d.ts +19 -0
  136. package/dist/src/services/recommend-guard.d.ts.map +1 -1
  137. package/dist/src/services/recommend-guard.js +28 -0
  138. package/dist/src/services/recommend-guard.js.map +1 -1
  139. package/dist/src/services/recommend-guard.test.js +23 -3
  140. package/dist/src/services/recommend-guard.test.js.map +1 -1
  141. package/dist/src/sync/index.d.ts +1 -0
  142. package/dist/src/sync/index.d.ts.map +1 -1
  143. package/dist/src/sync/index.js +2 -0
  144. package/dist/src/sync/index.js.map +1 -1
  145. package/dist/src/sync/license-status-client.d.ts +56 -0
  146. package/dist/src/sync/license-status-client.d.ts.map +1 -0
  147. package/dist/src/sync/license-status-client.js +118 -0
  148. package/dist/src/sync/license-status-client.js.map +1 -0
  149. package/dist/src/sync/license-status-client.test.d.ts +14 -0
  150. package/dist/src/sync/license-status-client.test.d.ts.map +1 -0
  151. package/dist/src/sync/license-status-client.test.js +136 -0
  152. package/dist/src/sync/license-status-client.test.js.map +1 -0
  153. package/dist/src/types.d.ts +13 -0
  154. package/dist/src/types.d.ts.map +1 -1
  155. package/dist/src/utils/version-check.d.ts +58 -5
  156. package/dist/src/utils/version-check.d.ts.map +1 -1
  157. package/dist/src/utils/version-check.js +73 -2
  158. package/dist/src/utils/version-check.js.map +1 -1
  159. package/dist/src/utils/version-check.test.js +49 -10
  160. package/dist/src/utils/version-check.test.js.map +1 -1
  161. package/dist/tests/SecurityScanner.scoring.test.js +123 -0
  162. package/dist/tests/SecurityScanner.scoring.test.js.map +1 -1
  163. package/dist/tests/security/advisory-severity-guard.test.d.ts +20 -0
  164. package/dist/tests/security/advisory-severity-guard.test.d.ts.map +1 -0
  165. package/dist/tests/security/advisory-severity-guard.test.js +70 -0
  166. package/dist/tests/security/advisory-severity-guard.test.js.map +1 -0
  167. package/dist/tests/security/archive-evasion.test.d.ts +2 -0
  168. package/dist/tests/security/archive-evasion.test.d.ts.map +1 -0
  169. package/dist/tests/security/archive-evasion.test.js +126 -0
  170. package/dist/tests/security/archive-evasion.test.js.map +1 -0
  171. package/dist/tests/security/clawhavoc-e2e.fixtures.d.ts +71 -0
  172. package/dist/tests/security/clawhavoc-e2e.fixtures.d.ts.map +1 -0
  173. package/dist/tests/security/clawhavoc-e2e.fixtures.js +135 -0
  174. package/dist/tests/security/clawhavoc-e2e.fixtures.js.map +1 -0
  175. package/dist/tests/security/co-signal-escalation.test.d.ts +30 -0
  176. package/dist/tests/security/co-signal-escalation.test.d.ts.map +1 -0
  177. package/dist/tests/security/co-signal-escalation.test.js +494 -0
  178. package/dist/tests/security/co-signal-escalation.test.js.map +1 -0
  179. package/dist/tests/security/decoy-misdirection.test.d.ts +2 -0
  180. package/dist/tests/security/decoy-misdirection.test.d.ts.map +1 -0
  181. package/dist/tests/security/decoy-misdirection.test.js +130 -0
  182. package/dist/tests/security/decoy-misdirection.test.js.map +1 -0
  183. package/dist/tests/security/encoded-payload.test.d.ts +2 -0
  184. package/dist/tests/security/encoded-payload.test.d.ts.map +1 -0
  185. package/dist/tests/security/encoded-payload.test.js +199 -0
  186. package/dist/tests/security/encoded-payload.test.js.map +1 -0
  187. package/dist/tests/security/gatekeeper-bypass.test.d.ts +2 -0
  188. package/dist/tests/security/gatekeeper-bypass.test.d.ts.map +1 -0
  189. package/dist/tests/security/gatekeeper-bypass.test.js +167 -0
  190. package/dist/tests/security/gatekeeper-bypass.test.js.map +1 -0
  191. package/dist/tests/security/paste-host-fetch.test.d.ts +2 -0
  192. package/dist/tests/security/paste-host-fetch.test.d.ts.map +1 -0
  193. package/dist/tests/security/paste-host-fetch.test.js +199 -0
  194. package/dist/tests/security/paste-host-fetch.test.js.map +1 -0
  195. package/dist/tests/security/scanner-regression-guard.test.js +5 -0
  196. package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
  197. package/dist/tests/security/smi5879-corroboration.core.test.d.ts +31 -0
  198. package/dist/tests/security/smi5879-corroboration.core.test.d.ts.map +1 -0
  199. package/dist/tests/security/smi5879-corroboration.core.test.js +157 -0
  200. package/dist/tests/security/smi5879-corroboration.core.test.js.map +1 -0
  201. package/dist/tests/services/aidefence-feedback.test.js +5 -0
  202. package/dist/tests/services/aidefence-feedback.test.js.map +1 -1
  203. package/dist/tests/services/bundled-sibling-scan.test.js +171 -10
  204. package/dist/tests/services/bundled-sibling-scan.test.js.map +1 -1
  205. package/dist/tests/skill-md-cli-fallback-parity.test.d.ts +22 -0
  206. package/dist/tests/skill-md-cli-fallback-parity.test.d.ts.map +1 -0
  207. package/dist/tests/skill-md-cli-fallback-parity.test.js +92 -0
  208. package/dist/tests/skill-md-cli-fallback-parity.test.js.map +1 -0
  209. package/dist/tests/skill-scanner/allowlist.test.js +14 -1
  210. package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
  211. package/package.json +7 -7
@@ -36,7 +36,14 @@ function setAtPath(root, keyPath, value) {
36
36
  if (lastKey !== undefined)
37
37
  cur[lastKey] = value;
38
38
  }
39
- function writeBackup(sourcePath, backupDir) {
39
+ /**
40
+ * Exported for reuse by the Cursor legacy-key cleanup step
41
+ * (`agent-pack-installer.cursor-hooks.ts`, SMI-5893 Wave 10) — same backup
42
+ * convention (timestamped `.bak` file in the run's backup dir), needed
43
+ * outside the normal merge-entry path when mutating a config file for a
44
+ * reason other than adding/updating our own array entry.
45
+ */
46
+ export function writeBackup(sourcePath, backupDir) {
40
47
  mkdirSync(backupDir, { recursive: true, mode: 0o700 });
41
48
  const stamp = new Date().toISOString().replace(/[:.]/g, '-');
42
49
  const baseName = sourcePath.split('/').pop() ?? 'config';
@@ -46,7 +53,7 @@ function writeBackup(sourcePath, backupDir) {
46
53
  }
47
54
  /** Add or update our entry in a JSON array at `keyPath`, leaving every other array item untouched. */
48
55
  export function mergeJsonArrayEntry(opts) {
49
- const { path, keyPath, entry, isOurEntry, backupDir, alreadyBackedUpPaths } = opts;
56
+ const { path, keyPath, entry, isOurEntry, backupDir, alreadyBackedUpPaths, ensureTopLevelDefaults, } = opts;
50
57
  let doc = {};
51
58
  const existed = existsSync(path);
52
59
  if (existed) {
@@ -68,11 +75,33 @@ export function mergeJsonArrayEntry(opts) {
68
75
  return { status: 'error', path, backupPath: null, errorMessage: e.message };
69
76
  }
70
77
  }
78
+ let missingDefaults = false;
79
+ if (ensureTopLevelDefaults) {
80
+ for (const [key, value] of Object.entries(ensureTopLevelDefaults)) {
81
+ const existingValue = doc[key];
82
+ if (existingValue === undefined) {
83
+ doc[key] = value;
84
+ missingDefaults = true;
85
+ }
86
+ else if (!deepEqualJson(existingValue, value)) {
87
+ // PR #2375 review follow-up: a pre-existing top-level default (e.g.
88
+ // Cursor's required `"version": 1`) with an INCOMPATIBLE value was
89
+ // previously silently left as-is while we merged our hook entries
90
+ // in anyway — producing a file that still failed the schema check
91
+ // this default exists to satisfy. Fail closed instead: report a
92
+ // conflict and write nothing, matching this module's existing
93
+ // array-entry conflict contract rather than the array-merge
94
+ // header comment's "no foreign-entry conflict" claim, which only
95
+ // ever applied to array entries, not top-level sibling keys.
96
+ return { status: 'conflict', path, backupPath: null };
97
+ }
98
+ }
99
+ }
71
100
  const rawArray = getAtPath(doc, keyPath);
72
101
  const array = Array.isArray(rawArray) ? [...rawArray] : [];
73
102
  const existingIndex = array.findIndex(isOurEntry);
74
103
  if (existingIndex >= 0) {
75
- if (deepEqualJson(array[existingIndex], entry)) {
104
+ if (deepEqualJson(array[existingIndex], entry) && !missingDefaults) {
76
105
  return { status: 'unchanged', path, backupPath: null };
77
106
  }
78
107
  const backupPath = existed && shouldBackup(path, alreadyBackedUpPaths) ? writeBackup(path, backupDir) : null;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-config-merge.json-array.js","sourceRoot":"","sources":["../../../src/install/agent-config-merge.json-array.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-config-merge.json-array.js","sourceRoot":"","sources":["../../../src/install/agent-config-merge.json-array.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,11 @@
15
15
  * - claude-code, cursor, windsurf: HIGH — MCP config path/shape verified
16
16
  * against `packages/cli/src/templates/mcp-server.template.snippets.ts`
17
17
  * (SMI-4580, already shipped and used in docs/website).
18
+ * - cursor HOOK config specifically: was WRONG (Claude-shaped keys/entry
19
+ * values, contradicted by a live Cursor UAT report) until SMI-5893 Wave
20
+ * 8a; now HIGH — re-verified 2026-08 against three independent fetches
21
+ * of cursor.com/docs/hooks. See {@link AGENT_HOOK_TARGETS}.cursor's own
22
+ * comment for the confirmed shape.
18
23
  * - hermes: HIGH for the skill path + YAML config shape (spike report §(b),
19
24
  * 3 independent official doc pages agree); hooks are spike-verified
20
25
  * ABSENT (no SessionStart equivalent) — {@link AGENT_HOOK_TARGETS}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-harness-targets.d.ts","sourceRoot":"","sources":["../../../src/install/agent-harness-targets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAA;AAE5D,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,CAAA;AAEzD;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,YAAY,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,SAAS,CAAA;IAClB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC3C,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,YAAY,CAAA;IAC1B,sEAAsE;IACtE,mBAAmB,EAAE,MAAM,EAAE,CAAA;IAC7B,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC5B;AAID,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CA2C7E,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,CAqB7E,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CACvC,MAAM,CAAC,aAAa,GAAG,QAAQ,GAAG,OAAO,EAAE,iBAAiB,CAAC,CA+B9D,CAAA;AAED,4GAA4G;AAC5G,eAAO,MAAM,sBAAsB,QAA+B,CAAA"}
1
+ {"version":3,"file":"agent-harness-targets.d.ts","sourceRoot":"","sources":["../../../src/install/agent-harness-targets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAA;AAE5D,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,CAAA;AAEzD;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,YAAY,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,SAAS,CAAA;IAClB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC3C,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,YAAY,CAAA;IAC1B,sEAAsE;IACtE,mBAAmB,EAAE,MAAM,EAAE,CAAA;IAC7B,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC5B;AAID,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CA2C7E,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,CAqB7E,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CACvC,MAAM,CAAC,aAAa,GAAG,QAAQ,GAAG,OAAO,EAAE,iBAAiB,CAAC,CAyC9D,CAAA;AAED,4GAA4G;AAC5G,eAAO,MAAM,sBAAsB,QAA+B,CAAA"}
@@ -15,6 +15,11 @@
15
15
  * - claude-code, cursor, windsurf: HIGH — MCP config path/shape verified
16
16
  * against `packages/cli/src/templates/mcp-server.template.snippets.ts`
17
17
  * (SMI-4580, already shipped and used in docs/website).
18
+ * - cursor HOOK config specifically: was WRONG (Claude-shaped keys/entry
19
+ * values, contradicted by a live Cursor UAT report) until SMI-5893 Wave
20
+ * 8a; now HIGH — re-verified 2026-08 against three independent fetches
21
+ * of cursor.com/docs/hooks. See {@link AGENT_HOOK_TARGETS}.cursor's own
22
+ * comment for the confirmed shape.
18
23
  * - hermes: HIGH for the skill path + YAML config shape (spike report §(b),
19
24
  * 3 independent official doc pages agree); hooks are spike-verified
20
25
  * ABSENT (no SessionStart equivalent) — {@link AGENT_HOOK_TARGETS}
@@ -132,10 +137,20 @@ export const AGENT_HOOK_TARGETS = {
132
137
  scriptDir: join(home, '.cursor', 'hooks'),
133
138
  configPath: join(home, '.cursor', 'hooks.json'),
134
139
  configFormat: 'json',
135
- // Cursor's hooks.json is Claude-compatible (PRD §3.1) but is itself the
136
- // hooks map (no wrapping "hooks" key) see module header confidence note.
137
- sessionStartKeyPath: ['SessionStart'],
138
- sessionEndKeyPath: ['SessionEnd'],
140
+ // Cursor's hooks.json is NOT Claude-compatible an earlier code comment
141
+ // here claimed otherwise (PRD §3.1) and a live Cursor UAT report (GH#2368
142
+ // C-06/SMI-5893 Wave 8) contradicted it. Verified 2026-08 against three
143
+ // independent fetches of cursor.com/docs/hooks: the file is a top-level
144
+ // `{ "version": 1, "hooks": {...} }` envelope, with `hooks.sessionStart` /
145
+ // `hooks.sessionEnd` each an array of `{ "command": "<path>" }` entries —
146
+ // no Claude-style `matcher`/`type` wrapper. The key paths below point at
147
+ // the arrays WITHIN that `hooks` object (the merge helper creates the
148
+ // wrapper automatically); `installCursorHooks`
149
+ // (agent-pack-installer.harness.ts) separately ensures the top-level
150
+ // `version: 1` sibling and uses its own Cursor-specific entry-value
151
+ // builder — NOT the shared Claude-shaped `hookMatcherEntry`.
152
+ sessionStartKeyPath: ['hooks', 'sessionStart'],
153
+ sessionEndKeyPath: ['hooks', 'sessionEnd'],
139
154
  },
140
155
  codex: {
141
156
  harness: 'codex',
@@ -1 +1 @@
1
- {"version":3,"file":"agent-harness-targets.js","sourceRoot":"","sources":["../../../src/install/agent-harness-targets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-harness-targets.js","sourceRoot":"","sources":["../../../src/install/agent-harness-targets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Cursor-specific hook install + wiring step, split out of
3
+ * `agent-pack-installer.harness.ts` (SMI-5893 Wave 8a — 500-line file gate).
4
+ *
5
+ * @module @skillsmith/core/install/agent-pack-installer.cursor-hooks
6
+ */
7
+ import type { AgentPackArtifact } from '../services/agent-pack/index.js';
8
+ import type { HarnessInstallCtx } from './agent-pack-installer.harness.js';
9
+ import type { HarnessInstallReport } from './agent-pack-installer.types.js';
10
+ /**
11
+ * Install + wire SessionStart/SessionEnd hook scripts for Cursor.
12
+ *
13
+ * Deliberately NOT folded into `installJsonHooks` (claude-code): Cursor's
14
+ * `hooks.json` is structurally different from Claude's, not just
15
+ * differently-keyed (SMI-5893 Wave 8a, correcting a false Claude-compatible
16
+ * claim). Confirmed 2026-08 against three independent fetches of
17
+ * cursor.com/docs/hooks — the file is `{ "version": 1, "hooks": {...} }`,
18
+ * with `hooks.sessionStart`/`hooks.sessionEnd` arrays of direct
19
+ * `{ "command": "<path>" }` entries. No `matcher`/`type` wrapper, unlike
20
+ * Claude's `{ matcher: '', hooks: [{ type: 'command', command }] }` — reusing
21
+ * that shape here would emit schema-invalid entries Cursor can't parse.
22
+ * Reuses the same generic array-merge engine (`mergeJsonArrayEntry`) as
23
+ * claude-code, with its own entry-value builder (`cursorHookEntry`) /
24
+ * ownership predicate (`cursorHookEntryCommand`) and the
25
+ * `ensureTopLevelDefaults` option to add the required `"version": 1`
26
+ * sibling.
27
+ */
28
+ export declare function installCursorHooks(startArtifact: AgentPackArtifact | undefined, endArtifact: AgentPackArtifact | undefined, ctx: HarnessInstallCtx, report: HarnessInstallReport): void;
29
+ //# sourceMappingURL=agent-pack-installer.cursor-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pack-installer.cursor-hooks.d.ts","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.cursor-hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAOxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AAgB3E;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,iBAAiB,GAAG,SAAS,EAC5C,WAAW,EAAE,iBAAiB,GAAG,SAAS,EAC1C,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CA0FN"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Cursor-specific hook install + wiring step, split out of
3
+ * `agent-pack-installer.harness.ts` (SMI-5893 Wave 8a — 500-line file gate).
4
+ *
5
+ * @module @skillsmith/core/install/agent-pack-installer.cursor-hooks
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { AGENT_HOOK_TARGETS } from './agent-harness-targets.js';
10
+ import { mergeJsonArrayEntry, writeBackup } from './agent-config-merge.json-array.js';
11
+ import { shouldBackup, markBackedUp } from './agent-config-merge.types.js';
12
+ import { relocateUnderHome } from './agent-home-relocate.js';
13
+ import { writeOwnedArtifactFile } from './agent-pack-installer.fs-helpers.js';
14
+ import { hookEntryCommand } from './agent-pack-installer.harness.js';
15
+ /** Same predicate as `agent-pack-installer.harness.ts`'s private `mergeSucceeded` — duplicated rather than exported to keep that module's helper private. */
16
+ function mergeSucceeded(status) {
17
+ return status === 'created' || status === 'updated' || status === 'unchanged';
18
+ }
19
+ /**
20
+ * Top-level `hooks.json` keys Cursor requires alongside its `"hooks"`
21
+ * object — set once, only when absent, never overwritten. See
22
+ * {@link AGENT_HOOK_TARGETS}.cursor's comment (`agent-harness-targets.ts`)
23
+ * for the full shape rationale (SMI-5893 Wave 8a).
24
+ */
25
+ const CURSOR_HOOKS_JSON_DEFAULTS = { version: 1 };
26
+ /**
27
+ * Install + wire SessionStart/SessionEnd hook scripts for Cursor.
28
+ *
29
+ * Deliberately NOT folded into `installJsonHooks` (claude-code): Cursor's
30
+ * `hooks.json` is structurally different from Claude's, not just
31
+ * differently-keyed (SMI-5893 Wave 8a, correcting a false Claude-compatible
32
+ * claim). Confirmed 2026-08 against three independent fetches of
33
+ * cursor.com/docs/hooks — the file is `{ "version": 1, "hooks": {...} }`,
34
+ * with `hooks.sessionStart`/`hooks.sessionEnd` arrays of direct
35
+ * `{ "command": "<path>" }` entries. No `matcher`/`type` wrapper, unlike
36
+ * Claude's `{ matcher: '', hooks: [{ type: 'command', command }] }` — reusing
37
+ * that shape here would emit schema-invalid entries Cursor can't parse.
38
+ * Reuses the same generic array-merge engine (`mergeJsonArrayEntry`) as
39
+ * claude-code, with its own entry-value builder (`cursorHookEntry`) /
40
+ * ownership predicate (`cursorHookEntryCommand`) and the
41
+ * `ensureTopLevelDefaults` option to add the required `"version": 1`
42
+ * sibling.
43
+ */
44
+ export function installCursorHooks(startArtifact, endArtifact, ctx, report) {
45
+ const target = AGENT_HOOK_TARGETS.cursor;
46
+ if (!target || !startArtifact || !endArtifact)
47
+ return;
48
+ const scriptDir = relocateUnderHome(target.scriptDir, ctx.homeDir);
49
+ const startPath = join(scriptDir, 'session-start.sh');
50
+ const endPath = join(scriptDir, 'session-end.sh');
51
+ const startResult = writeOwnedArtifactFile({
52
+ path: startPath,
53
+ content: startArtifact.content,
54
+ executable: true,
55
+ backupDir: ctx.backupDir,
56
+ });
57
+ const endResult = writeOwnedArtifactFile({
58
+ path: endPath,
59
+ content: endArtifact.content,
60
+ executable: true,
61
+ backupDir: ctx.backupDir,
62
+ });
63
+ ctx.entries.push({
64
+ path: startPath,
65
+ kind: 'hook-script',
66
+ harness: 'cursor',
67
+ backupPath: startResult.backupPath,
68
+ executable: true,
69
+ }, {
70
+ path: endPath,
71
+ kind: 'hook-script',
72
+ harness: 'cursor',
73
+ backupPath: endResult.backupPath,
74
+ executable: true,
75
+ });
76
+ report.hooksInstalled = true;
77
+ const configPath = relocateUnderHome(target.configPath, ctx.homeDir);
78
+ const startWire = mergeJsonArrayEntry({
79
+ path: configPath,
80
+ keyPath: target.sessionStartKeyPath,
81
+ entry: cursorHookEntry(startPath),
82
+ isOurEntry: (item) => cursorHookEntryCommand(item) === startPath,
83
+ backupDir: ctx.backupDir,
84
+ alreadyBackedUpPaths: ctx.backedUpPaths,
85
+ ensureTopLevelDefaults: CURSOR_HOOKS_JSON_DEFAULTS,
86
+ });
87
+ const endWire = mergeJsonArrayEntry({
88
+ path: configPath,
89
+ keyPath: target.sessionEndKeyPath,
90
+ entry: cursorHookEntry(endPath),
91
+ isOurEntry: (item) => cursorHookEntryCommand(item) === endPath,
92
+ backupDir: ctx.backupDir,
93
+ alreadyBackedUpPaths: ctx.backedUpPaths,
94
+ ensureTopLevelDefaults: CURSOR_HOOKS_JSON_DEFAULTS,
95
+ });
96
+ report.hookConfig.push(startWire, endWire);
97
+ // SMI-5893 Wave 10 (GH#2368 C-07): a pre-Wave-8a install wrote Claude-shaped
98
+ // entries under the capitalized `hooks.SessionStart`/`hooks.SessionEnd`
99
+ // keys before this file's shape was corrected — those never got removed
100
+ // once the lowercase keys above started being written, so a re-merge left
101
+ // both the correct new keys AND the dead legacy ones in the same file.
102
+ //
103
+ // Code-review finding (data-loss): skip the cleanup entirely when either
104
+ // wire call reported `'conflict'` (an incompatible top-level `version`,
105
+ // via `ensureTopLevelDefaults`) — `mergeJsonArrayEntry` deliberately wrote
106
+ // NOTHING in that case, and running the cleanup regardless would still
107
+ // silently rewrite the file (deleting the user's legacy hooks with
108
+ // nothing installed to replace them) even though the real installer
109
+ // refused to touch it.
110
+ const wireConflict = startWire.status === 'conflict' || endWire.status === 'conflict';
111
+ const legacyCleanup = wireConflict
112
+ ? null
113
+ : stripStaleLegacyHookKeys(configPath, startPath, endPath, ctx);
114
+ if (legacyCleanup)
115
+ report.hookConfig.push(legacyCleanup);
116
+ if (mergeSucceeded(startWire.status) ||
117
+ mergeSucceeded(endWire.status) ||
118
+ (legacyCleanup !== null && mergeSucceeded(legacyCleanup.status))) {
119
+ ctx.entries.push({
120
+ path: configPath,
121
+ kind: 'hook-config',
122
+ harness: 'cursor',
123
+ backupPath: startWire.backupPath ?? endWire.backupPath ?? legacyCleanup?.backupPath ?? null,
124
+ executable: false,
125
+ });
126
+ }
127
+ }
128
+ /**
129
+ * Remove ONLY Skillsmith-owned legacy Claude-shaped entries
130
+ * (`{ matcher: '', hooks: [{ type: 'command', command: <ourPath> }] }`) from
131
+ * the capitalized `hooks.SessionStart`/`hooks.SessionEnd` keys a pre-Wave-8a
132
+ * install wrote — the legacy key names are derived from
133
+ * `AGENT_HOOK_TARGETS['claude-code']`'s own keyPaths (not hardcoded
134
+ * literals) so a future change to Claude's keyPath shape doesn't silently
135
+ * desync this cleanup from what it's actually meant to match. Scoped
136
+ * narrowly per plan review: any other entry under those same legacy keys —
137
+ * a user's own hook, or another tool's — is left untouched, and the whole
138
+ * legacy key is only deleted once it's empty of everything but our own
139
+ * entries (including a legacy key that was ALREADY an empty array — a dead
140
+ * key from a prior interrupted cleanup, also removed). A malformed
141
+ * (non-array) legacy value is left alone rather than crashing.
142
+ *
143
+ * Caller MUST skip calling this entirely when either sibling
144
+ * `mergeJsonArrayEntry` call reported `'conflict'` — see the code-review
145
+ * finding noted at the call site.
146
+ *
147
+ * @returns a `MergeResult` in this module's existing shape so the caller
148
+ * can fold it into `report.hookConfig` alongside the two wire results —
149
+ * `'unchanged'` for a genuine no-op (no file, no `hooks` object, or
150
+ * nothing of ours to remove), `'error'` if the file exists but couldn't
151
+ * be read/parsed (surfaced instead of silently looking like a no-op —
152
+ * code-review finding), `'updated'` when something was actually removed.
153
+ */
154
+ function stripStaleLegacyHookKeys(configPath, startPath, endPath, ctx) {
155
+ const unchanged = () => ({ status: 'unchanged', path: configPath, backupPath: null });
156
+ if (!existsSync(configPath))
157
+ return unchanged();
158
+ let doc;
159
+ try {
160
+ const parsed = JSON.parse(readFileSync(configPath, 'utf-8'));
161
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
162
+ return {
163
+ status: 'error',
164
+ path: configPath,
165
+ backupPath: null,
166
+ errorMessage: 'not a JSON object',
167
+ };
168
+ }
169
+ doc = parsed;
170
+ }
171
+ catch (e) {
172
+ return {
173
+ status: 'error',
174
+ path: configPath,
175
+ backupPath: null,
176
+ errorMessage: e.message,
177
+ };
178
+ }
179
+ const hooks = doc.hooks;
180
+ if (!hooks || typeof hooks !== 'object' || Array.isArray(hooks))
181
+ return unchanged();
182
+ const hooksObj = hooks;
183
+ const claudeTarget = AGENT_HOOK_TARGETS['claude-code'];
184
+ const legacyStartKey = claudeTarget.sessionStartKeyPath.at(-1);
185
+ const legacyEndKey = claudeTarget.sessionEndKeyPath.at(-1);
186
+ let changed = false;
187
+ for (const [legacyKey, ownPath] of [
188
+ [legacyStartKey, startPath],
189
+ [legacyEndKey, endPath],
190
+ ]) {
191
+ if (legacyKey === undefined)
192
+ continue;
193
+ const legacyValue = hooksObj[legacyKey];
194
+ if (legacyValue === undefined)
195
+ continue;
196
+ // Malformed/hand-edited (not an array) — don't touch it, don't crash.
197
+ if (!Array.isArray(legacyValue))
198
+ continue;
199
+ const remaining = legacyValue.filter((item) => hookEntryCommand(item) !== ownPath);
200
+ // Clean up if something of ours was actually filtered out, OR the key
201
+ // was already a dead empty array (e.g. a prior interrupted cleanup) —
202
+ // both cases leave nothing worth keeping under this legacy key.
203
+ const needsCleanup = legacyValue.length === 0 || remaining.length !== legacyValue.length;
204
+ if (!needsCleanup)
205
+ continue;
206
+ changed = true;
207
+ if (remaining.length === 0) {
208
+ delete hooksObj[legacyKey];
209
+ }
210
+ else {
211
+ hooksObj[legacyKey] = remaining;
212
+ }
213
+ }
214
+ if (!changed)
215
+ return unchanged();
216
+ const backupPath = shouldBackup(configPath, ctx.backedUpPaths)
217
+ ? writeBackup(configPath, ctx.backupDir)
218
+ : null;
219
+ markBackedUp(configPath, ctx.backedUpPaths);
220
+ writeFileSync(configPath, JSON.stringify(doc, null, 2) + '\n', { mode: 0o600 });
221
+ return { status: 'updated', path: configPath, backupPath };
222
+ }
223
+ /** Cursor's hook entry is a direct `{ command }` object — no `matcher`/`type` wrapper (unlike Claude's `hookMatcherEntry`). */
224
+ function cursorHookEntry(scriptPath) {
225
+ return { command: scriptPath };
226
+ }
227
+ function cursorHookEntryCommand(item) {
228
+ if (!item || typeof item !== 'object')
229
+ return undefined;
230
+ const command = item.command;
231
+ return typeof command === 'string' ? command : undefined;
232
+ }
233
+ //# sourceMappingURL=agent-pack-installer.cursor-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pack-installer.cursor-hooks.js","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.cursor-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-pack-installer.cursor-hooks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pack-installer.cursor-hooks.test.d.ts","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.cursor-hooks.test.ts"],"names":[],"mappings":""}