@skillsmith/core 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +6 -0
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/client.test.d.ts +9 -0
- package/dist/src/api/client.test.d.ts.map +1 -0
- package/dist/src/api/client.test.js +81 -0
- package/dist/src/api/client.test.js.map +1 -0
- package/dist/src/exports/services.d.ts +3 -1
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +7 -1
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/install/agent-config-merge.json-array.d.ts +29 -0
- package/dist/src/install/agent-config-merge.json-array.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.json-array.js +100 -0
- package/dist/src/install/agent-config-merge.json-array.js.map +1 -0
- package/dist/src/install/agent-config-merge.json.d.ts +37 -0
- package/dist/src/install/agent-config-merge.json.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.json.js +134 -0
- package/dist/src/install/agent-config-merge.json.js.map +1 -0
- package/dist/src/install/agent-config-merge.toml-block.d.ts +48 -0
- package/dist/src/install/agent-config-merge.toml-block.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.toml-block.js +107 -0
- package/dist/src/install/agent-config-merge.toml-block.js.map +1 -0
- package/dist/src/install/agent-config-merge.types.d.ts +87 -0
- package/dist/src/install/agent-config-merge.types.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.types.js +83 -0
- package/dist/src/install/agent-config-merge.types.js.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.d.ts +46 -0
- package/dist/src/install/agent-config-merge.yaml.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.js +133 -0
- package/dist/src/install/agent-config-merge.yaml.js.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.test.d.ts +2 -0
- package/dist/src/install/agent-config-merge.yaml.test.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.test.js +210 -0
- package/dist/src/install/agent-config-merge.yaml.test.js.map +1 -0
- package/dist/src/install/agent-harness-targets.d.ts +98 -0
- package/dist/src/install/agent-harness-targets.d.ts.map +1 -0
- package/dist/src/install/agent-harness-targets.js +154 -0
- package/dist/src/install/agent-harness-targets.js.map +1 -0
- package/dist/src/install/agent-home-relocate.d.ts +29 -0
- package/dist/src/install/agent-home-relocate.d.ts.map +1 -0
- package/dist/src/install/agent-home-relocate.js +38 -0
- package/dist/src/install/agent-home-relocate.js.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.d.ts +55 -0
- package/dist/src/install/agent-manifest-path-guard.d.ts.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.js +109 -0
- package/dist/src/install/agent-manifest-path-guard.js.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.test.d.ts +2 -0
- package/dist/src/install/agent-manifest-path-guard.test.d.ts.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.test.js +72 -0
- package/dist/src/install/agent-manifest-path-guard.test.js.map +1 -0
- package/dist/src/install/agent-manifest.d.ts +58 -0
- package/dist/src/install/agent-manifest.d.ts.map +1 -0
- package/dist/src/install/agent-manifest.js +103 -0
- package/dist/src/install/agent-manifest.js.map +1 -0
- package/dist/src/install/agent-pack-installer.d.ts +39 -0
- package/dist/src/install/agent-pack-installer.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.entry.d.ts +55 -0
- package/dist/src/install/agent-pack-installer.entry.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.entry.js +90 -0
- package/dist/src/install/agent-pack-installer.entry.js.map +1 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.d.ts +33 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.js +59 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.js.map +1 -0
- package/dist/src/install/agent-pack-installer.harness.d.ts +66 -0
- package/dist/src/install/agent-pack-installer.harness.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.harness.js +310 -0
- package/dist/src/install/agent-pack-installer.harness.js.map +1 -0
- package/dist/src/install/agent-pack-installer.js +221 -0
- package/dist/src/install/agent-pack-installer.js.map +1 -0
- package/dist/src/install/agent-pack-installer.preserve.test.d.ts +11 -0
- package/dist/src/install/agent-pack-installer.preserve.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.preserve.test.js +72 -0
- package/dist/src/install/agent-pack-installer.preserve.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.test.d.ts +2 -0
- package/dist/src/install/agent-pack-installer.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.test.js +350 -0
- package/dist/src/install/agent-pack-installer.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.types.d.ts +51 -0
- package/dist/src/install/agent-pack-installer.types.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.types.js +16 -0
- package/dist/src/install/agent-pack-installer.types.js.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.d.ts +43 -0
- package/dist/src/install/agent-pack-uninstaller.d.ts.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.js +113 -0
- package/dist/src/install/agent-pack-uninstaller.js.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.test.d.ts +2 -0
- package/dist/src/install/agent-pack-uninstaller.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.test.js +212 -0
- package/dist/src/install/agent-pack-uninstaller.test.js.map +1 -0
- package/dist/src/install/index.d.ts +7 -0
- package/dist/src/install/index.d.ts.map +1 -1
- package/dist/src/install/index.js +7 -0
- package/dist/src/install/index.js.map +1 -1
- package/dist/src/install/paths.d.ts +1 -1
- package/dist/src/install/paths.d.ts.map +1 -1
- package/dist/src/install/paths.js +4 -0
- package/dist/src/install/paths.js.map +1 -1
- package/dist/src/install/paths.test.js +15 -0
- package/dist/src/install/paths.test.js.map +1 -1
- package/dist/src/journal/hash.d.ts +13 -0
- package/dist/src/journal/hash.d.ts.map +1 -0
- package/dist/src/journal/hash.js +16 -0
- package/dist/src/journal/hash.js.map +1 -0
- package/dist/src/journal/index.d.ts +15 -0
- package/dist/src/journal/index.d.ts.map +1 -0
- package/dist/src/journal/index.js +15 -0
- package/dist/src/journal/index.js.map +1 -0
- package/dist/src/journal/journal.test.d.ts +16 -0
- package/dist/src/journal/journal.test.d.ts.map +1 -0
- package/dist/src/journal/journal.test.js +171 -0
- package/dist/src/journal/journal.test.js.map +1 -0
- package/dist/src/journal/path.d.ts +44 -0
- package/dist/src/journal/path.d.ts.map +1 -0
- package/dist/src/journal/path.js +61 -0
- package/dist/src/journal/path.js.map +1 -0
- package/dist/src/journal/reader.d.ts +38 -0
- package/dist/src/journal/reader.d.ts.map +1 -0
- package/dist/src/journal/reader.js +93 -0
- package/dist/src/journal/reader.js.map +1 -0
- package/dist/src/journal/types.d.ts +87 -0
- package/dist/src/journal/types.d.ts.map +1 -0
- package/dist/src/journal/types.js +21 -0
- package/dist/src/journal/types.js.map +1 -0
- package/dist/src/journal/writer.d.ts +52 -0
- package/dist/src/journal/writer.d.ts.map +1 -0
- package/dist/src/journal/writer.js +125 -0
- package/dist/src/journal/writer.js.map +1 -0
- package/dist/src/paywall-triggers/index.d.ts +13 -0
- package/dist/src/paywall-triggers/index.d.ts.map +1 -0
- package/dist/src/paywall-triggers/index.js +13 -0
- package/dist/src/paywall-triggers/index.js.map +1 -0
- package/dist/src/paywall-triggers/path.d.ts +47 -0
- package/dist/src/paywall-triggers/path.d.ts.map +1 -0
- package/dist/src/paywall-triggers/path.js +73 -0
- package/dist/src/paywall-triggers/path.js.map +1 -0
- package/dist/src/paywall-triggers/store.d.ts +75 -0
- package/dist/src/paywall-triggers/store.d.ts.map +1 -0
- package/dist/src/paywall-triggers/store.js +122 -0
- package/dist/src/paywall-triggers/store.js.map +1 -0
- package/dist/src/paywall-triggers/store.test.d.ts +2 -0
- package/dist/src/paywall-triggers/store.test.d.ts.map +1 -0
- package/dist/src/paywall-triggers/store.test.js +121 -0
- package/dist/src/paywall-triggers/store.test.js.map +1 -0
- package/dist/src/paywall-triggers/types.d.ts +24 -0
- package/dist/src/paywall-triggers/types.d.ts.map +1 -0
- package/dist/src/paywall-triggers/types.js +13 -0
- package/dist/src/paywall-triggers/types.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.compound.d.ts +13 -0
- package/dist/src/security/scanner/SecurityScanner.compound.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.compound.js +127 -0
- package/dist/src/security/scanner/SecurityScanner.compound.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +10 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts +23 -0
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.pii.js +152 -0
- package/dist/src/security/scanner/SecurityScanner.pii.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts +5 -12
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.scanners.js +63 -137
- package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +2 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +79 -11
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +2 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/services/agent-pack/agent-pack.test.d.ts +18 -0
- package/dist/src/services/agent-pack/agent-pack.test.d.ts.map +1 -0
- package/dist/src/services/agent-pack/agent-pack.test.js +344 -0
- package/dist/src/services/agent-pack/agent-pack.test.js.map +1 -0
- package/dist/src/services/agent-pack/hooks.d.ts +29 -0
- package/dist/src/services/agent-pack/hooks.d.ts.map +1 -0
- package/dist/src/services/agent-pack/hooks.js +139 -0
- package/dist/src/services/agent-pack/hooks.js.map +1 -0
- package/dist/src/services/agent-pack/index.d.ts +26 -0
- package/dist/src/services/agent-pack/index.d.ts.map +1 -0
- package/dist/src/services/agent-pack/index.js +109 -0
- package/dist/src/services/agent-pack/index.js.map +1 -0
- package/dist/src/services/agent-pack/prompt-source.d.ts +47 -0
- package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -0
- package/dist/src/services/agent-pack/prompt-source.js +182 -0
- package/dist/src/services/agent-pack/prompt-source.js.map +1 -0
- package/dist/src/services/agent-pack/shims.d.ts +40 -0
- package/dist/src/services/agent-pack/shims.d.ts.map +1 -0
- package/dist/src/services/agent-pack/shims.js +96 -0
- package/dist/src/services/agent-pack/shims.js.map +1 -0
- package/dist/src/services/agent-pack/skill-md.d.ts +35 -0
- package/dist/src/services/agent-pack/skill-md.d.ts.map +1 -0
- package/dist/src/services/agent-pack/skill-md.js +89 -0
- package/dist/src/services/agent-pack/skill-md.js.map +1 -0
- package/dist/src/services/agent-pack/types.d.ts +118 -0
- package/dist/src/services/agent-pack/types.d.ts.map +1 -0
- package/dist/src/services/agent-pack/types.js +61 -0
- package/dist/src/services/agent-pack/types.js.map +1 -0
- package/dist/src/services/agent-tool-profile.d.ts +59 -0
- package/dist/src/services/agent-tool-profile.d.ts.map +1 -0
- package/dist/src/services/agent-tool-profile.js +76 -0
- package/dist/src/services/agent-tool-profile.js.map +1 -0
- package/dist/src/services/agent-tool-profile.test.d.ts +2 -0
- package/dist/src/services/agent-tool-profile.test.d.ts.map +1 -0
- package/dist/src/services/agent-tool-profile.test.js +28 -0
- package/dist/src/services/agent-tool-profile.test.js.map +1 -0
- package/dist/src/services/bundled-sibling-scan.d.ts +111 -0
- package/dist/src/services/bundled-sibling-scan.d.ts.map +1 -0
- package/dist/src/services/bundled-sibling-scan.js +170 -0
- package/dist/src/services/bundled-sibling-scan.js.map +1 -0
- package/dist/src/services/skill-installation.io.d.ts +16 -5
- package/dist/src/services/skill-installation.io.d.ts.map +1 -1
- package/dist/src/services/skill-installation.io.js +44 -20
- package/dist/src/services/skill-installation.io.js.map +1 -1
- package/dist/src/services/skill-installation.policy.d.ts +96 -0
- package/dist/src/services/skill-installation.policy.d.ts.map +1 -0
- package/dist/src/services/skill-installation.policy.js +144 -0
- package/dist/src/services/skill-installation.policy.js.map +1 -0
- package/dist/src/services/skill-installation.service.d.ts.map +1 -1
- package/dist/src/services/skill-installation.service.js +9 -3
- package/dist/src/services/skill-installation.service.js.map +1 -1
- package/dist/src/sources/index.d.ts +1 -0
- package/dist/src/sources/index.d.ts.map +1 -1
- package/dist/src/sources/index.js +4 -0
- package/dist/src/sources/index.js.map +1 -1
- package/dist/src/sync/index.d.ts +1 -1
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +1 -1
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/inventory-client.d.ts +16 -0
- package/dist/src/sync/inventory-client.d.ts.map +1 -1
- package/dist/src/sync/inventory-client.js +54 -0
- package/dist/src/sync/inventory-client.js.map +1 -1
- package/dist/src/sync/inventory-client.test.js +67 -1
- package/dist/src/sync/inventory-client.test.js.map +1 -1
- package/dist/src/sync/inventory-collector.d.ts.map +1 -1
- package/dist/src/sync/inventory-collector.js +32 -5
- package/dist/src/sync/inventory-collector.js.map +1 -1
- package/dist/src/sync/inventory-collector.test.js +50 -1
- package/dist/src/sync/inventory-collector.test.js.map +1 -1
- package/dist/src/sync/inventory-types.d.ts +9 -0
- package/dist/src/sync/inventory-types.d.ts.map +1 -1
- package/dist/src/sync/inventory-types.js +3 -0
- package/dist/src/sync/inventory-types.js.map +1 -1
- package/dist/src/telemetry/agent-marker.d.ts +137 -0
- package/dist/src/telemetry/agent-marker.d.ts.map +1 -0
- package/dist/src/telemetry/agent-marker.js +242 -0
- package/dist/src/telemetry/agent-marker.js.map +1 -0
- package/dist/src/telemetry/agent-marker.test.d.ts +13 -0
- package/dist/src/telemetry/agent-marker.test.d.ts.map +1 -0
- package/dist/src/telemetry/agent-marker.test.js +202 -0
- package/dist/src/telemetry/agent-marker.test.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +6 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +10 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +5 -1
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/wrap.d.ts +28 -7
- package/dist/src/telemetry/wrap.d.ts.map +1 -1
- package/dist/src/telemetry/wrap.gate.test.d.ts +22 -0
- package/dist/src/telemetry/wrap.gate.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.gate.test.js +197 -0
- package/dist/src/telemetry/wrap.gate.test.js.map +1 -0
- package/dist/src/telemetry/wrap.js +111 -26
- package/dist/src/telemetry/wrap.js.map +1 -1
- package/dist/src/telemetry/wrap.marker.test.d.ts +16 -0
- package/dist/src/telemetry/wrap.marker.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.marker.test.js +185 -0
- package/dist/src/telemetry/wrap.marker.test.js.map +1 -0
- package/dist/src/telemetry/wrap.test.js +4 -0
- package/dist/src/telemetry/wrap.test.js.map +1 -1
- package/dist/tests/SecurityScanner.exec.test.js +60 -0
- package/dist/tests/SecurityScanner.exec.test.js.map +1 -1
- package/dist/tests/security/ContinuousSecurity.test.js +10 -4
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts +2 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts.map +1 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.js +126 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.js.map +1 -0
- package/dist/tests/security/chmod-compound.test.d.ts +2 -0
- package/dist/tests/security/chmod-compound.test.d.ts.map +1 -0
- package/dist/tests/security/chmod-compound.test.js +188 -0
- package/dist/tests/security/chmod-compound.test.js.map +1 -0
- package/dist/tests/security/pii-detection.test.js +24 -0
- package/dist/tests/security/pii-detection.test.js.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.d.ts +23 -7
- package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.js +27 -11
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/dist/tests/security/sensitive-path-fp.test.d.ts +2 -0
- package/dist/tests/security/sensitive-path-fp.test.d.ts.map +1 -0
- package/dist/tests/security/sensitive-path-fp.test.js +142 -0
- package/dist/tests/security/sensitive-path-fp.test.js.map +1 -0
- package/dist/tests/services/bundled-sibling-scan.test.d.ts +2 -0
- package/dist/tests/services/bundled-sibling-scan.test.d.ts.map +1 -0
- package/dist/tests/services/bundled-sibling-scan.test.js +139 -0
- package/dist/tests/services/bundled-sibling-scan.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.test.js +166 -0
- package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -1
- package/dist/tests/unit/services/skill-installation.policy.test.d.ts +8 -0
- package/dist/tests/unit/services/skill-installation.policy.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.policy.test.js +151 -0
- package/dist/tests/unit/services/skill-installation.policy.test.js.map +1 -0
- package/package.json +23 -3
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entry-value builders for `sklx agent install` (SMI-5456 Wave 1 Step 5).
|
|
3
|
+
*
|
|
4
|
+
* Pure functions producing the exact MCP-server registration value + the
|
|
5
|
+
* Codex TOML blocks the installer merges in. Separated from the
|
|
6
|
+
* orchestrator so the "what do we install" shape is independently testable
|
|
7
|
+
* from "where do we write it".
|
|
8
|
+
*
|
|
9
|
+
* @module @skillsmith/core/install/agent-pack-installer.entry
|
|
10
|
+
*/
|
|
11
|
+
import { AGENT_TOOL_PROFILE_ENV_VAR, AGENT_TOOL_PROFILE_VALUE, } from '../services/agent-tool-profile.js';
|
|
12
|
+
/**
|
|
13
|
+
* The `skillsmith` MCP server registration value for `mcpServers`-convention
|
|
14
|
+
* harnesses (claude-code, cursor, copilot, windsurf; hermes uses the same
|
|
15
|
+
* field names under YAML). OpenCode does NOT use this shape — see
|
|
16
|
+
* {@link buildOpenCodeMcpEntryValue}.
|
|
17
|
+
*/
|
|
18
|
+
export function buildAgentMcpEntryValue() {
|
|
19
|
+
return {
|
|
20
|
+
command: 'npx',
|
|
21
|
+
args: ['-y', '@skillsmith/mcp-server'],
|
|
22
|
+
env: {
|
|
23
|
+
[AGENT_TOOL_PROFILE_ENV_VAR]: AGENT_TOOL_PROFILE_VALUE,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* OpenCode's `mcp`-key entry value (Step-6 verified against
|
|
29
|
+
* opencode.ai/docs/mcp-servers/): entries are typed `local|remote`,
|
|
30
|
+
* `command` is an ARRAY (command + args combined), and the env-var field is
|
|
31
|
+
* named `environment`, not `env`. Writing the generic mcpServers shape here
|
|
32
|
+
* would produce an entry OpenCode's config schema rejects.
|
|
33
|
+
*/
|
|
34
|
+
export function buildOpenCodeMcpEntryValue() {
|
|
35
|
+
return {
|
|
36
|
+
type: 'local',
|
|
37
|
+
command: ['npx', '-y', '@skillsmith/mcp-server'],
|
|
38
|
+
enabled: true,
|
|
39
|
+
environment: {
|
|
40
|
+
[AGENT_TOOL_PROFILE_ENV_VAR]: AGENT_TOOL_PROFILE_VALUE,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Codex `[mcp_servers.skillsmith]` TOML block (text between our markers). */
|
|
45
|
+
export function buildCodexMcpTomlBlock() {
|
|
46
|
+
return [
|
|
47
|
+
'[mcp_servers.skillsmith]',
|
|
48
|
+
'command = "npx"',
|
|
49
|
+
'args = ["-y", "@skillsmith/mcp-server"]',
|
|
50
|
+
'',
|
|
51
|
+
'[mcp_servers.skillsmith.env]',
|
|
52
|
+
`${AGENT_TOOL_PROFILE_ENV_VAR} = "${AGENT_TOOL_PROFILE_VALUE}"`,
|
|
53
|
+
].join('\n');
|
|
54
|
+
}
|
|
55
|
+
/** Regex matching a bare (non-marker-delimited) `[mcp_servers.skillsmith]` table header. */
|
|
56
|
+
export const CODEX_MCP_FOREIGN_HEADER = /^\[mcp_servers\.skillsmith(\.[a-zA-Z0-9_]+)?\]/m;
|
|
57
|
+
/** Regex matching a bare (non-marker-delimited) `[agents.skillsmith-agent]` table header. */
|
|
58
|
+
export const CODEX_AGENTS_FOREIGN_HEADER = /^\[agents\.skillsmith-agent(\.[a-zA-Z0-9_]+)?\]/m;
|
|
59
|
+
/**
|
|
60
|
+
* Codex `[[hooks.SessionStart]]` TOML block (text between our markers) —
|
|
61
|
+
* shape verified by the Step-6 eval worker against
|
|
62
|
+
* developers.openai.com/codex/hooks: inline array-of-tables
|
|
63
|
+
* `[[hooks.SessionStart]]` with a nested `[[hooks.SessionStart.hooks]]`
|
|
64
|
+
* array carrying `{type, command, timeout, statusMessage}`. Only `type` +
|
|
65
|
+
* `command` are emitted (timeout/statusMessage stay at Codex defaults).
|
|
66
|
+
* `JSON.stringify` produces a valid TOML basic string for the absolute
|
|
67
|
+
* script path — same quoting convention as `renderCodexToml` (shims.ts).
|
|
68
|
+
*/
|
|
69
|
+
export function buildCodexSessionStartHookBlock(sessionStartScriptPath) {
|
|
70
|
+
return [
|
|
71
|
+
'[[hooks.SessionStart]]',
|
|
72
|
+
'',
|
|
73
|
+
'[[hooks.SessionStart.hooks]]',
|
|
74
|
+
'type = "command"',
|
|
75
|
+
`command = ${JSON.stringify(sessionStartScriptPath)}`,
|
|
76
|
+
].join('\n');
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Regex matching a SINGLE-bracket `[hooks.SessionStart]` table header — a
|
|
80
|
+
* user config that defined `hooks.SessionStart` as a plain TABLE. Appending
|
|
81
|
+
* our `[[hooks.SessionStart]]` array-of-tables entry to such a file would
|
|
82
|
+
* produce INVALID TOML (a key cannot be both a table and an array of
|
|
83
|
+
* tables), so that is the genuine-conflict case. A foreign DOUBLE-bracket
|
|
84
|
+
* `[[hooks.SessionStart]]` (the user's own hook) is deliberately NOT
|
|
85
|
+
* matched: TOML permits re-opening an array of tables anywhere in the
|
|
86
|
+
* document, so appending our own `[[hooks.SessionStart]]` entry alongside a
|
|
87
|
+
* user's is valid and non-destructive — both hooks run.
|
|
88
|
+
*/
|
|
89
|
+
export const CODEX_HOOKS_TABLE_CONFLICT_HEADER = /^\[hooks\.SessionStart\]/m;
|
|
90
|
+
//# sourceMappingURL=agent-pack-installer.entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-pack-installer.entry.js","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,mCAAmC,CAAA;AAE1C;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,IAAI,EAAE,wBAAwB,CAAC;QACtC,GAAG,EAAE;YACH,CAAC,0BAA0B,CAAC,EAAE,wBAAwB;SACvD;KACF,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,wBAAwB,CAAC;QAChD,OAAO,EAAE,IAAI;QACb,WAAW,EAAE;YACX,CAAC,0BAA0B,CAAC,EAAE,wBAAwB;SACvD;KACF,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,0BAA0B;QAC1B,iBAAiB;QACjB,yCAAyC;QACzC,EAAE;QACF,8BAA8B;QAC9B,GAAG,0BAA0B,OAAO,wBAAwB,GAAG;KAChE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,4FAA4F;AAC5F,MAAM,CAAC,MAAM,wBAAwB,GAAG,iDAAiD,CAAA;AAEzF,6FAA6F;AAC7F,MAAM,CAAC,MAAM,2BAA2B,GAAG,kDAAkD,CAAA;AAE7F;;;;;;;;;GASG;AACH,MAAM,UAAU,+BAA+B,CAAC,sBAA8B;IAC5E,OAAO;QACL,wBAAwB;QACxB,EAAE;QACF,8BAA8B;QAC9B,kBAAkB;QAClB,aAAa,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE;KACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,2BAA2B,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem primitives shared by `installAgentPack` (SMI-5456 Wave 1 Step 5).
|
|
3
|
+
*
|
|
4
|
+
* `writeOwnedArtifactFile` is the idempotency backbone for the P-5
|
|
5
|
+
* "double-install produces identical filesystem state, no duplicate
|
|
6
|
+
* backups" test: byte-identical content at an already-correct path is a
|
|
7
|
+
* true no-op (no write, no backup, no manifest churn beyond re-recording the
|
|
8
|
+
* same entry).
|
|
9
|
+
*
|
|
10
|
+
* @module @skillsmith/core/install/agent-pack-installer.fs-helpers
|
|
11
|
+
*/
|
|
12
|
+
export interface WriteOwnedFileOptions {
|
|
13
|
+
path: string;
|
|
14
|
+
content: string;
|
|
15
|
+
executable: boolean;
|
|
16
|
+
backupDir: string;
|
|
17
|
+
}
|
|
18
|
+
export interface WriteOwnedFileResult {
|
|
19
|
+
/** True when a write actually happened (content or executable-bit changed, or the file was new). */
|
|
20
|
+
changed: boolean;
|
|
21
|
+
/** Backup of PRE-EXISTING different content, or null (nothing existed, or content already matched). */
|
|
22
|
+
backupPath: string | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Write a file the installer fully owns by path convention (SKILL.md copies,
|
|
26
|
+
* shim files, hook scripts). Idempotent: re-writing identical content with
|
|
27
|
+
* the correct executable bit is a no-op. A pre-existing file with DIFFERENT
|
|
28
|
+
* content is backed up before being overwritten (defensive — these paths are
|
|
29
|
+
* namespaced (`skillsmith-agent`) so a genuine foreign collision is unlikely,
|
|
30
|
+
* but never silently destroying user data is the house floor).
|
|
31
|
+
*/
|
|
32
|
+
export declare function writeOwnedArtifactFile(opts: WriteOwnedFileOptions): WriteOwnedFileResult;
|
|
33
|
+
//# sourceMappingURL=agent-pack-installer.fs-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-pack-installer.fs-helpers.d.ts","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.fs-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,oGAAoG;IACpG,OAAO,EAAE,OAAO,CAAA;IAChB,uGAAuG;IACvG,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,qBAAqB,GAAG,oBAAoB,CAoBxF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem primitives shared by `installAgentPack` (SMI-5456 Wave 1 Step 5).
|
|
3
|
+
*
|
|
4
|
+
* `writeOwnedArtifactFile` is the idempotency backbone for the P-5
|
|
5
|
+
* "double-install produces identical filesystem state, no duplicate
|
|
6
|
+
* backups" test: byte-identical content at an already-correct path is a
|
|
7
|
+
* true no-op (no write, no backup, no manifest churn beyond re-recording the
|
|
8
|
+
* same entry).
|
|
9
|
+
*
|
|
10
|
+
* @module @skillsmith/core/install/agent-pack-installer.fs-helpers
|
|
11
|
+
*/
|
|
12
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
13
|
+
import { dirname, join } from 'node:path';
|
|
14
|
+
/**
|
|
15
|
+
* Write a file the installer fully owns by path convention (SKILL.md copies,
|
|
16
|
+
* shim files, hook scripts). Idempotent: re-writing identical content with
|
|
17
|
+
* the correct executable bit is a no-op. A pre-existing file with DIFFERENT
|
|
18
|
+
* content is backed up before being overwritten (defensive — these paths are
|
|
19
|
+
* namespaced (`skillsmith-agent`) so a genuine foreign collision is unlikely,
|
|
20
|
+
* but never silently destroying user data is the house floor).
|
|
21
|
+
*/
|
|
22
|
+
export function writeOwnedArtifactFile(opts) {
|
|
23
|
+
const { path, content, executable, backupDir } = opts;
|
|
24
|
+
if (existsSync(path)) {
|
|
25
|
+
const existing = readFileSync(path, 'utf-8');
|
|
26
|
+
const currentlyExecutable = isExecutable(path);
|
|
27
|
+
if (existing === content && currentlyExecutable === executable) {
|
|
28
|
+
return { changed: false, backupPath: null };
|
|
29
|
+
}
|
|
30
|
+
const backupPath = writeBackup(path, backupDir);
|
|
31
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
32
|
+
writeFileSync(path, content, 'utf-8');
|
|
33
|
+
if (executable)
|
|
34
|
+
chmodSync(path, 0o755);
|
|
35
|
+
return { changed: true, backupPath };
|
|
36
|
+
}
|
|
37
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
38
|
+
writeFileSync(path, content, 'utf-8');
|
|
39
|
+
if (executable)
|
|
40
|
+
chmodSync(path, 0o755);
|
|
41
|
+
return { changed: true, backupPath: null };
|
|
42
|
+
}
|
|
43
|
+
function isExecutable(path) {
|
|
44
|
+
try {
|
|
45
|
+
return (statSync(path).mode & 0o111) !== 0;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function writeBackup(sourcePath, backupDir) {
|
|
52
|
+
mkdirSync(backupDir, { recursive: true, mode: 0o700 });
|
|
53
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
54
|
+
const baseName = sourcePath.split('/').pop() ?? 'file';
|
|
55
|
+
const backupPath = join(backupDir, `${stamp}-${baseName}.bak`);
|
|
56
|
+
writeFileSync(backupPath, readFileSync(sourcePath, 'utf-8'), { mode: 0o600 });
|
|
57
|
+
return backupPath;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=agent-pack-installer.fs-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-pack-installer.fs-helpers.js","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.fs-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAgBzC;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAA2B;IAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;IAErD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC5C,MAAM,mBAAmB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,QAAQ,KAAK,OAAO,IAAI,mBAAmB,KAAK,UAAU,EAAE,CAAC;YAC/D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;QAC7C,CAAC;QACD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAC/C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACrC,IAAI,UAAU;YAAE,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;IACtC,CAAC;IAED,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACrC,IAAI,UAAU;QAAE,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;AAC5C,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB,EAAE,SAAiB;IACxD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAA;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,KAAK,IAAI,QAAQ,MAAM,CAAC,CAAA;IAC9D,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC7E,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
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 type { AgentPackArtifact, HarnessId } from '../services/agent-pack/index.js';
|
|
12
|
+
import { type McpHarnessId } from './agent-harness-targets.js';
|
|
13
|
+
import type { AgentManifestEntry } from './agent-manifest.js';
|
|
14
|
+
import type { HarnessInstallReport } from './agent-pack-installer.types.js';
|
|
15
|
+
export interface HarnessInstallCtx {
|
|
16
|
+
homeDir: string | undefined;
|
|
17
|
+
force: boolean;
|
|
18
|
+
backupDir: string;
|
|
19
|
+
entries: AgentManifestEntry[];
|
|
20
|
+
/**
|
|
21
|
+
* Config-file paths already backed up during THIS install run. Shared
|
|
22
|
+
* across every merge call so a harness whose hooks + MCP registration
|
|
23
|
+
* share one file (claude-code: `settings.json`; codex: `config.toml`)
|
|
24
|
+
* only backs it up once, capturing genuine pre-install state rather than
|
|
25
|
+
* repeatedly "backing up" content this same run already wrote.
|
|
26
|
+
*/
|
|
27
|
+
backedUpPaths: Set<string>;
|
|
28
|
+
}
|
|
29
|
+
/** Write the named-agent shim for `harness` when a target exists (claude-code/copilot/opencode). */
|
|
30
|
+
export declare function installShim(harness: HarnessId, artifact: AgentPackArtifact | undefined, ctx: HarnessInstallCtx, report: HarnessInstallReport): void;
|
|
31
|
+
/** Install + wire SessionStart/SessionEnd hook scripts for claude-code/cursor (JSON hook config). */
|
|
32
|
+
export declare function installJsonHooks(harness: 'claude-code' | 'cursor', startArtifact: AgentPackArtifact | undefined, endArtifact: AgentPackArtifact | undefined, ctx: HarnessInstallCtx, report: HarnessInstallReport): void;
|
|
33
|
+
/**
|
|
34
|
+
* Install hook scripts for Codex (+x) and wire the SessionStart hook into
|
|
35
|
+
* `~/.codex/config.toml` as a marker-delimited `[[hooks.SessionStart]]`
|
|
36
|
+
* array-of-tables block (shape Step-6-verified against
|
|
37
|
+
* developers.openai.com/codex/hooks).
|
|
38
|
+
*
|
|
39
|
+
* SessionStart ONLY — deliberate, do not "complete" this:
|
|
40
|
+
* - Codex has NO SessionEnd event. There is nothing to wire the
|
|
41
|
+
* session-end.sh cleanup script to.
|
|
42
|
+
* - Codex's Stop event fires PER-TURN, not per-session. Wiring the marker
|
|
43
|
+
* cleanup there would delete the agent-mediation marker file after the
|
|
44
|
+
* FIRST turn, silently unmarking every subsequent tool call in the same
|
|
45
|
+
* session and corrupting the mediation-share metric the whole Wave-1
|
|
46
|
+
* bet is measured by.
|
|
47
|
+
* - Cleanup therefore rides the server's 12h marker TTL
|
|
48
|
+
* (`telemetry/agent-marker.ts` `AGENT_MARKER_TTL_MS`) — the same
|
|
49
|
+
* crash-backstop path every harness already relies on.
|
|
50
|
+
*
|
|
51
|
+
* session-end.sh is still installed (inert on Codex — nothing invokes it):
|
|
52
|
+
* it keeps the on-disk script tree identical across hook-capable harnesses
|
|
53
|
+
* and stays manifest-tracked, so uninstall removes it like any other owned
|
|
54
|
+
* file. Zero uninstall complication.
|
|
55
|
+
*/
|
|
56
|
+
export declare function installCodexHooks(startArtifact: AgentPackArtifact | undefined, endArtifact: AgentPackArtifact | undefined, ctx: HarnessInstallCtx, report: HarnessInstallReport): void;
|
|
57
|
+
/**
|
|
58
|
+
* Codex's named-agent "shim" is a `[agents.skillsmith-agent]` TOML entry
|
|
59
|
+
* merged into the same `~/.codex/config.toml` as its MCP registration —
|
|
60
|
+
* the artifact's content (`shims/codex/agents.toml`, rendered by the
|
|
61
|
+
* locked `renderCodexToml`) is already the exact block text to install.
|
|
62
|
+
*/
|
|
63
|
+
export declare function installCodexAgentsShim(artifact: AgentPackArtifact | undefined, ctx: HarnessInstallCtx, report: HarnessInstallReport): void;
|
|
64
|
+
/** Merge the `skillsmith` MCP server registration for any of the 7 MCP-capable harnesses. */
|
|
65
|
+
export declare function installMcpConfig(harness: McpHarnessId, ctx: HarnessInstallCtx, report: HarnessInstallReport): void;
|
|
66
|
+
//# sourceMappingURL=agent-pack-installer.harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-pack-installer.harness.d.ts","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AACnF,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAA;AAgBnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AAqB3E,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B;;;;;;OAMG;IACH,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC3B;AAED,oGAAoG;AACpG,wBAAgB,WAAW,CACzB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,iBAAiB,GAAG,SAAS,EACvC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CAoBN;AAED,qGAAqG;AACrG,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,GAAG,QAAQ,EACjC,aAAa,EAAE,iBAAiB,GAAG,SAAS,EAC5C,WAAW,EAAE,iBAAiB,GAAG,SAAS,EAC1C,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CAgEN;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,iBAAiB,GAAG,SAAS,EAC5C,WAAW,EAAE,iBAAiB,GAAG,SAAS,EAC1C,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CAmEN;AAgBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,EACvC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CA+BN;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CAwDN"}
|
|
@@ -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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"}
|