@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
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner — prose lexicons for the SMI-5207 sensitive_path gates
|
|
3
|
+
* @module @skillsmith/core/security/scanner/SecurityScanner.prose-lexicon
|
|
4
|
+
*
|
|
5
|
+
* SMI-5207: NEGATION_TOKENS (MF-3) and PROSE_STOPWORDS (MF-4) split out of
|
|
6
|
+
* SecurityScanner.scanners.ts purely for the 500-line pre-commit gate — the
|
|
7
|
+
* two word lists are ~120 lines once Prettier expands them one entry per
|
|
8
|
+
* line, which would push that file past the limit. No logic lives here; both
|
|
9
|
+
* gates' behaviour is entirely in SecurityScanner.scanners.ts.
|
|
10
|
+
*
|
|
11
|
+
* The two lists have no consumer in common (round 6 deleted MF-3's
|
|
12
|
+
* blockquote-vs-operator content classification, which was the only thing
|
|
13
|
+
* that ever made MF-3 read PROSE_STOPWORDS) — they share a file for the line
|
|
14
|
+
* budget, not because they are one concept. Keep them independently editable.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* MF-3 (SMI-5207, round 3): negation lookaround. A negated verb is not action
|
|
18
|
+
* evidence — "This guide downloads no files and explains ~/.ssh/config"
|
|
19
|
+
* (round-3 counter-example, unquoted prose) must not fire HIGH. The negation
|
|
20
|
+
* token can appear BEFORE ("never uploads") or AFTER ("downloads no files")
|
|
21
|
+
* the verb, so the window is bidirectional. Deliberately narrow: same line
|
|
22
|
+
* only, small window, no general negation engine.
|
|
23
|
+
*/
|
|
24
|
+
export const NEGATION_TOKENS = new Set([
|
|
25
|
+
'no',
|
|
26
|
+
'not',
|
|
27
|
+
'never',
|
|
28
|
+
'without',
|
|
29
|
+
'cannot',
|
|
30
|
+
"can't",
|
|
31
|
+
"doesn't",
|
|
32
|
+
"don't",
|
|
33
|
+
"won't",
|
|
34
|
+
"didn't",
|
|
35
|
+
"isn't",
|
|
36
|
+
"aren't",
|
|
37
|
+
'nor',
|
|
38
|
+
'neither',
|
|
39
|
+
]);
|
|
40
|
+
/**
|
|
41
|
+
* MF-3 (SMI-5207, round 10): determiners that force the NOUN reading of a
|
|
42
|
+
* token which is otherwise spelled like an action verb — "The Downloads
|
|
43
|
+
* folder", "the uploads dashboard", "your downloads".
|
|
44
|
+
*
|
|
45
|
+
* This is a hard grammatical invariant, not a heuristic: an article or
|
|
46
|
+
* possessive determiner cannot be immediately followed by a finite verb in
|
|
47
|
+
* English. So it is applied at distance EXACTLY 1 and nowhere else — "This
|
|
48
|
+
* skill downloads ~/.ssh/id_rsa" keeps firing, because `skill` sits between
|
|
49
|
+
* the determiner and the verb. Demonstratives (this/these/those) are
|
|
50
|
+
* deliberately EXCLUDED: "This downloads the key" is a legitimate verb
|
|
51
|
+
* reading, so they carry real FN risk that the/a/an/possessives do not.
|
|
52
|
+
*/
|
|
53
|
+
export const NOUN_DETERMINERS = new Set([
|
|
54
|
+
'the',
|
|
55
|
+
'a',
|
|
56
|
+
'an',
|
|
57
|
+
'my',
|
|
58
|
+
'your',
|
|
59
|
+
'our',
|
|
60
|
+
'their',
|
|
61
|
+
'its',
|
|
62
|
+
'his',
|
|
63
|
+
'her',
|
|
64
|
+
]);
|
|
65
|
+
/**
|
|
66
|
+
* MF-3 (SMI-5207, round 10): verbs and agent nouns that mark a sentence as
|
|
67
|
+
* DESCRIBING detection rather than instructing an action — "This rule detects
|
|
68
|
+
* malware that steals ~/.ssh/id_rsa". Used only in combination with
|
|
69
|
+
* RELATIVE_MARKERS (see hasActionEvidence); neither signal suppresses on its
|
|
70
|
+
* own, and neither ever suppresses a shell operator.
|
|
71
|
+
*/
|
|
72
|
+
export const DETECTION_FRAMING = new Set([
|
|
73
|
+
'detect',
|
|
74
|
+
'detects',
|
|
75
|
+
'detecting',
|
|
76
|
+
'detection',
|
|
77
|
+
'detector',
|
|
78
|
+
'detectors',
|
|
79
|
+
'flag',
|
|
80
|
+
'flags',
|
|
81
|
+
'flagging',
|
|
82
|
+
'flagged',
|
|
83
|
+
'identify',
|
|
84
|
+
'identifies',
|
|
85
|
+
'block',
|
|
86
|
+
'blocks',
|
|
87
|
+
'blocking',
|
|
88
|
+
'prevent',
|
|
89
|
+
'prevents',
|
|
90
|
+
'warn',
|
|
91
|
+
'warns',
|
|
92
|
+
'describe',
|
|
93
|
+
'describes',
|
|
94
|
+
'explain',
|
|
95
|
+
'explains',
|
|
96
|
+
'scan',
|
|
97
|
+
'scans',
|
|
98
|
+
'scanning',
|
|
99
|
+
'scanner',
|
|
100
|
+
'audit',
|
|
101
|
+
'audits',
|
|
102
|
+
'monitor',
|
|
103
|
+
'monitors',
|
|
104
|
+
'catch',
|
|
105
|
+
'catches',
|
|
106
|
+
'guard',
|
|
107
|
+
'guards',
|
|
108
|
+
'protect',
|
|
109
|
+
'protects',
|
|
110
|
+
'rule',
|
|
111
|
+
'rules',
|
|
112
|
+
'linter',
|
|
113
|
+
'analyzer',
|
|
114
|
+
]);
|
|
115
|
+
/**
|
|
116
|
+
* MF-3 (SMI-5207, round 10): relative pronouns. Their presence immediately
|
|
117
|
+
* before an action verb marks it as the verb of a SUBORDINATE descriptive
|
|
118
|
+
* clause ("code that exfiltrates X"), never an imperative.
|
|
119
|
+
*/
|
|
120
|
+
export const RELATIVE_MARKERS = new Set(['that', 'which', 'who', 'whom', 'whose']);
|
|
121
|
+
/**
|
|
122
|
+
* MF-4 (SMI-5207): English function words. A passphrase is nouns; an
|
|
123
|
+
* explanatory sentence is not. The only signal separating `correct horse
|
|
124
|
+
* battery staple` from `never paste your password into chat` — both lowercase
|
|
125
|
+
* multi-word spans.
|
|
126
|
+
*/
|
|
127
|
+
export const PROSE_STOPWORDS = new Set([
|
|
128
|
+
'never',
|
|
129
|
+
'not',
|
|
130
|
+
'your',
|
|
131
|
+
'you',
|
|
132
|
+
'this',
|
|
133
|
+
'that',
|
|
134
|
+
'these',
|
|
135
|
+
'those',
|
|
136
|
+
'is',
|
|
137
|
+
'are',
|
|
138
|
+
'was',
|
|
139
|
+
'were',
|
|
140
|
+
'be',
|
|
141
|
+
'been',
|
|
142
|
+
'will',
|
|
143
|
+
'would',
|
|
144
|
+
'can',
|
|
145
|
+
'could',
|
|
146
|
+
'should',
|
|
147
|
+
'must',
|
|
148
|
+
'do',
|
|
149
|
+
'does',
|
|
150
|
+
'into',
|
|
151
|
+
'onto',
|
|
152
|
+
'from',
|
|
153
|
+
'with',
|
|
154
|
+
'without',
|
|
155
|
+
'by',
|
|
156
|
+
'for',
|
|
157
|
+
'of',
|
|
158
|
+
'to',
|
|
159
|
+
'in',
|
|
160
|
+
'on',
|
|
161
|
+
'at',
|
|
162
|
+
'as',
|
|
163
|
+
'and',
|
|
164
|
+
'or',
|
|
165
|
+
'but',
|
|
166
|
+
'if',
|
|
167
|
+
'when',
|
|
168
|
+
'where',
|
|
169
|
+
'how',
|
|
170
|
+
'why',
|
|
171
|
+
'use',
|
|
172
|
+
'using',
|
|
173
|
+
'used',
|
|
174
|
+
'see',
|
|
175
|
+
'via',
|
|
176
|
+
'per',
|
|
177
|
+
'they',
|
|
178
|
+
'them',
|
|
179
|
+
'their',
|
|
180
|
+
'it',
|
|
181
|
+
'its',
|
|
182
|
+
'we',
|
|
183
|
+
'our',
|
|
184
|
+
'us',
|
|
185
|
+
'please',
|
|
186
|
+
'ensure',
|
|
187
|
+
'make',
|
|
188
|
+
'sure',
|
|
189
|
+
'the',
|
|
190
|
+
'a',
|
|
191
|
+
'an',
|
|
192
|
+
'all',
|
|
193
|
+
'any',
|
|
194
|
+
'each',
|
|
195
|
+
'no',
|
|
196
|
+
'nor',
|
|
197
|
+
'so',
|
|
198
|
+
'than',
|
|
199
|
+
'then',
|
|
200
|
+
'there',
|
|
201
|
+
'here',
|
|
202
|
+
'what',
|
|
203
|
+
'which',
|
|
204
|
+
'who',
|
|
205
|
+
'while',
|
|
206
|
+
'during',
|
|
207
|
+
'after',
|
|
208
|
+
'before',
|
|
209
|
+
'above',
|
|
210
|
+
'below',
|
|
211
|
+
'up',
|
|
212
|
+
'down',
|
|
213
|
+
'out',
|
|
214
|
+
'off',
|
|
215
|
+
'over',
|
|
216
|
+
'under',
|
|
217
|
+
'again',
|
|
218
|
+
'further',
|
|
219
|
+
'once',
|
|
220
|
+
'only',
|
|
221
|
+
'own',
|
|
222
|
+
'same',
|
|
223
|
+
'too',
|
|
224
|
+
'very',
|
|
225
|
+
'just',
|
|
226
|
+
'now',
|
|
227
|
+
]);
|
|
228
|
+
//# sourceMappingURL=SecurityScanner.prose-lexicon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityScanner.prose-lexicon.js","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.prose-lexicon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecurityScanner.scanners.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.scanners.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"SecurityScanner.scanners.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.scanners.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAA;AAcpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAM/D,OAAO,EACL,0BAA0B,EAC1B,cAAc,EACd,eAAe,EAChB,MAAM,0BAA0B,CAAA;AA4BjC,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,WAAW,EAAE,GAC3B,eAAe,EAAE,CA2EnB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,WAAW,EAAE,GAC3B,eAAe,EAAE,CAgCnB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,WAAW,EAAE,GAC3B,eAAe,EAAE,CAgCnB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,WAAW,EAAE,GAC3B,eAAe,EAAE,CAgCnB;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,WAAW,EAAE,GAC3B,eAAe,EAAE,CA4CnB;AAED,sEAAsE;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,iEAAiE;AACjE,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -10,10 +10,15 @@
|
|
|
10
10
|
* them out is behaviour-preserving (guarded by the scoring + regression-guard
|
|
11
11
|
* + ai-defence test suites).
|
|
12
12
|
*/
|
|
13
|
-
import { SENSITIVE_PATH_PATTERNS, ENV_PATH_PATTERN, VALUE_GATED_KEYWORD_PATTERNS, SOCIAL_ENGINEERING_PATTERNS, PROMPT_LEAKING_PATTERNS, DATA_EXFILTRATION_PATTERNS, PRIVILEGE_ESCALATION_PATTERNS, CREDENTIAL_SUBSTITUTION_PATTERNS, } from './patterns.js';
|
|
13
|
+
import { SENSITIVE_PATH_PATTERNS, ENV_PATH_PATTERN, VALUE_GATED_KEYWORD_PATTERNS, PATH_FORM_PATTERNS, VALUE_GATED_ASSIGNMENT_PATTERNS, SOCIAL_ENGINEERING_PATTERNS, PROMPT_LEAKING_PATTERNS, DATA_EXFILTRATION_PATTERNS, PRIVILEGE_ESCALATION_PATTERNS, CREDENTIAL_SUBSTITUTION_PATTERNS, } from './patterns.js';
|
|
14
14
|
import { safeRegexTest, safeRegexCheck } from './regex-utils.js';
|
|
15
15
|
import { analyzeMarkdownContext, isDocumentationContext, isWithinInlineCode, } from './SecurityScanner.helpers.js';
|
|
16
16
|
import { looksLikePlaceholderSecret, shannonEntropy, scanPiiPatterns, } from './SecurityScanner.pii.js';
|
|
17
|
+
// SMI-5207: the two sensitive_path severity gates, each split into its own
|
|
18
|
+
// module for the 500-line gate. MF-3 answers "is this path being acted on?";
|
|
19
|
+
// MF-4 answers "does this assignment carry a real credential?".
|
|
20
|
+
import { hasPathActionContext } from './SecurityScanner.action-context.js';
|
|
21
|
+
import { assignmentHasRealValue } from './SecurityScanner.value-gate.js';
|
|
17
22
|
/**
|
|
18
23
|
* SMI-5359 Wave 4 (MF-2): a `.env` reference is an active read/exfiltration only when
|
|
19
24
|
* it co-occurs with a read/copy/transfer verb or a shell pipe/redirect on the same line
|
|
@@ -53,16 +58,28 @@ export function scanSensitivePaths(content, lineContexts) {
|
|
|
53
58
|
continue;
|
|
54
59
|
}
|
|
55
60
|
// MF-2: lone `.env` → MEDIUM; `.env` + read/exfil verb or pipe/redirect → HIGH.
|
|
61
|
+
// MF-3 (SMI-5207): a path-form match → HIGH only with an action verb or shell
|
|
62
|
+
// operator within +/-1 line; a bare path MENTION is the common case, so evidence
|
|
63
|
+
// is required to escalate.
|
|
64
|
+
// MF-4 (SMI-5207): an assignment-form match → HIGH by DEFAULT (a `keyword: value`
|
|
65
|
+
// credential shape is rare in innocent prose), downgraded only on positive prose
|
|
66
|
+
// evidence about the assigned value.
|
|
56
67
|
// Doc-context keeps the existing MEDIUM downgrade for every pattern.
|
|
57
68
|
let severity;
|
|
58
69
|
if (inDocContext) {
|
|
59
|
-
severity = 'medium';
|
|
70
|
+
severity = 'medium'; // unchanged
|
|
60
71
|
}
|
|
61
72
|
else if (pattern === ENV_PATH_PATTERN) {
|
|
62
|
-
severity = safeRegexCheck(ENV_EXFIL_CONTEXT, line) ? 'high' : 'medium';
|
|
73
|
+
severity = safeRegexCheck(ENV_EXFIL_CONTEXT, line) ? 'high' : 'medium'; // MF-2, unchanged
|
|
74
|
+
}
|
|
75
|
+
else if (PATH_FORM_PATTERNS.has(pattern)) {
|
|
76
|
+
severity = hasPathActionContext(lines, index) ? 'high' : 'medium'; // MF-3
|
|
77
|
+
}
|
|
78
|
+
else if (VALUE_GATED_ASSIGNMENT_PATTERNS.has(pattern)) {
|
|
79
|
+
severity = assignmentHasRealValue(lines, index) ? 'high' : 'medium'; // MF-4
|
|
63
80
|
}
|
|
64
81
|
else {
|
|
65
|
-
severity = 'high';
|
|
82
|
+
severity = 'high'; // MF-1 survivors and any future unclassified pattern — fail CLOSED
|
|
66
83
|
}
|
|
67
84
|
const confidence = inDocContext
|
|
68
85
|
? 'low'
|
|
@@ -72,7 +89,20 @@ export function scanSensitivePaths(content, lineContexts) {
|
|
|
72
89
|
findings.push({
|
|
73
90
|
type: 'sensitive_path',
|
|
74
91
|
severity,
|
|
75
|
-
|
|
92
|
+
// SMI-5207: the matched TEXT is prepended additively — `pattern.source` is
|
|
93
|
+
// deliberately retained, not swapped out, because allowlist entries'
|
|
94
|
+
// `messagePattern` values match on that regex-source substring.
|
|
95
|
+
// Governance review L-5: `match?.[0] ?? ''` is kept (a plain `match[0]`
|
|
96
|
+
// fails `tsc` — TS cannot correlate the separate `safeRegexCheck`/
|
|
97
|
+
// `safeRegexTest` calls the way it narrows a local `if (match)` block, the
|
|
98
|
+
// pattern this file's OTHER scanners use). Behaviorally the `?? ''`
|
|
99
|
+
// fallback is unreachable: `safeRegexCheck` (.test()) already gated the
|
|
100
|
+
// loop above on this same pattern/line pair, and for a non-`g` pattern
|
|
101
|
+
// .test() and .match() can never disagree on the same input. If it ever
|
|
102
|
+
// WAS reached, it would silently diverge from the edge twins (which emit
|
|
103
|
+
// no finding at all rather than one with an empty quoted span) — a gap the
|
|
104
|
+
// twin-parity test can't catch, since it compares files, not behavior.
|
|
105
|
+
message: `Reference to potentially sensitive path: "${match?.[0]?.slice(0, 60) ?? ''}" (${pattern.source})`,
|
|
76
106
|
location: line.trim().slice(0, 100),
|
|
77
107
|
lineNumber: index + 1,
|
|
78
108
|
inDocumentationContext: inDocContext,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecurityScanner.scanners.js","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.scanners.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,4BAA4B,EAC5B,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,gCAAgC,GACjC,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEhE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,0BAA0B,EAC1B,cAAc,EACd,eAAe,GAChB,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"SecurityScanner.scanners.js","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.scanners.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner — MF-4 assignment-value gate (SMI-5207)
|
|
3
|
+
* @module @skillsmith/core/security/scanner/SecurityScanner.value-gate
|
|
4
|
+
*
|
|
5
|
+
* The `sensitive_path` MF-4 gate: given a line that matched one of the three
|
|
6
|
+
* VALUE_GATED_ASSIGNMENT_PATTERNS, decide whether it assigns a REAL credential
|
|
7
|
+
* (→ HIGH) or only prose (→ MEDIUM). HIGH is the default; a downgrade requires
|
|
8
|
+
* positive prose evidence, and since HIGH is the pre-SMI-5207 unconditional
|
|
9
|
+
* behaviour that default can never regress detection.
|
|
10
|
+
*
|
|
11
|
+
* Split out of SecurityScanner.scanners.ts for the 500-line pre-commit gate
|
|
12
|
+
* once round 8's segmentation logic landed (that file is at 4xx with the MF-3
|
|
13
|
+
* gate and six per-category scanners already in it). Cohesive unit — every
|
|
14
|
+
* symbol here serves the single question "is this assignment's value real?".
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* MF-4 value classification, SEGMENTED PER ASSIGNMENT (SMI-5207 adversarial
|
|
18
|
+
* review, round 8). Each assignment key on the line owns exactly the text
|
|
19
|
+
* between its own `:`/`=` and the NEXT key (or EOL); the finding stays HIGH if
|
|
20
|
+
* ANY of those values is a real credential, and downgrades only when EVERY one
|
|
21
|
+
* of them positively reads as prose.
|
|
22
|
+
*
|
|
23
|
+
* The plan's single-whole-line-span shape (`SPAN.exec(line)[1]`) leaks across
|
|
24
|
+
* assignments in THREE directions on a line carrying two keys. All three are
|
|
25
|
+
* false-negative REGRESSIONS (unconditionally HIGH pre-SMI-5207) and none is
|
|
26
|
+
* residual R-3, which is a stopword inside the assignment's OWN value — here
|
|
27
|
+
* the prose bleeds in from a DIFFERENT assignment entirely:
|
|
28
|
+
*
|
|
29
|
+
* 1. LEFT — `SPAN` is unanchored, so it captures from the LEFTMOST key, not
|
|
30
|
+
* necessarily the one that produced the finding (scanSensitivePaths emits
|
|
31
|
+
* for the first entry matching in ARRAY order, and CREDENTIALS(2)/
|
|
32
|
+
* SECRETS(3) precede PASSWORD(8)). `password: this credentials:
|
|
33
|
+
* Tr0ub4dor&3` → captured `this credentials: Tr0ub4dor&3` → `this` →
|
|
34
|
+
* MEDIUM. This is the reviewer's reported counter-example.
|
|
35
|
+
* 2. RIGHT — `(\S.*)$` runs to EOL and swallows the next assignment's prose:
|
|
36
|
+
* `credentials: Tr0ub4dor&3 password: this` → trailing `this` → MEDIUM.
|
|
37
|
+
* 3. Anchoring at the finding's own match (the narrow fix) closes 1, not 2,
|
|
38
|
+
* and opens a mirror of 1: only ONE finding is emitted per line (the
|
|
39
|
+
* scanner loop `break`s), so on `password: Tr0ub4dor&3 credentials: this`
|
|
40
|
+
* the emitted finding sits RIGHT of the real credential, which a
|
|
41
|
+
* match-anchored scan never sees → MEDIUM.
|
|
42
|
+
*
|
|
43
|
+
* Segmenting closes all three. It is also the correct granularity: severity
|
|
44
|
+
* attaches to the LINE (the finding's `location` is the whole trimmed line), so
|
|
45
|
+
* a line holding any real credential is HIGH. Monotonicity holds — this returns
|
|
46
|
+
* true at least as often as the per-span reading, and true is the status quo.
|
|
47
|
+
*/
|
|
48
|
+
export declare function assignmentHasRealValue(lines: string[], index: number): boolean;
|
|
49
|
+
//# sourceMappingURL=SecurityScanner.value-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityScanner.value-gate.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.value-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA2DH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA0B9E"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner — MF-4 assignment-value gate (SMI-5207)
|
|
3
|
+
* @module @skillsmith/core/security/scanner/SecurityScanner.value-gate
|
|
4
|
+
*
|
|
5
|
+
* The `sensitive_path` MF-4 gate: given a line that matched one of the three
|
|
6
|
+
* VALUE_GATED_ASSIGNMENT_PATTERNS, decide whether it assigns a REAL credential
|
|
7
|
+
* (→ HIGH) or only prose (→ MEDIUM). HIGH is the default; a downgrade requires
|
|
8
|
+
* positive prose evidence, and since HIGH is the pre-SMI-5207 unconditional
|
|
9
|
+
* behaviour that default can never regress detection.
|
|
10
|
+
*
|
|
11
|
+
* Split out of SecurityScanner.scanners.ts for the 500-line pre-commit gate
|
|
12
|
+
* once round 8's segmentation logic landed (that file is at 4xx with the MF-3
|
|
13
|
+
* gate and six per-category scanners already in it). Cohesive unit — every
|
|
14
|
+
* symbol here serves the single question "is this assignment's value real?".
|
|
15
|
+
*/
|
|
16
|
+
import { PLACEHOLDER_SECRET_RE } from './SecurityScanner.pii.js';
|
|
17
|
+
import { PROSE_STOPWORDS } from './SecurityScanner.prose-lexicon.js';
|
|
18
|
+
import { MAX_LINE_LENGTH_FOR_REGEX } from './regex-utils.js';
|
|
19
|
+
/** A value that REFERENCES a secret rather than containing one. */
|
|
20
|
+
const TEMPLATE_REFERENCE = /^\$|^\{\{|\$\{|^%[A-Za-z_]|^<%/;
|
|
21
|
+
/**
|
|
22
|
+
* Max token count for an all-lowercase span to read as a doc LABEL rather
|
|
23
|
+
* than a passphrase. 2 dictionary words carry ~26 bits (2 x ~12.9 diceware),
|
|
24
|
+
* below any credible credential strength; 3 words (~39 bits) is defensibly a
|
|
25
|
+
* real passphrase. This is the narrowest value that closes `credentials:
|
|
26
|
+
* rotation policy` (2 words) without also swallowing a genuine 3-word
|
|
27
|
+
* passphrase — verified at both 2 and 3 against the full fixture set; 2 wins
|
|
28
|
+
* because it errs toward RETAINING detection on the ambiguous 3-token case.
|
|
29
|
+
*/
|
|
30
|
+
const MAX_LABEL_TOKENS = 2;
|
|
31
|
+
/**
|
|
32
|
+
* The assignment KEY — the exact union of the three
|
|
33
|
+
* VALUE_GATED_ASSIGNMENT_PATTERNS it gates, `\b` included (only the secrets
|
|
34
|
+
* entry carries one), so every line reaching assignmentHasRealValue() through
|
|
35
|
+
* those patterns is covered. `g` is required by matchAll, which clones the
|
|
36
|
+
* regex, so there is no shared `lastIndex` state.
|
|
37
|
+
*
|
|
38
|
+
* DERIVATION NOTE — the plan's item-3 block sketches CREDENTIAL_ASSIGN_SPAN /
|
|
39
|
+
* BARE_ASSIGNMENT_EOL, a single-whole-line-span shape. Round 8 confirmed
|
|
40
|
+
* (two adversarial review rounds, six hand-traced counter-examples) that
|
|
41
|
+
* shape leaks across assignments in THREE directions on a line carrying two
|
|
42
|
+
* keys — see assignmentHasRealValue below — so this reconstruction segments
|
|
43
|
+
* the line by key instead of using one span regex.
|
|
44
|
+
*/
|
|
45
|
+
const ASSIGNMENT_HEAD = /(?:credentials|\bsecrets?|password)\s*[:=]\s*/gi;
|
|
46
|
+
/**
|
|
47
|
+
* Positive prose evidence. Absence of evidence leaves the finding at HIGH.
|
|
48
|
+
* PROSE_STOPWORDS lives in SecurityScanner.prose-lexicon.ts — English function
|
|
49
|
+
* words: a passphrase is nouns, an explanatory sentence is not.
|
|
50
|
+
*/
|
|
51
|
+
function isProseValue(span) {
|
|
52
|
+
const v = span.replace(/^['"]|['"]$/g, '').trim();
|
|
53
|
+
if (v.length === 0)
|
|
54
|
+
return true;
|
|
55
|
+
if (TEMPLATE_REFERENCE.test(v))
|
|
56
|
+
return true; // $VAR, ${{ secrets.X }}
|
|
57
|
+
if (PLACEHOLDER_SECRET_RE.test(v))
|
|
58
|
+
return true; // <YOUR_PASSWORD>, changeme
|
|
59
|
+
if (/^(.)\1+$/.test(v))
|
|
60
|
+
return true; // xxxxxxxx
|
|
61
|
+
const tokens = v.split(/\s+/);
|
|
62
|
+
if (tokens.some((t) => PROSE_STOPWORDS.has(t.toLowerCase().replace(/[^a-z']/g, ''))))
|
|
63
|
+
return true; // sentence
|
|
64
|
+
if (tokens.length > 12)
|
|
65
|
+
return true; // long sentence
|
|
66
|
+
if (tokens.length > 1 &&
|
|
67
|
+
tokens.length <= MAX_LABEL_TOKENS &&
|
|
68
|
+
tokens.every((t) => /^[a-z]{1,19}$/.test(t)))
|
|
69
|
+
return true; // 2-word doc label
|
|
70
|
+
return false; // DEFAULT: stays HIGH
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* MF-4 value classification, SEGMENTED PER ASSIGNMENT (SMI-5207 adversarial
|
|
74
|
+
* review, round 8). Each assignment key on the line owns exactly the text
|
|
75
|
+
* between its own `:`/`=` and the NEXT key (or EOL); the finding stays HIGH if
|
|
76
|
+
* ANY of those values is a real credential, and downgrades only when EVERY one
|
|
77
|
+
* of them positively reads as prose.
|
|
78
|
+
*
|
|
79
|
+
* The plan's single-whole-line-span shape (`SPAN.exec(line)[1]`) leaks across
|
|
80
|
+
* assignments in THREE directions on a line carrying two keys. All three are
|
|
81
|
+
* false-negative REGRESSIONS (unconditionally HIGH pre-SMI-5207) and none is
|
|
82
|
+
* residual R-3, which is a stopword inside the assignment's OWN value — here
|
|
83
|
+
* the prose bleeds in from a DIFFERENT assignment entirely:
|
|
84
|
+
*
|
|
85
|
+
* 1. LEFT — `SPAN` is unanchored, so it captures from the LEFTMOST key, not
|
|
86
|
+
* necessarily the one that produced the finding (scanSensitivePaths emits
|
|
87
|
+
* for the first entry matching in ARRAY order, and CREDENTIALS(2)/
|
|
88
|
+
* SECRETS(3) precede PASSWORD(8)). `password: this credentials:
|
|
89
|
+
* Tr0ub4dor&3` → captured `this credentials: Tr0ub4dor&3` → `this` →
|
|
90
|
+
* MEDIUM. This is the reviewer's reported counter-example.
|
|
91
|
+
* 2. RIGHT — `(\S.*)$` runs to EOL and swallows the next assignment's prose:
|
|
92
|
+
* `credentials: Tr0ub4dor&3 password: this` → trailing `this` → MEDIUM.
|
|
93
|
+
* 3. Anchoring at the finding's own match (the narrow fix) closes 1, not 2,
|
|
94
|
+
* and opens a mirror of 1: only ONE finding is emitted per line (the
|
|
95
|
+
* scanner loop `break`s), so on `password: Tr0ub4dor&3 credentials: this`
|
|
96
|
+
* the emitted finding sits RIGHT of the real credential, which a
|
|
97
|
+
* match-anchored scan never sees → MEDIUM.
|
|
98
|
+
*
|
|
99
|
+
* Segmenting closes all three. It is also the correct granularity: severity
|
|
100
|
+
* attaches to the LINE (the finding's `location` is the whole trimmed line), so
|
|
101
|
+
* a line holding any real credential is HIGH. Monotonicity holds — this returns
|
|
102
|
+
* true at least as often as the per-span reading, and true is the status quo.
|
|
103
|
+
*/
|
|
104
|
+
export function assignmentHasRealValue(lines, index) {
|
|
105
|
+
// Same ReDoS input cap the safeRegex* helpers apply; matchAll has no
|
|
106
|
+
// equivalent wrapper, so the truncation is explicit here.
|
|
107
|
+
const line = lines[index].slice(0, MAX_LINE_LENGTH_FOR_REGEX);
|
|
108
|
+
const heads = [...line.matchAll(ASSIGNMENT_HEAD)];
|
|
109
|
+
if (heads.length === 0)
|
|
110
|
+
return false;
|
|
111
|
+
let trailingKeyIsBare = false;
|
|
112
|
+
for (let i = 0; i < heads.length; i++) {
|
|
113
|
+
const from = (heads[i].index ?? 0) + heads[i][0].length;
|
|
114
|
+
const to = i + 1 < heads.length ? (heads[i + 1].index ?? line.length) : line.length;
|
|
115
|
+
const value = line.slice(from, to);
|
|
116
|
+
if (value.trim().length === 0) {
|
|
117
|
+
// A key with nothing after it. Only the LAST one can take its value from
|
|
118
|
+
// the next line (YAML block form).
|
|
119
|
+
trailingKeyIsBare = i === heads.length - 1;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
trailingKeyIsBare = false;
|
|
123
|
+
if (!isProseValue(value))
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
if (!trailingKeyIsBare)
|
|
127
|
+
return false;
|
|
128
|
+
// `| undefined` annotated (not in the plan's block) so the plan's own
|
|
129
|
+
// `next !== undefined` guard type-checks — `lines[index + 1]` is `string`
|
|
130
|
+
// here (no noUncheckedIndexedAccess), making the compare a TS2367 error.
|
|
131
|
+
const next = lines[index + 1];
|
|
132
|
+
return next !== undefined && !isProseValue(next.trim());
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=SecurityScanner.value-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityScanner.value-gate.js","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.value-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-6441: generated common-password lexicon for the `sensitive_path`
|
|
3
|
+
* MF-4b veto (Wave 2). Vetoes MF-4's 2-token documentation-label
|
|
4
|
+
* carve-out when one of the tokens is a known common password.
|
|
5
|
+
* @module @skillsmith/core/security/scanner/SecurityScanner.weak-passwords
|
|
6
|
+
* @generated DO NOT EDIT — produced by scripts/gen-weak-password-lexicon.mjs
|
|
7
|
+
* from data/wordlists/{seclists-xato-top-10000.txt,doc-vocab-keeplist.txt}.
|
|
8
|
+
* Regenerate with `npm run lexicon:weak-passwords`; verify freshness with
|
|
9
|
+
* `npm run lexicon:weak-passwords:check`. A hand edit here is overwritten
|
|
10
|
+
* on the next --write and is caught by the L3 --check gate before merge.
|
|
11
|
+
*
|
|
12
|
+
* SECURITY-RELEVANT DUPLICATION (ADR-137 Decision point 4): this file is
|
|
13
|
+
* one of three byte-identical-modulo-@module copies of the same
|
|
14
|
+
* generated payload —
|
|
15
|
+
* packages/core/src/security/scanner/SecurityScanner.weak-passwords.ts
|
|
16
|
+
* scripts/indexer/_shared/security-scanner-edge.weak-passwords.ts
|
|
17
|
+
* supabase/functions/_shared/security-scanner-edge.weak-passwords.ts
|
|
18
|
+
* A silent divergence between these three is a SECURITY GAP, not a
|
|
19
|
+
* cosmetic inconsistency: this data decides whether a `sensitive_path`
|
|
20
|
+
* finding is HIGH or MEDIUM (quarantine vs. pass on the weekly scan
|
|
21
|
+
* surface; blocked vs. permitted install). Enforced by three parity
|
|
22
|
+
* layers: L1 Deno<->Node byte identity
|
|
23
|
+
* (scripts/tests/indexer/security-scanner-edge.test.ts's
|
|
24
|
+
* PATHS_FAMILY_TWINS), L2 three-way literal payload identity
|
|
25
|
+
* (scripts/tests/indexer/parity-utils.ts's extractGeneratedPayload),
|
|
26
|
+
* and L3 freshness/anti-hand-edit (`npm run lexicon:weak-passwords:check`,
|
|
27
|
+
* wired into scripts/audit-standards.mjs).
|
|
28
|
+
*
|
|
29
|
+
* Source: SecLists (MIT license) — see data/wordlists/LICENSE-SecLists
|
|
30
|
+
* and WEAK_PASSWORD_LEXICON_SOURCE below for exact provenance.
|
|
31
|
+
*
|
|
32
|
+
* Full design: docs/internal/implementation/smi-6441-weak-password-veto.md
|
|
33
|
+
* See also: docs/internal/adr/149-generated-scanner-data-veto-severity-model.md
|
|
34
|
+
* and docs/internal/adr/137-cross-runtime-duplication-of-security-logic.md
|
|
35
|
+
*/
|
|
36
|
+
/** Provenance of the vendored upstream snapshot this file was generated from. */
|
|
37
|
+
export declare const WEAK_PASSWORD_LEXICON_SOURCE: {
|
|
38
|
+
readonly upstream: "https://github.com/danielmiessler/SecLists";
|
|
39
|
+
readonly path: "Passwords/Common-Credentials/xato-net-10-million-passwords-10000.txt";
|
|
40
|
+
readonly license: "MIT";
|
|
41
|
+
readonly commit: "c205c36a445bff37f8e58a9ec829105cd4975c58";
|
|
42
|
+
readonly sha256: "c63d5e4ccc31344d662583cc39ca4bd5bd20517ff1d24501f0c4e0c22d9b722a";
|
|
43
|
+
readonly sourceRankLimit: 5000;
|
|
44
|
+
readonly entries: 4079;
|
|
45
|
+
};
|
|
46
|
+
/** Bumped whenever the emitted entry set changes. Deterministic, no timestamp. */
|
|
47
|
+
export declare const WEAK_PASSWORD_LEXICON_VERSION: "2026-09-08.1";
|
|
48
|
+
/**
|
|
49
|
+
* Lowercase-alphabetic common-password tokens, 3-19 chars, sorted, with the
|
|
50
|
+
* documentation vocabulary subtracted at generation time. Exact membership
|
|
51
|
+
* by design (see the ADR): the veto's failure direction is a false positive
|
|
52
|
+
* on ordinary documentation, so an approximate structure is not acceptable here.
|
|
53
|
+
*/
|
|
54
|
+
export declare const COMMON_WEAK_PASSWORDS: ReadonlySet<string>;
|
|
55
|
+
//# sourceMappingURL=SecurityScanner.weak-passwords.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityScanner.weak-passwords.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.weak-passwords.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,iFAAiF;AACjF,eAAO,MAAM,4BAA4B;;;;;;;;CAQ/B,CAAA;AAEV,kFAAkF;AAClF,eAAO,MAAM,6BAA6B,EAAG,cAAuB,CAAA;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAoQrD,CAAA"}
|