@skillsmith/core 0.12.1 → 0.12.3
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 +164 -0
- package/README.md +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/api/client.d.ts +5 -3
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +23 -33
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/client.registry-sync.d.ts +28 -0
- package/dist/src/api/client.registry-sync.d.ts.map +1 -0
- package/dist/src/api/client.registry-sync.js +36 -0
- package/dist/src/api/client.registry-sync.js.map +1 -0
- package/dist/src/api/client.test.js +185 -0
- package/dist/src/api/client.test.js.map +1 -1
- package/dist/src/api/client.toSkill.d.ts +16 -0
- package/dist/src/api/client.toSkill.d.ts.map +1 -0
- package/dist/src/api/client.toSkill.js +46 -0
- package/dist/src/api/client.toSkill.js.map +1 -0
- package/dist/src/api/client.types.d.ts +22 -0
- package/dist/src/api/client.types.d.ts.map +1 -1
- package/dist/src/api/index.d.ts +1 -1
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/schemas.d.ts +28 -0
- package/dist/src/api/schemas.d.ts.map +1 -1
- package/dist/src/api/schemas.js +13 -0
- package/dist/src/api/schemas.js.map +1 -1
- package/dist/src/audit/remote-audit.d.ts +85 -0
- package/dist/src/audit/remote-audit.d.ts.map +1 -1
- package/dist/src/audit/remote-audit.js +126 -3
- package/dist/src/audit/remote-audit.js.map +1 -1
- package/dist/src/audit/remote-audit.test.js +217 -1
- package/dist/src/audit/remote-audit.test.js.map +1 -1
- package/dist/src/config/index.d.ts +1 -0
- package/dist/src/config/index.d.ts.map +1 -1
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/db/migration-runner.d.ts.map +1 -1
- package/dist/src/db/migration-runner.js +6 -0
- package/dist/src/db/migration-runner.js.map +1 -1
- package/dist/src/db/migrations/v18-skill-versions-real-content-hash.d.ts +36 -0
- package/dist/src/db/migrations/v18-skill-versions-real-content-hash.d.ts.map +1 -0
- package/dist/src/db/migrations/v18-skill-versions-real-content-hash.js +38 -0
- package/dist/src/db/migrations/v18-skill-versions-real-content-hash.js.map +1 -0
- package/dist/src/db/schema.d.ts +1 -1
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +3 -1
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/exports/services.d.ts +3 -7
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.install.d.ts +18 -0
- package/dist/src/exports/services.install.d.ts.map +1 -0
- package/dist/src/exports/services.install.js +62 -0
- package/dist/src/exports/services.install.js.map +1 -0
- package/dist/src/exports/services.js +12 -32
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/exports/types.d.ts +1 -1
- package/dist/src/exports/types.d.ts.map +1 -1
- package/dist/src/index.d.ts +6 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/install/agent-config-merge.json.d.ts +5 -4
- package/dist/src/install/agent-config-merge.json.d.ts.map +1 -1
- package/dist/src/install/agent-config-merge.json.js +10 -9
- package/dist/src/install/agent-config-merge.json.js.map +1 -1
- package/dist/src/install/agent-config-merge.types.d.ts +11 -1
- package/dist/src/install/agent-config-merge.types.d.ts.map +1 -1
- package/dist/src/install/agent-config-merge.types.js.map +1 -1
- package/dist/src/install/agent-harness-targets.d.ts +30 -2
- package/dist/src/install/agent-harness-targets.d.ts.map +1 -1
- package/dist/src/install/agent-harness-targets.js +17 -0
- package/dist/src/install/agent-harness-targets.js.map +1 -1
- package/dist/src/install/agent-manifest-path-guard.d.ts +28 -3
- package/dist/src/install/agent-manifest-path-guard.d.ts.map +1 -1
- package/dist/src/install/agent-manifest-path-guard.js +59 -3
- package/dist/src/install/agent-manifest-path-guard.js.map +1 -1
- package/dist/src/install/agent-manifest-path-guard.test.js +27 -1
- package/dist/src/install/agent-manifest-path-guard.test.js.map +1 -1
- package/dist/src/install/agent-pack-installer.antigravity-mcp.d.ts +74 -0
- package/dist/src/install/agent-pack-installer.antigravity-mcp.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.antigravity-mcp.js +106 -0
- package/dist/src/install/agent-pack-installer.antigravity-mcp.js.map +1 -0
- package/dist/src/install/agent-pack-installer.antigravity-mcp.test.d.ts +2 -0
- package/dist/src/install/agent-pack-installer.antigravity-mcp.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.antigravity-mcp.test.js +157 -0
- package/dist/src/install/agent-pack-installer.antigravity-mcp.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.cursor-mcp.d.ts +53 -0
- package/dist/src/install/agent-pack-installer.cursor-mcp.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.cursor-mcp.js +207 -0
- package/dist/src/install/agent-pack-installer.cursor-mcp.js.map +1 -0
- package/dist/src/install/agent-pack-installer.cursor-mcp.test.d.ts +2 -0
- package/dist/src/install/agent-pack-installer.cursor-mcp.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.cursor-mcp.test.js +285 -0
- package/dist/src/install/agent-pack-installer.cursor-mcp.test.js.map +1 -0
- package/dist/src/install/agent-pack-installer.d.ts +8 -0
- package/dist/src/install/agent-pack-installer.d.ts.map +1 -1
- package/dist/src/install/agent-pack-installer.entry.d.ts +120 -3
- package/dist/src/install/agent-pack-installer.entry.d.ts.map +1 -1
- package/dist/src/install/agent-pack-installer.entry.js +166 -3
- package/dist/src/install/agent-pack-installer.entry.js.map +1 -1
- package/dist/src/install/agent-pack-installer.js +97 -3
- package/dist/src/install/agent-pack-installer.js.map +1 -1
- package/dist/src/install/agent-pack-installer.types.d.ts +27 -0
- package/dist/src/install/agent-pack-installer.types.d.ts.map +1 -1
- package/dist/src/install/agent-pack-installer.types.js +6 -0
- package/dist/src/install/agent-pack-installer.types.js.map +1 -1
- package/dist/src/install/agent-pack-installer.workspace-scope.test.d.ts +2 -0
- package/dist/src/install/agent-pack-installer.workspace-scope.test.d.ts.map +1 -0
- package/dist/src/install/agent-pack-installer.workspace-scope.test.js +148 -0
- package/dist/src/install/agent-pack-installer.workspace-scope.test.js.map +1 -0
- package/dist/src/install/agent-pack-uninstaller.d.ts +18 -7
- package/dist/src/install/agent-pack-uninstaller.d.ts.map +1 -1
- package/dist/src/install/agent-pack-uninstaller.js +59 -9
- package/dist/src/install/agent-pack-uninstaller.js.map +1 -1
- package/dist/src/install/agent-pack-uninstaller.test.js +74 -1
- package/dist/src/install/agent-pack-uninstaller.test.js.map +1 -1
- package/dist/src/install/fan-out.d.ts.map +1 -1
- package/dist/src/install/fan-out.js +6 -0
- package/dist/src/install/fan-out.js.map +1 -1
- package/dist/src/install/index.d.ts +2 -0
- package/dist/src/install/index.d.ts.map +1 -1
- package/dist/src/install/index.js +2 -0
- package/dist/src/install/index.js.map +1 -1
- package/dist/src/install/workspace-scope.d.ts +207 -0
- package/dist/src/install/workspace-scope.d.ts.map +1 -0
- package/dist/src/install/workspace-scope.js +275 -0
- package/dist/src/install/workspace-scope.js.map +1 -0
- package/dist/src/install/workspace-scope.test.d.ts +2 -0
- package/dist/src/install/workspace-scope.test.d.ts.map +1 -0
- package/dist/src/install/workspace-scope.test.js +378 -0
- package/dist/src/install/workspace-scope.test.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +9 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/scan-imported-skills.d.ts +7 -1
- package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -1
- package/dist/src/scripts/scan-imported-skills.js +15 -2
- package/dist/src/scripts/scan-imported-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/allowlist.d.ts +10 -0
- package/dist/src/scripts/skill-scanner/allowlist.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/allowlist.js +10 -0
- package/dist/src/scripts/skill-scanner/allowlist.js.map +1 -1
- package/dist/src/scripts/skill-scanner/index.d.ts +8 -0
- package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/index.js +13 -5
- package/dist/src/scripts/skill-scanner/index.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js +6 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/security/__tests__/pathValidation.test.js +30 -1
- package/dist/src/security/__tests__/pathValidation.test.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.action-context.d.ts +15 -0
- package/dist/src/security/scanner/SecurityScanner.action-context.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.action-context.js +209 -0
- package/dist/src/security/scanner/SecurityScanner.action-context.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts +25 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +40 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js +88 -51
- package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +39 -6
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts +30 -0
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.pii.js +8 -1
- package/dist/src/security/scanner/SecurityScanner.pii.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.prose-lexicon.d.ts +60 -0
- package/dist/src/security/scanner/SecurityScanner.prose-lexicon.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.prose-lexicon.js +228 -0
- package/dist/src/security/scanner/SecurityScanner.prose-lexicon.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.scanners.js +35 -5
- package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.value-gate.d.ts +49 -0
- package/dist/src/security/scanner/SecurityScanner.value-gate.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.value-gate.js +134 -0
- package/dist/src/security/scanner/SecurityScanner.value-gate.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.weak-passwords.d.ts +55 -0
- package/dist/src/security/scanner/SecurityScanner.weak-passwords.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.weak-passwords.js +313 -0
- package/dist/src/security/scanner/SecurityScanner.weak-passwords.js.map +1 -0
- package/dist/src/security/scanner/patterns.d.ts +16 -6
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +25 -61
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/patterns.sensitive-path.d.ts +45 -0
- package/dist/src/security/scanner/patterns.sensitive-path.d.ts.map +1 -0
- package/dist/src/security/scanner/patterns.sensitive-path.js +137 -0
- package/dist/src/security/scanner/patterns.sensitive-path.js.map +1 -0
- package/dist/src/security/scanner/regex-utils.d.ts +31 -17
- package/dist/src/security/scanner/regex-utils.d.ts.map +1 -1
- package/dist/src/security/scanner/regex-utils.js +31 -17
- package/dist/src/security/scanner/regex-utils.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +9 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/services/SubagentGenerator.client-profiles.d.ts +258 -0
- package/dist/src/services/SubagentGenerator.client-profiles.d.ts.map +1 -0
- package/dist/src/services/SubagentGenerator.client-profiles.js +260 -0
- package/dist/src/services/SubagentGenerator.client-profiles.js.map +1 -0
- package/dist/src/services/SubagentGenerator.d.ts +19 -41
- package/dist/src/services/SubagentGenerator.d.ts.map +1 -1
- package/dist/src/services/SubagentGenerator.helpers.d.ts +64 -0
- package/dist/src/services/SubagentGenerator.helpers.d.ts.map +1 -0
- package/dist/src/services/SubagentGenerator.helpers.js +228 -0
- package/dist/src/services/SubagentGenerator.helpers.js.map +1 -0
- package/dist/src/services/SubagentGenerator.js +66 -208
- package/dist/src/services/SubagentGenerator.js.map +1 -1
- package/dist/src/services/SubagentGenerator.types.d.ts +45 -0
- package/dist/src/services/SubagentGenerator.types.d.ts.map +1 -0
- package/dist/src/services/SubagentGenerator.types.js +14 -0
- package/dist/src/services/SubagentGenerator.types.js.map +1 -0
- package/dist/src/services/TransformationService.d.ts +18 -61
- package/dist/src/services/TransformationService.d.ts.map +1 -1
- package/dist/src/services/TransformationService.js +29 -17
- package/dist/src/services/TransformationService.js.map +1 -1
- package/dist/src/services/TransformationService.types.d.ts +74 -0
- package/dist/src/services/TransformationService.types.d.ts.map +1 -0
- package/dist/src/services/TransformationService.types.js +8 -0
- package/dist/src/services/TransformationService.types.js.map +1 -0
- package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.d.ts +5 -0
- package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.js +72 -0
- package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.js.map +1 -0
- package/dist/src/services/__tests__/SubagentGenerator.helpers.test.d.ts +2 -0
- package/dist/src/services/__tests__/SubagentGenerator.helpers.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/SubagentGenerator.helpers.test.js +61 -0
- package/dist/src/services/__tests__/SubagentGenerator.helpers.test.js.map +1 -0
- package/dist/src/services/__tests__/SubagentGenerator.test.js +155 -0
- package/dist/src/services/__tests__/SubagentGenerator.test.js.map +1 -1
- package/dist/src/services/__tests__/TransformationService.test.js +48 -0
- package/dist/src/services/__tests__/TransformationService.test.js.map +1 -1
- package/dist/src/services/agent-pack/agent-pack.test.js +1 -0
- package/dist/src/services/agent-pack/agent-pack.test.js.map +1 -1
- package/dist/src/services/agent-pack/prompt-source.d.ts +1 -1
- package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -1
- package/dist/src/services/agent-pack/prompt-source.js +10 -3
- package/dist/src/services/agent-pack/prompt-source.js.map +1 -1
- package/dist/src/services/agent-pack/types.d.ts +26 -2
- package/dist/src/services/agent-pack/types.d.ts.map +1 -1
- package/dist/src/services/agent-pack/types.js +13 -0
- package/dist/src/services/agent-pack/types.js.map +1 -1
- package/dist/src/services/agent-tool-profile.d.ts.map +1 -1
- package/dist/src/services/agent-tool-profile.js +7 -0
- package/dist/src/services/agent-tool-profile.js.map +1 -1
- package/dist/src/services/agent-tool-profile.test.js +2 -2
- package/dist/src/services/skill-content-comparison.d.ts +71 -0
- package/dist/src/services/skill-content-comparison.d.ts.map +1 -0
- package/dist/src/services/skill-content-comparison.js +90 -0
- package/dist/src/services/skill-content-comparison.js.map +1 -0
- package/dist/src/services/skill-content-comparison.test.d.ts +6 -0
- package/dist/src/services/skill-content-comparison.test.d.ts.map +1 -0
- package/dist/src/services/skill-content-comparison.test.js +83 -0
- package/dist/src/services/skill-content-comparison.test.js.map +1 -0
- package/dist/src/services/skill-identity-classification.d.ts +202 -0
- package/dist/src/services/skill-identity-classification.d.ts.map +1 -0
- package/dist/src/services/skill-identity-classification.js +295 -0
- package/dist/src/services/skill-identity-classification.js.map +1 -0
- package/dist/src/services/skill-identity-classification.test.d.ts +6 -0
- package/dist/src/services/skill-identity-classification.test.d.ts.map +1 -0
- package/dist/src/services/skill-identity-classification.test.js +314 -0
- package/dist/src/services/skill-identity-classification.test.js.map +1 -0
- package/dist/src/services/skill-installation.content.d.ts.map +1 -1
- package/dist/src/services/skill-installation.content.js +6 -1
- package/dist/src/services/skill-installation.content.js.map +1 -1
- package/dist/src/services/skill-installation.helpers.d.ts +8 -15
- package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
- package/dist/src/services/skill-installation.helpers.js +11 -105
- package/dist/src/services/skill-installation.helpers.js.map +1 -1
- package/dist/src/services/skill-installation.helpers.test.js +106 -1
- package/dist/src/services/skill-installation.helpers.test.js.map +1 -1
- package/dist/src/services/skill-installation.service.js +1 -1
- package/dist/src/services/skill-installation.service.js.map +1 -1
- package/dist/src/services/skill-installation.types.d.ts +33 -0
- package/dist/src/services/skill-installation.types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.types.js.map +1 -1
- package/dist/src/services/skill-installation.uninstall.d.ts +84 -0
- package/dist/src/services/skill-installation.uninstall.d.ts.map +1 -0
- package/dist/src/services/skill-installation.uninstall.js +252 -0
- package/dist/src/services/skill-installation.uninstall.js.map +1 -0
- package/dist/src/services/skill-manifest.d.ts +41 -0
- package/dist/src/services/skill-manifest.d.ts.map +1 -1
- package/dist/src/services/skill-manifest.js +93 -0
- package/dist/src/services/skill-manifest.js.map +1 -1
- package/dist/src/services/skill-manifest.test.js +27 -0
- package/dist/src/services/skill-manifest.test.js.map +1 -1
- package/dist/src/sync/SyncEngine.d.ts.map +1 -1
- package/dist/src/sync/SyncEngine.js +69 -77
- package/dist/src/sync/SyncEngine.js.map +1 -1
- package/dist/src/telemetry/agent-marker.d.ts +8 -0
- package/dist/src/telemetry/agent-marker.d.ts.map +1 -1
- package/dist/src/telemetry/agent-marker.js +7 -0
- package/dist/src/telemetry/agent-marker.js.map +1 -1
- package/dist/src/telemetry/agent-marker.test.js +7 -1
- package/dist/src/telemetry/agent-marker.test.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +1 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/wrap.d.ts +6 -0
- package/dist/src/telemetry/wrap.d.ts.map +1 -1
- package/dist/src/telemetry/wrap.js +65 -10
- package/dist/src/telemetry/wrap.js.map +1 -1
- package/dist/src/telemetry/wrap.test.js +81 -1
- package/dist/src/telemetry/wrap.test.js.map +1 -1
- package/dist/src/telemetry/wrap.tool-call-sink.test.d.ts +26 -0
- package/dist/src/telemetry/wrap.tool-call-sink.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.tool-call-sink.test.js +162 -0
- package/dist/src/telemetry/wrap.tool-call-sink.test.js.map +1 -0
- package/dist/src/types/skill.d.ts +9 -1
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/utils/index.d.ts +2 -1
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +3 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/skill-name.d.ts +19 -0
- package/dist/src/utils/skill-name.d.ts.map +1 -0
- package/dist/src/utils/skill-name.js +26 -0
- package/dist/src/utils/skill-name.js.map +1 -0
- package/dist/src/utils/skill-name.test.d.ts +2 -0
- package/dist/src/utils/skill-name.test.d.ts.map +1 -0
- package/dist/src/utils/skill-name.test.js +34 -0
- package/dist/src/utils/skill-name.test.js.map +1 -0
- package/dist/src/utils/version-check.d.ts +61 -0
- package/dist/src/utils/version-check.d.ts.map +1 -1
- package/dist/src/utils/version-check.js +78 -1
- package/dist/src/utils/version-check.js.map +1 -1
- package/dist/src/utils/version-check.test.js +130 -1
- package/dist/src/utils/version-check.test.js.map +1 -1
- package/dist/tests/db/migration-runner-race.test.js +19 -9
- package/dist/tests/db/migration-runner-race.test.js.map +1 -1
- package/dist/tests/install/fan-out.test.js +27 -0
- package/dist/tests/install/fan-out.test.js.map +1 -1
- package/dist/tests/security/ContinuousSecurity.performance.test.js +12 -7
- package/dist/tests/security/ContinuousSecurity.performance.test.js.map +1 -1
- package/dist/tests/security/ContinuousSecurity.test.js +14 -2
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security/ai-defence-multiline-promotion.test.d.ts +10 -12
- package/dist/tests/security/ai-defence-multiline-promotion.test.d.ts.map +1 -1
- package/dist/tests/security/ai-defence-multiline-promotion.test.js +26 -33
- package/dist/tests/security/ai-defence-multiline-promotion.test.js.map +1 -1
- package/dist/tests/security/nested-instruction-long-attribute.test.js +20 -10
- package/dist/tests/security/nested-instruction-long-attribute.test.js.map +1 -1
- package/dist/tests/security/scanner-evidence-tiers.test.js +15 -0
- package/dist/tests/security/scanner-evidence-tiers.test.js.map +1 -1
- package/dist/tests/security/scanner-multiline-cap.test.d.ts +21 -0
- package/dist/tests/security/scanner-multiline-cap.test.d.ts.map +1 -0
- package/dist/tests/security/scanner-multiline-cap.test.js +152 -0
- package/dist/tests/security/scanner-multiline-cap.test.js.map +1 -0
- package/dist/tests/security/scanner-regression-guard.test.js +37 -0
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/dist/tests/security/scanner-witness-sw1.test.d.ts +32 -0
- package/dist/tests/security/scanner-witness-sw1.test.d.ts.map +1 -0
- package/dist/tests/security/scanner-witness-sw1.test.js +255 -0
- package/dist/tests/security/scanner-witness-sw1.test.js.map +1 -0
- package/dist/tests/security/sensitive-path-adversarial-review.test.d.ts +2 -0
- package/dist/tests/security/sensitive-path-adversarial-review.test.d.ts.map +1 -0
- package/dist/tests/security/sensitive-path-adversarial-review.test.js +193 -0
- package/dist/tests/security/sensitive-path-adversarial-review.test.js.map +1 -0
- package/dist/tests/security/sensitive-path-fp.test.js +248 -0
- package/dist/tests/security/sensitive-path-fp.test.js.map +1 -1
- package/dist/tests/security/smi5879-corroboration.core.test.js +44 -0
- package/dist/tests/security/smi5879-corroboration.core.test.js.map +1 -1
- package/dist/tests/security/weak-password-lexicon.test.d.ts +18 -0
- package/dist/tests/security/weak-password-lexicon.test.d.ts.map +1 -0
- package/dist/tests/security/weak-password-lexicon.test.js +122 -0
- package/dist/tests/security/weak-password-lexicon.test.js.map +1 -0
- package/dist/tests/skill-scanner/allowlist.test.js +58 -4
- package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
- package/dist/tests/skill-scanner/categorizer.test.d.ts +2 -0
- package/dist/tests/skill-scanner/categorizer.test.d.ts.map +1 -0
- package/dist/tests/skill-scanner/categorizer.test.js +71 -0
- package/dist/tests/skill-scanner/categorizer.test.js.map +1 -0
- package/dist/tests/skill-scanner/cli-guard.test.d.ts +23 -0
- package/dist/tests/skill-scanner/cli-guard.test.d.ts.map +1 -0
- package/dist/tests/skill-scanner/cli-guard.test.js +71 -0
- package/dist/tests/skill-scanner/cli-guard.test.js.map +1 -0
- package/dist/tests/sync/SyncEngine.abort.test.js +15 -11
- package/dist/tests/sync/SyncEngine.abort.test.js.map +1 -1
- package/dist/tests/sync/SyncEngine.status.test.js +1 -1
- package/dist/tests/sync/SyncEngine.status.test.js.map +1 -1
- package/dist/tests/sync/SyncEngine.test.d.ts +11 -2
- package/dist/tests/sync/SyncEngine.test.d.ts.map +1 -1
- package/dist/tests/sync/SyncEngine.test.js +164 -13
- package/dist/tests/sync/SyncEngine.test.js.map +1 -1
- package/dist/tests/unit/migrations/migration-v18.test.d.ts +16 -0
- package/dist/tests/unit/migrations/migration-v18.test.d.ts.map +1 -0
- package/dist/tests/unit/migrations/migration-v18.test.js +192 -0
- package/dist/tests/unit/migrations/migration-v18.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.content.test.js +101 -1
- package/dist/tests/unit/services/skill-installation.content.test.js.map +1 -1
- package/dist/tests/unit/services/skill-installation.service.sensitive-path-fp.test.d.ts +29 -0
- package/dist/tests/unit/services/skill-installation.service.sensitive-path-fp.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.service.sensitive-path-fp.test.js +200 -0
- package/dist/tests/unit/services/skill-installation.service.sensitive-path-fp.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.service.test.js +9 -8
- package/dist/tests/unit/services/skill-installation.service.test.js.map +1 -1
- package/dist/tests/unit/sync-engine.source-aware.test.js +5 -5
- package/dist/tests/unit/sync-engine.source-aware.test.js.map +1 -1
- package/package.json +7 -2
|
@@ -19,7 +19,8 @@ import { createHash } from 'crypto';
|
|
|
19
19
|
import { CacheRepository } from '../repositories/CacheRepository.js';
|
|
20
20
|
import { analyzeSkill, quickTransformCheck } from './SkillAnalyzer.js';
|
|
21
21
|
import { decomposeSkill, parallelizeTaskCalls, } from './SkillDecomposer.js';
|
|
22
|
-
import { generateSubagent
|
|
22
|
+
import { generateSubagent } from './SubagentGenerator.js';
|
|
23
|
+
import { CANONICAL_CLIENT } from '../install/paths.js';
|
|
23
24
|
const DEFAULT_OPTIONS = {
|
|
24
25
|
cacheTtl: 3600, // 1 hour
|
|
25
26
|
enableCache: true,
|
|
@@ -58,9 +59,13 @@ export class TransformationService {
|
|
|
58
59
|
* @param skillName - Human-readable skill name
|
|
59
60
|
* @param description - Skill description
|
|
60
61
|
* @param content - The full SKILL.md content
|
|
62
|
+
* @param client - SMI-6276: target client for the generated companion-agent
|
|
63
|
+
* frontmatter shape (default: canonical / `claude-code`, preserving prior
|
|
64
|
+
* behavior for every existing caller). See
|
|
65
|
+
* `SubagentGenerator.client-profiles.ts`.
|
|
61
66
|
* @returns Transformation result
|
|
62
67
|
*/
|
|
63
|
-
async transform(skillId, skillName, description, content) {
|
|
68
|
+
async transform(skillId, skillName, description, content, client = CANONICAL_CLIENT) {
|
|
64
69
|
const startTime = Date.now();
|
|
65
70
|
// SMI-1791: Validate content length to prevent DoS
|
|
66
71
|
if (content.length > MAX_CONTENT_LENGTH) {
|
|
@@ -68,7 +73,7 @@ export class TransformationService {
|
|
|
68
73
|
}
|
|
69
74
|
// Check cache first (unless force transform)
|
|
70
75
|
if (!this.options.forceTransform && this.cache) {
|
|
71
|
-
const cached = this.getCachedTransformation(skillId, content);
|
|
76
|
+
const cached = this.getCachedTransformation(skillId, content, client);
|
|
72
77
|
if (cached) {
|
|
73
78
|
return cached;
|
|
74
79
|
}
|
|
@@ -79,7 +84,7 @@ export class TransformationService {
|
|
|
79
84
|
const result = this.createMinimalResult(content, startTime);
|
|
80
85
|
// Cache the result
|
|
81
86
|
if (this.cache) {
|
|
82
|
-
this.cacheTransformation(skillId, content, result);
|
|
87
|
+
this.cacheTransformation(skillId, content, result, client);
|
|
83
88
|
}
|
|
84
89
|
return result;
|
|
85
90
|
}
|
|
@@ -96,12 +101,12 @@ export class TransformationService {
|
|
|
96
101
|
// 2. Decompose if needed
|
|
97
102
|
const decomposition = decomposeSkill(transformedContent, analysis);
|
|
98
103
|
// 3. Generate subagent if beneficial
|
|
99
|
-
const subagentResult = generateSubagent(skillName, description, content, analysis);
|
|
104
|
+
const subagentResult = generateSubagent(skillName, description, content, analysis, client);
|
|
100
105
|
// Build result
|
|
101
106
|
const result = this.buildResult(decomposition, subagentResult, analysis, tasksParallelized, startTime);
|
|
102
107
|
// Cache the result
|
|
103
108
|
if (this.cache) {
|
|
104
|
-
this.cacheTransformation(skillId, content, result);
|
|
109
|
+
this.cacheTransformation(skillId, content, result, client);
|
|
105
110
|
}
|
|
106
111
|
return result;
|
|
107
112
|
}
|
|
@@ -114,9 +119,11 @@ export class TransformationService {
|
|
|
114
119
|
* @param skillName - Human-readable skill name
|
|
115
120
|
* @param description - Skill description
|
|
116
121
|
* @param content - The full SKILL.md content
|
|
122
|
+
* @param client - SMI-6276: target client for the generated companion-agent
|
|
123
|
+
* frontmatter shape (default: canonical / `claude-code`).
|
|
117
124
|
* @returns Transformation result
|
|
118
125
|
*/
|
|
119
|
-
transformWithoutCache(skillName, description, content) {
|
|
126
|
+
transformWithoutCache(skillName, description, content, client = CANONICAL_CLIENT) {
|
|
120
127
|
const startTime = Date.now();
|
|
121
128
|
// SMI-1791: Validate content length to prevent DoS
|
|
122
129
|
if (content.length > MAX_CONTENT_LENGTH) {
|
|
@@ -139,7 +146,7 @@ export class TransformationService {
|
|
|
139
146
|
// 2. Decompose if needed
|
|
140
147
|
const decomposition = decomposeSkill(transformedContent, analysis);
|
|
141
148
|
// 3. Generate subagent if beneficial
|
|
142
|
-
const subagentResult = generateSubagent(skillName, description, content, analysis);
|
|
149
|
+
const subagentResult = generateSubagent(skillName, description, content, analysis, client);
|
|
143
150
|
return this.buildResult(decomposition, subagentResult, analysis, tasksParallelized, startTime);
|
|
144
151
|
}
|
|
145
152
|
/**
|
|
@@ -154,11 +161,11 @@ export class TransformationService {
|
|
|
154
161
|
/**
|
|
155
162
|
* Get cached transformation if available and valid
|
|
156
163
|
*/
|
|
157
|
-
getCachedTransformation(skillId, content) {
|
|
164
|
+
getCachedTransformation(skillId, content, client) {
|
|
158
165
|
if (!this.cache)
|
|
159
166
|
return null;
|
|
160
167
|
try {
|
|
161
|
-
const cacheKey = this.buildCacheKey(skillId);
|
|
168
|
+
const cacheKey = this.buildCacheKey(skillId, client);
|
|
162
169
|
const cached = this.cache.get(cacheKey);
|
|
163
170
|
if (!cached)
|
|
164
171
|
return null;
|
|
@@ -183,11 +190,11 @@ export class TransformationService {
|
|
|
183
190
|
/**
|
|
184
191
|
* Cache a transformation result
|
|
185
192
|
*/
|
|
186
|
-
cacheTransformation(skillId, content, result) {
|
|
193
|
+
cacheTransformation(skillId, content, result, client) {
|
|
187
194
|
if (!this.cache)
|
|
188
195
|
return;
|
|
189
196
|
try {
|
|
190
|
-
const cacheKey = this.buildCacheKey(skillId);
|
|
197
|
+
const cacheKey = this.buildCacheKey(skillId, client);
|
|
191
198
|
const contentHash = this.hashContent(content);
|
|
192
199
|
const cacheEntry = {
|
|
193
200
|
result,
|
|
@@ -203,10 +210,13 @@ export class TransformationService {
|
|
|
203
210
|
}
|
|
204
211
|
}
|
|
205
212
|
/**
|
|
206
|
-
* Build cache key for a skill
|
|
213
|
+
* Build cache key for a skill. Includes `client` (SMI-6276 pr-reviewer
|
|
214
|
+
* finding) -- without it, a cached transformation generated for one
|
|
215
|
+
* client's frontmatter shape gets silently served back for a different
|
|
216
|
+
* client, defeating the whole point of client-parameterized generation.
|
|
207
217
|
*/
|
|
208
|
-
buildCacheKey(skillId) {
|
|
209
|
-
return `${CACHE_KEY_PREFIX}${skillId}`;
|
|
218
|
+
buildCacheKey(skillId, client) {
|
|
219
|
+
return `${CACHE_KEY_PREFIX}${skillId}:${client}`;
|
|
210
220
|
}
|
|
211
221
|
/**
|
|
212
222
|
* SMI-1790: Compute SHA-256 hash for content comparison
|
|
@@ -305,11 +315,13 @@ export class TransformationService {
|
|
|
305
315
|
* @param skillName - Human-readable skill name
|
|
306
316
|
* @param description - Skill description
|
|
307
317
|
* @param content - The full SKILL.md content
|
|
318
|
+
* @param client - SMI-6276: target client for the generated companion-agent
|
|
319
|
+
* frontmatter shape (default: canonical / `claude-code`).
|
|
308
320
|
* @returns Transformation result
|
|
309
321
|
*/
|
|
310
|
-
export function transformSkill(skillName, description, content) {
|
|
322
|
+
export function transformSkill(skillName, description, content, client = CANONICAL_CLIENT) {
|
|
311
323
|
const service = new TransformationService();
|
|
312
|
-
return service.transformWithoutCache(skillName, description, content);
|
|
324
|
+
return service.transformWithoutCache(skillName, description, content, client);
|
|
313
325
|
}
|
|
314
326
|
export default TransformationService;
|
|
315
327
|
//# sourceMappingURL=TransformationService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformationService.js","sourceRoot":"","sources":["../../../src/services/TransformationService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAsB,MAAM,oBAAoB,CAAA;AAC1F,OAAO,EACL,cAAc,EACd,oBAAoB,GAErB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"TransformationService.js","sourceRoot":"","sources":["../../../src/services/TransformationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for `TransformationService.ts` — split out (SMI-6276)
|
|
3
|
+
* when the `client` parameter threaded through by Wave 6 Step 1 pushed the
|
|
4
|
+
* combined file past the 500-line standard. Re-exported verbatim from
|
|
5
|
+
* `TransformationService.ts` so its own public import path is unaffected.
|
|
6
|
+
*/
|
|
7
|
+
import type { SkillAnalysis } from './SkillAnalyzer.js';
|
|
8
|
+
import type { SubagentDefinition } from './SubagentGenerator.js';
|
|
9
|
+
/**
|
|
10
|
+
* Full transformation result for a skill
|
|
11
|
+
*/
|
|
12
|
+
export interface TransformationResult {
|
|
13
|
+
/** Whether transformation was applied */
|
|
14
|
+
transformed: boolean;
|
|
15
|
+
/** The optimized main SKILL.md content */
|
|
16
|
+
mainSkillContent: string;
|
|
17
|
+
/** Sub-skills (if decomposed) */
|
|
18
|
+
subSkills: Array<{
|
|
19
|
+
filename: string;
|
|
20
|
+
content: string;
|
|
21
|
+
}>;
|
|
22
|
+
/** Companion subagent (if generated) */
|
|
23
|
+
subagent?: SubagentDefinition;
|
|
24
|
+
/** CLAUDE.md integration snippet */
|
|
25
|
+
claudeMdSnippet?: string;
|
|
26
|
+
/** Transformation statistics */
|
|
27
|
+
stats: TransformationStats;
|
|
28
|
+
/** Analysis that informed the transformation */
|
|
29
|
+
analysis: SkillAnalysis;
|
|
30
|
+
/** Attribution footer added to content */
|
|
31
|
+
attribution: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Statistics about the transformation
|
|
35
|
+
*/
|
|
36
|
+
export interface TransformationStats {
|
|
37
|
+
/** Original content line count */
|
|
38
|
+
originalLines: number;
|
|
39
|
+
/** Optimized main skill line count */
|
|
40
|
+
optimizedLines: number;
|
|
41
|
+
/** Number of sub-skills extracted */
|
|
42
|
+
subSkillCount: number;
|
|
43
|
+
/** Whether Task() calls were parallelized */
|
|
44
|
+
tasksParallelized: boolean;
|
|
45
|
+
/** Whether subagent was generated */
|
|
46
|
+
subagentGenerated: boolean;
|
|
47
|
+
/** Estimated token reduction percentage */
|
|
48
|
+
tokenReductionPercent: number;
|
|
49
|
+
/** Transformation duration in ms */
|
|
50
|
+
transformDurationMs: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Cached transformation entry
|
|
54
|
+
*/
|
|
55
|
+
export interface CachedTransformation {
|
|
56
|
+
result: TransformationResult;
|
|
57
|
+
skillHash: string;
|
|
58
|
+
cachedAt: string;
|
|
59
|
+
version: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Configuration for TransformationService
|
|
63
|
+
*/
|
|
64
|
+
export interface TransformationServiceOptions {
|
|
65
|
+
/** Cache TTL in seconds (default: 3600 = 1 hour) */
|
|
66
|
+
cacheTtl?: number;
|
|
67
|
+
/** Enable caching (default: true) */
|
|
68
|
+
enableCache?: boolean;
|
|
69
|
+
/** Force re-transformation even if cached (default: false) */
|
|
70
|
+
forceTransform?: boolean;
|
|
71
|
+
/** Transformation version for cache invalidation */
|
|
72
|
+
version?: string;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=TransformationService.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransformationService.types.d.ts","sourceRoot":"","sources":["../../../src/services/TransformationService.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAEhE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,WAAW,EAAE,OAAO,CAAA;IAEpB,0CAA0C;IAC1C,gBAAgB,EAAE,MAAM,CAAA;IAExB,iCAAiC;IACjC,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAC,CAAA;IAEF,wCAAwC;IACxC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAE7B,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB,gCAAgC;IAChC,KAAK,EAAE,mBAAmB,CAAA;IAE1B,gDAAgD;IAChD,QAAQ,EAAE,aAAa,CAAA;IAEvB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,aAAa,EAAE,MAAM,CAAA;IAErB,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAA;IAEtB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAA;IAErB,6CAA6C;IAC7C,iBAAiB,EAAE,OAAO,CAAA;IAE1B,qCAAqC;IACrC,iBAAiB,EAAE,OAAO,CAAA;IAE1B,2CAA2C;IAC3C,qBAAqB,EAAE,MAAM,CAAA;IAE7B,oCAAoC;IACpC,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,oBAAoB,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,qCAAqC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,OAAO,CAAA;IAExB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for `TransformationService.ts` — split out (SMI-6276)
|
|
3
|
+
* when the `client` parameter threaded through by Wave 6 Step 1 pushed the
|
|
4
|
+
* combined file past the 500-line standard. Re-exported verbatim from
|
|
5
|
+
* `TransformationService.ts` so its own public import path is unaffected.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=TransformationService.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransformationService.types.js","sourceRoot":"","sources":["../../../src/services/TransformationService.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubagentGenerator.client-profiles.test.d.ts","sourceRoot":"","sources":["../../../../src/services/__tests__/SubagentGenerator.client-profiles.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tests for SubagentGenerator.client-profiles (SMI-6276)
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { CLIENT_IDS } from '../../install/paths.js';
|
|
6
|
+
import { SUBAGENT_CLIENT_PROFILES, getSubagentGenerationProfile, mapToolNames, } from '../SubagentGenerator.client-profiles.js';
|
|
7
|
+
describe('SubagentGenerator.client-profiles', () => {
|
|
8
|
+
describe('SUBAGENT_CLIENT_PROFILES', () => {
|
|
9
|
+
it('has an entry for every ClientId', () => {
|
|
10
|
+
for (const client of CLIENT_IDS) {
|
|
11
|
+
expect(SUBAGENT_CLIENT_PROFILES[client]).toBeDefined();
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
it('gives cursor the exact same profile object as claude-code (deliberate reuse)', () => {
|
|
15
|
+
expect(SUBAGENT_CLIENT_PROFILES.cursor).toBe(SUBAGENT_CLIENT_PROFILES['claude-code']);
|
|
16
|
+
});
|
|
17
|
+
it('claude-code accepts Claude-native tools and a Claude model enum', () => {
|
|
18
|
+
const profile = SUBAGENT_CLIENT_PROFILES['claude-code'];
|
|
19
|
+
expect(profile.toolsPolicy).toBe('claude-native');
|
|
20
|
+
expect(profile.modelPolicy).toBe('claude-enum');
|
|
21
|
+
expect(profile.includeSkillsField).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
it('antigravity uses a mapped tool array and omits the model field', () => {
|
|
24
|
+
const profile = SUBAGENT_CLIENT_PROFILES.antigravity;
|
|
25
|
+
expect(profile.toolsPolicy).toBe('mapped-array');
|
|
26
|
+
expect(profile.modelPolicy).toBe('omit');
|
|
27
|
+
expect(profile.includeSkillsField).toBe(false);
|
|
28
|
+
expect(profile.toolNameMap).toBeDefined();
|
|
29
|
+
});
|
|
30
|
+
it('opencode includes the mode: subagent line but omits tools/model', () => {
|
|
31
|
+
const profile = SUBAGENT_CLIENT_PROFILES.opencode;
|
|
32
|
+
expect(profile.toolsPolicy).toBe('omit');
|
|
33
|
+
expect(profile.modelPolicy).toBe('omit');
|
|
34
|
+
expect(profile.extraFrontmatterLines).toContain('mode: subagent');
|
|
35
|
+
});
|
|
36
|
+
it('every unverified-vocabulary client (copilot/windsurf/agents/hermes/grok) omits tools and model', () => {
|
|
37
|
+
for (const client of ['copilot', 'windsurf', 'agents', 'hermes', 'grok']) {
|
|
38
|
+
const profile = SUBAGENT_CLIENT_PROFILES[client];
|
|
39
|
+
expect(profile.toolsPolicy).toBe('omit');
|
|
40
|
+
expect(profile.modelPolicy).toBe('omit');
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('getSubagentGenerationProfile', () => {
|
|
45
|
+
it('defaults to the claude-code (canonical) profile when no client is given', () => {
|
|
46
|
+
expect(getSubagentGenerationProfile()).toBe(SUBAGENT_CLIENT_PROFILES['claude-code']);
|
|
47
|
+
});
|
|
48
|
+
it('resolves the antigravity profile by name', () => {
|
|
49
|
+
expect(getSubagentGenerationProfile('antigravity')).toBe(SUBAGENT_CLIENT_PROFILES.antigravity);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('mapToolNames', () => {
|
|
53
|
+
const antigravityProfile = SUBAGENT_CLIENT_PROFILES.antigravity;
|
|
54
|
+
it('maps confirmed Skillsmith tool names to AntiGravity-own identifiers', () => {
|
|
55
|
+
const mapped = mapToolNames(['Read', 'Bash', 'Grep'], antigravityProfile);
|
|
56
|
+
expect(mapped).toEqual(['view_file', 'run_command', 'grep_search']);
|
|
57
|
+
});
|
|
58
|
+
it('deduplicates Write and Edit onto the same AntiGravity tool', () => {
|
|
59
|
+
const mapped = mapToolNames(['Write', 'Edit'], antigravityProfile);
|
|
60
|
+
expect(mapped).toEqual(['replace_file_content']);
|
|
61
|
+
});
|
|
62
|
+
it('silently drops internal tool names with no confirmed AntiGravity mapping', () => {
|
|
63
|
+
const mapped = mapToolNames(['Glob', 'WebFetch', 'WebSearch'], antigravityProfile);
|
|
64
|
+
expect(mapped).toEqual([]);
|
|
65
|
+
});
|
|
66
|
+
it('returns an empty array for a profile with no toolNameMap', () => {
|
|
67
|
+
const mapped = mapToolNames(['Read', 'Bash'], SUBAGENT_CLIENT_PROFILES['claude-code']);
|
|
68
|
+
expect(mapped).toEqual([]);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=SubagentGenerator.client-profiles.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubagentGenerator.client-profiles.test.js","sourceRoot":"","sources":["../../../../src/services/__tests__/SubagentGenerator.client-profiles.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubagentGenerator.helpers.test.d.ts","sourceRoot":"","sources":["../../../../src/services/__tests__/SubagentGenerator.helpers.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tests for `SubagentGenerator.helpers.ts` — split from
|
|
3
|
+
* `SubagentGenerator.ts` (SMI-6276 Wave 6 Step 1, 500-line standard).
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import { extractTriggerPhrases } from '../SubagentGenerator.helpers.js';
|
|
7
|
+
describe('extractTriggerPhrases', () => {
|
|
8
|
+
it('extracts phrases from normal descriptions and content', () => {
|
|
9
|
+
const phrases = extractTriggerPhrases('Use this when you need to test REST APIs.', 'This skill helps you validate API responses.');
|
|
10
|
+
expect(phrases.length).toBeGreaterThan(0);
|
|
11
|
+
expect(phrases.length).toBeLessThanOrEqual(5);
|
|
12
|
+
});
|
|
13
|
+
it('returns an empty array for content with no trigger-like phrasing', () => {
|
|
14
|
+
const phrases = extractTriggerPhrases('A skill', 'Nothing special here');
|
|
15
|
+
expect(Array.isArray(phrases)).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
// CodeQL finding (SMI-6276, "polynomial regular expression used on
|
|
18
|
+
// uncontrolled data"): the pre-fix patterns paired an optional word group
|
|
19
|
+
// directly against an unbounded lazy wildcard capture, giving
|
|
20
|
+
// polynomially-many ways to split ambiguous repeated content between "the
|
|
21
|
+
// optional group matched" and "the wildcard consumed it instead" --
|
|
22
|
+
// `description` here is NOT length-capped before reaching these patterns
|
|
23
|
+
// (only `content` is sliced to 2000 chars), and is untrusted,
|
|
24
|
+
// externally-authored text in a skill registry — a genuine attack
|
|
25
|
+
// surface. Empirically confirmed (not just theoretical) before this fix:
|
|
26
|
+
// the exact 3-pattern loop below, run against a ~32KB adversarial
|
|
27
|
+
// description built the same way as this test's input, took ~1.25s
|
|
28
|
+
// pre-fix and ~7ms post-fix on this same test machine -- a real,
|
|
29
|
+
// measurable quadratic-ish blowup a large-enough description would turn
|
|
30
|
+
// into a genuine multi-second-or-more DoS.
|
|
31
|
+
it('does not exhibit polynomial-time blowup on adversarial "helps ... tasks" input (ReDoS)', () => {
|
|
32
|
+
const adversarialDescription = 'helps you to ' + 'a '.repeat(16000) + 'nomatch';
|
|
33
|
+
const start = Date.now();
|
|
34
|
+
const phrases = extractTriggerPhrases(adversarialDescription, '');
|
|
35
|
+
const elapsedMs = Date.now() - start;
|
|
36
|
+
expect(Array.isArray(phrases)).toBe(true);
|
|
37
|
+
// The fixed patterns finish in single-digit milliseconds regardless of
|
|
38
|
+
// input size (bounded capture groups cap worst-case per-position work
|
|
39
|
+
// to a small constant); the pre-fix patterns measured ~1250ms on this
|
|
40
|
+
// exact input on this machine. 1000ms leaves generous CI-jitter
|
|
41
|
+
// headroom while still failing hard on any reintroduction of the
|
|
42
|
+
// unbounded-wildcard shape.
|
|
43
|
+
expect(elapsedMs).toBeLessThan(1000);
|
|
44
|
+
});
|
|
45
|
+
it('does not exhibit polynomial-time blowup on adversarial "when ... need to" input (ReDoS)', () => {
|
|
46
|
+
const adversarialDescription = 'when ' + 'you need to '.repeat(16000) + 'nomatch';
|
|
47
|
+
const start = Date.now();
|
|
48
|
+
const phrases = extractTriggerPhrases(adversarialDescription, '');
|
|
49
|
+
const elapsedMs = Date.now() - start;
|
|
50
|
+
expect(Array.isArray(phrases)).toBe(true);
|
|
51
|
+
expect(elapsedMs).toBeLessThan(1000);
|
|
52
|
+
});
|
|
53
|
+
it('still caps extracted phrases at the existing 50-character limit', () => {
|
|
54
|
+
const longDescription = 'when you need to ' + 'x'.repeat(200) + '.';
|
|
55
|
+
const phrases = extractTriggerPhrases(longDescription, '');
|
|
56
|
+
for (const phrase of phrases) {
|
|
57
|
+
expect(phrase.length).toBeLessThanOrEqual(50);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=SubagentGenerator.helpers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubagentGenerator.helpers.test.js","sourceRoot":"","sources":["../../../../src/services/__tests__/SubagentGenerator.helpers.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,16 @@
|
|
|
3
3
|
* Part of Skillsmith Optimization Layer
|
|
4
4
|
*/
|
|
5
5
|
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import { parse as parseYaml } from 'yaml';
|
|
6
7
|
import { generateSubagent, generateMinimalSubagent } from '../SubagentGenerator.js';
|
|
7
8
|
import { analyzeSkill } from '../SkillAnalyzer.js';
|
|
9
|
+
/** Extract just the frontmatter block (between the two `---` markers) as raw text. */
|
|
10
|
+
function extractFrontmatter(content) {
|
|
11
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
12
|
+
if (!match)
|
|
13
|
+
throw new Error('No frontmatter block found in generated content');
|
|
14
|
+
return match[1];
|
|
15
|
+
}
|
|
8
16
|
describe('SubagentGenerator', () => {
|
|
9
17
|
describe('generateSubagent', () => {
|
|
10
18
|
it('should not generate subagent for simple skills', () => {
|
|
@@ -169,6 +177,153 @@ Write output files.
|
|
|
169
177
|
const result = generateMinimalSubagent('write-skill', 'Write skill', content);
|
|
170
178
|
expect(result.subagent?.tools).toContain('Read');
|
|
171
179
|
});
|
|
180
|
+
it('threads the client parameter through to a client-specific frontmatter shape', () => {
|
|
181
|
+
const content = `# Skill\n\nRun bash commands. Search for patterns using grep.`;
|
|
182
|
+
const result = generateMinimalSubagent('client-skill', 'Client skill', content, 'antigravity');
|
|
183
|
+
expect(result.generated).toBe(true);
|
|
184
|
+
expect(result.subagent?.content).not.toMatch(/^tools: /m);
|
|
185
|
+
expect(result.subagent?.content).not.toMatch(/^model: (haiku|sonnet|opus)$/m);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('per-client generation profiles (SMI-6276)', () => {
|
|
189
|
+
// Mirrors the existing heavy-tool-usage fixture above so `suggestsSubagent`
|
|
190
|
+
// reliably trips — plus lines that hit Read/Bash/Grep detection so the
|
|
191
|
+
// AntiGravity mapped-array assertions below have something to map.
|
|
192
|
+
const heavyToolContent = `---
|
|
193
|
+
name: multi-client-skill
|
|
194
|
+
description: Exercises heavy tool usage across bash, grep, and file reads
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
# Multi Client Skill
|
|
198
|
+
|
|
199
|
+
This skill runs many commands:
|
|
200
|
+
- npm install
|
|
201
|
+
- git status
|
|
202
|
+
- docker build
|
|
203
|
+
- npx something
|
|
204
|
+
- yarn add
|
|
205
|
+
- pnpm install
|
|
206
|
+
|
|
207
|
+
Use bash to execute commands.
|
|
208
|
+
Terminal operations are common.
|
|
209
|
+
Read files to examine content before changes.
|
|
210
|
+
Search for patterns using grep.
|
|
211
|
+
`;
|
|
212
|
+
const description = 'Exercises heavy tool usage across bash, grep, and file reads';
|
|
213
|
+
const analysis = analyzeSkill(heavyToolContent);
|
|
214
|
+
it('generates distinct frontmatter for Claude Code, Cursor, AntiGravity, and an omit-fallback client in the same run', () => {
|
|
215
|
+
const claudeResult = generateSubagent('multi-client-skill', description, heavyToolContent, analysis, 'claude-code');
|
|
216
|
+
const cursorResult = generateSubagent('multi-client-skill', description, heavyToolContent, analysis, 'cursor');
|
|
217
|
+
const antigravityResult = generateSubagent('multi-client-skill', description, heavyToolContent, analysis, 'antigravity');
|
|
218
|
+
const copilotResult = generateSubagent('multi-client-skill', description, heavyToolContent, analysis, 'copilot');
|
|
219
|
+
expect(claudeResult.generated).toBe(true);
|
|
220
|
+
expect(cursorResult.generated).toBe(true);
|
|
221
|
+
expect(antigravityResult.generated).toBe(true);
|
|
222
|
+
expect(copilotResult.generated).toBe(true);
|
|
223
|
+
const claudeContent = claudeResult.subagent.content;
|
|
224
|
+
const cursorContent = cursorResult.subagent.content;
|
|
225
|
+
const antigravityContent = antigravityResult.subagent.content;
|
|
226
|
+
const copilotContent = copilotResult.subagent.content;
|
|
227
|
+
// Claude Code: Claude-native comma-list tools + a Claude model enum value.
|
|
228
|
+
expect(claudeContent).toMatch(/^tools: .*Read/m);
|
|
229
|
+
expect(claudeContent).toMatch(/^model: (haiku|sonnet|opus)$/m);
|
|
230
|
+
// Cursor deliberately mirrors Claude Code — COMPANION_AGENT_TARGETS.cursor
|
|
231
|
+
// resolves to the SAME `.claude/agents/` file, which Cursor reads as a
|
|
232
|
+
// documented compatibility surface (see client-profiles.ts header) — so
|
|
233
|
+
// identical output here is the intended, evidence-backed behavior, not
|
|
234
|
+
// an accidental fallback to a shared default.
|
|
235
|
+
expect(cursorContent).toEqual(claudeContent);
|
|
236
|
+
// AntiGravity: genuinely different shape — proves this isn't just
|
|
237
|
+
// Cursor's case reused everywhere. No Claude-shaped scalar `tools:`
|
|
238
|
+
// line, no Claude model enum value, and its OWN mapped vocabulary
|
|
239
|
+
// rendered as a real YAML array (not a comma-joined string).
|
|
240
|
+
expect(antigravityContent).not.toMatch(/^tools: /m);
|
|
241
|
+
expect(antigravityContent).not.toContain('Read,');
|
|
242
|
+
expect(antigravityContent).not.toMatch(/^model: (haiku|sonnet|opus)$/m);
|
|
243
|
+
expect(antigravityContent).toMatch(/^tools:$/m);
|
|
244
|
+
expect(antigravityContent).toContain(' - run_command');
|
|
245
|
+
expect(antigravityContent).toContain(' - grep_search');
|
|
246
|
+
expect(antigravityContent).toContain(' - view_file');
|
|
247
|
+
// Step 2 is a separate, independent question (not this wave's scope) —
|
|
248
|
+
// regression-pin that this wave's fix does not touch it either way.
|
|
249
|
+
expect(antigravityContent).not.toMatch(/^subagent:/m);
|
|
250
|
+
// Copilot: the unverified-vocabulary fallback path — omits both fields
|
|
251
|
+
// entirely rather than guessing a partial/wrong mapping.
|
|
252
|
+
expect(copilotContent).not.toMatch(/^tools:/m);
|
|
253
|
+
expect(copilotContent).not.toMatch(/^model:/m);
|
|
254
|
+
// Every client still gets the universal minimum (name + description).
|
|
255
|
+
for (const content of [claudeContent, cursorContent, antigravityContent, copilotContent]) {
|
|
256
|
+
expect(content).toMatch(/^name: multi-client-skill-specialist$/m);
|
|
257
|
+
expect(content).toMatch(/^description: /m);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
it('emits an AntiGravity tools array using only confirmed identifiers, not Claude names', () => {
|
|
261
|
+
const result = generateSubagent('multi-client-skill', description, heavyToolContent, analysis, 'antigravity');
|
|
262
|
+
const content = result.subagent.content;
|
|
263
|
+
// Never leak Skillsmith's internal Claude-style names into the value.
|
|
264
|
+
expect(content).not.toMatch(/- (Read|Write|Edit|Bash|Grep|Glob|WebFetch|WebSearch)$/m);
|
|
265
|
+
});
|
|
266
|
+
it('gives OpenCode a mode: subagent line but no tools/model fields', () => {
|
|
267
|
+
const result = generateSubagent('multi-client-skill', description, heavyToolContent, analysis, 'opencode');
|
|
268
|
+
const content = result.subagent.content;
|
|
269
|
+
expect(content).toMatch(/^mode: subagent$/m);
|
|
270
|
+
expect(content).not.toMatch(/^tools:/m);
|
|
271
|
+
expect(content).not.toMatch(/^model:/m);
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
// GPT-5.6-Sol round-2 pr-reviewer confirmation (SMI-6276): round 1's fix
|
|
275
|
+
// (JSON.stringify()-quoting the description) was CONFIRMED-FIXED, but the
|
|
276
|
+
// round-1 regression tests only asserted a description LINE existed, never
|
|
277
|
+
// actually exercised a hazardous `: ` or ` #` sequence. This closes that
|
|
278
|
+
// coverage gap by parsing the generated frontmatter with a real YAML
|
|
279
|
+
// parser, proving both that it's syntactically valid AND that the
|
|
280
|
+
// hazardous substrings survive intact rather than corrupting the block.
|
|
281
|
+
describe('YAML-safe description quoting (SMI-6276 round 2)', () => {
|
|
282
|
+
// Heavy tool-usage body (same pattern already proven above in this file)
|
|
283
|
+
// to reliably clear generateSubagent()'s own "worth generating" gate —
|
|
284
|
+
// the hazardous text under test lives only in the `description` argument
|
|
285
|
+
// passed to generateSubagent(), not the source SKILL.md's own frontmatter.
|
|
286
|
+
const heavyToolBody = `---
|
|
287
|
+
name: hazard-skill
|
|
288
|
+
description: A skill with heavy tool usage for YAML-hazard testing
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
# Hazard Skill
|
|
292
|
+
|
|
293
|
+
- npm install
|
|
294
|
+
- git status
|
|
295
|
+
- docker build
|
|
296
|
+
- npx something
|
|
297
|
+
- yarn add
|
|
298
|
+
- pnpm install
|
|
299
|
+
|
|
300
|
+
Use bash to execute commands.
|
|
301
|
+
Terminal operations are common.
|
|
302
|
+
`;
|
|
303
|
+
it('a description containing ": " does not get reinterpreted as a nested YAML key', () => {
|
|
304
|
+
const description = 'Handles config: values and other: colon-separated pairs';
|
|
305
|
+
const analysis = analyzeSkill(heavyToolBody);
|
|
306
|
+
const result = generateSubagent('colon-skill', description, heavyToolBody, analysis);
|
|
307
|
+
const frontmatter = extractFrontmatter(result.subagent.content);
|
|
308
|
+
const parsed = parseYaml(frontmatter);
|
|
309
|
+
// The full description text must survive as ONE string value under the
|
|
310
|
+
// `description` key — not silently truncated, and not exploded into
|
|
311
|
+
// extra top-level keys by an unescaped `: `.
|
|
312
|
+
expect(typeof parsed.description).toBe('string');
|
|
313
|
+
expect(parsed.description).toContain(description);
|
|
314
|
+
expect(Object.keys(parsed)).not.toContain('values and other');
|
|
315
|
+
});
|
|
316
|
+
it('a description containing " #" does not get truncated as a YAML comment', () => {
|
|
317
|
+
const description = 'Fixes issue #123 and #456 before release';
|
|
318
|
+
const analysis = analyzeSkill(heavyToolBody);
|
|
319
|
+
const result = generateSubagent('hash-skill', description, heavyToolBody, analysis);
|
|
320
|
+
const frontmatter = extractFrontmatter(result.subagent.content);
|
|
321
|
+
const parsed = parseYaml(frontmatter);
|
|
322
|
+
expect(typeof parsed.description).toBe('string');
|
|
323
|
+
// Everything after the first ` #` must still be present -- an
|
|
324
|
+
// unquoted scalar would have silently dropped "123 and #456...".
|
|
325
|
+
expect(parsed.description).toContain('#123 and #456 before release');
|
|
326
|
+
});
|
|
172
327
|
});
|
|
173
328
|
});
|
|
174
329
|
//# sourceMappingURL=SubagentGenerator.test.js.map
|