@dewtech/dare-cli 3.2.0 → 3.4.0
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 +764 -762
- package/dist/__tests__/confidence.test.js +13 -13
- package/dist/__tests__/dag-converter.test.js +56 -56
- package/dist/__tests__/dag-runner/ralph-loop.test.js +107 -45
- package/dist/__tests__/dag-runner/ralph-loop.test.js.map +1 -1
- package/dist/__tests__/dag-runner/state-store.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/state-store.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/state-store.test.js +74 -0
- package/dist/__tests__/dag-runner/state-store.test.js.map +1 -0
- package/dist/__tests__/ide-command-parity.test.js +1 -0
- package/dist/__tests__/ide-command-parity.test.js.map +1 -1
- package/dist/__tests__/mcp-server/server.test.js +3 -16
- package/dist/__tests__/mcp-server/server.test.js.map +1 -1
- package/dist/__tests__/project-generator.test.d.ts +2 -0
- package/dist/__tests__/project-generator.test.d.ts.map +1 -0
- package/dist/__tests__/project-generator.test.js +56 -0
- package/dist/__tests__/project-generator.test.js.map +1 -0
- package/dist/__tests__/refine.test.js +49 -49
- package/dist/__tests__/reverse-collection.test.js +6 -6
- package/dist/__tests__/review.test.js +38 -38
- package/dist/__tests__/security-hardening.test.d.ts +2 -0
- package/dist/__tests__/security-hardening.test.d.ts.map +1 -0
- package/dist/__tests__/security-hardening.test.js +101 -0
- package/dist/__tests__/security-hardening.test.js.map +1 -0
- package/dist/__tests__/validate.test.js +65 -65
- package/dist/bin/dare.js +2 -0
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/__tests__/bench.spec.d.ts +2 -0
- package/dist/commands/__tests__/bench.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/bench.spec.js +106 -0
- package/dist/commands/__tests__/bench.spec.js.map +1 -0
- package/dist/commands/__tests__/execute.best-of.spec.d.ts +2 -0
- package/dist/commands/__tests__/execute.best-of.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/execute.best-of.spec.js +24 -0
- package/dist/commands/__tests__/execute.best-of.spec.js.map +1 -0
- package/dist/commands/__tests__/execute.telemetry.spec.d.ts +2 -0
- package/dist/commands/__tests__/execute.telemetry.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/execute.telemetry.spec.js +93 -0
- package/dist/commands/__tests__/execute.telemetry.spec.js.map +1 -0
- package/dist/commands/__tests__/execute.verify.spec.d.ts +2 -0
- package/dist/commands/__tests__/execute.verify.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/execute.verify.spec.js +150 -0
- package/dist/commands/__tests__/execute.verify.spec.js.map +1 -0
- package/dist/commands/__tests__/init-validation.test.d.ts +2 -0
- package/dist/commands/__tests__/init-validation.test.d.ts.map +1 -0
- package/dist/commands/__tests__/init-validation.test.js +81 -0
- package/dist/commands/__tests__/init-validation.test.js.map +1 -0
- package/dist/commands/__tests__/init.integration.spec.js +6 -4
- package/dist/commands/__tests__/init.integration.spec.js.map +1 -1
- package/dist/commands/__tests__/init.spec.d.ts +2 -0
- package/dist/commands/__tests__/init.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/init.spec.js +88 -0
- package/dist/commands/__tests__/init.spec.js.map +1 -0
- package/dist/commands/bench.d.ts +10 -0
- package/dist/commands/bench.d.ts.map +1 -0
- package/dist/commands/bench.js +64 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/blueprint.js +122 -122
- package/dist/commands/design.js +20 -20
- package/dist/commands/execute-verification.d.ts +51 -0
- package/dist/commands/execute-verification.d.ts.map +1 -0
- package/dist/commands/execute-verification.js +201 -0
- package/dist/commands/execute-verification.js.map +1 -0
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +139 -2
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/init-validation.d.ts +22 -0
- package/dist/commands/init-validation.d.ts.map +1 -0
- package/dist/commands/init-validation.js +54 -0
- package/dist/commands/init-validation.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +26 -10
- package/dist/commands/init.js.map +1 -1
- package/dist/dag-runner/ralph-loop.d.ts +9 -9
- package/dist/dag-runner/ralph-loop.d.ts.map +1 -1
- package/dist/dag-runner/ralph-loop.js +89 -113
- package/dist/dag-runner/ralph-loop.js.map +1 -1
- package/dist/dag-runner/state-store.d.ts +14 -1
- package/dist/dag-runner/state-store.d.ts.map +1 -1
- package/dist/dag-runner/state-store.js +39 -8
- package/dist/dag-runner/state-store.js.map +1 -1
- package/dist/exec/npm-invoke.d.ts +8 -0
- package/dist/exec/npm-invoke.d.ts.map +1 -0
- package/dist/exec/npm-invoke.js +45 -0
- package/dist/exec/npm-invoke.js.map +1 -0
- package/dist/exec/safe-spawn.d.ts +21 -0
- package/dist/exec/safe-spawn.d.ts.map +1 -0
- package/dist/exec/safe-spawn.js +108 -0
- package/dist/exec/safe-spawn.js.map +1 -0
- package/dist/graphrag/graph-rag.js +24 -24
- package/dist/graphrag/types.d.ts +2 -2
- package/dist/graphrag/types.d.ts.map +1 -1
- package/dist/mcp-server/__tests__/auth.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/auth.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/auth.test.js +72 -0
- package/dist/mcp-server/__tests__/auth.test.js.map +1 -0
- package/dist/mcp-server/__tests__/boot-config.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/boot-config.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/boot-config.test.js +29 -0
- package/dist/mcp-server/__tests__/boot-config.test.js.map +1 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.js +66 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.js.map +1 -0
- package/dist/mcp-server/__tests__/path-confinement.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/path-confinement.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/path-confinement.test.js +135 -0
- package/dist/mcp-server/__tests__/path-confinement.test.js.map +1 -0
- package/dist/mcp-server/bin/server.js +18 -6
- package/dist/mcp-server/bin/server.js.map +1 -1
- package/dist/mcp-server/boot-config.d.ts +6 -0
- package/dist/mcp-server/boot-config.d.ts.map +1 -0
- package/dist/mcp-server/boot-config.js +17 -0
- package/dist/mcp-server/boot-config.js.map +1 -0
- package/dist/mcp-server/middleware/auth.d.ts +10 -0
- package/dist/mcp-server/middleware/auth.d.ts.map +1 -0
- package/dist/mcp-server/middleware/auth.js +44 -0
- package/dist/mcp-server/middleware/auth.js.map +1 -0
- package/dist/mcp-server/middleware/cors.d.ts +6 -0
- package/dist/mcp-server/middleware/cors.d.ts.map +1 -0
- package/dist/mcp-server/middleware/cors.js +30 -0
- package/dist/mcp-server/middleware/cors.js.map +1 -0
- package/dist/mcp-server/middleware/error-handler.d.ts +11 -0
- package/dist/mcp-server/middleware/error-handler.d.ts.map +1 -0
- package/dist/mcp-server/middleware/error-handler.js +14 -0
- package/dist/mcp-server/middleware/error-handler.js.map +1 -0
- package/dist/mcp-server/server.d.ts +7 -2
- package/dist/mcp-server/server.d.ts.map +1 -1
- package/dist/mcp-server/server.js +185 -105
- package/dist/mcp-server/server.js.map +1 -1
- package/dist/skills/registry-mock.json +109 -109
- package/dist/skills/tests/manifest.spec.js +20 -20
- package/dist/stacks/__tests__/dna-emitter.spec.js +6 -6
- package/dist/stacks/dna-emitter.d.ts.map +1 -1
- package/dist/stacks/dna-emitter.js +70 -79
- package/dist/stacks/dna-emitter.js.map +1 -1
- package/dist/stacks/ruby-rails-8/scaffold.js +15 -15
- package/dist/utils/UpdateApplier.d.ts.map +1 -1
- package/dist/utils/UpdateApplier.js +8 -0
- package/dist/utils/UpdateApplier.js.map +1 -1
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +23 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path-safety.d.ts +22 -0
- package/dist/utils/path-safety.d.ts.map +1 -0
- package/dist/utils/path-safety.js +83 -0
- package/dist/utils/path-safety.js.map +1 -0
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +256 -252
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/stack-bootstrap.js +373 -373
- package/dist/utils/stack-bootstrap.js.map +1 -1
- package/dist/utils/templates.js +394 -394
- package/dist/verification/__tests__/anti-tamper.test.d.ts +2 -0
- package/dist/verification/__tests__/anti-tamper.test.d.ts.map +1 -0
- package/dist/verification/__tests__/anti-tamper.test.js +73 -0
- package/dist/verification/__tests__/anti-tamper.test.js.map +1 -0
- package/dist/verification/__tests__/bench-fixtures.test.d.ts +2 -0
- package/dist/verification/__tests__/bench-fixtures.test.d.ts.map +1 -0
- package/dist/verification/__tests__/bench-fixtures.test.js +35 -0
- package/dist/verification/__tests__/bench-fixtures.test.js.map +1 -0
- package/dist/verification/__tests__/bench-harness.test.d.ts +2 -0
- package/dist/verification/__tests__/bench-harness.test.d.ts.map +1 -0
- package/dist/verification/__tests__/bench-harness.test.js +75 -0
- package/dist/verification/__tests__/bench-harness.test.js.map +1 -0
- package/dist/verification/__tests__/bench-report.test.d.ts +2 -0
- package/dist/verification/__tests__/bench-report.test.d.ts.map +1 -0
- package/dist/verification/__tests__/bench-report.test.js +73 -0
- package/dist/verification/__tests__/bench-report.test.js.map +1 -0
- package/dist/verification/__tests__/best-of-n-runner.test.d.ts +2 -0
- package/dist/verification/__tests__/best-of-n-runner.test.d.ts.map +1 -0
- package/dist/verification/__tests__/best-of-n-runner.test.js +94 -0
- package/dist/verification/__tests__/best-of-n-runner.test.js.map +1 -0
- package/dist/verification/__tests__/config.test.d.ts +2 -0
- package/dist/verification/__tests__/config.test.d.ts.map +1 -0
- package/dist/verification/__tests__/config.test.js +50 -0
- package/dist/verification/__tests__/config.test.js.map +1 -0
- package/dist/verification/__tests__/decay-policy.test.d.ts +2 -0
- package/dist/verification/__tests__/decay-policy.test.d.ts.map +1 -0
- package/dist/verification/__tests__/decay-policy.test.js +130 -0
- package/dist/verification/__tests__/decay-policy.test.js.map +1 -0
- package/dist/verification/__tests__/fail-to-pass.test.d.ts +2 -0
- package/dist/verification/__tests__/fail-to-pass.test.d.ts.map +1 -0
- package/dist/verification/__tests__/fail-to-pass.test.js +107 -0
- package/dist/verification/__tests__/fail-to-pass.test.js.map +1 -0
- package/dist/verification/__tests__/failure-signature.test.d.ts +2 -0
- package/dist/verification/__tests__/failure-signature.test.d.ts.map +1 -0
- package/dist/verification/__tests__/failure-signature.test.js +40 -0
- package/dist/verification/__tests__/failure-signature.test.js.map +1 -0
- package/dist/verification/__tests__/logger.test.d.ts +2 -0
- package/dist/verification/__tests__/logger.test.d.ts.map +1 -0
- package/dist/verification/__tests__/logger.test.js +23 -0
- package/dist/verification/__tests__/logger.test.js.map +1 -0
- package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts +2 -0
- package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts.map +1 -0
- package/dist/verification/__tests__/mutation-cargo-mutants.test.js +96 -0
- package/dist/verification/__tests__/mutation-cargo-mutants.test.js.map +1 -0
- package/dist/verification/__tests__/mutation-infection.test.d.ts +2 -0
- package/dist/verification/__tests__/mutation-infection.test.d.ts.map +1 -0
- package/dist/verification/__tests__/mutation-infection.test.js +101 -0
- package/dist/verification/__tests__/mutation-infection.test.js.map +1 -0
- package/dist/verification/__tests__/mutation-mutmut.test.d.ts +2 -0
- package/dist/verification/__tests__/mutation-mutmut.test.d.ts.map +1 -0
- package/dist/verification/__tests__/mutation-mutmut.test.js +102 -0
- package/dist/verification/__tests__/mutation-mutmut.test.js.map +1 -0
- package/dist/verification/__tests__/mutation-registry.test.d.ts +2 -0
- package/dist/verification/__tests__/mutation-registry.test.d.ts.map +1 -0
- package/dist/verification/__tests__/mutation-registry.test.js +28 -0
- package/dist/verification/__tests__/mutation-registry.test.js.map +1 -0
- package/dist/verification/__tests__/mutation-stryker.test.d.ts +2 -0
- package/dist/verification/__tests__/mutation-stryker.test.d.ts.map +1 -0
- package/dist/verification/__tests__/mutation-stryker.test.js +88 -0
- package/dist/verification/__tests__/mutation-stryker.test.js.map +1 -0
- package/dist/verification/__tests__/no-shell-true.test.d.ts +2 -0
- package/dist/verification/__tests__/no-shell-true.test.d.ts.map +1 -0
- package/dist/verification/__tests__/no-shell-true.test.js +43 -0
- package/dist/verification/__tests__/no-shell-true.test.js.map +1 -0
- package/dist/verification/__tests__/path-safety.test.d.ts +2 -0
- package/dist/verification/__tests__/path-safety.test.d.ts.map +1 -0
- package/dist/verification/__tests__/path-safety.test.js +59 -0
- package/dist/verification/__tests__/path-safety.test.js.map +1 -0
- package/dist/verification/__tests__/prerank.test.d.ts +2 -0
- package/dist/verification/__tests__/prerank.test.d.ts.map +1 -0
- package/dist/verification/__tests__/prerank.test.js +44 -0
- package/dist/verification/__tests__/prerank.test.js.map +1 -0
- package/dist/verification/__tests__/runner.test.d.ts +2 -0
- package/dist/verification/__tests__/runner.test.d.ts.map +1 -0
- package/dist/verification/__tests__/runner.test.js +200 -0
- package/dist/verification/__tests__/runner.test.js.map +1 -0
- package/dist/verification/__tests__/safe-spawn.test.d.ts +2 -0
- package/dist/verification/__tests__/safe-spawn.test.d.ts.map +1 -0
- package/dist/verification/__tests__/safe-spawn.test.js +36 -0
- package/dist/verification/__tests__/safe-spawn.test.js.map +1 -0
- package/dist/verification/__tests__/security.test.d.ts +2 -0
- package/dist/verification/__tests__/security.test.d.ts.map +1 -0
- package/dist/verification/__tests__/security.test.js +79 -0
- package/dist/verification/__tests__/security.test.js.map +1 -0
- package/dist/verification/__tests__/selector-pareto.test.d.ts +2 -0
- package/dist/verification/__tests__/selector-pareto.test.d.ts.map +1 -0
- package/dist/verification/__tests__/selector-pareto.test.js +77 -0
- package/dist/verification/__tests__/selector-pareto.test.js.map +1 -0
- package/dist/verification/__tests__/telemetry.test.d.ts +2 -0
- package/dist/verification/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/verification/__tests__/telemetry.test.js +116 -0
- package/dist/verification/__tests__/telemetry.test.js.map +1 -0
- package/dist/verification/__tests__/type-check.test.d.ts +2 -0
- package/dist/verification/__tests__/type-check.test.d.ts.map +1 -0
- package/dist/verification/__tests__/type-check.test.js +52 -0
- package/dist/verification/__tests__/type-check.test.js.map +1 -0
- package/dist/verification/__tests__/worktree.test.d.ts +2 -0
- package/dist/verification/__tests__/worktree.test.d.ts.map +1 -0
- package/dist/verification/__tests__/worktree.test.js +41 -0
- package/dist/verification/__tests__/worktree.test.js.map +1 -0
- package/dist/verification/bench/fixtures.d.ts +11 -0
- package/dist/verification/bench/fixtures.d.ts.map +1 -0
- package/dist/verification/bench/fixtures.js +66 -0
- package/dist/verification/bench/fixtures.js.map +1 -0
- package/dist/verification/bench/harness.d.ts +19 -0
- package/dist/verification/bench/harness.d.ts.map +1 -0
- package/dist/verification/bench/harness.js +138 -0
- package/dist/verification/bench/harness.js.map +1 -0
- package/dist/verification/bench/report.d.ts +53 -0
- package/dist/verification/bench/report.d.ts.map +1 -0
- package/dist/verification/bench/report.js +47 -0
- package/dist/verification/bench/report.js.map +1 -0
- package/dist/verification/best-of-n/runner.d.ts +29 -0
- package/dist/verification/best-of-n/runner.d.ts.map +1 -0
- package/dist/verification/best-of-n/runner.js +76 -0
- package/dist/verification/best-of-n/runner.js.map +1 -0
- package/dist/verification/best-of-n/selector/pareto.d.ts +10 -0
- package/dist/verification/best-of-n/selector/pareto.d.ts.map +1 -0
- package/dist/verification/best-of-n/selector/pareto.js +65 -0
- package/dist/verification/best-of-n/selector/pareto.js.map +1 -0
- package/dist/verification/best-of-n/selector/prerank.d.ts +23 -0
- package/dist/verification/best-of-n/selector/prerank.d.ts.map +1 -0
- package/dist/verification/best-of-n/selector/prerank.js +32 -0
- package/dist/verification/best-of-n/selector/prerank.js.map +1 -0
- package/dist/verification/best-of-n/worktree.d.ts +9 -0
- package/dist/verification/best-of-n/worktree.d.ts.map +1 -0
- package/dist/verification/best-of-n/worktree.js +100 -0
- package/dist/verification/best-of-n/worktree.js.map +1 -0
- package/dist/verification/config.d.ts +24 -0
- package/dist/verification/config.d.ts.map +1 -0
- package/dist/verification/config.js +168 -0
- package/dist/verification/config.js.map +1 -0
- package/dist/verification/decay/policy.d.ts +16 -0
- package/dist/verification/decay/policy.d.ts.map +1 -0
- package/dist/verification/decay/policy.js +64 -0
- package/dist/verification/decay/policy.js.map +1 -0
- package/dist/verification/decay/signature.d.ts +6 -0
- package/dist/verification/decay/signature.d.ts.map +1 -0
- package/dist/verification/decay/signature.js +18 -0
- package/dist/verification/decay/signature.js.map +1 -0
- package/dist/verification/gates/anti-tamper.d.ts +16 -0
- package/dist/verification/gates/anti-tamper.d.ts.map +1 -0
- package/dist/verification/gates/anti-tamper.js +142 -0
- package/dist/verification/gates/anti-tamper.js.map +1 -0
- package/dist/verification/gates/fail-to-pass.d.ts +39 -0
- package/dist/verification/gates/fail-to-pass.d.ts.map +1 -0
- package/dist/verification/gates/fail-to-pass.js +173 -0
- package/dist/verification/gates/fail-to-pass.js.map +1 -0
- package/dist/verification/gates/mutation/adapter.d.ts +34 -0
- package/dist/verification/gates/mutation/adapter.d.ts.map +1 -0
- package/dist/verification/gates/mutation/adapter.js +22 -0
- package/dist/verification/gates/mutation/adapter.js.map +1 -0
- package/dist/verification/gates/mutation/cargo-mutants.d.ts +28 -0
- package/dist/verification/gates/mutation/cargo-mutants.d.ts.map +1 -0
- package/dist/verification/gates/mutation/cargo-mutants.js +170 -0
- package/dist/verification/gates/mutation/cargo-mutants.js.map +1 -0
- package/dist/verification/gates/mutation/infection.d.ts +28 -0
- package/dist/verification/gates/mutation/infection.d.ts.map +1 -0
- package/dist/verification/gates/mutation/infection.js +149 -0
- package/dist/verification/gates/mutation/infection.js.map +1 -0
- package/dist/verification/gates/mutation/mutmut.d.ts +23 -0
- package/dist/verification/gates/mutation/mutmut.d.ts.map +1 -0
- package/dist/verification/gates/mutation/mutmut.js +148 -0
- package/dist/verification/gates/mutation/mutmut.js.map +1 -0
- package/dist/verification/gates/mutation/stryker.d.ts +19 -0
- package/dist/verification/gates/mutation/stryker.d.ts.map +1 -0
- package/dist/verification/gates/mutation/stryker.js +103 -0
- package/dist/verification/gates/mutation/stryker.js.map +1 -0
- package/dist/verification/gates/type-check.d.ts +11 -0
- package/dist/verification/gates/type-check.d.ts.map +1 -0
- package/dist/verification/gates/type-check.js +84 -0
- package/dist/verification/gates/type-check.js.map +1 -0
- package/dist/verification/registry.d.ts +6 -0
- package/dist/verification/registry.d.ts.map +1 -0
- package/dist/verification/registry.js +49 -0
- package/dist/verification/registry.js.map +1 -0
- package/dist/verification/runner.d.ts +27 -0
- package/dist/verification/runner.d.ts.map +1 -0
- package/dist/verification/runner.js +173 -0
- package/dist/verification/runner.js.map +1 -0
- package/dist/verification/telemetry.d.ts +18 -0
- package/dist/verification/telemetry.d.ts.map +1 -0
- package/dist/verification/telemetry.js +71 -0
- package/dist/verification/telemetry.js.map +1 -0
- package/dist/verification/types.d.ts +89 -0
- package/dist/verification/types.d.ts.map +1 -0
- package/dist/verification/types.js +3 -0
- package/dist/verification/types.js.map +1 -0
- package/package.json +96 -91
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +68 -48
- package/templates/backend/node-nestjs/.env.example +9 -9
- package/templates/backend/node-nestjs/nest-cli.json +8 -8
- package/templates/backend/node-nestjs/package.json +50 -50
- package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
- package/templates/backend/node-nestjs/src/app.module.ts +15 -15
- package/templates/backend/node-nestjs/src/app.service.ts +8 -8
- package/templates/backend/node-nestjs/src/main.ts +24 -24
- package/templates/backend/node-nestjs/tsconfig.json +21 -21
- package/templates/backend/php-laravel/.env.example +22 -22
- package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
- package/templates/backend/php-laravel/composer.json +40 -40
- package/templates/backend/python-fastapi/.env.example +4 -4
- package/templates/backend/python-fastapi/app/api/router.py +8 -8
- package/templates/backend/python-fastapi/app/core/config.py +20 -20
- package/templates/backend/python-fastapi/main.py +35 -35
- package/templates/backend/python-fastapi/requirements.txt +13 -13
- package/templates/backend/rust-axum/.env.example +3 -3
- package/templates/backend/rust-axum/Cargo.toml +23 -23
- package/templates/backend/rust-axum/src/errors.rs +30 -30
- package/templates/backend/rust-axum/src/main.rs +32 -32
- package/templates/backend/rust-axum/src/routes.rs +6 -6
- package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
- package/templates/frontend/leptos-csr/Cargo.toml +16 -16
- package/templates/frontend/leptos-csr/Trunk.toml +10 -10
- package/templates/frontend/leptos-csr/index.html +11 -11
- package/templates/frontend/leptos-csr/src/lib.rs +20 -20
- package/templates/frontend/leptos-csr/style/main.scss +19 -19
- package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
- package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
- package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
- package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
- package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
- package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
- package/templates/frontend/react/index.html +12 -12
- package/templates/frontend/react/package.json +35 -35
- package/templates/frontend/react/src/App.tsx +25 -25
- package/templates/frontend/react/src/main.tsx +9 -9
- package/templates/frontend/vue/package.json +32 -32
- package/templates/frontend/vue/src/App.vue +7 -7
- package/templates/frontend/vue/src/main.ts +10 -10
- package/templates/frontend/vue/src/router/index.ts +14 -14
- package/templates/frontend/vue/src/views/HomeView.vue +6 -6
- package/templates/hooks/pre-commit-dare-validate +24 -24
- package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -152
- package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -0
- package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +368 -368
- package/templates/ide/antigravity/.agents/skills/dare-bootstrap/SKILL.md +32 -32
- package/templates/ide/antigravity/.agents/skills/dare-bugfix-design/SKILL.md +76 -76
- package/templates/ide/antigravity/.agents/skills/dare-dag/SKILL.md +32 -32
- package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -154
- package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -130
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
- package/templates/ide/antigravity/.agents/skills/dare-design/SKILL.md +180 -180
- package/templates/ide/antigravity/.agents/skills/dare-discover/SKILL.md +33 -33
- package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -63
- package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -315
- package/templates/ide/antigravity/.agents/skills/dare-execute/SKILL.md +264 -264
- package/templates/ide/antigravity/.agents/skills/dare-feature-design/SKILL.md +74 -74
- package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -192
- package/templates/ide/antigravity/.agents/skills/dare-graph/SKILL.md +35 -35
- package/templates/ide/antigravity/.agents/skills/dare-info/SKILL.md +31 -31
- package/templates/ide/antigravity/.agents/skills/dare-init/SKILL.md +35 -35
- package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -337
- package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -166
- package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -217
- package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -61
- package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -187
- package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -217
- package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
- package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -108
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
- package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -263
- package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
- package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -274
- package/templates/ide/antigravity/.agents/skills/dare-skill/SKILL.md +35 -35
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
- package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -188
- package/templates/ide/antigravity/.agents/skills/dare-update/SKILL.md +33 -33
- package/templates/ide/antigravity/.agents/skills/dare-validate/SKILL.md +33 -33
- package/templates/ide/antigravity/.agents/skills/dare-welcome/SKILL.md +30 -30
- package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -343
- package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -377
- package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -382
- package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -326
- package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -393
- package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
- package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/antigravity/templates/TASKS-template.md +26 -26
- package/templates/ide/antigravity/templates/TELEMETRY-template.md +125 -125
- package/templates/ide/claude/.claude/commands/dare-ax.md +131 -131
- package/templates/ide/claude/.claude/commands/dare-bench.md +18 -0
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
- package/templates/ide/claude/.claude/commands/dare-bootstrap.md +27 -27
- package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -119
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
- package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -117
- package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
- package/templates/ide/claude/.claude/commands/dare-dag.md +27 -27
- package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
- package/templates/ide/claude/.claude/commands/dare-discover.md +28 -28
- package/templates/ide/claude/.claude/commands/dare-dna.md +75 -75
- package/templates/ide/claude/.claude/commands/dare-docker.md +207 -207
- package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
- package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -147
- package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -149
- package/templates/ide/claude/.claude/commands/dare-graph.md +30 -30
- package/templates/ide/claude/.claude/commands/dare-info.md +26 -26
- package/templates/ide/claude/.claude/commands/dare-init.md +30 -30
- package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -211
- package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -124
- package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -148
- package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -72
- package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -166
- package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -159
- package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
- package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -139
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
- package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
- package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
- package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
- package/templates/ide/claude/.claude/commands/dare-skill.md +30 -30
- package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
- package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -132
- package/templates/ide/claude/.claude/commands/dare-update.md +28 -28
- package/templates/ide/claude/.claude/commands/dare-validate.md +28 -28
- package/templates/ide/claude/.claude/commands/dare-welcome.md +25 -25
- package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -205
- package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -232
- package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -228
- package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -210
- package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -236
- package/templates/ide/claude/.claude/settings.example.json +35 -35
- package/templates/ide/claude/CLAUDE.md +146 -146
- package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/claude/templates/DESIGN-template.md +129 -129
- package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/claude/templates/TASKS-template.md +26 -26
- package/templates/ide/claude/templates/TELEMETRY-template.md +125 -125
- package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -0
- package/templates/ide/cursor/.cursor/commands/dare-blueprint.md +86 -86
- package/templates/ide/cursor/.cursor/commands/dare-bootstrap.md +27 -27
- package/templates/ide/cursor/.cursor/commands/dare-bugfix-design.md +64 -64
- package/templates/ide/cursor/.cursor/commands/dare-dag-run.md +110 -110
- package/templates/ide/cursor/.cursor/commands/dare-dag-viz.md +139 -139
- package/templates/ide/cursor/.cursor/commands/dare-dag.md +27 -27
- package/templates/ide/cursor/.cursor/commands/dare-design.md +35 -35
- package/templates/ide/cursor/.cursor/commands/dare-discover.md +28 -28
- package/templates/ide/cursor/.cursor/commands/dare-dna.md +75 -75
- package/templates/ide/cursor/.cursor/commands/dare-docker-compose.md +18 -18
- package/templates/ide/cursor/.cursor/commands/dare-dockerfile.md +17 -17
- package/templates/ide/cursor/.cursor/commands/dare-execute.md +19 -19
- package/templates/ide/cursor/.cursor/commands/dare-feature-design.md +64 -64
- package/templates/ide/cursor/.cursor/commands/dare-graph.md +30 -30
- package/templates/ide/cursor/.cursor/commands/dare-info.md +26 -26
- package/templates/ide/cursor/.cursor/commands/dare-init.md +30 -30
- package/templates/ide/cursor/.cursor/commands/dare-migrate.md +72 -72
- package/templates/ide/cursor/.cursor/commands/dare-refine.md +107 -107
- package/templates/ide/cursor/.cursor/commands/dare-reverse.md +139 -139
- package/templates/ide/cursor/.cursor/commands/dare-review.md +91 -91
- package/templates/ide/cursor/.cursor/commands/dare-skill.md +30 -30
- package/templates/ide/cursor/.cursor/commands/dare-tasks.md +184 -184
- package/templates/ide/cursor/.cursor/commands/dare-telemetry.md +42 -42
- package/templates/ide/cursor/.cursor/commands/dare-update.md +28 -28
- package/templates/ide/cursor/.cursor/commands/dare-validate.md +28 -28
- package/templates/ide/cursor/.cursor/commands/dare-welcome.md +25 -25
- package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -263
- package/templates/ide/cursor/.cursor/rules/skill-bugfix-design.mdc +51 -51
- package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -173
- package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -134
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
- package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -63
- package/templates/ide/cursor/.cursor/rules/skill-docker.mdc +33 -33
- package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -352
- package/templates/ide/cursor/.cursor/rules/skill-feature-design.mdc +43 -43
- package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -244
- package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -371
- package/templates/ide/cursor/.cursor/rules/skill-laravel-api.mdc +44 -44
- package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -266
- package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -295
- package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -367
- package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -58
- package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -346
- package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -248
- package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -400
- package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -262
- package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -107
- package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -281
- package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
- package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
- package/templates/ide/cursor/.cursor/rules/skill-telemetry.mdc +156 -156
- package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
- package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/cursor/templates/TASKS-template.md +26 -26
- package/templates/ide/cursor/templates/TELEMETRY-template.md +125 -125
- package/templates/shared/docker-compose.yml +41 -41
- package/templates/stacks/go-gin/.dare/skills.yml +11 -11
- package/templates/stacks/go-gin/.env.example +24 -24
- package/templates/stacks/go-gin/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/go-gin/README.md.tpl +38 -38
- package/templates/stacks/go-gin/cmd/server/main.go.tpl +78 -78
- package/templates/stacks/go-gin/db/migrations/0001_create_users.down.sql +2 -2
- package/templates/stacks/go-gin/db/migrations/0001_create_users.up.sql +12 -12
- package/templates/stacks/go-gin/db/queries/users.sql +23 -23
- package/templates/stacks/go-gin/gitignore +7 -7
- package/templates/stacks/go-gin/go.mod.tpl +17 -17
- package/templates/stacks/go-gin/internal/config/config.go +41 -41
- package/templates/stacks/go-gin/internal/db/postgres.go.tpl +25 -25
- package/templates/stacks/go-gin/internal/handler/auth_handler.go.tpl +72 -72
- package/templates/stacks/go-gin/internal/handler/users_handler.go.tpl +72 -72
- package/templates/stacks/go-gin/internal/handler/ws_handler.go +37 -37
- package/templates/stacks/go-gin/internal/llm/dummy.go +14 -14
- package/templates/stacks/go-gin/internal/llm/provider.go +8 -8
- package/templates/stacks/go-gin/internal/middleware/jwt.go.tpl +58 -58
- package/templates/stacks/go-gin/internal/middleware/rate_limit.go +55 -55
- package/templates/stacks/go-gin/internal/model/user.go +17 -17
- package/templates/stacks/go-gin/internal/repository/users_repository.go.tpl +79 -79
- package/templates/stacks/go-gin/internal/service/auth_service.go.tpl +55 -55
- package/templates/stacks/go-gin/internal/service/users_service.go.tpl +53 -53
- package/templates/stacks/go-gin/llms.txt.tpl +54 -54
- package/templates/stacks/go-gin/openapi.json.tpl +46 -46
- package/templates/stacks/go-gin/sqlc.yaml +14 -14
- package/templates/stacks/go-gin/tests/smoke_test.go.tpl +22 -22
- package/templates/stacks/go-stdlib/.dare/skills.yml +11 -11
- package/templates/stacks/go-stdlib/.env.example +24 -24
- package/templates/stacks/go-stdlib/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/go-stdlib/README.md.tpl +41 -41
- package/templates/stacks/go-stdlib/cmd/server/main.go.tpl +82 -82
- package/templates/stacks/go-stdlib/db/migrations/0001_create_users.down.sql +2 -2
- package/templates/stacks/go-stdlib/db/migrations/0001_create_users.up.sql +12 -12
- package/templates/stacks/go-stdlib/db/queries/users.sql +23 -23
- package/templates/stacks/go-stdlib/gitignore +6 -6
- package/templates/stacks/go-stdlib/go.mod.tpl +15 -15
- package/templates/stacks/go-stdlib/internal/config/config.go +41 -41
- package/templates/stacks/go-stdlib/internal/db/postgres.go.tpl +24 -24
- package/templates/stacks/go-stdlib/internal/handler/auth_handler.go.tpl +71 -71
- package/templates/stacks/go-stdlib/internal/handler/users_handler.go.tpl +84 -84
- package/templates/stacks/go-stdlib/internal/handler/ws_handler.go +36 -36
- package/templates/stacks/go-stdlib/internal/httpx/json.go +32 -32
- package/templates/stacks/go-stdlib/internal/llm/dummy.go +14 -14
- package/templates/stacks/go-stdlib/internal/llm/provider.go +8 -8
- package/templates/stacks/go-stdlib/internal/middleware/chain.go +21 -21
- package/templates/stacks/go-stdlib/internal/middleware/cors.go +27 -27
- package/templates/stacks/go-stdlib/internal/middleware/jwt.go.tpl +51 -51
- package/templates/stacks/go-stdlib/internal/middleware/rate_limit.go +81 -81
- package/templates/stacks/go-stdlib/internal/model/user.go +17 -17
- package/templates/stacks/go-stdlib/internal/repository/users_repository.go.tpl +75 -75
- package/templates/stacks/go-stdlib/internal/service/auth_service.go.tpl +55 -55
- package/templates/stacks/go-stdlib/internal/service/users_service.go.tpl +53 -53
- package/templates/stacks/go-stdlib/llms.txt.tpl +60 -60
- package/templates/stacks/go-stdlib/openapi.json.tpl +46 -46
- package/templates/stacks/go-stdlib/sqlc.yaml +14 -14
- package/templates/stacks/go-stdlib/tests/smoke_test.go.tpl +45 -45
- package/templates/stacks/mcp-go/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-go/.env.example +14 -14
- package/templates/stacks/mcp-go/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/mcp-go/README.md.tpl +50 -50
- package/templates/stacks/mcp-go/cmd/server/main.go.tpl +62 -62
- package/templates/stacks/mcp-go/gitignore +6 -6
- package/templates/stacks/mcp-go/go.mod.tpl +9 -9
- package/templates/stacks/mcp-go/internal/prompts/summarize.go +9 -9
- package/templates/stacks/mcp-go/internal/server/server.go.tpl +80 -80
- package/templates/stacks/mcp-go/internal/tools/echo.go +15 -15
- package/templates/stacks/mcp-go/internal/transports/http.go.tpl +21 -21
- package/templates/stacks/mcp-go/internal/transports/sse.go.tpl +17 -17
- package/templates/stacks/mcp-go/internal/transports/stdio.go.tpl +14 -14
- package/templates/stacks/mcp-go/llms.txt.tpl +60 -60
- package/templates/stacks/mcp-go/openapi.json.tpl +31 -31
- package/templates/stacks/mcp-go/tests/echo_test.go.tpl +37 -37
- package/templates/stacks/mcp-node-ts/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-node-ts/.env.example +16 -16
- package/templates/stacks/mcp-node-ts/.github/workflows/dare-ci.yml +54 -54
- package/templates/stacks/mcp-node-ts/README.md.hbs +49 -49
- package/templates/stacks/mcp-node-ts/gitignore +7 -7
- package/templates/stacks/mcp-node-ts/llms.txt.hbs +61 -61
- package/templates/stacks/mcp-node-ts/openapi.json.hbs +39 -39
- package/templates/stacks/mcp-node-ts/package.json.hbs +35 -35
- package/templates/stacks/mcp-node-ts/src/cli.ts.hbs +71 -71
- package/templates/stacks/mcp-node-ts/src/prompts/index.ts +36 -36
- package/templates/stacks/mcp-node-ts/src/server.ts.hbs +45 -45
- package/templates/stacks/mcp-node-ts/src/tools/echo.ts +23 -23
- package/templates/stacks/mcp-node-ts/src/tools/index.ts +18 -18
- package/templates/stacks/mcp-node-ts/src/transports/http.ts +68 -68
- package/templates/stacks/mcp-node-ts/src/transports/sse.ts +58 -58
- package/templates/stacks/mcp-node-ts/src/transports/stdio.ts +5 -5
- package/templates/stacks/mcp-node-ts/tests/echo.test.ts +50 -50
- package/templates/stacks/mcp-node-ts/tsconfig.json +17 -17
- package/templates/stacks/mcp-python/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-python/.env.example +14 -14
- package/templates/stacks/mcp-python/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/mcp-python/README.md.j2 +49 -49
- package/templates/stacks/mcp-python/gitignore +12 -12
- package/templates/stacks/mcp-python/llms.txt.j2 +56 -56
- package/templates/stacks/mcp-python/openapi.json.j2 +33 -33
- package/templates/stacks/mcp-python/pyproject.toml.j2 +37 -37
- package/templates/stacks/mcp-python/src/cli.py.j2 +68 -68
- package/templates/stacks/mcp-python/src/prompts/summarize.py +10 -10
- package/templates/stacks/mcp-python/src/server.py.j2 +28 -28
- package/templates/stacks/mcp-python/src/tools/echo.py +12 -12
- package/templates/stacks/mcp-python/src/transports/http.py +12 -12
- package/templates/stacks/mcp-python/src/transports/sse.py +13 -13
- package/templates/stacks/mcp-python/src/transports/stdio.py +6 -6
- package/templates/stacks/mcp-python/tests/test_echo.py +28 -28
- package/templates/stacks/mcp-rust/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-rust/.env.example +14 -14
- package/templates/stacks/mcp-rust/.github/workflows/dare-ci.yml +38 -38
- package/templates/stacks/mcp-rust/Cargo.toml.tera +35 -35
- package/templates/stacks/mcp-rust/README.md.tera +50 -50
- package/templates/stacks/mcp-rust/gitignore +5 -5
- package/templates/stacks/mcp-rust/llms.txt.tera +60 -60
- package/templates/stacks/mcp-rust/openapi.json.tera +31 -31
- package/templates/stacks/mcp-rust/src/cli.rs.tera +33 -33
- package/templates/stacks/mcp-rust/src/lib.rs +6 -6
- package/templates/stacks/mcp-rust/src/main.rs.tera +30 -30
- package/templates/stacks/mcp-rust/src/prompts/mod.rs +1 -1
- package/templates/stacks/mcp-rust/src/prompts/summarize.rs +5 -5
- package/templates/stacks/mcp-rust/src/server.rs.tera +38 -38
- package/templates/stacks/mcp-rust/src/tools/echo.rs +18 -18
- package/templates/stacks/mcp-rust/src/tools/mod.rs +22 -22
- package/templates/stacks/mcp-rust/src/transports/http.rs +27 -27
- package/templates/stacks/mcp-rust/src/transports/mod.rs +3 -3
- package/templates/stacks/mcp-rust/src/transports/sse.rs +33 -33
- package/templates/stacks/mcp-rust/src/transports/stdio.rs +14 -14
- package/templates/stacks/mcp-rust/tests/echo_test.rs.tera +27 -27
- package/templates/stacks/node-nestjs/.dare/skills.yml +11 -11
- package/templates/stacks/node-nestjs/.env.example +21 -21
- package/templates/stacks/node-nestjs/.github/workflows/dare-ci.yml +54 -54
- package/templates/stacks/node-nestjs/README.md.hbs +35 -35
- package/templates/stacks/node-nestjs/gitignore +7 -7
- package/templates/stacks/node-nestjs/llms.txt.hbs +47 -47
- package/templates/stacks/node-nestjs/nest-cli.json +16 -16
- package/templates/stacks/node-nestjs/openapi.json.hbs +75 -75
- package/templates/stacks/node-nestjs/package.json.hbs +57 -57
- package/templates/stacks/node-nestjs/prisma/schema.prisma +25 -25
- package/templates/stacks/node-nestjs/prisma/seed.ts.hbs +25 -25
- package/templates/stacks/node-nestjs/src/app.module.ts +39 -39
- package/templates/stacks/node-nestjs/src/auth/auth.controller.ts +29 -29
- package/templates/stacks/node-nestjs/src/auth/auth.module.ts +25 -25
- package/templates/stacks/node-nestjs/src/auth/auth.service.ts +36 -36
- package/templates/stacks/node-nestjs/src/auth/dto/login-response.dto.ts +9 -9
- package/templates/stacks/node-nestjs/src/auth/dto/login.dto.ts +17 -17
- package/templates/stacks/node-nestjs/src/auth/jwt.strategy.ts +25 -25
- package/templates/stacks/node-nestjs/src/common/filters/problem-details.filter.ts +38 -38
- package/templates/stacks/node-nestjs/src/common/interceptors/json-response.interceptor.ts +13 -13
- package/templates/stacks/node-nestjs/src/main.ts.hbs +44 -44
- package/templates/stacks/node-nestjs/src/prisma/prisma.module.ts +9 -9
- package/templates/stacks/node-nestjs/src/prisma/prisma.service.ts +9 -9
- package/templates/stacks/node-nestjs/src/users/dto/create-user.dto.ts +22 -22
- package/templates/stacks/node-nestjs/src/users/dto/user.dto.ts +15 -15
- package/templates/stacks/node-nestjs/src/users/users.controller.ts +41 -41
- package/templates/stacks/node-nestjs/src/users/users.module.ts +11 -11
- package/templates/stacks/node-nestjs/src/users/users.repository.ts +38 -38
- package/templates/stacks/node-nestjs/src/users/users.service.ts +38 -38
- package/templates/stacks/node-nestjs/tsconfig.build.json +4 -4
- package/templates/stacks/node-nestjs/tsconfig.json +28 -28
- package/templates/stacks/php-laravel/.dare/skills.yml +11 -11
- package/templates/stacks/php-laravel/.env.example +41 -41
- package/templates/stacks/php-laravel/.github/workflows/dare-ci.yml +43 -43
- package/templates/stacks/php-laravel/README.md.hbs +36 -36
- package/templates/stacks/php-laravel/app/Http/Controllers/Api/AuthController.php +36 -36
- package/templates/stacks/php-laravel/app/Http/Controllers/Api/UsersController.php +33 -33
- package/templates/stacks/php-laravel/app/Http/Requests/CreateUserRequest.php +26 -26
- package/templates/stacks/php-laravel/app/Http/Requests/LoginRequest.php +34 -34
- package/templates/stacks/php-laravel/app/Llm/Contracts/LlmProvider.php +12 -12
- package/templates/stacks/php-laravel/app/Llm/Providers/DummyProvider.php +13 -13
- package/templates/stacks/php-laravel/app/Llm/Providers/OpenAiProvider.php +33 -33
- package/templates/stacks/php-laravel/app/Models/User.php +44 -44
- package/templates/stacks/php-laravel/app/Repositories/UsersRepository.php +32 -32
- package/templates/stacks/php-laravel/app/Services/AuthService.php +37 -37
- package/templates/stacks/php-laravel/app/Services/UsersService.php +57 -57
- package/templates/stacks/php-laravel/artisan +12 -12
- package/templates/stacks/php-laravel/bootstrap/app.php +29 -29
- package/templates/stacks/php-laravel/bootstrap/providers.php +5 -5
- package/templates/stacks/php-laravel/composer.json.hbs +58 -58
- package/templates/stacks/php-laravel/config/l5-swagger.php +41 -41
- package/templates/stacks/php-laravel/config/reverb.php +34 -34
- package/templates/stacks/php-laravel/config/sanctum.php +15 -15
- package/templates/stacks/php-laravel/database/migrations/2026_06_01_000001_create_users_table.php +27 -27
- package/templates/stacks/php-laravel/database/seeders/DatabaseSeeder.php +21 -21
- package/templates/stacks/php-laravel/gitignore +23 -23
- package/templates/stacks/php-laravel/llms.txt.hbs +53 -53
- package/templates/stacks/php-laravel/openapi.json.hbs +43 -43
- package/templates/stacks/php-laravel/phpstan.neon +9 -9
- package/templates/stacks/php-laravel/routes/api.php +13 -13
- package/templates/stacks/php-laravel/routes/channels.php +7 -7
- package/templates/stacks/php-laravel/tests/Feature/AuthTest.php +35 -35
- package/templates/stacks/php-laravel/tests/Feature/UsersTest.php +30 -30
- package/templates/stacks/php-laravel/tests/Pest.php +5 -5
- package/templates/stacks/python-fastapi/.dare/skills.yml +11 -11
- package/templates/stacks/python-fastapi/.env.example +21 -21
- package/templates/stacks/python-fastapi/.github/workflows/dare-ci.yml +43 -43
- package/templates/stacks/python-fastapi/README.md.j2 +35 -35
- package/templates/stacks/python-fastapi/alembic/env.py +46 -46
- package/templates/stacks/python-fastapi/alembic/script.py.mako +26 -26
- package/templates/stacks/python-fastapi/alembic/versions/0001_create_users.py.j2 +37 -37
- package/templates/stacks/python-fastapi/alembic.ini.j2 +39 -39
- package/templates/stacks/python-fastapi/app/core/config.py +24 -24
- package/templates/stacks/python-fastapi/app/core/security.py +34 -34
- package/templates/stacks/python-fastapi/app/db/session.py +22 -22
- package/templates/stacks/python-fastapi/app/main.py.j2 +36 -36
- package/templates/stacks/python-fastapi/app/models/__init__.py +3 -3
- package/templates/stacks/python-fastapi/app/models/user.py +30 -30
- package/templates/stacks/python-fastapi/app/repositories/user_repository.py +34 -34
- package/templates/stacks/python-fastapi/app/routers/auth.py +37 -37
- package/templates/stacks/python-fastapi/app/routers/users.py +46 -46
- package/templates/stacks/python-fastapi/app/schemas/user.py +56 -56
- package/templates/stacks/python-fastapi/app/services/auth_service.py +22 -22
- package/templates/stacks/python-fastapi/app/services/user_service.py +31 -31
- package/templates/stacks/python-fastapi/gitignore +12 -12
- package/templates/stacks/python-fastapi/llms.txt.j2 +53 -53
- package/templates/stacks/python-fastapi/openapi.json.j2 +43 -43
- package/templates/stacks/python-fastapi/pyproject.toml.j2 +45 -45
- package/templates/stacks/python-fastapi/tests/test_auth.py +22 -22
- package/templates/stacks/ruby-rails-8/.dare/skills.yml +50 -50
- package/templates/stacks/ruby-rails-8/.env.example +20 -20
- package/templates/stacks/ruby-rails-8/.github/workflows/dare-ci.yml +112 -112
- package/templates/stacks/ruby-rails-8/Gemfile.erb +61 -61
- package/templates/stacks/ruby-rails-8/app/channels/application_cable/channel.rb +11 -11
- package/templates/stacks/ruby-rails-8/app/channels/application_cable/connection.rb +34 -34
- package/templates/stacks/ruby-rails-8/app/channels/dare_updates_channel.rb +18 -18
- package/templates/stacks/ruby-rails-8/app/channels/user_updates_channel.rb +23 -23
- package/templates/stacks/ruby-rails-8/app/controllers/application_controller.rb +44 -44
- package/templates/stacks/ruby-rails-8/app/controllers/concerns/problem_details.rb +93 -93
- package/templates/stacks/ruby-rails-8/app/handlers/summarize_handler.rb +33 -33
- package/templates/stacks/ruby-rails-8/app/handlers/users_handler.rb +68 -68
- package/templates/stacks/ruby-rails-8/app/llm/cache/llm_cache.rb +44 -44
- package/templates/stacks/ruby-rails-8/app/llm/prompts/prompt_loader.rb +54 -54
- package/templates/stacks/ruby-rails-8/app/llm/prompts/summarize_v1.jinja2 +12 -12
- package/templates/stacks/ruby-rails-8/app/llm/providers/dummy_provider.rb +35 -35
- package/templates/stacks/ruby-rails-8/app/llm/providers/llm_provider.rb +67 -67
- package/templates/stacks/ruby-rails-8/app/llm/providers/openai_provider.rb +62 -62
- package/templates/stacks/ruby-rails-8/app/llm/rate_limit/token_bucket.rb +82 -82
- package/templates/stacks/ruby-rails-8/app/llm/validators/summarize_output_schema.json +21 -21
- package/templates/stacks/ruby-rails-8/app/llm/validators/validator.rb +52 -52
- package/templates/stacks/ruby-rails-8/app/models/user.rb +36 -36
- package/templates/stacks/ruby-rails-8/app/presenters/user_presenter.rb +48 -48
- package/templates/stacks/ruby-rails-8/app/repositories/document_repository.rb +57 -57
- package/templates/stacks/ruby-rails-8/app/repositories/user_repository.rb +73 -73
- package/templates/stacks/ruby-rails-8/app/services/create_user_service.rb +67 -67
- package/templates/stacks/ruby-rails-8/app/services/realtime_service.rb +53 -53
- package/templates/stacks/ruby-rails-8/app/services/summarize_document_service.rb +57 -57
- package/templates/stacks/ruby-rails-8/config/dare.yml +42 -42
- package/templates/stacks/ruby-rails-8/config/initializers/dare.rb +31 -31
- package/templates/stacks/ruby-rails-8/config/initializers/rack_attack.rb +64 -64
- package/templates/stacks/ruby-rails-8/config/initializers/rswag_api.rb +12 -12
- package/templates/stacks/ruby-rails-8/lib/tasks/dare.rake +159 -159
- package/templates/stacks/ruby-rails-8/llms.txt.erb +69 -69
- package/templates/stacks/ruby-rails-8/spec/api/summarize_spec.rb +56 -56
- package/templates/stacks/ruby-rails-8/spec/api/users_spec.rb +72 -72
- package/templates/stacks/ruby-rails-8/spec/channels/dare_updates_channel_spec.rb +61 -61
- package/templates/stacks/ruby-rails-8/spec/channels/user_updates_channel_spec.rb +56 -56
- package/templates/stacks/ruby-rails-8/spec/factories/users.rb +27 -27
- package/templates/stacks/ruby-rails-8/spec/handlers/users_handler_spec.rb +88 -88
- package/templates/stacks/ruby-rails-8/spec/rails_helper.rb +31 -31
- package/templates/stacks/ruby-rails-8/spec/services/create_user_service_spec.rb +88 -88
- package/templates/stacks/ruby-rails-8/spec/services/summarize_document_service_spec.rb +142 -142
- package/templates/stacks/ruby-rails-8/spec/swagger_helper.rb +73 -73
- package/templates/stacks/rust-axum/.dare/skills.yml +11 -11
- package/templates/stacks/rust-axum/.env.example +26 -26
- package/templates/stacks/rust-axum/.github/workflows/dare-ci.yml +40 -40
- package/templates/stacks/rust-axum/Cargo.toml.tera +53 -53
- package/templates/stacks/rust-axum/README.md.tera +37 -37
- package/templates/stacks/rust-axum/gitignore +5 -5
- package/templates/stacks/rust-axum/llms.txt.tera +54 -54
- package/templates/stacks/rust-axum/migrations/0001_create_users.sql +13 -13
- package/templates/stacks/rust-axum/openapi.json.tera +46 -46
- package/templates/stacks/rust-axum/src/config.rs +45 -45
- package/templates/stacks/rust-axum/src/errors.rs +48 -48
- package/templates/stacks/rust-axum/src/handlers/auth.rs +48 -48
- package/templates/stacks/rust-axum/src/handlers/mod.rs +3 -3
- package/templates/stacks/rust-axum/src/handlers/users.rs +81 -81
- package/templates/stacks/rust-axum/src/handlers/ws.rs +24 -24
- package/templates/stacks/rust-axum/src/lib.rs +19 -19
- package/templates/stacks/rust-axum/src/llm/mod.rs +1 -1
- package/templates/stacks/rust-axum/src/llm/provider.rs +48 -48
- package/templates/stacks/rust-axum/src/main.rs.tera +64 -64
- package/templates/stacks/rust-axum/src/middleware/auth.rs +20 -20
- package/templates/stacks/rust-axum/src/middleware/mod.rs +2 -2
- package/templates/stacks/rust-axum/src/middleware/rate_limit.rs +27 -27
- package/templates/stacks/rust-axum/src/models/mod.rs +1 -1
- package/templates/stacks/rust-axum/src/models/user.rs +13 -13
- package/templates/stacks/rust-axum/src/repositories/mod.rs +1 -1
- package/templates/stacks/rust-axum/src/repositories/user_repository.rs +62 -62
- package/templates/stacks/rust-axum/src/services/auth_service.rs +50 -50
- package/templates/stacks/rust-axum/src/services/mod.rs +2 -2
- package/templates/stacks/rust-axum/src/services/user_service.rs +53 -53
- package/templates/stacks/rust-axum/tests/integration_test.rs.tera +13 -13
- package/dist/commands/new.d.ts +0 -16
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -104
- package/dist/commands/new.js.map +0 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { safeSpawn } from '../../exec/safe-spawn.js';
|
|
5
|
+
import { assertRelativeSafe } from '../../utils/path-safety.js';
|
|
6
|
+
import { testCommandFor } from '../gates/fail-to-pass.js';
|
|
7
|
+
import { loadSuite } from './fixtures.js';
|
|
8
|
+
import { computeFixtureResult, } from './report.js';
|
|
9
|
+
function parseVitestJson(stdout) {
|
|
10
|
+
const passed = [];
|
|
11
|
+
const failed = [];
|
|
12
|
+
try {
|
|
13
|
+
const report = JSON.parse(stdout);
|
|
14
|
+
for (const fileResult of report.testResults ?? []) {
|
|
15
|
+
for (const assertion of fileResult.assertionResults ?? []) {
|
|
16
|
+
const name = assertion.fullName ?? 'unknown';
|
|
17
|
+
if (assertion.status === 'passed')
|
|
18
|
+
passed.push(name);
|
|
19
|
+
else if (assertion.status === 'failed')
|
|
20
|
+
failed.push(name);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// unstructured output
|
|
26
|
+
}
|
|
27
|
+
return { passed, failed };
|
|
28
|
+
}
|
|
29
|
+
async function defaultRunTestSuite(cwd, stack) {
|
|
30
|
+
const { command, args } = testCommandFor(stack, '**/*.{spec,test}.{ts,tsx,js}');
|
|
31
|
+
const result = await safeSpawn(command, args, {
|
|
32
|
+
cwd,
|
|
33
|
+
timeoutSeconds: 300,
|
|
34
|
+
maxChars: 200000,
|
|
35
|
+
});
|
|
36
|
+
return parseVitestJson(result.stdout);
|
|
37
|
+
}
|
|
38
|
+
function normalizePatch(content) {
|
|
39
|
+
return content
|
|
40
|
+
.replace(/^--- a\/repo\//gm, '--- a/')
|
|
41
|
+
.replace(/^\+\+\+ b\/repo\//gm, '+++ b/')
|
|
42
|
+
.replace(/^diff --git a\/repo\//gm, 'diff --git a/');
|
|
43
|
+
}
|
|
44
|
+
async function defaultApplyPatch(cwd, patchPath) {
|
|
45
|
+
const raw = await fs.readFile(patchPath, 'utf8');
|
|
46
|
+
const normalized = normalizePatch(raw);
|
|
47
|
+
const tmpPatch = path.join(cwd, '.dare-patch.tmp');
|
|
48
|
+
await fs.writeFile(tmpPatch, normalized);
|
|
49
|
+
const result = await safeSpawn('git', ['apply', '--whitespace=nowarn', tmpPatch], {
|
|
50
|
+
cwd,
|
|
51
|
+
timeoutSeconds: 60,
|
|
52
|
+
maxChars: 8000,
|
|
53
|
+
});
|
|
54
|
+
await fs.remove(tmpPatch).catch(() => undefined);
|
|
55
|
+
if (result.code !== 0) {
|
|
56
|
+
throw new Error(`patch apply failed: ${result.stderr.trim()}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function readTestList(fixtureDir, file) {
|
|
60
|
+
const content = await fs.readFile(path.join(fixtureDir, file), 'utf8');
|
|
61
|
+
return content
|
|
62
|
+
.split('\n')
|
|
63
|
+
.map((l) => l.trim())
|
|
64
|
+
.filter(Boolean);
|
|
65
|
+
}
|
|
66
|
+
function countListedTests(listed, passed) {
|
|
67
|
+
let passCount = 0;
|
|
68
|
+
for (const name of listed) {
|
|
69
|
+
if (passed.some((p) => p.includes(name) || name.includes(p)))
|
|
70
|
+
passCount++;
|
|
71
|
+
}
|
|
72
|
+
return { passed: passCount, total: listed.length };
|
|
73
|
+
}
|
|
74
|
+
const defaultDeps = {
|
|
75
|
+
runTestSuite: defaultRunTestSuite,
|
|
76
|
+
copyRepo: async (src, dest) => fs.copy(src, dest),
|
|
77
|
+
applyPatch: defaultApplyPatch,
|
|
78
|
+
};
|
|
79
|
+
export function createRunFixture(deps = {}) {
|
|
80
|
+
const d = { ...defaultDeps, ...deps };
|
|
81
|
+
return async function runFixture(meta, baseDir) {
|
|
82
|
+
assertRelativeSafe(meta.id);
|
|
83
|
+
const fixtureDir = path.join(baseDir, meta.id);
|
|
84
|
+
const repoSrc = path.join(fixtureDir, 'repo');
|
|
85
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'dare-bench-'));
|
|
86
|
+
const started = Date.now();
|
|
87
|
+
try {
|
|
88
|
+
await d.copyRepo(repoSrc, tmpDir);
|
|
89
|
+
await safeSpawn('git', ['init'], { cwd: tmpDir, timeoutSeconds: 30 });
|
|
90
|
+
await safeSpawn('git', ['add', '.'], { cwd: tmpDir, timeoutSeconds: 30 });
|
|
91
|
+
await safeSpawn('git', ['commit', '-m', 'baseline'], {
|
|
92
|
+
cwd: tmpDir,
|
|
93
|
+
timeoutSeconds: 30,
|
|
94
|
+
env: {
|
|
95
|
+
...process.env,
|
|
96
|
+
GIT_AUTHOR_NAME: 'dare-bench',
|
|
97
|
+
GIT_AUTHOR_EMAIL: 'bench@dare.local',
|
|
98
|
+
GIT_COMMITTER_NAME: 'dare-bench',
|
|
99
|
+
GIT_COMMITTER_EMAIL: 'bench@dare.local',
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
await d.applyPatch(tmpDir, path.join(fixtureDir, meta.patch));
|
|
103
|
+
const run = await d.runTestSuite(tmpDir, meta.stack);
|
|
104
|
+
const f2pList = await readTestList(fixtureDir, meta.failToPass);
|
|
105
|
+
const p2pList = await readTestList(fixtureDir, meta.passToPass);
|
|
106
|
+
const raw = {
|
|
107
|
+
id: meta.id,
|
|
108
|
+
stack: meta.stack,
|
|
109
|
+
failToPass: countListedTests(f2pList, run.passed),
|
|
110
|
+
passToPass: countListedTests(p2pList, run.passed),
|
|
111
|
+
durationMs: Date.now() - started,
|
|
112
|
+
};
|
|
113
|
+
return computeFixtureResult(raw);
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await fs.remove(tmpDir).catch(() => undefined);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export const runFixture = createRunFixture();
|
|
121
|
+
function matchesFilter(id, filter) {
|
|
122
|
+
if (!filter)
|
|
123
|
+
return true;
|
|
124
|
+
const re = new RegExp('^' + filter.replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
|
|
125
|
+
return re.test(id);
|
|
126
|
+
}
|
|
127
|
+
export async function runSuite(suiteDir, opts = {}) {
|
|
128
|
+
const fixtures = await loadSuite(suiteDir);
|
|
129
|
+
const runOne = createRunFixture(opts.deps);
|
|
130
|
+
const results = [];
|
|
131
|
+
for (const meta of fixtures) {
|
|
132
|
+
if (!matchesFilter(meta.id, opts.filter))
|
|
133
|
+
continue;
|
|
134
|
+
results.push(await runOne(meta, suiteDir));
|
|
135
|
+
}
|
|
136
|
+
return results;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../src/verification/bench/harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface FixtureResult {
|
|
2
|
+
readonly id: string;
|
|
3
|
+
readonly stack: string;
|
|
4
|
+
readonly fixRate: number;
|
|
5
|
+
readonly passToPassRegressed: boolean;
|
|
6
|
+
readonly solved: boolean;
|
|
7
|
+
readonly failToPass: {
|
|
8
|
+
readonly passed: number;
|
|
9
|
+
readonly total: number;
|
|
10
|
+
};
|
|
11
|
+
readonly passToPass: {
|
|
12
|
+
readonly passed: number;
|
|
13
|
+
readonly total: number;
|
|
14
|
+
};
|
|
15
|
+
readonly durationMs: number;
|
|
16
|
+
}
|
|
17
|
+
export interface BenchReport {
|
|
18
|
+
readonly schemaVersion: 1;
|
|
19
|
+
readonly ranAt: string;
|
|
20
|
+
readonly suite: string;
|
|
21
|
+
readonly totals: {
|
|
22
|
+
readonly fixtures: number;
|
|
23
|
+
readonly solved: number;
|
|
24
|
+
readonly solveRate: number;
|
|
25
|
+
};
|
|
26
|
+
readonly results: ReadonlyArray<FixtureResult>;
|
|
27
|
+
readonly regression?: {
|
|
28
|
+
readonly baselineSolveRate: number;
|
|
29
|
+
readonly deltaPp: number;
|
|
30
|
+
readonly failed: boolean;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export interface RawFixtureCounts {
|
|
34
|
+
readonly id: string;
|
|
35
|
+
readonly stack: string;
|
|
36
|
+
readonly failToPass: {
|
|
37
|
+
readonly passed: number;
|
|
38
|
+
readonly total: number;
|
|
39
|
+
};
|
|
40
|
+
readonly passToPass: {
|
|
41
|
+
readonly passed: number;
|
|
42
|
+
readonly total: number;
|
|
43
|
+
};
|
|
44
|
+
readonly durationMs: number;
|
|
45
|
+
}
|
|
46
|
+
export declare function computeFixtureResult(raw: RawFixtureCounts): FixtureResult;
|
|
47
|
+
export declare function buildReport(results: ReadonlyArray<FixtureResult>, opts: {
|
|
48
|
+
readonly suite: string;
|
|
49
|
+
readonly baseline?: BenchReport;
|
|
50
|
+
readonly failOnRegressionPp?: number;
|
|
51
|
+
readonly ranAt?: string;
|
|
52
|
+
}): BenchReport;
|
|
53
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/verification/bench/report.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,CAmBzE;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,EACrC,IAAI,EAAE;IACJ,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,GACA,WAAW,CA4Bb"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export function computeFixtureResult(raw) {
|
|
2
|
+
const passToPassRegressed = raw.passToPass.passed < raw.passToPass.total;
|
|
3
|
+
const fixRate = passToPassRegressed
|
|
4
|
+
? 0
|
|
5
|
+
: raw.failToPass.total === 0
|
|
6
|
+
? 1
|
|
7
|
+
: raw.failToPass.passed / raw.failToPass.total;
|
|
8
|
+
const solved = fixRate === 1 && !passToPassRegressed;
|
|
9
|
+
return {
|
|
10
|
+
id: raw.id,
|
|
11
|
+
stack: raw.stack,
|
|
12
|
+
fixRate,
|
|
13
|
+
passToPassRegressed,
|
|
14
|
+
solved,
|
|
15
|
+
failToPass: raw.failToPass,
|
|
16
|
+
passToPass: raw.passToPass,
|
|
17
|
+
durationMs: raw.durationMs,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function buildReport(results, opts) {
|
|
21
|
+
const solved = results.filter((r) => r.solved).length;
|
|
22
|
+
const solveRate = results.length === 0 ? 0 : solved / results.length;
|
|
23
|
+
const regression = opts.baseline
|
|
24
|
+
? (() => {
|
|
25
|
+
const deltaPp = (solveRate - opts.baseline.totals.solveRate) * 100;
|
|
26
|
+
const threshold = opts.failOnRegressionPp ?? 3;
|
|
27
|
+
return {
|
|
28
|
+
baselineSolveRate: opts.baseline.totals.solveRate,
|
|
29
|
+
deltaPp,
|
|
30
|
+
failed: -deltaPp > threshold,
|
|
31
|
+
};
|
|
32
|
+
})()
|
|
33
|
+
: undefined;
|
|
34
|
+
return {
|
|
35
|
+
schemaVersion: 1,
|
|
36
|
+
ranAt: opts.ranAt ?? new Date().toISOString(),
|
|
37
|
+
suite: opts.suite,
|
|
38
|
+
totals: {
|
|
39
|
+
fixtures: results.length,
|
|
40
|
+
solved,
|
|
41
|
+
solveRate,
|
|
42
|
+
},
|
|
43
|
+
results: [...results],
|
|
44
|
+
regression,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/verification/bench/report.ts"],"names":[],"mappings":"AAoCA,MAAM,UAAU,oBAAoB,CAAC,GAAqB;IACxD,MAAM,mBAAmB,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;IACzE,MAAM,OAAO,GAAG,mBAAmB;QACjC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;IAErD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO;QACP,mBAAmB;QACnB,MAAM;QACN,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAqC,EACrC,IAKC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAErE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ;QAC9B,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,MAAM,OAAO,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,QAAS,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;YACpE,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;YAC/C,OAAO;gBACL,iBAAiB,EAAE,IAAI,CAAC,QAAS,CAAC,MAAM,CAAC,SAAS;gBAClD,OAAO;gBACP,MAAM,EAAE,CAAC,OAAO,GAAG,SAAS;aAC7B,CAAC;QACJ,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC7C,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE;YACN,QAAQ,EAAE,OAAO,CAAC,MAAM;YACxB,MAAM;YACN,SAAS;SACV;QACD,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;QACrB,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Candidate, VerificationConfig } from '../types.js';
|
|
2
|
+
import { runVerification as defaultRunVerification } from '../runner.js';
|
|
3
|
+
import { gitChangedFiles } from '../../commands/execute-verification.js';
|
|
4
|
+
import { createWorktree as defaultCreateWorktree, removeWorktree as defaultRemoveWorktree, type Worktree } from './worktree.js';
|
|
5
|
+
export interface RunBestOfNArgs {
|
|
6
|
+
readonly taskId: string;
|
|
7
|
+
readonly repoRoot: string;
|
|
8
|
+
readonly n: number;
|
|
9
|
+
readonly stack: string;
|
|
10
|
+
readonly config: VerificationConfig;
|
|
11
|
+
readonly fillCandidate: (wt: Worktree) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export interface RunBestOfNDeps {
|
|
14
|
+
readonly runVerification: typeof defaultRunVerification;
|
|
15
|
+
readonly createWorktree: typeof defaultCreateWorktree;
|
|
16
|
+
readonly removeWorktree: typeof defaultRemoveWorktree;
|
|
17
|
+
readonly gitChangedFiles: typeof gitChangedFiles;
|
|
18
|
+
readonly promoteWinner: (repoRoot: string, winner: Worktree) => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export declare function promoteWinnerPatch(repoRoot: string, winner: Worktree): Promise<void>;
|
|
21
|
+
export declare function createRunBestOfN(deps?: Partial<RunBestOfNDeps>): (args: RunBestOfNArgs) => Promise<{
|
|
22
|
+
winner: Candidate;
|
|
23
|
+
discarded: ReadonlyArray<Candidate>;
|
|
24
|
+
}>;
|
|
25
|
+
export declare const runBestOfN: (args: RunBestOfNArgs) => Promise<{
|
|
26
|
+
winner: Candidate;
|
|
27
|
+
discarded: ReadonlyArray<Candidate>;
|
|
28
|
+
}>;
|
|
29
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/verification/best-of-n/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAEL,eAAe,IAAI,sBAAsB,EAC1C,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAGzE,OAAO,EACL,cAAc,IAAI,qBAAqB,EACvC,cAAc,IAAI,qBAAqB,EACvC,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AAKvB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,eAAe,EAAE,OAAO,sBAAsB,CAAC;IACxD,QAAQ,CAAC,cAAc,EAAE,OAAO,qBAAqB,CAAC;IACtD,QAAQ,CAAC,cAAc,EAAE,OAAO,qBAAqB,CAAC;IACtD,QAAQ,CAAC,eAAe,EAAE,OAAO,eAAe,CAAC;IACjD,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,IAAI,CAAC,CAoBf;AAUD,wBAAgB,gBAAgB,CAC9B,IAAI,GAAE,OAAO,CAAC,cAAc,CAAM,GACjC,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACrC,CAAC,CA8CD;AAED,eAAO,MAAM,UAAU,SAnDb,cAAc,KAAK,OAAO,CAAC;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACrC,CAgD2C,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { runVerification as defaultRunVerification, } from '../runner.js';
|
|
4
|
+
import { gitChangedFiles } from '../../commands/execute-verification.js';
|
|
5
|
+
import { safeSpawn } from '../../exec/safe-spawn.js';
|
|
6
|
+
import { createLogger } from '../../utils/logger.js';
|
|
7
|
+
import { createWorktree as defaultCreateWorktree, removeWorktree as defaultRemoveWorktree, } from './worktree.js';
|
|
8
|
+
import { selectByPareto } from './selector/pareto.js';
|
|
9
|
+
const log = createLogger('best-of-n');
|
|
10
|
+
export async function promoteWinnerPatch(repoRoot, winner) {
|
|
11
|
+
const diff = await safeSpawn('git', ['diff', 'HEAD', winner.branch], {
|
|
12
|
+
cwd: repoRoot,
|
|
13
|
+
timeoutSeconds: 120,
|
|
14
|
+
maxChars: 500000,
|
|
15
|
+
});
|
|
16
|
+
if (!diff.stdout.trim())
|
|
17
|
+
return;
|
|
18
|
+
const patchPath = path.join(repoRoot, '.dare', 'winner.patch');
|
|
19
|
+
await fs.ensureDir(path.dirname(patchPath));
|
|
20
|
+
await fs.writeFile(patchPath, diff.stdout);
|
|
21
|
+
const apply = await safeSpawn('git', ['apply', patchPath], {
|
|
22
|
+
cwd: repoRoot,
|
|
23
|
+
timeoutSeconds: 120,
|
|
24
|
+
maxChars: 8000,
|
|
25
|
+
});
|
|
26
|
+
if (apply.code !== 0) {
|
|
27
|
+
throw new Error(`git apply failed: ${apply.stderr.trim()}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const defaultDeps = {
|
|
31
|
+
runVerification: defaultRunVerification,
|
|
32
|
+
createWorktree: defaultCreateWorktree,
|
|
33
|
+
removeWorktree: defaultRemoveWorktree,
|
|
34
|
+
gitChangedFiles,
|
|
35
|
+
promoteWinner: promoteWinnerPatch,
|
|
36
|
+
};
|
|
37
|
+
export function createRunBestOfN(deps = {}) {
|
|
38
|
+
const d = { ...defaultDeps, ...deps };
|
|
39
|
+
return async function runBestOfN(args) {
|
|
40
|
+
const worktrees = [];
|
|
41
|
+
const candidates = [];
|
|
42
|
+
const verifyConfig = { ...args.config, enabled: true };
|
|
43
|
+
try {
|
|
44
|
+
for (let i = 1; i <= args.n; i++) {
|
|
45
|
+
const id = `cand-${i}`;
|
|
46
|
+
const wt = await d.createWorktree(args.repoRoot, id);
|
|
47
|
+
worktrees.push(wt);
|
|
48
|
+
log.info({ id, path: wt.path }, 'worktree created');
|
|
49
|
+
await args.fillCandidate(wt);
|
|
50
|
+
const wtCwd = path.resolve(args.repoRoot, wt.path);
|
|
51
|
+
const changedFiles = await d.gitChangedFiles(wtCwd);
|
|
52
|
+
const verification = await d.runVerification({
|
|
53
|
+
taskId: args.taskId,
|
|
54
|
+
stack: args.stack,
|
|
55
|
+
cwd: wtCwd,
|
|
56
|
+
config: verifyConfig,
|
|
57
|
+
changedFiles,
|
|
58
|
+
});
|
|
59
|
+
candidates.push({ id, worktree: wt, verification });
|
|
60
|
+
}
|
|
61
|
+
const winner = selectByPareto(candidates);
|
|
62
|
+
await d.promoteWinner(args.repoRoot, winner.worktree);
|
|
63
|
+
const discarded = candidates.filter((c) => c.id !== winner.id);
|
|
64
|
+
return { winner, discarded };
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
for (const wt of worktrees) {
|
|
68
|
+
await d.removeWorktree(args.repoRoot, wt).catch((err) => {
|
|
69
|
+
log.warn({ id: wt.id, err: err instanceof Error ? err.message : String(err) }, 'worktree cleanup failed');
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export const runBestOfN = createRunBestOfN();
|
|
76
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/verification/best-of-n/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Candidate } from '../../types.js';
|
|
2
|
+
export declare class NoViableCandidateError extends Error {
|
|
3
|
+
constructor(message?: string);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Pareto-dominant candidate over test/lint/type/mutation aspects.
|
|
7
|
+
* Candidates with any FAIL aspect are discarded first.
|
|
8
|
+
*/
|
|
9
|
+
export declare function selectByPareto(candidates: ReadonlyArray<Candidate>): Candidate;
|
|
10
|
+
//# sourceMappingURL=pareto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pareto.d.ts","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/pareto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAK5E,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,SAA8D;CAIlF;AA6CD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,SAAS,CAuB9E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const PARETO_ASPECTS = ['test', 'lint', 'type', 'mutation'];
|
|
2
|
+
export class NoViableCandidateError extends Error {
|
|
3
|
+
constructor(message = 'no viable candidate: all candidates have a failing aspect') {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'NoViableCandidateError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
function hasFailingAspect(result) {
|
|
9
|
+
return result.aspects.some((a) => a.verdict === 'FAIL');
|
|
10
|
+
}
|
|
11
|
+
function aspectValue(result, aspect) {
|
|
12
|
+
if (aspect === 'mutation') {
|
|
13
|
+
const mut = result.aspects.find((a) => a.aspect === 'mutation');
|
|
14
|
+
return result.mutationScore ?? mut?.score ?? 0;
|
|
15
|
+
}
|
|
16
|
+
const row = result.aspects.find((a) => a.aspect === aspect);
|
|
17
|
+
if (!row || row.verdict === 'SKIP')
|
|
18
|
+
return 0.5;
|
|
19
|
+
if (row.verdict === 'PASS')
|
|
20
|
+
return 1;
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
function aspectVector(result) {
|
|
24
|
+
return {
|
|
25
|
+
test: aspectValue(result, 'test'),
|
|
26
|
+
lint: aspectValue(result, 'lint'),
|
|
27
|
+
type: aspectValue(result, 'type'),
|
|
28
|
+
mutation: aspectValue(result, 'mutation'),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function dominates(a, b) {
|
|
32
|
+
let strictlyBetter = false;
|
|
33
|
+
for (const key of PARETO_ASPECTS) {
|
|
34
|
+
if (a[key] < b[key])
|
|
35
|
+
return false;
|
|
36
|
+
if (a[key] > b[key])
|
|
37
|
+
strictlyBetter = true;
|
|
38
|
+
}
|
|
39
|
+
return strictlyBetter;
|
|
40
|
+
}
|
|
41
|
+
function compareCandidates(a, b) {
|
|
42
|
+
const scoreA = a.verification.mutationScore ?? 0;
|
|
43
|
+
const scoreB = b.verification.mutationScore ?? 0;
|
|
44
|
+
if (scoreB !== scoreA)
|
|
45
|
+
return scoreB - scoreA;
|
|
46
|
+
return a.id.localeCompare(b.id);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Pareto-dominant candidate over test/lint/type/mutation aspects.
|
|
50
|
+
* Candidates with any FAIL aspect are discarded first.
|
|
51
|
+
*/
|
|
52
|
+
export function selectByPareto(candidates) {
|
|
53
|
+
const viable = candidates.filter((c) => !hasFailingAspect(c.verification));
|
|
54
|
+
if (viable.length === 0) {
|
|
55
|
+
throw new NoViableCandidateError();
|
|
56
|
+
}
|
|
57
|
+
const scored = viable.map((candidate) => ({
|
|
58
|
+
candidate,
|
|
59
|
+
vector: aspectVector(candidate.verification),
|
|
60
|
+
}));
|
|
61
|
+
const nonDominated = scored.filter(({ vector }, index) => !scored.some((other, otherIndex) => index !== otherIndex && dominates(other.vector, vector)));
|
|
62
|
+
const pool = nonDominated.length > 0 ? nonDominated.map((s) => s.candidate) : viable;
|
|
63
|
+
return [...pool].sort(compareCandidates)[0];
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=pareto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pareto.js","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/pareto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exec-free candidate ordering (RF-09). RS-07: prerank NEVER authorizes DONE/PASS —
|
|
3
|
+
* it only produces scores in [0, 1] for reordering before verification.
|
|
4
|
+
*/
|
|
5
|
+
export interface PrerankInput {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly diff: string;
|
|
8
|
+
}
|
|
9
|
+
export interface PrerankScore {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly score: number;
|
|
12
|
+
}
|
|
13
|
+
/** Documented invariant for security tests (RS-07). */
|
|
14
|
+
export declare const PRERANK_NEVER_AUTHORIZES_DONE: true;
|
|
15
|
+
/**
|
|
16
|
+
* Deterministic heuristic: prefer smaller diffs, fewer hunks, and test-file touches.
|
|
17
|
+
*/
|
|
18
|
+
export declare function prerank(inputs: ReadonlyArray<PrerankInput>): PrerankScore[];
|
|
19
|
+
/** Reorder items by prerank scores (descending). Does not mutate verification verdicts. */
|
|
20
|
+
export declare function reorderByPrerank<T extends {
|
|
21
|
+
id: string;
|
|
22
|
+
}>(items: ReadonlyArray<T>, scores: ReadonlyArray<PrerankScore>): T[];
|
|
23
|
+
//# sourceMappingURL=prerank.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerank.d.ts","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/prerank.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,uDAAuD;AACvD,eAAO,MAAM,6BAA6B,EAAG,IAAa,CAAC;AAM3D;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,EAAE,CAe3E;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACvD,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAClC,CAAC,EAAE,CAKL"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exec-free candidate ordering (RF-09). RS-07: prerank NEVER authorizes DONE/PASS —
|
|
3
|
+
* it only produces scores in [0, 1] for reordering before verification.
|
|
4
|
+
*/
|
|
5
|
+
/** Documented invariant for security tests (RS-07). */
|
|
6
|
+
export const PRERANK_NEVER_AUTHORIZES_DONE = true;
|
|
7
|
+
function clamp01(n) {
|
|
8
|
+
return Math.max(0, Math.min(1, n));
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Deterministic heuristic: prefer smaller diffs, fewer hunks, and test-file touches.
|
|
12
|
+
*/
|
|
13
|
+
export function prerank(inputs) {
|
|
14
|
+
return inputs.map(({ id, diff }) => {
|
|
15
|
+
const changedLines = diff
|
|
16
|
+
.split('\n')
|
|
17
|
+
.filter((l) => l.startsWith('+') || l.startsWith('-')).length;
|
|
18
|
+
const hunks = (diff.match(/^@@/gm) ?? []).length;
|
|
19
|
+
const testTouches = (diff.match(/\.(spec|test)\./gi) ?? []).length;
|
|
20
|
+
const sizePenalty = Math.min(1, changedLines / 200);
|
|
21
|
+
const hunkPenalty = Math.min(1, hunks / 20);
|
|
22
|
+
const testBonus = Math.min(0.3, testTouches * 0.1);
|
|
23
|
+
const score = clamp01(1 - sizePenalty * 0.5 - hunkPenalty * 0.2 + testBonus);
|
|
24
|
+
return { id, score };
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Reorder items by prerank scores (descending). Does not mutate verification verdicts. */
|
|
28
|
+
export function reorderByPrerank(items, scores) {
|
|
29
|
+
const scoreMap = new Map(scores.map((s) => [s.id, s.score]));
|
|
30
|
+
return [...items].sort((a, b) => (scoreMap.get(b.id) ?? 0) - (scoreMap.get(a.id) ?? 0));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=prerank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerank.js","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/prerank.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,uDAAuD;AACvD,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAa,CAAC;AAE3D,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAmC;IACzD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjC,MAAM,YAAY,GAAG,IAAI;aACtB,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACjD,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAEnE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,GAAG,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,WAAW,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC;QAE7E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,gBAAgB,CAC9B,KAAuB,EACvB,MAAmC;IAEnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CACpB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAChE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface Worktree {
|
|
2
|
+
readonly id: string;
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly branch: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function createWorktree(repoRoot: string, id: string): Promise<Worktree>;
|
|
7
|
+
export declare function removeWorktree(repoRoot: string, wt: Worktree): Promise<void>;
|
|
8
|
+
export declare function listWorktrees(repoRoot: string): Promise<ReadonlyArray<Worktree>>;
|
|
9
|
+
//# sourceMappingURL=worktree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../../src/verification/best-of-n/worktree.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AA+BD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,QAAQ,GACX,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAkDlC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { safeSpawn } from '../../exec/safe-spawn.js';
|
|
4
|
+
import { assertRelativeSafe } from '../../utils/path-safety.js';
|
|
5
|
+
const WORKTREE_ROOT = '.dare/worktrees';
|
|
6
|
+
function worktreeRelPath(id) {
|
|
7
|
+
const rel = path.posix.join(WORKTREE_ROOT, id);
|
|
8
|
+
assertRelativeSafe(rel);
|
|
9
|
+
return rel;
|
|
10
|
+
}
|
|
11
|
+
function branchName(id) {
|
|
12
|
+
assertRelativeSafe(id);
|
|
13
|
+
if (id.includes('/') || id.includes('\\')) {
|
|
14
|
+
throw new Error(`unsafe worktree id: ${id}`);
|
|
15
|
+
}
|
|
16
|
+
return `dare/cand-${id}`;
|
|
17
|
+
}
|
|
18
|
+
async function git(repoRoot, args, timeoutSeconds = 120) {
|
|
19
|
+
const result = await safeSpawn('git', args, {
|
|
20
|
+
cwd: repoRoot,
|
|
21
|
+
timeoutSeconds,
|
|
22
|
+
maxChars: 8000,
|
|
23
|
+
});
|
|
24
|
+
return { code: result.code, stderr: result.stderr };
|
|
25
|
+
}
|
|
26
|
+
export async function createWorktree(repoRoot, id) {
|
|
27
|
+
const rel = worktreeRelPath(id);
|
|
28
|
+
const absPath = path.resolve(repoRoot, rel);
|
|
29
|
+
const branch = branchName(id);
|
|
30
|
+
await fs.ensureDir(path.dirname(absPath));
|
|
31
|
+
const add = await git(repoRoot, [
|
|
32
|
+
'worktree',
|
|
33
|
+
'add',
|
|
34
|
+
'-b',
|
|
35
|
+
branch,
|
|
36
|
+
absPath,
|
|
37
|
+
'HEAD',
|
|
38
|
+
]);
|
|
39
|
+
if (add.code !== 0) {
|
|
40
|
+
throw new Error(`git worktree add failed for ${id}: ${add.stderr.trim()}`);
|
|
41
|
+
}
|
|
42
|
+
return { id, path: rel, branch };
|
|
43
|
+
}
|
|
44
|
+
export async function removeWorktree(repoRoot, wt) {
|
|
45
|
+
assertRelativeSafe(wt.path);
|
|
46
|
+
const absPath = path.resolve(repoRoot, wt.path);
|
|
47
|
+
const remove = await git(repoRoot, ['worktree', 'remove', '--force', absPath]);
|
|
48
|
+
if (remove.code !== 0) {
|
|
49
|
+
throw new Error(`git worktree remove failed for ${wt.id}: ${remove.stderr.trim()}`);
|
|
50
|
+
}
|
|
51
|
+
await git(repoRoot, ['branch', '-D', wt.branch]).catch(() => undefined);
|
|
52
|
+
await fs.remove(absPath).catch(() => undefined);
|
|
53
|
+
}
|
|
54
|
+
export async function listWorktrees(repoRoot) {
|
|
55
|
+
const result = await safeSpawn('git', ['worktree', 'list', '--porcelain'], { cwd: repoRoot, timeoutSeconds: 60, maxChars: 16000 });
|
|
56
|
+
if (result.code !== 0) {
|
|
57
|
+
throw new Error(`git worktree list failed: ${result.stderr.trim()}`);
|
|
58
|
+
}
|
|
59
|
+
const out = [];
|
|
60
|
+
const prefix = path.resolve(repoRoot, WORKTREE_ROOT) + path.sep;
|
|
61
|
+
let absPath = '';
|
|
62
|
+
let branch = '';
|
|
63
|
+
const flush = () => {
|
|
64
|
+
if (!absPath)
|
|
65
|
+
return;
|
|
66
|
+
const normalized = path.resolve(absPath);
|
|
67
|
+
if (!normalized.startsWith(prefix)) {
|
|
68
|
+
absPath = '';
|
|
69
|
+
branch = '';
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const rel = path.relative(repoRoot, normalized).replace(/\\/g, '/');
|
|
73
|
+
const id = path.basename(rel);
|
|
74
|
+
out.push({
|
|
75
|
+
id,
|
|
76
|
+
path: rel,
|
|
77
|
+
branch: branch || branchName(id),
|
|
78
|
+
});
|
|
79
|
+
absPath = '';
|
|
80
|
+
branch = '';
|
|
81
|
+
};
|
|
82
|
+
for (const line of result.stdout.split(/\r?\n/)) {
|
|
83
|
+
if (line.startsWith('worktree ')) {
|
|
84
|
+
flush();
|
|
85
|
+
absPath = line.slice('worktree '.length).trim();
|
|
86
|
+
}
|
|
87
|
+
else if (line.startsWith('branch ')) {
|
|
88
|
+
branch = line
|
|
89
|
+
.slice('branch '.length)
|
|
90
|
+
.trim()
|
|
91
|
+
.replace(/^refs\/heads\//, '');
|
|
92
|
+
}
|
|
93
|
+
else if (line === '') {
|
|
94
|
+
flush();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
flush();
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=worktree.js.map
|