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,219 @@
|
|
|
1
|
+
// SPEC §4.8.5 verdicts over manifests plus snapshot. The orchestration and
|
|
2
|
+
// the manifest-intrinsic rows live here; pinned rows needing registry data
|
|
3
|
+
// live in snapshot-verdicts.ts and the §6.1 catalogue in capabilities.ts.
|
|
4
|
+
import { makeError } from "../../kernel/index.js";
|
|
5
|
+
import { capabilityOf, DEFAULT_LICENSE_ALLOW, platformCapabilityCover, } from "./capabilities.js";
|
|
6
|
+
import { pinFinding, uniqueDeps, } from "./eval.js";
|
|
7
|
+
import { lockfileMismatches, parsePackageLock } from "./lockfile.js";
|
|
8
|
+
import { isExactNpmPin } from "./npm.js";
|
|
9
|
+
import { NPM_PUBLIC_REGISTRY_HOST, parseNpmrc, privateRegistryHosts, } from "./npmrc.js";
|
|
10
|
+
import { checkPinnedVerdicts, pinnedOrUnversionedNote, snapshotForm, } from "./snapshot-verdicts.js";
|
|
11
|
+
import { DEFAULT_DEP_LAG_PARAMS } from "./stable.js";
|
|
12
|
+
export function manifestToEval(manifest) {
|
|
13
|
+
return {
|
|
14
|
+
path: manifest.path,
|
|
15
|
+
dependencies: manifest.dependencies.map((dep) => ({
|
|
16
|
+
name: dep.name,
|
|
17
|
+
range: dep.range,
|
|
18
|
+
kind: dep.kind ?? "prod",
|
|
19
|
+
})),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// SPEC §4.8.5 verdicts over manifests plus snapshot. Anything needing data
|
|
23
|
+
// the caller did not supply is skipped, never default-allowed: absence of a
|
|
24
|
+
// snapshot entry means "not fetched", not "clean".
|
|
25
|
+
export function evaluateDepVerdicts(input) {
|
|
26
|
+
const findings = [];
|
|
27
|
+
const notes = [];
|
|
28
|
+
checkExactPins(input, findings);
|
|
29
|
+
checkLockfiles(input, findings);
|
|
30
|
+
checkNewNeedsReason(input, findings);
|
|
31
|
+
checkOnePerCapability(input, findings);
|
|
32
|
+
checkNpmrc(input, findings);
|
|
33
|
+
if (input.snapshot !== undefined) {
|
|
34
|
+
checkSnapshotVerdicts(input, findings, notes);
|
|
35
|
+
}
|
|
36
|
+
return { findings, notes };
|
|
37
|
+
}
|
|
38
|
+
function checkExactPins(input, findings) {
|
|
39
|
+
for (const manifest of input.manifests) {
|
|
40
|
+
for (const dep of manifest.dependencies) {
|
|
41
|
+
if (dep.kind === "peer") {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (!isExactNpmPin(dep.range)) {
|
|
45
|
+
findings.push(pinFinding(manifest.path, dep.name, dep.range));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function lockfileFindingsFor(manifest, text) {
|
|
51
|
+
const parsed = parsePackageLock(text);
|
|
52
|
+
if (!parsed.ok) {
|
|
53
|
+
return [
|
|
54
|
+
{
|
|
55
|
+
ruleId: "core/dep-lockfile",
|
|
56
|
+
path: manifest.path,
|
|
57
|
+
code: parsed.error.code,
|
|
58
|
+
message: `lockfile for ${manifest.path} is unparseable`,
|
|
59
|
+
remediation: `Regenerate the lockfile for ${manifest.path} with the ecosystem tool.`,
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
const mismatched = lockfileMismatches(manifest.dependencies, {
|
|
64
|
+
lockfileVersion: 3,
|
|
65
|
+
pinned: parsed.value.pinned,
|
|
66
|
+
});
|
|
67
|
+
return mismatched.map((name) => ({
|
|
68
|
+
ruleId: "core/dep-lockfile",
|
|
69
|
+
path: manifest.path,
|
|
70
|
+
message: `${name} in ${manifest.path} is out of sync with the lockfile`,
|
|
71
|
+
remediation: `Regenerate the lockfile for ${manifest.path} with the ecosystem tool.`,
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
function checkLockfiles(input, findings) {
|
|
75
|
+
if (input.lockfiles === undefined) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
for (const manifest of input.manifests) {
|
|
79
|
+
if (!(manifest.path in input.lockfiles)) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const text = input.lockfiles[manifest.path];
|
|
83
|
+
if (text === null || text === undefined) {
|
|
84
|
+
findings.push({
|
|
85
|
+
ruleId: "core/dep-lockfile",
|
|
86
|
+
path: manifest.path,
|
|
87
|
+
message: `no lockfile committed for ${manifest.path}`,
|
|
88
|
+
remediation: `Commit the lockfile for ${manifest.path}.`,
|
|
89
|
+
});
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
for (const finding of lockfileFindingsFor(manifest, text)) {
|
|
93
|
+
findings.push(finding);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function checkNewNeedsReason(input, findings) {
|
|
98
|
+
if (input.newDeps === undefined) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
for (const manifest of input.manifests) {
|
|
102
|
+
for (const dep of manifest.dependencies) {
|
|
103
|
+
if (input.newDeps.includes(dep.name) &&
|
|
104
|
+
input.addedReasons?.[dep.name] !== true) {
|
|
105
|
+
findings.push({
|
|
106
|
+
ruleId: "core/dep-new-needs-reason",
|
|
107
|
+
path: manifest.path,
|
|
108
|
+
message: `${dep.name} in ${manifest.path} has no recorded reason`,
|
|
109
|
+
remediation: `Record why ${dep.name} is needed in ${manifest.path}.`,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function checkOnePerCapability(input, findings) {
|
|
116
|
+
const byCapability = new Map();
|
|
117
|
+
const platformHeld = new Set(input.platformCaps ?? []);
|
|
118
|
+
for (const { path, dep } of uniqueDeps(input.manifests)) {
|
|
119
|
+
const capability = capabilityOf(dep.name);
|
|
120
|
+
if (capability === undefined) {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (platformHeld.has(capability)) {
|
|
124
|
+
const cover = platformCapabilityCover(capability) ?? capability;
|
|
125
|
+
findings.push({
|
|
126
|
+
ruleId: "core/dep-one-per-capability",
|
|
127
|
+
path,
|
|
128
|
+
message: `${dep.name} duplicates the pinned platform's ${cover} (${capability})`,
|
|
129
|
+
remediation: `Remove ${dep.name}; the pinned platform already covers ${capability}.`,
|
|
130
|
+
});
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const holders = byCapability.get(capability) ?? [];
|
|
134
|
+
holders.push({ path, name: dep.name });
|
|
135
|
+
byCapability.set(capability, holders);
|
|
136
|
+
}
|
|
137
|
+
for (const [capability, holders] of [...byCapability.entries()].sort()) {
|
|
138
|
+
const first = holders[0];
|
|
139
|
+
const second = holders[1];
|
|
140
|
+
if (first !== undefined && second !== undefined) {
|
|
141
|
+
findings.push({
|
|
142
|
+
ruleId: "core/dep-one-per-capability",
|
|
143
|
+
path: first.path,
|
|
144
|
+
message: `${first.name} and ${second.name} both cover ${capability}`,
|
|
145
|
+
remediation: `Remove ${second.name}; the kept package already covers ${capability}.`,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function checkNpmrc(input, findings) {
|
|
151
|
+
if (input.npmrc === undefined) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const parsed = parseNpmrc(input.npmrc.text);
|
|
155
|
+
if (input.saveExactRequired === true && parsed.saveExact !== true) {
|
|
156
|
+
findings.push({
|
|
157
|
+
ruleId: "core/dep-exact-pin",
|
|
158
|
+
path: input.npmrc.path,
|
|
159
|
+
message: `${input.npmrc.path} lacks the owned save-exact=true entry`,
|
|
160
|
+
remediation: `Set save-exact=true in ${input.npmrc.path}.`,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const allowed = input.allowedRegistryHosts ?? [];
|
|
164
|
+
for (const host of privateRegistryHosts(parsed)) {
|
|
165
|
+
if (host !== NPM_PUBLIC_REGISTRY_HOST && !allowed.includes(host)) {
|
|
166
|
+
findings.push({
|
|
167
|
+
ruleId: "core/dep-exact-pin",
|
|
168
|
+
path: input.npmrc.path,
|
|
169
|
+
code: "CDX-E702",
|
|
170
|
+
message: `private registry ${host} is not on the network allowlist`,
|
|
171
|
+
remediation: `Add ${host} via config.network.registries (SPEC §9.2).`,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function checkSnapshotVerdicts(input, findings, notes) {
|
|
177
|
+
const params = { ...DEFAULT_DEP_LAG_PARAMS, ...input.params };
|
|
178
|
+
const allow = input.licenseAllow ?? DEFAULT_LICENSE_ALLOW;
|
|
179
|
+
const snapshot = input.snapshot;
|
|
180
|
+
if (snapshot === undefined) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
for (const { path, dep } of uniqueDeps(input.manifests)) {
|
|
184
|
+
if (dep.kind === "peer") {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
const form = snapshotForm(dep.range);
|
|
188
|
+
if (form === "unversioned") {
|
|
189
|
+
notes.push(pinnedOrUnversionedNote(path, dep.name));
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (form !== "pinned") {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const pinned = dep.range.replace(/^v/, "");
|
|
196
|
+
for (const finding of checkPinnedVerdicts({
|
|
197
|
+
snapshot,
|
|
198
|
+
params,
|
|
199
|
+
allow,
|
|
200
|
+
path,
|
|
201
|
+
dep,
|
|
202
|
+
unpublished: input.unpublished ?? [],
|
|
203
|
+
}, pinned, notes)) {
|
|
204
|
+
findings.push(finding);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
export function depErrorFinding(ruleId, path, error, remediation) {
|
|
209
|
+
return {
|
|
210
|
+
ruleId,
|
|
211
|
+
path,
|
|
212
|
+
code: error.code,
|
|
213
|
+
message: error.message,
|
|
214
|
+
remediation,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
export function makeDepError(code, message, remediation) {
|
|
218
|
+
return makeError(code, message, remediation);
|
|
219
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Result } from "../../kernel/index.ts";
|
|
2
|
+
import type { NewEvent } from "../audit/index.ts";
|
|
3
|
+
import type { Enforcer, Engine } from "./index.ts";
|
|
4
|
+
import { type Waiver, type WaiverStore } from "./waivers.ts";
|
|
5
|
+
export interface EngineOptions {
|
|
6
|
+
readonly waiverStore?: WaiverStore;
|
|
7
|
+
readonly append?: (event: NewEvent) => Promise<Result<void>>;
|
|
8
|
+
readonly configHash?: string;
|
|
9
|
+
readonly packs?: Readonly<Record<string, string>>;
|
|
10
|
+
}
|
|
11
|
+
export declare function createEngine(enforcers: ReadonlyArray<Enforcer>, options?: EngineOptions): Engine;
|
|
12
|
+
export type { Waiver, WaiverStore };
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// SPEC §4.3.3 evaluation with §4.3.8 fail closed: select rules for the
|
|
2
|
+
// trigger, run their enforcers concurrently under budget, apply waivers,
|
|
3
|
+
// decide, then append the verdict event before returning. The verdict is
|
|
4
|
+
// a pure function of the inputs (SPEC §4.3.6): enforcer and finding order
|
|
5
|
+
// is sorted and the id derives from the inputs, so replay is byte-identical.
|
|
6
|
+
// The clock arrives only through CheckContext.
|
|
7
|
+
import { ok, sha256Text, stableStringify, } from "../../kernel/index.js";
|
|
8
|
+
import { buildMessage } from "./message.js";
|
|
9
|
+
import { appendFailedFinding, runEnforcer, sortFindings, } from "./run-enforcer.js";
|
|
10
|
+
import { DEFAULT_WAIVER_STORE, matchWaivers, } from "./waivers.js";
|
|
11
|
+
// SPEC §4.3.2: each engine trigger evaluates at one layer. Coarse triggers
|
|
12
|
+
// map to the layer of their first scope; finer hook names arrive with the
|
|
13
|
+
// adapter contract (phase 5).
|
|
14
|
+
const TRIGGER_LAYERS = {
|
|
15
|
+
startup: "L0",
|
|
16
|
+
prompt: "L0",
|
|
17
|
+
compact: "L0",
|
|
18
|
+
"pre-tool": "L1",
|
|
19
|
+
"post-tool": "L1",
|
|
20
|
+
review: "L3",
|
|
21
|
+
scheduled: "L5",
|
|
22
|
+
};
|
|
23
|
+
// SPEC §4.3.3: findings only from advisory triggers advise; everything
|
|
24
|
+
// else with findings blocks. L2 (editor.save, never a gate per §4.3.8) has
|
|
25
|
+
// no trigger in this union yet; prompt carries the injection path.
|
|
26
|
+
const ADVISORY_TRIGGERS = ["prompt"];
|
|
27
|
+
// SPEC §4.3.6: the verdict id is a pure function of the inputs, so the
|
|
28
|
+
// same evaluation replays byte-identical (EC-12). Uniqueness across
|
|
29
|
+
// concurrent processes lives at append time: the hook runtime passes its
|
|
30
|
+
// per-process counter as the appendEvent seq (SPEC §7.10).
|
|
31
|
+
function makeVerdictId(now, trigger, scope, decision, findings, waiversApplied, configHash) {
|
|
32
|
+
const stamp = now.replace(/[-:.]/g, "");
|
|
33
|
+
const canonical = stableStringify({
|
|
34
|
+
trigger,
|
|
35
|
+
files: [...scope.files].sort(),
|
|
36
|
+
sessionId: scope.sessionId,
|
|
37
|
+
// SPEC §4.3.6: the hook input is a verdict input, so the proposed
|
|
38
|
+
// tool content joins the id; two proposals never share an event.
|
|
39
|
+
...(scope.proposedContent === undefined
|
|
40
|
+
? {}
|
|
41
|
+
: { proposedContent: scope.proposedContent }),
|
|
42
|
+
...(scope.shellCommand === undefined
|
|
43
|
+
? {}
|
|
44
|
+
: { shellCommand: scope.shellCommand }),
|
|
45
|
+
...(scope.proposedPaths === undefined
|
|
46
|
+
? {}
|
|
47
|
+
: { proposedPaths: [...scope.proposedPaths].sort() }),
|
|
48
|
+
decision,
|
|
49
|
+
findings,
|
|
50
|
+
waiversApplied,
|
|
51
|
+
configHash,
|
|
52
|
+
});
|
|
53
|
+
return `${stamp}-${sha256Text(canonical).slice(0, 12)}`;
|
|
54
|
+
}
|
|
55
|
+
// SPEC §4.3.4: suppress findings covered by an active waiver, recording
|
|
56
|
+
// the waiver ids. Synthetic fail-closed findings (CDX-E*) never suppress,
|
|
57
|
+
// and an invalid floor-rule waiver blocks loudly instead of suppressing.
|
|
58
|
+
async function applyWaivers(findings, store, now) {
|
|
59
|
+
const kept = [];
|
|
60
|
+
const applied = new Set();
|
|
61
|
+
for (const finding of findings) {
|
|
62
|
+
if (finding.code?.startsWith("CDX-E") === true) {
|
|
63
|
+
kept.push(finding);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const matched = matchWaivers(store, finding.ruleId, finding.path ?? "", now);
|
|
67
|
+
if (!matched.ok) {
|
|
68
|
+
kept.push(finding);
|
|
69
|
+
kept.push({
|
|
70
|
+
ruleId: finding.ruleId,
|
|
71
|
+
code: matched.error.code,
|
|
72
|
+
message: matched.error.message,
|
|
73
|
+
remediation: matched.error.remediation,
|
|
74
|
+
});
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (matched.value.length === 0) {
|
|
78
|
+
kept.push(finding);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
for (const waiver of matched.value) {
|
|
82
|
+
applied.add(waiver.id);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { kept, waiversApplied: [...applied].sort() };
|
|
86
|
+
}
|
|
87
|
+
function ruleIdsOf(findings) {
|
|
88
|
+
const seen = new Set();
|
|
89
|
+
for (const finding of findings) {
|
|
90
|
+
seen.add(finding.ruleId);
|
|
91
|
+
}
|
|
92
|
+
return [...seen].sort();
|
|
93
|
+
}
|
|
94
|
+
async function collectFindings(ordered, ctx, store) {
|
|
95
|
+
const runnable = ordered.filter((enforcer) => enforcer.kinds.includes(ctx.trigger));
|
|
96
|
+
// SPEC §4.3.3 step 2: bounded concurrency — one guard at a time keeps every
|
|
97
|
+
// guard's event-loop share (no E902 herd); sortFindings keeps the verdict byte-identical (§4.3.6).
|
|
98
|
+
const ran = [];
|
|
99
|
+
for (const enforcer of runnable) {
|
|
100
|
+
ran.push(await runEnforcer(enforcer, ctx));
|
|
101
|
+
}
|
|
102
|
+
return applyWaivers(sortFindings(ran.flat()), store, ctx.now);
|
|
103
|
+
}
|
|
104
|
+
function decideDecision(kept, trigger) {
|
|
105
|
+
if (kept.length === 0) {
|
|
106
|
+
return "allow";
|
|
107
|
+
}
|
|
108
|
+
return ADVISORY_TRIGGERS.includes(trigger) ? "advise" : "block";
|
|
109
|
+
}
|
|
110
|
+
function buildVerdictEvent(trigger, now, decision, kept, waiversApplied, configHash, packs, message, clockSkew) {
|
|
111
|
+
return {
|
|
112
|
+
kind: "verdict",
|
|
113
|
+
layer: TRIGGER_LAYERS[trigger],
|
|
114
|
+
trigger,
|
|
115
|
+
ruleIds: ruleIdsOf(kept),
|
|
116
|
+
decision,
|
|
117
|
+
findings: kept,
|
|
118
|
+
durationMs: 0,
|
|
119
|
+
configHash,
|
|
120
|
+
packs,
|
|
121
|
+
message,
|
|
122
|
+
ts: now,
|
|
123
|
+
...(clockSkew ? { clockSkew: true } : {}),
|
|
124
|
+
...(waiversApplied.length > 0 ? { waivers: waiversApplied } : {}),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function blockedVerdict(now, trigger, scope, configHash) {
|
|
128
|
+
const blocked = [appendFailedFinding()];
|
|
129
|
+
const blockedId = makeVerdictId(now, trigger, scope, "block", blocked, [], configHash);
|
|
130
|
+
return {
|
|
131
|
+
decision: "block",
|
|
132
|
+
findings: blocked,
|
|
133
|
+
message: buildMessage("block", blocked, blockedId),
|
|
134
|
+
eventId: blockedId,
|
|
135
|
+
waiversApplied: [],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// SPEC §4.3.3: pure evaluation over registered enforcers.
|
|
139
|
+
export function createEngine(enforcers, options = {}) {
|
|
140
|
+
const ordered = [...enforcers].sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
|
|
141
|
+
const store = options.waiverStore ?? DEFAULT_WAIVER_STORE;
|
|
142
|
+
const append = options.append ??
|
|
143
|
+
(() => Promise.resolve(ok(undefined)));
|
|
144
|
+
const configHash = options.configHash ?? "unknown";
|
|
145
|
+
const packs = options.packs ?? {};
|
|
146
|
+
// Per-engine memory for EC-15 skew detection: closure state, never
|
|
147
|
+
// module-level, so engines stay independent (CONVENTIONS determinism).
|
|
148
|
+
// It never leaks into the verdict, which stays a pure function of its
|
|
149
|
+
// inputs (SPEC §4.3.6).
|
|
150
|
+
let lastNow;
|
|
151
|
+
return {
|
|
152
|
+
evaluate: async (trigger, scope, now) => {
|
|
153
|
+
const clockSkew = lastNow !== undefined && now < lastNow;
|
|
154
|
+
if (lastNow === undefined || now > lastNow) {
|
|
155
|
+
lastNow = now;
|
|
156
|
+
}
|
|
157
|
+
const ctx = { trigger, scope, now, configHash };
|
|
158
|
+
const { kept, waiversApplied } = await collectFindings(ordered, ctx, store);
|
|
159
|
+
const decision = decideDecision(kept, trigger);
|
|
160
|
+
const eventId = makeVerdictId(now, trigger, scope, decision, kept, waiversApplied, configHash);
|
|
161
|
+
const message = buildMessage(decision, kept, eventId);
|
|
162
|
+
const event = buildVerdictEvent(trigger, now, decision, kept, waiversApplied, configHash, packs, message, clockSkew);
|
|
163
|
+
const appended = await append(event);
|
|
164
|
+
if (!appended.ok) {
|
|
165
|
+
return blockedVerdict(now, trigger, scope, configHash);
|
|
166
|
+
}
|
|
167
|
+
return { decision, findings: kept, message, eventId, waiversApplied };
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CheckContext, Decision, Enforcer, Finding, Instant, Result, Scope, Trigger } from "../../kernel/index.ts";
|
|
2
|
+
import type { EngineOptions } from "./evaluate.ts";
|
|
3
|
+
import { DEFAULT_WAIVER_STORE, MAX_WAIVER_DAYS, type Waiver, type WaiverStore } from "./waivers.ts";
|
|
4
|
+
export { TRIGGERS } from "../../kernel/index.ts";
|
|
5
|
+
export type { CheckContext, Decision, Enforcer, EngineOptions, Finding, Result, Scope, Trigger, Waiver, WaiverStore, };
|
|
6
|
+
export { DEFAULT_WAIVER_STORE, MAX_WAIVER_DAYS };
|
|
7
|
+
export interface Verdict {
|
|
8
|
+
readonly decision: Decision;
|
|
9
|
+
readonly findings: ReadonlyArray<Finding>;
|
|
10
|
+
readonly message: string;
|
|
11
|
+
readonly eventId: string;
|
|
12
|
+
readonly waiversApplied: ReadonlyArray<string>;
|
|
13
|
+
}
|
|
14
|
+
export interface Engine {
|
|
15
|
+
readonly evaluate: (trigger: Trigger, scope: Scope, now: Instant) => Promise<Verdict>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createEngine(enforcers: ReadonlyArray<Enforcer>, options?: EngineOptions): Engine;
|
|
18
|
+
export declare function buildMessage(decision: Decision, findings: ReadonlyArray<Finding>, eventId: string): string;
|
|
19
|
+
export declare function isWaived(ruleId: string, path: string, now: Instant, store?: WaiverStore): Promise<Result<boolean>>;
|
|
20
|
+
export declare function matchWaivers(store: WaiverStore, ruleId: string, path: string, now: Instant): Result<ReadonlyArray<Waiver>>;
|
|
21
|
+
export { compareRatchet } from "./ratchet.ts";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createEngine as createEngineImpl } from "./evaluate.js";
|
|
2
|
+
import { buildMessage as buildMessageImpl } from "./message.js";
|
|
3
|
+
import { DEFAULT_WAIVER_STORE, isWaived as isWaivedImpl, MAX_WAIVER_DAYS, matchWaivers as matchWaiversImpl, } from "./waivers.js";
|
|
4
|
+
export { TRIGGERS } from "../../kernel/index.js";
|
|
5
|
+
export { DEFAULT_WAIVER_STORE, MAX_WAIVER_DAYS };
|
|
6
|
+
// SPEC §4.3.3: pure evaluation over registered enforcers.
|
|
7
|
+
export function createEngine(enforcers, options = {}) {
|
|
8
|
+
return createEngineImpl(enforcers, options);
|
|
9
|
+
}
|
|
10
|
+
// SPEC §4.3.7: the agent-facing verdict text inside its byte budget.
|
|
11
|
+
export function buildMessage(decision, findings, eventId) {
|
|
12
|
+
return buildMessageImpl(decision, findings, eventId);
|
|
13
|
+
}
|
|
14
|
+
// SPEC §4.3.4: waiver lookup for the verdict path.
|
|
15
|
+
export function isWaived(ruleId, path, now, store = DEFAULT_WAIVER_STORE) {
|
|
16
|
+
return isWaivedImpl(ruleId, path, now, store);
|
|
17
|
+
}
|
|
18
|
+
// SPEC §4.3.4: the waivers suppressing a finding, or CDX-E103 for a floor
|
|
19
|
+
// rule waiver.
|
|
20
|
+
export function matchWaivers(store, ruleId, path, now) {
|
|
21
|
+
return matchWaiversImpl(store, ruleId, path, now);
|
|
22
|
+
}
|
|
23
|
+
// SPEC §4.3.5: ratchet comparison against the baseline.
|
|
24
|
+
export { compareRatchet } from "./ratchet.js";
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// SPEC §4.3.7: the agent-facing verdict text. E2 covers the block shape
|
|
2
|
+
// the §4.3 EC rows assert (rule names, Why, Do instead, the count line);
|
|
3
|
+
// the full message budget copy lands with step 4.8.
|
|
4
|
+
import { redactSecrets } from "../../kernel/index.js";
|
|
5
|
+
// SPEC §4.3.7: the agent message stays inside 1,200 bytes.
|
|
6
|
+
export const MAX_MESSAGE_BYTES = 1200;
|
|
7
|
+
function byteLength(text) {
|
|
8
|
+
return new TextEncoder().encode(text).length;
|
|
9
|
+
}
|
|
10
|
+
function truncateUtf8(text, maxBytes) {
|
|
11
|
+
const bytes = new TextEncoder().encode(text);
|
|
12
|
+
if (bytes.length <= maxBytes) {
|
|
13
|
+
return text;
|
|
14
|
+
}
|
|
15
|
+
let cut = maxBytes;
|
|
16
|
+
while (cut > 0) {
|
|
17
|
+
const byte = bytes[cut];
|
|
18
|
+
if (byte === undefined || (byte & 0xc0) !== 0x80) {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
cut -= 1;
|
|
22
|
+
}
|
|
23
|
+
return new TextDecoder().decode(bytes.subarray(0, cut));
|
|
24
|
+
}
|
|
25
|
+
function ruleIdsOf(findings) {
|
|
26
|
+
const seen = new Set();
|
|
27
|
+
for (const finding of findings) {
|
|
28
|
+
seen.add(finding.ruleId);
|
|
29
|
+
}
|
|
30
|
+
return [...seen].sort();
|
|
31
|
+
}
|
|
32
|
+
// SPEC §4.3.7: at most the first three findings render in full, then a
|
|
33
|
+
// count line for the rest.
|
|
34
|
+
export function buildMessage(decision, findings, eventId) {
|
|
35
|
+
const verb = decision === "allow"
|
|
36
|
+
? "allowed"
|
|
37
|
+
: decision === "advise"
|
|
38
|
+
? "flagged for review"
|
|
39
|
+
: "blocked";
|
|
40
|
+
if (findings.length === 0) {
|
|
41
|
+
return redactSecrets(`Codictator ${verb} this: no findings remain. (event ${eventId})`);
|
|
42
|
+
}
|
|
43
|
+
const rules = ruleIdsOf(findings);
|
|
44
|
+
const detail = [];
|
|
45
|
+
for (const finding of findings.slice(0, 3)) {
|
|
46
|
+
detail.push(`- [${finding.ruleId}] Why: ${finding.message}`);
|
|
47
|
+
detail.push(` Do instead: ${finding.remediation}`);
|
|
48
|
+
}
|
|
49
|
+
const lines = [`Codictator ${verb} this: ${rules.join(", ")}`, ...detail];
|
|
50
|
+
if (findings.length > 3) {
|
|
51
|
+
lines.push(`and ${findings.length - 3} more — codictator verify`);
|
|
52
|
+
}
|
|
53
|
+
lines.push(`More: codictator explain ${rules[0] ?? "unknown"} (event ${eventId})`);
|
|
54
|
+
// SPEC §4.3.9 EC-14: the message is redacted by the kernel; findings
|
|
55
|
+
// stay raw so remediation keeps its data.
|
|
56
|
+
let message = redactSecrets(lines.join("\n"));
|
|
57
|
+
if (byteLength(message) > MAX_MESSAGE_BYTES) {
|
|
58
|
+
const trimmed = lines.slice(0, 1);
|
|
59
|
+
if (findings.length > 3) {
|
|
60
|
+
trimmed.push(`and ${findings.length} more — codictator verify`);
|
|
61
|
+
}
|
|
62
|
+
trimmed.push(lines[lines.length - 1] ?? "");
|
|
63
|
+
message = redactSecrets(trimmed.join("\n"));
|
|
64
|
+
}
|
|
65
|
+
if (byteLength(message) > MAX_MESSAGE_BYTES) {
|
|
66
|
+
message = `${truncateUtf8(message, MAX_MESSAGE_BYTES - 20)}[truncated]`;
|
|
67
|
+
}
|
|
68
|
+
return message;
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function compareRatchet(baseline: Readonly<Record<string, number>>, current: Readonly<Record<string, number>>): ReadonlyArray<string>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// SPEC §4.3.5: a count above its baseline blocks — worse than recorded.
|
|
2
|
+
// Counts at or below baseline pass as recorded debt.
|
|
3
|
+
function keysAboveBaseline(baseline, current) {
|
|
4
|
+
const violations = [];
|
|
5
|
+
for (const key of Object.keys(baseline).sort()) {
|
|
6
|
+
if (!Object.hasOwn(current, key)) {
|
|
7
|
+
continue;
|
|
8
|
+
}
|
|
9
|
+
const before = baseline[key] ?? 0;
|
|
10
|
+
const now = current[key] ?? 0;
|
|
11
|
+
if (now > before) {
|
|
12
|
+
violations.push(key);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return violations;
|
|
16
|
+
}
|
|
17
|
+
// SPEC §4.3.5: deleted files drop their keys. Each dropped key lends its
|
|
18
|
+
// count so a pure rename can move it (same normalised content, same count).
|
|
19
|
+
function droppedCounts(baseline, current) {
|
|
20
|
+
const dropped = new Map();
|
|
21
|
+
for (const key of Object.keys(baseline).sort()) {
|
|
22
|
+
if (Object.hasOwn(current, key)) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const before = baseline[key] ?? 0;
|
|
26
|
+
if (before > 0) {
|
|
27
|
+
dropped.set(before, (dropped.get(before) ?? 0) + 1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return dropped;
|
|
31
|
+
}
|
|
32
|
+
// SPEC §4.3.5: a key absent from the baseline with a count above zero is a
|
|
33
|
+
// candidate block.
|
|
34
|
+
function keysAbsentFromBaseline(baseline, current) {
|
|
35
|
+
const added = [];
|
|
36
|
+
for (const key of Object.keys(current).sort()) {
|
|
37
|
+
if (Object.hasOwn(baseline, key)) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const count = current[key] ?? 0;
|
|
41
|
+
if (count > 0) {
|
|
42
|
+
added.push({ key, count });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return added;
|
|
46
|
+
}
|
|
47
|
+
// SPEC §4.3.5: ratchet comparison against the baseline. A pure rename (same
|
|
48
|
+
// normalised content) moves its keys and is not touched, so each dropped
|
|
49
|
+
// key cancels one added key with the same count; count equality is the only
|
|
50
|
+
// move signal this pure comparison has. Every other added key blocks.
|
|
51
|
+
export function compareRatchet(baseline, current) {
|
|
52
|
+
const violations = keysAboveBaseline(baseline, current);
|
|
53
|
+
const dropped = droppedCounts(baseline, current);
|
|
54
|
+
for (const entry of keysAbsentFromBaseline(baseline, current)) {
|
|
55
|
+
const spare = dropped.get(entry.count) ?? 0;
|
|
56
|
+
if (spare > 0) {
|
|
57
|
+
dropped.set(entry.count, spare - 1);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
violations.push(entry.key);
|
|
61
|
+
}
|
|
62
|
+
return violations.sort();
|
|
63
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CheckContext, Enforcer, Finding } from "./index.ts";
|
|
2
|
+
export declare function runEnforcer(enforcer: Enforcer, ctx: CheckContext): Promise<Array<Finding>>;
|
|
3
|
+
export declare function sortFindings(findings: Array<Finding>): Array<Finding>;
|
|
4
|
+
export declare function appendFailedFinding(): Finding;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
function failFinding(enforcerId, code, detail, remediation) {
|
|
2
|
+
return {
|
|
3
|
+
ruleId: enforcerId,
|
|
4
|
+
code,
|
|
5
|
+
message: `the guard "${enforcerId}" ${detail}; the code was not judged`,
|
|
6
|
+
remediation,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
// SPEC §4.3.8: a throw is CDX-E901, unless the enforcer threw its CdxError
|
|
10
|
+
// for unavailable data, which is CDX-E903.
|
|
11
|
+
function thrownCode(error) {
|
|
12
|
+
if (typeof error === "object" && error !== null && "code" in error) {
|
|
13
|
+
const code = error.code;
|
|
14
|
+
if (code === "CDX-E903") {
|
|
15
|
+
return "CDX-E903";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return "CDX-E901";
|
|
19
|
+
}
|
|
20
|
+
const TIMED_OUT = { timedOut: true };
|
|
21
|
+
function withBudget(pending, budgetMs) {
|
|
22
|
+
let timer;
|
|
23
|
+
const timeout = new Promise((_resolve, reject) => {
|
|
24
|
+
timer = setTimeout(() => {
|
|
25
|
+
reject(TIMED_OUT);
|
|
26
|
+
}, budgetMs);
|
|
27
|
+
});
|
|
28
|
+
return Promise.race([pending, timeout]).finally(() => {
|
|
29
|
+
if (timer !== undefined) {
|
|
30
|
+
clearTimeout(timer);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export async function runEnforcer(enforcer, ctx) {
|
|
35
|
+
let pending;
|
|
36
|
+
try {
|
|
37
|
+
// Rule params arrive with the pack registry (phase 5); E2 runs
|
|
38
|
+
// enforcers with an empty param set.
|
|
39
|
+
pending = enforcer.check(ctx, {});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return [
|
|
43
|
+
failFinding(enforcer.id, thrownCode(error), "failed with CDX-E901", "Fix the guard or retry the hook, then run codictator verify."),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
return await withBudget(pending, enforcer.budgetMs);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error === TIMED_OUT) {
|
|
51
|
+
return [
|
|
52
|
+
failFinding(enforcer.id, "CDX-E902", `exceeded its ${enforcer.budgetMs} ms budget (CDX-E902)`, "Give the guard a larger budget or a smaller scope, then retry."),
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
return [
|
|
56
|
+
failFinding(enforcer.id, thrownCode(error), "failed with CDX-E901", "Fix the guard or retry the hook, then run codictator verify."),
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function sortFindings(findings) {
|
|
61
|
+
return [...findings].sort(compareFindings);
|
|
62
|
+
}
|
|
63
|
+
function compareText(a, b) {
|
|
64
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
65
|
+
}
|
|
66
|
+
function compareFindingPaths(a, b) {
|
|
67
|
+
return compareText(a.path ?? "", b.path ?? "");
|
|
68
|
+
}
|
|
69
|
+
function compareFindingContent(a, b) {
|
|
70
|
+
if ((a.line ?? 0) !== (b.line ?? 0)) {
|
|
71
|
+
return (a.line ?? 0) - (b.line ?? 0);
|
|
72
|
+
}
|
|
73
|
+
return compareText(a.message, b.message);
|
|
74
|
+
}
|
|
75
|
+
function compareFindings(a, b) {
|
|
76
|
+
return (compareText(a.ruleId, b.ruleId) ||
|
|
77
|
+
compareFindingPaths(a, b) ||
|
|
78
|
+
compareFindingContent(a, b));
|
|
79
|
+
}
|
|
80
|
+
export function appendFailedFinding() {
|
|
81
|
+
return failFinding("core/engine", "CDX-E801", "could not record its verdict event (CDX-E801)", "Free disk space and fix permissions on .codictator/state/, then retry.");
|
|
82
|
+
}
|