@skillsmith/core 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts +23 -0
- package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts.map +1 -1
- package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js +137 -0
- package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js.map +1 -1
- package/dist/src/analysis/tree-sitter/pythonIncremental.js +83 -10
- package/dist/src/analysis/tree-sitter/pythonIncremental.js.map +1 -1
- package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js +6 -1
- package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js.map +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/audit-notify-state.d.ts +46 -0
- package/dist/src/config/audit-notify-state.d.ts.map +1 -0
- package/dist/src/config/audit-notify-state.js +55 -0
- package/dist/src/config/audit-notify-state.js.map +1 -0
- package/dist/src/config/audit-notify-state.test.d.ts +9 -0
- package/dist/src/config/audit-notify-state.test.d.ts.map +1 -0
- package/dist/src/config/audit-notify-state.test.js +63 -0
- package/dist/src/config/audit-notify-state.test.js.map +1 -0
- package/dist/src/config/index.d.ts +10 -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 +9 -1
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +6 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -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/logging/context.d.ts +58 -0
- package/dist/src/logging/context.d.ts.map +1 -0
- package/dist/src/logging/context.js +62 -0
- package/dist/src/logging/context.js.map +1 -0
- package/dist/src/logging/context.test.d.ts +14 -0
- package/dist/src/logging/context.test.d.ts.map +1 -0
- package/dist/src/logging/context.test.js +88 -0
- package/dist/src/logging/context.test.js.map +1 -0
- package/dist/src/logging/index.d.ts +13 -0
- package/dist/src/logging/index.d.ts.map +1 -0
- package/dist/src/logging/index.js +12 -0
- package/dist/src/logging/index.js.map +1 -0
- package/dist/src/logging/logger.d.ts +71 -0
- package/dist/src/logging/logger.d.ts.map +1 -0
- package/dist/src/logging/logger.js +264 -0
- package/dist/src/logging/logger.js.map +1 -0
- package/dist/src/logging/logger.test.d.ts +9 -0
- package/dist/src/logging/logger.test.d.ts.map +1 -0
- package/dist/src/logging/logger.test.js +320 -0
- package/dist/src/logging/logger.test.js.map +1 -0
- package/dist/src/logging/redact.d.ts +35 -0
- package/dist/src/logging/redact.d.ts.map +1 -0
- package/dist/src/logging/redact.js +152 -0
- package/dist/src/logging/redact.js.map +1 -0
- package/dist/src/logging/redact.test.d.ts +8 -0
- package/dist/src/logging/redact.test.d.ts.map +1 -0
- package/dist/src/logging/redact.test.js +330 -0
- package/dist/src/logging/redact.test.js.map +1 -0
- package/dist/src/logging/rotation.d.ts +75 -0
- package/dist/src/logging/rotation.d.ts.map +1 -0
- package/dist/src/logging/rotation.js +284 -0
- package/dist/src/logging/rotation.js.map +1 -0
- package/dist/src/logging/rotation.test.d.ts +11 -0
- package/dist/src/logging/rotation.test.d.ts.map +1 -0
- package/dist/src/logging/rotation.test.js +132 -0
- package/dist/src/logging/rotation.test.js.map +1 -0
- package/dist/src/logging/types.d.ts +69 -0
- package/dist/src/logging/types.d.ts.map +1 -0
- package/dist/src/logging/types.js +9 -0
- package/dist/src/logging/types.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/index.d.ts +2 -0
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +4 -0
- package/dist/src/security/index.js.map +1 -1
- 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.hostile-update.d.ts +46 -0
- package/dist/src/security/scanner/SecurityScanner.hostile-update.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.hostile-update.js +209 -0
- package/dist/src/security/scanner/SecurityScanner.hostile-update.js.map +1 -0
- 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/index.d.ts +2 -1
- package/dist/src/security/scanner/index.d.ts.map +1 -1
- package/dist/src/security/scanner/index.js +2 -0
- package/dist/src/security/scanner/index.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 +23 -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 +63 -22
- 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/access-token.d.ts +27 -0
- package/dist/src/sync/access-token.d.ts.map +1 -0
- package/dist/src/sync/access-token.js +40 -0
- package/dist/src/sync/access-token.js.map +1 -0
- package/dist/src/sync/audit-notify-client.d.ts +83 -0
- package/dist/src/sync/audit-notify-client.d.ts.map +1 -0
- package/dist/src/sync/audit-notify-client.js +126 -0
- package/dist/src/sync/audit-notify-client.js.map +1 -0
- package/dist/src/sync/audit-notify-client.test.d.ts +14 -0
- package/dist/src/sync/audit-notify-client.test.d.ts.map +1 -0
- package/dist/src/sync/audit-notify-client.test.js +133 -0
- package/dist/src/sync/audit-notify-client.test.js.map +1 -0
- package/dist/src/sync/index.d.ts +2 -1
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +3 -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 +59 -16
- 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 +25 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +10 -1
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/wrap.bench.js +5 -0
- package/dist/src/telemetry/wrap.bench.js.map +1 -1
- package/dist/src/telemetry/wrap.correlation.test.d.ts +20 -0
- package/dist/src/telemetry/wrap.correlation.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.correlation.test.js +174 -0
- package/dist/src/telemetry/wrap.correlation.test.js.map +1 -0
- 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 +202 -0
- package/dist/src/telemetry/wrap.gate.test.js.map +1 -0
- package/dist/src/telemetry/wrap.js +196 -52
- 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 +190 -0
- package/dist/src/telemetry/wrap.marker.test.js.map +1 -0
- package/dist/src/telemetry/wrap.test.js +14 -0
- package/dist/src/telemetry/wrap.test.js.map +1 -1
- package/dist/src/types.d.ts +6 -0
- package/dist/src/types.d.ts.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 +206 -12
- 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 +28 -3
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-harness install step for `installAgentPack` (SMI-5456 Wave 1 Step 5).
|
|
3
|
+
*
|
|
4
|
+
* One function per concern (shim, hooks, MCP registration) so the
|
|
5
|
+
* orchestrator (`agent-pack-installer.ts`) stays a readable top-level loop.
|
|
6
|
+
* Every function is additive to `entries`/`report` in place — the caller
|
|
7
|
+
* owns aggregation and the manifest save.
|
|
8
|
+
*
|
|
9
|
+
* @module @skillsmith/core/install/agent-pack-installer.harness
|
|
10
|
+
*/
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { AGENT_HOOK_TARGETS, AGENT_MCP_TARGETS, AGENT_SHIM_TARGETS, } from './agent-harness-targets.js';
|
|
13
|
+
import { mergeJsonMcpEntry } from './agent-config-merge.json.js';
|
|
14
|
+
import { mergeYamlMcpEntry } from './agent-config-merge.yaml.js';
|
|
15
|
+
import { mergeTomlBlock } from './agent-config-merge.toml-block.js';
|
|
16
|
+
import { mergeJsonArrayEntry } from './agent-config-merge.json-array.js';
|
|
17
|
+
import { CODEX_AGENTS_FOREIGN_HEADER, CODEX_HOOKS_TABLE_CONFLICT_HEADER, CODEX_MCP_FOREIGN_HEADER, buildAgentMcpEntryValue, buildCodexMcpTomlBlock, buildCodexSessionStartHookBlock, buildOpenCodeMcpEntryValue, } from './agent-pack-installer.entry.js';
|
|
18
|
+
import { relocateUnderHome } from './agent-home-relocate.js';
|
|
19
|
+
import { writeOwnedArtifactFile } from './agent-pack-installer.fs-helpers.js';
|
|
20
|
+
/**
|
|
21
|
+
* A merge "succeeded" (our content is present in the file, whether this
|
|
22
|
+
* call wrote it or it already matched) whenever status is 'created',
|
|
23
|
+
* 'updated', OR 'unchanged'. Manifest entries must be pushed for ALL THREE —
|
|
24
|
+
* not just 'created'/'updated' — because the manifest is rebuilt fresh every
|
|
25
|
+
* `installAgentPack` run (`entries: []` at the top of the function): an
|
|
26
|
+
* 'unchanged' result on a re-install is not a no-op from the manifest's
|
|
27
|
+
* perspective, it is "this path is still part of what's installed." Gating
|
|
28
|
+
* the push on 'created'/'updated' only would silently drop that path from
|
|
29
|
+
* the manifest the moment a re-install found it already correct — the
|
|
30
|
+
* P-5 double-install-idempotency test caught this losing 3 of 12 entries.
|
|
31
|
+
* Only 'conflict' (we deliberately left a foreign entry untouched — nothing
|
|
32
|
+
* of ours is there) and 'error' (the write failed) are excluded.
|
|
33
|
+
*/
|
|
34
|
+
function mergeSucceeded(status) {
|
|
35
|
+
return status === 'created' || status === 'updated' || status === 'unchanged';
|
|
36
|
+
}
|
|
37
|
+
/** Write the named-agent shim for `harness` when a target exists (claude-code/copilot/opencode). */
|
|
38
|
+
export function installShim(harness, artifact, ctx, report) {
|
|
39
|
+
const target = AGENT_SHIM_TARGETS[harness];
|
|
40
|
+
if (!target || !artifact)
|
|
41
|
+
return;
|
|
42
|
+
const path = relocateUnderHome(target.path, ctx.homeDir);
|
|
43
|
+
const result = writeOwnedArtifactFile({
|
|
44
|
+
path,
|
|
45
|
+
content: artifact.content,
|
|
46
|
+
executable: false,
|
|
47
|
+
backupDir: ctx.backupDir,
|
|
48
|
+
});
|
|
49
|
+
report.shimWritten = true;
|
|
50
|
+
ctx.entries.push({
|
|
51
|
+
path,
|
|
52
|
+
kind: 'shim',
|
|
53
|
+
harness,
|
|
54
|
+
backupPath: result.backupPath,
|
|
55
|
+
executable: false,
|
|
56
|
+
});
|
|
57
|
+
if (result.backupPath)
|
|
58
|
+
report.notes.push(`shim: pre-existing content backed up to ${result.backupPath}`);
|
|
59
|
+
}
|
|
60
|
+
/** Install + wire SessionStart/SessionEnd hook scripts for claude-code/cursor (JSON hook config). */
|
|
61
|
+
export function installJsonHooks(harness, startArtifact, endArtifact, ctx, report) {
|
|
62
|
+
const target = AGENT_HOOK_TARGETS[harness];
|
|
63
|
+
if (!target || !startArtifact || !endArtifact)
|
|
64
|
+
return;
|
|
65
|
+
const scriptDir = relocateUnderHome(target.scriptDir, ctx.homeDir);
|
|
66
|
+
const startPath = join(scriptDir, 'session-start.sh');
|
|
67
|
+
const endPath = join(scriptDir, 'session-end.sh');
|
|
68
|
+
const startResult = writeOwnedArtifactFile({
|
|
69
|
+
path: startPath,
|
|
70
|
+
content: startArtifact.content,
|
|
71
|
+
executable: true,
|
|
72
|
+
backupDir: ctx.backupDir,
|
|
73
|
+
});
|
|
74
|
+
const endResult = writeOwnedArtifactFile({
|
|
75
|
+
path: endPath,
|
|
76
|
+
content: endArtifact.content,
|
|
77
|
+
executable: true,
|
|
78
|
+
backupDir: ctx.backupDir,
|
|
79
|
+
});
|
|
80
|
+
ctx.entries.push({
|
|
81
|
+
path: startPath,
|
|
82
|
+
kind: 'hook-script',
|
|
83
|
+
harness,
|
|
84
|
+
backupPath: startResult.backupPath,
|
|
85
|
+
executable: true,
|
|
86
|
+
}, {
|
|
87
|
+
path: endPath,
|
|
88
|
+
kind: 'hook-script',
|
|
89
|
+
harness,
|
|
90
|
+
backupPath: endResult.backupPath,
|
|
91
|
+
executable: true,
|
|
92
|
+
});
|
|
93
|
+
report.hooksInstalled = true;
|
|
94
|
+
const configPath = relocateUnderHome(target.configPath, ctx.homeDir);
|
|
95
|
+
const startWire = mergeJsonArrayEntry({
|
|
96
|
+
path: configPath,
|
|
97
|
+
keyPath: target.sessionStartKeyPath,
|
|
98
|
+
entry: hookMatcherEntry(startPath),
|
|
99
|
+
isOurEntry: (item) => hookEntryCommand(item) === startPath,
|
|
100
|
+
backupDir: ctx.backupDir,
|
|
101
|
+
alreadyBackedUpPaths: ctx.backedUpPaths,
|
|
102
|
+
});
|
|
103
|
+
const endWire = mergeJsonArrayEntry({
|
|
104
|
+
path: configPath,
|
|
105
|
+
keyPath: target.sessionEndKeyPath,
|
|
106
|
+
entry: hookMatcherEntry(endPath),
|
|
107
|
+
isOurEntry: (item) => hookEntryCommand(item) === endPath,
|
|
108
|
+
backupDir: ctx.backupDir,
|
|
109
|
+
alreadyBackedUpPaths: ctx.backedUpPaths,
|
|
110
|
+
});
|
|
111
|
+
report.hookConfig.push(startWire, endWire);
|
|
112
|
+
if (mergeSucceeded(startWire.status) || mergeSucceeded(endWire.status)) {
|
|
113
|
+
ctx.entries.push({
|
|
114
|
+
path: configPath,
|
|
115
|
+
kind: 'hook-config',
|
|
116
|
+
harness,
|
|
117
|
+
backupPath: startWire.backupPath ?? endWire.backupPath,
|
|
118
|
+
executable: false,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Install hook scripts for Codex (+x) and wire the SessionStart hook into
|
|
124
|
+
* `~/.codex/config.toml` as a marker-delimited `[[hooks.SessionStart]]`
|
|
125
|
+
* array-of-tables block (shape Step-6-verified against
|
|
126
|
+
* developers.openai.com/codex/hooks).
|
|
127
|
+
*
|
|
128
|
+
* SessionStart ONLY — deliberate, do not "complete" this:
|
|
129
|
+
* - Codex has NO SessionEnd event. There is nothing to wire the
|
|
130
|
+
* session-end.sh cleanup script to.
|
|
131
|
+
* - Codex's Stop event fires PER-TURN, not per-session. Wiring the marker
|
|
132
|
+
* cleanup there would delete the agent-mediation marker file after the
|
|
133
|
+
* FIRST turn, silently unmarking every subsequent tool call in the same
|
|
134
|
+
* session and corrupting the mediation-share metric the whole Wave-1
|
|
135
|
+
* bet is measured by.
|
|
136
|
+
* - Cleanup therefore rides the server's 12h marker TTL
|
|
137
|
+
* (`telemetry/agent-marker.ts` `AGENT_MARKER_TTL_MS`) — the same
|
|
138
|
+
* crash-backstop path every harness already relies on.
|
|
139
|
+
*
|
|
140
|
+
* session-end.sh is still installed (inert on Codex — nothing invokes it):
|
|
141
|
+
* it keeps the on-disk script tree identical across hook-capable harnesses
|
|
142
|
+
* and stays manifest-tracked, so uninstall removes it like any other owned
|
|
143
|
+
* file. Zero uninstall complication.
|
|
144
|
+
*/
|
|
145
|
+
export function installCodexHooks(startArtifact, endArtifact, ctx, report) {
|
|
146
|
+
const target = AGENT_HOOK_TARGETS.codex;
|
|
147
|
+
if (!target || !startArtifact || !endArtifact)
|
|
148
|
+
return;
|
|
149
|
+
const scriptDir = relocateUnderHome(target.scriptDir, ctx.homeDir);
|
|
150
|
+
const startPath = join(scriptDir, 'session-start.sh');
|
|
151
|
+
const endPath = join(scriptDir, 'session-end.sh');
|
|
152
|
+
const startResult = writeOwnedArtifactFile({
|
|
153
|
+
path: startPath,
|
|
154
|
+
content: startArtifact.content,
|
|
155
|
+
executable: true,
|
|
156
|
+
backupDir: ctx.backupDir,
|
|
157
|
+
});
|
|
158
|
+
const endResult = writeOwnedArtifactFile({
|
|
159
|
+
path: endPath,
|
|
160
|
+
content: endArtifact.content,
|
|
161
|
+
executable: true,
|
|
162
|
+
backupDir: ctx.backupDir,
|
|
163
|
+
});
|
|
164
|
+
ctx.entries.push({
|
|
165
|
+
path: startPath,
|
|
166
|
+
kind: 'hook-script',
|
|
167
|
+
harness: 'codex',
|
|
168
|
+
backupPath: startResult.backupPath,
|
|
169
|
+
executable: true,
|
|
170
|
+
}, {
|
|
171
|
+
path: endPath,
|
|
172
|
+
kind: 'hook-script',
|
|
173
|
+
harness: 'codex',
|
|
174
|
+
backupPath: endResult.backupPath,
|
|
175
|
+
executable: true,
|
|
176
|
+
});
|
|
177
|
+
report.hooksInstalled = true;
|
|
178
|
+
const configPath = relocateUnderHome(target.configPath, ctx.homeDir);
|
|
179
|
+
const wire = mergeTomlBlock({
|
|
180
|
+
path: configPath,
|
|
181
|
+
markerId: 'hooks.SessionStart',
|
|
182
|
+
blockContent: buildCodexSessionStartHookBlock(startPath),
|
|
183
|
+
foreignHeaderPattern: CODEX_HOOKS_TABLE_CONFLICT_HEADER,
|
|
184
|
+
backupDir: ctx.backupDir,
|
|
185
|
+
force: ctx.force,
|
|
186
|
+
alreadyBackedUpPaths: ctx.backedUpPaths,
|
|
187
|
+
});
|
|
188
|
+
report.hookConfig.push(wire);
|
|
189
|
+
if (mergeSucceeded(wire.status)) {
|
|
190
|
+
ctx.entries.push({
|
|
191
|
+
path: configPath,
|
|
192
|
+
kind: 'hook-config',
|
|
193
|
+
harness: 'codex',
|
|
194
|
+
backupPath: wire.backupPath,
|
|
195
|
+
executable: false,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (wire.status === 'conflict') {
|
|
199
|
+
report.notes.push(`Codex hook wiring skipped: ${configPath} defines [hooks.SessionStart] as a plain TOML table — appending our [[hooks.SessionStart]] array entry would make the file invalid TOML. Wire ${startPath} manually.`);
|
|
200
|
+
}
|
|
201
|
+
if (wire.status === 'error') {
|
|
202
|
+
report.notes.push(`Codex hook wiring failed at ${configPath}: ${wire.errorMessage}`);
|
|
203
|
+
}
|
|
204
|
+
report.notes.push('Codex: session-end.sh installed but not wired — Codex has no SessionEnd event and its Stop event fires per-turn (wiring cleanup there would break session-scoped mediation marking); marker cleanup rides the server-side 12h TTL.');
|
|
205
|
+
}
|
|
206
|
+
function hookMatcherEntry(scriptPath) {
|
|
207
|
+
return { matcher: '', hooks: [{ type: 'command', command: scriptPath }] };
|
|
208
|
+
}
|
|
209
|
+
function hookEntryCommand(item) {
|
|
210
|
+
if (!item || typeof item !== 'object')
|
|
211
|
+
return undefined;
|
|
212
|
+
const hooks = item.hooks;
|
|
213
|
+
if (!Array.isArray(hooks) || hooks.length === 0)
|
|
214
|
+
return undefined;
|
|
215
|
+
const first = hooks[0];
|
|
216
|
+
if (!first || typeof first !== 'object')
|
|
217
|
+
return undefined;
|
|
218
|
+
const command = first.command;
|
|
219
|
+
return typeof command === 'string' ? command : undefined;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Codex's named-agent "shim" is a `[agents.skillsmith-agent]` TOML entry
|
|
223
|
+
* merged into the same `~/.codex/config.toml` as its MCP registration —
|
|
224
|
+
* the artifact's content (`shims/codex/agents.toml`, rendered by the
|
|
225
|
+
* locked `renderCodexToml`) is already the exact block text to install.
|
|
226
|
+
*/
|
|
227
|
+
export function installCodexAgentsShim(artifact, ctx, report) {
|
|
228
|
+
const target = AGENT_MCP_TARGETS.codex;
|
|
229
|
+
if (!artifact)
|
|
230
|
+
return;
|
|
231
|
+
const path = relocateUnderHome(target.path, ctx.homeDir);
|
|
232
|
+
const result = mergeTomlBlock({
|
|
233
|
+
path,
|
|
234
|
+
markerId: 'agents.skillsmith-agent',
|
|
235
|
+
blockContent: artifact.content,
|
|
236
|
+
foreignHeaderPattern: CODEX_AGENTS_FOREIGN_HEADER,
|
|
237
|
+
backupDir: ctx.backupDir,
|
|
238
|
+
force: ctx.force,
|
|
239
|
+
alreadyBackedUpPaths: ctx.backedUpPaths,
|
|
240
|
+
});
|
|
241
|
+
if (mergeSucceeded(result.status)) {
|
|
242
|
+
report.shimWritten = true;
|
|
243
|
+
ctx.entries.push({
|
|
244
|
+
path,
|
|
245
|
+
kind: 'shim',
|
|
246
|
+
harness: 'codex',
|
|
247
|
+
backupPath: result.backupPath,
|
|
248
|
+
executable: false,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
if (result.status === 'conflict') {
|
|
252
|
+
report.notes.push(`Codex agent entry at ${path} already has a hand-written [agents.skillsmith-agent] table — left untouched.`);
|
|
253
|
+
}
|
|
254
|
+
if (result.status === 'error') {
|
|
255
|
+
report.notes.push(`Codex agent entry merge failed at ${path}: ${result.errorMessage}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/** Merge the `skillsmith` MCP server registration for any of the 7 MCP-capable harnesses. */
|
|
259
|
+
export function installMcpConfig(harness, ctx, report) {
|
|
260
|
+
const target = AGENT_MCP_TARGETS[harness];
|
|
261
|
+
const path = relocateUnderHome(target.path, ctx.homeDir);
|
|
262
|
+
// OpenCode's entry schema is structurally different from the mcpServers
|
|
263
|
+
// convention (typed local|remote, command-array, `environment`) — see
|
|
264
|
+
// buildOpenCodeMcpEntryValue.
|
|
265
|
+
const entryValue = harness === 'opencode' ? buildOpenCodeMcpEntryValue() : buildAgentMcpEntryValue();
|
|
266
|
+
const result = target.format === 'json'
|
|
267
|
+
? mergeJsonMcpEntry({
|
|
268
|
+
path,
|
|
269
|
+
keyPath: target.keyPath,
|
|
270
|
+
entryValue,
|
|
271
|
+
backupDir: ctx.backupDir,
|
|
272
|
+
force: ctx.force,
|
|
273
|
+
alreadyBackedUpPaths: ctx.backedUpPaths,
|
|
274
|
+
})
|
|
275
|
+
: target.format === 'yaml'
|
|
276
|
+
? mergeYamlMcpEntry({
|
|
277
|
+
path,
|
|
278
|
+
mcpServersKey: target.keyPath[0] ?? 'mcp_servers',
|
|
279
|
+
entryValue,
|
|
280
|
+
backupDir: ctx.backupDir,
|
|
281
|
+
force: ctx.force,
|
|
282
|
+
alreadyBackedUpPaths: ctx.backedUpPaths,
|
|
283
|
+
})
|
|
284
|
+
: mergeTomlBlock({
|
|
285
|
+
path,
|
|
286
|
+
markerId: 'mcp_servers.skillsmith',
|
|
287
|
+
blockContent: buildCodexMcpTomlBlock(),
|
|
288
|
+
foreignHeaderPattern: CODEX_MCP_FOREIGN_HEADER,
|
|
289
|
+
backupDir: ctx.backupDir,
|
|
290
|
+
force: ctx.force,
|
|
291
|
+
alreadyBackedUpPaths: ctx.backedUpPaths,
|
|
292
|
+
});
|
|
293
|
+
report.mcpConfig = result;
|
|
294
|
+
if (mergeSucceeded(result.status)) {
|
|
295
|
+
ctx.entries.push({
|
|
296
|
+
path,
|
|
297
|
+
kind: 'mcp-config',
|
|
298
|
+
harness,
|
|
299
|
+
backupPath: result.backupPath,
|
|
300
|
+
executable: false,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
if (result.status === 'conflict') {
|
|
304
|
+
report.notes.push(`MCP config at ${path} already has a 'skillsmith' entry that doesn't look like ours — left untouched. Re-run with --force to overwrite, or edit ${path} manually.`);
|
|
305
|
+
}
|
|
306
|
+
if (result.status === 'error') {
|
|
307
|
+
report.notes.push(`MCP config merge failed at ${path}: ${result.errorMessage}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=agent-pack-installer.harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-pack-installer.harness.js","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `sklx agent install` core orchestration (SMI-5456 Wave 1 Step 5).
|
|
3
|
+
*
|
|
4
|
+
* Generates the pack via `generateAgentPack({ toolProfile: AGENT_TOOL_PROFILE_NAMES })`
|
|
5
|
+
* (QD-2: byte-identical to the committed `packages/mcp-server/src/assets/agent-pack/`
|
|
6
|
+
* tree by determinism, never read from the mcp-server package) and writes:
|
|
7
|
+
* - SKILL.md to the mandatory dual path (claude-code + agents) plus any
|
|
8
|
+
* detected Tier-2/3 harness with its own native skill directory
|
|
9
|
+
* (opencode, hermes, windsurf).
|
|
10
|
+
* - Named-agent shims for every detected harness with a shim target
|
|
11
|
+
* (claude-code always; copilot, opencode when detected; codex via its
|
|
12
|
+
* own TOML-merge "shim").
|
|
13
|
+
* - SessionStart/SessionEnd hooks (+x) for claude-code (always), cursor
|
|
14
|
+
* and codex when detected — hook CONFIG wiring ships for claude-code/
|
|
15
|
+
* cursor (JSON arrays) and codex (SessionStart ONLY, as a
|
|
16
|
+
* marker-delimited `[[hooks.SessionStart]]` TOML block; Codex has no
|
|
17
|
+
* SessionEnd event and its Stop event is per-turn — see
|
|
18
|
+
* `installCodexHooks` in `agent-pack-installer.harness.ts`).
|
|
19
|
+
* - The `skillsmith` MCP server registration (`SKILLSMITH_TOOL_PROFILE=agent`)
|
|
20
|
+
* for every detected MCP-capable harness (all 7), backup-first,
|
|
21
|
+
* idempotent, preserve-and-prompt on a foreign entry.
|
|
22
|
+
*
|
|
23
|
+
* Every write funnels through `writeOwnedArtifactFile` (owned files) or the
|
|
24
|
+
* `agent-config-merge.*` helpers (shared config files), both of which record
|
|
25
|
+
* a manifest entry — `uninstallAgentPack` (SMI-5456) reverses exactly what
|
|
26
|
+
* this function wrote by replaying that manifest, never by re-deriving
|
|
27
|
+
* "what the current generator would produce".
|
|
28
|
+
*
|
|
29
|
+
* @module @skillsmith/core/install/agent-pack-installer
|
|
30
|
+
*/
|
|
31
|
+
import { existsSync } from 'node:fs';
|
|
32
|
+
import { homedir } from 'node:os';
|
|
33
|
+
import { join } from 'node:path';
|
|
34
|
+
import { AGENT_PACK_SKILL_NAME, generateAgentPack } from '../services/agent-pack/index.js';
|
|
35
|
+
import { AGENT_TOOL_PROFILE_NAMES } from '../services/agent-tool-profile.js';
|
|
36
|
+
import { CLIENT_NATIVE_PATHS } from './paths.js';
|
|
37
|
+
import { relocateUnderHome } from './agent-home-relocate.js';
|
|
38
|
+
import { writeOwnedArtifactFile } from './agent-pack-installer.fs-helpers.js';
|
|
39
|
+
import { getAgentInstallBackupsDir, getAgentManifestPath, loadAgentManifest, saveAgentManifest, } from './agent-manifest.js';
|
|
40
|
+
import { installCodexAgentsShim, installCodexHooks, installJsonHooks, installMcpConfig, installShim, } from './agent-pack-installer.harness.js';
|
|
41
|
+
import { HARNESS_SUPPORT_TIER, } from './agent-pack-installer.types.js';
|
|
42
|
+
/** Harnesses considered for the SKILL.md pack copy beyond the mandatory dual path. */
|
|
43
|
+
const OPTIONAL_SKILL_PACK_HARNESSES = ['windsurf', 'opencode', 'hermes'];
|
|
44
|
+
function isPresent(nativePath, homeDir) {
|
|
45
|
+
return existsSync(relocateUnderHome(nativePath, homeDir));
|
|
46
|
+
}
|
|
47
|
+
function isCodexPresent(homeDir) {
|
|
48
|
+
return existsSync(relocateUnderHome(join(homedir(), '.codex'), homeDir));
|
|
49
|
+
}
|
|
50
|
+
/** Write the SKILL.md pack to one client's native skill directory (`<dir>/skillsmith-agent/SKILL.md`). */
|
|
51
|
+
function writeSkillPackFor(clientNativePath, content, ctx, harness) {
|
|
52
|
+
const path = join(relocateUnderHome(clientNativePath, ctx.homeDir), AGENT_PACK_SKILL_NAME, 'SKILL.md');
|
|
53
|
+
const result = writeOwnedArtifactFile({
|
|
54
|
+
path,
|
|
55
|
+
content,
|
|
56
|
+
executable: false,
|
|
57
|
+
backupDir: ctx.backupDir,
|
|
58
|
+
});
|
|
59
|
+
ctx.entries.push({
|
|
60
|
+
path,
|
|
61
|
+
kind: 'skill',
|
|
62
|
+
harness,
|
|
63
|
+
backupPath: result.backupPath,
|
|
64
|
+
executable: false,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function newReport(harness) {
|
|
68
|
+
return {
|
|
69
|
+
harness,
|
|
70
|
+
tier: HARNESS_SUPPORT_TIER[harness] ?? 3,
|
|
71
|
+
detected: false,
|
|
72
|
+
skillPackWritten: false,
|
|
73
|
+
shimWritten: false,
|
|
74
|
+
hooksInstalled: false,
|
|
75
|
+
mcpConfig: null,
|
|
76
|
+
hookConfig: [],
|
|
77
|
+
notes: [],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Carry forward pre-install backup references from a PRIOR install so a
|
|
82
|
+
* re-install cannot silently strand them.
|
|
83
|
+
*
|
|
84
|
+
* A re-install takes NO fresh backup for a path whose owned-file content
|
|
85
|
+
* already matches, nor for a shared-config merge that is a no-op — so this
|
|
86
|
+
* run's freshly-built `entries` record `backupPath: null` for those paths.
|
|
87
|
+
* Persisting that as-is would overwrite the prior manifest's genuine
|
|
88
|
+
* pre-install backup ref with null, and `uninstallAgentPack` would then treat
|
|
89
|
+
* a MODIFIED pre-existing file (e.g. a `~/.claude/settings.json` the user
|
|
90
|
+
* already had) as "created fresh" and DELETE it instead of restoring it —
|
|
91
|
+
* silent user-data loss on the `install → install → uninstall` sequence
|
|
92
|
+
* (SMI-5456 adversarial-review fix, verified by the double-install reversal
|
|
93
|
+
* test).
|
|
94
|
+
*
|
|
95
|
+
* The prior manifest's `backupPath` is the authoritative restore target for a
|
|
96
|
+
* path (the true pre-FIRST-install content), so it WINS over any fresh backup
|
|
97
|
+
* this run may have taken — a mid-lifecycle backup captured on a version-bump
|
|
98
|
+
* re-install would itself contain our own already-merged blocks. `uninstall`
|
|
99
|
+
* clears the manifest to `entries: []`, so an install-AFTER-uninstall carries
|
|
100
|
+
* nothing forward (this run's fresh backups win); only a re-install WITHOUT an
|
|
101
|
+
* intervening uninstall reaches this path. A prior ref whose backup file no
|
|
102
|
+
* longer exists is ignored (nothing to restore from).
|
|
103
|
+
*/
|
|
104
|
+
function carryForwardPriorBackups(entries) {
|
|
105
|
+
const priorBackupByPath = new Map();
|
|
106
|
+
for (const prior of loadAgentManifest().entries) {
|
|
107
|
+
if (prior.backupPath && existsSync(prior.backupPath)) {
|
|
108
|
+
priorBackupByPath.set(prior.path, prior.backupPath);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (priorBackupByPath.size === 0)
|
|
112
|
+
return entries;
|
|
113
|
+
return entries.map((entry) => {
|
|
114
|
+
const carried = priorBackupByPath.get(entry.path);
|
|
115
|
+
return carried ? { ...entry, backupPath: carried } : entry;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Detect + install the portable Skillsmith Agent pack across every
|
|
120
|
+
* supported harness. See module header for the full per-harness matrix.
|
|
121
|
+
*/
|
|
122
|
+
export function installAgentPack(opts = {}) {
|
|
123
|
+
const homeDir = opts.homeDir;
|
|
124
|
+
const force = opts.force ?? false;
|
|
125
|
+
// Manifest/backups dir isolation for tests is via SKILLSMITH_AGENT_INSTALL_DIR
|
|
126
|
+
// (agent-manifest.ts), not `homeDir` — kept separate from harness-target
|
|
127
|
+
// relocation so a test can isolate manifest state without needing a full
|
|
128
|
+
// fake HOME tree.
|
|
129
|
+
const backupDir = getAgentInstallBackupsDir();
|
|
130
|
+
const entries = [];
|
|
131
|
+
const ctx = {
|
|
132
|
+
homeDir,
|
|
133
|
+
force,
|
|
134
|
+
backupDir,
|
|
135
|
+
entries,
|
|
136
|
+
backedUpPaths: new Set(),
|
|
137
|
+
};
|
|
138
|
+
const artifacts = generateAgentPack({ toolProfile: AGENT_TOOL_PROFILE_NAMES });
|
|
139
|
+
const skillArtifact = artifacts.find((a) => a.kind === 'skill');
|
|
140
|
+
const shimByHarness = new Map(artifacts.filter((a) => a.kind === 'shim').map((a) => [a.harness, a]));
|
|
141
|
+
const hookStartByHarness = new Map(artifacts
|
|
142
|
+
.filter((a) => a.kind === 'hook' && a.path.endsWith('session-start.sh'))
|
|
143
|
+
.map((a) => [a.harness, a]));
|
|
144
|
+
const hookEndByHarness = new Map(artifacts
|
|
145
|
+
.filter((a) => a.kind === 'hook' && a.path.endsWith('session-end.sh'))
|
|
146
|
+
.map((a) => [a.harness, a]));
|
|
147
|
+
const detected = {
|
|
148
|
+
'claude-code': true, // canonical client — always on, mirrors CANONICAL_CLIENT in paths.ts
|
|
149
|
+
cursor: isPresent(CLIENT_NATIVE_PATHS.cursor, homeDir),
|
|
150
|
+
copilot: isPresent(CLIENT_NATIVE_PATHS.copilot, homeDir),
|
|
151
|
+
windsurf: isPresent(CLIENT_NATIVE_PATHS.windsurf, homeDir),
|
|
152
|
+
opencode: isPresent(CLIENT_NATIVE_PATHS.opencode, homeDir),
|
|
153
|
+
hermes: isPresent(CLIENT_NATIVE_PATHS.hermes, homeDir),
|
|
154
|
+
codex: isCodexPresent(homeDir),
|
|
155
|
+
};
|
|
156
|
+
const reports = [];
|
|
157
|
+
const harnessIds = [
|
|
158
|
+
'claude-code',
|
|
159
|
+
'cursor',
|
|
160
|
+
'codex',
|
|
161
|
+
'copilot',
|
|
162
|
+
'opencode',
|
|
163
|
+
'hermes',
|
|
164
|
+
'windsurf',
|
|
165
|
+
];
|
|
166
|
+
for (const harness of harnessIds) {
|
|
167
|
+
const report = newReport(harness);
|
|
168
|
+
report.detected = detected[harness];
|
|
169
|
+
const active = report.detected;
|
|
170
|
+
// Skill pack: mandatory dual path regardless of "detected"; optional
|
|
171
|
+
// harnesses only when detected.
|
|
172
|
+
if (harness === 'claude-code' && skillArtifact) {
|
|
173
|
+
writeSkillPackFor(CLIENT_NATIVE_PATHS['claude-code'], skillArtifact.content, ctx, harness);
|
|
174
|
+
report.skillPackWritten = true;
|
|
175
|
+
}
|
|
176
|
+
if (active &&
|
|
177
|
+
OPTIONAL_SKILL_PACK_HARNESSES.includes(harness) &&
|
|
178
|
+
skillArtifact) {
|
|
179
|
+
const nativePath = CLIENT_NATIVE_PATHS[harness];
|
|
180
|
+
writeSkillPackFor(nativePath, skillArtifact.content, ctx, harness);
|
|
181
|
+
report.skillPackWritten = true;
|
|
182
|
+
}
|
|
183
|
+
if (harness === 'claude-code' || active) {
|
|
184
|
+
if (harness === 'claude-code' || harness === 'copilot' || harness === 'opencode') {
|
|
185
|
+
installShim(harness, shimByHarness.get(harness), ctx, report);
|
|
186
|
+
}
|
|
187
|
+
if (harness === 'claude-code' || harness === 'cursor') {
|
|
188
|
+
installJsonHooks(harness, hookStartByHarness.get(harness), hookEndByHarness.get(harness), ctx, report);
|
|
189
|
+
}
|
|
190
|
+
if (harness === 'codex') {
|
|
191
|
+
installCodexHooks(hookStartByHarness.get('codex'), hookEndByHarness.get('codex'), ctx, report);
|
|
192
|
+
installCodexAgentsShim(shimByHarness.get('codex'), ctx, report);
|
|
193
|
+
}
|
|
194
|
+
// `harnessIds` is exactly the 7-member McpHarnessId union (all harnesses
|
|
195
|
+
// considered here support MCP registration) — safe direct cast.
|
|
196
|
+
installMcpConfig(harness, ctx, report);
|
|
197
|
+
}
|
|
198
|
+
reports.push(report);
|
|
199
|
+
}
|
|
200
|
+
// Mandatory dual path for the second (agents) leg — reported alongside
|
|
201
|
+
// claude-code's entry rather than as an 8th standalone harness row, since
|
|
202
|
+
// ~/.agents/skills is a shared open-standard convention, not a harness of
|
|
203
|
+
// its own (Codex's OWN report row covers its config/hook/shim surface).
|
|
204
|
+
if (skillArtifact) {
|
|
205
|
+
writeSkillPackFor(CLIENT_NATIVE_PATHS.agents, skillArtifact.content, ctx, 'agents');
|
|
206
|
+
}
|
|
207
|
+
saveAgentManifest({
|
|
208
|
+
schemaVersion: 1,
|
|
209
|
+
installedAt: new Date().toISOString(),
|
|
210
|
+
packSchemaVersion: 1,
|
|
211
|
+
entries: carryForwardPriorBackups(entries),
|
|
212
|
+
});
|
|
213
|
+
return {
|
|
214
|
+
installedAt: new Date().toISOString(),
|
|
215
|
+
manifestPath: getAgentManifestPath(),
|
|
216
|
+
harnessReports: reports,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// Re-export so callers (CLI) don't need a second import for manifest inspection.
|
|
220
|
+
export { loadAgentManifest };
|
|
221
|
+
//# sourceMappingURL=agent-pack-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-pack-installer.js","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* installAgentPack preserve-existing semantics (SMI-5456).
|
|
3
|
+
*
|
|
4
|
+
* Split from agent-pack-installer.test.ts at the 500-line gate; shares its
|
|
5
|
+
* temp-HOME + manifest-env fixture shape. Covers the non-interactive conflict
|
|
6
|
+
* refusal for a foreign pre-existing `skillsmith` MCP entry and the
|
|
7
|
+
* `force: true` overwrite path (including the manifest-records-a-real-backup
|
|
8
|
+
* invariant that uninstall replay depends on).
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=agent-pack-installer.preserve.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-pack-installer.preserve.test.d.ts","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.preserve.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* installAgentPack preserve-existing semantics (SMI-5456).
|
|
3
|
+
*
|
|
4
|
+
* Split from agent-pack-installer.test.ts at the 500-line gate; shares its
|
|
5
|
+
* temp-HOME + manifest-env fixture shape. Covers the non-interactive conflict
|
|
6
|
+
* refusal for a foreign pre-existing `skillsmith` MCP entry and the
|
|
7
|
+
* `force: true` overwrite path (including the manifest-records-a-real-backup
|
|
8
|
+
* invariant that uninstall replay depends on).
|
|
9
|
+
*/
|
|
10
|
+
import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
11
|
+
import { tmpdir } from 'node:os';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
14
|
+
import { installAgentPack } from './agent-pack-installer.js';
|
|
15
|
+
import { AGENT_INSTALL_DIR_ENV_VAR, getAgentManifestPath } from './agent-manifest.js';
|
|
16
|
+
let homeDir;
|
|
17
|
+
let manifestDir;
|
|
18
|
+
let prevInstallDirEnv;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
homeDir = mkdtempSync(join(tmpdir(), 'skillsmith-agent-install-home-'));
|
|
21
|
+
manifestDir = mkdtempSync(join(tmpdir(), 'skillsmith-agent-install-manifest-'));
|
|
22
|
+
prevInstallDirEnv = process.env[AGENT_INSTALL_DIR_ENV_VAR];
|
|
23
|
+
process.env[AGENT_INSTALL_DIR_ENV_VAR] = manifestDir;
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
rmSync(homeDir, { recursive: true, force: true });
|
|
27
|
+
rmSync(manifestDir, { recursive: true, force: true });
|
|
28
|
+
if (prevInstallDirEnv !== undefined)
|
|
29
|
+
process.env[AGENT_INSTALL_DIR_ENV_VAR] = prevInstallDirEnv;
|
|
30
|
+
else
|
|
31
|
+
delete process.env[AGENT_INSTALL_DIR_ENV_VAR];
|
|
32
|
+
});
|
|
33
|
+
describe('installAgentPack — preserve-existing (non-interactive refusal)', () => {
|
|
34
|
+
it('does not clobber a foreign pre-existing skillsmith MCP entry, and reports a conflict', () => {
|
|
35
|
+
mkdirSync(join(homeDir, '.claude'), { recursive: true });
|
|
36
|
+
const settingsPath = join(homeDir, '.claude', 'settings.json');
|
|
37
|
+
const foreign = {
|
|
38
|
+
mcpServers: {
|
|
39
|
+
skillsmith: { command: 'node', args: ['/some/other/local/path/index.js'] },
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
writeFileSync(settingsPath, JSON.stringify(foreign, null, 2));
|
|
43
|
+
const result = installAgentPack({ homeDir });
|
|
44
|
+
const doc = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
45
|
+
expect(doc.mcpServers.skillsmith).toEqual(foreign.mcpServers.skillsmith);
|
|
46
|
+
const report = result.harnessReports.find((r) => r.harness === 'claude-code');
|
|
47
|
+
expect(report?.mcpConfig?.status).toBe('conflict');
|
|
48
|
+
expect(report?.notes.some((n) => n.includes('--force'))).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
it('force: true overwrites the foreign entry and the manifest records a real backup for the file', () => {
|
|
51
|
+
mkdirSync(join(homeDir, '.claude'), { recursive: true });
|
|
52
|
+
const settingsPath = join(homeDir, '.claude', 'settings.json');
|
|
53
|
+
const foreign = { mcpServers: { skillsmith: { command: 'node', args: ['/other'] } } };
|
|
54
|
+
writeFileSync(settingsPath, JSON.stringify(foreign, null, 2));
|
|
55
|
+
const result = installAgentPack({ homeDir, force: true });
|
|
56
|
+
const doc = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
57
|
+
expect(doc.mcpServers.skillsmith.env.SKILLSMITH_TOOL_PROFILE).toBe('agent');
|
|
58
|
+
const report = result.harnessReports.find((r) => r.harness === 'claude-code');
|
|
59
|
+
expect(report?.mcpConfig?.status).toBe('updated');
|
|
60
|
+
// The MCP merge's OWN `mcpConfig.backupPath` can legitimately be null
|
|
61
|
+
// here: claude-code's hook-config merge runs FIRST this install run and
|
|
62
|
+
// is the one that takes the single real backup of settings.json
|
|
63
|
+
// (`alreadyBackedUpPaths` — one backup per file per run, see
|
|
64
|
+
// agent-config-merge.types.ts). What matters for correctness is that the
|
|
65
|
+
// MANIFEST — which uninstall actually replays — records a real backup
|
|
66
|
+
// for settingsPath, regardless of which merge call happened to claim it.
|
|
67
|
+
const manifest = JSON.parse(readFileSync(getAgentManifestPath(), 'utf-8'));
|
|
68
|
+
const settingsEntry = manifest.entries.find((e) => e.path === settingsPath);
|
|
69
|
+
expect(settingsEntry?.backupPath).not.toBeNull();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=agent-pack-installer.preserve.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-pack-installer.preserve.test.js","sourceRoot":"","sources":["../../../src/install/agent-pack-installer.preserve.test.ts"],"names":[],"mappings":"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"}
|