@skillsmith/core 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +6 -0
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/client.test.d.ts +9 -0
- package/dist/src/api/client.test.d.ts.map +1 -0
- package/dist/src/api/client.test.js +81 -0
- package/dist/src/api/client.test.js.map +1 -0
- package/dist/src/exports/services.d.ts +3 -1
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +7 -1
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/install/agent-config-merge.json-array.d.ts +29 -0
- package/dist/src/install/agent-config-merge.json-array.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.json-array.js +100 -0
- package/dist/src/install/agent-config-merge.json-array.js.map +1 -0
- package/dist/src/install/agent-config-merge.json.d.ts +37 -0
- package/dist/src/install/agent-config-merge.json.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.json.js +134 -0
- package/dist/src/install/agent-config-merge.json.js.map +1 -0
- package/dist/src/install/agent-config-merge.toml-block.d.ts +48 -0
- package/dist/src/install/agent-config-merge.toml-block.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.toml-block.js +107 -0
- package/dist/src/install/agent-config-merge.toml-block.js.map +1 -0
- package/dist/src/install/agent-config-merge.types.d.ts +87 -0
- package/dist/src/install/agent-config-merge.types.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.types.js +83 -0
- package/dist/src/install/agent-config-merge.types.js.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.d.ts +46 -0
- package/dist/src/install/agent-config-merge.yaml.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.js +133 -0
- package/dist/src/install/agent-config-merge.yaml.js.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.test.d.ts +2 -0
- package/dist/src/install/agent-config-merge.yaml.test.d.ts.map +1 -0
- package/dist/src/install/agent-config-merge.yaml.test.js +210 -0
- package/dist/src/install/agent-config-merge.yaml.test.js.map +1 -0
- package/dist/src/install/agent-harness-targets.d.ts +98 -0
- package/dist/src/install/agent-harness-targets.d.ts.map +1 -0
- package/dist/src/install/agent-harness-targets.js +154 -0
- package/dist/src/install/agent-harness-targets.js.map +1 -0
- package/dist/src/install/agent-home-relocate.d.ts +29 -0
- package/dist/src/install/agent-home-relocate.d.ts.map +1 -0
- package/dist/src/install/agent-home-relocate.js +38 -0
- package/dist/src/install/agent-home-relocate.js.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.d.ts +55 -0
- package/dist/src/install/agent-manifest-path-guard.d.ts.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.js +109 -0
- package/dist/src/install/agent-manifest-path-guard.js.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.test.d.ts +2 -0
- package/dist/src/install/agent-manifest-path-guard.test.d.ts.map +1 -0
- package/dist/src/install/agent-manifest-path-guard.test.js +72 -0
- package/dist/src/install/agent-manifest-path-guard.test.js.map +1 -0
- package/dist/src/install/agent-manifest.d.ts +58 -0
- package/dist/src/install/agent-manifest.d.ts.map +1 -0
- package/dist/src/install/agent-manifest.js +103 -0
- package/dist/src/install/agent-manifest.js.map +1 -0
- package/dist/src/install/agent-pack-installer.d.ts +39 -0
- package/dist/src/install/agent-pack-installer.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.entry.d.ts +55 -0
- package/dist/src/install/agent-pack-installer.entry.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.entry.js +90 -0
- package/dist/src/install/agent-pack-installer.entry.js.map +1 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.d.ts +33 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.js +59 -0
- package/dist/src/install/agent-pack-installer.fs-helpers.js.map +1 -0
- package/dist/src/install/agent-pack-installer.harness.d.ts +66 -0
- package/dist/src/install/agent-pack-installer.harness.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.harness.js +310 -0
- package/dist/src/install/agent-pack-installer.harness.js.map +1 -0
- package/dist/src/install/agent-pack-installer.js +221 -0
- package/dist/src/install/agent-pack-installer.js.map +1 -0
- package/dist/src/install/agent-pack-installer.preserve.test.d.ts +11 -0
- package/dist/src/install/agent-pack-installer.preserve.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.preserve.test.js +72 -0
- package/dist/src/install/agent-pack-installer.preserve.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.test.d.ts +2 -0
- package/dist/src/install/agent-pack-installer.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.test.js +350 -0
- package/dist/src/install/agent-pack-installer.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.types.d.ts +51 -0
- package/dist/src/install/agent-pack-installer.types.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.types.js +16 -0
- package/dist/src/install/agent-pack-installer.types.js.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.d.ts +43 -0
- package/dist/src/install/agent-pack-uninstaller.d.ts.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.js +113 -0
- package/dist/src/install/agent-pack-uninstaller.js.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.test.d.ts +2 -0
- package/dist/src/install/agent-pack-uninstaller.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.test.js +212 -0
- package/dist/src/install/agent-pack-uninstaller.test.js.map +1 -0
- package/dist/src/install/index.d.ts +7 -0
- package/dist/src/install/index.d.ts.map +1 -1
- package/dist/src/install/index.js +7 -0
- package/dist/src/install/index.js.map +1 -1
- package/dist/src/install/paths.d.ts +1 -1
- package/dist/src/install/paths.d.ts.map +1 -1
- package/dist/src/install/paths.js +4 -0
- package/dist/src/install/paths.js.map +1 -1
- package/dist/src/install/paths.test.js +15 -0
- package/dist/src/install/paths.test.js.map +1 -1
- package/dist/src/journal/hash.d.ts +13 -0
- package/dist/src/journal/hash.d.ts.map +1 -0
- package/dist/src/journal/hash.js +16 -0
- package/dist/src/journal/hash.js.map +1 -0
- package/dist/src/journal/index.d.ts +15 -0
- package/dist/src/journal/index.d.ts.map +1 -0
- package/dist/src/journal/index.js +15 -0
- package/dist/src/journal/index.js.map +1 -0
- package/dist/src/journal/journal.test.d.ts +16 -0
- package/dist/src/journal/journal.test.d.ts.map +1 -0
- package/dist/src/journal/journal.test.js +171 -0
- package/dist/src/journal/journal.test.js.map +1 -0
- package/dist/src/journal/path.d.ts +44 -0
- package/dist/src/journal/path.d.ts.map +1 -0
- package/dist/src/journal/path.js +61 -0
- package/dist/src/journal/path.js.map +1 -0
- package/dist/src/journal/reader.d.ts +38 -0
- package/dist/src/journal/reader.d.ts.map +1 -0
- package/dist/src/journal/reader.js +93 -0
- package/dist/src/journal/reader.js.map +1 -0
- package/dist/src/journal/types.d.ts +87 -0
- package/dist/src/journal/types.d.ts.map +1 -0
- package/dist/src/journal/types.js +21 -0
- package/dist/src/journal/types.js.map +1 -0
- package/dist/src/journal/writer.d.ts +52 -0
- package/dist/src/journal/writer.d.ts.map +1 -0
- package/dist/src/journal/writer.js +125 -0
- package/dist/src/journal/writer.js.map +1 -0
- package/dist/src/paywall-triggers/index.d.ts +13 -0
- package/dist/src/paywall-triggers/index.d.ts.map +1 -0
- package/dist/src/paywall-triggers/index.js +13 -0
- package/dist/src/paywall-triggers/index.js.map +1 -0
- package/dist/src/paywall-triggers/path.d.ts +47 -0
- package/dist/src/paywall-triggers/path.d.ts.map +1 -0
- package/dist/src/paywall-triggers/path.js +73 -0
- package/dist/src/paywall-triggers/path.js.map +1 -0
- package/dist/src/paywall-triggers/store.d.ts +75 -0
- package/dist/src/paywall-triggers/store.d.ts.map +1 -0
- package/dist/src/paywall-triggers/store.js +122 -0
- package/dist/src/paywall-triggers/store.js.map +1 -0
- package/dist/src/paywall-triggers/store.test.d.ts +2 -0
- package/dist/src/paywall-triggers/store.test.d.ts.map +1 -0
- package/dist/src/paywall-triggers/store.test.js +121 -0
- package/dist/src/paywall-triggers/store.test.js.map +1 -0
- package/dist/src/paywall-triggers/types.d.ts +24 -0
- package/dist/src/paywall-triggers/types.d.ts.map +1 -0
- package/dist/src/paywall-triggers/types.js +13 -0
- package/dist/src/paywall-triggers/types.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.compound.d.ts +13 -0
- package/dist/src/security/scanner/SecurityScanner.compound.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.compound.js +127 -0
- package/dist/src/security/scanner/SecurityScanner.compound.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +10 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts +23 -0
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.pii.js +152 -0
- package/dist/src/security/scanner/SecurityScanner.pii.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts +5 -12
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.scanners.js +63 -137
- package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +2 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +79 -11
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +2 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/services/agent-pack/agent-pack.test.d.ts +18 -0
- package/dist/src/services/agent-pack/agent-pack.test.d.ts.map +1 -0
- package/dist/src/services/agent-pack/agent-pack.test.js +344 -0
- package/dist/src/services/agent-pack/agent-pack.test.js.map +1 -0
- package/dist/src/services/agent-pack/hooks.d.ts +29 -0
- package/dist/src/services/agent-pack/hooks.d.ts.map +1 -0
- package/dist/src/services/agent-pack/hooks.js +139 -0
- package/dist/src/services/agent-pack/hooks.js.map +1 -0
- package/dist/src/services/agent-pack/index.d.ts +26 -0
- package/dist/src/services/agent-pack/index.d.ts.map +1 -0
- package/dist/src/services/agent-pack/index.js +109 -0
- package/dist/src/services/agent-pack/index.js.map +1 -0
- package/dist/src/services/agent-pack/prompt-source.d.ts +47 -0
- package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -0
- package/dist/src/services/agent-pack/prompt-source.js +182 -0
- package/dist/src/services/agent-pack/prompt-source.js.map +1 -0
- package/dist/src/services/agent-pack/shims.d.ts +40 -0
- package/dist/src/services/agent-pack/shims.d.ts.map +1 -0
- package/dist/src/services/agent-pack/shims.js +96 -0
- package/dist/src/services/agent-pack/shims.js.map +1 -0
- package/dist/src/services/agent-pack/skill-md.d.ts +35 -0
- package/dist/src/services/agent-pack/skill-md.d.ts.map +1 -0
- package/dist/src/services/agent-pack/skill-md.js +89 -0
- package/dist/src/services/agent-pack/skill-md.js.map +1 -0
- package/dist/src/services/agent-pack/types.d.ts +118 -0
- package/dist/src/services/agent-pack/types.d.ts.map +1 -0
- package/dist/src/services/agent-pack/types.js +61 -0
- package/dist/src/services/agent-pack/types.js.map +1 -0
- package/dist/src/services/agent-tool-profile.d.ts +59 -0
- package/dist/src/services/agent-tool-profile.d.ts.map +1 -0
- package/dist/src/services/agent-tool-profile.js +76 -0
- package/dist/src/services/agent-tool-profile.js.map +1 -0
- package/dist/src/services/agent-tool-profile.test.d.ts +2 -0
- package/dist/src/services/agent-tool-profile.test.d.ts.map +1 -0
- package/dist/src/services/agent-tool-profile.test.js +28 -0
- package/dist/src/services/agent-tool-profile.test.js.map +1 -0
- package/dist/src/services/bundled-sibling-scan.d.ts +111 -0
- package/dist/src/services/bundled-sibling-scan.d.ts.map +1 -0
- package/dist/src/services/bundled-sibling-scan.js +170 -0
- package/dist/src/services/bundled-sibling-scan.js.map +1 -0
- package/dist/src/services/skill-installation.io.d.ts +16 -5
- package/dist/src/services/skill-installation.io.d.ts.map +1 -1
- package/dist/src/services/skill-installation.io.js +44 -20
- package/dist/src/services/skill-installation.io.js.map +1 -1
- package/dist/src/services/skill-installation.policy.d.ts +96 -0
- package/dist/src/services/skill-installation.policy.d.ts.map +1 -0
- package/dist/src/services/skill-installation.policy.js +144 -0
- package/dist/src/services/skill-installation.policy.js.map +1 -0
- package/dist/src/services/skill-installation.service.d.ts.map +1 -1
- package/dist/src/services/skill-installation.service.js +9 -3
- package/dist/src/services/skill-installation.service.js.map +1 -1
- package/dist/src/sources/index.d.ts +1 -0
- package/dist/src/sources/index.d.ts.map +1 -1
- package/dist/src/sources/index.js +4 -0
- package/dist/src/sources/index.js.map +1 -1
- package/dist/src/sync/index.d.ts +1 -1
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +1 -1
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/inventory-client.d.ts +16 -0
- package/dist/src/sync/inventory-client.d.ts.map +1 -1
- package/dist/src/sync/inventory-client.js +54 -0
- package/dist/src/sync/inventory-client.js.map +1 -1
- package/dist/src/sync/inventory-client.test.js +67 -1
- package/dist/src/sync/inventory-client.test.js.map +1 -1
- package/dist/src/sync/inventory-collector.d.ts.map +1 -1
- package/dist/src/sync/inventory-collector.js +32 -5
- package/dist/src/sync/inventory-collector.js.map +1 -1
- package/dist/src/sync/inventory-collector.test.js +50 -1
- package/dist/src/sync/inventory-collector.test.js.map +1 -1
- package/dist/src/sync/inventory-types.d.ts +9 -0
- package/dist/src/sync/inventory-types.d.ts.map +1 -1
- package/dist/src/sync/inventory-types.js +3 -0
- package/dist/src/sync/inventory-types.js.map +1 -1
- package/dist/src/telemetry/agent-marker.d.ts +137 -0
- package/dist/src/telemetry/agent-marker.d.ts.map +1 -0
- package/dist/src/telemetry/agent-marker.js +242 -0
- package/dist/src/telemetry/agent-marker.js.map +1 -0
- package/dist/src/telemetry/agent-marker.test.d.ts +13 -0
- package/dist/src/telemetry/agent-marker.test.d.ts.map +1 -0
- package/dist/src/telemetry/agent-marker.test.js +202 -0
- package/dist/src/telemetry/agent-marker.test.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +6 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +10 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +5 -1
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/wrap.d.ts +28 -7
- package/dist/src/telemetry/wrap.d.ts.map +1 -1
- package/dist/src/telemetry/wrap.gate.test.d.ts +22 -0
- package/dist/src/telemetry/wrap.gate.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.gate.test.js +197 -0
- package/dist/src/telemetry/wrap.gate.test.js.map +1 -0
- package/dist/src/telemetry/wrap.js +111 -26
- package/dist/src/telemetry/wrap.js.map +1 -1
- package/dist/src/telemetry/wrap.marker.test.d.ts +16 -0
- package/dist/src/telemetry/wrap.marker.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.marker.test.js +185 -0
- package/dist/src/telemetry/wrap.marker.test.js.map +1 -0
- package/dist/src/telemetry/wrap.test.js +4 -0
- package/dist/src/telemetry/wrap.test.js.map +1 -1
- package/dist/tests/SecurityScanner.exec.test.js +60 -0
- package/dist/tests/SecurityScanner.exec.test.js.map +1 -1
- package/dist/tests/security/ContinuousSecurity.test.js +10 -4
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts +2 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.d.ts.map +1 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.js +126 -0
- package/dist/tests/security/SecurityScanner.chmod-evasion.test.js.map +1 -0
- package/dist/tests/security/chmod-compound.test.d.ts +2 -0
- package/dist/tests/security/chmod-compound.test.d.ts.map +1 -0
- package/dist/tests/security/chmod-compound.test.js +188 -0
- package/dist/tests/security/chmod-compound.test.js.map +1 -0
- package/dist/tests/security/pii-detection.test.js +24 -0
- package/dist/tests/security/pii-detection.test.js.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.d.ts +23 -7
- package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.js +27 -11
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/dist/tests/security/sensitive-path-fp.test.d.ts +2 -0
- package/dist/tests/security/sensitive-path-fp.test.d.ts.map +1 -0
- package/dist/tests/security/sensitive-path-fp.test.js +142 -0
- package/dist/tests/security/sensitive-path-fp.test.js.map +1 -0
- package/dist/tests/services/bundled-sibling-scan.test.d.ts +2 -0
- package/dist/tests/services/bundled-sibling-scan.test.d.ts.map +1 -0
- package/dist/tests/services/bundled-sibling-scan.test.js +139 -0
- package/dist/tests/services/bundled-sibling-scan.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.test.js +166 -0
- package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -1
- package/dist/tests/unit/services/skill-installation.policy.test.d.ts +8 -0
- package/dist/tests/unit/services/skill-installation.policy.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.policy.test.js +151 -0
- package/dist/tests/unit/services/skill-installation.policy.test.js.map +1 -0
- package/package.json +23 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-md.js","sourceRoot":"","sources":["../../../../src/services/agent-pack/skill-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skillsmith Agent pack — shared types + constants (SMI-5456 Wave 1 Step 4).
|
|
3
|
+
*
|
|
4
|
+
* The portable agent pack IS the Skillsmith Agent product: one prompt source
|
|
5
|
+
* (the SKILL.md brain), thin per-harness shims that carry invocation sugar and
|
|
6
|
+
* zero logic, and SessionStart/SessionEnd hook artifacts that feed the
|
|
7
|
+
* mediation marker channel. Everything is generated from this one source at
|
|
8
|
+
* build time and versioned with the `@skillsmith/mcp-server` release — the
|
|
9
|
+
* mitigation for definition rot across harness targets (PRD §5.2 risk f).
|
|
10
|
+
*
|
|
11
|
+
* This module is intentionally free of any `@skillsmith/mcp-server` import: the
|
|
12
|
+
* curated tool profile is passed in as {@link AgentPackInput.toolProfile} so the
|
|
13
|
+
* dependency direction stays core → (consumed by) mcp-server, never circular.
|
|
14
|
+
*
|
|
15
|
+
* @see docs/internal/product/prd-skillsmith-agent.md
|
|
16
|
+
* @see docs/internal/architecture/skillsmith-agent-architecture.md (artifacts A1-A6)
|
|
17
|
+
*/
|
|
18
|
+
/** Skill directory + agentskills.io `name` slug for the generated pack. */
|
|
19
|
+
export declare const AGENT_PACK_SKILL_NAME = "skillsmith-agent";
|
|
20
|
+
/** Human-facing display name used in prose and shim descriptions. */
|
|
21
|
+
export declare const AGENT_PACK_DISPLAY_NAME = "Skillsmith Agent";
|
|
22
|
+
/**
|
|
23
|
+
* On-disk pack schema version. Bump on any breaking change to artifact SHAPE
|
|
24
|
+
* (paths, frontmatter fields, hook contract) so the installer can detect an
|
|
25
|
+
* incompatible pack. NOT the npm version — keeping it a fixed code constant is
|
|
26
|
+
* what makes generation deterministic (no release-number churn in artifacts).
|
|
27
|
+
*/
|
|
28
|
+
export declare const AGENT_PACK_SCHEMA_VERSION = 1;
|
|
29
|
+
/**
|
|
30
|
+
* SKILL.md frontmatter `version` (semver string — the repo's own
|
|
31
|
+
* `skill_validate` requires it). Static for Wave 1; bump when the pack's
|
|
32
|
+
* CONTENT changes materially. Independent of {@link AGENT_PACK_SCHEMA_VERSION}
|
|
33
|
+
* (artifact shape) and of the npm release number (determinism: artifacts must
|
|
34
|
+
* not churn with every release).
|
|
35
|
+
*/
|
|
36
|
+
export declare const AGENT_PACK_VERSION = "1.0.0";
|
|
37
|
+
/** SKILL.md frontmatter `repository` (source transparency for a published skill). */
|
|
38
|
+
export declare const AGENT_PACK_REPOSITORY = "https://github.com/smith-horn/skillsmith";
|
|
39
|
+
/**
|
|
40
|
+
* SKILL.md frontmatter `compatibility`, constrained to the validator's SMI-2760
|
|
41
|
+
* vocabulary (`KNOWN_IDES`/`KNOWN_LLMS` in mcp-server `utils/validation.ts`) so
|
|
42
|
+
* the pack validates with ZERO warnings. In Tier order; `vscode` is that
|
|
43
|
+
* vocabulary's designated slug for the Copilot/VS Code surface. `codex`,
|
|
44
|
+
* `opencode`, and `hermes` are supported harnesses but have no slug in the
|
|
45
|
+
* vocabulary yet — add them here when the SMI-2760 enum gains them.
|
|
46
|
+
*/
|
|
47
|
+
export declare const AGENT_PACK_COMPATIBILITY: readonly string[];
|
|
48
|
+
/** Harness identifiers the pack targets. */
|
|
49
|
+
export type HarnessId = 'claude-code' | 'cursor' | 'codex' | 'copilot' | 'opencode';
|
|
50
|
+
/**
|
|
51
|
+
* Harnesses that get a generated SessionStart/SessionEnd hook (PRD §3.1,
|
|
52
|
+
* spike report §(e)). Hermes has no session-start equivalent (spike verified
|
|
53
|
+
* absent) and Windsurf has no hook system — both excluded. Copilot/OpenCode
|
|
54
|
+
* hooks (preview / JS-plugin format) are out of Wave-1 hook scope by decision;
|
|
55
|
+
* they still get shims.
|
|
56
|
+
*/
|
|
57
|
+
export declare const HOOK_HARNESSES: readonly HarnessId[];
|
|
58
|
+
/** Artifact class. */
|
|
59
|
+
export type AgentArtifactKind = 'skill' | 'shim' | 'hook';
|
|
60
|
+
/**
|
|
61
|
+
* A single generated artifact. `path` is POSIX-relative to the agent-pack root;
|
|
62
|
+
* `content` is deterministic (no timestamps / randomness — snapshot tests depend
|
|
63
|
+
* on it). The installer (Step 5) consumes this typed shape directly rather than
|
|
64
|
+
* re-deriving intent from the path.
|
|
65
|
+
*/
|
|
66
|
+
export interface AgentPackArtifact {
|
|
67
|
+
/** Path relative to the agent-pack root (POSIX separators). */
|
|
68
|
+
path: string;
|
|
69
|
+
/** File contents. Byte-identical across runs for identical input. */
|
|
70
|
+
content: string;
|
|
71
|
+
/** What kind of artifact this is. */
|
|
72
|
+
kind: AgentArtifactKind;
|
|
73
|
+
/** Harness this artifact targets, or `null` for the harness-neutral skill pack. */
|
|
74
|
+
harness: HarnessId | null;
|
|
75
|
+
/** True when the installer must mark the file executable (hook scripts). */
|
|
76
|
+
executable: boolean;
|
|
77
|
+
}
|
|
78
|
+
/** Input to {@link generateAgentPack}. */
|
|
79
|
+
export interface AgentPackInput {
|
|
80
|
+
/**
|
|
81
|
+
* The curated MCP tool profile — the single source of truth is
|
|
82
|
+
* `@skillsmith/mcp-server`'s `AGENT_TOOL_PROFILE_NAMES`, passed in here by
|
|
83
|
+
* the generation script and by tests. Every tool the prompt source references
|
|
84
|
+
* must be a member, or {@link generateAgentPack} throws (build-time fail-fast).
|
|
85
|
+
*/
|
|
86
|
+
toolProfile: readonly string[];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* A delegable job the pack teaches. Jobs 1-3 are full MVP orchestrations; jobs
|
|
90
|
+
* 4/8/9 are routing-only (find/recommend, author-away, team-share).
|
|
91
|
+
*/
|
|
92
|
+
export interface JobDefinition {
|
|
93
|
+
/** Stable id for assembly tests. */
|
|
94
|
+
id: string;
|
|
95
|
+
/** Section heading (no leading `###`). */
|
|
96
|
+
title: string;
|
|
97
|
+
/** Prose body — plain-language operating instructions for this job. */
|
|
98
|
+
body: string;
|
|
99
|
+
/**
|
|
100
|
+
* Tools this job orchestrates, by MCP name. Empty for routing-only jobs that
|
|
101
|
+
* hand off to another skill/tier rather than calling tools. Every entry is
|
|
102
|
+
* validated against {@link AgentPackInput.toolProfile}.
|
|
103
|
+
*/
|
|
104
|
+
tools: readonly string[];
|
|
105
|
+
}
|
|
106
|
+
/** A trust/safety clause rendered verbatim-in-spirit from PRD §7. */
|
|
107
|
+
export interface TrustClause {
|
|
108
|
+
id: string;
|
|
109
|
+
title: string;
|
|
110
|
+
body: string;
|
|
111
|
+
}
|
|
112
|
+
/** A paywall trigger's wording + when-to-mention rule (PRD §8.1). */
|
|
113
|
+
export interface PaywallTrigger {
|
|
114
|
+
id: string;
|
|
115
|
+
title: string;
|
|
116
|
+
body: string;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/agent-pack/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,qBAAqB,qBAAqB,CAAA;AAEvD,qEAAqE;AACrE,eAAO,MAAM,uBAAuB,qBAAqB,CAAA;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAA;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,UAAU,CAAA;AAEzC,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,6CAA6C,CAAA;AAE/E;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAKrD,CAAA;AAED,4CAA4C;AAC5C,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAA;AAEnF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,SAAS,EAAuC,CAAA;AAEtF,sBAAsB;AACtB,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,IAAI,EAAE,iBAAiB,CAAA;IACvB,mFAAmF;IACnF,OAAO,EAAE,SAAS,GAAG,IAAI,CAAA;IACzB,4EAA4E;IAC5E,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CACzB;AAED,qEAAqE;AACrE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skillsmith Agent pack — shared types + constants (SMI-5456 Wave 1 Step 4).
|
|
3
|
+
*
|
|
4
|
+
* The portable agent pack IS the Skillsmith Agent product: one prompt source
|
|
5
|
+
* (the SKILL.md brain), thin per-harness shims that carry invocation sugar and
|
|
6
|
+
* zero logic, and SessionStart/SessionEnd hook artifacts that feed the
|
|
7
|
+
* mediation marker channel. Everything is generated from this one source at
|
|
8
|
+
* build time and versioned with the `@skillsmith/mcp-server` release — the
|
|
9
|
+
* mitigation for definition rot across harness targets (PRD §5.2 risk f).
|
|
10
|
+
*
|
|
11
|
+
* This module is intentionally free of any `@skillsmith/mcp-server` import: the
|
|
12
|
+
* curated tool profile is passed in as {@link AgentPackInput.toolProfile} so the
|
|
13
|
+
* dependency direction stays core → (consumed by) mcp-server, never circular.
|
|
14
|
+
*
|
|
15
|
+
* @see docs/internal/product/prd-skillsmith-agent.md
|
|
16
|
+
* @see docs/internal/architecture/skillsmith-agent-architecture.md (artifacts A1-A6)
|
|
17
|
+
*/
|
|
18
|
+
/** Skill directory + agentskills.io `name` slug for the generated pack. */
|
|
19
|
+
export const AGENT_PACK_SKILL_NAME = 'skillsmith-agent';
|
|
20
|
+
/** Human-facing display name used in prose and shim descriptions. */
|
|
21
|
+
export const AGENT_PACK_DISPLAY_NAME = 'Skillsmith Agent';
|
|
22
|
+
/**
|
|
23
|
+
* On-disk pack schema version. Bump on any breaking change to artifact SHAPE
|
|
24
|
+
* (paths, frontmatter fields, hook contract) so the installer can detect an
|
|
25
|
+
* incompatible pack. NOT the npm version — keeping it a fixed code constant is
|
|
26
|
+
* what makes generation deterministic (no release-number churn in artifacts).
|
|
27
|
+
*/
|
|
28
|
+
export const AGENT_PACK_SCHEMA_VERSION = 1;
|
|
29
|
+
/**
|
|
30
|
+
* SKILL.md frontmatter `version` (semver string — the repo's own
|
|
31
|
+
* `skill_validate` requires it). Static for Wave 1; bump when the pack's
|
|
32
|
+
* CONTENT changes materially. Independent of {@link AGENT_PACK_SCHEMA_VERSION}
|
|
33
|
+
* (artifact shape) and of the npm release number (determinism: artifacts must
|
|
34
|
+
* not churn with every release).
|
|
35
|
+
*/
|
|
36
|
+
export const AGENT_PACK_VERSION = '1.0.0';
|
|
37
|
+
/** SKILL.md frontmatter `repository` (source transparency for a published skill). */
|
|
38
|
+
export const AGENT_PACK_REPOSITORY = 'https://github.com/smith-horn/skillsmith';
|
|
39
|
+
/**
|
|
40
|
+
* SKILL.md frontmatter `compatibility`, constrained to the validator's SMI-2760
|
|
41
|
+
* vocabulary (`KNOWN_IDES`/`KNOWN_LLMS` in mcp-server `utils/validation.ts`) so
|
|
42
|
+
* the pack validates with ZERO warnings. In Tier order; `vscode` is that
|
|
43
|
+
* vocabulary's designated slug for the Copilot/VS Code surface. `codex`,
|
|
44
|
+
* `opencode`, and `hermes` are supported harnesses but have no slug in the
|
|
45
|
+
* vocabulary yet — add them here when the SMI-2760 enum gains them.
|
|
46
|
+
*/
|
|
47
|
+
export const AGENT_PACK_COMPATIBILITY = [
|
|
48
|
+
'claude-code',
|
|
49
|
+
'cursor',
|
|
50
|
+
'vscode',
|
|
51
|
+
'windsurf',
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* Harnesses that get a generated SessionStart/SessionEnd hook (PRD §3.1,
|
|
55
|
+
* spike report §(e)). Hermes has no session-start equivalent (spike verified
|
|
56
|
+
* absent) and Windsurf has no hook system — both excluded. Copilot/OpenCode
|
|
57
|
+
* hooks (preview / JS-plugin format) are out of Wave-1 hook scope by decision;
|
|
58
|
+
* they still get shims.
|
|
59
|
+
*/
|
|
60
|
+
export const HOOK_HARNESSES = ['claude-code', 'cursor', 'codex'];
|
|
61
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/agent-pack/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAA;AAEvD,qEAAqE;AACrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAAkB,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAA;AAE1C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAA;AAEzC,qFAAqF;AACrF,MAAM,CAAC,MAAM,qBAAqB,GAAG,0CAA0C,CAAA;AAE/E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,aAAa;IACb,QAAQ;IACR,QAAQ;IACR,UAAU;CACX,CAAA;AAKD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAyB,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Curated agent tool profile — canonical home (SMI-5456 Wave 1 Step 5, QD-1).
|
|
3
|
+
*
|
|
4
|
+
* These three constants were originally defined in
|
|
5
|
+
* `@skillsmith/mcp-server`'s `middleware/toolProfile.ts` (Step 2). Step 5's
|
|
6
|
+
* `sklx agent install` needs to call `generateAgentPack({ toolProfile })`
|
|
7
|
+
* with the SAME list the mcp-server's generation script uses, so the
|
|
8
|
+
* installer produces byte-identical artifacts to the committed pack
|
|
9
|
+
* (determinism is the drift guard — see `agent-pack.assets.test.ts`).
|
|
10
|
+
* Relocating here lets `@skillsmith/cli` depend on `@skillsmith/core` only
|
|
11
|
+
* (already a runtime-shaped dependency) instead of pulling in
|
|
12
|
+
* `@skillsmith/mcp-server` (a devDependency that bundles the full MCP SDK +
|
|
13
|
+
* server bootstrap) just to read a string array.
|
|
14
|
+
*
|
|
15
|
+
* `packages/mcp-server/src/middleware/toolProfile.ts` now imports + re-exports
|
|
16
|
+
* these three constants so every existing import path (including the
|
|
17
|
+
* generation script and `agent-pack.assets.test.ts`) keeps working unchanged.
|
|
18
|
+
* `isAgentToolProfileActive` / `filterToolsForAgentProfile` stay in
|
|
19
|
+
* mcp-server — they operate on `ListTools` output + `process.env`, which is
|
|
20
|
+
* mcp-server-specific runtime behavior, not shared constant data.
|
|
21
|
+
*
|
|
22
|
+
* DEVIATION FROM THE QD-1 SPEC: the plan's queen decision named the target
|
|
23
|
+
* location as `packages/core/src/services/agent-pack/` (e.g. `types.ts` or a
|
|
24
|
+
* small `constants.ts`). That directory was locked for a concurrent
|
|
25
|
+
* governance audit for the duration of this Step-5 implementation (worker
|
|
26
|
+
* S4), so this module lives as a SIBLING file instead
|
|
27
|
+
* (`services/agent-tool-profile.ts`, not `services/agent-pack/*.ts`) to avoid
|
|
28
|
+
* touching the locked path. Functionally this is identical to the spec'd
|
|
29
|
+
* location — same package, same import surface via `@skillsmith/core`. A
|
|
30
|
+
* follow-up should fold this file into `services/agent-pack/` proper once the
|
|
31
|
+
* lock lifts, purely as a file-move (no behavior change).
|
|
32
|
+
*
|
|
33
|
+
* @module @skillsmith/core/services/agent-tool-profile
|
|
34
|
+
* @see docs/internal/implementation/smi-5456-skillsmith-agent-wave1.md
|
|
35
|
+
*/
|
|
36
|
+
/** Env var that activates the curated agent profile (mcp-server ListTools filter). */
|
|
37
|
+
export declare const AGENT_TOOL_PROFILE_ENV_VAR = "SKILLSMITH_TOOL_PROFILE";
|
|
38
|
+
/** The only value of {@link AGENT_TOOL_PROFILE_ENV_VAR} that activates the profile. */
|
|
39
|
+
export declare const AGENT_TOOL_PROFILE_VALUE = "agent";
|
|
40
|
+
/**
|
|
41
|
+
* Membership list for the curated agent profile.
|
|
42
|
+
*
|
|
43
|
+
* The first 15 names were verified against actual `tools/*.ts`
|
|
44
|
+
* registrations on 2026-07-01 via:
|
|
45
|
+
*
|
|
46
|
+
* grep -rhoE "name: '[a-z_]+'" packages/mcp-server/src/tools/ \
|
|
47
|
+
* --include='*.ts' | grep -v test | sort -u
|
|
48
|
+
*
|
|
49
|
+
* `undo_apply` shipped in SMI-5470 (Wave 1 Step 3, the change-journal + undo
|
|
50
|
+
* tool). This list is the single source of truth consumed by BOTH
|
|
51
|
+
* `generateAgentPack` call sites: the mcp-server build-time generation script
|
|
52
|
+
* (`packages/mcp-server/scripts/generate-agent-pack.ts`, via the re-export in
|
|
53
|
+
* `middleware/toolProfile.ts`) and the CLI installer
|
|
54
|
+
* (`packages/cli/src/commands/agent.action.ts`, via this module directly).
|
|
55
|
+
* Determinism of `generateAgentPack` is what guarantees both call sites
|
|
56
|
+
* produce byte-identical output from the same input.
|
|
57
|
+
*/
|
|
58
|
+
export declare const AGENT_TOOL_PROFILE_NAMES: readonly string[];
|
|
59
|
+
//# sourceMappingURL=agent-tool-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tool-profile.d.ts","sourceRoot":"","sources":["../../../src/services/agent-tool-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,sFAAsF;AACtF,eAAO,MAAM,0BAA0B,4BAA4B,CAAA;AAEnE,uFAAuF;AACvF,eAAO,MAAM,wBAAwB,UAAU,CAAA;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAiBrD,CAAA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Curated agent tool profile — canonical home (SMI-5456 Wave 1 Step 5, QD-1).
|
|
3
|
+
*
|
|
4
|
+
* These three constants were originally defined in
|
|
5
|
+
* `@skillsmith/mcp-server`'s `middleware/toolProfile.ts` (Step 2). Step 5's
|
|
6
|
+
* `sklx agent install` needs to call `generateAgentPack({ toolProfile })`
|
|
7
|
+
* with the SAME list the mcp-server's generation script uses, so the
|
|
8
|
+
* installer produces byte-identical artifacts to the committed pack
|
|
9
|
+
* (determinism is the drift guard — see `agent-pack.assets.test.ts`).
|
|
10
|
+
* Relocating here lets `@skillsmith/cli` depend on `@skillsmith/core` only
|
|
11
|
+
* (already a runtime-shaped dependency) instead of pulling in
|
|
12
|
+
* `@skillsmith/mcp-server` (a devDependency that bundles the full MCP SDK +
|
|
13
|
+
* server bootstrap) just to read a string array.
|
|
14
|
+
*
|
|
15
|
+
* `packages/mcp-server/src/middleware/toolProfile.ts` now imports + re-exports
|
|
16
|
+
* these three constants so every existing import path (including the
|
|
17
|
+
* generation script and `agent-pack.assets.test.ts`) keeps working unchanged.
|
|
18
|
+
* `isAgentToolProfileActive` / `filterToolsForAgentProfile` stay in
|
|
19
|
+
* mcp-server — they operate on `ListTools` output + `process.env`, which is
|
|
20
|
+
* mcp-server-specific runtime behavior, not shared constant data.
|
|
21
|
+
*
|
|
22
|
+
* DEVIATION FROM THE QD-1 SPEC: the plan's queen decision named the target
|
|
23
|
+
* location as `packages/core/src/services/agent-pack/` (e.g. `types.ts` or a
|
|
24
|
+
* small `constants.ts`). That directory was locked for a concurrent
|
|
25
|
+
* governance audit for the duration of this Step-5 implementation (worker
|
|
26
|
+
* S4), so this module lives as a SIBLING file instead
|
|
27
|
+
* (`services/agent-tool-profile.ts`, not `services/agent-pack/*.ts`) to avoid
|
|
28
|
+
* touching the locked path. Functionally this is identical to the spec'd
|
|
29
|
+
* location — same package, same import surface via `@skillsmith/core`. A
|
|
30
|
+
* follow-up should fold this file into `services/agent-pack/` proper once the
|
|
31
|
+
* lock lifts, purely as a file-move (no behavior change).
|
|
32
|
+
*
|
|
33
|
+
* @module @skillsmith/core/services/agent-tool-profile
|
|
34
|
+
* @see docs/internal/implementation/smi-5456-skillsmith-agent-wave1.md
|
|
35
|
+
*/
|
|
36
|
+
/** Env var that activates the curated agent profile (mcp-server ListTools filter). */
|
|
37
|
+
export const AGENT_TOOL_PROFILE_ENV_VAR = 'SKILLSMITH_TOOL_PROFILE';
|
|
38
|
+
/** The only value of {@link AGENT_TOOL_PROFILE_ENV_VAR} that activates the profile. */
|
|
39
|
+
export const AGENT_TOOL_PROFILE_VALUE = 'agent';
|
|
40
|
+
/**
|
|
41
|
+
* Membership list for the curated agent profile.
|
|
42
|
+
*
|
|
43
|
+
* The first 15 names were verified against actual `tools/*.ts`
|
|
44
|
+
* registrations on 2026-07-01 via:
|
|
45
|
+
*
|
|
46
|
+
* grep -rhoE "name: '[a-z_]+'" packages/mcp-server/src/tools/ \
|
|
47
|
+
* --include='*.ts' | grep -v test | sort -u
|
|
48
|
+
*
|
|
49
|
+
* `undo_apply` shipped in SMI-5470 (Wave 1 Step 3, the change-journal + undo
|
|
50
|
+
* tool). This list is the single source of truth consumed by BOTH
|
|
51
|
+
* `generateAgentPack` call sites: the mcp-server build-time generation script
|
|
52
|
+
* (`packages/mcp-server/scripts/generate-agent-pack.ts`, via the re-export in
|
|
53
|
+
* `middleware/toolProfile.ts`) and the CLI installer
|
|
54
|
+
* (`packages/cli/src/commands/agent.action.ts`, via this module directly).
|
|
55
|
+
* Determinism of `generateAgentPack` is what guarantees both call sites
|
|
56
|
+
* produce byte-identical output from the same input.
|
|
57
|
+
*/
|
|
58
|
+
export const AGENT_TOOL_PROFILE_NAMES = [
|
|
59
|
+
'search',
|
|
60
|
+
'get_skill',
|
|
61
|
+
'install_skill',
|
|
62
|
+
'uninstall_skill',
|
|
63
|
+
'skill_recommend',
|
|
64
|
+
'skill_validate',
|
|
65
|
+
'skill_compare',
|
|
66
|
+
'skill_outdated',
|
|
67
|
+
'skill_updates',
|
|
68
|
+
'skill_diff',
|
|
69
|
+
'skill_pack_audit',
|
|
70
|
+
'skill_inventory_audit',
|
|
71
|
+
'apply_namespace_rename',
|
|
72
|
+
'apply_recommended_edit',
|
|
73
|
+
'skill_audit',
|
|
74
|
+
'undo_apply',
|
|
75
|
+
];
|
|
76
|
+
//# sourceMappingURL=agent-tool-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tool-profile.js","sourceRoot":"","sources":["../../../src/services/agent-tool-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,sFAAsF;AACtF,MAAM,CAAC,MAAM,0BAA0B,GAAG,yBAAyB,CAAA;AAEnE,uFAAuF;AACvF,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAA;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,QAAQ;IACR,WAAW;IACX,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,uBAAuB;IACvB,wBAAwB;IACxB,wBAAwB;IACxB,aAAa;IACb,YAAY;CACb,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tool-profile.test.d.ts","sourceRoot":"","sources":["../../../src/services/agent-tool-profile.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tests for the relocated curated-agent-tool-profile constants
|
|
3
|
+
* (SMI-5456 Wave 1 Step 5, QD-1).
|
|
4
|
+
* @module @skillsmith/core/services/agent-tool-profile.test
|
|
5
|
+
*/
|
|
6
|
+
import { describe, expect, it } from 'vitest';
|
|
7
|
+
import { AGENT_TOOL_PROFILE_ENV_VAR, AGENT_TOOL_PROFILE_NAMES, AGENT_TOOL_PROFILE_VALUE, } from './agent-tool-profile.js';
|
|
8
|
+
describe('AGENT_TOOL_PROFILE_NAMES (core, QD-1 relocation)', () => {
|
|
9
|
+
it('has 16 entries', () => {
|
|
10
|
+
expect(AGENT_TOOL_PROFILE_NAMES).toHaveLength(16);
|
|
11
|
+
});
|
|
12
|
+
it('contains undo_apply', () => {
|
|
13
|
+
expect(AGENT_TOOL_PROFILE_NAMES).toContain('undo_apply');
|
|
14
|
+
});
|
|
15
|
+
it('every entry is a non-empty snake_case tool name', () => {
|
|
16
|
+
for (const name of AGENT_TOOL_PROFILE_NAMES) {
|
|
17
|
+
expect(name).toMatch(/^[a-z][a-z_]*[a-z]$/);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
it('has no duplicate entries', () => {
|
|
21
|
+
expect(new Set(AGENT_TOOL_PROFILE_NAMES).size).toBe(AGENT_TOOL_PROFILE_NAMES.length);
|
|
22
|
+
});
|
|
23
|
+
it('env var name + value match the mcp-server ListTools filter contract', () => {
|
|
24
|
+
expect(AGENT_TOOL_PROFILE_ENV_VAR).toBe('SKILLSMITH_TOOL_PROFILE');
|
|
25
|
+
expect(AGENT_TOOL_PROFILE_VALUE).toBe('agent');
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=agent-tool-profile.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tool-profile.test.js","sourceRoot":"","sources":["../../../src/services/agent-tool-profile.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,yBAAyB,CAAA;AAEhC,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,wBAAwB,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,wBAAwB,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,KAAK,MAAM,IAAI,IAAI,wBAAwB,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,IAAI,GAAG,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;QAClE,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Bundled-sibling security scan for the local rescan path (SMI-5422 Phase 2).
|
|
3
|
+
* @module @skillsmith/core/services/bundled-sibling-scan
|
|
4
|
+
*
|
|
5
|
+
* Walks an installed skill's bundle directory and scans its sibling bundled
|
|
6
|
+
* files (`.mcp.json`, `.claude/settings*.json`, `package.json` lifecycle hooks,
|
|
7
|
+
* `config.json`, `scripts/*.sh` + top-level `*.sh`) so `skill_rescan` can
|
|
8
|
+
* quarantine a skill whose MALICIOUS sibling — not its `SKILL.md` — carries the
|
|
9
|
+
* threat (CVE-2025-59536 hook execution, `curl|bash` postinstall, a
|
|
10
|
+
* remote-fetch-execute install script).
|
|
11
|
+
*
|
|
12
|
+
* This is the local-FS rescan analogue of the Phase-1 install/validate helpers —
|
|
13
|
+
* NOT a duplicate. The three callers intentionally differ:
|
|
14
|
+
* - install: `skill-installation.io.ts` `fetchAndScanOptionalFiles` (fetch-by-path, no glob)
|
|
15
|
+
* - validate: mcp-server `validate-bundled-scan.ts` `scanBundledSiblings` (returns ValidationError[])
|
|
16
|
+
* - rescan (this): directory walk + symlink-safe reads + structured result.
|
|
17
|
+
*
|
|
18
|
+
* DELIBERATE FP-SAFE DIVERGENCE (Phase 2 review B1, verified empirically):
|
|
19
|
+
* install/validate reject via `isRejectableScan` (= `!report.passed` OR a
|
|
20
|
+
* `code_execution`/`obfuscated_directive` finding). The `!report.passed` clause
|
|
21
|
+
* fires on ANY high/critical finding, and sibling files are non-markdown so they
|
|
22
|
+
* get NO documentation-context downgrade — so routine, benign script idioms fire
|
|
23
|
+
* at full severity and would quarantine a working skill:
|
|
24
|
+
* `chmod 755 ./bin/cli` => privilege_escalation:critical => !passed
|
|
25
|
+
* `cp .env.example .env` => sensitive_path:high => !passed
|
|
26
|
+
* `source .env` / `export X=$1` / `cat ~/.ssh/...` => sensitive_path:high
|
|
27
|
+
* For an ALREADY-INSTALLED skill that false positive hides a working skill from
|
|
28
|
+
* local search. So this module drives the quarantine decision SOLELY from
|
|
29
|
+
* `code_execution`/`obfuscated_directive` presence (still catches `curl|bash`).
|
|
30
|
+
* The root cause — privilege_escalation/sensitive_path over-firing in
|
|
31
|
+
* non-markdown execution contexts (which is the SAME latent FP on the install
|
|
32
|
+
* path) — is tracked in SMI-5424; once those patterns are narrowed at the
|
|
33
|
+
* source, all three callers can safely share the broader criterion.
|
|
34
|
+
*
|
|
35
|
+
* INHERITED DETECTION GAPS (FN, tracked SMI-5424): bare-interpreter hook
|
|
36
|
+
* payloads (`node evil.js`, `python evil.py`, `bun`/`deno`), `&&`/`;`-chained
|
|
37
|
+
* fetch-then-exec, `npx`, and JSON `\uXXXX`-escaped commands inside raw-scanned
|
|
38
|
+
* structured files are NOT detected. `.js`/`.py`/`.mjs`/`.ts` payload files and
|
|
39
|
+
* nested/non-`scripts/` `.sh` are a Phase-3 follow-up (recursive bundle walk).
|
|
40
|
+
* COUNT-CAP DECOY-PADDING (FN): the fixed bundled files are cap-exempt, but the
|
|
41
|
+
* `.sh` glob is capped — an author can name the malicious script to sort last
|
|
42
|
+
* and pad `scripts/` with cap-many benign decoys so it lands in `droppedForCount`
|
|
43
|
+
* and is never scanned. This is surfaced (never a silent drop) but not blocked;
|
|
44
|
+
* a cumulative-resource bound is a Phase-3 follow-up.
|
|
45
|
+
*
|
|
46
|
+
* config.json IS scanned here (only doc-class siblings are skipped), whereas the
|
|
47
|
+
* Phase-1 validate helper (validate-bundled-scan.ts) also skips `config` — rescan
|
|
48
|
+
* is the deliberately stricter superset because it is a quarantine path.
|
|
49
|
+
*/
|
|
50
|
+
import type { SecurityFinding } from '../security/scanner/types.js';
|
|
51
|
+
import type { SecurityScanner } from '../security/index.js';
|
|
52
|
+
/** Max `.sh` glob files scanned per skill (fixed bundled files are exempt). */
|
|
53
|
+
export declare const MAX_SIBLING_SH_FILES = 50;
|
|
54
|
+
/** Per-file byte ceiling; larger siblings are skipped (recorded, never silent). */
|
|
55
|
+
export declare const MAX_SIBLING_FILE_BYTES: number;
|
|
56
|
+
/** Tunable caps for {@link scanLocalBundleSiblings}. */
|
|
57
|
+
export interface BundledSiblingScanOptions {
|
|
58
|
+
/** Override {@link MAX_SIBLING_SH_FILES}. */
|
|
59
|
+
maxShFiles?: number;
|
|
60
|
+
/** Override {@link MAX_SIBLING_FILE_BYTES}. */
|
|
61
|
+
maxBytesPerFile?: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Result of scanning a skill bundle's sibling files. All path fields are
|
|
65
|
+
* relative to the skill directory. `findings` is the full (display) set;
|
|
66
|
+
* `rejectableFindings`/`rejectableFiles` are the quarantine-driving subset.
|
|
67
|
+
*/
|
|
68
|
+
export interface BundledSiblingScanResult {
|
|
69
|
+
/** All non-doc sibling findings, each tagged with `location = relPath`. */
|
|
70
|
+
findings: SecurityFinding[];
|
|
71
|
+
/** True when any sibling carries a `code_execution`/`obfuscated_directive`. */
|
|
72
|
+
rejectable: boolean;
|
|
73
|
+
/** The execution-threat findings that drive quarantine. */
|
|
74
|
+
rejectableFindings: SecurityFinding[];
|
|
75
|
+
/** Relative paths that drove rejection. */
|
|
76
|
+
rejectableFiles: string[];
|
|
77
|
+
/** Relative paths actually scanned. */
|
|
78
|
+
scannedFiles: string[];
|
|
79
|
+
/**
|
|
80
|
+
* Max riskScore across REJECTING sibling reports only (display only; rejection
|
|
81
|
+
* is type-driven so this can be below the threshold). Non-rejecting siblings
|
|
82
|
+
* (e.g. a benign `chmod` that scores high) are excluded so they cannot
|
|
83
|
+
* mis-attribute a quarantine's surfaced score.
|
|
84
|
+
*/
|
|
85
|
+
maxSiblingRiskScore: number;
|
|
86
|
+
/** `.sh` files beyond the count cap — surfaced, never silently dropped. */
|
|
87
|
+
droppedForCount: string[];
|
|
88
|
+
/** Files skipped for exceeding the byte cap. */
|
|
89
|
+
skippedOversize: string[];
|
|
90
|
+
/** Symlink siblings resolving outside the skill dir (SMI-4287 guard). */
|
|
91
|
+
skippedSymlinkEscape: string[];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Scan a skill bundle's sibling files and return the structured result.
|
|
95
|
+
*
|
|
96
|
+
* Fixed {@link BUNDLED_SCAN_FILES} are always scanned (exempt from the count
|
|
97
|
+
* cap, so a decoy-padding attack on `scripts/` cannot push the primary hook /
|
|
98
|
+
* postinstall surface out of the scan window). The `.sh` glob is capped and
|
|
99
|
+
* any overflow is reported in `droppedForCount`.
|
|
100
|
+
*
|
|
101
|
+
* Doc-class siblings (`README.md`, `examples.md`) are intentionally NOT scanned:
|
|
102
|
+
* prose routinely quotes attack strings, so they can never drive a quarantine
|
|
103
|
+
* (Phase-1 H6 control). Every read is symlink-safe via `resolveSafeRealpath`
|
|
104
|
+
* (containment to `skillDir`, SMI-4287) and reads the resolved realpath.
|
|
105
|
+
*
|
|
106
|
+
* @param skillDir absolute path to the installed skill's bundle directory
|
|
107
|
+
* @param scanner a constructed SecurityScanner (injected to keep this module DB-free)
|
|
108
|
+
* @param opts optional caps
|
|
109
|
+
*/
|
|
110
|
+
export declare function scanLocalBundleSiblings(skillDir: string, scanner: SecurityScanner, opts?: BundledSiblingScanOptions): Promise<BundledSiblingScanResult>;
|
|
111
|
+
//# sourceMappingURL=bundled-sibling-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundled-sibling-scan.d.ts","sourceRoot":"","sources":["../../../src/services/bundled-sibling-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,8BAA8B,CAAA;AAI/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAQ3D,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,mFAAmF;AACnF,eAAO,MAAM,sBAAsB,QAAa,CAAA;AAEhD,wDAAwD;AACxD,MAAM,WAAW,yBAAyB;IACxC,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,2EAA2E;IAC3E,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,+EAA+E;IAC/E,UAAU,EAAE,OAAO,CAAA;IACnB,2DAA2D;IAC3D,kBAAkB,EAAE,eAAe,EAAE,CAAA;IACrC,2CAA2C;IAC3C,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,uCAAuC;IACvC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB;;;;;OAKG;IACH,mBAAmB,EAAE,MAAM,CAAA;IAC3B,2EAA2E;IAC3E,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,gDAAgD;IAChD,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,yEAAyE;IACzE,oBAAoB,EAAE,MAAM,EAAE,CAAA;CAC/B;AAgCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,EACxB,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,wBAAwB,CAAC,CAuEnC"}
|