codictator 0.0.0 → 0.1.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/LICENSE +9 -0
- package/README.md +5 -0
- package/dist/builtin-packs/core/fixtures/agent-assets-present/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/agent-assets-present/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-boundaries/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-boundaries/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-module-mapped/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-module-mapped/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-module-size/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-module-size/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-no-cycles/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-no-cycles/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-profile-declared/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-profile-declared/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-public-entry/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/arch-public-entry/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/branch-protection/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/branch-protection/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/bug-registry/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/bug-registry/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/bug-rows-immutable/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/bug-rows-immutable/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/ci-actions-pinned/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/ci-actions-pinned/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/ci-present/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/ci-present/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/ci-required-check/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/ci-required-check/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/compiler-strict/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/compiler-strict/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/complexity/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/complexity/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/context-hard-band/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/context-hard-band/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/context-soft-band/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/context-soft-band/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/conventional-commit/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/conventional-commit/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/coverage-floor/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/coverage-floor/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/custom-pack-selftest/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/custom-pack-selftest/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dangerous-shell/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dangerous-shell/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dead-code/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dead-code/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-exact-pin/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-exact-pin/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-latest-stable/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-latest-stable/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-license/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-license/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-lockfile/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-lockfile/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-new-needs-reason/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-new-needs-reason/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-no-deprecated/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-no-deprecated/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-no-vulnerable/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-no-vulnerable/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-one-per-capability/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/dep-one-per-capability/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/diagnose-before-fix/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/diagnose-before-fix/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-breadth/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-breadth/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-density/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-density/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-links-valid/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-links-valid/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-no-corpus-counts/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-no-corpus-counts/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-no-inline-changelog/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-no-inline-changelog/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-one-level/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-one-level/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-placement/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-placement/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-router-leaf/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-router-leaf/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-single-owner/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-single-owner/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-size/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/doc-size/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/duplication/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/duplication/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/engine-version-match/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/engine-version-match/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/file-naming/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/file-naming/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/file-size/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/file-size/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/function-size/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/function-size/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/graph-before-scan/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/graph-before-scan/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/guardrail-manifest/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/guardrail-manifest/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/history-append-only/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/history-append-only/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/history-entry/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/history-entry/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/history-entry-complete/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/history-entry-complete/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/hooks-active/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/hooks-active/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/loop-breaker/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/loop-breaker/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/max-file-bytes/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/max-file-bytes/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/mcp-declared/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/mcp-declared/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-assertion-loss/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-assertion-loss/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-baseline-raise/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-baseline-raise/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-bypass/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-bypass/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-fixture-shrink/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-fixture-shrink/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-guard-removal/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-guard-removal/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-new-suppressions/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-new-suppressions/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-secret-reads/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-secret-reads/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-secrets/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-secrets/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-skipped-tests/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-skipped-tests/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-speculative-abstraction/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-speculative-abstraction/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-threshold-lowering/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/no-threshold-lowering/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/perf-budgets/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/perf-budgets/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/ratchet-touched-improves/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/ratchet-touched-improves/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/read-dedupe/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/read-dedupe/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/red-before-green/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/red-before-green/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/regression-test-for-fix/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/regression-test-for-fix/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/remediation-step-size/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/remediation-step-size/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/repo-hygiene/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/repo-hygiene/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/review-gate/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/review-gate/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/review-round-cap/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/review-round-cap/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/session-tool-call-limit/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/session-tool-call-limit/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/spec-trace/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/spec-trace/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/test-command-intact/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/test-command-intact/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/test-kinds-by-scenario/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/test-kinds-by-scenario/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/waivers-valid/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/waivers-valid/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/workflow-gates/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/workflow-gates/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/write-confinement/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/write-confinement/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/writes-within-plan/passing/basic/case.json +10 -0
- package/dist/builtin-packs/core/fixtures/writes-within-plan/violating/basic/case.json +10 -0
- package/dist/builtin-packs/core/index.ts +8 -0
- package/dist/builtin-packs/core/pack.json +2057 -0
- package/dist/builtin-packs/dotnet/index.ts +47 -0
- package/dist/builtin-packs/python/extract.ts +245 -0
- package/dist/builtin-packs/python/fixtures/lint/passing/basic/case.json +10 -0
- package/dist/builtin-packs/python/fixtures/lint/violating/basic/case.json +10 -0
- package/dist/builtin-packs/python/fixtures/no-phantom-import/passing/basic/case.json +12 -0
- package/dist/builtin-packs/python/fixtures/no-phantom-import/violating/basic/case.json +11 -0
- package/dist/builtin-packs/python/fixtures/security-patterns/passing/basic/case.json +10 -0
- package/dist/builtin-packs/python/fixtures/security-patterns/violating/basic/case.json +10 -0
- package/dist/builtin-packs/python/fixtures/typecheck/passing/basic/case.json +10 -0
- package/dist/builtin-packs/python/fixtures/typecheck/violating/basic/case.json +10 -0
- package/dist/builtin-packs/python/index.ts +57 -0
- package/dist/builtin-packs/python/pack.json +116 -0
- package/dist/builtin-packs/typescript/extract-clauses.ts +153 -0
- package/dist/builtin-packs/typescript/extract-literals.ts +111 -0
- package/dist/builtin-packs/typescript/extract-words.ts +79 -0
- package/dist/builtin-packs/typescript/extract.ts +77 -0
- package/dist/builtin-packs/typescript/fixtures/lint/passing/basic/case.json +10 -0
- package/dist/builtin-packs/typescript/fixtures/lint/passing/exported/case.json +8 -0
- package/dist/builtin-packs/typescript/fixtures/lint/violating/basic/case.json +10 -0
- package/dist/builtin-packs/typescript/fixtures/no-phantom-import/passing/basic/case.json +10 -0
- package/dist/builtin-packs/typescript/fixtures/no-phantom-import/passing/host-provided/case.json +10 -0
- package/dist/builtin-packs/typescript/fixtures/no-phantom-import/violating/basic/case.json +10 -0
- package/dist/builtin-packs/typescript/fixtures/no-phantom-import/violating/host-provided/case.json +10 -0
- package/dist/builtin-packs/typescript/fixtures/security-patterns/passing/basic/case.json +10 -0
- package/dist/builtin-packs/typescript/fixtures/security-patterns/violating/basic/case.json +10 -0
- package/dist/builtin-packs/typescript/fixtures/typecheck/passing/basic/case.json +10 -0
- package/dist/builtin-packs/typescript/fixtures/typecheck/violating/basic/case.json +10 -0
- package/dist/builtin-packs/typescript/index.ts +85 -0
- package/dist/builtin-packs/typescript/lex.ts +199 -0
- package/dist/builtin-packs/typescript/measures-exports.ts +173 -0
- package/dist/builtin-packs/typescript/measures-functions.ts +138 -0
- package/dist/builtin-packs/typescript/measures.ts +10 -0
- package/dist/builtin-packs/typescript/naming.ts +47 -0
- package/dist/builtin-packs/typescript/pack.json +169 -0
- package/dist/builtin-packs/typescript/patterns.ts +93 -0
- package/dist/builtin-packs/typescript/resolve.ts +224 -0
- package/dist/builtin-packs/typescript/strict.ts +177 -0
- package/dist/builtin-packs/typescript/titles.ts +184 -0
- package/dist/cli/baseline.d.ts +3 -0
- package/dist/cli/baseline.js +67 -0
- package/dist/cli/ci-bot-change.d.ts +3 -0
- package/dist/cli/ci-bot-change.js +54 -0
- package/dist/cli/ci-range.d.ts +18 -0
- package/dist/cli/ci-range.js +228 -0
- package/dist/cli/ci-summary.d.ts +3 -0
- package/dist/cli/ci-summary.js +45 -0
- package/dist/cli/ci.d.ts +4 -0
- package/dist/cli/ci.js +195 -0
- package/dist/cli/commands.d.ts +5 -0
- package/dist/cli/commands.js +39 -0
- package/dist/cli/deps.d.ts +3 -0
- package/dist/cli/deps.js +115 -0
- package/dist/cli/drift.d.ts +11 -0
- package/dist/cli/drift.js +91 -0
- package/dist/cli/evaluate.d.ts +20 -0
- package/dist/cli/evaluate.js +213 -0
- package/dist/cli/gate-scope.d.ts +11 -0
- package/dist/cli/gate-scope.js +93 -0
- package/dist/cli/git-hook.d.ts +3 -0
- package/dist/cli/git-hook.js +184 -0
- package/dist/cli/guardrail.d.ts +5 -0
- package/dist/cli/guardrail.js +190 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.js +198 -0
- package/dist/cli/init-plan.d.ts +23 -0
- package/dist/cli/init-plan.js +135 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.js +122 -0
- package/dist/cli/inspect-status.d.ts +8 -0
- package/dist/cli/inspect-status.js +164 -0
- package/dist/cli/inspect.d.ts +5 -0
- package/dist/cli/inspect.js +98 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +60 -0
- package/dist/cli/pack-adapters.d.ts +3 -0
- package/dist/cli/pack-adapters.js +81 -0
- package/dist/cli/packs.d.ts +6 -0
- package/dist/cli/packs.js +131 -0
- package/dist/cli/plan-launcher.d.ts +2 -0
- package/dist/cli/plan-launcher.js +272 -0
- package/dist/cli/plan.d.ts +25 -0
- package/dist/cli/plan.js +121 -0
- package/dist/cli/proofs-test.d.ts +3 -0
- package/dist/cli/proofs-test.js +77 -0
- package/dist/cli/proofs.d.ts +3 -0
- package/dist/cli/proofs.js +168 -0
- package/dist/cli/remediation.d.ts +3 -0
- package/dist/cli/remediation.js +107 -0
- package/dist/cli/report.d.ts +4 -0
- package/dist/cli/report.js +93 -0
- package/dist/cli/serve-eval.d.ts +2 -0
- package/dist/cli/serve-eval.js +165 -0
- package/dist/cli/serve-log.d.ts +2 -0
- package/dist/cli/serve-log.js +150 -0
- package/dist/cli/serve-methods.d.ts +2 -0
- package/dist/cli/serve-methods.js +181 -0
- package/dist/cli/serve-protocol.d.ts +35 -0
- package/dist/cli/serve-protocol.js +97 -0
- package/dist/cli/serve-run.d.ts +9 -0
- package/dist/cli/serve-run.js +135 -0
- package/dist/cli/serve-server.d.ts +5 -0
- package/dist/cli/serve-server.js +120 -0
- package/dist/cli/serve-shared.d.ts +34 -0
- package/dist/cli/serve-shared.js +20 -0
- package/dist/cli/serve-status.d.ts +2 -0
- package/dist/cli/serve-status.js +130 -0
- package/dist/cli/serve-transport.d.ts +2 -0
- package/dist/cli/serve-transport.js +114 -0
- package/dist/cli/shared.d.ts +35 -0
- package/dist/cli/shared.js +181 -0
- package/dist/cli/task-advance.d.ts +3 -0
- package/dist/cli/task-advance.js +144 -0
- package/dist/cli/task-phases.d.ts +3 -0
- package/dist/cli/task-phases.js +77 -0
- package/dist/cli/tasks.d.ts +12 -0
- package/dist/cli/tasks.js +176 -0
- package/dist/cli/transparency.d.ts +4 -0
- package/dist/cli/transparency.js +197 -0
- package/dist/cli/waivers.d.ts +3 -0
- package/dist/cli/waivers.js +195 -0
- package/dist/features/adapters/claude-code.d.ts +8 -0
- package/dist/features/adapters/claude-code.js +198 -0
- package/dist/features/adapters/claude-shaped.d.ts +4 -0
- package/dist/features/adapters/claude-shaped.js +174 -0
- package/dist/features/adapters/codex-cli.d.ts +8 -0
- package/dist/features/adapters/codex-cli.js +180 -0
- package/dist/features/adapters/contract.d.ts +104 -0
- package/dist/features/adapters/contract.js +17 -0
- package/dist/features/adapters/copilot-capabilities.d.ts +2 -0
- package/dist/features/adapters/copilot-capabilities.js +46 -0
- package/dist/features/adapters/copilot.d.ts +8 -0
- package/dist/features/adapters/copilot.js +200 -0
- package/dist/features/adapters/cursor.d.ts +8 -0
- package/dist/features/adapters/cursor.js +245 -0
- package/dist/features/adapters/custom-event.d.ts +3 -0
- package/dist/features/adapters/custom-event.js +180 -0
- package/dist/features/adapters/custom-load.d.ts +3 -0
- package/dist/features/adapters/custom-load.js +185 -0
- package/dist/features/adapters/custom-shape.d.ts +21 -0
- package/dist/features/adapters/custom-shape.js +87 -0
- package/dist/features/adapters/custom.d.ts +9 -0
- package/dist/features/adapters/custom.js +130 -0
- package/dist/features/adapters/effective-cache.d.ts +5 -0
- package/dist/features/adapters/effective-cache.js +45 -0
- package/dist/features/adapters/gemini-cli.d.ts +6 -0
- package/dist/features/adapters/gemini-cli.js +160 -0
- package/dist/features/adapters/gemini-tables.d.ts +7 -0
- package/dist/features/adapters/gemini-tables.js +104 -0
- package/dist/features/adapters/hook-dispatch.d.ts +7 -0
- package/dist/features/adapters/hook-dispatch.js +97 -0
- package/dist/features/adapters/hook-injection.d.ts +12 -0
- package/dist/features/adapters/hook-injection.js +75 -0
- package/dist/features/adapters/hook-load.d.ts +15 -0
- package/dist/features/adapters/hook-load.js +152 -0
- package/dist/features/adapters/hook-scope.d.ts +3 -0
- package/dist/features/adapters/hook-scope.js +54 -0
- package/dist/features/adapters/index.d.ts +22 -0
- package/dist/features/adapters/index.js +86 -0
- package/dist/features/adapters/muse-code.d.ts +8 -0
- package/dist/features/adapters/muse-code.js +223 -0
- package/dist/features/adapters/opencode-bridge.d.ts +1 -0
- package/dist/features/adapters/opencode-bridge.js +230 -0
- package/dist/features/adapters/opencode-capabilities.d.ts +2 -0
- package/dist/features/adapters/opencode-capabilities.js +47 -0
- package/dist/features/adapters/opencode-parse.d.ts +3 -0
- package/dist/features/adapters/opencode-parse.js +137 -0
- package/dist/features/adapters/opencode-tables.d.ts +5 -0
- package/dist/features/adapters/opencode-tables.js +63 -0
- package/dist/features/adapters/opencode.d.ts +10 -0
- package/dist/features/adapters/opencode.js +97 -0
- package/dist/features/adapters/runtime.d.ts +25 -0
- package/dist/features/adapters/runtime.js +148 -0
- package/dist/features/adapters/universal.d.ts +7 -0
- package/dist/features/adapters/universal.js +89 -0
- package/dist/features/arch/arch-profiles.d.ts +3 -0
- package/dist/features/arch/arch-profiles.js +5 -0
- package/dist/features/arch/checks.d.ts +25 -0
- package/dist/features/arch/checks.js +173 -0
- package/dist/features/arch/codictator-modules.d.ts +4 -0
- package/dist/features/arch/codictator-modules.js +180 -0
- package/dist/features/arch/cycle-walk.d.ts +1 -0
- package/dist/features/arch/cycle-walk.js +36 -0
- package/dist/features/arch/edge-checks.d.ts +13 -0
- package/dist/features/arch/edge-checks.js +186 -0
- package/dist/features/arch/graph.d.ts +32 -0
- package/dist/features/arch/graph.js +202 -0
- package/dist/features/arch/index.d.ts +29 -0
- package/dist/features/arch/index.js +16 -0
- package/dist/features/arch/layer-rules.d.ts +3 -0
- package/dist/features/arch/layer-rules.js +38 -0
- package/dist/features/arch/module-map-validation.d.ts +3 -0
- package/dist/features/arch/module-map-validation.js +30 -0
- package/dist/features/arch/module-mapping.d.ts +15 -0
- package/dist/features/arch/module-mapping.js +184 -0
- package/dist/features/arch/profiles.d.ts +4 -0
- package/dist/features/arch/profiles.js +8 -0
- package/dist/features/audit/append.d.ts +26 -0
- package/dist/features/audit/append.js +210 -0
- package/dist/features/audit/explain-table-tail.d.ts +2 -0
- package/dist/features/audit/explain-table-tail.js +29 -0
- package/dist/features/audit/explain-table.d.ts +8 -0
- package/dist/features/audit/explain-table.js +48 -0
- package/dist/features/audit/explain.d.ts +7 -0
- package/dist/features/audit/explain.js +87 -0
- package/dist/features/audit/index.d.ts +37 -0
- package/dist/features/audit/index.js +17 -0
- package/dist/features/audit/injection-event.d.ts +11 -0
- package/dist/features/audit/injection-event.js +17 -0
- package/dist/features/audit/read.d.ts +8 -0
- package/dist/features/audit/read.js +62 -0
- package/dist/features/audit/summarize.d.ts +1 -0
- package/dist/features/audit/summarize.js +41 -0
- package/dist/features/audit/surfaces.d.ts +47 -0
- package/dist/features/audit/surfaces.js +172 -0
- package/dist/features/audit/token-saver-evidence.d.ts +14 -0
- package/dist/features/audit/token-saver-evidence.js +85 -0
- package/dist/features/ci/changes.d.ts +28 -0
- package/dist/features/ci/changes.js +88 -0
- package/dist/features/ci/index.d.ts +22 -0
- package/dist/features/ci/index.js +75 -0
- package/dist/features/ci/protection-read.d.ts +3 -0
- package/dist/features/ci/protection-read.js +264 -0
- package/dist/features/ci/protection.d.ts +25 -0
- package/dist/features/ci/protection.js +101 -0
- package/dist/features/ci/workflow.d.ts +23 -0
- package/dist/features/ci/workflow.js +261 -0
- package/dist/features/config/human.d.ts +4 -0
- package/dist/features/config/human.js +31 -0
- package/dist/features/config/index.d.ts +37 -0
- package/dist/features/config/index.js +129 -0
- package/dist/features/config/pack-data.d.ts +18 -0
- package/dist/features/config/pack-data.js +116 -0
- package/dist/features/config/validate-sections.d.ts +6 -0
- package/dist/features/config/validate-sections.js +198 -0
- package/dist/features/config/validate-shared.d.ts +8 -0
- package/dist/features/config/validate-shared.js +69 -0
- package/dist/features/config/validate-tunables.d.ts +1 -0
- package/dist/features/config/validate-tunables.js +89 -0
- package/dist/features/config/validate.d.ts +2 -0
- package/dist/features/config/validate.js +57 -0
- package/dist/features/deps/bots.d.ts +5 -0
- package/dist/features/deps/bots.js +39 -0
- package/dist/features/deps/capabilities.d.ts +3 -0
- package/dist/features/deps/capabilities.js +91 -0
- package/dist/features/deps/check.d.ts +18 -0
- package/dist/features/deps/check.js +70 -0
- package/dist/features/deps/dependabot.d.ts +10 -0
- package/dist/features/deps/dependabot.js +154 -0
- package/dist/features/deps/eval.d.ts +41 -0
- package/dist/features/deps/eval.js +24 -0
- package/dist/features/deps/fields.d.ts +4 -0
- package/dist/features/deps/fields.js +18 -0
- package/dist/features/deps/index.d.ts +67 -0
- package/dist/features/deps/index.js +27 -0
- package/dist/features/deps/lockfile.d.ts +8 -0
- package/dist/features/deps/lockfile.js +87 -0
- package/dist/features/deps/npm.d.ts +22 -0
- package/dist/features/deps/npm.js +187 -0
- package/dist/features/deps/npmrc.d.ts +12 -0
- package/dist/features/deps/npmrc.js +50 -0
- package/dist/features/deps/nuget.d.ts +25 -0
- package/dist/features/deps/nuget.js +112 -0
- package/dist/features/deps/osv-ranges.d.ts +12 -0
- package/dist/features/deps/osv-ranges.js +83 -0
- package/dist/features/deps/osv.d.ts +16 -0
- package/dist/features/deps/osv.js +144 -0
- package/dist/features/deps/pypi-pyproject.d.ts +7 -0
- package/dist/features/deps/pypi-pyproject.js +118 -0
- package/dist/features/deps/pypi.d.ts +29 -0
- package/dist/features/deps/pypi.js +137 -0
- package/dist/features/deps/registry.d.ts +29 -0
- package/dist/features/deps/registry.js +158 -0
- package/dist/features/deps/renovate.d.ts +15 -0
- package/dist/features/deps/renovate.js +98 -0
- package/dist/features/deps/selection.d.ts +20 -0
- package/dist/features/deps/selection.js +150 -0
- package/dist/features/deps/snapshot-verdicts.d.ts +16 -0
- package/dist/features/deps/snapshot-verdicts.js +184 -0
- package/dist/features/deps/stable.d.ts +19 -0
- package/dist/features/deps/stable.js +131 -0
- package/dist/features/deps/step-size.d.ts +7 -0
- package/dist/features/deps/step-size.js +24 -0
- package/dist/features/deps/upgrade.d.ts +35 -0
- package/dist/features/deps/upgrade.js +124 -0
- package/dist/features/deps/verdicts.d.ts +21 -0
- package/dist/features/deps/verdicts.js +219 -0
- package/dist/features/engine/evaluate.d.ts +12 -0
- package/dist/features/engine/evaluate.js +170 -0
- package/dist/features/engine/index.d.ts +21 -0
- package/dist/features/engine/index.js +24 -0
- package/dist/features/engine/message.d.ts +3 -0
- package/dist/features/engine/message.js +69 -0
- package/dist/features/engine/ratchet.d.ts +1 -0
- package/dist/features/engine/ratchet.js +63 -0
- package/dist/features/engine/run-enforcer.d.ts +4 -0
- package/dist/features/engine/run-enforcer.js +82 -0
- package/dist/features/engine/waivers.d.ts +23 -0
- package/dist/features/engine/waivers.js +169 -0
- package/dist/features/generator/draft.d.ts +7 -0
- package/dist/features/generator/draft.js +148 -0
- package/dist/features/generator/index.d.ts +22 -0
- package/dist/features/generator/index.js +8 -0
- package/dist/features/generator/llm-draft.d.ts +3 -0
- package/dist/features/generator/llm-draft.js +93 -0
- package/dist/features/generator/prompt.d.ts +25 -0
- package/dist/features/generator/prompt.js +105 -0
- package/dist/features/generator/self-test.d.ts +12 -0
- package/dist/features/generator/self-test.js +65 -0
- package/dist/features/generator/templates.d.ts +26 -0
- package/dist/features/generator/templates.js +177 -0
- package/dist/features/integrity/drift.d.ts +19 -0
- package/dist/features/integrity/drift.js +168 -0
- package/dist/features/integrity/hooks.d.ts +19 -0
- package/dist/features/integrity/hooks.js +54 -0
- package/dist/features/integrity/index.d.ts +10 -0
- package/dist/features/integrity/index.js +14 -0
- package/dist/features/integrity/manifest.d.ts +15 -0
- package/dist/features/integrity/manifest.js +26 -0
- package/dist/features/integrity/self-protection.d.ts +12 -0
- package/dist/features/integrity/self-protection.js +144 -0
- package/dist/features/llm/attempt.d.ts +17 -0
- package/dist/features/llm/attempt.js +99 -0
- package/dist/features/llm/errors.d.ts +5 -0
- package/dist/features/llm/errors.js +18 -0
- package/dist/features/llm/index.d.ts +23 -0
- package/dist/features/llm/index.js +46 -0
- package/dist/features/llm/presets.d.ts +25 -0
- package/dist/features/llm/presets.js +159 -0
- package/dist/features/llm/wire.d.ts +17 -0
- package/dist/features/llm/wire.js +163 -0
- package/dist/features/packs/accept.d.ts +7 -0
- package/dist/features/packs/accept.js +73 -0
- package/dist/features/packs/enforcers/arch-guards.d.ts +12 -0
- package/dist/features/packs/enforcers/arch-guards.js +193 -0
- package/dist/features/packs/enforcers/binding.d.ts +31 -0
- package/dist/features/packs/enforcers/binding.js +157 -0
- package/dist/features/packs/enforcers/ci-guards.d.ts +10 -0
- package/dist/features/packs/enforcers/ci-guards.js +131 -0
- package/dist/features/packs/enforcers/code-health.d.ts +9 -0
- package/dist/features/packs/enforcers/code-health.js +180 -0
- package/dist/features/packs/enforcers/code.d.ts +5 -0
- package/dist/features/packs/enforcers/code.js +129 -0
- package/dist/features/packs/enforcers/command-forbid.d.ts +8 -0
- package/dist/features/packs/enforcers/command-forbid.js +61 -0
- package/dist/features/packs/enforcers/deps-guards.d.ts +15 -0
- package/dist/features/packs/enforcers/deps-guards.js +235 -0
- package/dist/features/packs/enforcers/deps-policy-guards.d.ts +9 -0
- package/dist/features/packs/enforcers/deps-policy-guards.js +135 -0
- package/dist/features/packs/enforcers/docs-guards-measures.d.ts +9 -0
- package/dist/features/packs/enforcers/docs-guards-measures.js +117 -0
- package/dist/features/packs/enforcers/docs-guards.d.ts +11 -0
- package/dist/features/packs/enforcers/docs-guards.js +180 -0
- package/dist/features/packs/enforcers/engine-version-guards.d.ts +6 -0
- package/dist/features/packs/enforcers/engine-version-guards.js +42 -0
- package/dist/features/packs/enforcers/external-attribute.d.ts +18 -0
- package/dist/features/packs/enforcers/external-attribute.js +122 -0
- package/dist/features/packs/enforcers/external-bind.d.ts +4 -0
- package/dist/features/packs/enforcers/external-bind.js +206 -0
- package/dist/features/packs/enforcers/external-check.d.ts +7 -0
- package/dist/features/packs/enforcers/external-check.js +131 -0
- package/dist/features/packs/enforcers/external-output.d.ts +30 -0
- package/dist/features/packs/enforcers/external-output.js +144 -0
- package/dist/features/packs/enforcers/external-probe.d.ts +4 -0
- package/dist/features/packs/enforcers/external-probe.js +65 -0
- package/dist/features/packs/enforcers/external-runs.d.ts +33 -0
- package/dist/features/packs/enforcers/external-runs.js +162 -0
- package/dist/features/packs/enforcers/external-sarif.d.ts +3 -0
- package/dist/features/packs/enforcers/external-sarif.js +109 -0
- package/dist/features/packs/enforcers/external.d.ts +39 -0
- package/dist/features/packs/enforcers/external.js +11 -0
- package/dist/features/packs/enforcers/gate-guards.d.ts +11 -0
- package/dist/features/packs/enforcers/gate-guards.js +117 -0
- package/dist/features/packs/enforcers/health-abstraction.d.ts +5 -0
- package/dist/features/packs/enforcers/health-abstraction.js +126 -0
- package/dist/features/packs/enforcers/health-duplication.d.ts +5 -0
- package/dist/features/packs/enforcers/health-duplication.js +197 -0
- package/dist/features/packs/enforcers/health-lex-imports.d.ts +5 -0
- package/dist/features/packs/enforcers/health-lex-imports.js +225 -0
- package/dist/features/packs/enforcers/health-lex-template.d.ts +10 -0
- package/dist/features/packs/enforcers/health-lex-template.js +67 -0
- package/dist/features/packs/enforcers/health-lex.d.ts +8 -0
- package/dist/features/packs/enforcers/health-lex.js +227 -0
- package/dist/features/packs/enforcers/health-markers.d.ts +3 -0
- package/dist/features/packs/enforcers/health-markers.js +31 -0
- package/dist/features/packs/enforcers/health-measures.d.ts +26 -0
- package/dist/features/packs/enforcers/health-measures.js +223 -0
- package/dist/features/packs/enforcers/health-refs.d.ts +5 -0
- package/dist/features/packs/enforcers/health-refs.js +76 -0
- package/dist/features/packs/enforcers/integrity-guards-repo.d.ts +6 -0
- package/dist/features/packs/enforcers/integrity-guards-repo.js +189 -0
- package/dist/features/packs/enforcers/integrity-guards.d.ts +12 -0
- package/dist/features/packs/enforcers/integrity-guards.js +202 -0
- package/dist/features/packs/enforcers/jsonkey.d.ts +13 -0
- package/dist/features/packs/enforcers/jsonkey.js +95 -0
- package/dist/features/packs/enforcers/parametric.d.ts +7 -0
- package/dist/features/packs/enforcers/parametric.js +138 -0
- package/dist/features/packs/enforcers/pattern.d.ts +11 -0
- package/dist/features/packs/enforcers/pattern.js +88 -0
- package/dist/features/packs/enforcers/placement.d.ts +10 -0
- package/dist/features/packs/enforcers/placement.js +54 -0
- package/dist/features/packs/enforcers/py-checks.d.ts +7 -0
- package/dist/features/packs/enforcers/py-checks.js +131 -0
- package/dist/features/packs/enforcers/py-lex.d.ts +10 -0
- package/dist/features/packs/enforcers/py-lex.js +271 -0
- package/dist/features/packs/enforcers/py-phantom.d.ts +6 -0
- package/dist/features/packs/enforcers/py-phantom.js +163 -0
- package/dist/features/packs/enforcers/py-pins.d.ts +16 -0
- package/dist/features/packs/enforcers/py-pins.js +184 -0
- package/dist/features/packs/enforcers/py-security-patterns.d.ts +18 -0
- package/dist/features/packs/enforcers/py-security-patterns.js +70 -0
- package/dist/features/packs/enforcers/records-guards.d.ts +12 -0
- package/dist/features/packs/enforcers/records-guards.js +178 -0
- package/dist/features/packs/enforcers/remediation-guards.d.ts +6 -0
- package/dist/features/packs/enforcers/remediation-guards.js +42 -0
- package/dist/features/packs/enforcers/required.d.ts +10 -0
- package/dist/features/packs/enforcers/required.js +65 -0
- package/dist/features/packs/enforcers/secret-scan.d.ts +6 -0
- package/dist/features/packs/enforcers/secret-scan.js +173 -0
- package/dist/features/packs/enforcers/shell-analyse.d.ts +14 -0
- package/dist/features/packs/enforcers/shell-analyse.js +105 -0
- package/dist/features/packs/enforcers/sizes.d.ts +10 -0
- package/dist/features/packs/enforcers/sizes.js +82 -0
- package/dist/features/packs/enforcers/steering-guards.d.ts +11 -0
- package/dist/features/packs/enforcers/steering-guards.js +162 -0
- package/dist/features/packs/enforcers/testing-guards.d.ts +10 -0
- package/dist/features/packs/enforcers/testing-guards.js +118 -0
- package/dist/features/packs/enforcers/ts-checks.d.ts +7 -0
- package/dist/features/packs/enforcers/ts-checks.js +147 -0
- package/dist/features/packs/enforcers/ts-phantom-host.d.ts +11 -0
- package/dist/features/packs/enforcers/ts-phantom-host.js +155 -0
- package/dist/features/packs/enforcers/ts-phantom.d.ts +6 -0
- package/dist/features/packs/enforcers/ts-phantom.js +117 -0
- package/dist/features/packs/enforcers/ts-security-patterns.d.ts +18 -0
- package/dist/features/packs/enforcers/ts-security-patterns.js +97 -0
- package/dist/features/packs/enforcers/workflow-guards.d.ts +10 -0
- package/dist/features/packs/enforcers/workflow-guards.js +117 -0
- package/dist/features/packs/enforcers/write-confine.d.ts +13 -0
- package/dist/features/packs/enforcers/write-confine.js +131 -0
- package/dist/features/packs/hashes.d.ts +6 -0
- package/dist/features/packs/hashes.js +84 -0
- package/dist/features/packs/index.d.ts +22 -0
- package/dist/features/packs/index.js +15 -0
- package/dist/features/packs/loader.d.ts +13 -0
- package/dist/features/packs/loader.js +205 -0
- package/dist/features/packs/manifest-decl.d.ts +13 -0
- package/dist/features/packs/manifest-decl.js +121 -0
- package/dist/features/packs/manifest.d.ts +7 -0
- package/dist/features/packs/manifest.js +95 -0
- package/dist/features/packs/params.d.ts +2 -0
- package/dist/features/packs/params.js +90 -0
- package/dist/features/packs/registry.d.ts +11 -0
- package/dist/features/packs/registry.js +136 -0
- package/dist/features/packs/selftest.d.ts +3 -0
- package/dist/features/packs/selftest.js +144 -0
- package/dist/features/records/bug-grammar.d.ts +17 -0
- package/dist/features/records/bug-grammar.js +128 -0
- package/dist/features/records/bug-registry.d.ts +9 -0
- package/dist/features/records/bug-registry.js +67 -0
- package/dist/features/records/bug-rows-immutable.d.ts +3 -0
- package/dist/features/records/bug-rows-immutable.js +52 -0
- package/dist/features/records/bugs.d.ts +2 -0
- package/dist/features/records/bugs.js +24 -0
- package/dist/features/records/docs-lines.d.ts +16 -0
- package/dist/features/records/docs-lines.js +36 -0
- package/dist/features/records/docs-prose.d.ts +14 -0
- package/dist/features/records/docs-prose.js +252 -0
- package/dist/features/records/docs-structure.d.ts +17 -0
- package/dist/features/records/docs-structure.js +223 -0
- package/dist/features/records/docs.d.ts +9 -0
- package/dist/features/records/docs.js +238 -0
- package/dist/features/records/history-checks.d.ts +6 -0
- package/dist/features/records/history-checks.js +94 -0
- package/dist/features/records/history-parse.d.ts +16 -0
- package/dist/features/records/history-parse.js +101 -0
- package/dist/features/records/history-scope.d.ts +5 -0
- package/dist/features/records/history-scope.js +86 -0
- package/dist/features/records/history.d.ts +3 -0
- package/dist/features/records/history.js +5 -0
- package/dist/features/records/index.d.ts +8 -0
- package/dist/features/records/index.js +11 -0
- package/dist/features/remediation/adoption.d.ts +32 -0
- package/dist/features/remediation/adoption.js +142 -0
- package/dist/features/remediation/index.d.ts +12 -0
- package/dist/features/remediation/index.js +21 -0
- package/dist/features/remediation/plan-chains.d.ts +3 -0
- package/dist/features/remediation/plan-chains.js +111 -0
- package/dist/features/remediation/plan-generate.d.ts +3 -0
- package/dist/features/remediation/plan-generate.js +129 -0
- package/dist/features/remediation/plan-kinds.d.ts +32 -0
- package/dist/features/remediation/plan-kinds.js +42 -0
- package/dist/features/remediation/plan-markers.d.ts +2 -0
- package/dist/features/remediation/plan-markers.js +155 -0
- package/dist/features/remediation/plan-merge.d.ts +6 -0
- package/dist/features/remediation/plan-merge.js +33 -0
- package/dist/features/remediation/plan.d.ts +4 -0
- package/dist/features/remediation/plan.js +7 -0
- package/dist/features/remediation/step-floor.d.ts +5 -0
- package/dist/features/remediation/step-floor.js +76 -0
- package/dist/features/remediation/step-gates.d.ts +18 -0
- package/dist/features/remediation/step-gates.js +77 -0
- package/dist/features/remediation/step-split.d.ts +12 -0
- package/dist/features/remediation/step-split.js +75 -0
- package/dist/features/remediation/steps.d.ts +3 -0
- package/dist/features/remediation/steps.js +6 -0
- package/dist/features/remediation/types.d.ts +37 -0
- package/dist/features/remediation/types.js +1 -0
- package/dist/features/security/index.d.ts +12 -0
- package/dist/features/security/index.js +142 -0
- package/dist/features/steering/agent-assets.d.ts +7 -0
- package/dist/features/steering/agent-assets.js +75 -0
- package/dist/features/steering/budgets.d.ts +20 -0
- package/dist/features/steering/budgets.js +86 -0
- package/dist/features/steering/checks.d.ts +7 -0
- package/dist/features/steering/checks.js +67 -0
- package/dist/features/steering/context-file.d.ts +11 -0
- package/dist/features/steering/context-file.js +107 -0
- package/dist/features/steering/graph-scan.d.ts +7 -0
- package/dist/features/steering/graph-scan.js +17 -0
- package/dist/features/steering/index.d.ts +30 -0
- package/dist/features/steering/index.js +45 -0
- package/dist/features/steering/injection.d.ts +23 -0
- package/dist/features/steering/injection.js +124 -0
- package/dist/features/steering/mcp.d.ts +2 -0
- package/dist/features/steering/mcp.js +18 -0
- package/dist/features/steering/precedence.d.ts +10 -0
- package/dist/features/steering/precedence.js +28 -0
- package/dist/features/steering/read-cache.d.ts +13 -0
- package/dist/features/steering/read-cache.js +51 -0
- package/dist/features/testing/base.d.ts +1 -0
- package/dist/features/testing/base.js +8 -0
- package/dist/features/testing/covers.d.ts +8 -0
- package/dist/features/testing/covers.js +50 -0
- package/dist/features/testing/evaluate.d.ts +19 -0
- package/dist/features/testing/evaluate.js +47 -0
- package/dist/features/testing/index.d.ts +10 -0
- package/dist/features/testing/index.js +13 -0
- package/dist/features/testing/integrity.d.ts +28 -0
- package/dist/features/testing/integrity.js +140 -0
- package/dist/features/testing/ledger.d.ts +11 -0
- package/dist/features/testing/ledger.js +51 -0
- package/dist/features/testing/proofs.d.ts +26 -0
- package/dist/features/testing/proofs.js +88 -0
- package/dist/features/testing/report.d.ts +6 -0
- package/dist/features/testing/report.js +16 -0
- package/dist/features/testing/scenarios.d.ts +34 -0
- package/dist/features/testing/scenarios.js +112 -0
- package/dist/features/testing/tap-parser.d.ts +9 -0
- package/dist/features/testing/tap-parser.js +96 -0
- package/dist/features/testing/trace.d.ts +23 -0
- package/dist/features/testing/trace.js +110 -0
- package/dist/features/workflow/index.d.ts +14 -0
- package/dist/features/workflow/index.js +19 -0
- package/dist/features/workflow/loop.d.ts +5 -0
- package/dist/features/workflow/loop.js +36 -0
- package/dist/features/workflow/phases.d.ts +10 -0
- package/dist/features/workflow/phases.js +184 -0
- package/dist/features/workflow/review.d.ts +25 -0
- package/dist/features/workflow/review.js +119 -0
- package/dist/features/workflow/tasks.d.ts +73 -0
- package/dist/features/workflow/tasks.js +80 -0
- package/dist/features/workflow/writes.d.ts +8 -0
- package/dist/features/workflow/writes.js +96 -0
- package/dist/kernel/clock.d.ts +4 -0
- package/dist/kernel/clock.js +5 -0
- package/dist/kernel/config-keys.d.ts +2 -0
- package/dist/kernel/config-keys.js +5 -0
- package/dist/kernel/config-toml-keys.d.ts +2 -0
- package/dist/kernel/config-toml-keys.js +237 -0
- package/dist/kernel/config-yaml-keys.d.ts +2 -0
- package/dist/kernel/config-yaml-keys.js +177 -0
- package/dist/kernel/contracts.d.ts +76 -0
- package/dist/kernel/contracts.js +9 -0
- package/dist/kernel/entry.d.ts +1 -0
- package/dist/kernel/entry.js +31 -0
- package/dist/kernel/env.d.ts +4 -0
- package/dist/kernel/env.js +5 -0
- package/dist/kernel/errors.d.ts +7 -0
- package/dist/kernel/errors.js +6 -0
- package/dist/kernel/fs-confine.d.ts +14 -0
- package/dist/kernel/fs-confine.js +129 -0
- package/dist/kernel/fs-errors.d.ts +8 -0
- package/dist/kernel/fs-errors.js +37 -0
- package/dist/kernel/fs.d.ts +28 -0
- package/dist/kernel/fs.js +245 -0
- package/dist/kernel/git.d.ts +16 -0
- package/dist/kernel/git.js +128 -0
- package/dist/kernel/glob.d.ts +1 -0
- package/dist/kernel/glob.js +178 -0
- package/dist/kernel/hash.d.ts +3 -0
- package/dist/kernel/hash.js +12 -0
- package/dist/kernel/host.d.ts +3 -0
- package/dist/kernel/host.js +48 -0
- package/dist/kernel/index.d.ts +115 -0
- package/dist/kernel/index.js +33 -0
- package/dist/kernel/json.d.ts +4 -0
- package/dist/kernel/json.js +68 -0
- package/dist/kernel/net-allow.d.ts +8 -0
- package/dist/kernel/net-allow.js +45 -0
- package/dist/kernel/net-fetch.d.ts +5 -0
- package/dist/kernel/net-fetch.js +135 -0
- package/dist/kernel/net.d.ts +10 -0
- package/dist/kernel/net.js +24 -0
- package/dist/kernel/path.d.ts +3 -0
- package/dist/kernel/path.js +40 -0
- package/dist/kernel/pattern.d.ts +2 -0
- package/dist/kernel/pattern.js +150 -0
- package/dist/kernel/proc.d.ts +6 -0
- package/dist/kernel/proc.js +207 -0
- package/dist/kernel/read-cache.d.ts +6 -0
- package/dist/kernel/read-cache.js +27 -0
- package/dist/kernel/redact.d.ts +1 -0
- package/dist/kernel/redact.js +206 -0
- package/dist/kernel/repo-root.d.ts +3 -0
- package/dist/kernel/repo-root.js +29 -0
- package/dist/kernel/result.d.ts +10 -0
- package/dist/kernel/result.js +6 -0
- package/dist/kernel/schema-helpers.d.ts +11 -0
- package/dist/kernel/schema-helpers.js +101 -0
- package/dist/kernel/schema.d.ts +2 -0
- package/dist/kernel/schema.js +203 -0
- package/dist/kernel/secret-paths.d.ts +3 -0
- package/dist/kernel/secret-paths.js +70 -0
- package/dist/kernel/shell-bypass.d.ts +4 -0
- package/dist/kernel/shell-bypass.js +151 -0
- package/dist/kernel/shell-cmd.d.ts +6 -0
- package/dist/kernel/shell-cmd.js +213 -0
- package/dist/kernel/shell-deny-cmd.d.ts +7 -0
- package/dist/kernel/shell-deny-cmd.js +35 -0
- package/dist/kernel/shell-deny-destroy.d.ts +7 -0
- package/dist/kernel/shell-deny-destroy.js +71 -0
- package/dist/kernel/shell-deny-escalate.d.ts +7 -0
- package/dist/kernel/shell-deny-escalate.js +96 -0
- package/dist/kernel/shell-deny-target.d.ts +4 -0
- package/dist/kernel/shell-deny-target.js +51 -0
- package/dist/kernel/shell-deny.d.ts +8 -0
- package/dist/kernel/shell-deny.js +171 -0
- package/dist/kernel/shell-scan.d.ts +3 -0
- package/dist/kernel/shell-scan.js +226 -0
- package/dist/kernel/shell-word.d.ts +15 -0
- package/dist/kernel/shell-word.js +216 -0
- package/dist/kernel/shell.d.ts +22 -0
- package/dist/kernel/shell.js +2 -0
- package/dist/kernel/stdin.d.ts +2 -0
- package/dist/kernel/stdin.js +59 -0
- package/dist/kernel/test-report.d.ts +7 -0
- package/dist/kernel/test-report.js +112 -0
- package/dist/kernel/version.d.ts +2 -0
- package/dist/kernel/version.js +46 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +19 -11
- package/schema/accepted.schema.json +20 -0
- package/schema/baseline.schema.json +17 -0
- package/schema/capability.schema.json +31 -0
- package/schema/cli/error.schema.json +15 -0
- package/schema/cli/explain.schema.json +19 -0
- package/schema/cli/report.schema.json +15 -0
- package/schema/cli/status.schema.json +51 -0
- package/schema/cli/verify.schema.json +15 -0
- package/schema/config.schema.json +43 -0
- package/schema/event-log.schema.json +52 -0
- package/schema/hook-decision.schema.json +13 -0
- package/schema/hook-event.schema.json +50 -0
- package/schema/manifest.schema.json +26 -0
- package/schema/pack-draft.schema.json +42 -0
- package/schema/pack.schema.json +70 -0
- package/schema/registry-snapshot.schema.json +41 -0
- package/schema/remediation-plan.schema.json +44 -0
- package/schema/review-findings.schema.json +25 -0
- package/schema/task-record.schema.json +49 -0
- package/schema/waivers.schema.json +29 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// SPEC §4.7.1 detectors, implemented here in the kernel so engine, audit,
|
|
2
|
+
// adapters and generator can redact without importing security (§3.3).
|
|
3
|
+
// Every match is replaced by its first 4 characters plus its length;
|
|
4
|
+
// env references, placeholders and fixture paths are left unchanged.
|
|
5
|
+
const KNOWN_FORMATS = [
|
|
6
|
+
/-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z0-9 ]*PRIVATE KEY-----/g,
|
|
7
|
+
/\bAKIA[0-9A-Z]{16}\b/g,
|
|
8
|
+
/\bghp_[A-Za-z0-9]{36,}\b/g,
|
|
9
|
+
/\bgho_[A-Za-z0-9]{36,}\b/g,
|
|
10
|
+
/\bghs_[A-Za-z0-9]{36,}\b/g,
|
|
11
|
+
/\bghu_[A-Za-z0-9]{36,}\b/g,
|
|
12
|
+
/\bghr_[A-Za-z0-9]{36,}\b/g,
|
|
13
|
+
/\bgithub_pat_[A-Za-z0-9_]{22,}\b/g,
|
|
14
|
+
/\bglpat-[A-Za-z0-9_-]{20,}/g,
|
|
15
|
+
/\bxox[abposr]-[A-Za-z0-9-]{8,}/g,
|
|
16
|
+
/\b[rs]k_live_[A-Za-z0-9]{16,}/g,
|
|
17
|
+
/\bAIza[A-Za-z0-9_-]{35}\b/g,
|
|
18
|
+
/\bnpm_[A-Za-z0-9]{36}\b/g,
|
|
19
|
+
/\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{20,}/g,
|
|
20
|
+
/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,
|
|
21
|
+
];
|
|
22
|
+
// Keyword-first half of the assignment detector (SPEC §4.7.1): the same
|
|
23
|
+
// keyword alternation the old `["']?([A-Za-z0-9_.$-]*...)` pattern used,
|
|
24
|
+
// run alone so the engine can use a literal search instead of backtracking
|
|
25
|
+
// the leading name-character run at every position.
|
|
26
|
+
const KEYWORD_PATTERN = /secret|token|passw(?:or)?d|api[_-]?key|private[_-]?key|client[_-]?secret/gi;
|
|
27
|
+
// Sticky tail of an assignment match, anchored at the end of the keyword:
|
|
28
|
+
// the optional quote, separator and value run of the original pattern,
|
|
29
|
+
// split so the value (group 2) stays available for the entropy check.
|
|
30
|
+
const ASSIGNMENT_MID = /["']?\s*[:=]\s*["']?/y;
|
|
31
|
+
const ASSIGNMENT_VALUE = /[^\s"'`;,]+/y;
|
|
32
|
+
const ALLOW_PATTERNS = [
|
|
33
|
+
/process\.env\.[A-Za-z_][A-Za-z0-9_]*/g,
|
|
34
|
+
/\$\{[A-Za-z_][A-Za-z0-9_]*\}/g,
|
|
35
|
+
/\$[A-Za-z_][A-Za-z0-9_]*/g,
|
|
36
|
+
/os\.environ\s*\[[^\]\n]*\]/g,
|
|
37
|
+
];
|
|
38
|
+
const PLACEHOLDER_PATTERN = /^(?:x+|changeme|example|your[-_].*|<.*>)$/i;
|
|
39
|
+
function allowSpans(text) {
|
|
40
|
+
const spans = [];
|
|
41
|
+
for (const pattern of ALLOW_PATTERNS) {
|
|
42
|
+
pattern.lastIndex = 0;
|
|
43
|
+
let match = pattern.exec(text);
|
|
44
|
+
while (match !== null) {
|
|
45
|
+
spans.push({
|
|
46
|
+
start: match.index,
|
|
47
|
+
end: match.index + match[0].length,
|
|
48
|
+
replacement: match[0],
|
|
49
|
+
});
|
|
50
|
+
match = pattern.exec(text);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return spans;
|
|
54
|
+
}
|
|
55
|
+
// The `[A-Za-z0-9_.$-]` name class of the assignment detector as char
|
|
56
|
+
// codes, for the backward scan to the start of the name run.
|
|
57
|
+
function isNameChar(code) {
|
|
58
|
+
return ((code >= 0x30 && code <= 0x39) ||
|
|
59
|
+
(code >= 0x41 && code <= 0x5a) ||
|
|
60
|
+
(code >= 0x61 && code <= 0x7a) ||
|
|
61
|
+
code === 0x24 ||
|
|
62
|
+
code === 0x2e ||
|
|
63
|
+
code === 0x2d ||
|
|
64
|
+
code === 0x5f);
|
|
65
|
+
}
|
|
66
|
+
function isQuote(value) {
|
|
67
|
+
return value === '"' || value === "'";
|
|
68
|
+
}
|
|
69
|
+
function redact(match) {
|
|
70
|
+
return `${match.slice(0, 4)}…(${match.length})`;
|
|
71
|
+
}
|
|
72
|
+
function shannonPerChar(value) {
|
|
73
|
+
const counts = new Map();
|
|
74
|
+
for (const char of value) {
|
|
75
|
+
counts.set(char, (counts.get(char) ?? 0) + 1);
|
|
76
|
+
}
|
|
77
|
+
let entropy = 0;
|
|
78
|
+
for (const count of counts.values()) {
|
|
79
|
+
const probability = count / value.length;
|
|
80
|
+
entropy -= probability * Math.log2(probability);
|
|
81
|
+
}
|
|
82
|
+
return entropy;
|
|
83
|
+
}
|
|
84
|
+
function isAllowedSecret(candidate) {
|
|
85
|
+
return PLACEHOLDER_PATTERN.test(candidate);
|
|
86
|
+
}
|
|
87
|
+
function assignmentSpans(text) {
|
|
88
|
+
const spans = [];
|
|
89
|
+
// Keyword-first scan: the original leading `[A-Za-z0-9_.$-]*` made the
|
|
90
|
+
// engine backtrack over every long run of name characters (quadratic on
|
|
91
|
+
// inputs like 65KB of `a`). Anchoring each attempt at a keyword keeps
|
|
92
|
+
// every scan over disjoint input. The original pattern also allowed
|
|
93
|
+
// trailing name characters after the keyword (`aws_secret_access_key`),
|
|
94
|
+
// so the separator check runs at the end of the name run; the floor
|
|
95
|
+
// advances past every examined run, keeping the scan linear.
|
|
96
|
+
KEYWORD_PATTERN.lastIndex = 0;
|
|
97
|
+
let keyword = KEYWORD_PATTERN.exec(text);
|
|
98
|
+
let floor = 0;
|
|
99
|
+
while (keyword !== null) {
|
|
100
|
+
const keywordStart = keyword.index;
|
|
101
|
+
const keywordEnd = keywordStart + keyword[0].length;
|
|
102
|
+
if (keywordStart >= floor) {
|
|
103
|
+
let nameEnd = keywordEnd;
|
|
104
|
+
while (nameEnd < text.length && isNameChar(text.charCodeAt(nameEnd))) {
|
|
105
|
+
nameEnd += 1;
|
|
106
|
+
}
|
|
107
|
+
floor = nameEnd;
|
|
108
|
+
ASSIGNMENT_MID.lastIndex = nameEnd;
|
|
109
|
+
const mid = ASSIGNMENT_MID.exec(text);
|
|
110
|
+
if (mid !== null) {
|
|
111
|
+
ASSIGNMENT_VALUE.lastIndex = ASSIGNMENT_MID.lastIndex;
|
|
112
|
+
const value = ASSIGNMENT_VALUE.exec(text);
|
|
113
|
+
if (value !== null) {
|
|
114
|
+
let end = ASSIGNMENT_VALUE.lastIndex;
|
|
115
|
+
if (isQuote(text[end])) {
|
|
116
|
+
end += 1;
|
|
117
|
+
}
|
|
118
|
+
let start = keywordStart;
|
|
119
|
+
while (start > 0 && isNameChar(text.charCodeAt(start - 1))) {
|
|
120
|
+
start -= 1;
|
|
121
|
+
}
|
|
122
|
+
if (start > 0 && isQuote(text[start - 1])) {
|
|
123
|
+
start -= 1;
|
|
124
|
+
}
|
|
125
|
+
const candidate = value[0];
|
|
126
|
+
const full = text.slice(start, end);
|
|
127
|
+
if (candidate.length >= 20 &&
|
|
128
|
+
shannonPerChar(candidate) >= 4 &&
|
|
129
|
+
!isAllowedSecret(candidate)) {
|
|
130
|
+
spans.push({
|
|
131
|
+
start,
|
|
132
|
+
end,
|
|
133
|
+
replacement: redact(full),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
floor = end;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
keyword = KEYWORD_PATTERN.exec(text);
|
|
141
|
+
}
|
|
142
|
+
return spans;
|
|
143
|
+
}
|
|
144
|
+
function formatSpans(text) {
|
|
145
|
+
const spans = [];
|
|
146
|
+
for (const pattern of KNOWN_FORMATS) {
|
|
147
|
+
pattern.lastIndex = 0;
|
|
148
|
+
let match = pattern.exec(text);
|
|
149
|
+
while (match !== null) {
|
|
150
|
+
const found = match[0];
|
|
151
|
+
if (!isAllowedSecret(found)) {
|
|
152
|
+
spans.push({
|
|
153
|
+
start: match.index,
|
|
154
|
+
end: match.index + found.length,
|
|
155
|
+
replacement: redact(found),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
match = pattern.exec(text);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return spans;
|
|
162
|
+
}
|
|
163
|
+
function mergeSpans(spans) {
|
|
164
|
+
const sorted = [...spans].sort((a, b) => a.start - b.start || b.end - a.end);
|
|
165
|
+
const merged = [];
|
|
166
|
+
for (const span of sorted) {
|
|
167
|
+
const last = merged[merged.length - 1];
|
|
168
|
+
if (last === undefined || span.start >= last.end) {
|
|
169
|
+
merged.push(span);
|
|
170
|
+
}
|
|
171
|
+
else if (span.end > last.end) {
|
|
172
|
+
merged[merged.length - 1] = { ...last, end: span.end };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return merged;
|
|
176
|
+
}
|
|
177
|
+
export function redactSecrets(text) {
|
|
178
|
+
// Both lists are sorted and non-overlapping after merging, so one sweep
|
|
179
|
+
// each replaces the per-candidate overlap scans (SPEC §4.7.1: the sort
|
|
180
|
+
// keeps the widest of overlapping candidates first, so the survivor is
|
|
181
|
+
// unchanged).
|
|
182
|
+
const allowed = mergeSpans(allowSpans(text));
|
|
183
|
+
const candidates = [...formatSpans(text), ...assignmentSpans(text)];
|
|
184
|
+
candidates.sort((a, b) => a.start - b.start || b.end - a.end);
|
|
185
|
+
const parts = [];
|
|
186
|
+
let cursor = 0;
|
|
187
|
+
let allowedIndex = 0;
|
|
188
|
+
for (const span of candidates) {
|
|
189
|
+
if (span.start < cursor) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
while (allowedIndex < allowed.length &&
|
|
193
|
+
(allowed[allowedIndex]?.end ?? 0) <= span.start) {
|
|
194
|
+
allowedIndex += 1;
|
|
195
|
+
}
|
|
196
|
+
const blocker = allowed[allowedIndex];
|
|
197
|
+
if (blocker !== undefined && blocker.start < span.end) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
parts.push(text.slice(cursor, span.start));
|
|
201
|
+
parts.push(span.replacement);
|
|
202
|
+
cursor = span.end;
|
|
203
|
+
}
|
|
204
|
+
parts.push(text.slice(cursor));
|
|
205
|
+
return parts.join("");
|
|
206
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// SPEC §4.1.1: repo-root resolution for the Fs port. Walks up from a start
|
|
2
|
+
// directory to the nearest ancestor holding a `.git` entry and returns its
|
|
3
|
+
// canonical (symlink-resolved) path. Anything else is CDX-E703, never a guess.
|
|
4
|
+
import { promises as fsp } from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { makeError } from "./errors.js";
|
|
7
|
+
import { err, ok } from "./result.js";
|
|
8
|
+
export async function pathExists(target) {
|
|
9
|
+
try {
|
|
10
|
+
await fsp.access(target);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function resolveRepoRoot(startDir) {
|
|
18
|
+
let dir = path.resolve(startDir);
|
|
19
|
+
while (true) {
|
|
20
|
+
if (await pathExists(path.join(dir, ".git"))) {
|
|
21
|
+
return ok(await fsp.realpath(dir));
|
|
22
|
+
}
|
|
23
|
+
const parent = path.dirname(dir);
|
|
24
|
+
if (parent === dir) {
|
|
25
|
+
return err(makeError("CDX-E703", `no git repository above ${startDir}`, "Run inside a git repository so paths resolve against its root."));
|
|
26
|
+
}
|
|
27
|
+
dir = parent;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CdxError } from "./errors.ts";
|
|
2
|
+
export type Result<T> = {
|
|
3
|
+
readonly ok: true;
|
|
4
|
+
readonly value: T;
|
|
5
|
+
} | {
|
|
6
|
+
readonly ok: false;
|
|
7
|
+
readonly error: CdxError;
|
|
8
|
+
};
|
|
9
|
+
export declare function ok<T>(value: T): Result<T>;
|
|
10
|
+
export declare function err<T>(error: CdxError): Result<T>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Result } from "./result.ts";
|
|
2
|
+
export declare const SUPPORTED_KEYWORDS: ReadonlySet<string>;
|
|
3
|
+
export declare const MAX_REF_DEPTH: number;
|
|
4
|
+
export declare function isObjectRecord(value: unknown): value is Record<string, unknown>;
|
|
5
|
+
export declare function field(schema: Record<string, unknown>, name: string): unknown;
|
|
6
|
+
export declare function jsonType(value: unknown): string;
|
|
7
|
+
export declare function mismatch(path: string, expected: string, detail?: string): Result<void>;
|
|
8
|
+
export declare function unsupported(keyword: string): Result<void>;
|
|
9
|
+
export declare function resolvePointer(root: unknown, pointer: string): unknown;
|
|
10
|
+
export declare function checkType(expected: unknown, value: unknown, path: string): Result<void> | undefined;
|
|
11
|
+
export declare function checkRange(schema: Record<string, unknown>, value: number, path: string): Result<void> | undefined;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// SPEC §4.1.2: primitives for the JSON Schema 2020-12 subset validator.
|
|
2
|
+
// Keyword policy, JSON typing, diagnostics, $ref pointer resolution and the
|
|
3
|
+
// non-recursive scalar checks live here. Nothing here recurses into
|
|
4
|
+
// validateAgainst, so schema.ts can import this file without a cycle.
|
|
5
|
+
import { makeError } from "./errors.js";
|
|
6
|
+
import { err } from "./result.js";
|
|
7
|
+
export const SUPPORTED_KEYWORDS = new Set([
|
|
8
|
+
"type",
|
|
9
|
+
"properties",
|
|
10
|
+
"required",
|
|
11
|
+
"additionalProperties",
|
|
12
|
+
"items",
|
|
13
|
+
"enum",
|
|
14
|
+
"const",
|
|
15
|
+
"pattern",
|
|
16
|
+
"minimum",
|
|
17
|
+
"maximum",
|
|
18
|
+
"minLength",
|
|
19
|
+
"maxLength",
|
|
20
|
+
"minItems",
|
|
21
|
+
"maxItems",
|
|
22
|
+
"oneOf",
|
|
23
|
+
"$ref",
|
|
24
|
+
"$defs",
|
|
25
|
+
"definitions",
|
|
26
|
+
]);
|
|
27
|
+
export const MAX_REF_DEPTH = 32;
|
|
28
|
+
export function isObjectRecord(value) {
|
|
29
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
30
|
+
}
|
|
31
|
+
// Bracket access through a variable keeps noPropertyAccessFromIndexSignature
|
|
32
|
+
// (tsconfig.base.json) satisfied without tripping useLiteralKeys.
|
|
33
|
+
export function field(schema, name) {
|
|
34
|
+
return schema[name];
|
|
35
|
+
}
|
|
36
|
+
export function jsonType(value) {
|
|
37
|
+
if (value === null) {
|
|
38
|
+
return "null";
|
|
39
|
+
}
|
|
40
|
+
if (Array.isArray(value)) {
|
|
41
|
+
return "array";
|
|
42
|
+
}
|
|
43
|
+
if (typeof value === "number") {
|
|
44
|
+
return Number.isInteger(value) ? "integer" : "number";
|
|
45
|
+
}
|
|
46
|
+
return typeof value;
|
|
47
|
+
}
|
|
48
|
+
export function mismatch(path, expected, detail) {
|
|
49
|
+
return err(makeError("CDX-E101", `value at ${path} is invalid: expected ${expected}`, "Fix the value so it matches the schema, then retry.", detail));
|
|
50
|
+
}
|
|
51
|
+
export function unsupported(keyword) {
|
|
52
|
+
return err(makeError("CDX-E201", `schema uses unsupported keyword "${keyword}"`, "Remove the keyword or teach the kernel validator about it (SPEC §4.1.2)."));
|
|
53
|
+
}
|
|
54
|
+
export function resolvePointer(root, pointer) {
|
|
55
|
+
if (pointer === "#") {
|
|
56
|
+
return root;
|
|
57
|
+
}
|
|
58
|
+
if (!pointer.startsWith("#/")) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
let current = root;
|
|
62
|
+
for (const raw of pointer.slice(2).split("/")) {
|
|
63
|
+
const part = raw.replace(/~1/g, "/").replace(/~0/g, "~");
|
|
64
|
+
if (isObjectRecord(current)) {
|
|
65
|
+
current = current[part];
|
|
66
|
+
}
|
|
67
|
+
else if (Array.isArray(current)) {
|
|
68
|
+
const index = Number.parseInt(part, 10);
|
|
69
|
+
current = Number.isSafeInteger(index) ? current[index] : undefined;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
if (current === undefined) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return current;
|
|
79
|
+
}
|
|
80
|
+
export function checkType(expected, value, path) {
|
|
81
|
+
if (typeof expected !== "string") {
|
|
82
|
+
return unsupported("type");
|
|
83
|
+
}
|
|
84
|
+
const actual = jsonType(value);
|
|
85
|
+
const matches = actual === expected || (expected === "number" && actual === "integer");
|
|
86
|
+
if (!matches) {
|
|
87
|
+
return mismatch(path, `type ${expected}`);
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
export function checkRange(schema, value, path) {
|
|
92
|
+
const minimum = field(schema, "minimum");
|
|
93
|
+
if (typeof minimum === "number" && value < minimum) {
|
|
94
|
+
return mismatch(path, `minimum ${minimum}`);
|
|
95
|
+
}
|
|
96
|
+
const maximum = field(schema, "maximum");
|
|
97
|
+
if (typeof maximum === "number" && value > maximum) {
|
|
98
|
+
return mismatch(path, `maximum ${maximum}`);
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// SPEC §4.1.2: JSON Schema 2020-12 subset validator. Unsupported keywords
|
|
2
|
+
// in a schema are a load error (CDX-E201), never ignored (EC-10). Value
|
|
3
|
+
// mismatches fail with CDX-E101 naming the JSON-pointer path, never the
|
|
4
|
+
// value itself. Primitives and scalar checks live in schema-helpers.ts;
|
|
5
|
+
// the composite checks, $ref orchestration and entry live here.
|
|
6
|
+
import { makeError } from "./errors.js";
|
|
7
|
+
import { parseJson, stableStringify } from "./json.js";
|
|
8
|
+
import { checkPattern } from "./pattern.js";
|
|
9
|
+
import { err, ok } from "./result.js";
|
|
10
|
+
import { checkRange, checkType, field, isObjectRecord, MAX_REF_DEPTH, mismatch, resolvePointer, SUPPORTED_KEYWORDS, unsupported, } from "./schema-helpers.js";
|
|
11
|
+
function checkString(schema, value, path) {
|
|
12
|
+
const minLength = field(schema, "minLength");
|
|
13
|
+
if (typeof minLength === "number" && value.length < minLength) {
|
|
14
|
+
return mismatch(path, `minLength ${minLength}`);
|
|
15
|
+
}
|
|
16
|
+
const maxLength = field(schema, "maxLength");
|
|
17
|
+
if (typeof maxLength === "number" && value.length > maxLength) {
|
|
18
|
+
return mismatch(path, `maxLength ${maxLength}`);
|
|
19
|
+
}
|
|
20
|
+
const pattern = field(schema, "pattern");
|
|
21
|
+
if (typeof pattern === "string") {
|
|
22
|
+
const safe = checkPattern(pattern);
|
|
23
|
+
if (!safe.ok) {
|
|
24
|
+
return err(safe.error);
|
|
25
|
+
}
|
|
26
|
+
let expression;
|
|
27
|
+
try {
|
|
28
|
+
expression = new RegExp(pattern);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return unsupported("pattern");
|
|
32
|
+
}
|
|
33
|
+
if (!expression.test(value)) {
|
|
34
|
+
return mismatch(path, `pattern ${pattern}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
function checkArray(schema, root, value, path, depth) {
|
|
40
|
+
const minItems = field(schema, "minItems");
|
|
41
|
+
if (typeof minItems === "number" && value.length < minItems) {
|
|
42
|
+
return mismatch(path, `minItems ${minItems}`);
|
|
43
|
+
}
|
|
44
|
+
const maxItems = field(schema, "maxItems");
|
|
45
|
+
if (typeof maxItems === "number" && value.length > maxItems) {
|
|
46
|
+
return mismatch(path, `maxItems ${maxItems}`);
|
|
47
|
+
}
|
|
48
|
+
const items = field(schema, "items");
|
|
49
|
+
if (items !== undefined) {
|
|
50
|
+
if (Array.isArray(items)) {
|
|
51
|
+
return unsupported("prefixItems");
|
|
52
|
+
}
|
|
53
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
54
|
+
const checked = validateAgainst(items, value[index], root, `${path}/${index}`, depth + 1);
|
|
55
|
+
if (!checked.ok) {
|
|
56
|
+
return checked;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
function checkObject(schema, root, value, path, depth) {
|
|
63
|
+
const required = field(schema, "required");
|
|
64
|
+
if (Array.isArray(required)) {
|
|
65
|
+
for (const name of required) {
|
|
66
|
+
if (typeof name !== "string") {
|
|
67
|
+
return unsupported("required");
|
|
68
|
+
}
|
|
69
|
+
if (value[name] === undefined) {
|
|
70
|
+
return mismatch(path, `required property "${name}"`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const properties = field(schema, "properties");
|
|
75
|
+
if (isObjectRecord(properties)) {
|
|
76
|
+
for (const key of Object.keys(properties)) {
|
|
77
|
+
if (value[key] !== undefined) {
|
|
78
|
+
const checked = validateAgainst(properties[key], value[key], root, `${path}/${key}`, depth + 1);
|
|
79
|
+
if (!checked.ok) {
|
|
80
|
+
return checked;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const additional = field(schema, "additionalProperties");
|
|
86
|
+
const declared = properties !== undefined && isObjectRecord(properties)
|
|
87
|
+
? new Set(Object.keys(properties))
|
|
88
|
+
: new Set();
|
|
89
|
+
if (additional === false) {
|
|
90
|
+
for (const key of Object.keys(value)) {
|
|
91
|
+
if (!declared.has(key)) {
|
|
92
|
+
return mismatch(path, `no additional property "${key}"`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else if (additional !== undefined && additional !== true) {
|
|
97
|
+
for (const key of Object.keys(value)) {
|
|
98
|
+
if (!declared.has(key)) {
|
|
99
|
+
const checked = validateAgainst(additional, value[key], root, `${path}/${key}`, depth + 1);
|
|
100
|
+
if (!checked.ok) {
|
|
101
|
+
return checked;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
function validateAgainst(schema, value, root, path, depth) {
|
|
109
|
+
if (depth > MAX_REF_DEPTH) {
|
|
110
|
+
return err(makeError("CDX-E902", "schema $ref nesting exceeds the validator budget", "Flatten the schema so $ref chains stay shallow, then retry."));
|
|
111
|
+
}
|
|
112
|
+
if (typeof schema === "boolean") {
|
|
113
|
+
return schema ? ok(undefined) : mismatch(path, "a value the schema allows");
|
|
114
|
+
}
|
|
115
|
+
if (!isObjectRecord(schema)) {
|
|
116
|
+
return unsupported("$ref");
|
|
117
|
+
}
|
|
118
|
+
for (const keyword of Object.keys(schema)) {
|
|
119
|
+
if (!SUPPORTED_KEYWORDS.has(keyword)) {
|
|
120
|
+
return unsupported(keyword);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const reference = field(schema, "$ref");
|
|
124
|
+
if (typeof reference === "string") {
|
|
125
|
+
const target = resolvePointer(root, reference);
|
|
126
|
+
if (target === undefined) {
|
|
127
|
+
return unsupported("$ref");
|
|
128
|
+
}
|
|
129
|
+
const resolved = validateAgainst(target, value, root, path, depth + 1);
|
|
130
|
+
if (!resolved.ok) {
|
|
131
|
+
return resolved;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const enumeration = field(schema, "enum");
|
|
135
|
+
if (Array.isArray(enumeration)) {
|
|
136
|
+
const wanted = stableStringify(value);
|
|
137
|
+
const found = enumeration.some((candidate) => stableStringify(candidate) === wanted);
|
|
138
|
+
if (!found) {
|
|
139
|
+
return mismatch(path, "one of the enum values");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if ("const" in schema) {
|
|
143
|
+
if (stableStringify(field(schema, "const")) !== stableStringify(value)) {
|
|
144
|
+
return mismatch(path, "the const value");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const expectedType = field(schema, "type");
|
|
148
|
+
if (expectedType !== undefined) {
|
|
149
|
+
const checked = checkType(expectedType, value, path);
|
|
150
|
+
if (checked !== undefined) {
|
|
151
|
+
return checked;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (typeof value === "number") {
|
|
155
|
+
const checked = checkRange(schema, value, path);
|
|
156
|
+
if (checked !== undefined) {
|
|
157
|
+
return checked;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (typeof value === "string") {
|
|
161
|
+
const checked = checkString(schema, value, path);
|
|
162
|
+
if (checked !== undefined) {
|
|
163
|
+
return checked;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (Array.isArray(value)) {
|
|
167
|
+
const checked = checkArray(schema, root, value, path, depth);
|
|
168
|
+
if (checked !== undefined) {
|
|
169
|
+
return checked;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (isObjectRecord(value)) {
|
|
173
|
+
const checked = checkObject(schema, root, value, path, depth);
|
|
174
|
+
if (checked !== undefined) {
|
|
175
|
+
return checked;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const branches = field(schema, "oneOf");
|
|
179
|
+
if (Array.isArray(branches)) {
|
|
180
|
+
let matches = 0;
|
|
181
|
+
let firstFailure;
|
|
182
|
+
for (const branch of branches) {
|
|
183
|
+
const checked = validateAgainst(branch, value, root, path, depth + 1);
|
|
184
|
+
if (checked.ok) {
|
|
185
|
+
matches += 1;
|
|
186
|
+
}
|
|
187
|
+
else if (firstFailure === undefined) {
|
|
188
|
+
firstFailure = checked;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (matches !== 1) {
|
|
192
|
+
return firstFailure ?? mismatch(path, "exactly one oneOf branch");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return ok(undefined);
|
|
196
|
+
}
|
|
197
|
+
export function validateSchema(schemaText, value) {
|
|
198
|
+
const parsed = parseJson(schemaText);
|
|
199
|
+
if (!parsed.ok) {
|
|
200
|
+
return err(parsed.error);
|
|
201
|
+
}
|
|
202
|
+
return validateAgainst(parsed.value, value, parsed.value, "#", 0);
|
|
203
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// SPEC §4.7.1 secret-read guard: the paths that must never reach the
|
|
2
|
+
// agent context (tool.pre.read and shell commands that print files). The
|
|
3
|
+
// .env family exempts .env.example; dotfiles with auth lines (.npmrc,
|
|
4
|
+
// .pypirc, nuget.config) block as whole files; home-relative secret dirs
|
|
5
|
+
// match lexically. Also owns the default fixture-glob exemption: values
|
|
6
|
+
// under fixture dirs are test vectors, never live credentials.
|
|
7
|
+
import { globMatch } from "./glob.js";
|
|
8
|
+
const SECRET_BASENAMES = new Set([".npmrc", ".pypirc", "nuget.config"]);
|
|
9
|
+
const SECRET_DIR_SEGMENTS = new Set([".ssh", ".aws", ".gnupg"]);
|
|
10
|
+
export const DEFAULT_FIXTURE_GLOBS = [
|
|
11
|
+
"**/fixtures/**",
|
|
12
|
+
"**/fixture/**",
|
|
13
|
+
"**/__fixtures__/**",
|
|
14
|
+
"**/testdata/**",
|
|
15
|
+
"**/test-data/**",
|
|
16
|
+
"**/*.fixture.*",
|
|
17
|
+
];
|
|
18
|
+
// The home-prefix patterns live at module scope so their quantifiers
|
|
19
|
+
// never count as branches of the function that applies them.
|
|
20
|
+
const HOME_PREFIX_PATTERNS = [
|
|
21
|
+
/^~[/\\]?/,
|
|
22
|
+
/^\$home[/\\]?/,
|
|
23
|
+
/^\$\{home\}[/\\]?/,
|
|
24
|
+
/^%userprofile%[/\\]?/,
|
|
25
|
+
];
|
|
26
|
+
function isEnvSecretFile(base) {
|
|
27
|
+
return (base === ".env" || (base.startsWith(".env.") && base !== ".env.example"));
|
|
28
|
+
}
|
|
29
|
+
function isKeyMaterialFile(base) {
|
|
30
|
+
return (base.endsWith(".pem") ||
|
|
31
|
+
base.endsWith(".key") ||
|
|
32
|
+
base.endsWith(".p12") ||
|
|
33
|
+
base.endsWith(".pfx") ||
|
|
34
|
+
base.startsWith("id_rsa") ||
|
|
35
|
+
base.startsWith("id_ed25519"));
|
|
36
|
+
}
|
|
37
|
+
function homeRelativePath(slashed) {
|
|
38
|
+
let relative = slashed.toLowerCase();
|
|
39
|
+
for (const pattern of HOME_PREFIX_PATTERNS) {
|
|
40
|
+
relative = relative.replace(pattern, "");
|
|
41
|
+
}
|
|
42
|
+
return relative;
|
|
43
|
+
}
|
|
44
|
+
function isSecretDirPath(slashed) {
|
|
45
|
+
const segments = homeRelativePath(slashed).split("/");
|
|
46
|
+
return (segments.some((segment) => SECRET_DIR_SEGMENTS.has(segment)) ||
|
|
47
|
+
(segments[0] === ".config" && segments[1] === "gh"));
|
|
48
|
+
}
|
|
49
|
+
// SPEC §4.7.1: the secret-read guard paths.
|
|
50
|
+
export function isSecretReadPath(path) {
|
|
51
|
+
const slashed = path.replace(/\\/g, "/");
|
|
52
|
+
const base = slashed.split("/").pop() ?? "";
|
|
53
|
+
if (isEnvSecretFile(base)) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
if (isKeyMaterialFile(base)) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (SECRET_BASENAMES.has(base)) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return isSecretDirPath(slashed);
|
|
63
|
+
}
|
|
64
|
+
// SPEC §4.7.1: placeholder credentials and test vectors under a declared
|
|
65
|
+
// fixture glob are allowlisted. The kernel default covers the common
|
|
66
|
+
// fixture layouts; the check takes configured globs when the caller has
|
|
67
|
+
// them (phase 4 config), so the default never silently widens.
|
|
68
|
+
export function isFixturePath(path, globs = DEFAULT_FIXTURE_GLOBS) {
|
|
69
|
+
return globs.some((glob) => globMatch(glob, path));
|
|
70
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SimpleCommand } from "./shell.ts";
|
|
2
|
+
export declare function isProtectedPath(path: string): boolean;
|
|
3
|
+
export declare function matchBypassCommand(cmd: SimpleCommand): string | undefined;
|
|
4
|
+
export declare function scanBypassRawText(text: string): string | undefined;
|