@manehorizons/cadence-core 1.1.1
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 +21 -0
- package/README.md +5 -0
- package/bin/cadence.cjs +4 -0
- package/dist/build/record.d.ts +16 -0
- package/dist/build/record.d.ts.map +1 -0
- package/dist/build/record.js +33 -0
- package/dist/build/record.js.map +1 -0
- package/dist/checks/boundary.d.ts +35 -0
- package/dist/checks/boundary.d.ts.map +1 -0
- package/dist/checks/boundary.js +29 -0
- package/dist/checks/boundary.js.map +1 -0
- package/dist/checks/skill-audit.d.ts +29 -0
- package/dist/checks/skill-audit.d.ts.map +1 -0
- package/dist/checks/skill-audit.js +57 -0
- package/dist/checks/skill-audit.js.map +1 -0
- package/dist/classify/tier.d.ts +9 -0
- package/dist/classify/tier.d.ts.map +1 -0
- package/dist/classify/tier.js +15 -0
- package/dist/classify/tier.js.map +1 -0
- package/dist/cli/commands/assumption.d.ts +3 -0
- package/dist/cli/commands/assumption.d.ts.map +1 -0
- package/dist/cli/commands/assumption.js +313 -0
- package/dist/cli/commands/assumption.js.map +1 -0
- package/dist/cli/commands/block.d.ts +3 -0
- package/dist/cli/commands/block.d.ts.map +1 -0
- package/dist/cli/commands/block.js +23 -0
- package/dist/cli/commands/block.js.map +1 -0
- package/dist/cli/commands/build.d.ts +3 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +89 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +91 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/context.d.ts +3 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +31 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/decision.d.ts +3 -0
- package/dist/cli/commands/decision.d.ts.map +1 -0
- package/dist/cli/commands/decision.js +390 -0
- package/dist/cli/commands/decision.js.map +1 -0
- package/dist/cli/commands/done.d.ts +3 -0
- package/dist/cli/commands/done.d.ts.map +1 -0
- package/dist/cli/commands/done.js +23 -0
- package/dist/cli/commands/done.js.map +1 -0
- package/dist/cli/commands/draft-new.d.ts +4 -0
- package/dist/cli/commands/draft-new.d.ts.map +1 -0
- package/dist/cli/commands/draft-new.js +108 -0
- package/dist/cli/commands/draft-new.js.map +1 -0
- package/dist/cli/commands/draft.d.ts +4 -0
- package/dist/cli/commands/draft.d.ts.map +1 -0
- package/dist/cli/commands/draft.js +125 -0
- package/dist/cli/commands/draft.js.map +1 -0
- package/dist/cli/commands/hook.d.ts +3 -0
- package/dist/cli/commands/hook.d.ts.map +1 -0
- package/dist/cli/commands/hook.js +50 -0
- package/dist/cli/commands/hook.js.map +1 -0
- package/dist/cli/commands/init.d.ts +21 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +255 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +3 -0
- package/dist/cli/commands/inspect.d.ts.map +1 -0
- package/dist/cli/commands/inspect.js +24 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/intelligence.d.ts +3 -0
- package/dist/cli/commands/intelligence.d.ts.map +1 -0
- package/dist/cli/commands/intelligence.js +173 -0
- package/dist/cli/commands/intelligence.js.map +1 -0
- package/dist/cli/commands/milestone.d.ts +3 -0
- package/dist/cli/commands/milestone.d.ts.map +1 -0
- package/dist/cli/commands/milestone.js +119 -0
- package/dist/cli/commands/milestone.js.map +1 -0
- package/dist/cli/commands/needs-context.d.ts +3 -0
- package/dist/cli/commands/needs-context.d.ts.map +1 -0
- package/dist/cli/commands/needs-context.js +23 -0
- package/dist/cli/commands/needs-context.js.map +1 -0
- package/dist/cli/commands/progress.d.ts +3 -0
- package/dist/cli/commands/progress.d.ts.map +1 -0
- package/dist/cli/commands/progress.js +21 -0
- package/dist/cli/commands/progress.js.map +1 -0
- package/dist/cli/commands/recommend.d.ts +3 -0
- package/dist/cli/commands/recommend.d.ts.map +1 -0
- package/dist/cli/commands/recommend.js +24 -0
- package/dist/cli/commands/recommend.js.map +1 -0
- package/dist/cli/commands/recommendation.d.ts +3 -0
- package/dist/cli/commands/recommendation.d.ts.map +1 -0
- package/dist/cli/commands/recommendation.js +360 -0
- package/dist/cli/commands/recommendation.js.map +1 -0
- package/dist/cli/commands/settle.d.ts +3 -0
- package/dist/cli/commands/settle.d.ts.map +1 -0
- package/dist/cli/commands/settle.js +453 -0
- package/dist/cli/commands/settle.js.map +1 -0
- package/dist/cli/commands/spec.d.ts +10 -0
- package/dist/cli/commands/spec.d.ts.map +1 -0
- package/dist/cli/commands/spec.js +246 -0
- package/dist/cli/commands/spec.js.map +1 -0
- package/dist/cli/commands/status.d.ts +11 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +211 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/register.d.ts +3 -0
- package/dist/cli/register.d.ts.map +1 -0
- package/dist/cli/register.js +43 -0
- package/dist/cli/register.js.map +1 -0
- package/dist/coherence/check.d.ts +11 -0
- package/dist/coherence/check.d.ts.map +1 -0
- package/dist/coherence/check.js +34 -0
- package/dist/coherence/check.js.map +1 -0
- package/dist/config/loader.d.ts +4 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +40 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/errors.d.ts +23 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +31 -0
- package/dist/errors.js.map +1 -0
- package/dist/gates/approve.d.ts +20 -0
- package/dist/gates/approve.d.ts.map +1 -0
- package/dist/gates/approve.js +55 -0
- package/dist/gates/approve.js.map +1 -0
- package/dist/gates/build-context.d.ts +17 -0
- package/dist/gates/build-context.d.ts.map +1 -0
- package/dist/gates/build-context.js +81 -0
- package/dist/gates/build-context.js.map +1 -0
- package/dist/gates/build-test-must-pass.d.ts +12 -0
- package/dist/gates/build-test-must-pass.d.ts.map +1 -0
- package/dist/gates/build-test-must-pass.js +23 -0
- package/dist/gates/build-test-must-pass.js.map +1 -0
- package/dist/gates/build-types.d.ts +54 -0
- package/dist/gates/build-types.d.ts.map +1 -0
- package/dist/gates/build-types.js +2 -0
- package/dist/gates/build-types.js.map +1 -0
- package/dist/gates/code-review.d.ts +20 -0
- package/dist/gates/code-review.d.ts.map +1 -0
- package/dist/gates/code-review.js +137 -0
- package/dist/gates/code-review.js.map +1 -0
- package/dist/gates/coherence.d.ts +26 -0
- package/dist/gates/coherence.d.ts.map +1 -0
- package/dist/gates/coherence.js +59 -0
- package/dist/gates/coherence.js.map +1 -0
- package/dist/gates/coverage.d.ts +8 -0
- package/dist/gates/coverage.d.ts.map +1 -0
- package/dist/gates/coverage.js +26 -0
- package/dist/gates/coverage.js.map +1 -0
- package/dist/gates/deep-verify.d.ts +7 -0
- package/dist/gates/deep-verify.d.ts.map +1 -0
- package/dist/gates/deep-verify.js +77 -0
- package/dist/gates/deep-verify.js.map +1 -0
- package/dist/gates/draft-context.d.ts +20 -0
- package/dist/gates/draft-context.d.ts.map +1 -0
- package/dist/gates/draft-context.js +87 -0
- package/dist/gates/draft-context.js.map +1 -0
- package/dist/gates/draft-read.d.ts +10 -0
- package/dist/gates/draft-read.d.ts.map +1 -0
- package/dist/gates/draft-read.js +24 -0
- package/dist/gates/draft-read.js.map +1 -0
- package/dist/gates/draft-types.d.ts +75 -0
- package/dist/gates/draft-types.d.ts.map +1 -0
- package/dist/gates/draft-types.js +2 -0
- package/dist/gates/draft-types.js.map +1 -0
- package/dist/gates/engine.d.ts +21 -0
- package/dist/gates/engine.d.ts.map +1 -0
- package/dist/gates/engine.js +98 -0
- package/dist/gates/engine.js.map +1 -0
- package/dist/gates/interactive.d.ts +11 -0
- package/dist/gates/interactive.d.ts.map +1 -0
- package/dist/gates/interactive.js +55 -0
- package/dist/gates/interactive.js.map +1 -0
- package/dist/gates/per-task-verify.d.ts +12 -0
- package/dist/gates/per-task-verify.d.ts.map +1 -0
- package/dist/gates/per-task-verify.js +52 -0
- package/dist/gates/per-task-verify.js.map +1 -0
- package/dist/gates/plan-review.d.ts +13 -0
- package/dist/gates/plan-review.d.ts.map +1 -0
- package/dist/gates/plan-review.js +98 -0
- package/dist/gates/plan-review.js.map +1 -0
- package/dist/gates/registry.d.ts +53 -0
- package/dist/gates/registry.d.ts.map +1 -0
- package/dist/gates/registry.js +66 -0
- package/dist/gates/registry.js.map +1 -0
- package/dist/gates/security-audit.d.ts +11 -0
- package/dist/gates/security-audit.d.ts.map +1 -0
- package/dist/gates/security-audit.js +40 -0
- package/dist/gates/security-audit.js.map +1 -0
- package/dist/gates/structural-verifier.d.ts +8 -0
- package/dist/gates/structural-verifier.d.ts.map +1 -0
- package/dist/gates/structural-verifier.js +25 -0
- package/dist/gates/structural-verifier.js.map +1 -0
- package/dist/gates/types.d.ts +202 -0
- package/dist/gates/types.d.ts.map +1 -0
- package/dist/gates/types.js +12 -0
- package/dist/gates/types.js.map +1 -0
- package/dist/hooks/dispatcher.d.ts +8 -0
- package/dist/hooks/dispatcher.d.ts.map +1 -0
- package/dist/hooks/dispatcher.js +31 -0
- package/dist/hooks/dispatcher.js.map +1 -0
- package/dist/hooks/handlers.d.ts +21 -0
- package/dist/hooks/handlers.d.ts.map +1 -0
- package/dist/hooks/handlers.js +121 -0
- package/dist/hooks/handlers.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/init/claude-md-template.d.ts +34 -0
- package/dist/init/claude-md-template.d.ts.map +1 -0
- package/dist/init/claude-md-template.js +72 -0
- package/dist/init/claude-md-template.js.map +1 -0
- package/dist/intelligence/backend/cadence.d.ts +21 -0
- package/dist/intelligence/backend/cadence.d.ts.map +1 -0
- package/dist/intelligence/backend/cadence.js +127 -0
- package/dist/intelligence/backend/cadence.js.map +1 -0
- package/dist/intelligence/context.d.ts +11 -0
- package/dist/intelligence/context.d.ts.map +1 -0
- package/dist/intelligence/context.js +197 -0
- package/dist/intelligence/context.js.map +1 -0
- package/dist/intelligence/graph-decision.d.ts +9 -0
- package/dist/intelligence/graph-decision.d.ts.map +1 -0
- package/dist/intelligence/graph-decision.js +55 -0
- package/dist/intelligence/graph-decision.js.map +1 -0
- package/dist/intelligence/inspect.d.ts +9 -0
- package/dist/intelligence/inspect.d.ts.map +1 -0
- package/dist/intelligence/inspect.js +93 -0
- package/dist/intelligence/inspect.js.map +1 -0
- package/dist/intelligence/milestone.d.ts +40 -0
- package/dist/intelligence/milestone.d.ts.map +1 -0
- package/dist/intelligence/milestone.js +312 -0
- package/dist/intelligence/milestone.js.map +1 -0
- package/dist/intelligence/recommend.d.ts +20 -0
- package/dist/intelligence/recommend.d.ts.map +1 -0
- package/dist/intelligence/recommend.js +185 -0
- package/dist/intelligence/recommend.js.map +1 -0
- package/dist/intelligence/render-assumption-detail.d.ts +3 -0
- package/dist/intelligence/render-assumption-detail.d.ts.map +1 -0
- package/dist/intelligence/render-assumption-detail.js +16 -0
- package/dist/intelligence/render-assumption-detail.js.map +1 -0
- package/dist/intelligence/render-assumption.d.ts +3 -0
- package/dist/intelligence/render-assumption.d.ts.map +1 -0
- package/dist/intelligence/render-assumption.js +37 -0
- package/dist/intelligence/render-assumption.js.map +1 -0
- package/dist/intelligence/render-context.d.ts +3 -0
- package/dist/intelligence/render-context.d.ts.map +1 -0
- package/dist/intelligence/render-context.js +92 -0
- package/dist/intelligence/render-context.js.map +1 -0
- package/dist/intelligence/render-decision-detail.d.ts +3 -0
- package/dist/intelligence/render-decision-detail.d.ts.map +1 -0
- package/dist/intelligence/render-decision-detail.js +30 -0
- package/dist/intelligence/render-decision-detail.js.map +1 -0
- package/dist/intelligence/render-decision-graph.d.ts +3 -0
- package/dist/intelligence/render-decision-graph.d.ts.map +1 -0
- package/dist/intelligence/render-decision-graph.js +49 -0
- package/dist/intelligence/render-decision-graph.js.map +1 -0
- package/dist/intelligence/render-decision.d.ts +3 -0
- package/dist/intelligence/render-decision.d.ts.map +1 -0
- package/dist/intelligence/render-decision.js +45 -0
- package/dist/intelligence/render-decision.js.map +1 -0
- package/dist/intelligence/render-inspection.d.ts +3 -0
- package/dist/intelligence/render-inspection.d.ts.map +1 -0
- package/dist/intelligence/render-inspection.js +69 -0
- package/dist/intelligence/render-inspection.js.map +1 -0
- package/dist/intelligence/render-intelligence-audit.d.ts +5 -0
- package/dist/intelligence/render-intelligence-audit.d.ts.map +1 -0
- package/dist/intelligence/render-intelligence-audit.js +93 -0
- package/dist/intelligence/render-intelligence-audit.js.map +1 -0
- package/dist/intelligence/render-intelligence-stats.d.ts +6 -0
- package/dist/intelligence/render-intelligence-stats.d.ts.map +1 -0
- package/dist/intelligence/render-intelligence-stats.js +76 -0
- package/dist/intelligence/render-intelligence-stats.js.map +1 -0
- package/dist/intelligence/render-milestone.d.ts +3 -0
- package/dist/intelligence/render-milestone.d.ts.map +1 -0
- package/dist/intelligence/render-milestone.js +80 -0
- package/dist/intelligence/render-milestone.js.map +1 -0
- package/dist/intelligence/render-recommend.d.ts +3 -0
- package/dist/intelligence/render-recommend.d.ts.map +1 -0
- package/dist/intelligence/render-recommend.js +62 -0
- package/dist/intelligence/render-recommend.js.map +1 -0
- package/dist/intelligence/render-recommendation-detail.d.ts +7 -0
- package/dist/intelligence/render-recommendation-detail.d.ts.map +1 -0
- package/dist/intelligence/render-recommendation-detail.js +93 -0
- package/dist/intelligence/render-recommendation-detail.js.map +1 -0
- package/dist/intelligence/render.d.ts +3 -0
- package/dist/intelligence/render.d.ts.map +1 -0
- package/dist/intelligence/render.js +57 -0
- package/dist/intelligence/render.js.map +1 -0
- package/dist/intelligence/scan.d.ts +3 -0
- package/dist/intelligence/scan.d.ts.map +1 -0
- package/dist/intelligence/scan.js +103 -0
- package/dist/intelligence/scan.js.map +1 -0
- package/dist/intelligence/store.d.ts +143 -0
- package/dist/intelligence/store.d.ts.map +1 -0
- package/dist/intelligence/store.js +701 -0
- package/dist/intelligence/store.js.map +1 -0
- package/dist/notify/code-review.d.ts +34 -0
- package/dist/notify/code-review.d.ts.map +1 -0
- package/dist/notify/code-review.js +56 -0
- package/dist/notify/code-review.js.map +1 -0
- package/dist/notify/collect.d.ts +31 -0
- package/dist/notify/collect.d.ts.map +1 -0
- package/dist/notify/collect.js +127 -0
- package/dist/notify/collect.js.map +1 -0
- package/dist/notify/emit-unconverged.d.ts +26 -0
- package/dist/notify/emit-unconverged.d.ts.map +1 -0
- package/dist/notify/emit-unconverged.js +31 -0
- package/dist/notify/emit-unconverged.js.map +1 -0
- package/dist/notify/factory.d.ts +12 -0
- package/dist/notify/factory.d.ts.map +1 -0
- package/dist/notify/factory.js +29 -0
- package/dist/notify/factory.js.map +1 -0
- package/dist/notify/file.d.ts +13 -0
- package/dist/notify/file.d.ts.map +1 -0
- package/dist/notify/file.js +21 -0
- package/dist/notify/file.js.map +1 -0
- package/dist/notify/loop-violation.d.ts +10 -0
- package/dist/notify/loop-violation.d.ts.map +1 -0
- package/dist/notify/loop-violation.js +46 -0
- package/dist/notify/loop-violation.js.map +1 -0
- package/dist/notify/notifier.d.ts +13 -0
- package/dist/notify/notifier.d.ts.map +1 -0
- package/dist/notify/notifier.js +2 -0
- package/dist/notify/notifier.js.map +1 -0
- package/dist/notify/null.d.ts +11 -0
- package/dist/notify/null.d.ts.map +1 -0
- package/dist/notify/null.js +11 -0
- package/dist/notify/null.js.map +1 -0
- package/dist/notify/plan-review.d.ts +20 -0
- package/dist/notify/plan-review.d.ts.map +1 -0
- package/dist/notify/plan-review.js +15 -0
- package/dist/notify/plan-review.js.map +1 -0
- package/dist/notify/skill-audit.d.ts +18 -0
- package/dist/notify/skill-audit.d.ts.map +1 -0
- package/dist/notify/skill-audit.js +33 -0
- package/dist/notify/skill-audit.js.map +1 -0
- package/dist/notify/spec-review.d.ts +20 -0
- package/dist/notify/spec-review.d.ts.map +1 -0
- package/dist/notify/spec-review.js +15 -0
- package/dist/notify/spec-review.js.map +1 -0
- package/dist/notify/stderr.d.ts +17 -0
- package/dist/notify/stderr.d.ts.map +1 -0
- package/dist/notify/stderr.js +17 -0
- package/dist/notify/stderr.js.map +1 -0
- package/dist/notify/webhook.d.ts +33 -0
- package/dist/notify/webhook.d.ts.map +1 -0
- package/dist/notify/webhook.js +55 -0
- package/dist/notify/webhook.js.map +1 -0
- package/dist/parse/draft-parser.d.ts +3 -0
- package/dist/parse/draft-parser.d.ts.map +1 -0
- package/dist/parse/draft-parser.js +99 -0
- package/dist/parse/draft-parser.js.map +1 -0
- package/dist/parse/draft-scaffold.d.ts +14 -0
- package/dist/parse/draft-scaffold.d.ts.map +1 -0
- package/dist/parse/draft-scaffold.js +31 -0
- package/dist/parse/draft-scaffold.js.map +1 -0
- package/dist/parse/spec-parser.d.ts +3 -0
- package/dist/parse/spec-parser.d.ts.map +1 -0
- package/dist/parse/spec-parser.js +68 -0
- package/dist/parse/spec-parser.js.map +1 -0
- package/dist/parse/summary-writer.d.ts +3 -0
- package/dist/parse/summary-writer.d.ts.map +1 -0
- package/dist/parse/summary-writer.js +41 -0
- package/dist/parse/summary-writer.js.map +1 -0
- package/dist/progress.d.ts +7 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +37 -0
- package/dist/progress.js.map +1 -0
- package/dist/render/state-md.d.ts +3 -0
- package/dist/render/state-md.d.ts.map +1 -0
- package/dist/render/state-md.js +33 -0
- package/dist/render/state-md.js.map +1 -0
- package/dist/state/atomic-write.d.ts +3 -0
- package/dist/state/atomic-write.d.ts.map +1 -0
- package/dist/state/atomic-write.js +52 -0
- package/dist/state/atomic-write.js.map +1 -0
- package/dist/state/backend.d.ts +13 -0
- package/dist/state/backend.d.ts.map +1 -0
- package/dist/state/backend.js +2 -0
- package/dist/state/backend.js.map +1 -0
- package/dist/state/simple.d.ts +18 -0
- package/dist/state/simple.d.ts.map +1 -0
- package/dist/state/simple.js +67 -0
- package/dist/state/simple.js.map +1 -0
- package/dist/status.d.ts +47 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +209 -0
- package/dist/status.js.map +1 -0
- package/dist/verify/anthropic-verifier.d.ts +28 -0
- package/dist/verify/anthropic-verifier.d.ts.map +1 -0
- package/dist/verify/anthropic-verifier.js +109 -0
- package/dist/verify/anthropic-verifier.js.map +1 -0
- package/dist/verify/code-review-factory.d.ts +103 -0
- package/dist/verify/code-review-factory.d.ts.map +1 -0
- package/dist/verify/code-review-factory.js +11 -0
- package/dist/verify/code-review-factory.js.map +1 -0
- package/dist/verify/code-review.d.ts +65 -0
- package/dist/verify/code-review.d.ts.map +1 -0
- package/dist/verify/code-review.js +189 -0
- package/dist/verify/code-review.js.map +1 -0
- package/dist/verify/converge.d.ts +14 -0
- package/dist/verify/converge.d.ts.map +1 -0
- package/dist/verify/converge.js +17 -0
- package/dist/verify/converge.js.map +1 -0
- package/dist/verify/coverage.d.ts +31 -0
- package/dist/verify/coverage.d.ts.map +1 -0
- package/dist/verify/coverage.js +125 -0
- package/dist/verify/coverage.js.map +1 -0
- package/dist/verify/factory.d.ts +107 -0
- package/dist/verify/factory.d.ts.map +1 -0
- package/dist/verify/factory.js +17 -0
- package/dist/verify/factory.js.map +1 -0
- package/dist/verify/interactive.d.ts +22 -0
- package/dist/verify/interactive.d.ts.map +1 -0
- package/dist/verify/interactive.js +61 -0
- package/dist/verify/interactive.js.map +1 -0
- package/dist/verify/local-client.d.ts +13 -0
- package/dist/verify/local-client.d.ts.map +1 -0
- package/dist/verify/local-client.js +73 -0
- package/dist/verify/local-client.js.map +1 -0
- package/dist/verify/mock-verifier.d.ts +16 -0
- package/dist/verify/mock-verifier.d.ts.map +1 -0
- package/dist/verify/mock-verifier.js +30 -0
- package/dist/verify/mock-verifier.js.map +1 -0
- package/dist/verify/per-task-factory.d.ts +103 -0
- package/dist/verify/per-task-factory.d.ts.map +1 -0
- package/dist/verify/per-task-factory.js +11 -0
- package/dist/verify/per-task-factory.js.map +1 -0
- package/dist/verify/per-task.d.ts +69 -0
- package/dist/verify/per-task.d.ts.map +1 -0
- package/dist/verify/per-task.js +154 -0
- package/dist/verify/per-task.js.map +1 -0
- package/dist/verify/plan-review-factory.d.ts +103 -0
- package/dist/verify/plan-review-factory.d.ts.map +1 -0
- package/dist/verify/plan-review-factory.js +11 -0
- package/dist/verify/plan-review-factory.js.map +1 -0
- package/dist/verify/plan-review.d.ts +67 -0
- package/dist/verify/plan-review.d.ts.map +1 -0
- package/dist/verify/plan-review.js +196 -0
- package/dist/verify/plan-review.js.map +1 -0
- package/dist/verify/prompter.d.ts +40 -0
- package/dist/verify/prompter.d.ts.map +1 -0
- package/dist/verify/prompter.js +48 -0
- package/dist/verify/prompter.js.map +1 -0
- package/dist/verify/security-audit-factory.d.ts +103 -0
- package/dist/verify/security-audit-factory.d.ts.map +1 -0
- package/dist/verify/security-audit-factory.js +11 -0
- package/dist/verify/security-audit-factory.js.map +1 -0
- package/dist/verify/security-audit.d.ts +63 -0
- package/dist/verify/security-audit.d.ts.map +1 -0
- package/dist/verify/security-audit.js +196 -0
- package/dist/verify/security-audit.js.map +1 -0
- package/dist/verify/skill-match.d.ts +10 -0
- package/dist/verify/skill-match.d.ts.map +1 -0
- package/dist/verify/skill-match.js +15 -0
- package/dist/verify/skill-match.js.map +1 -0
- package/dist/verify/spec-review-factory.d.ts +103 -0
- package/dist/verify/spec-review-factory.d.ts.map +1 -0
- package/dist/verify/spec-review-factory.js +11 -0
- package/dist/verify/spec-review-factory.js.map +1 -0
- package/dist/verify/spec-review.d.ts +63 -0
- package/dist/verify/spec-review.d.ts.map +1 -0
- package/dist/verify/spec-review.js +182 -0
- package/dist/verify/spec-review.js.map +1 -0
- package/dist/verify/verifier-factory.d.ts +45 -0
- package/dist/verify/verifier-factory.d.ts.map +1 -0
- package/dist/verify/verifier-factory.js +38 -0
- package/dist/verify/verifier-factory.js.map +1 -0
- package/dist/verify/verifier.d.ts +63 -0
- package/dist/verify/verifier.d.ts.map +1 -0
- package/dist/verify/verifier.js +32 -0
- package/dist/verify/verifier.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import { zodOutputFormat } from '@anthropic-ai/sdk/helpers/zod';
|
|
3
|
+
import { z } from 'zod/v4';
|
|
4
|
+
export const VerifierResponseSchema = z.object({
|
|
5
|
+
verdicts: z.array(z.object({
|
|
6
|
+
id: z.string(),
|
|
7
|
+
pass: z.boolean(),
|
|
8
|
+
reason: z.string(),
|
|
9
|
+
})),
|
|
10
|
+
});
|
|
11
|
+
export const SYSTEM_PROMPT = `You are an independent acceptance-criterion verifier for an AI-assisted development tool called CADENCE.
|
|
12
|
+
|
|
13
|
+
For each acceptance criterion (AC) you receive, decide whether the supplied diff + test references actually deliver what the AC promises in plain English. Be skeptical: "tests exist" is necessary but not sufficient; the diff must actually implement the behavior the AC describes.
|
|
14
|
+
|
|
15
|
+
Return one verdict per AC. Use:
|
|
16
|
+
- pass=true when the diff implements the AC AND a referenced test exercises it
|
|
17
|
+
- pass=false when the implementation is missing, partial, or untested
|
|
18
|
+
- Keep each reason ≤ 200 characters, citing the specific gap or proof
|
|
19
|
+
|
|
20
|
+
Return strict JSON matching the requested schema. Do not include narrative outside the schema.`;
|
|
21
|
+
const DEFAULT_MODEL = 'claude-sonnet-4-6';
|
|
22
|
+
const DEFAULT_MAX_TOKENS = 16_000;
|
|
23
|
+
export class AnthropicVerifier {
|
|
24
|
+
name = 'anthropic';
|
|
25
|
+
client;
|
|
26
|
+
model;
|
|
27
|
+
maxTokens;
|
|
28
|
+
constructor(opts = {}) {
|
|
29
|
+
if (opts.client) {
|
|
30
|
+
this.client = opts.client;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const apiKey = opts.apiKey ?? process.env.ANTHROPIC_API_KEY;
|
|
34
|
+
if (!apiKey) {
|
|
35
|
+
throw new Error('AnthropicVerifier requires an API key. Set ANTHROPIC_API_KEY or pass `apiKey` / `client`.');
|
|
36
|
+
}
|
|
37
|
+
this.client = new Anthropic({ apiKey });
|
|
38
|
+
}
|
|
39
|
+
this.model = opts.model ?? DEFAULT_MODEL;
|
|
40
|
+
this.maxTokens = opts.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
41
|
+
}
|
|
42
|
+
async verify(input) {
|
|
43
|
+
if (input.acs.length === 0) {
|
|
44
|
+
return { verdicts: {}, provider: this.name, model: this.model };
|
|
45
|
+
}
|
|
46
|
+
const userMessage = formatUserMessage(input);
|
|
47
|
+
let response;
|
|
48
|
+
try {
|
|
49
|
+
response = await this.client.messages.parse({
|
|
50
|
+
model: this.model,
|
|
51
|
+
max_tokens: this.maxTokens,
|
|
52
|
+
system: [
|
|
53
|
+
{
|
|
54
|
+
type: 'text',
|
|
55
|
+
text: SYSTEM_PROMPT,
|
|
56
|
+
cache_control: { type: 'ephemeral' },
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
output_config: {
|
|
60
|
+
format: zodOutputFormat(VerifierResponseSchema),
|
|
61
|
+
},
|
|
62
|
+
messages: [{ role: 'user', content: userMessage }],
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
if (err instanceof Anthropic.APIError) {
|
|
67
|
+
throw new Error(`AnthropicVerifier API error (${err.status ?? 'unknown'}): ${err.message}`);
|
|
68
|
+
}
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
const parsed = response.parsed_output;
|
|
72
|
+
if (!parsed) {
|
|
73
|
+
throw new Error('AnthropicVerifier received no parseable output from the model (response.parsed_output was null/undefined).');
|
|
74
|
+
}
|
|
75
|
+
const verdicts = {};
|
|
76
|
+
for (const v of parsed.verdicts) {
|
|
77
|
+
verdicts[v.id] = { pass: v.pass, reason: v.reason };
|
|
78
|
+
}
|
|
79
|
+
return { verdicts, provider: this.name, model: this.model };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function formatUserMessage(input) {
|
|
83
|
+
const acList = input.acs
|
|
84
|
+
.map((ac) => `### ${ac.id}\nGiven: ${ac.given}\nWhen: ${ac.when}\nThen: ${ac.then}`)
|
|
85
|
+
.join('\n\n');
|
|
86
|
+
const testList = Object.entries(input.tests)
|
|
87
|
+
.map(([acId, refs]) => {
|
|
88
|
+
const lines = refs
|
|
89
|
+
.map((r) => `- ${r.file}:${r.line} — ${r.snippet}`)
|
|
90
|
+
.join('\n');
|
|
91
|
+
return `## ${acId} linked tests\n${lines || '(none)'}`;
|
|
92
|
+
})
|
|
93
|
+
.join('\n\n');
|
|
94
|
+
const fileList = input.files.length > 0
|
|
95
|
+
? input.files.map((f) => `- ${f}`).join('\n')
|
|
96
|
+
: '(none)';
|
|
97
|
+
const diffSection = input.diff || '(no diff supplied)';
|
|
98
|
+
const ids = input.acs.map((ac) => ac.id);
|
|
99
|
+
const idList = ids.join(', ');
|
|
100
|
+
const example = JSON.stringify({
|
|
101
|
+
verdicts: ids.map((id) => ({
|
|
102
|
+
id,
|
|
103
|
+
pass: true,
|
|
104
|
+
reason: 'why this AC is (or is not) delivered',
|
|
105
|
+
})),
|
|
106
|
+
});
|
|
107
|
+
return `# Acceptance Criteria\n\n${acList}\n\n# Linked tests\n\n${testList || '(none)'}\n\n# Touched files\n\n${fileList}\n\n# Diff\n\n${diffSection}\n\nReturn exactly one verdict object per acceptance criterion: ${idList}. Each verdict's "id" MUST be the exact AC id string shown above (e.g. "${ids[0] ?? 'AC-1'}") — do not renumber, omit, or invent ids. Respond with strict JSON in exactly this shape (same keys, one entry per AC):\n\n${example}`;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=anthropic-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-verifier.js","sourceRoot":"","sources":["../../src/verify/anthropic-verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { type CodeReviewVerifier } from './code-review.js';
|
|
2
|
+
import { type VerifierSelectOptions } from './verifier-factory.js';
|
|
3
|
+
/** @deprecated alias of `VerifierSelectOptions` (kept for API stability). */
|
|
4
|
+
export type SelectCodeReviewVerifierOptions = VerifierSelectOptions;
|
|
5
|
+
/** Picks the code-review verifier given config + env (Phase 24.3). */
|
|
6
|
+
export declare const selectCodeReviewVerifier: (config: Pick<{
|
|
7
|
+
schemaVersion: 1;
|
|
8
|
+
profile: "strict" | "standard" | "auto";
|
|
9
|
+
loopEnforcement: "strict" | "soft" | "reminder";
|
|
10
|
+
acDiscipline: "strict" | "tier-scaled" | "optional";
|
|
11
|
+
workstreamBackend: string;
|
|
12
|
+
ruleProvider: string;
|
|
13
|
+
subagentPolicy: {
|
|
14
|
+
contextBudgetThreshold: number;
|
|
15
|
+
largeTaskTokens: number;
|
|
16
|
+
mechanicalBatchMin: number;
|
|
17
|
+
};
|
|
18
|
+
modelPerClass: {
|
|
19
|
+
standard: string;
|
|
20
|
+
mechanical: string;
|
|
21
|
+
complex: string;
|
|
22
|
+
drafting: string;
|
|
23
|
+
};
|
|
24
|
+
commitCadence: "task" | "draft" | "manual";
|
|
25
|
+
templates: {
|
|
26
|
+
dir: string;
|
|
27
|
+
overrides: string[];
|
|
28
|
+
};
|
|
29
|
+
hooks: {
|
|
30
|
+
sessionStart: boolean;
|
|
31
|
+
stopReminder: boolean;
|
|
32
|
+
preToolUseBuildGate: boolean;
|
|
33
|
+
userPromptSubmit: boolean;
|
|
34
|
+
};
|
|
35
|
+
packs: {
|
|
36
|
+
enabled: string[];
|
|
37
|
+
disabled: string[];
|
|
38
|
+
};
|
|
39
|
+
telemetry: {
|
|
40
|
+
tokenUtilization: boolean;
|
|
41
|
+
skillInvocations: boolean;
|
|
42
|
+
remoteOptIn: boolean;
|
|
43
|
+
};
|
|
44
|
+
skillAudit: {
|
|
45
|
+
required: string[];
|
|
46
|
+
};
|
|
47
|
+
convergence: {
|
|
48
|
+
maxAttempts: number;
|
|
49
|
+
};
|
|
50
|
+
specReview: {
|
|
51
|
+
provider: "mock" | "anthropic" | "local";
|
|
52
|
+
model?: string | undefined;
|
|
53
|
+
};
|
|
54
|
+
tier: {
|
|
55
|
+
standard: {
|
|
56
|
+
maxTasks: number;
|
|
57
|
+
maxFiles: number;
|
|
58
|
+
};
|
|
59
|
+
complex: {
|
|
60
|
+
maxTasks: number;
|
|
61
|
+
minTasks: number;
|
|
62
|
+
};
|
|
63
|
+
quickFix: {
|
|
64
|
+
maxTasks: number;
|
|
65
|
+
maxFiles: number;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
verification: {
|
|
69
|
+
testGlobs: string[];
|
|
70
|
+
testCommand?: string | undefined;
|
|
71
|
+
};
|
|
72
|
+
verifier: {
|
|
73
|
+
provider: "mock" | "anthropic" | "local";
|
|
74
|
+
model?: string | undefined;
|
|
75
|
+
};
|
|
76
|
+
perTaskVerifier: {
|
|
77
|
+
provider: "mock" | "anthropic" | "local";
|
|
78
|
+
model?: string | undefined;
|
|
79
|
+
};
|
|
80
|
+
codeReview: {
|
|
81
|
+
provider: "mock" | "anthropic" | "local";
|
|
82
|
+
model?: string | undefined;
|
|
83
|
+
};
|
|
84
|
+
planReview: {
|
|
85
|
+
provider: "mock" | "anthropic" | "local";
|
|
86
|
+
model?: string | undefined;
|
|
87
|
+
};
|
|
88
|
+
securityAudit: {
|
|
89
|
+
provider: "mock" | "anthropic" | "local";
|
|
90
|
+
model?: string | undefined;
|
|
91
|
+
};
|
|
92
|
+
notify: {
|
|
93
|
+
transport: "stderr" | "file" | "none" | "webhook";
|
|
94
|
+
file?: string | undefined;
|
|
95
|
+
webhook?: {
|
|
96
|
+
url: string;
|
|
97
|
+
headers?: Record<string, string> | undefined;
|
|
98
|
+
timeoutMs?: number | undefined;
|
|
99
|
+
} | undefined;
|
|
100
|
+
};
|
|
101
|
+
$schema?: string | undefined;
|
|
102
|
+
}, "codeReview"> | null, opts?: VerifierSelectOptions) => CodeReviewVerifier;
|
|
103
|
+
//# sourceMappingURL=code-review-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-review-factory.d.ts","sourceRoot":"","sources":["../../src/verify/code-review-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,uBAAuB,CAAC;AAE/B,6EAA6E;AAC7E,MAAM,MAAM,+BAA+B,GAAG,qBAAqB,CAAC;AAEpE,sEAAsE;AACtE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAU00Y,CAAC;;;;;;;;;;;;;;;;;;mBAAoY,CAAC;;;;aAA4G,CAAC;;;;aAAmH,CAAC;;;;aAA8G,CAAC;;;;aAA8G,CAAC;;;;aAAiH,CAAC;;;;YAAkH,CAAC;eAAqC,CAAC;;mBAAgD,CAAC;qBAA2D,CAAC;;;;4EAD1ib,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AnthropicCodeReviewVerifier, LocalCodeReviewVerifier, MockCodeReviewVerifier, } from './code-review.js';
|
|
2
|
+
import { createVerifierFactory, } from './verifier-factory.js';
|
|
3
|
+
/** Picks the code-review verifier given config + env (Phase 24.3). */
|
|
4
|
+
export const selectCodeReviewVerifier = createVerifierFactory({
|
|
5
|
+
label: 'code-review',
|
|
6
|
+
read: (c) => c?.codeReview,
|
|
7
|
+
mock: () => new MockCodeReviewVerifier(),
|
|
8
|
+
anthropic: (o) => new AnthropicCodeReviewVerifier(o),
|
|
9
|
+
local: (o) => new LocalCodeReviewVerifier(o),
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=code-review-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-review-factory.js","sourceRoot":"","sources":["../../src/verify/code-review-factory.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,sBAAsB,GAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,GAEtB,MAAM,uBAAuB,CAAC;AAK/B,sEAAsE;AACtE,MAAM,CAAC,MAAM,wBAAwB,GAAG,qBAAqB,CAG3D;IACA,KAAK,EAAE,aAAa;IACpB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU;IAC1B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,sBAAsB,EAAE;IACxC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,2BAA2B,CAAC,CAAC,CAAC;IACpD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,uBAAuB,CAAC,CAAC,CAAC;CAC7C,CAAC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 24.3 — code-review verifier. Per-file findings against the phase
|
|
4
|
+
* diff. Fires at `cadence settle run` when `'code-review'` is in the
|
|
5
|
+
* effective gate set (strict×standard, strict×complex, standard×complex).
|
|
6
|
+
* HIGH findings refuse settle unless `--force` / `--allow-code-review-failure`.
|
|
7
|
+
*/
|
|
8
|
+
export type FindingSeverity = 'high' | 'medium' | 'low';
|
|
9
|
+
export interface Finding {
|
|
10
|
+
severity: FindingSeverity;
|
|
11
|
+
message: string;
|
|
12
|
+
line?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface CodeReviewInput {
|
|
15
|
+
/** Touched files (from draft tasks). Used to scope diff parsing + Anthropic prompt. */
|
|
16
|
+
files: string[];
|
|
17
|
+
/** Unified diff (`git diff HEAD -- <files>`). May be empty. */
|
|
18
|
+
diff: string;
|
|
19
|
+
}
|
|
20
|
+
export interface CodeReviewResult {
|
|
21
|
+
/** Per-file findings. File paths use forward slashes. */
|
|
22
|
+
findings: Record<string, Finding[]>;
|
|
23
|
+
provider: string;
|
|
24
|
+
model?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface CodeReviewVerifier {
|
|
27
|
+
readonly name: string;
|
|
28
|
+
verify(input: CodeReviewInput): Promise<CodeReviewResult>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Deterministic mock — flags every `console.log(...)` added in the diff as
|
|
32
|
+
* a HIGH finding. Empty diff (or no matches) returns no findings. The rule
|
|
33
|
+
* is intentionally narrow: real reviews live in the Anthropic provider.
|
|
34
|
+
*/
|
|
35
|
+
export declare class MockCodeReviewVerifier implements CodeReviewVerifier {
|
|
36
|
+
readonly name = "mock";
|
|
37
|
+
verify(input: CodeReviewInput): Promise<CodeReviewResult>;
|
|
38
|
+
}
|
|
39
|
+
export interface AnthropicCodeReviewVerifierOptions {
|
|
40
|
+
apiKey?: string;
|
|
41
|
+
model?: string;
|
|
42
|
+
maxTokens?: number;
|
|
43
|
+
/** Inject a client for tests; production callers should omit this. */
|
|
44
|
+
client?: Anthropic;
|
|
45
|
+
}
|
|
46
|
+
export declare class AnthropicCodeReviewVerifier implements CodeReviewVerifier {
|
|
47
|
+
readonly name = "anthropic";
|
|
48
|
+
private readonly client;
|
|
49
|
+
private readonly model;
|
|
50
|
+
private readonly maxTokens;
|
|
51
|
+
constructor(opts?: AnthropicCodeReviewVerifierOptions);
|
|
52
|
+
verify(input: CodeReviewInput): Promise<CodeReviewResult>;
|
|
53
|
+
}
|
|
54
|
+
export interface LocalCodeReviewVerifierOptions {
|
|
55
|
+
baseURL: string;
|
|
56
|
+
model: string;
|
|
57
|
+
transport?: typeof fetch;
|
|
58
|
+
}
|
|
59
|
+
export declare class LocalCodeReviewVerifier implements CodeReviewVerifier {
|
|
60
|
+
private readonly o;
|
|
61
|
+
readonly name = "local";
|
|
62
|
+
constructor(o: LocalCodeReviewVerifierOptions);
|
|
63
|
+
verify(input: CodeReviewInput): Promise<CodeReviewResult>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=code-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-review.d.ts","sourceRoot":"","sources":["../../src/verify/code-review.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAK1C;;;;;GAKG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAExD,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC3D;AAED;;;;GAIG;AACH,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,QAAQ,CAAC,IAAI,UAAU;IAEjB,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA8ChE;AA0BD,MAAM,WAAW,kCAAkC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,qBAAa,2BAA4B,YAAW,kBAAkB;IACpE,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,IAAI,GAAE,kCAAuC;IAgBnD,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAiDhE;AAED,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,qBAAa,uBAAwB,YAAW,kBAAkB;IAEpD,OAAO,CAAC,QAAQ,CAAC,CAAC;IAD9B,QAAQ,CAAC,IAAI,WAAW;gBACK,CAAC,EAAE,8BAA8B;IAExD,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAsBhE"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import { zodOutputFormat } from '@anthropic-ai/sdk/helpers/zod';
|
|
3
|
+
import { z } from 'zod/v4';
|
|
4
|
+
import { localChatJSON } from './local-client.js';
|
|
5
|
+
/**
|
|
6
|
+
* Deterministic mock — flags every `console.log(...)` added in the diff as
|
|
7
|
+
* a HIGH finding. Empty diff (or no matches) returns no findings. The rule
|
|
8
|
+
* is intentionally narrow: real reviews live in the Anthropic provider.
|
|
9
|
+
*/
|
|
10
|
+
export class MockCodeReviewVerifier {
|
|
11
|
+
name = 'mock';
|
|
12
|
+
async verify(input) {
|
|
13
|
+
const findings = {};
|
|
14
|
+
if (input.diff.trim().length === 0) {
|
|
15
|
+
return { findings, provider: this.name };
|
|
16
|
+
}
|
|
17
|
+
// Walk the unified diff. Track the current file via `+++ b/<path>`
|
|
18
|
+
// headers; track the post-image line via the `@@ -a,b +c,d @@` hunk
|
|
19
|
+
// headers; emit a HIGH finding per `+console.log(` line (skip `++` /
|
|
20
|
+
// file-header rows).
|
|
21
|
+
let currentFile = null;
|
|
22
|
+
let postLine = 0;
|
|
23
|
+
for (const raw of input.diff.split('\n')) {
|
|
24
|
+
if (raw.startsWith('+++ ')) {
|
|
25
|
+
// `+++ b/path` or `+++ /dev/null`
|
|
26
|
+
const m = /^\+\+\+\s+(?:b\/)?(.+?)\s*$/.exec(raw);
|
|
27
|
+
currentFile = m && m[1] && m[1] !== '/dev/null' ? m[1] : null;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (raw.startsWith('--- '))
|
|
31
|
+
continue;
|
|
32
|
+
if (raw.startsWith('@@')) {
|
|
33
|
+
const m = /\+(\d+)(?:,\d+)?/.exec(raw);
|
|
34
|
+
postLine = m ? Number.parseInt(m[1], 10) : 0;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (currentFile === null || raw.startsWith('++'))
|
|
38
|
+
continue;
|
|
39
|
+
if (raw.startsWith('+')) {
|
|
40
|
+
const body = raw.slice(1);
|
|
41
|
+
if (/console\.log\(/.test(body)) {
|
|
42
|
+
(findings[currentFile] ??= []).push({
|
|
43
|
+
severity: 'high',
|
|
44
|
+
message: 'console.log left in source',
|
|
45
|
+
line: postLine,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
postLine += 1;
|
|
49
|
+
}
|
|
50
|
+
else if (raw.startsWith('-')) {
|
|
51
|
+
// pre-image lines don't advance post-line counter
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// context line advances post-line counter
|
|
55
|
+
postLine += 1;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return { findings, provider: this.name };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const FindingResponseSchema = z.object({
|
|
62
|
+
file: z.string(),
|
|
63
|
+
severity: z.enum(['high', 'medium', 'low']),
|
|
64
|
+
message: z.string(),
|
|
65
|
+
line: z.number().int().positive().optional(),
|
|
66
|
+
});
|
|
67
|
+
const CodeReviewResponseSchema = z.object({
|
|
68
|
+
findings: z.array(FindingResponseSchema),
|
|
69
|
+
});
|
|
70
|
+
const SYSTEM_PROMPT = `You are an independent code reviewer for an AI-assisted development tool called CADENCE.
|
|
71
|
+
|
|
72
|
+
You receive the touched files and unified diff for a development phase. Surface concrete findings tied to specific files (and lines when you can identify them from the diff). Prioritize:
|
|
73
|
+
- security vulnerabilities (injection, secrets in code, unsafe deserialization) → high
|
|
74
|
+
- correctness bugs that will break under realistic inputs → high
|
|
75
|
+
- left-behind debug statements (console.log, debugger, printf debugging) → high
|
|
76
|
+
- structural / readability issues that don't break correctness → medium
|
|
77
|
+
- nits and style → low
|
|
78
|
+
|
|
79
|
+
Use severities exactly: "high" | "medium" | "low". If you have no findings, return an empty findings array. Keep each message ≤ 200 characters. Return strict JSON matching the requested schema.`;
|
|
80
|
+
const DEFAULT_MODEL = 'claude-sonnet-4-6';
|
|
81
|
+
const DEFAULT_MAX_TOKENS = 8_000;
|
|
82
|
+
export class AnthropicCodeReviewVerifier {
|
|
83
|
+
name = 'anthropic';
|
|
84
|
+
client;
|
|
85
|
+
model;
|
|
86
|
+
maxTokens;
|
|
87
|
+
constructor(opts = {}) {
|
|
88
|
+
if (opts.client) {
|
|
89
|
+
this.client = opts.client;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const apiKey = opts.apiKey ?? process.env.ANTHROPIC_API_KEY;
|
|
93
|
+
if (!apiKey) {
|
|
94
|
+
throw new Error('AnthropicCodeReviewVerifier requires an API key. Set ANTHROPIC_API_KEY or pass `apiKey` / `client`.');
|
|
95
|
+
}
|
|
96
|
+
this.client = new Anthropic({ apiKey });
|
|
97
|
+
}
|
|
98
|
+
this.model = opts.model ?? DEFAULT_MODEL;
|
|
99
|
+
this.maxTokens = opts.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
100
|
+
}
|
|
101
|
+
async verify(input) {
|
|
102
|
+
if (input.files.length === 0 && input.diff.trim().length === 0) {
|
|
103
|
+
return { findings: {}, provider: this.name, model: this.model };
|
|
104
|
+
}
|
|
105
|
+
const userMessage = formatUserMessage(input);
|
|
106
|
+
let response;
|
|
107
|
+
try {
|
|
108
|
+
response = await this.client.messages.parse({
|
|
109
|
+
model: this.model,
|
|
110
|
+
max_tokens: this.maxTokens,
|
|
111
|
+
system: [
|
|
112
|
+
{
|
|
113
|
+
type: 'text',
|
|
114
|
+
text: SYSTEM_PROMPT,
|
|
115
|
+
cache_control: { type: 'ephemeral' },
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
output_config: {
|
|
119
|
+
format: zodOutputFormat(CodeReviewResponseSchema),
|
|
120
|
+
},
|
|
121
|
+
messages: [{ role: 'user', content: userMessage }],
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
if (err instanceof Anthropic.APIError) {
|
|
126
|
+
throw new Error(`AnthropicCodeReviewVerifier API error (${err.status ?? 'unknown'}): ${err.message}`);
|
|
127
|
+
}
|
|
128
|
+
throw err;
|
|
129
|
+
}
|
|
130
|
+
const parsed = response.parsed_output;
|
|
131
|
+
if (!parsed) {
|
|
132
|
+
throw new Error('AnthropicCodeReviewVerifier received no parseable output from the model (response.parsed_output was null/undefined).');
|
|
133
|
+
}
|
|
134
|
+
const findings = {};
|
|
135
|
+
for (const f of parsed.findings) {
|
|
136
|
+
(findings[f.file] ??= []).push({
|
|
137
|
+
severity: f.severity,
|
|
138
|
+
message: f.message,
|
|
139
|
+
...(f.line !== undefined ? { line: f.line } : {}),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return { findings, provider: this.name, model: this.model };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export class LocalCodeReviewVerifier {
|
|
146
|
+
o;
|
|
147
|
+
name = 'local';
|
|
148
|
+
constructor(o) {
|
|
149
|
+
this.o = o;
|
|
150
|
+
}
|
|
151
|
+
async verify(input) {
|
|
152
|
+
if (input.files.length === 0 && input.diff.trim().length === 0) {
|
|
153
|
+
return { findings: {}, provider: this.name, model: this.o.model };
|
|
154
|
+
}
|
|
155
|
+
const parsed = await localChatJSON({
|
|
156
|
+
baseURL: this.o.baseURL,
|
|
157
|
+
model: this.o.model,
|
|
158
|
+
system: SYSTEM_PROMPT,
|
|
159
|
+
user: formatUserMessage(input),
|
|
160
|
+
schema: CodeReviewResponseSchema,
|
|
161
|
+
...(this.o.transport ? { transport: this.o.transport } : {}),
|
|
162
|
+
});
|
|
163
|
+
const findings = {};
|
|
164
|
+
for (const f of parsed.findings) {
|
|
165
|
+
(findings[f.file] ??= []).push({
|
|
166
|
+
severity: f.severity,
|
|
167
|
+
message: f.message,
|
|
168
|
+
...(f.line !== undefined ? { line: f.line } : {}),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
return { findings, provider: this.name, model: this.o.model };
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function formatUserMessage(input) {
|
|
175
|
+
const fileList = input.files.length > 0
|
|
176
|
+
? input.files.map((f) => `- ${f}`).join('\n')
|
|
177
|
+
: '(none)';
|
|
178
|
+
const diffSection = input.diff || '(no diff supplied)';
|
|
179
|
+
return `# Touched files
|
|
180
|
+
|
|
181
|
+
${fileList}
|
|
182
|
+
|
|
183
|
+
# Diff (\`git diff HEAD\`)
|
|
184
|
+
|
|
185
|
+
${diffSection}
|
|
186
|
+
|
|
187
|
+
Return findings (possibly empty) using the requested schema.`;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=code-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-review.js","sourceRoot":"","sources":["../../src/verify/code-review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ConvergeVerdict = 'pass' | 'reloop' | 'escalate';
|
|
2
|
+
/**
|
|
3
|
+
* Pure convergence classifier. Gate-agnostic — the caller supplies the
|
|
4
|
+
* boolean (plan-review now; survey #4's settle-gate later) and the attempt
|
|
5
|
+
* counters; this decides pass / reloop / escalate. No I/O.
|
|
6
|
+
*
|
|
7
|
+
* `attemptsSoFar` = count of FAILING reviews already recorded (>= 0).
|
|
8
|
+
* `maxAttempts` = > 0. With maxAttempts=3: fail→reloop(1)→reloop(2)→escalate(3).
|
|
9
|
+
*/
|
|
10
|
+
export declare function nextConvergence(pass: boolean, attemptsSoFar: number, maxAttempts: number): {
|
|
11
|
+
verdict: ConvergeVerdict;
|
|
12
|
+
attempt: number;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=converge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converge.d.ts","sourceRoot":"","sources":["../../src/verify/converge.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE7D;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAK/C"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure convergence classifier. Gate-agnostic — the caller supplies the
|
|
3
|
+
* boolean (plan-review now; survey #4's settle-gate later) and the attempt
|
|
4
|
+
* counters; this decides pass / reloop / escalate. No I/O.
|
|
5
|
+
*
|
|
6
|
+
* `attemptsSoFar` = count of FAILING reviews already recorded (>= 0).
|
|
7
|
+
* `maxAttempts` = > 0. With maxAttempts=3: fail→reloop(1)→reloop(2)→escalate(3).
|
|
8
|
+
*/
|
|
9
|
+
export function nextConvergence(pass, attemptsSoFar, maxAttempts) {
|
|
10
|
+
if (pass)
|
|
11
|
+
return { verdict: 'pass', attempt: attemptsSoFar };
|
|
12
|
+
const attempt = attemptsSoFar + 1;
|
|
13
|
+
if (attempt >= maxAttempts)
|
|
14
|
+
return { verdict: 'escalate', attempt };
|
|
15
|
+
return { verdict: 'reloop', attempt };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=converge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converge.js","sourceRoot":"","sources":["../../src/verify/converge.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAa,EACb,aAAqB,EACrB,WAAmB;IAEnB,IAAI,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAC7D,MAAM,OAAO,GAAG,aAAa,GAAG,CAAC,CAAC;IAClC,IAAI,OAAO,IAAI,WAAW;QAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type AcId = `AC-${number}` | string;
|
|
2
|
+
export interface TestRef {
|
|
3
|
+
/** Path relative to `repoRoot`, forward-slashed. */
|
|
4
|
+
file: string;
|
|
5
|
+
/** 1-based line number where the AC token first appeared. */
|
|
6
|
+
line: number;
|
|
7
|
+
/** Trimmed snippet of the matching line (≤120 chars). */
|
|
8
|
+
snippet: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CoverageScanOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Glob-ish patterns to match test files. Default scans the workspace
|
|
13
|
+
* `packages/**\/*.test.ts`. The implementation supports `**` (any depth)
|
|
14
|
+
* and `*` (any chars within a segment); no brace expansion or character
|
|
15
|
+
* classes — keep the convention narrow + dependency-free.
|
|
16
|
+
*/
|
|
17
|
+
globs?: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Walk the repo and collect a map of AC ids → tests that reference them.
|
|
21
|
+
* The convention is whole-file text search: any occurrence of `AC-N` inside
|
|
22
|
+
* a file matched by `globs` counts as one linked test. Comment refs count
|
|
23
|
+
* too, by design — the gate is binary per AC, not coverage-percentage.
|
|
24
|
+
*/
|
|
25
|
+
export declare function scanTestCoverage(repoRoot: string, opts?: CoverageScanOptions): Promise<Map<AcId, TestRef[]>>;
|
|
26
|
+
/**
|
|
27
|
+
* Returns the list of AC ids that have zero linked tests. Useful for the
|
|
28
|
+
* settle gate's refusal message.
|
|
29
|
+
*/
|
|
30
|
+
export declare function uncoveredAcs(acIds: string[], coverage: Map<AcId, TestRef[]>): string[];
|
|
31
|
+
//# sourceMappingURL=coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/verify/coverage.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,GAAG,MAAM,CAAC;AAE3C,MAAM,WAAW,OAAO;IACtB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CA8B/B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,GAC7B,MAAM,EAAE,CAEV"}
|