@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 @@
|
|
|
1
|
+
{"version":3,"file":"agent-config-merge.types.js","sourceRoot":"","sources":["../../../src/install/agent-config-merge.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML config-merge helper for Hermes (SMI-5456 Wave 1 Step 5).
|
|
3
|
+
*
|
|
4
|
+
* Hermes is the one target harness whose MCP config is YAML
|
|
5
|
+
* (`~/.hermes/config.yaml`, key `mcp_servers:` — spike report §(b),
|
|
6
|
+
* well-verified against three independent official doc pages). The repo
|
|
7
|
+
* already carries a real `yaml` dependency (`packages/core/package.json` /
|
|
8
|
+
* root `package.json`, `"yaml": "^2.8.3"` — also already used by
|
|
9
|
+
* `packages/core/src/services/agent-pack/agent-pack.test.ts`), so this uses
|
|
10
|
+
* the library's structured Document API (`parseDocument`/`Document#setIn`)
|
|
11
|
+
* rather than the textual delimited-block scheme the task brief allowed as a
|
|
12
|
+
* fallback for "no YAML dep" — that fallback does not apply here since the
|
|
13
|
+
* dependency exists.
|
|
14
|
+
*
|
|
15
|
+
* GOVERNANCE FIX (SMI-5456 code review, 2026-07-01): this module originally
|
|
16
|
+
* used the library's plain `parse`/`stringify` functions. Those DISCARD
|
|
17
|
+
* every comment in the source file on round-trip (verified: `# top comment`
|
|
18
|
+
* + `# a server` + a trailing inline `# inline comment` all vanish after a
|
|
19
|
+
* `parse` → mutate → `stringify` cycle) — a straightforward
|
|
20
|
+
* preserve-user-content violation for anyone who annotates their own
|
|
21
|
+
* `~/.hermes/config.yaml`. `yaml`'s `Document`/`parseDocument`/`setIn` API
|
|
22
|
+
* operates on the CST and round-trips comments, anchors, and key ordering
|
|
23
|
+
* untouched, only rewriting the one path this module actually sets — see the
|
|
24
|
+
* in-container verification in the SMI-5456 code review report. One
|
|
25
|
+
* documented gap remains: a source file whose root is YAML-null (`~`/`null`,
|
|
26
|
+
* or a fully empty document) with a comment attached to that null node loses
|
|
27
|
+
* that specific comment when the null root is replaced with a fresh mapping
|
|
28
|
+
* (there is no collection node for `setIn` to attach into) — an edge case for
|
|
29
|
+
* a config file that carries no actual config, accepted rather than adding a
|
|
30
|
+
* bespoke CST-splicing path for it.
|
|
31
|
+
*
|
|
32
|
+
* @module @skillsmith/core/install/agent-config-merge.yaml
|
|
33
|
+
*/
|
|
34
|
+
import { type MergeOptions, type MergeResult } from './agent-config-merge.types.js';
|
|
35
|
+
/**
|
|
36
|
+
* Merge a `skillsmith` entry into `mcp_servers:` of a YAML config file.
|
|
37
|
+
* Same created/updated/unchanged/conflict/error contract as
|
|
38
|
+
* {@link import('./agent-config-merge.json.js').mergeJsonMcpEntry}. Uses the
|
|
39
|
+
* `yaml` package's `Document` (CST-backed) API so every comment, anchor, and
|
|
40
|
+
* unrelated key in the user's file survives the merge byte-for-byte except
|
|
41
|
+
* for the one path this function actually sets — see module header.
|
|
42
|
+
*/
|
|
43
|
+
export declare function mergeYamlMcpEntry(opts: MergeOptions & {
|
|
44
|
+
mcpServersKey: string;
|
|
45
|
+
}): MergeResult;
|
|
46
|
+
//# sourceMappingURL=agent-config-merge.yaml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-config-merge.yaml.d.ts","sourceRoot":"","sources":["../../../src/install/agent-config-merge.yaml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAOH,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAA;AAwBtC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAqE7F"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML config-merge helper for Hermes (SMI-5456 Wave 1 Step 5).
|
|
3
|
+
*
|
|
4
|
+
* Hermes is the one target harness whose MCP config is YAML
|
|
5
|
+
* (`~/.hermes/config.yaml`, key `mcp_servers:` — spike report §(b),
|
|
6
|
+
* well-verified against three independent official doc pages). The repo
|
|
7
|
+
* already carries a real `yaml` dependency (`packages/core/package.json` /
|
|
8
|
+
* root `package.json`, `"yaml": "^2.8.3"` — also already used by
|
|
9
|
+
* `packages/core/src/services/agent-pack/agent-pack.test.ts`), so this uses
|
|
10
|
+
* the library's structured Document API (`parseDocument`/`Document#setIn`)
|
|
11
|
+
* rather than the textual delimited-block scheme the task brief allowed as a
|
|
12
|
+
* fallback for "no YAML dep" — that fallback does not apply here since the
|
|
13
|
+
* dependency exists.
|
|
14
|
+
*
|
|
15
|
+
* GOVERNANCE FIX (SMI-5456 code review, 2026-07-01): this module originally
|
|
16
|
+
* used the library's plain `parse`/`stringify` functions. Those DISCARD
|
|
17
|
+
* every comment in the source file on round-trip (verified: `# top comment`
|
|
18
|
+
* + `# a server` + a trailing inline `# inline comment` all vanish after a
|
|
19
|
+
* `parse` → mutate → `stringify` cycle) — a straightforward
|
|
20
|
+
* preserve-user-content violation for anyone who annotates their own
|
|
21
|
+
* `~/.hermes/config.yaml`. `yaml`'s `Document`/`parseDocument`/`setIn` API
|
|
22
|
+
* operates on the CST and round-trips comments, anchors, and key ordering
|
|
23
|
+
* untouched, only rewriting the one path this module actually sets — see the
|
|
24
|
+
* in-container verification in the SMI-5456 code review report. One
|
|
25
|
+
* documented gap remains: a source file whose root is YAML-null (`~`/`null`,
|
|
26
|
+
* or a fully empty document) with a comment attached to that null node loses
|
|
27
|
+
* that specific comment when the null root is replaced with a fresh mapping
|
|
28
|
+
* (there is no collection node for `setIn` to attach into) — an edge case for
|
|
29
|
+
* a config file that carries no actual config, accepted rather than adding a
|
|
30
|
+
* bespoke CST-splicing path for it.
|
|
31
|
+
*
|
|
32
|
+
* @module @skillsmith/core/install/agent-config-merge.yaml
|
|
33
|
+
*/
|
|
34
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
35
|
+
import { dirname, join } from 'node:path';
|
|
36
|
+
import { Document, isMap, isScalar, parseDocument } from 'yaml';
|
|
37
|
+
import { deepEqualJson, looksLikeOurMcpEntry, markBackedUp, shouldBackup, } from './agent-config-merge.types.js';
|
|
38
|
+
function writeBackup(sourcePath, backupDir) {
|
|
39
|
+
mkdirSync(backupDir, { recursive: true, mode: 0o700 });
|
|
40
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
41
|
+
const baseName = sourcePath.split('/').pop() ?? 'config';
|
|
42
|
+
const backupPath = join(backupDir, `${stamp}-${baseName}.bak`);
|
|
43
|
+
writeFileSync(backupPath, readFileSync(sourcePath, 'utf-8'), { mode: 0o600 });
|
|
44
|
+
return backupPath;
|
|
45
|
+
}
|
|
46
|
+
/** Unwrap a `yaml` Document node (or plain value) into a plain JS value for comparison. */
|
|
47
|
+
function toPlainValue(node) {
|
|
48
|
+
if (node &&
|
|
49
|
+
typeof node === 'object' &&
|
|
50
|
+
'toJSON' in node &&
|
|
51
|
+
typeof node.toJSON === 'function') {
|
|
52
|
+
return node.toJSON();
|
|
53
|
+
}
|
|
54
|
+
return node;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Merge a `skillsmith` entry into `mcp_servers:` of a YAML config file.
|
|
58
|
+
* Same created/updated/unchanged/conflict/error contract as
|
|
59
|
+
* {@link import('./agent-config-merge.json.js').mergeJsonMcpEntry}. Uses the
|
|
60
|
+
* `yaml` package's `Document` (CST-backed) API so every comment, anchor, and
|
|
61
|
+
* unrelated key in the user's file survives the merge byte-for-byte except
|
|
62
|
+
* for the one path this function actually sets — see module header.
|
|
63
|
+
*/
|
|
64
|
+
export function mergeYamlMcpEntry(opts) {
|
|
65
|
+
const { path, entryValue, backupDir, force = false, mcpServersKey, alreadyBackedUpPaths } = opts;
|
|
66
|
+
let doc;
|
|
67
|
+
const existed = existsSync(path);
|
|
68
|
+
if (existed) {
|
|
69
|
+
let raw;
|
|
70
|
+
try {
|
|
71
|
+
raw = readFileSync(path, 'utf-8');
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
return { status: 'error', path, backupPath: null, errorMessage: e.message };
|
|
75
|
+
}
|
|
76
|
+
if (raw.trim().length === 0) {
|
|
77
|
+
doc = new Document({});
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const parsed = parseDocument(raw);
|
|
81
|
+
if (parsed.errors.length > 0) {
|
|
82
|
+
return {
|
|
83
|
+
status: 'error',
|
|
84
|
+
path,
|
|
85
|
+
backupPath: null,
|
|
86
|
+
errorMessage: parsed.errors[0]?.message ?? 'YAML parse error',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (parsed.contents !== null && isScalar(parsed.contents) && parsed.contents.value === null) {
|
|
90
|
+
// YAML-null root (`~`, `null`, or comments-only-then-null) — treat as
|
|
91
|
+
// an empty mapping, matching the JSON merge helper's "missing file is
|
|
92
|
+
// treated as {}" behavior. A fresh `Document` (rather than mutating
|
|
93
|
+
// `parsed.contents` in place) sidesteps `Document.Parsed`'s stricter
|
|
94
|
+
// `ParsedNode`-only contents typing; behaviorally identical either
|
|
95
|
+
// way since a bare null-root file carries no salvageable structure.
|
|
96
|
+
// Documented CST-comment-loss edge case for this specific shape —
|
|
97
|
+
// see module header.
|
|
98
|
+
doc = new Document({});
|
|
99
|
+
}
|
|
100
|
+
else if (parsed.contents !== null && !isMap(parsed.contents)) {
|
|
101
|
+
return { status: 'error', path, backupPath: null, errorMessage: 'not a YAML mapping' };
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
doc = parsed;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
doc = new Document({});
|
|
110
|
+
}
|
|
111
|
+
const existingEntry = toPlainValue(doc.getIn([mcpServersKey, 'skillsmith']));
|
|
112
|
+
if (existingEntry !== undefined) {
|
|
113
|
+
if (deepEqualJson(existingEntry, entryValue)) {
|
|
114
|
+
return { status: 'unchanged', path, backupPath: null };
|
|
115
|
+
}
|
|
116
|
+
if (!looksLikeOurMcpEntry(existingEntry) && !force) {
|
|
117
|
+
return { status: 'conflict', path, backupPath: null };
|
|
118
|
+
}
|
|
119
|
+
const backupPath = existed && shouldBackup(path, alreadyBackedUpPaths) ? writeBackup(path, backupDir) : null;
|
|
120
|
+
markBackedUp(path, alreadyBackedUpPaths);
|
|
121
|
+
doc.setIn([mcpServersKey, 'skillsmith'], entryValue);
|
|
122
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
123
|
+
writeFileSync(path, doc.toString(), { mode: 0o600 });
|
|
124
|
+
return { status: 'updated', path, backupPath };
|
|
125
|
+
}
|
|
126
|
+
const backupPath = existed && shouldBackup(path, alreadyBackedUpPaths) ? writeBackup(path, backupDir) : null;
|
|
127
|
+
markBackedUp(path, alreadyBackedUpPaths);
|
|
128
|
+
doc.setIn([mcpServersKey, 'skillsmith'], entryValue);
|
|
129
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
130
|
+
writeFileSync(path, doc.toString(), { mode: 0o600 });
|
|
131
|
+
return { status: 'created', path, backupPath };
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=agent-config-merge.yaml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-config-merge.yaml.js","sourceRoot":"","sources":["../../../src/install/agent-config-merge.yaml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-config-merge.yaml.test.d.ts","sourceRoot":"","sources":["../../../src/install/agent-config-merge.yaml.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unit tests for `mergeYamlMcpEntry` (SMI-5456 governance
|
|
3
|
+
* follow-up, code review 2026-07-01).
|
|
4
|
+
* @module @skillsmith/core/install/agent-config-merge.yaml.test
|
|
5
|
+
*
|
|
6
|
+
* Added because this module previously had ZERO direct test coverage — the
|
|
7
|
+
* only harness exercising the YAML config format (Hermes) is never
|
|
8
|
+
* "detected" in `agent-pack-installer.test.ts` (no test creates `~/.hermes`),
|
|
9
|
+
* so the plain-`parse`/`stringify` comment-loss bug this file's governance
|
|
10
|
+
* fix addresses shipped with no test that could have caught it. Covers the
|
|
11
|
+
* created/updated/unchanged/conflict/error contract plus the comment-
|
|
12
|
+
* preservation regression itself.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
15
|
+
import { tmpdir } from 'node:os';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
18
|
+
import { mergeYamlMcpEntry } from './agent-config-merge.yaml.js';
|
|
19
|
+
let dir;
|
|
20
|
+
let configPath;
|
|
21
|
+
let backupDir;
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
dir = mkdtempSync(join(tmpdir(), 'skillsmith-yaml-merge-'));
|
|
24
|
+
configPath = join(dir, 'config.yaml');
|
|
25
|
+
backupDir = join(dir, 'backups');
|
|
26
|
+
});
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
rmSync(dir, { recursive: true, force: true });
|
|
29
|
+
});
|
|
30
|
+
const ENTRY = {
|
|
31
|
+
command: 'npx',
|
|
32
|
+
args: ['-y', '@skillsmith/mcp-server'],
|
|
33
|
+
env: { SKILLSMITH_TOOL_PROFILE: 'agent' },
|
|
34
|
+
};
|
|
35
|
+
describe('mergeYamlMcpEntry', () => {
|
|
36
|
+
it('creates the file + mcp_servers.skillsmith key when absent', () => {
|
|
37
|
+
const result = mergeYamlMcpEntry({
|
|
38
|
+
path: configPath,
|
|
39
|
+
mcpServersKey: 'mcp_servers',
|
|
40
|
+
entryValue: ENTRY,
|
|
41
|
+
backupDir,
|
|
42
|
+
});
|
|
43
|
+
expect(result.status).toBe('created');
|
|
44
|
+
expect(result.backupPath).toBeNull();
|
|
45
|
+
expect(existsSync(configPath)).toBe(true);
|
|
46
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
47
|
+
expect(content).toContain('mcp_servers:');
|
|
48
|
+
expect(content).toContain('skillsmith:');
|
|
49
|
+
});
|
|
50
|
+
it('is idempotent: a second merge with the same entryValue reports unchanged and writes no backup', () => {
|
|
51
|
+
mergeYamlMcpEntry({
|
|
52
|
+
path: configPath,
|
|
53
|
+
mcpServersKey: 'mcp_servers',
|
|
54
|
+
entryValue: ENTRY,
|
|
55
|
+
backupDir,
|
|
56
|
+
});
|
|
57
|
+
const second = mergeYamlMcpEntry({
|
|
58
|
+
path: configPath,
|
|
59
|
+
mcpServersKey: 'mcp_servers',
|
|
60
|
+
entryValue: ENTRY,
|
|
61
|
+
backupDir,
|
|
62
|
+
});
|
|
63
|
+
expect(second.status).toBe('unchanged');
|
|
64
|
+
expect(second.backupPath).toBeNull();
|
|
65
|
+
expect(existsSync(backupDir)).toBe(false);
|
|
66
|
+
});
|
|
67
|
+
it('PRESERVES comments, unrelated keys, and key order on merge (governance regression test)', () => {
|
|
68
|
+
const src = [
|
|
69
|
+
'# top-of-file comment',
|
|
70
|
+
'some_other_tool:',
|
|
71
|
+
' # a nested comment',
|
|
72
|
+
' enabled: true # inline comment',
|
|
73
|
+
'mcp_servers:',
|
|
74
|
+
' # an existing server',
|
|
75
|
+
' other_server:',
|
|
76
|
+
' command: bar',
|
|
77
|
+
'',
|
|
78
|
+
].join('\n');
|
|
79
|
+
writeFileSync(configPath, src);
|
|
80
|
+
const result = mergeYamlMcpEntry({
|
|
81
|
+
path: configPath,
|
|
82
|
+
mcpServersKey: 'mcp_servers',
|
|
83
|
+
entryValue: ENTRY,
|
|
84
|
+
backupDir,
|
|
85
|
+
});
|
|
86
|
+
expect(result.status).toBe('created');
|
|
87
|
+
const out = readFileSync(configPath, 'utf-8');
|
|
88
|
+
expect(out).toContain('# top-of-file comment');
|
|
89
|
+
expect(out).toContain('# a nested comment');
|
|
90
|
+
expect(out).toContain('# inline comment');
|
|
91
|
+
expect(out).toContain('# an existing server');
|
|
92
|
+
expect(out).toContain('other_server:');
|
|
93
|
+
expect(out).toContain('enabled: true');
|
|
94
|
+
expect(out).toContain('skillsmith:');
|
|
95
|
+
});
|
|
96
|
+
it('does not clobber a foreign non-Skillsmith skillsmith entry (conflict, no force)', () => {
|
|
97
|
+
writeFileSync(configPath, 'mcp_servers:\n skillsmith:\n command: some-other-tool\n');
|
|
98
|
+
const result = mergeYamlMcpEntry({
|
|
99
|
+
path: configPath,
|
|
100
|
+
mcpServersKey: 'mcp_servers',
|
|
101
|
+
entryValue: ENTRY,
|
|
102
|
+
backupDir,
|
|
103
|
+
});
|
|
104
|
+
expect(result.status).toBe('conflict');
|
|
105
|
+
const out = readFileSync(configPath, 'utf-8');
|
|
106
|
+
expect(out).toContain('some-other-tool');
|
|
107
|
+
});
|
|
108
|
+
it('force: true overwrites a foreign entry and backs up the pre-existing file first', () => {
|
|
109
|
+
writeFileSync(configPath, 'mcp_servers:\n skillsmith:\n command: some-other-tool\n');
|
|
110
|
+
const result = mergeYamlMcpEntry({
|
|
111
|
+
path: configPath,
|
|
112
|
+
mcpServersKey: 'mcp_servers',
|
|
113
|
+
entryValue: ENTRY,
|
|
114
|
+
backupDir,
|
|
115
|
+
force: true,
|
|
116
|
+
});
|
|
117
|
+
expect(result.status).toBe('updated');
|
|
118
|
+
expect(result.backupPath).not.toBeNull();
|
|
119
|
+
expect(existsSync(result.backupPath)).toBe(true);
|
|
120
|
+
expect(readFileSync(result.backupPath, 'utf-8')).toContain('some-other-tool');
|
|
121
|
+
});
|
|
122
|
+
it('recognizes a prior skillsmith-owned entry (by structural fingerprint) and updates without --force', () => {
|
|
123
|
+
writeFileSync(configPath, 'mcp_servers:\n skillsmith:\n command: node\n args:\n - old/path/@skillsmith/mcp-server\n');
|
|
124
|
+
const result = mergeYamlMcpEntry({
|
|
125
|
+
path: configPath,
|
|
126
|
+
mcpServersKey: 'mcp_servers',
|
|
127
|
+
entryValue: ENTRY,
|
|
128
|
+
backupDir,
|
|
129
|
+
});
|
|
130
|
+
expect(result.status).toBe('updated');
|
|
131
|
+
});
|
|
132
|
+
it('never backs up twice for the same path in one run (alreadyBackedUpPaths)', () => {
|
|
133
|
+
writeFileSync(configPath, 'mcp_servers:\n skillsmith:\n command: node\n args: ["@skillsmith/mcp-server"]\n');
|
|
134
|
+
const alreadyBackedUpPaths = new Set();
|
|
135
|
+
const first = mergeYamlMcpEntry({
|
|
136
|
+
path: configPath,
|
|
137
|
+
mcpServersKey: 'mcp_servers',
|
|
138
|
+
entryValue: ENTRY,
|
|
139
|
+
backupDir,
|
|
140
|
+
alreadyBackedUpPaths,
|
|
141
|
+
});
|
|
142
|
+
expect(first.backupPath).not.toBeNull();
|
|
143
|
+
// Merge into a DIFFERENT key path in the same file — simulates a second
|
|
144
|
+
// merge call touching the same shared config file within one install run.
|
|
145
|
+
const second = mergeYamlMcpEntry({
|
|
146
|
+
path: configPath,
|
|
147
|
+
mcpServersKey: 'other_servers',
|
|
148
|
+
entryValue: ENTRY,
|
|
149
|
+
backupDir,
|
|
150
|
+
alreadyBackedUpPaths,
|
|
151
|
+
});
|
|
152
|
+
expect(second.backupPath).toBeNull();
|
|
153
|
+
expect(existsSync(backupDir)).toBe(true);
|
|
154
|
+
});
|
|
155
|
+
it('returns an error status (never throws) for malformed YAML', () => {
|
|
156
|
+
writeFileSync(configPath, ': not: valid: yaml: [');
|
|
157
|
+
const result = mergeYamlMcpEntry({
|
|
158
|
+
path: configPath,
|
|
159
|
+
mcpServersKey: 'mcp_servers',
|
|
160
|
+
entryValue: ENTRY,
|
|
161
|
+
backupDir,
|
|
162
|
+
});
|
|
163
|
+
expect(result.status).toBe('error');
|
|
164
|
+
expect(result.errorMessage).toBeTruthy();
|
|
165
|
+
});
|
|
166
|
+
it('returns an error status for a non-mapping YAML root (a list)', () => {
|
|
167
|
+
writeFileSync(configPath, '- one\n- two\n');
|
|
168
|
+
const result = mergeYamlMcpEntry({
|
|
169
|
+
path: configPath,
|
|
170
|
+
mcpServersKey: 'mcp_servers',
|
|
171
|
+
entryValue: ENTRY,
|
|
172
|
+
backupDir,
|
|
173
|
+
});
|
|
174
|
+
expect(result.status).toBe('error');
|
|
175
|
+
});
|
|
176
|
+
it('treats a YAML-null root (~) as an empty mapping, matching the "missing file" behavior', () => {
|
|
177
|
+
writeFileSync(configPath, '~\n');
|
|
178
|
+
const result = mergeYamlMcpEntry({
|
|
179
|
+
path: configPath,
|
|
180
|
+
mcpServersKey: 'mcp_servers',
|
|
181
|
+
entryValue: ENTRY,
|
|
182
|
+
backupDir,
|
|
183
|
+
});
|
|
184
|
+
expect(result.status).toBe('created');
|
|
185
|
+
expect(readFileSync(configPath, 'utf-8')).toContain('skillsmith:');
|
|
186
|
+
});
|
|
187
|
+
it('treats an empty file the same as a missing one', () => {
|
|
188
|
+
writeFileSync(configPath, '');
|
|
189
|
+
const result = mergeYamlMcpEntry({
|
|
190
|
+
path: configPath,
|
|
191
|
+
mcpServersKey: 'mcp_servers',
|
|
192
|
+
entryValue: ENTRY,
|
|
193
|
+
backupDir,
|
|
194
|
+
});
|
|
195
|
+
expect(result.status).toBe('created');
|
|
196
|
+
});
|
|
197
|
+
it('creates the parent directory when it does not exist', () => {
|
|
198
|
+
const nestedPath = join(dir, 'nested', 'dir', 'config.yaml');
|
|
199
|
+
mkdirSync(join(dir, 'nested'), { recursive: false });
|
|
200
|
+
const result = mergeYamlMcpEntry({
|
|
201
|
+
path: nestedPath,
|
|
202
|
+
mcpServersKey: 'mcp_servers',
|
|
203
|
+
entryValue: ENTRY,
|
|
204
|
+
backupDir,
|
|
205
|
+
});
|
|
206
|
+
expect(result.status).toBe('created');
|
|
207
|
+
expect(existsSync(nestedPath)).toBe(true);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
//# sourceMappingURL=agent-config-merge.yaml.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-config-merge.yaml.test.js","sourceRoot":"","sources":["../../../src/install/agent-config-merge.yaml.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-harness on-disk targets for the `sklx agent install` / `uninstall`
|
|
3
|
+
* commands (SMI-5456 Wave 1 Step 5).
|
|
4
|
+
*
|
|
5
|
+
* This module is pure data (no filesystem access) — it says WHERE each
|
|
6
|
+
* harness's MCP config and hook config live and in what format, so
|
|
7
|
+
* `agent-config-merge*.ts` can merge into them generically and
|
|
8
|
+
* `agent-pack-installer.ts` doesn't hard-code per-harness path logic inline.
|
|
9
|
+
*
|
|
10
|
+
* Confidence levels (documented per plan's own Validation Ladder philosophy —
|
|
11
|
+
* Level 2a/3 in docs/internal/implementation/smi-5456-skillsmith-agent-wave1.md
|
|
12
|
+
* is explicitly where per-harness wire formats get confirmed against real
|
|
13
|
+
* harness binaries; Step-6 eval-worker web-verification 2026-07-01 upgraded
|
|
14
|
+
* three rows from the original Step-5 estimates):
|
|
15
|
+
* - claude-code, cursor, windsurf: HIGH — MCP config path/shape verified
|
|
16
|
+
* against `packages/cli/src/templates/mcp-server.template.snippets.ts`
|
|
17
|
+
* (SMI-4580, already shipped and used in docs/website).
|
|
18
|
+
* - hermes: HIGH for the skill path + YAML config shape (spike report §(b),
|
|
19
|
+
* 3 independent official doc pages agree); hooks are spike-verified
|
|
20
|
+
* ABSENT (no SessionStart equivalent) — {@link AGENT_HOOK_TARGETS}
|
|
21
|
+
* therefore carries no hook target for hermes.
|
|
22
|
+
* - codex: HIGH for the config file path (`~/.codex/config.toml`, same
|
|
23
|
+
* snippet table) AND — per Step-6 verification of
|
|
24
|
+
* developers.openai.com/codex/hooks — HIGH for the hook-registration
|
|
25
|
+
* shape: inline `[[hooks.SessionStart]]` / `[[hooks.SessionStart.hooks]]`
|
|
26
|
+
* array-of-tables carrying `{type, command, timeout, statusMessage}`.
|
|
27
|
+
* Codex has NO SessionEnd event, and its Stop event fires PER-TURN (not
|
|
28
|
+
* per-session) — see `installCodexHooks` in
|
|
29
|
+
* `agent-pack-installer.harness.ts` for why nothing is wired for cleanup.
|
|
30
|
+
* - copilot: HIGH — `~/.copilot/mcp-config.json`, top-level `mcpServers`
|
|
31
|
+
* key (Step-6 verified; the earlier `mcp.json` guess was wrong). Global,
|
|
32
|
+
* not VS Code's workspace `.vscode/mcp.json`, remains correct: Copilot
|
|
33
|
+
* CLI removed `.vscode/mcp.json` support, and `sklx agent install` is a
|
|
34
|
+
* global (not per-project) command.
|
|
35
|
+
* - opencode: HIGH — `~/.config/opencode/opencode.json` under the `mcp`
|
|
36
|
+
* key, entries typed `local|remote` (Step-6 verified against
|
|
37
|
+
* opencode.ai/docs; entry VALUE shape differs from the mcpServers
|
|
38
|
+
* convention — see `buildOpenCodeMcpEntryValue` in
|
|
39
|
+
* `agent-pack-installer.entry.ts`). Agent markdown lives at
|
|
40
|
+
* `~/.config/opencode/agents/` — plural (opencode.ai/docs/agents/; the
|
|
41
|
+
* earlier singular `agent/` guess was wrong).
|
|
42
|
+
*/
|
|
43
|
+
import type { HarnessId } from '../services/agent-pack/index.js';
|
|
44
|
+
/** Harnesses that can receive an MCP server registration (all 7 targets). */
|
|
45
|
+
export type McpHarnessId = HarnessId | 'windsurf' | 'hermes';
|
|
46
|
+
/** Config-file format the merge helper must speak for a given target. */
|
|
47
|
+
export type ConfigFormat = 'json' | 'yaml' | 'toml-block';
|
|
48
|
+
/**
|
|
49
|
+
* Where + how to merge the Skillsmith MCP server registration for one harness.
|
|
50
|
+
*
|
|
51
|
+
* `keyPath` is only meaningful for `format: 'json'` — the property path (from
|
|
52
|
+
* the parsed document root) to the object the merge helper inserts
|
|
53
|
+
* `skillsmith: {...}` into, creating intermediate objects as needed.
|
|
54
|
+
* `format: 'toml-block'` targets ignore `keyPath` — see
|
|
55
|
+
* `agent-config-merge.toml-block.ts` for the marker-delimited scheme.
|
|
56
|
+
*/
|
|
57
|
+
export interface McpConfigTarget {
|
|
58
|
+
harness: McpHarnessId;
|
|
59
|
+
path: string;
|
|
60
|
+
format: ConfigFormat;
|
|
61
|
+
keyPath: string[];
|
|
62
|
+
}
|
|
63
|
+
/** Where to write a named-agent shim file for a harness that has one. */
|
|
64
|
+
export interface ShimTarget {
|
|
65
|
+
harness: HarnessId;
|
|
66
|
+
/** Absolute file path the rendered shim content is written to verbatim. */
|
|
67
|
+
path: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Where to install a hook SCRIPT and how to wire it into that harness's hook
|
|
71
|
+
* config. `configFormat`/`configPath`/`keyPath` follow the same shape as
|
|
72
|
+
* {@link McpConfigTarget} so hook wiring reuses the same merge helpers.
|
|
73
|
+
*/
|
|
74
|
+
export interface HookInstallTarget {
|
|
75
|
+
harness: 'claude-code' | 'cursor' | 'codex';
|
|
76
|
+
/** Directory the hook script itself is copied into (chmod 0755). */
|
|
77
|
+
scriptDir: string;
|
|
78
|
+
configPath: string;
|
|
79
|
+
configFormat: ConfigFormat;
|
|
80
|
+
/** Key path to the array this hook's command entry is appended to. */
|
|
81
|
+
sessionStartKeyPath: string[];
|
|
82
|
+
sessionEndKeyPath: string[];
|
|
83
|
+
}
|
|
84
|
+
/** MCP registration targets for every harness the pack supports (PRD §3.1). */
|
|
85
|
+
export declare const AGENT_MCP_TARGETS: Readonly<Record<McpHarnessId, McpConfigTarget>>;
|
|
86
|
+
/**
|
|
87
|
+
* Named-agent shim file targets, per {@link HarnessId} (PRD §3.1 constraint
|
|
88
|
+
* 2 / architecture doc artifacts A2-A5). Cursor and (VS Code's) Copilot both
|
|
89
|
+
* read `.claude/agents/*.md` natively per the constraint matrix, so they
|
|
90
|
+
* share the claude-code shim file rather than getting a second copy — only
|
|
91
|
+
* harnesses with their OWN native shim format get a dedicated target here.
|
|
92
|
+
*/
|
|
93
|
+
export declare const AGENT_SHIM_TARGETS: Readonly<Record<HarnessId, ShimTarget | null>>;
|
|
94
|
+
/** Hook install targets — only harnesses with a real SessionStart hook (HOOK_HARNESSES). */
|
|
95
|
+
export declare const AGENT_HOOK_TARGETS: Readonly<Record<'claude-code' | 'cursor' | 'codex', HookInstallTarget>>;
|
|
96
|
+
/** Codex's `[agents.skillsmith-agent]` TOML entry lives in the same config file as its MCP registration. */
|
|
97
|
+
export declare const CODEX_CONFIG_TOML_PATH: string;
|
|
98
|
+
//# sourceMappingURL=agent-harness-targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-harness-targets.d.ts","sourceRoot":"","sources":["../../../src/install/agent-harness-targets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAA;AAE5D,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,CAAA;AAEzD;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,YAAY,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,SAAS,CAAA;IAClB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC3C,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,YAAY,CAAA;IAC1B,sEAAsE;IACtE,mBAAmB,EAAE,MAAM,EAAE,CAAA;IAC7B,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC5B;AAID,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CA2C7E,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,CAqB7E,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CACvC,MAAM,CAAC,aAAa,GAAG,QAAQ,GAAG,OAAO,EAAE,iBAAiB,CAAC,CA+B9D,CAAA;AAED,4GAA4G;AAC5G,eAAO,MAAM,sBAAsB,QAA+B,CAAA"}
|