@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
|
@@ -1,312 +1,312 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Decisão e migração de Cargo workspace multi-crate para projetos Rust/Axum. Use durante design/blueprint para decidir o layout, ou quando um projeto single-crate cresceu além do que comporta confortavelmente.
|
|
3
|
-
globs: src/**/*.rs,Cargo.toml,DARE/DESIGN.md,DARE/BLUEPRINT.md
|
|
4
|
-
alwaysApply: false
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Skill: Rust workspace — single-crate vs multi-crate
|
|
8
|
-
|
|
9
|
-
Esta skill cobre dois cenários relacionados:
|
|
10
|
-
|
|
11
|
-
- **Cenário A** — você está gerando `DESIGN.md`/`BLUEPRINT.md` de um projeto
|
|
12
|
-
Rust/Axum e precisa decidir desde já se ele nasce single-crate ou em
|
|
13
|
-
workspace.
|
|
14
|
-
- **Cenário B** — o projeto Rust **já existe** em single-crate e cresceu ao
|
|
15
|
-
ponto de doer (compilação lenta, fronteiras arquiteturais erodindo,
|
|
16
|
-
workers acoplados ao API server). Você precisa propor um plano de
|
|
17
|
-
migração para workspace.
|
|
18
|
-
|
|
19
|
-
A regra geral: **comece simples, migre quando os critérios objetivos
|
|
20
|
-
abaixo aparecerem.** Workspace é a estrutura idiomática Rust para projetos
|
|
21
|
-
maduros, mas é overengineering para o "hello world".
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## Cenário A — Decisão na fase Design/Blueprint
|
|
26
|
-
|
|
27
|
-
Antes de escrever o BLUEPRINT da stack `rust-axum`, decida: single-crate
|
|
28
|
-
ou workspace? Os critérios são objetivos:
|
|
29
|
-
|
|
30
|
-
### Comece **single-crate** quando TODOS forem verdadeiros
|
|
31
|
-
|
|
32
|
-
- Apenas **1 binário** (HTTP server).
|
|
33
|
-
- Estimativa de **< 30 arquivos `.rs`** no `src/`.
|
|
34
|
-
- **1–2 sistemas externos** (apenas DB; ou DB + cache).
|
|
35
|
-
- **Equipe ≤ 2 devs** trabalhando ativamente.
|
|
36
|
-
- Nenhum requisito de deploy independente para subcomponentes.
|
|
37
|
-
|
|
38
|
-
### Comece **workspace multi-crate** quando QUALQUER um for verdadeiro
|
|
39
|
-
|
|
40
|
-
- **≥ 2 binários** previstos (API + worker; API + admin; API + CLI).
|
|
41
|
-
- **Múltiplos sistemas externos** (3+: PG + Redis + Rabbit + Qdrant +
|
|
42
|
-
Neo4j + …).
|
|
43
|
-
- **Deploy independente** desejado (workers em pods separados no k8s,
|
|
44
|
-
scaling independente).
|
|
45
|
-
- **Fronteiras arquiteturais** críticas (domain puro sem HTTP/DB; SDK que
|
|
46
|
-
vai virar crate público; biblioteca de cliente compartilhada com outras
|
|
47
|
-
apps).
|
|
48
|
-
- **Equipe ≥ 3 devs** trabalhando em módulos diferentes em paralelo.
|
|
49
|
-
|
|
50
|
-
### Layout convencional para workspace
|
|
51
|
-
|
|
52
|
-
Use o prefixo do projeto (`<p>`) como namespace de todos os crates — por
|
|
53
|
-
exemplo `wa-` para uma `wa-business-api`, `agent-` para um `agent-ai`,
|
|
54
|
-
`chat-` para um `chat-service`.
|
|
55
|
-
|
|
56
|
-
```
|
|
57
|
-
projeto/
|
|
58
|
-
├── Cargo.toml # workspace root, deps centralizadas
|
|
59
|
-
├── docker-compose.yml
|
|
60
|
-
├── Dockerfile
|
|
61
|
-
├── crates/
|
|
62
|
-
│ ├── <p>-domain/ (lib) # entities puras: structs, errors, types
|
|
63
|
-
│ ├── <p>-config/ (lib) # AppConfig::from_env()
|
|
64
|
-
│ ├── <p>-db/ (lib) # sqlx pool, migrations
|
|
65
|
-
│ ├── <p>-cache/ (lib) # redis/moka (se houver)
|
|
66
|
-
│ ├── <p>-queue/ (lib) # lapin/kafka (se houver)
|
|
67
|
-
│ ├── <p>-crypto/ (lib) # bcrypt, jwt, aes (se aplicável)
|
|
68
|
-
│ ├── <p>-meta-client/ (lib) # cliente externo (Meta API, Stripe…)
|
|
69
|
-
│ ├── <p>-services/ (lib) # business logic, sem HTTP
|
|
70
|
-
│ ├── <p>-api/ (bin + lib) # HTTP server (handlers, router, mw)
|
|
71
|
-
│ ├── <p>-worker-<X>/ (bin) # 1 binário por tipo de worker
|
|
72
|
-
│ ├── <p>-admin/ (bin) # CLI admin (se houver)
|
|
73
|
-
│ └── <p>-e2e/ (tests) # integration tests cross-crate
|
|
74
|
-
└── xtask/ # scripts de build/dev em Rust
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
Granularidade: **um crate por bounded context**, não por arquivo. Resista
|
|
78
|
-
ao "crate util" / "crate common" — vira lixeira.
|
|
79
|
-
|
|
80
|
-
### Template de `Cargo.toml` raiz (workspace)
|
|
81
|
-
|
|
82
|
-
```toml
|
|
83
|
-
[workspace]
|
|
84
|
-
resolver = "2"
|
|
85
|
-
members = [
|
|
86
|
-
"crates/<p>-domain",
|
|
87
|
-
"crates/<p>-config",
|
|
88
|
-
"crates/<p>-db",
|
|
89
|
-
"crates/<p>-services",
|
|
90
|
-
"crates/<p>-api",
|
|
91
|
-
"crates/<p>-worker-x",
|
|
92
|
-
"crates/<p>-e2e",
|
|
93
|
-
"xtask",
|
|
94
|
-
]
|
|
95
|
-
|
|
96
|
-
[workspace.package]
|
|
97
|
-
version = "0.1.0"
|
|
98
|
-
edition = "2021"
|
|
99
|
-
rust-version = "1.80"
|
|
100
|
-
license = "Proprietary"
|
|
101
|
-
|
|
102
|
-
[workspace.dependencies]
|
|
103
|
-
# Runtime
|
|
104
|
-
tokio = { version = "1.40", features = ["full"] }
|
|
105
|
-
async-trait = "0.1"
|
|
106
|
-
|
|
107
|
-
# Web
|
|
108
|
-
axum = { version = "0.7", features = ["macros"] }
|
|
109
|
-
tower = "0.5"
|
|
110
|
-
tower-http = { version = "0.6", features = ["cors", "trace", "timeout"] }
|
|
111
|
-
|
|
112
|
-
# Serialization
|
|
113
|
-
serde = { version = "1.0", features = ["derive"] }
|
|
114
|
-
serde_json = "1.0"
|
|
115
|
-
|
|
116
|
-
# Database
|
|
117
|
-
sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "uuid", "chrono", "migrate"] }
|
|
118
|
-
|
|
119
|
-
# Errors / observability
|
|
120
|
-
thiserror = "1.0"
|
|
121
|
-
anyhow = "1.0"
|
|
122
|
-
tracing = "0.1"
|
|
123
|
-
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
|
|
124
|
-
|
|
125
|
-
# Types
|
|
126
|
-
uuid = { version = "1.10", features = ["v4", "serde"] }
|
|
127
|
-
chrono = { version = "0.4", features = ["serde"] }
|
|
128
|
-
|
|
129
|
-
[profile.release]
|
|
130
|
-
opt-level = 3
|
|
131
|
-
lto = "thin"
|
|
132
|
-
codegen-units = 1
|
|
133
|
-
strip = true
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
Cada crate filho herda via `version.workspace = true` e
|
|
137
|
-
`<dep> = { workspace = true }` — assim você atualiza axum/tokio/etc. em
|
|
138
|
-
**uma linha** no root.
|
|
139
|
-
|
|
140
|
-
### Diagrama no BLUEPRINT.md
|
|
141
|
-
|
|
142
|
-
Sempre desenhe o grafo de dependências em Mermaid. Exemplo:
|
|
143
|
-
|
|
144
|
-
```mermaid
|
|
145
|
-
graph TD
|
|
146
|
-
api[<p>-api]
|
|
147
|
-
admin[<p>-admin]
|
|
148
|
-
worker[<p>-worker-flow]
|
|
149
|
-
services[<p>-services]
|
|
150
|
-
db[<p>-db]
|
|
151
|
-
cache[<p>-cache]
|
|
152
|
-
queue[<p>-queue]
|
|
153
|
-
domain[<p>-domain]
|
|
154
|
-
|
|
155
|
-
api --> services
|
|
156
|
-
admin --> services
|
|
157
|
-
worker --> services
|
|
158
|
-
services --> db
|
|
159
|
-
services --> cache
|
|
160
|
-
services --> queue
|
|
161
|
-
services --> domain
|
|
162
|
-
db --> domain
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
Regras de seta:
|
|
166
|
-
- **`<p>-domain` no fundo:** ninguém depende para baixo dele.
|
|
167
|
-
- **`<p>-services` no meio:** depende de domain/db/cache/queue, NUNCA de api.
|
|
168
|
-
- **Binários (api, admin, worker) no topo:** dependem de services, nunca
|
|
169
|
-
um do outro.
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
## Cenário B — Migração de single-crate para workspace
|
|
174
|
-
|
|
175
|
-
Use quando você herda um projeto single-crate maduro e percebe que está
|
|
176
|
-
apertando.
|
|
177
|
-
|
|
178
|
-
### Sintomas objetivos de "hora de migrar"
|
|
179
|
-
|
|
180
|
-
- `src/` tem **> 30 arquivos `.rs`** ou **> 6 subpastas top-level**.
|
|
181
|
-
- Existem múltiplos "domínios verticais" misturados (`handlers`, `services`,
|
|
182
|
-
`repositories`, `workers`, `integrators`, `mcp`, `acp`, `skills`, `tools`…).
|
|
183
|
-
- Workers usam `tokio::spawn` no mesmo processo do API server (não
|
|
184
|
-
conseguem escalar independente).
|
|
185
|
-
- `cargo build` incremental > 10s.
|
|
186
|
-
- Múltiplas pessoas mexem no mesmo crate, gerando conflitos de merge
|
|
187
|
-
frequentes.
|
|
188
|
-
- Quer expor parte do código (cliente, SDK) como crate publicável.
|
|
189
|
-
|
|
190
|
-
### Plano de migração em 4 PRs
|
|
191
|
-
|
|
192
|
-
Migração **incremental**, NUNCA big-bang. Cada PR deve passar build/test
|
|
193
|
-
no fim e ser deployável.
|
|
194
|
-
|
|
195
|
-
#### PR 1 — Workers (mais isolados, menor risco)
|
|
196
|
-
|
|
197
|
-
```
|
|
198
|
-
src/workers/ → crates/<p>-worker-<nome>/
|
|
199
|
-
├── Cargo.toml
|
|
200
|
-
└── src/main.rs (era workers/<nome>.rs)
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
- Cada `tokio::spawn(worker_x)` que estava no `main.rs` da API vira um
|
|
204
|
-
**binário próprio**.
|
|
205
|
-
- O API server **para de fazer `start_workers()`** — workers sobem como
|
|
206
|
-
processo independente.
|
|
207
|
-
- `docker-compose.yml` ganha um `service` novo por worker, com `command:
|
|
208
|
-
["./<p>-worker-<nome>"]`.
|
|
209
|
-
- Em produção (k8s), cada worker vira um Deployment com seu próprio
|
|
210
|
-
scaling.
|
|
211
|
-
|
|
212
|
-
#### PR 2 — Integrators (clientes externos)
|
|
213
|
-
|
|
214
|
-
```
|
|
215
|
-
src/integrators/{llm, neo4j, qdrant}.rs → crates/<p>-integrators/src/lib.rs
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
- Tudo que fala com o mundo externo (LLM, Neo4j, Qdrant, Stripe, Meta,
|
|
219
|
-
…) vira lib.
|
|
220
|
-
- API e workers passam a importar via `<p>-integrators = { path = "../<p>-integrators" }`.
|
|
221
|
-
- `<p>-integrators` NÃO depende de domain/services — é folha do grafo, só
|
|
222
|
-
conhece os tipos de request/response da API externa.
|
|
223
|
-
|
|
224
|
-
#### PR 3 — Domain (entidades puras)
|
|
225
|
-
|
|
226
|
-
```
|
|
227
|
-
src/models/ \
|
|
228
|
-
src/dto/ → crates/<p>-domain/src/lib.rs
|
|
229
|
-
src/error.rs (parte que é DomainError) /
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
- `<p>-domain` tem **dependências MÍNIMAS** no Cargo.toml: apenas `serde`,
|
|
233
|
-
`uuid`, `chrono`, `thiserror`. Nada de axum, sqlx, redis.
|
|
234
|
-
- Force a regra fazendo `cargo build -p <p>-domain` falhar se alguém
|
|
235
|
-
importar HTTP/DB.
|
|
236
|
-
- API, services, workers, integrators todos passam a usar
|
|
237
|
-
`<p>-domain = { path = "../<p>-domain" }` em vez de `crate::models::`.
|
|
238
|
-
|
|
239
|
-
#### PR 4 — API e raiz do workspace
|
|
240
|
-
|
|
241
|
-
```
|
|
242
|
-
Cargo.toml (raiz) → vira [workspace] puro, sem [package]
|
|
243
|
-
src/ (resto) → crates/<p>-api/src/
|
|
244
|
-
├── main.rs
|
|
245
|
-
├── lib.rs
|
|
246
|
-
├── handlers/
|
|
247
|
-
├── routes.rs
|
|
248
|
-
└── middleware/
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
- `Cargo.toml` raiz só tem `[workspace]`, `[workspace.package]`,
|
|
252
|
-
`[workspace.dependencies]`, e `[profile.*]`.
|
|
253
|
-
- API (binário principal) vai pra `crates/<p>-api/`.
|
|
254
|
-
- Centralize todas as deps em `workspace.dependencies` — cada crate herda
|
|
255
|
-
com `<dep> = { workspace = true }`.
|
|
256
|
-
|
|
257
|
-
### Validação após CADA PR
|
|
258
|
-
|
|
259
|
-
```bash
|
|
260
|
-
cargo build --workspace --all-targets
|
|
261
|
-
cargo test --workspace
|
|
262
|
-
cargo clippy --workspace --all-targets -- -D warnings
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
Mais o smoke E2E do projeto (subir compose, hitar `/healthz`, login,
|
|
266
|
-
operação CRUD básica). Se algum quebrar, o PR está incompleto.
|
|
267
|
-
|
|
268
|
-
### Antipatterns ao migrar
|
|
269
|
-
|
|
270
|
-
| Antipattern | Por que evitar |
|
|
271
|
-
|-------------|----------------|
|
|
272
|
-
| Big-bang (1 PR mexe em tudo) | Impossível revisar; impossível reverter; quebra histórico do git blame |
|
|
273
|
-
| Crate `common` / `shared` / `utils` | Vira lixeira; ninguém sabe onde colocar; viola SRP |
|
|
274
|
-
| Crate por arquivo (granularidade demais) | 50 crates de 100 linhas cada vai parar a build |
|
|
275
|
-
| Refactor de lógica + migração no mesmo PR | Não dá pra revisar; bug fica escondido |
|
|
276
|
-
| Mover testes em PR separado | Crate sem test em produção é bug em standby |
|
|
277
|
-
| Não atualizar `xtask`/scripts CI | Pipeline quebra; deploy vira pesadelo |
|
|
278
|
-
|
|
279
|
-
### Tradução de imports
|
|
280
|
-
|
|
281
|
-
| Antes (single-crate) | Depois (workspace) |
|
|
282
|
-
|----------------------|--------------------|
|
|
283
|
-
| `use crate::models::User;` | `use <p>_domain::User;` |
|
|
284
|
-
| `use crate::services::auth::login;` | `use <p>_services::auth::login;` |
|
|
285
|
-
| `use crate::handlers::health::router;` | `use crate::handlers::health::router;` *(stay — está dentro do mesmo crate)* |
|
|
286
|
-
| `use crate::integrators::llm::Gemini;` | `use <p>_integrators::llm::Gemini;` |
|
|
287
|
-
|
|
288
|
-
Note os hifens viram underlines (Cargo names → Rust idents).
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
## Quando NÃO migrar
|
|
293
|
-
|
|
294
|
-
- Projeto < 30 arquivos com 1 binário e 1 dev → single-crate é mais
|
|
295
|
-
simples, manutenção é trivial.
|
|
296
|
-
- Você está no meio de um sprint crítico → migração é refactor estrutural,
|
|
297
|
-
não combina com prazo.
|
|
298
|
-
- Não há sinais reais de dor (build < 5s, sem conflitos, sem segundo
|
|
299
|
-
binário planejado).
|
|
300
|
-
|
|
301
|
-
A migração tem custo. Faça quando o ganho compensar.
|
|
302
|
-
|
|
303
|
-
## Checklist final (qualquer cenário)
|
|
304
|
-
|
|
305
|
-
- [ ] Critérios objetivos de decisão documentados no BLUEPRINT
|
|
306
|
-
- [ ] Lista de crates com responsabilidade de cada um
|
|
307
|
-
- [ ] Diagrama Mermaid do grafo de dependências
|
|
308
|
-
- [ ] `Cargo.toml` workspace com `workspace.dependencies` centralizadas
|
|
309
|
-
- [ ] `<p>-domain` sem dependência de framework HTTP/DB
|
|
310
|
-
- [ ] Cada binário com `[[bin]]` e `path = "src/main.rs"` no seu Cargo.toml
|
|
311
|
-
- [ ] Migração planejada em PRs incrementais, não big-bang
|
|
312
|
-
- [ ] Ralph Loop verde após cada PR (`cargo build/test/clippy --workspace`)
|
|
1
|
+
---
|
|
2
|
+
description: Decisão e migração de Cargo workspace multi-crate para projetos Rust/Axum. Use durante design/blueprint para decidir o layout, ou quando um projeto single-crate cresceu além do que comporta confortavelmente.
|
|
3
|
+
globs: src/**/*.rs,Cargo.toml,DARE/DESIGN.md,DARE/BLUEPRINT.md
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Rust workspace — single-crate vs multi-crate
|
|
8
|
+
|
|
9
|
+
Esta skill cobre dois cenários relacionados:
|
|
10
|
+
|
|
11
|
+
- **Cenário A** — você está gerando `DESIGN.md`/`BLUEPRINT.md` de um projeto
|
|
12
|
+
Rust/Axum e precisa decidir desde já se ele nasce single-crate ou em
|
|
13
|
+
workspace.
|
|
14
|
+
- **Cenário B** — o projeto Rust **já existe** em single-crate e cresceu ao
|
|
15
|
+
ponto de doer (compilação lenta, fronteiras arquiteturais erodindo,
|
|
16
|
+
workers acoplados ao API server). Você precisa propor um plano de
|
|
17
|
+
migração para workspace.
|
|
18
|
+
|
|
19
|
+
A regra geral: **comece simples, migre quando os critérios objetivos
|
|
20
|
+
abaixo aparecerem.** Workspace é a estrutura idiomática Rust para projetos
|
|
21
|
+
maduros, mas é overengineering para o "hello world".
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Cenário A — Decisão na fase Design/Blueprint
|
|
26
|
+
|
|
27
|
+
Antes de escrever o BLUEPRINT da stack `rust-axum`, decida: single-crate
|
|
28
|
+
ou workspace? Os critérios são objetivos:
|
|
29
|
+
|
|
30
|
+
### Comece **single-crate** quando TODOS forem verdadeiros
|
|
31
|
+
|
|
32
|
+
- Apenas **1 binário** (HTTP server).
|
|
33
|
+
- Estimativa de **< 30 arquivos `.rs`** no `src/`.
|
|
34
|
+
- **1–2 sistemas externos** (apenas DB; ou DB + cache).
|
|
35
|
+
- **Equipe ≤ 2 devs** trabalhando ativamente.
|
|
36
|
+
- Nenhum requisito de deploy independente para subcomponentes.
|
|
37
|
+
|
|
38
|
+
### Comece **workspace multi-crate** quando QUALQUER um for verdadeiro
|
|
39
|
+
|
|
40
|
+
- **≥ 2 binários** previstos (API + worker; API + admin; API + CLI).
|
|
41
|
+
- **Múltiplos sistemas externos** (3+: PG + Redis + Rabbit + Qdrant +
|
|
42
|
+
Neo4j + …).
|
|
43
|
+
- **Deploy independente** desejado (workers em pods separados no k8s,
|
|
44
|
+
scaling independente).
|
|
45
|
+
- **Fronteiras arquiteturais** críticas (domain puro sem HTTP/DB; SDK que
|
|
46
|
+
vai virar crate público; biblioteca de cliente compartilhada com outras
|
|
47
|
+
apps).
|
|
48
|
+
- **Equipe ≥ 3 devs** trabalhando em módulos diferentes em paralelo.
|
|
49
|
+
|
|
50
|
+
### Layout convencional para workspace
|
|
51
|
+
|
|
52
|
+
Use o prefixo do projeto (`<p>`) como namespace de todos os crates — por
|
|
53
|
+
exemplo `wa-` para uma `wa-business-api`, `agent-` para um `agent-ai`,
|
|
54
|
+
`chat-` para um `chat-service`.
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
projeto/
|
|
58
|
+
├── Cargo.toml # workspace root, deps centralizadas
|
|
59
|
+
├── docker-compose.yml
|
|
60
|
+
├── Dockerfile
|
|
61
|
+
├── crates/
|
|
62
|
+
│ ├── <p>-domain/ (lib) # entities puras: structs, errors, types
|
|
63
|
+
│ ├── <p>-config/ (lib) # AppConfig::from_env()
|
|
64
|
+
│ ├── <p>-db/ (lib) # sqlx pool, migrations
|
|
65
|
+
│ ├── <p>-cache/ (lib) # redis/moka (se houver)
|
|
66
|
+
│ ├── <p>-queue/ (lib) # lapin/kafka (se houver)
|
|
67
|
+
│ ├── <p>-crypto/ (lib) # bcrypt, jwt, aes (se aplicável)
|
|
68
|
+
│ ├── <p>-meta-client/ (lib) # cliente externo (Meta API, Stripe…)
|
|
69
|
+
│ ├── <p>-services/ (lib) # business logic, sem HTTP
|
|
70
|
+
│ ├── <p>-api/ (bin + lib) # HTTP server (handlers, router, mw)
|
|
71
|
+
│ ├── <p>-worker-<X>/ (bin) # 1 binário por tipo de worker
|
|
72
|
+
│ ├── <p>-admin/ (bin) # CLI admin (se houver)
|
|
73
|
+
│ └── <p>-e2e/ (tests) # integration tests cross-crate
|
|
74
|
+
└── xtask/ # scripts de build/dev em Rust
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Granularidade: **um crate por bounded context**, não por arquivo. Resista
|
|
78
|
+
ao "crate util" / "crate common" — vira lixeira.
|
|
79
|
+
|
|
80
|
+
### Template de `Cargo.toml` raiz (workspace)
|
|
81
|
+
|
|
82
|
+
```toml
|
|
83
|
+
[workspace]
|
|
84
|
+
resolver = "2"
|
|
85
|
+
members = [
|
|
86
|
+
"crates/<p>-domain",
|
|
87
|
+
"crates/<p>-config",
|
|
88
|
+
"crates/<p>-db",
|
|
89
|
+
"crates/<p>-services",
|
|
90
|
+
"crates/<p>-api",
|
|
91
|
+
"crates/<p>-worker-x",
|
|
92
|
+
"crates/<p>-e2e",
|
|
93
|
+
"xtask",
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
[workspace.package]
|
|
97
|
+
version = "0.1.0"
|
|
98
|
+
edition = "2021"
|
|
99
|
+
rust-version = "1.80"
|
|
100
|
+
license = "Proprietary"
|
|
101
|
+
|
|
102
|
+
[workspace.dependencies]
|
|
103
|
+
# Runtime
|
|
104
|
+
tokio = { version = "1.40", features = ["full"] }
|
|
105
|
+
async-trait = "0.1"
|
|
106
|
+
|
|
107
|
+
# Web
|
|
108
|
+
axum = { version = "0.7", features = ["macros"] }
|
|
109
|
+
tower = "0.5"
|
|
110
|
+
tower-http = { version = "0.6", features = ["cors", "trace", "timeout"] }
|
|
111
|
+
|
|
112
|
+
# Serialization
|
|
113
|
+
serde = { version = "1.0", features = ["derive"] }
|
|
114
|
+
serde_json = "1.0"
|
|
115
|
+
|
|
116
|
+
# Database
|
|
117
|
+
sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "uuid", "chrono", "migrate"] }
|
|
118
|
+
|
|
119
|
+
# Errors / observability
|
|
120
|
+
thiserror = "1.0"
|
|
121
|
+
anyhow = "1.0"
|
|
122
|
+
tracing = "0.1"
|
|
123
|
+
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
|
|
124
|
+
|
|
125
|
+
# Types
|
|
126
|
+
uuid = { version = "1.10", features = ["v4", "serde"] }
|
|
127
|
+
chrono = { version = "0.4", features = ["serde"] }
|
|
128
|
+
|
|
129
|
+
[profile.release]
|
|
130
|
+
opt-level = 3
|
|
131
|
+
lto = "thin"
|
|
132
|
+
codegen-units = 1
|
|
133
|
+
strip = true
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Cada crate filho herda via `version.workspace = true` e
|
|
137
|
+
`<dep> = { workspace = true }` — assim você atualiza axum/tokio/etc. em
|
|
138
|
+
**uma linha** no root.
|
|
139
|
+
|
|
140
|
+
### Diagrama no BLUEPRINT.md
|
|
141
|
+
|
|
142
|
+
Sempre desenhe o grafo de dependências em Mermaid. Exemplo:
|
|
143
|
+
|
|
144
|
+
```mermaid
|
|
145
|
+
graph TD
|
|
146
|
+
api[<p>-api]
|
|
147
|
+
admin[<p>-admin]
|
|
148
|
+
worker[<p>-worker-flow]
|
|
149
|
+
services[<p>-services]
|
|
150
|
+
db[<p>-db]
|
|
151
|
+
cache[<p>-cache]
|
|
152
|
+
queue[<p>-queue]
|
|
153
|
+
domain[<p>-domain]
|
|
154
|
+
|
|
155
|
+
api --> services
|
|
156
|
+
admin --> services
|
|
157
|
+
worker --> services
|
|
158
|
+
services --> db
|
|
159
|
+
services --> cache
|
|
160
|
+
services --> queue
|
|
161
|
+
services --> domain
|
|
162
|
+
db --> domain
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Regras de seta:
|
|
166
|
+
- **`<p>-domain` no fundo:** ninguém depende para baixo dele.
|
|
167
|
+
- **`<p>-services` no meio:** depende de domain/db/cache/queue, NUNCA de api.
|
|
168
|
+
- **Binários (api, admin, worker) no topo:** dependem de services, nunca
|
|
169
|
+
um do outro.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Cenário B — Migração de single-crate para workspace
|
|
174
|
+
|
|
175
|
+
Use quando você herda um projeto single-crate maduro e percebe que está
|
|
176
|
+
apertando.
|
|
177
|
+
|
|
178
|
+
### Sintomas objetivos de "hora de migrar"
|
|
179
|
+
|
|
180
|
+
- `src/` tem **> 30 arquivos `.rs`** ou **> 6 subpastas top-level**.
|
|
181
|
+
- Existem múltiplos "domínios verticais" misturados (`handlers`, `services`,
|
|
182
|
+
`repositories`, `workers`, `integrators`, `mcp`, `acp`, `skills`, `tools`…).
|
|
183
|
+
- Workers usam `tokio::spawn` no mesmo processo do API server (não
|
|
184
|
+
conseguem escalar independente).
|
|
185
|
+
- `cargo build` incremental > 10s.
|
|
186
|
+
- Múltiplas pessoas mexem no mesmo crate, gerando conflitos de merge
|
|
187
|
+
frequentes.
|
|
188
|
+
- Quer expor parte do código (cliente, SDK) como crate publicável.
|
|
189
|
+
|
|
190
|
+
### Plano de migração em 4 PRs
|
|
191
|
+
|
|
192
|
+
Migração **incremental**, NUNCA big-bang. Cada PR deve passar build/test
|
|
193
|
+
no fim e ser deployável.
|
|
194
|
+
|
|
195
|
+
#### PR 1 — Workers (mais isolados, menor risco)
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
src/workers/ → crates/<p>-worker-<nome>/
|
|
199
|
+
├── Cargo.toml
|
|
200
|
+
└── src/main.rs (era workers/<nome>.rs)
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
- Cada `tokio::spawn(worker_x)` que estava no `main.rs` da API vira um
|
|
204
|
+
**binário próprio**.
|
|
205
|
+
- O API server **para de fazer `start_workers()`** — workers sobem como
|
|
206
|
+
processo independente.
|
|
207
|
+
- `docker-compose.yml` ganha um `service` novo por worker, com `command:
|
|
208
|
+
["./<p>-worker-<nome>"]`.
|
|
209
|
+
- Em produção (k8s), cada worker vira um Deployment com seu próprio
|
|
210
|
+
scaling.
|
|
211
|
+
|
|
212
|
+
#### PR 2 — Integrators (clientes externos)
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
src/integrators/{llm, neo4j, qdrant}.rs → crates/<p>-integrators/src/lib.rs
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
- Tudo que fala com o mundo externo (LLM, Neo4j, Qdrant, Stripe, Meta,
|
|
219
|
+
…) vira lib.
|
|
220
|
+
- API e workers passam a importar via `<p>-integrators = { path = "../<p>-integrators" }`.
|
|
221
|
+
- `<p>-integrators` NÃO depende de domain/services — é folha do grafo, só
|
|
222
|
+
conhece os tipos de request/response da API externa.
|
|
223
|
+
|
|
224
|
+
#### PR 3 — Domain (entidades puras)
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
src/models/ \
|
|
228
|
+
src/dto/ → crates/<p>-domain/src/lib.rs
|
|
229
|
+
src/error.rs (parte que é DomainError) /
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
- `<p>-domain` tem **dependências MÍNIMAS** no Cargo.toml: apenas `serde`,
|
|
233
|
+
`uuid`, `chrono`, `thiserror`. Nada de axum, sqlx, redis.
|
|
234
|
+
- Force a regra fazendo `cargo build -p <p>-domain` falhar se alguém
|
|
235
|
+
importar HTTP/DB.
|
|
236
|
+
- API, services, workers, integrators todos passam a usar
|
|
237
|
+
`<p>-domain = { path = "../<p>-domain" }` em vez de `crate::models::`.
|
|
238
|
+
|
|
239
|
+
#### PR 4 — API e raiz do workspace
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
Cargo.toml (raiz) → vira [workspace] puro, sem [package]
|
|
243
|
+
src/ (resto) → crates/<p>-api/src/
|
|
244
|
+
├── main.rs
|
|
245
|
+
├── lib.rs
|
|
246
|
+
├── handlers/
|
|
247
|
+
├── routes.rs
|
|
248
|
+
└── middleware/
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
- `Cargo.toml` raiz só tem `[workspace]`, `[workspace.package]`,
|
|
252
|
+
`[workspace.dependencies]`, e `[profile.*]`.
|
|
253
|
+
- API (binário principal) vai pra `crates/<p>-api/`.
|
|
254
|
+
- Centralize todas as deps em `workspace.dependencies` — cada crate herda
|
|
255
|
+
com `<dep> = { workspace = true }`.
|
|
256
|
+
|
|
257
|
+
### Validação após CADA PR
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
cargo build --workspace --all-targets
|
|
261
|
+
cargo test --workspace
|
|
262
|
+
cargo clippy --workspace --all-targets -- -D warnings
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Mais o smoke E2E do projeto (subir compose, hitar `/healthz`, login,
|
|
266
|
+
operação CRUD básica). Se algum quebrar, o PR está incompleto.
|
|
267
|
+
|
|
268
|
+
### Antipatterns ao migrar
|
|
269
|
+
|
|
270
|
+
| Antipattern | Por que evitar |
|
|
271
|
+
|-------------|----------------|
|
|
272
|
+
| Big-bang (1 PR mexe em tudo) | Impossível revisar; impossível reverter; quebra histórico do git blame |
|
|
273
|
+
| Crate `common` / `shared` / `utils` | Vira lixeira; ninguém sabe onde colocar; viola SRP |
|
|
274
|
+
| Crate por arquivo (granularidade demais) | 50 crates de 100 linhas cada vai parar a build |
|
|
275
|
+
| Refactor de lógica + migração no mesmo PR | Não dá pra revisar; bug fica escondido |
|
|
276
|
+
| Mover testes em PR separado | Crate sem test em produção é bug em standby |
|
|
277
|
+
| Não atualizar `xtask`/scripts CI | Pipeline quebra; deploy vira pesadelo |
|
|
278
|
+
|
|
279
|
+
### Tradução de imports
|
|
280
|
+
|
|
281
|
+
| Antes (single-crate) | Depois (workspace) |
|
|
282
|
+
|----------------------|--------------------|
|
|
283
|
+
| `use crate::models::User;` | `use <p>_domain::User;` |
|
|
284
|
+
| `use crate::services::auth::login;` | `use <p>_services::auth::login;` |
|
|
285
|
+
| `use crate::handlers::health::router;` | `use crate::handlers::health::router;` *(stay — está dentro do mesmo crate)* |
|
|
286
|
+
| `use crate::integrators::llm::Gemini;` | `use <p>_integrators::llm::Gemini;` |
|
|
287
|
+
|
|
288
|
+
Note os hifens viram underlines (Cargo names → Rust idents).
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Quando NÃO migrar
|
|
293
|
+
|
|
294
|
+
- Projeto < 30 arquivos com 1 binário e 1 dev → single-crate é mais
|
|
295
|
+
simples, manutenção é trivial.
|
|
296
|
+
- Você está no meio de um sprint crítico → migração é refactor estrutural,
|
|
297
|
+
não combina com prazo.
|
|
298
|
+
- Não há sinais reais de dor (build < 5s, sem conflitos, sem segundo
|
|
299
|
+
binário planejado).
|
|
300
|
+
|
|
301
|
+
A migração tem custo. Faça quando o ganho compensar.
|
|
302
|
+
|
|
303
|
+
## Checklist final (qualquer cenário)
|
|
304
|
+
|
|
305
|
+
- [ ] Critérios objetivos de decisão documentados no BLUEPRINT
|
|
306
|
+
- [ ] Lista de crates com responsabilidade de cada um
|
|
307
|
+
- [ ] Diagrama Mermaid do grafo de dependências
|
|
308
|
+
- [ ] `Cargo.toml` workspace com `workspace.dependencies` centralizadas
|
|
309
|
+
- [ ] `<p>-domain` sem dependência de framework HTTP/DB
|
|
310
|
+
- [ ] Cada binário com `[[bin]]` e `path = "src/main.rs"` no seu Cargo.toml
|
|
311
|
+
- [ ] Migração planejada em PRs incrementais, não big-bang
|
|
312
|
+
- [ ] Ralph Loop verde após cada PR (`cargo build/test/clippy --workspace`)
|