@skillsmith/core 0.8.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +6 -0
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/client.test.d.ts +9 -0
- package/dist/src/api/client.test.d.ts.map +1 -0
- package/dist/src/api/client.test.js +81 -0
- package/dist/src/api/client.test.js.map +1 -0
- package/dist/src/config/device-identity.d.ts +113 -0
- package/dist/src/config/device-identity.d.ts.map +1 -0
- package/dist/src/config/device-identity.js +171 -0
- package/dist/src/config/device-identity.js.map +1 -0
- package/dist/src/config/device-identity.test.d.ts +10 -0
- package/dist/src/config/device-identity.test.d.ts.map +1 -0
- package/dist/src/config/device-identity.test.js +213 -0
- package/dist/src/config/device-identity.test.js.map +1 -0
- package/dist/src/config/index.d.ts +9 -0
- package/dist/src/config/index.d.ts.map +1 -1
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/exports/services.d.ts +3 -1
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +11 -1
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/install/agent-config-merge.json-array.d.ts +29 -0
- package/dist/src/install/agent-config-merge.json-array.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.json-array.js +100 -0
- package/dist/src/install/agent-config-merge.json-array.js.map +1 -0
- package/dist/src/install/agent-config-merge.json.d.ts +37 -0
- package/dist/src/install/agent-config-merge.json.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.json.js +134 -0
- package/dist/src/install/agent-config-merge.json.js.map +1 -0
- package/dist/src/install/agent-config-merge.toml-block.d.ts +48 -0
- package/dist/src/install/agent-config-merge.toml-block.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.toml-block.js +107 -0
- package/dist/src/install/agent-config-merge.toml-block.js.map +1 -0
- package/dist/src/install/agent-config-merge.types.d.ts +87 -0
- package/dist/src/install/agent-config-merge.types.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.types.js +83 -0
- package/dist/src/install/agent-config-merge.types.js.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.d.ts +46 -0
- package/dist/src/install/agent-config-merge.yaml.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.js +133 -0
- package/dist/src/install/agent-config-merge.yaml.js.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.test.d.ts +2 -0
- package/dist/src/install/agent-config-merge.yaml.test.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.test.js +210 -0
- package/dist/src/install/agent-config-merge.yaml.test.js.map +1 -0
- package/dist/src/install/agent-harness-targets.d.ts +98 -0
- package/dist/src/install/agent-harness-targets.d.ts.map +1 -0
- package/dist/src/install/agent-harness-targets.js +154 -0
- package/dist/src/install/agent-harness-targets.js.map +1 -0
- package/dist/src/install/agent-home-relocate.d.ts +29 -0
- package/dist/src/install/agent-home-relocate.d.ts.map +1 -0
- package/dist/src/install/agent-home-relocate.js +38 -0
- package/dist/src/install/agent-home-relocate.js.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.d.ts +55 -0
- package/dist/src/install/agent-manifest-path-guard.d.ts.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.js +109 -0
- package/dist/src/install/agent-manifest-path-guard.js.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.test.d.ts +2 -0
- package/dist/src/install/agent-manifest-path-guard.test.d.ts.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.test.js +72 -0
- package/dist/src/install/agent-manifest-path-guard.test.js.map +1 -0
- package/dist/src/install/agent-manifest.d.ts +58 -0
- package/dist/src/install/agent-manifest.d.ts.map +1 -0
- package/dist/src/install/agent-manifest.js +103 -0
- package/dist/src/install/agent-manifest.js.map +1 -0
- package/dist/src/install/agent-pack-installer.d.ts +39 -0
- package/dist/src/install/agent-pack-installer.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.entry.d.ts +55 -0
- package/dist/src/install/agent-pack-installer.entry.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.entry.js +90 -0
- package/dist/src/install/agent-pack-installer.entry.js.map +1 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.d.ts +33 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.js +59 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.js.map +1 -0
- package/dist/src/install/agent-pack-installer.harness.d.ts +66 -0
- package/dist/src/install/agent-pack-installer.harness.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.harness.js +310 -0
- package/dist/src/install/agent-pack-installer.harness.js.map +1 -0
- package/dist/src/install/agent-pack-installer.js +221 -0
- package/dist/src/install/agent-pack-installer.js.map +1 -0
- package/dist/src/install/agent-pack-installer.preserve.test.d.ts +11 -0
- package/dist/src/install/agent-pack-installer.preserve.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.preserve.test.js +72 -0
- package/dist/src/install/agent-pack-installer.preserve.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.test.d.ts +2 -0
- package/dist/src/install/agent-pack-installer.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.test.js +350 -0
- package/dist/src/install/agent-pack-installer.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.types.d.ts +51 -0
- package/dist/src/install/agent-pack-installer.types.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.types.js +16 -0
- package/dist/src/install/agent-pack-installer.types.js.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.d.ts +43 -0
- package/dist/src/install/agent-pack-uninstaller.d.ts.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.js +113 -0
- package/dist/src/install/agent-pack-uninstaller.js.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.test.d.ts +2 -0
- package/dist/src/install/agent-pack-uninstaller.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.test.js +212 -0
- package/dist/src/install/agent-pack-uninstaller.test.js.map +1 -0
- package/dist/src/install/index.d.ts +8 -1
- package/dist/src/install/index.d.ts.map +1 -1
- package/dist/src/install/index.js +8 -1
- package/dist/src/install/index.js.map +1 -1
- package/dist/src/install/paths.d.ts +17 -1
- package/dist/src/install/paths.d.ts.map +1 -1
- package/dist/src/install/paths.js +26 -0
- package/dist/src/install/paths.js.map +1 -1
- package/dist/src/install/paths.test.d.ts +2 -0
- package/dist/src/install/paths.test.d.ts.map +1 -0
- package/dist/src/install/paths.test.js +76 -0
- package/dist/src/install/paths.test.js.map +1 -0
- package/dist/src/journal/hash.d.ts +13 -0
- package/dist/src/journal/hash.d.ts.map +1 -0
- package/dist/src/journal/hash.js +16 -0
- package/dist/src/journal/hash.js.map +1 -0
- package/dist/src/journal/index.d.ts +15 -0
- package/dist/src/journal/index.d.ts.map +1 -0
- package/dist/src/journal/index.js +15 -0
- package/dist/src/journal/index.js.map +1 -0
- package/dist/src/journal/journal.test.d.ts +16 -0
- package/dist/src/journal/journal.test.d.ts.map +1 -0
- package/dist/src/journal/journal.test.js +171 -0
- package/dist/src/journal/journal.test.js.map +1 -0
- package/dist/src/journal/path.d.ts +44 -0
- package/dist/src/journal/path.d.ts.map +1 -0
- package/dist/src/journal/path.js +61 -0
- package/dist/src/journal/path.js.map +1 -0
- package/dist/src/journal/reader.d.ts +38 -0
- package/dist/src/journal/reader.d.ts.map +1 -0
- package/dist/src/journal/reader.js +93 -0
- package/dist/src/journal/reader.js.map +1 -0
- package/dist/src/journal/types.d.ts +87 -0
- package/dist/src/journal/types.d.ts.map +1 -0
- package/dist/src/journal/types.js +21 -0
- package/dist/src/journal/types.js.map +1 -0
- package/dist/src/journal/writer.d.ts +52 -0
- package/dist/src/journal/writer.d.ts.map +1 -0
- package/dist/src/journal/writer.js +125 -0
- package/dist/src/journal/writer.js.map +1 -0
- package/dist/src/paywall-triggers/index.d.ts +13 -0
- package/dist/src/paywall-triggers/index.d.ts.map +1 -0
- package/dist/src/paywall-triggers/index.js +13 -0
- package/dist/src/paywall-triggers/index.js.map +1 -0
- package/dist/src/paywall-triggers/path.d.ts +47 -0
- package/dist/src/paywall-triggers/path.d.ts.map +1 -0
- package/dist/src/paywall-triggers/path.js +73 -0
- package/dist/src/paywall-triggers/path.js.map +1 -0
- package/dist/src/paywall-triggers/store.d.ts +75 -0
- package/dist/src/paywall-triggers/store.d.ts.map +1 -0
- package/dist/src/paywall-triggers/store.js +122 -0
- package/dist/src/paywall-triggers/store.js.map +1 -0
- package/dist/src/paywall-triggers/store.test.d.ts +2 -0
- package/dist/src/paywall-triggers/store.test.d.ts.map +1 -0
- package/dist/src/paywall-triggers/store.test.js +121 -0
- package/dist/src/paywall-triggers/store.test.js.map +1 -0
- package/dist/src/paywall-triggers/types.d.ts +24 -0
- package/dist/src/paywall-triggers/types.d.ts.map +1 -0
- package/dist/src/paywall-triggers/types.js +13 -0
- package/dist/src/paywall-triggers/types.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.compound.d.ts +13 -0
- package/dist/src/security/scanner/SecurityScanner.compound.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.compound.js +127 -0
- package/dist/src/security/scanner/SecurityScanner.compound.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +10 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts +23 -0
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.pii.js +152 -0
- package/dist/src/security/scanner/SecurityScanner.pii.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts +5 -2
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.scanners.js +63 -70
- package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +2 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +79 -11
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +2 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/services/agent-pack/agent-pack.test.d.ts +18 -0
- package/dist/src/services/agent-pack/agent-pack.test.d.ts.map +1 -0
- package/dist/src/services/agent-pack/agent-pack.test.js +344 -0
- package/dist/src/services/agent-pack/agent-pack.test.js.map +1 -0
- package/dist/src/services/agent-pack/hooks.d.ts +29 -0
- package/dist/src/services/agent-pack/hooks.d.ts.map +1 -0
- package/dist/src/services/agent-pack/hooks.js +139 -0
- package/dist/src/services/agent-pack/hooks.js.map +1 -0
- package/dist/src/services/agent-pack/index.d.ts +26 -0
- package/dist/src/services/agent-pack/index.d.ts.map +1 -0
- package/dist/src/services/agent-pack/index.js +109 -0
- package/dist/src/services/agent-pack/index.js.map +1 -0
- package/dist/src/services/agent-pack/prompt-source.d.ts +47 -0
- package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -0
- package/dist/src/services/agent-pack/prompt-source.js +182 -0
- package/dist/src/services/agent-pack/prompt-source.js.map +1 -0
- package/dist/src/services/agent-pack/shims.d.ts +40 -0
- package/dist/src/services/agent-pack/shims.d.ts.map +1 -0
- package/dist/src/services/agent-pack/shims.js +96 -0
- package/dist/src/services/agent-pack/shims.js.map +1 -0
- package/dist/src/services/agent-pack/skill-md.d.ts +35 -0
- package/dist/src/services/agent-pack/skill-md.d.ts.map +1 -0
- package/dist/src/services/agent-pack/skill-md.js +89 -0
- package/dist/src/services/agent-pack/skill-md.js.map +1 -0
- package/dist/src/services/agent-pack/types.d.ts +118 -0
- package/dist/src/services/agent-pack/types.d.ts.map +1 -0
- package/dist/src/services/agent-pack/types.js +61 -0
- package/dist/src/services/agent-pack/types.js.map +1 -0
- package/dist/src/services/agent-tool-profile.d.ts +59 -0
- package/dist/src/services/agent-tool-profile.d.ts.map +1 -0
- package/dist/src/services/agent-tool-profile.js +76 -0
- package/dist/src/services/agent-tool-profile.js.map +1 -0
- package/dist/src/services/agent-tool-profile.test.d.ts +2 -0
- package/dist/src/services/agent-tool-profile.test.d.ts.map +1 -0
- package/dist/src/services/agent-tool-profile.test.js +28 -0
- package/dist/src/services/agent-tool-profile.test.js.map +1 -0
- package/dist/src/services/bundled-sibling-scan.d.ts +111 -0
- package/dist/src/services/bundled-sibling-scan.d.ts.map +1 -0
- package/dist/src/services/bundled-sibling-scan.js +170 -0
- package/dist/src/services/bundled-sibling-scan.js.map +1 -0
- package/dist/src/services/skill-installation.io.d.ts +16 -5
- package/dist/src/services/skill-installation.io.d.ts.map +1 -1
- package/dist/src/services/skill-installation.io.js +44 -20
- package/dist/src/services/skill-installation.io.js.map +1 -1
- package/dist/src/services/skill-installation.policy.d.ts +96 -0
- package/dist/src/services/skill-installation.policy.d.ts.map +1 -0
- package/dist/src/services/skill-installation.policy.js +144 -0
- package/dist/src/services/skill-installation.policy.js.map +1 -0
- package/dist/src/services/skill-installation.service.d.ts.map +1 -1
- package/dist/src/services/skill-installation.service.js +9 -3
- package/dist/src/services/skill-installation.service.js.map +1 -1
- package/dist/src/sources/index.d.ts +1 -0
- package/dist/src/sources/index.d.ts.map +1 -1
- package/dist/src/sources/index.js +4 -0
- package/dist/src/sources/index.js.map +1 -1
- package/dist/src/sync/index.d.ts +6 -0
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +8 -0
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/inventory-builder.d.ts +21 -0
- package/dist/src/sync/inventory-builder.d.ts.map +1 -0
- package/dist/src/sync/inventory-builder.js +26 -0
- package/dist/src/sync/inventory-builder.js.map +1 -0
- package/dist/src/sync/inventory-client.d.ts +80 -0
- package/dist/src/sync/inventory-client.d.ts.map +1 -0
- package/dist/src/sync/inventory-client.js +204 -0
- package/dist/src/sync/inventory-client.js.map +1 -0
- package/dist/src/sync/inventory-client.test.d.ts +14 -0
- package/dist/src/sync/inventory-client.test.d.ts.map +1 -0
- package/dist/src/sync/inventory-client.test.js +212 -0
- package/dist/src/sync/inventory-client.test.js.map +1 -0
- package/dist/src/sync/inventory-collector.d.ts +35 -0
- package/dist/src/sync/inventory-collector.d.ts.map +1 -0
- package/dist/src/sync/inventory-collector.js +176 -0
- package/dist/src/sync/inventory-collector.js.map +1 -0
- package/dist/src/sync/inventory-collector.test.d.ts +14 -0
- package/dist/src/sync/inventory-collector.test.d.ts.map +1 -0
- package/dist/src/sync/inventory-collector.test.js +156 -0
- package/dist/src/sync/inventory-collector.test.js.map +1 -0
- package/dist/src/sync/inventory-device.d.ts +36 -0
- package/dist/src/sync/inventory-device.d.ts.map +1 -0
- package/dist/src/sync/inventory-device.js +58 -0
- package/dist/src/sync/inventory-device.js.map +1 -0
- package/dist/src/sync/inventory-push.d.ts +45 -0
- package/dist/src/sync/inventory-push.d.ts.map +1 -0
- package/dist/src/sync/inventory-push.js +62 -0
- package/dist/src/sync/inventory-push.js.map +1 -0
- package/dist/src/sync/inventory-push.test.d.ts +16 -0
- package/dist/src/sync/inventory-push.test.d.ts.map +1 -0
- package/dist/src/sync/inventory-push.test.js +104 -0
- package/dist/src/sync/inventory-push.test.js.map +1 -0
- package/dist/src/sync/inventory-types.d.ts +110 -0
- package/dist/src/sync/inventory-types.d.ts.map +1 -0
- package/dist/src/sync/inventory-types.js +45 -0
- package/dist/src/sync/inventory-types.js.map +1 -0
- package/dist/src/telemetry/agent-marker.d.ts +137 -0
- package/dist/src/telemetry/agent-marker.d.ts.map +1 -0
- package/dist/src/telemetry/agent-marker.js +242 -0
- package/dist/src/telemetry/agent-marker.js.map +1 -0
- package/dist/src/telemetry/agent-marker.test.d.ts +13 -0
- package/dist/src/telemetry/agent-marker.test.d.ts.map +1 -0
- package/dist/src/telemetry/agent-marker.test.js +202 -0
- package/dist/src/telemetry/agent-marker.test.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +6 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +10 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +5 -1
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/wrap.d.ts +28 -7
- package/dist/src/telemetry/wrap.d.ts.map +1 -1
- package/dist/src/telemetry/wrap.gate.test.d.ts +22 -0
- package/dist/src/telemetry/wrap.gate.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.gate.test.js +197 -0
- package/dist/src/telemetry/wrap.gate.test.js.map +1 -0
- package/dist/src/telemetry/wrap.js +111 -26
- package/dist/src/telemetry/wrap.js.map +1 -1
- package/dist/src/telemetry/wrap.marker.test.d.ts +16 -0
- package/dist/src/telemetry/wrap.marker.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.marker.test.js +185 -0
- package/dist/src/telemetry/wrap.marker.test.js.map +1 -0
- package/dist/src/telemetry/wrap.test.js +4 -0
- package/dist/src/telemetry/wrap.test.js.map +1 -1
- package/dist/tests/SecurityScanner.exec.test.js +60 -0
- package/dist/tests/SecurityScanner.exec.test.js.map +1 -1
- package/dist/tests/security/ContinuousSecurity.test.js +10 -4
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts +2 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts.map +1 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.js +126 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.js.map +1 -0
- package/dist/tests/security/chmod-compound.test.d.ts +2 -0
- package/dist/tests/security/chmod-compound.test.d.ts.map +1 -0
- package/dist/tests/security/chmod-compound.test.js +188 -0
- package/dist/tests/security/chmod-compound.test.js.map +1 -0
- package/dist/tests/security/pii-detection.test.js +131 -0
- package/dist/tests/security/pii-detection.test.js.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.d.ts +23 -7
- package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.js +27 -11
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/dist/tests/security/sensitive-path-fp.test.d.ts +2 -0
- package/dist/tests/security/sensitive-path-fp.test.d.ts.map +1 -0
- package/dist/tests/security/sensitive-path-fp.test.js +142 -0
- package/dist/tests/security/sensitive-path-fp.test.js.map +1 -0
- package/dist/tests/services/bundled-sibling-scan.test.d.ts +2 -0
- package/dist/tests/services/bundled-sibling-scan.test.d.ts.map +1 -0
- package/dist/tests/services/bundled-sibling-scan.test.js +139 -0
- package/dist/tests/services/bundled-sibling-scan.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.test.js +166 -0
- package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -1
- package/dist/tests/unit/services/skill-installation.policy.test.d.ts +8 -0
- package/dist/tests/unit/services/skill-installation.policy.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.policy.test.js +151 -0
- package/dist/tests/unit/services/skill-installation.policy.test.js.map +1 -0
- package/package.json +23 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-pack-uninstaller.test.d.ts","sourceRoot":"","sources":["../../../src/install/agent-pack-uninstaller.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tests for `uninstallAgentPack` (SMI-5456 Wave 1 Step 5) —
|
|
3
|
+
* split from `agent-pack-installer.test.ts` when the combined
|
|
4
|
+
* file crossed the 500-line gate. Same temp-HOME + manifest-dir
|
|
5
|
+
* isolation setup; covers the P-5 exact-reversal invariant plus
|
|
6
|
+
* the governance manifest-path-guard security tests.
|
|
7
|
+
* @module @skillsmith/core/install/agent-pack-uninstaller.test
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { tmpdir } from 'node:os';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
13
|
+
import { installAgentPack } from './agent-pack-installer.js';
|
|
14
|
+
import { uninstallAgentPack } from './agent-pack-uninstaller.js';
|
|
15
|
+
import { AGENT_INSTALL_DIR_ENV_VAR, getAgentManifestPath } from './agent-manifest.js';
|
|
16
|
+
import { CLIENT_NATIVE_PATHS } from './paths.js';
|
|
17
|
+
import { relocateUnderHome } from './agent-home-relocate.js';
|
|
18
|
+
let homeDir;
|
|
19
|
+
let manifestDir;
|
|
20
|
+
let prevInstallDirEnv;
|
|
21
|
+
function skillPath(client) {
|
|
22
|
+
return join(relocateUnderHome(CLIENT_NATIVE_PATHS[client], homeDir), 'skillsmith-agent', 'SKILL.md');
|
|
23
|
+
}
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
homeDir = mkdtempSync(join(tmpdir(), 'skillsmith-agent-uninstall-home-'));
|
|
26
|
+
manifestDir = mkdtempSync(join(tmpdir(), 'skillsmith-agent-uninstall-manifest-'));
|
|
27
|
+
prevInstallDirEnv = process.env[AGENT_INSTALL_DIR_ENV_VAR];
|
|
28
|
+
process.env[AGENT_INSTALL_DIR_ENV_VAR] = manifestDir;
|
|
29
|
+
});
|
|
30
|
+
afterEach(() => {
|
|
31
|
+
rmSync(homeDir, { recursive: true, force: true });
|
|
32
|
+
rmSync(manifestDir, { recursive: true, force: true });
|
|
33
|
+
if (prevInstallDirEnv !== undefined)
|
|
34
|
+
process.env[AGENT_INSTALL_DIR_ENV_VAR] = prevInstallDirEnv;
|
|
35
|
+
else
|
|
36
|
+
delete process.env[AGENT_INSTALL_DIR_ENV_VAR];
|
|
37
|
+
});
|
|
38
|
+
describe('uninstallAgentPack — exact reversal', () => {
|
|
39
|
+
it('removes everything install wrote and restores foreign entries it modified (not conflicted)', () => {
|
|
40
|
+
mkdirSync(join(homeDir, '.claude'), { recursive: true });
|
|
41
|
+
const settingsPath = join(homeDir, '.claude', 'settings.json');
|
|
42
|
+
writeFileSync(settingsPath, JSON.stringify({ someOtherKey: true }, null, 2));
|
|
43
|
+
installAgentPack({ homeDir });
|
|
44
|
+
expect(existsSync(skillPath('claude-code'))).toBe(true);
|
|
45
|
+
expect(existsSync(skillPath('agents'))).toBe(true);
|
|
46
|
+
expect(existsSync(join(homeDir, '.claude', 'agents', 'skillsmith-agent.md'))).toBe(true);
|
|
47
|
+
const result = uninstallAgentPack();
|
|
48
|
+
expect(existsSync(skillPath('claude-code'))).toBe(false);
|
|
49
|
+
expect(existsSync(skillPath('agents'))).toBe(false);
|
|
50
|
+
expect(existsSync(join(homeDir, '.claude', 'agents', 'skillsmith-agent.md'))).toBe(false);
|
|
51
|
+
// settings.json is restored to its pre-install content (someOtherKey
|
|
52
|
+
// survives, skillsmith/hooks keys are gone) rather than deleted, since
|
|
53
|
+
// it pre-existed with unrelated content. Asserting the FULL document
|
|
54
|
+
// (not just `mcpServers`) is the regression test for the "duplicate
|
|
55
|
+
// backups when hooks+MCP share a config file" bug the commit message
|
|
56
|
+
// claims fixed: a stray SECOND backup captured mid-install (after hooks
|
|
57
|
+
// were merged in but before MCP was) would restore a `hooks` key that
|
|
58
|
+
// never existed pre-install while still passing a narrower
|
|
59
|
+
// `mcpServers`-only assertion.
|
|
60
|
+
const doc = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
61
|
+
expect(doc).toEqual({ someOtherKey: true });
|
|
62
|
+
expect(doc.mcpServers).toBeUndefined();
|
|
63
|
+
expect(doc.hooks).toBeUndefined();
|
|
64
|
+
expect(result.restored).toContain(settingsPath);
|
|
65
|
+
expect(result.removed.length).toBeGreaterThan(0);
|
|
66
|
+
});
|
|
67
|
+
// Governance regression test (2026-07-01): a hand-tampered or corrupted
|
|
68
|
+
// manifest must never become an arbitrary-file-delete primitive. See
|
|
69
|
+
// `agent-manifest-path-guard.ts`.
|
|
70
|
+
it('refuses to delete or overwrite a manifest entry pointing outside any known installer target', () => {
|
|
71
|
+
installAgentPack({ homeDir });
|
|
72
|
+
// Simulate a tampered manifest: a "sensitive" file the installer never
|
|
73
|
+
// wrote, with a fabricated entry pointing `uninstallAgentPack` at it.
|
|
74
|
+
const sensitivePath = join(homeDir, 'not-an-installer-path.txt');
|
|
75
|
+
writeFileSync(sensitivePath, 'do not touch me');
|
|
76
|
+
const manifestPath = getAgentManifestPath();
|
|
77
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
78
|
+
manifest.entries.push({
|
|
79
|
+
path: sensitivePath,
|
|
80
|
+
kind: 'skill',
|
|
81
|
+
harness: null,
|
|
82
|
+
backupPath: null,
|
|
83
|
+
executable: false,
|
|
84
|
+
});
|
|
85
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
86
|
+
const result = uninstallAgentPack();
|
|
87
|
+
// The sensitive file survives untouched...
|
|
88
|
+
expect(existsSync(sensitivePath)).toBe(true);
|
|
89
|
+
expect(readFileSync(sensitivePath, 'utf-8')).toBe('do not touch me');
|
|
90
|
+
// ...and is reported as rejected, not silently dropped or counted as removed.
|
|
91
|
+
expect(result.rejected).toContain(sensitivePath);
|
|
92
|
+
expect(result.removed).not.toContain(sensitivePath);
|
|
93
|
+
});
|
|
94
|
+
it('refuses to restore from a backupPath outside the manifest backups directory', () => {
|
|
95
|
+
mkdirSync(join(homeDir, '.claude'), { recursive: true });
|
|
96
|
+
const settingsPath = join(homeDir, '.claude', 'settings.json');
|
|
97
|
+
writeFileSync(settingsPath, JSON.stringify({ realCurrentContent: true }));
|
|
98
|
+
// A forged "backup" living OUTSIDE the trusted backups directory, whose
|
|
99
|
+
// content an attacker fully controls.
|
|
100
|
+
const forgedBackupPath = join(homeDir, 'forged-backup.json');
|
|
101
|
+
writeFileSync(forgedBackupPath, JSON.stringify({ attackerControlled: true }));
|
|
102
|
+
const manifestPath = getAgentManifestPath();
|
|
103
|
+
writeFileSync(manifestPath, JSON.stringify({
|
|
104
|
+
schemaVersion: 1,
|
|
105
|
+
installedAt: new Date().toISOString(),
|
|
106
|
+
packSchemaVersion: 1,
|
|
107
|
+
entries: [
|
|
108
|
+
{
|
|
109
|
+
path: settingsPath,
|
|
110
|
+
kind: 'mcp-config',
|
|
111
|
+
harness: 'claude-code',
|
|
112
|
+
backupPath: forgedBackupPath,
|
|
113
|
+
executable: false,
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
}, null, 2));
|
|
117
|
+
const result = uninstallAgentPack();
|
|
118
|
+
// settingsPath must NOT be overwritten with the forged backup's content.
|
|
119
|
+
const doc = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
120
|
+
expect(doc).toEqual({ realCurrentContent: true });
|
|
121
|
+
expect(result.rejected).toContain(settingsPath);
|
|
122
|
+
expect(result.restored).not.toContain(settingsPath);
|
|
123
|
+
});
|
|
124
|
+
it('restores a pre-existing codex config.toml to its exact pre-install content (hook wiring included)', () => {
|
|
125
|
+
mkdirSync(join(homeDir, '.codex'), { recursive: true });
|
|
126
|
+
const configPath = join(homeDir, '.codex', 'config.toml');
|
|
127
|
+
const preInstall = '# my codex config\nmodel = "gpt-x"\n';
|
|
128
|
+
writeFileSync(configPath, preInstall);
|
|
129
|
+
installAgentPack({ homeDir });
|
|
130
|
+
// Sanity: install actually added all three of our blocks.
|
|
131
|
+
const installed = readFileSync(configPath, 'utf-8');
|
|
132
|
+
expect(installed).toContain('# >>> skillsmith:hooks.SessionStart >>>');
|
|
133
|
+
expect(installed).toContain('# >>> skillsmith:mcp_servers.skillsmith >>>');
|
|
134
|
+
const result = uninstallAgentPack();
|
|
135
|
+
// Exact pre-install content back — no residual marker blocks.
|
|
136
|
+
expect(readFileSync(configPath, 'utf-8')).toBe(preInstall);
|
|
137
|
+
expect(result.restored).toContain(configPath);
|
|
138
|
+
// Hook scripts (including the inert session-end.sh) are gone.
|
|
139
|
+
expect(existsSync(join(homeDir, '.codex', 'hooks', 'session-start.sh'))).toBe(false);
|
|
140
|
+
expect(existsSync(join(homeDir, '.codex', 'hooks', 'session-end.sh'))).toBe(false);
|
|
141
|
+
});
|
|
142
|
+
it('deletes a config file entirely when install created it fresh (no backup)', () => {
|
|
143
|
+
installAgentPack({ homeDir });
|
|
144
|
+
const settingsPath = join(homeDir, '.claude', 'settings.json');
|
|
145
|
+
expect(existsSync(settingsPath)).toBe(true);
|
|
146
|
+
uninstallAgentPack();
|
|
147
|
+
// settings.json was created fresh by install (no pre-existing content) —
|
|
148
|
+
// it is a "removed" (deleted) entry, not "restored".
|
|
149
|
+
expect(existsSync(settingsPath)).toBe(false);
|
|
150
|
+
});
|
|
151
|
+
it('is a no-op (not an error) for a manifest entry the user already deleted manually', () => {
|
|
152
|
+
installAgentPack({ homeDir });
|
|
153
|
+
rmSync(skillPath('claude-code'));
|
|
154
|
+
const result = uninstallAgentPack();
|
|
155
|
+
expect(result.alreadyGone).toContain(skillPath('claude-code'));
|
|
156
|
+
});
|
|
157
|
+
it('leaves foreign entries in OTHER, never-touched files untouched', () => {
|
|
158
|
+
mkdirSync(join(homeDir, '.gitconfig-like-dir'), { recursive: true });
|
|
159
|
+
const untouchedPath = join(homeDir, '.gitconfig-like-dir', 'config');
|
|
160
|
+
writeFileSync(untouchedPath, 'unrelated content\n');
|
|
161
|
+
installAgentPack({ homeDir });
|
|
162
|
+
uninstallAgentPack();
|
|
163
|
+
expect(readFileSync(untouchedPath, 'utf-8')).toBe('unrelated content\n');
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
// SMI-5456 adversarial-review regression: a RE-install (no intervening
|
|
167
|
+
// uninstall) takes no fresh backup for already-installed paths, so the fresh
|
|
168
|
+
// manifest recorded `backupPath: null` for the shared config files — silently
|
|
169
|
+
// dropping install #1's genuine pre-install backup reference. uninstall then
|
|
170
|
+
// treated the modified pre-existing file as "created fresh" and DELETED it.
|
|
171
|
+
// `carryForwardPriorBackups` in `agent-pack-installer.ts` fixes this; these
|
|
172
|
+
// tests lock it in. See that helper's doc comment.
|
|
173
|
+
describe('uninstallAgentPack — double-install reversal (pre-install backup not stranded)', () => {
|
|
174
|
+
it('restores a pre-existing claude-code settings.json after install → install → uninstall', () => {
|
|
175
|
+
mkdirSync(join(homeDir, '.claude'), { recursive: true });
|
|
176
|
+
const settingsPath = join(homeDir, '.claude', 'settings.json');
|
|
177
|
+
writeFileSync(settingsPath, JSON.stringify({ someOtherKey: true }, null, 2));
|
|
178
|
+
installAgentPack({ homeDir });
|
|
179
|
+
installAgentPack({ homeDir }); // re-install (byte-identical pack, no fresh backup taken)
|
|
180
|
+
const result = uninstallAgentPack();
|
|
181
|
+
// The user's pre-install settings.json must survive — restored to its
|
|
182
|
+
// exact pre-install content, NOT deleted.
|
|
183
|
+
expect(existsSync(settingsPath)).toBe(true);
|
|
184
|
+
const doc = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
185
|
+
expect(doc).toEqual({ someOtherKey: true });
|
|
186
|
+
expect(result.restored).toContain(settingsPath);
|
|
187
|
+
expect(result.removed).not.toContain(settingsPath);
|
|
188
|
+
});
|
|
189
|
+
it('restores a pre-existing codex config.toml after install → install → uninstall', () => {
|
|
190
|
+
mkdirSync(join(homeDir, '.codex'), { recursive: true });
|
|
191
|
+
const configPath = join(homeDir, '.codex', 'config.toml');
|
|
192
|
+
const preInstall = '# my codex config\nmodel = "gpt-x"\n';
|
|
193
|
+
writeFileSync(configPath, preInstall);
|
|
194
|
+
installAgentPack({ homeDir });
|
|
195
|
+
installAgentPack({ homeDir });
|
|
196
|
+
const result = uninstallAgentPack();
|
|
197
|
+
expect(existsSync(configPath)).toBe(true);
|
|
198
|
+
expect(readFileSync(configPath, 'utf-8')).toBe(preInstall);
|
|
199
|
+
expect(result.restored).toContain(configPath);
|
|
200
|
+
});
|
|
201
|
+
it('still DELETES a config file the installer created fresh, even after a re-install', () => {
|
|
202
|
+
// No pre-existing settings.json: install created it. A re-install must not
|
|
203
|
+
// spuriously invent a backup — uninstall still deletes it.
|
|
204
|
+
installAgentPack({ homeDir });
|
|
205
|
+
installAgentPack({ homeDir });
|
|
206
|
+
const settingsPath = join(homeDir, '.claude', 'settings.json');
|
|
207
|
+
expect(existsSync(settingsPath)).toBe(true);
|
|
208
|
+
uninstallAgentPack();
|
|
209
|
+
expect(existsSync(settingsPath)).toBe(false);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=agent-pack-uninstaller.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-pack-uninstaller.test.js","sourceRoot":"","sources":["../../../src/install/agent-pack-uninstaller.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,15 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module @skillsmith/core/install
|
|
11
11
|
*/
|
|
12
|
-
export { CANONICAL_CLIENT, CLIENT_IDS, CLIENT_NATIVE_PATHS, assertClientId, getCanonicalInstallPath, getInstallPath, resolveClientId, resolveClientPath, } from './paths.js';
|
|
12
|
+
export { CANONICAL_CLIENT, CLIENT_IDS, CLIENT_NATIVE_PATHS, assertClientId, enumerateHarnessPresence, getCanonicalInstallPath, getInstallPath, resolveClientId, resolveClientPath, } from './paths.js';
|
|
13
13
|
export type { ClientId } from './paths.js';
|
|
14
14
|
export { addLink, getDefaultFromClient, getLinkManifestPath, listLinks, loadManifest, removeLinks, saveManifest, } from './fan-out.js';
|
|
15
15
|
export type { AddLinkOptions, AddLinkResult, LinkKind, LinkManifest, LinkRecord, } from './fan-out.js';
|
|
16
|
+
export { installAgentPack, loadAgentManifest } from './agent-pack-installer.js';
|
|
17
|
+
export { uninstallAgentPack } from './agent-pack-uninstaller.js';
|
|
18
|
+
export { getAgentInstallBackupsDir, getAgentManifestPath, saveAgentManifest, AGENT_INSTALL_DIR_ENV_VAR, AGENT_MANIFEST_SCHEMA_VERSION, type AgentInstallManifest, type AgentManifestEntry, type AgentManifestEntryKind, } from './agent-manifest.js';
|
|
19
|
+
export { HARNESS_SUPPORT_TIER, type AgentInstallOptions, type AgentInstallResult, type AgentUninstallOptions, type AgentUninstallResult, type HarnessInstallReport, type SupportTier, } from './agent-pack-installer.types.js';
|
|
20
|
+
export { AGENT_MCP_TARGETS, AGENT_SHIM_TARGETS, AGENT_HOOK_TARGETS, CODEX_CONFIG_TOML_PATH, type McpHarnessId, type ConfigFormat, type McpConfigTarget, type ShimTarget, type HookInstallTarget, } from './agent-harness-targets.js';
|
|
21
|
+
export { type MergeResult, type MergeStatus } from './agent-config-merge.types.js';
|
|
22
|
+
export { isAllowedManifestEntryPath, isAllowedManifestBackupPath, } from './agent-manifest-path-guard.js';
|
|
16
23
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/install/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,cAAc,EACd,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,MAAM,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/install/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,cAAc,EACd,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,EAC7B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,WAAW,GACjB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,iBAAiB,GACvB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAClF,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,gCAAgC,CAAA"}
|
|
@@ -9,6 +9,13 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module @skillsmith/core/install
|
|
11
11
|
*/
|
|
12
|
-
export { CANONICAL_CLIENT, CLIENT_IDS, CLIENT_NATIVE_PATHS, assertClientId, getCanonicalInstallPath, getInstallPath, resolveClientId, resolveClientPath, } from './paths.js';
|
|
12
|
+
export { CANONICAL_CLIENT, CLIENT_IDS, CLIENT_NATIVE_PATHS, assertClientId, enumerateHarnessPresence, getCanonicalInstallPath, getInstallPath, resolveClientId, resolveClientPath, } from './paths.js';
|
|
13
13
|
export { addLink, getDefaultFromClient, getLinkManifestPath, listLinks, loadManifest, removeLinks, saveManifest, } from './fan-out.js';
|
|
14
|
+
// SMI-5456 Wave 1 Step 5: `sklx agent install` / `uninstall` core.
|
|
15
|
+
export { installAgentPack, loadAgentManifest } from './agent-pack-installer.js';
|
|
16
|
+
export { uninstallAgentPack } from './agent-pack-uninstaller.js';
|
|
17
|
+
export { getAgentInstallBackupsDir, getAgentManifestPath, saveAgentManifest, AGENT_INSTALL_DIR_ENV_VAR, AGENT_MANIFEST_SCHEMA_VERSION, } from './agent-manifest.js';
|
|
18
|
+
export { HARNESS_SUPPORT_TIER, } from './agent-pack-installer.types.js';
|
|
19
|
+
export { AGENT_MCP_TARGETS, AGENT_SHIM_TARGETS, AGENT_HOOK_TARGETS, CODEX_CONFIG_TOML_PATH, } from './agent-harness-targets.js';
|
|
20
|
+
export { isAllowedManifestEntryPath, isAllowedManifestBackupPath, } from './agent-manifest-path-guard.js';
|
|
14
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/install/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/install/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,cAAc,CAAA;AASrB,mEAAmE;AACnE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,GAI9B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,oBAAoB,GAOrB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,GAMvB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,gCAAgC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type ClientId = 'claude-code' | 'cursor' | 'copilot' | 'windsurf' | 'agents';
|
|
1
|
+
export type ClientId = 'claude-code' | 'cursor' | 'copilot' | 'windsurf' | 'agents' | 'opencode' | 'hermes';
|
|
2
2
|
export declare const CLIENT_NATIVE_PATHS: Record<ClientId, string>;
|
|
3
3
|
export declare const CANONICAL_CLIENT: ClientId;
|
|
4
4
|
export declare const CLIENT_IDS: ReadonlyArray<ClientId>;
|
|
@@ -13,4 +13,20 @@ export declare function resolveClientId(raw: string | undefined): ClientId;
|
|
|
13
13
|
* value — used by the MCP server to pick `~/.cursor/skills/` etc.
|
|
14
14
|
*/
|
|
15
15
|
export declare function resolveClientPath(override?: string | undefined): string;
|
|
16
|
+
/**
|
|
17
|
+
* Returns the filesystem presence status of every known harness.
|
|
18
|
+
*
|
|
19
|
+
* A harness is considered "present" when its skill directory exists on disk.
|
|
20
|
+
* This lets the cross-harness inventory (SMI-5390) report a harness as
|
|
21
|
+
* "installed but zero skills" rather than omitting it entirely.
|
|
22
|
+
*
|
|
23
|
+
* Synchronous and O(CLIENT_IDS.length) — safe to call on the startup path.
|
|
24
|
+
*
|
|
25
|
+
* @see SMI-5390
|
|
26
|
+
*/
|
|
27
|
+
export declare function enumerateHarnessPresence(): Array<{
|
|
28
|
+
harness: ClientId;
|
|
29
|
+
present: boolean;
|
|
30
|
+
path: string;
|
|
31
|
+
}>;
|
|
16
32
|
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/install/paths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/install/paths.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,QAAQ,GAChB,aAAa,GACb,QAAQ,GACR,SAAS,GACT,UAAU,GACV,QAAQ,GACR,UAAU,GACV,QAAQ,CAAA;AAEZ,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAQxD,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,QAAwB,CAAA;AAEvD,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,QAAQ,CAQ7C,CAAA;AAEF,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAgB,cAAc,CAAC,MAAM,GAAE,QAA2B,GAAG,MAAM,CAE1E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAOxE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAIjE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,IAAI,KAAK,CAAC;IAChD,OAAO,EAAE,QAAQ,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb,CAAC,CASD"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module @skillsmith/core/install/paths
|
|
10
10
|
*/
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
11
12
|
import { homedir } from 'node:os';
|
|
12
13
|
import { join } from 'node:path';
|
|
13
14
|
export const CLIENT_NATIVE_PATHS = {
|
|
@@ -16,6 +17,8 @@ export const CLIENT_NATIVE_PATHS = {
|
|
|
16
17
|
copilot: join(homedir(), '.copilot', 'skills'),
|
|
17
18
|
windsurf: join(homedir(), '.codeium', 'windsurf', 'skills'),
|
|
18
19
|
agents: join(homedir(), '.agents', 'skills'),
|
|
20
|
+
opencode: join(homedir(), '.config', 'opencode', 'skills'),
|
|
21
|
+
hermes: join(homedir(), '.hermes', 'skills'),
|
|
19
22
|
};
|
|
20
23
|
export const CANONICAL_CLIENT = 'claude-code';
|
|
21
24
|
export const CLIENT_IDS = Object.freeze([
|
|
@@ -24,6 +27,8 @@ export const CLIENT_IDS = Object.freeze([
|
|
|
24
27
|
'copilot',
|
|
25
28
|
'windsurf',
|
|
26
29
|
'agents',
|
|
30
|
+
'opencode',
|
|
31
|
+
'hermes',
|
|
27
32
|
]);
|
|
28
33
|
export function getCanonicalInstallPath() {
|
|
29
34
|
return CLIENT_NATIVE_PATHS[CANONICAL_CLIENT];
|
|
@@ -53,4 +58,25 @@ export function resolveClientPath(override) {
|
|
|
53
58
|
const raw = override !== undefined ? override : process.env['SKILLSMITH_CLIENT'];
|
|
54
59
|
return getInstallPath(resolveClientId(raw));
|
|
55
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns the filesystem presence status of every known harness.
|
|
63
|
+
*
|
|
64
|
+
* A harness is considered "present" when its skill directory exists on disk.
|
|
65
|
+
* This lets the cross-harness inventory (SMI-5390) report a harness as
|
|
66
|
+
* "installed but zero skills" rather than omitting it entirely.
|
|
67
|
+
*
|
|
68
|
+
* Synchronous and O(CLIENT_IDS.length) — safe to call on the startup path.
|
|
69
|
+
*
|
|
70
|
+
* @see SMI-5390
|
|
71
|
+
*/
|
|
72
|
+
export function enumerateHarnessPresence() {
|
|
73
|
+
return CLIENT_IDS.map((harness) => {
|
|
74
|
+
const harnessPath = CLIENT_NATIVE_PATHS[harness];
|
|
75
|
+
return {
|
|
76
|
+
harness,
|
|
77
|
+
present: existsSync(harnessPath),
|
|
78
|
+
path: harnessPath,
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
}
|
|
56
82
|
//# sourceMappingURL=paths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/install/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/install/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AA+BhC,MAAM,CAAC,MAAM,mBAAmB,GAA6B;IAC3D,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;IACnD,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;IAC5C,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC;IAC9C,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC;IAC3D,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;IAC5C,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC;IAC1D,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;CAC7C,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAa,aAAa,CAAA;AAEvD,MAAM,CAAC,MAAM,UAAU,GAA4B,MAAM,CAAC,MAAM,CAAC;IAC/D,aAAa;IACb,QAAQ;IACR,SAAS;IACT,UAAU;IACV,QAAQ;IACR,UAAU;IACV,QAAQ;CACT,CAAC,CAAA;AAEF,MAAM,UAAU,uBAAuB;IACrC,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAmB,gBAAgB;IAChE,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAiB,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CACb,mBAAmB,MAAM,CAAC,KAAK,CAAC,aAAa,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACpE,oGAAoG,CACvG,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,gBAAgB,CAAA;IAC5D,cAAc,CAAC,GAAG,CAAC,CAAA;IACnB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA6B;IAC7D,MAAM,GAAG,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IAChF,OAAO,cAAc,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB;IAKtC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAChC,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAChD,OAAO;YACL,OAAO;YACP,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC;YAChC,IAAI,EAAE,WAAW;SAClB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.test.d.ts","sourceRoot":"","sources":["../../../src/install/paths.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5390: Tests for `enumerateHarnessPresence`.
|
|
3
|
+
*
|
|
4
|
+
* `existsSync` is mocked via vi.mock('node:fs') so the tests never touch
|
|
5
|
+
* the real filesystem. The hoisted spy is shared between the mock factory
|
|
6
|
+
* and the test bodies via the vi.hoisted closure — same pattern as
|
|
7
|
+
* pythonIncremental.hardening.test.ts (SMI-4315/4316).
|
|
8
|
+
*/
|
|
9
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
10
|
+
// vi.hoisted runs before vi.mock factories so we can share the spy instance.
|
|
11
|
+
const { existsSyncSpy } = vi.hoisted(() => ({
|
|
12
|
+
existsSyncSpy: vi.fn(() => false),
|
|
13
|
+
}));
|
|
14
|
+
vi.mock('node:fs', async () => {
|
|
15
|
+
const actual = await vi.importActual('node:fs');
|
|
16
|
+
return { ...actual, existsSync: (p) => existsSyncSpy(p) };
|
|
17
|
+
});
|
|
18
|
+
import { CLIENT_IDS, CLIENT_NATIVE_PATHS, enumerateHarnessPresence } from './paths.js';
|
|
19
|
+
describe('enumerateHarnessPresence (SMI-5390)', () => {
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
existsSyncSpy.mockReset();
|
|
22
|
+
existsSyncSpy.mockReturnValue(false);
|
|
23
|
+
});
|
|
24
|
+
it('returns one entry for every ClientId in CLIENT_IDS', () => {
|
|
25
|
+
const result = enumerateHarnessPresence();
|
|
26
|
+
expect(result).toHaveLength(CLIENT_IDS.length);
|
|
27
|
+
const returnedHarnesses = result.map((r) => r.harness);
|
|
28
|
+
expect(returnedHarnesses).toEqual(expect.arrayContaining([...CLIENT_IDS]));
|
|
29
|
+
});
|
|
30
|
+
it('reports present: true for harnesses whose directory exists', () => {
|
|
31
|
+
// Make only claude-code and cursor appear on disk.
|
|
32
|
+
existsSyncSpy.mockImplementation((p) => p === CLIENT_NATIVE_PATHS['claude-code'] || p === CLIENT_NATIVE_PATHS['cursor']);
|
|
33
|
+
const result = enumerateHarnessPresence();
|
|
34
|
+
expect(result.find((r) => r.harness === 'claude-code')?.present).toBe(true);
|
|
35
|
+
expect(result.find((r) => r.harness === 'cursor')?.present).toBe(true);
|
|
36
|
+
expect(result.find((r) => r.harness === 'copilot')?.present).toBe(false);
|
|
37
|
+
expect(result.find((r) => r.harness === 'windsurf')?.present).toBe(false);
|
|
38
|
+
expect(result.find((r) => r.harness === 'agents')?.present).toBe(false);
|
|
39
|
+
expect(result.find((r) => r.harness === 'opencode')?.present).toBe(false);
|
|
40
|
+
expect(result.find((r) => r.harness === 'hermes')?.present).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
it('reports all harnesses absent when existsSync returns false for every path', () => {
|
|
43
|
+
existsSyncSpy.mockReturnValue(false);
|
|
44
|
+
const result = enumerateHarnessPresence();
|
|
45
|
+
expect(result.every((r) => r.present === false)).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
it('reports all harnesses present when existsSync returns true for every path', () => {
|
|
48
|
+
existsSyncSpy.mockReturnValue(true);
|
|
49
|
+
const result = enumerateHarnessPresence();
|
|
50
|
+
expect(result.every((r) => r.present === true)).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
it('returns the canonical CLIENT_NATIVE_PATHS path for each harness', () => {
|
|
53
|
+
const result = enumerateHarnessPresence();
|
|
54
|
+
for (const entry of result) {
|
|
55
|
+
expect(entry.path).toBe(CLIENT_NATIVE_PATHS[entry.harness]);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
it('calls existsSync exactly once per harness', () => {
|
|
59
|
+
enumerateHarnessPresence();
|
|
60
|
+
expect(existsSyncSpy).toHaveBeenCalledTimes(CLIENT_IDS.length);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('opencode + hermes ClientIds (SMI-5456 Wave 1 Step 5)', () => {
|
|
64
|
+
it('CLIENT_IDS includes opencode and hermes', () => {
|
|
65
|
+
expect(CLIENT_IDS).toContain('opencode');
|
|
66
|
+
expect(CLIENT_IDS).toContain('hermes');
|
|
67
|
+
expect(CLIENT_IDS).toHaveLength(7);
|
|
68
|
+
});
|
|
69
|
+
it('opencode resolves to ~/.config/opencode/skills', () => {
|
|
70
|
+
expect(CLIENT_NATIVE_PATHS.opencode.endsWith('/.config/opencode/skills')).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
it('hermes resolves to ~/.hermes/skills', () => {
|
|
73
|
+
expect(CLIENT_NATIVE_PATHS.hermes.endsWith('/.hermes/skills')).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=paths.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../../src/install/paths.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview sha256 helpers shared by the journal writer + reader.
|
|
3
|
+
* @module @skillsmith/core/journal/hash
|
|
4
|
+
*/
|
|
5
|
+
/** SHA-256 hex digest of arbitrary string/Buffer content. */
|
|
6
|
+
export declare function sha256Hex(content: string | Buffer): string;
|
|
7
|
+
/**
|
|
8
|
+
* Genesis constant the first journal record's `prev_hash` chains from.
|
|
9
|
+
* Computed (not a literal hex string) so the source documents its own
|
|
10
|
+
* derivation rather than presenting an opaque magic value.
|
|
11
|
+
*/
|
|
12
|
+
export declare const JOURNAL_GENESIS_HASH: string;
|
|
13
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../src/journal/hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAA6C,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview sha256 helpers shared by the journal writer + reader.
|
|
3
|
+
* @module @skillsmith/core/journal/hash
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
/** SHA-256 hex digest of arbitrary string/Buffer content. */
|
|
7
|
+
export function sha256Hex(content) {
|
|
8
|
+
return createHash('sha256').update(content).digest('hex');
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Genesis constant the first journal record's `prev_hash` chains from.
|
|
12
|
+
* Computed (not a literal hex string) so the source documents its own
|
|
13
|
+
* derivation rather than presenting an opaque magic value.
|
|
14
|
+
*/
|
|
15
|
+
export const JOURNAL_GENESIS_HASH = sha256Hex('skillsmith-journal-genesis-v1');
|
|
16
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/journal/hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,6DAA6D;AAC7D,MAAM,UAAU,SAAS,CAAC,OAAwB;IAChD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC,+BAA+B,CAAC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Public barrel for the change-journal module
|
|
3
|
+
* (SMI-5456 Wave 1 Step 3 / SMI-5470).
|
|
4
|
+
* @module @skillsmith/core/journal
|
|
5
|
+
*
|
|
6
|
+
* Consumed by `@skillsmith/mcp-server`'s apply-family tools
|
|
7
|
+
* (`apply_namespace_rename`, `apply_recommended_edit`, `undo_apply`) via the
|
|
8
|
+
* `@skillsmith/core/journal` subpath export.
|
|
9
|
+
*/
|
|
10
|
+
export { JOURNAL_SCHEMA_VERSION, type JournalAction, type JournalRecord, type JournalRecordFields, type JournalRecordInput, } from './types.js';
|
|
11
|
+
export { sha256Hex, JOURNAL_GENESIS_HASH } from './hash.js';
|
|
12
|
+
export { JOURNAL_DIR_ENV_VAR, getJournalFilePath, getJournalSessionId, resetJournalSessionIdForTests, } from './path.js';
|
|
13
|
+
export { appendJournalRecord, computeRecordHash, isCorruptTailError, type JournalCorruptTailError, } from './writer.js';
|
|
14
|
+
export { verifyJournalChain, readJournalRecords, type ChainVerificationResult } from './reader.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/journal/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAE3D,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Public barrel for the change-journal module
|
|
3
|
+
* (SMI-5456 Wave 1 Step 3 / SMI-5470).
|
|
4
|
+
* @module @skillsmith/core/journal
|
|
5
|
+
*
|
|
6
|
+
* Consumed by `@skillsmith/mcp-server`'s apply-family tools
|
|
7
|
+
* (`apply_namespace_rename`, `apply_recommended_edit`, `undo_apply`) via the
|
|
8
|
+
* `@skillsmith/core/journal` subpath export.
|
|
9
|
+
*/
|
|
10
|
+
export { JOURNAL_SCHEMA_VERSION, } from './types.js';
|
|
11
|
+
export { sha256Hex, JOURNAL_GENESIS_HASH } from './hash.js';
|
|
12
|
+
export { JOURNAL_DIR_ENV_VAR, getJournalFilePath, getJournalSessionId, resetJournalSessionIdForTests, } from './path.js';
|
|
13
|
+
export { appendJournalRecord, computeRecordHash, isCorruptTailError, } from './writer.js';
|
|
14
|
+
export { verifyJournalChain, readJournalRecords } from './reader.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/journal/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,sBAAsB,GAKvB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAE3D,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GAEnB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAgC,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unit tests for the change-journal writer + reader
|
|
3
|
+
* (SMI-5456 Wave 1 Step 3 / SMI-5470).
|
|
4
|
+
* @module @skillsmith/core/journal/journal.test
|
|
5
|
+
*
|
|
6
|
+
* Covers two of the three P-5 invariants named in
|
|
7
|
+
* docs/internal/implementation/smi-5456-skillsmith-agent-wave1.md's
|
|
8
|
+
* "Shared-State / Coordination Audit" table for `~/.skillsmith/journal`:
|
|
9
|
+
* - "journal module: concurrent-apply serialization test" (below)
|
|
10
|
+
* - "journal module: chain-verification test" (below)
|
|
11
|
+
* The third (undo round-trip / refusal / scope fence) lives in
|
|
12
|
+
* `@skillsmith/mcp-server`'s `tests/unit/undo-apply.test.ts`, since it
|
|
13
|
+
* needs the mcp-server apply-family tools to produce a realistic changeset.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=journal.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.test.d.ts","sourceRoot":"","sources":["../../../src/journal/journal.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|