@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.
- package/CHANGELOG.md +208 -0
- package/README.md +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/api/client.types.d.ts +9 -0
- package/dist/src/api/client.types.d.ts.map +1 -1
- package/dist/src/api/schemas.d.ts +6 -0
- package/dist/src/api/schemas.d.ts.map +1 -1
- package/dist/src/api/schemas.js +5 -0
- package/dist/src/api/schemas.js.map +1 -1
- package/dist/src/api/security-summary.d.ts +10 -1
- package/dist/src/api/security-summary.d.ts.map +1 -1
- package/dist/src/api/security-summary.js +9 -0
- package/dist/src/api/security-summary.js.map +1 -1
- package/dist/src/api/security-summary.test.js +79 -1
- package/dist/src/api/security-summary.test.js.map +1 -1
- package/dist/src/api/types.d.ts +9 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/exports/services.d.ts +2 -2
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +4 -2
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/install/agent-config-merge.json-array.d.ts +16 -0
- package/dist/src/install/agent-config-merge.json-array.d.ts.map +1 -1
- package/dist/src/install/agent-config-merge.json-array.js +32 -3
- package/dist/src/install/agent-config-merge.json-array.js.map +1 -1
- package/dist/src/install/agent-harness-targets.d.ts +5 -0
- package/dist/src/install/agent-harness-targets.d.ts.map +1 -1
- package/dist/src/install/agent-harness-targets.js +19 -4
- package/dist/src/install/agent-harness-targets.js.map +1 -1
- package/dist/src/install/agent-pack-installer.cursor-hooks.d.ts +29 -0
- package/dist/src/install/agent-pack-installer.cursor-hooks.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.cursor-hooks.js +233 -0
- package/dist/src/install/agent-pack-installer.cursor-hooks.js.map +1 -0
- package/dist/src/install/agent-pack-installer.cursor-hooks.test.d.ts +2 -0
- package/dist/src/install/agent-pack-installer.cursor-hooks.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.cursor-hooks.test.js +225 -0
- package/dist/src/install/agent-pack-installer.cursor-hooks.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.d.ts +10 -5
- package/dist/src/install/agent-pack-installer.d.ts.map +1 -1
- package/dist/src/install/agent-pack-installer.harness.d.ts +10 -2
- package/dist/src/install/agent-pack-installer.harness.d.ts.map +1 -1
- package/dist/src/install/agent-pack-installer.harness.js +9 -2
- package/dist/src/install/agent-pack-installer.harness.js.map +1 -1
- package/dist/src/install/agent-pack-installer.js +15 -6
- package/dist/src/install/agent-pack-installer.js.map +1 -1
- package/dist/src/install/agent-pack-installer.test.js +3 -0
- package/dist/src/install/agent-pack-installer.test.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +25 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.archive.d.ts +34 -0
- package/dist/src/security/scanner/SecurityScanner.archive.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.archive.js +218 -0
- package/dist/src/security/scanner/SecurityScanner.archive.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.compound.d.ts +1 -0
- package/dist/src/security/scanner/SecurityScanner.compound.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.compound.js +117 -38
- package/dist/src/security/scanner/SecurityScanner.compound.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +41 -4
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.decoy.d.ts +72 -0
- package/dist/src/security/scanner/SecurityScanner.decoy.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.decoy.js +265 -0
- package/dist/src/security/scanner/SecurityScanner.decoy.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.encoding.d.ts +56 -0
- package/dist/src/security/scanner/SecurityScanner.encoding.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.encoding.js +270 -0
- package/dist/src/security/scanner/SecurityScanner.encoding.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts +23 -20
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.exec.js +207 -52
- package/dist/src/security/scanner/SecurityScanner.exec.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.fetch-correlation.d.ts +115 -0
- package/dist/src/security/scanner/SecurityScanner.fetch-correlation.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.fetch-correlation.js +181 -0
- package/dist/src/security/scanner/SecurityScanner.fetch-correlation.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +14 -11
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js +26 -124
- package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +114 -36
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.paste-host.d.ts +69 -0
- package/dist/src/security/scanner/SecurityScanner.paste-host.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.paste-host.js +342 -0
- package/dist/src/security/scanner/SecurityScanner.paste-host.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.risk-score.d.ts +27 -0
- package/dist/src/security/scanner/SecurityScanner.risk-score.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.risk-score.js +178 -0
- package/dist/src/security/scanner/SecurityScanner.risk-score.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.urls.d.ts +20 -0
- package/dist/src/security/scanner/SecurityScanner.urls.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.urls.js +26 -0
- package/dist/src/security/scanner/SecurityScanner.urls.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +2 -2
- package/dist/src/security/scanner/index.d.ts.map +1 -1
- package/dist/src/security/scanner/index.js +5 -1
- package/dist/src/security/scanner/index.js.map +1 -1
- package/dist/src/security/scanner/multiline-category-closure.test.js +6 -0
- package/dist/src/security/scanner/multiline-category-closure.test.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +41 -21
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.exec.d.ts +89 -0
- package/dist/src/security/scanner/patterns.exec.d.ts.map +1 -0
- package/dist/src/security/scanner/patterns.exec.js +115 -0
- package/dist/src/security/scanner/patterns.exec.js.map +1 -0
- package/dist/src/security/scanner/patterns.js +78 -41
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +15 -1
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/security/scanner/typosquat.d.ts +10 -0
- package/dist/src/security/scanner/typosquat.d.ts.map +1 -1
- package/dist/src/security/scanner/typosquat.js +5 -1
- package/dist/src/security/scanner/typosquat.js.map +1 -1
- package/dist/src/security/scanner/weights.d.ts +12 -3
- package/dist/src/security/scanner/weights.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.js +50 -1
- package/dist/src/security/scanner/weights.js.map +1 -1
- package/dist/src/services/agent-pack/prompt-source.d.ts +15 -0
- package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -1
- package/dist/src/services/agent-pack/prompt-source.js +32 -1
- package/dist/src/services/agent-pack/prompt-source.js.map +1 -1
- package/dist/src/services/agent-pack/skill-md.d.ts.map +1 -1
- package/dist/src/services/agent-pack/skill-md.js +9 -1
- package/dist/src/services/agent-pack/skill-md.js.map +1 -1
- package/dist/src/services/bundled-sibling-scan.d.ts +87 -13
- package/dist/src/services/bundled-sibling-scan.d.ts.map +1 -1
- package/dist/src/services/bundled-sibling-scan.js +177 -33
- package/dist/src/services/bundled-sibling-scan.js.map +1 -1
- package/dist/src/services/recommend-guard.d.ts +19 -0
- package/dist/src/services/recommend-guard.d.ts.map +1 -1
- package/dist/src/services/recommend-guard.js +28 -0
- package/dist/src/services/recommend-guard.js.map +1 -1
- package/dist/src/services/recommend-guard.test.js +23 -3
- package/dist/src/services/recommend-guard.test.js.map +1 -1
- package/dist/src/sync/index.d.ts +1 -0
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +2 -0
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/license-status-client.d.ts +56 -0
- package/dist/src/sync/license-status-client.d.ts.map +1 -0
- package/dist/src/sync/license-status-client.js +118 -0
- package/dist/src/sync/license-status-client.js.map +1 -0
- package/dist/src/sync/license-status-client.test.d.ts +14 -0
- package/dist/src/sync/license-status-client.test.d.ts.map +1 -0
- package/dist/src/sync/license-status-client.test.js +136 -0
- package/dist/src/sync/license-status-client.test.js.map +1 -0
- package/dist/src/types.d.ts +13 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/version-check.d.ts +58 -5
- package/dist/src/utils/version-check.d.ts.map +1 -1
- package/dist/src/utils/version-check.js +73 -2
- package/dist/src/utils/version-check.js.map +1 -1
- package/dist/src/utils/version-check.test.js +49 -10
- package/dist/src/utils/version-check.test.js.map +1 -1
- package/dist/tests/SecurityScanner.scoring.test.js +123 -0
- package/dist/tests/SecurityScanner.scoring.test.js.map +1 -1
- package/dist/tests/security/advisory-severity-guard.test.d.ts +20 -0
- package/dist/tests/security/advisory-severity-guard.test.d.ts.map +1 -0
- package/dist/tests/security/advisory-severity-guard.test.js +70 -0
- package/dist/tests/security/advisory-severity-guard.test.js.map +1 -0
- package/dist/tests/security/archive-evasion.test.d.ts +2 -0
- package/dist/tests/security/archive-evasion.test.d.ts.map +1 -0
- package/dist/tests/security/archive-evasion.test.js +126 -0
- package/dist/tests/security/archive-evasion.test.js.map +1 -0
- package/dist/tests/security/clawhavoc-e2e.fixtures.d.ts +71 -0
- package/dist/tests/security/clawhavoc-e2e.fixtures.d.ts.map +1 -0
- package/dist/tests/security/clawhavoc-e2e.fixtures.js +135 -0
- package/dist/tests/security/clawhavoc-e2e.fixtures.js.map +1 -0
- package/dist/tests/security/co-signal-escalation.test.d.ts +30 -0
- package/dist/tests/security/co-signal-escalation.test.d.ts.map +1 -0
- package/dist/tests/security/co-signal-escalation.test.js +494 -0
- package/dist/tests/security/co-signal-escalation.test.js.map +1 -0
- package/dist/tests/security/decoy-misdirection.test.d.ts +2 -0
- package/dist/tests/security/decoy-misdirection.test.d.ts.map +1 -0
- package/dist/tests/security/decoy-misdirection.test.js +130 -0
- package/dist/tests/security/decoy-misdirection.test.js.map +1 -0
- package/dist/tests/security/encoded-payload.test.d.ts +2 -0
- package/dist/tests/security/encoded-payload.test.d.ts.map +1 -0
- package/dist/tests/security/encoded-payload.test.js +199 -0
- package/dist/tests/security/encoded-payload.test.js.map +1 -0
- package/dist/tests/security/gatekeeper-bypass.test.d.ts +2 -0
- package/dist/tests/security/gatekeeper-bypass.test.d.ts.map +1 -0
- package/dist/tests/security/gatekeeper-bypass.test.js +167 -0
- package/dist/tests/security/gatekeeper-bypass.test.js.map +1 -0
- package/dist/tests/security/paste-host-fetch.test.d.ts +2 -0
- package/dist/tests/security/paste-host-fetch.test.d.ts.map +1 -0
- package/dist/tests/security/paste-host-fetch.test.js +199 -0
- package/dist/tests/security/paste-host-fetch.test.js.map +1 -0
- package/dist/tests/security/scanner-regression-guard.test.js +5 -0
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/dist/tests/security/smi5879-corroboration.core.test.d.ts +31 -0
- package/dist/tests/security/smi5879-corroboration.core.test.d.ts.map +1 -0
- package/dist/tests/security/smi5879-corroboration.core.test.js +157 -0
- package/dist/tests/security/smi5879-corroboration.core.test.js.map +1 -0
- package/dist/tests/services/aidefence-feedback.test.js +5 -0
- package/dist/tests/services/aidefence-feedback.test.js.map +1 -1
- package/dist/tests/services/bundled-sibling-scan.test.js +171 -10
- package/dist/tests/services/bundled-sibling-scan.test.js.map +1 -1
- package/dist/tests/skill-md-cli-fallback-parity.test.d.ts +22 -0
- package/dist/tests/skill-md-cli-fallback-parity.test.d.ts.map +1 -0
- package/dist/tests/skill-md-cli-fallback-parity.test.js +92 -0
- package/dist/tests/skill-md-cli-fallback-parity.test.js.map +1 -0
- package/dist/tests/skill-scanner/allowlist.test.js +14 -1
- package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
- 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
|
-
|
|
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":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAGzF,SAAS,SAAS,CAAC,IAA6B,EAAE,OAA0B;IAC1E,IAAI,GAAG,GAAY,IAAI,CAAA;IACvB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QAC3E,GAAG,GAAI,GAA+B,CAAC,GAAG,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,SAAS,CAChB,IAA6B,EAC7B,OAA0B,EAC1B,KAAc;IAEd,IAAI,GAAG,GAA4B,IAAI,CAAA;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAA;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACrB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;QAC3E,GAAG,GAAG,GAAG,CAAC,GAAG,CAA4B,CAAA;IAC3C,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC3C,IAAI,OAAO,KAAK,SAAS;QAAE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAA;AACjD,CAAC;AAED,
|
|
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
|
|
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
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
|
|
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":"AAAA
|
|
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 @@
|
|
|
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":""}
|