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