@dewtech/dare-cli 3.3.0 → 3.5.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 -764
- package/dist/__tests__/confidence.test.js +13 -13
- package/dist/__tests__/dag-converter.test.js +56 -56
- package/dist/__tests__/dag-runner/buildLocateContext.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/buildLocateContext.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/buildLocateContext.test.js +53 -0
- package/dist/__tests__/dag-runner/buildLocateContext.test.js.map +1 -0
- package/dist/__tests__/dual-graph.test.d.ts +2 -0
- package/dist/__tests__/dual-graph.test.d.ts.map +1 -0
- package/dist/__tests__/dual-graph.test.js +141 -0
- package/dist/__tests__/dual-graph.test.js.map +1 -0
- package/dist/__tests__/graphrag/contract/traverse.contract.d.ts +9 -0
- package/dist/__tests__/graphrag/contract/traverse.contract.d.ts.map +1 -0
- package/dist/__tests__/graphrag/contract/traverse.contract.js +58 -0
- package/dist/__tests__/graphrag/contract/traverse.contract.js.map +1 -0
- package/dist/__tests__/graphrag/contract/traverse.contract.test.d.ts +2 -0
- package/dist/__tests__/graphrag/contract/traverse.contract.test.d.ts.map +1 -0
- package/dist/__tests__/graphrag/contract/traverse.contract.test.js +100 -0
- package/dist/__tests__/graphrag/contract/traverse.contract.test.js.map +1 -0
- package/dist/__tests__/graphrag/factory.test.js +10 -1
- package/dist/__tests__/graphrag/factory.test.js.map +1 -1
- package/dist/__tests__/graphrag/fixtures/dual-graph/build-fixture-graph.d.ts +11 -0
- package/dist/__tests__/graphrag/fixtures/dual-graph/build-fixture-graph.d.ts.map +1 -0
- package/dist/__tests__/graphrag/fixtures/dual-graph/build-fixture-graph.js +34 -0
- package/dist/__tests__/graphrag/fixtures/dual-graph/build-fixture-graph.js.map +1 -0
- package/dist/__tests__/graphrag/fixtures/dual-graph/fixtures.test.d.ts +2 -0
- package/dist/__tests__/graphrag/fixtures/dual-graph/fixtures.test.d.ts.map +1 -0
- package/dist/__tests__/graphrag/fixtures/dual-graph/fixtures.test.js +46 -0
- package/dist/__tests__/graphrag/fixtures/dual-graph/fixtures.test.js.map +1 -0
- package/dist/__tests__/graphrag/graph-rag.test.js +31 -0
- package/dist/__tests__/graphrag/graph-rag.test.js.map +1 -1
- package/dist/__tests__/graphrag/json-graph.test.js +57 -0
- package/dist/__tests__/graphrag/json-graph.test.js.map +1 -1
- package/dist/__tests__/graphrag/neo4j-graph.test.d.ts +2 -0
- package/dist/__tests__/graphrag/neo4j-graph.test.d.ts.map +1 -0
- package/dist/__tests__/graphrag/neo4j-graph.test.js +104 -0
- package/dist/__tests__/graphrag/neo4j-graph.test.js.map +1 -0
- package/dist/__tests__/graphrag/neo4j-persistence.test.d.ts +2 -0
- package/dist/__tests__/graphrag/neo4j-persistence.test.d.ts.map +1 -0
- package/dist/__tests__/graphrag/neo4j-persistence.test.js +110 -0
- package/dist/__tests__/graphrag/neo4j-persistence.test.js.map +1 -0
- 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.js +2 -2
- package/dist/__tests__/project-generator.test.js.map +1 -1
- 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 +0 -0
- package/dist/commands/__tests__/execute.telemetry.spec.js +9 -0
- package/dist/commands/__tests__/execute.telemetry.spec.js.map +1 -1
- package/dist/commands/__tests__/graph-viz-layers.test.d.ts +2 -0
- package/dist/commands/__tests__/graph-viz-layers.test.d.ts.map +1 -0
- package/dist/commands/__tests__/graph-viz-layers.test.js +36 -0
- package/dist/commands/__tests__/graph-viz-layers.test.js.map +1 -0
- package/dist/commands/__tests__/impact.test.d.ts +2 -0
- package/dist/commands/__tests__/impact.test.d.ts.map +1 -0
- package/dist/commands/__tests__/impact.test.js +26 -0
- package/dist/commands/__tests__/impact.test.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/__tests__/locate.test.d.ts +2 -0
- package/dist/commands/__tests__/locate.test.d.ts.map +1 -0
- package/dist/commands/__tests__/locate.test.js +35 -0
- package/dist/commands/__tests__/locate.test.js.map +1 -0
- package/dist/commands/__tests__/owners.test.d.ts +2 -0
- package/dist/commands/__tests__/owners.test.d.ts.map +1 -0
- package/dist/commands/__tests__/owners.test.js +34 -0
- package/dist/commands/__tests__/owners.test.js.map +1 -0
- package/dist/commands/__tests__/trace.test.d.ts +2 -0
- package/dist/commands/__tests__/trace.test.d.ts.map +1 -0
- package/dist/commands/__tests__/trace.test.js +29 -0
- package/dist/commands/__tests__/trace.test.js.map +1 -0
- package/dist/commands/blueprint.js +122 -122
- package/dist/commands/design.js +20 -20
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +11 -6
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/graph-queries.d.ts +48 -0
- package/dist/commands/graph-queries.d.ts.map +1 -0
- package/dist/commands/graph-queries.js +204 -0
- package/dist/commands/graph-queries.js.map +1 -0
- package/dist/commands/graph.d.ts +13 -0
- package/dist/commands/graph.d.ts.map +1 -1
- package/dist/commands/graph.js +212 -8
- package/dist/commands/graph.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/__tests__/fixtures/src/math.d.ts +3 -0
- package/dist/dag-runner/__tests__/fixtures/src/math.d.ts.map +1 -0
- package/dist/dag-runner/__tests__/fixtures/src/math.js +7 -0
- package/dist/dag-runner/__tests__/fixtures/src/math.js.map +1 -0
- package/dist/dag-runner/__tests__/graph-ingest-symbols.test.d.ts +2 -0
- package/dist/dag-runner/__tests__/graph-ingest-symbols.test.d.ts.map +1 -0
- package/dist/dag-runner/__tests__/graph-ingest-symbols.test.js +81 -0
- package/dist/dag-runner/__tests__/graph-ingest-symbols.test.js.map +1 -0
- package/dist/dag-runner/graph-ingest.d.ts.map +1 -1
- package/dist/dag-runner/graph-ingest.js +46 -0
- package/dist/dag-runner/graph-ingest.js.map +1 -1
- package/dist/dag-runner/graph-locate.d.ts +11 -0
- package/dist/dag-runner/graph-locate.d.ts.map +1 -0
- package/dist/dag-runner/graph-locate.js +74 -0
- package/dist/dag-runner/graph-locate.js.map +1 -0
- package/dist/dag-runner/run_dag.d.ts +3 -1
- package/dist/dag-runner/run_dag.d.ts.map +1 -1
- package/dist/dag-runner/run_dag.js +2 -1
- package/dist/dag-runner/run_dag.js.map +1 -1
- package/dist/dag-runner/utils/stitch-context.d.ts +3 -1
- package/dist/dag-runner/utils/stitch-context.d.ts.map +1 -1
- package/dist/dag-runner/utils/stitch-context.js +8 -2
- package/dist/dag-runner/utils/stitch-context.js.map +1 -1
- package/dist/graphrag/__tests__/code-index.test.d.ts +2 -0
- package/dist/graphrag/__tests__/code-index.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/code-index.test.js +75 -0
- package/dist/graphrag/__tests__/code-index.test.js.map +1 -0
- package/dist/graphrag/__tests__/fixtures/code-index/sample.d.ts +5 -0
- package/dist/graphrag/__tests__/fixtures/code-index/sample.d.ts.map +1 -0
- package/dist/graphrag/__tests__/fixtures/code-index/sample.js +10 -0
- package/dist/graphrag/__tests__/fixtures/code-index/sample.js.map +1 -0
- package/dist/graphrag/__tests__/locate.test.d.ts +2 -0
- package/dist/graphrag/__tests__/locate.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/locate.test.js +43 -0
- package/dist/graphrag/__tests__/locate.test.js.map +1 -0
- package/dist/graphrag/__tests__/requirement-ingest.test.d.ts +2 -0
- package/dist/graphrag/__tests__/requirement-ingest.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/requirement-ingest.test.js +66 -0
- package/dist/graphrag/__tests__/requirement-ingest.test.js.map +1 -0
- package/dist/graphrag/__tests__/traverse.test.d.ts +2 -0
- package/dist/graphrag/__tests__/traverse.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/traverse.test.js +71 -0
- package/dist/graphrag/__tests__/traverse.test.js.map +1 -0
- package/dist/graphrag/__tests__/types.test.d.ts +2 -0
- package/dist/graphrag/__tests__/types.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/types.test.js +52 -0
- package/dist/graphrag/__tests__/types.test.js.map +1 -0
- package/dist/graphrag/code-index.d.ts +15 -0
- package/dist/graphrag/code-index.d.ts.map +1 -0
- package/dist/graphrag/code-index.js +205 -0
- package/dist/graphrag/code-index.js.map +1 -0
- package/dist/graphrag/factory.d.ts.map +1 -1
- package/dist/graphrag/factory.js +5 -0
- package/dist/graphrag/factory.js.map +1 -1
- package/dist/graphrag/graph-rag.d.ts +6 -2
- package/dist/graphrag/graph-rag.d.ts.map +1 -1
- package/dist/graphrag/graph-rag.js +64 -26
- package/dist/graphrag/graph-rag.js.map +1 -1
- package/dist/graphrag/index.d.ts +8 -2
- package/dist/graphrag/index.d.ts.map +1 -1
- package/dist/graphrag/index.js +5 -1
- package/dist/graphrag/index.js.map +1 -1
- package/dist/graphrag/json-graph.d.ts +8 -0
- package/dist/graphrag/json-graph.d.ts.map +1 -1
- package/dist/graphrag/json-graph.js +50 -4
- package/dist/graphrag/json-graph.js.map +1 -1
- package/dist/graphrag/knowledge-graph.d.ts +8 -3
- package/dist/graphrag/knowledge-graph.d.ts.map +1 -1
- package/dist/graphrag/neo4j-graph.d.ts +19 -18
- package/dist/graphrag/neo4j-graph.d.ts.map +1 -1
- package/dist/graphrag/neo4j-graph.js +164 -38
- package/dist/graphrag/neo4j-graph.js.map +1 -1
- package/dist/graphrag/requirement-ingest.d.ts +15 -0
- package/dist/graphrag/requirement-ingest.d.ts.map +1 -0
- package/dist/graphrag/requirement-ingest.js +158 -0
- package/dist/graphrag/requirement-ingest.js.map +1 -0
- package/dist/graphrag/traverse.d.ts +5 -0
- package/dist/graphrag/traverse.d.ts.map +1 -0
- package/dist/graphrag/traverse.js +139 -0
- package/dist/graphrag/traverse.js.map +1 -0
- package/dist/graphrag/types.d.ts +60 -2
- package/dist/graphrag/types.d.ts.map +1 -1
- package/dist/graphrag/types.js +34 -1
- package/dist/graphrag/types.js.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__/mcp-graph.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/mcp-graph.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/mcp-graph.test.js +85 -0
- package/dist/mcp-server/__tests__/mcp-graph.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 +290 -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.js +69 -69
- package/dist/stacks/ruby-rails-8/scaffold.js +15 -15
- package/dist/utils/__tests__/static-analyzer-exports.test.d.ts +2 -0
- package/dist/utils/__tests__/static-analyzer-exports.test.d.ts.map +1 -0
- package/dist/utils/__tests__/static-analyzer-exports.test.js +21 -0
- package/dist/utils/__tests__/static-analyzer-exports.test.js.map +1 -0
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +266 -252
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/stack-bootstrap.js +371 -371
- package/dist/utils/static-analyzer.d.ts +9 -0
- package/dist/utils/static-analyzer.d.ts.map +1 -1
- package/dist/utils/static-analyzer.js +2 -2
- package/dist/utils/static-analyzer.js.map +1 -1
- package/dist/utils/templates.js +394 -394
- package/dist/verification/__tests__/anti-tamper.test.js +13 -13
- package/dist/verification/__tests__/telemetry.test.js +9 -0
- package/dist/verification/__tests__/telemetry.test.js.map +1 -1
- package/package.json +96 -93
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +68 -68
- 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 -21
- 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 -18
- 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 -18
- 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,217 +1,217 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: dare-realtime
|
|
3
|
-
description: Comunicação real-time (WebSocket, SSE) em projetos DARE. Fornece schema validation de eventos, registro central de tipos, reconexão com exponential backoff, e gerenciamento de subscriptions com limpeza garantida (zero ghost listeners).
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# DARE Realtime Skill
|
|
7
|
-
|
|
8
|
-
Você é um especialista em comunicação real-time. Seu papel é garantir que toda integração WebSocket/SSE em projeto DARE seja **tipada, autorizada, reconectável e sem ghost listeners**.
|
|
9
|
-
|
|
10
|
-
## Quando usar esta skill
|
|
11
|
-
|
|
12
|
-
- Projeto precisa de WebSocket (chat, notifications, live updates)
|
|
13
|
-
- Projeto precisa de SSE (logs streaming, métricas em tempo real)
|
|
14
|
-
- Você está auditando ghost listeners (memória crescendo após desconexão)
|
|
15
|
-
- Você está revisando código que faz `socket.on('event', ...)` sem cleanup
|
|
16
|
-
|
|
17
|
-
## Arquitetura recomendada
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
┌─────────────────────────────────────────────────────────┐
|
|
21
|
-
│ Event Registry │
|
|
22
|
-
│ - Tipos de evento com schema JSON │
|
|
23
|
-
│ - Versionamento (v1, v2…) │
|
|
24
|
-
│ - Autorização por evento │
|
|
25
|
-
└─────────────────────────────────────────────────────────┘
|
|
26
|
-
↓
|
|
27
|
-
┌─────────────────────────────────────────────────────────┐
|
|
28
|
-
│ Subscription Manager │
|
|
29
|
-
│ - Map<connection_id, Set<event_type>> │
|
|
30
|
-
│ - Cleanup garantido on disconnect │
|
|
31
|
-
└─────────────────────────────────────────────────────────┘
|
|
32
|
-
↓
|
|
33
|
-
┌─────────────────────────────────────────────────────────┐
|
|
34
|
-
│ Reconnect Strategy │
|
|
35
|
-
│ - Exponential backoff (1s, 2s, 4s, 8s, max 30s) │
|
|
36
|
-
│ - Jitter para evitar thundering herd │
|
|
37
|
-
│ - Resync de estado após reconectar │
|
|
38
|
-
└─────────────────────────────────────────────────────────┘
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Os 4 pilares
|
|
42
|
-
|
|
43
|
-
### 1. Schema validation de eventos
|
|
44
|
-
|
|
45
|
-
Todo evento WebSocket/SSE tem schema JSON:
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
// event_registry.ts
|
|
49
|
-
const events = {
|
|
50
|
-
'user.created.v1': z.object({
|
|
51
|
-
id: z.string().uuid(),
|
|
52
|
-
email: z.string().email(),
|
|
53
|
-
createdAt: z.string().datetime(),
|
|
54
|
-
}),
|
|
55
|
-
'message.sent.v1': z.object({
|
|
56
|
-
conversationId: z.string().uuid(),
|
|
57
|
-
senderId: z.string().uuid(),
|
|
58
|
-
body: z.string().max(2000),
|
|
59
|
-
sentAt: z.string().datetime(),
|
|
60
|
-
}),
|
|
61
|
-
};
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Server valida antes de emitir, client valida antes de processar. Evento inválido = log + drop.
|
|
65
|
-
|
|
66
|
-
### 2. Registro central de tipos
|
|
67
|
-
|
|
68
|
-
Um único `event_registry.ts/py/rs` lista todos os event types. Adicionar evento novo passa por PR explícito. Versionamento via sufixo (`.v1`, `.v2`).
|
|
69
|
-
|
|
70
|
-
### 3. Reconexão com exponential backoff
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
class ReconnectStrategy {
|
|
74
|
-
private attempt = 0;
|
|
75
|
-
next(): number {
|
|
76
|
-
const base = Math.min(1000 * 2 ** this.attempt, 30_000);
|
|
77
|
-
const jitter = Math.random() * 1000;
|
|
78
|
-
this.attempt++;
|
|
79
|
-
return base + jitter;
|
|
80
|
-
}
|
|
81
|
-
reset() { this.attempt = 0; }
|
|
82
|
-
}
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
Após reconectar, **resync de estado** — buscar eventos perdidos via REST ou pedir snapshot via WS.
|
|
86
|
-
|
|
87
|
-
### 4. Subscription manager (zero ghost listeners)
|
|
88
|
-
|
|
89
|
-
Cada subscription rastreada em map, com cleanup automático:
|
|
90
|
-
|
|
91
|
-
```typescript
|
|
92
|
-
class SubscriptionManager {
|
|
93
|
-
private subs = new Map<string, Set<string>>(); // connectionId → events
|
|
94
|
-
|
|
95
|
-
subscribe(connId: string, event: string) {
|
|
96
|
-
if (!this.subs.has(connId)) this.subs.set(connId, new Set());
|
|
97
|
-
this.subs.get(connId)!.add(event);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
unsubscribeAll(connId: string) {
|
|
101
|
-
this.subs.delete(connId);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Forçar limpeza on disconnect — SEMPRE
|
|
105
|
-
onDisconnect(connId: string) {
|
|
106
|
-
this.unsubscribeAll(connId);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## Métricas obrigatórias
|
|
112
|
-
|
|
113
|
-
| ID | Métrica | Como medir |
|
|
114
|
-
|---|---|---|
|
|
115
|
-
| M-01 | 100% de event types com JSON Schema definido | grep no registry |
|
|
116
|
-
| M-02 | 100% de subscriptions autorizadas | verificar `authorize()` antes de `subscribe()` |
|
|
117
|
-
| M-03 | 0 ghost listeners após desconexão | métrica `subs.size` por conexão = 0 após disconnect |
|
|
118
|
-
| M-04 | Estratégia de reconexão configurada | grep por `ReconnectStrategy` ou similar |
|
|
119
|
-
|
|
120
|
-
## Antipatterns
|
|
121
|
-
|
|
122
|
-
| AP | Antipattern | Sinal | Correção |
|
|
123
|
-
|---|---|---|---|
|
|
124
|
-
| AP-01 | Evento sem schema | `socket.emit('foo', anything)` | Adicionar schema no registry |
|
|
125
|
-
| AP-02 | `socket.on(...)` sem cleanup | listener fica vivo após disconnect | Usar SubscriptionManager |
|
|
126
|
-
| AP-03 | Reconexão sem backoff | reconecta imediatamente em loop | Exponential backoff + jitter |
|
|
127
|
-
| AP-04 | Sem autorização de subscription | usuário ouve eventos de outro tenant | `authorize(user, event)` antes de `subscribe()` |
|
|
128
|
-
| AP-05 | Broadcast sem filtro | `io.emit()` para todos | Use rooms / channels por tenant |
|
|
129
|
-
| AP-06 | Estado não recuperado após reconectar | UI mostra dados stale | Resync via REST ou snapshot |
|
|
130
|
-
|
|
131
|
-
## Como aplicar
|
|
132
|
-
|
|
133
|
-
### Passo 1: Criar event registry
|
|
134
|
-
|
|
135
|
-
```typescript
|
|
136
|
-
// src/realtime/event_registry.ts
|
|
137
|
-
export const EventRegistry = {
|
|
138
|
-
'user.created.v1': { schema: UserCreatedSchema, requires: 'admin' },
|
|
139
|
-
'message.sent.v1': { schema: MessageSentSchema, requires: 'participant' },
|
|
140
|
-
};
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### Passo 2: Implementar subscription manager
|
|
144
|
-
|
|
145
|
-
Use `packages/skills/dare-realtime/subscription_manager.ts` como template. Garante cleanup on disconnect.
|
|
146
|
-
|
|
147
|
-
### Passo 3: Configurar reconexão no client
|
|
148
|
-
|
|
149
|
-
```typescript
|
|
150
|
-
const strategy = new ReconnectStrategy({ base: 1000, max: 30_000 });
|
|
151
|
-
socket.on('disconnect', () => {
|
|
152
|
-
setTimeout(() => socket.connect(), strategy.next());
|
|
153
|
-
});
|
|
154
|
-
socket.on('connect', () => {
|
|
155
|
-
strategy.reset();
|
|
156
|
-
resyncState(); // fetch via REST eventos perdidos
|
|
157
|
-
});
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
### Passo 4: Adicionar autorização
|
|
161
|
-
|
|
162
|
-
```typescript
|
|
163
|
-
socket.on('subscribe', (eventType) => {
|
|
164
|
-
if (!authorize(socket.user, eventType)) {
|
|
165
|
-
socket.emit('error', { code: 'FORBIDDEN' });
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
subscriptionManager.subscribe(socket.id, eventType);
|
|
169
|
-
});
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### Passo 5: Validar eventos no client e server
|
|
173
|
-
|
|
174
|
-
Server antes de emitir:
|
|
175
|
-
```typescript
|
|
176
|
-
const schema = EventRegistry[eventType].schema;
|
|
177
|
-
const valid = schema.safeParse(payload);
|
|
178
|
-
if (!valid.success) { log.error(...); return; }
|
|
179
|
-
io.to(room).emit(eventType, valid.data);
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
Client antes de processar:
|
|
183
|
-
```typescript
|
|
184
|
-
socket.on(eventType, (payload) => {
|
|
185
|
-
const valid = EventRegistry[eventType].schema.safeParse(payload);
|
|
186
|
-
if (!valid.success) { log.warn(...); return; }
|
|
187
|
-
handleEvent(valid.data);
|
|
188
|
-
});
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
## Boas práticas
|
|
192
|
-
|
|
193
|
-
1. **WebSocket vs SSE** — SSE para server→client unidirecional (logs, métricas). WS para bidirectional (chat).
|
|
194
|
-
2. **Rooms/channels por tenant** — evita broadcast cross-tenant
|
|
195
|
-
3. **Heartbeat / ping-pong** — detectar conexão zumbi (network OK mas peer não responde)
|
|
196
|
-
4. **Backpressure** — se client lento, fila no server explode. Drop eventos antigos ou aplicar rate limit.
|
|
197
|
-
5. **Replay limitado** — guardar últimos N eventos por room para reconexão recente, não histórico completo
|
|
198
|
-
|
|
199
|
-
## Stack recomendada
|
|
200
|
-
|
|
201
|
-
| Stack | WebSocket | SSE |
|
|
202
|
-
|---|---|---|
|
|
203
|
-
| Node | `socket.io`, `ws` | `eventsource` (client) + endpoint custom |
|
|
204
|
-
| Rails | Action Cable | Rack streaming |
|
|
205
|
-
| Rust/Axum | `tokio-tungstenite`, `axum` ws | `axum::sse::Sse` |
|
|
206
|
-
| FastAPI | `fastapi.WebSocket` | `EventSourceResponse` |
|
|
207
|
-
| Go | `gorilla/websocket`, `melody` | stdlib `http.Flusher` |
|
|
208
|
-
|
|
209
|
-
## Dicas
|
|
210
|
-
|
|
211
|
-
- **Leia** `docs/design/skills/dare-realtime/DESIGN.md`
|
|
212
|
-
- **Combine** com `dare-security` para autorização
|
|
213
|
-
- **Use** os templates em `packages/skills/dare-realtime/`
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
Esta skill é parte do DARE Method e está sob licença MIT.
|
|
1
|
+
---
|
|
2
|
+
name: dare-realtime
|
|
3
|
+
description: Comunicação real-time (WebSocket, SSE) em projetos DARE. Fornece schema validation de eventos, registro central de tipos, reconexão com exponential backoff, e gerenciamento de subscriptions com limpeza garantida (zero ghost listeners).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Realtime Skill
|
|
7
|
+
|
|
8
|
+
Você é um especialista em comunicação real-time. Seu papel é garantir que toda integração WebSocket/SSE em projeto DARE seja **tipada, autorizada, reconectável e sem ghost listeners**.
|
|
9
|
+
|
|
10
|
+
## Quando usar esta skill
|
|
11
|
+
|
|
12
|
+
- Projeto precisa de WebSocket (chat, notifications, live updates)
|
|
13
|
+
- Projeto precisa de SSE (logs streaming, métricas em tempo real)
|
|
14
|
+
- Você está auditando ghost listeners (memória crescendo após desconexão)
|
|
15
|
+
- Você está revisando código que faz `socket.on('event', ...)` sem cleanup
|
|
16
|
+
|
|
17
|
+
## Arquitetura recomendada
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌─────────────────────────────────────────────────────────┐
|
|
21
|
+
│ Event Registry │
|
|
22
|
+
│ - Tipos de evento com schema JSON │
|
|
23
|
+
│ - Versionamento (v1, v2…) │
|
|
24
|
+
│ - Autorização por evento │
|
|
25
|
+
└─────────────────────────────────────────────────────────┘
|
|
26
|
+
↓
|
|
27
|
+
┌─────────────────────────────────────────────────────────┐
|
|
28
|
+
│ Subscription Manager │
|
|
29
|
+
│ - Map<connection_id, Set<event_type>> │
|
|
30
|
+
│ - Cleanup garantido on disconnect │
|
|
31
|
+
└─────────────────────────────────────────────────────────┘
|
|
32
|
+
↓
|
|
33
|
+
┌─────────────────────────────────────────────────────────┐
|
|
34
|
+
│ Reconnect Strategy │
|
|
35
|
+
│ - Exponential backoff (1s, 2s, 4s, 8s, max 30s) │
|
|
36
|
+
│ - Jitter para evitar thundering herd │
|
|
37
|
+
│ - Resync de estado após reconectar │
|
|
38
|
+
└─────────────────────────────────────────────────────────┘
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Os 4 pilares
|
|
42
|
+
|
|
43
|
+
### 1. Schema validation de eventos
|
|
44
|
+
|
|
45
|
+
Todo evento WebSocket/SSE tem schema JSON:
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// event_registry.ts
|
|
49
|
+
const events = {
|
|
50
|
+
'user.created.v1': z.object({
|
|
51
|
+
id: z.string().uuid(),
|
|
52
|
+
email: z.string().email(),
|
|
53
|
+
createdAt: z.string().datetime(),
|
|
54
|
+
}),
|
|
55
|
+
'message.sent.v1': z.object({
|
|
56
|
+
conversationId: z.string().uuid(),
|
|
57
|
+
senderId: z.string().uuid(),
|
|
58
|
+
body: z.string().max(2000),
|
|
59
|
+
sentAt: z.string().datetime(),
|
|
60
|
+
}),
|
|
61
|
+
};
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Server valida antes de emitir, client valida antes de processar. Evento inválido = log + drop.
|
|
65
|
+
|
|
66
|
+
### 2. Registro central de tipos
|
|
67
|
+
|
|
68
|
+
Um único `event_registry.ts/py/rs` lista todos os event types. Adicionar evento novo passa por PR explícito. Versionamento via sufixo (`.v1`, `.v2`).
|
|
69
|
+
|
|
70
|
+
### 3. Reconexão com exponential backoff
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
class ReconnectStrategy {
|
|
74
|
+
private attempt = 0;
|
|
75
|
+
next(): number {
|
|
76
|
+
const base = Math.min(1000 * 2 ** this.attempt, 30_000);
|
|
77
|
+
const jitter = Math.random() * 1000;
|
|
78
|
+
this.attempt++;
|
|
79
|
+
return base + jitter;
|
|
80
|
+
}
|
|
81
|
+
reset() { this.attempt = 0; }
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Após reconectar, **resync de estado** — buscar eventos perdidos via REST ou pedir snapshot via WS.
|
|
86
|
+
|
|
87
|
+
### 4. Subscription manager (zero ghost listeners)
|
|
88
|
+
|
|
89
|
+
Cada subscription rastreada em map, com cleanup automático:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
class SubscriptionManager {
|
|
93
|
+
private subs = new Map<string, Set<string>>(); // connectionId → events
|
|
94
|
+
|
|
95
|
+
subscribe(connId: string, event: string) {
|
|
96
|
+
if (!this.subs.has(connId)) this.subs.set(connId, new Set());
|
|
97
|
+
this.subs.get(connId)!.add(event);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
unsubscribeAll(connId: string) {
|
|
101
|
+
this.subs.delete(connId);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Forçar limpeza on disconnect — SEMPRE
|
|
105
|
+
onDisconnect(connId: string) {
|
|
106
|
+
this.unsubscribeAll(connId);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Métricas obrigatórias
|
|
112
|
+
|
|
113
|
+
| ID | Métrica | Como medir |
|
|
114
|
+
|---|---|---|
|
|
115
|
+
| M-01 | 100% de event types com JSON Schema definido | grep no registry |
|
|
116
|
+
| M-02 | 100% de subscriptions autorizadas | verificar `authorize()` antes de `subscribe()` |
|
|
117
|
+
| M-03 | 0 ghost listeners após desconexão | métrica `subs.size` por conexão = 0 após disconnect |
|
|
118
|
+
| M-04 | Estratégia de reconexão configurada | grep por `ReconnectStrategy` ou similar |
|
|
119
|
+
|
|
120
|
+
## Antipatterns
|
|
121
|
+
|
|
122
|
+
| AP | Antipattern | Sinal | Correção |
|
|
123
|
+
|---|---|---|---|
|
|
124
|
+
| AP-01 | Evento sem schema | `socket.emit('foo', anything)` | Adicionar schema no registry |
|
|
125
|
+
| AP-02 | `socket.on(...)` sem cleanup | listener fica vivo após disconnect | Usar SubscriptionManager |
|
|
126
|
+
| AP-03 | Reconexão sem backoff | reconecta imediatamente em loop | Exponential backoff + jitter |
|
|
127
|
+
| AP-04 | Sem autorização de subscription | usuário ouve eventos de outro tenant | `authorize(user, event)` antes de `subscribe()` |
|
|
128
|
+
| AP-05 | Broadcast sem filtro | `io.emit()` para todos | Use rooms / channels por tenant |
|
|
129
|
+
| AP-06 | Estado não recuperado após reconectar | UI mostra dados stale | Resync via REST ou snapshot |
|
|
130
|
+
|
|
131
|
+
## Como aplicar
|
|
132
|
+
|
|
133
|
+
### Passo 1: Criar event registry
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
// src/realtime/event_registry.ts
|
|
137
|
+
export const EventRegistry = {
|
|
138
|
+
'user.created.v1': { schema: UserCreatedSchema, requires: 'admin' },
|
|
139
|
+
'message.sent.v1': { schema: MessageSentSchema, requires: 'participant' },
|
|
140
|
+
};
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Passo 2: Implementar subscription manager
|
|
144
|
+
|
|
145
|
+
Use `packages/skills/dare-realtime/subscription_manager.ts` como template. Garante cleanup on disconnect.
|
|
146
|
+
|
|
147
|
+
### Passo 3: Configurar reconexão no client
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
const strategy = new ReconnectStrategy({ base: 1000, max: 30_000 });
|
|
151
|
+
socket.on('disconnect', () => {
|
|
152
|
+
setTimeout(() => socket.connect(), strategy.next());
|
|
153
|
+
});
|
|
154
|
+
socket.on('connect', () => {
|
|
155
|
+
strategy.reset();
|
|
156
|
+
resyncState(); // fetch via REST eventos perdidos
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Passo 4: Adicionar autorização
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
socket.on('subscribe', (eventType) => {
|
|
164
|
+
if (!authorize(socket.user, eventType)) {
|
|
165
|
+
socket.emit('error', { code: 'FORBIDDEN' });
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
subscriptionManager.subscribe(socket.id, eventType);
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Passo 5: Validar eventos no client e server
|
|
173
|
+
|
|
174
|
+
Server antes de emitir:
|
|
175
|
+
```typescript
|
|
176
|
+
const schema = EventRegistry[eventType].schema;
|
|
177
|
+
const valid = schema.safeParse(payload);
|
|
178
|
+
if (!valid.success) { log.error(...); return; }
|
|
179
|
+
io.to(room).emit(eventType, valid.data);
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Client antes de processar:
|
|
183
|
+
```typescript
|
|
184
|
+
socket.on(eventType, (payload) => {
|
|
185
|
+
const valid = EventRegistry[eventType].schema.safeParse(payload);
|
|
186
|
+
if (!valid.success) { log.warn(...); return; }
|
|
187
|
+
handleEvent(valid.data);
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Boas práticas
|
|
192
|
+
|
|
193
|
+
1. **WebSocket vs SSE** — SSE para server→client unidirecional (logs, métricas). WS para bidirectional (chat).
|
|
194
|
+
2. **Rooms/channels por tenant** — evita broadcast cross-tenant
|
|
195
|
+
3. **Heartbeat / ping-pong** — detectar conexão zumbi (network OK mas peer não responde)
|
|
196
|
+
4. **Backpressure** — se client lento, fila no server explode. Drop eventos antigos ou aplicar rate limit.
|
|
197
|
+
5. **Replay limitado** — guardar últimos N eventos por room para reconexão recente, não histórico completo
|
|
198
|
+
|
|
199
|
+
## Stack recomendada
|
|
200
|
+
|
|
201
|
+
| Stack | WebSocket | SSE |
|
|
202
|
+
|---|---|---|
|
|
203
|
+
| Node | `socket.io`, `ws` | `eventsource` (client) + endpoint custom |
|
|
204
|
+
| Rails | Action Cable | Rack streaming |
|
|
205
|
+
| Rust/Axum | `tokio-tungstenite`, `axum` ws | `axum::sse::Sse` |
|
|
206
|
+
| FastAPI | `fastapi.WebSocket` | `EventSourceResponse` |
|
|
207
|
+
| Go | `gorilla/websocket`, `melody` | stdlib `http.Flusher` |
|
|
208
|
+
|
|
209
|
+
## Dicas
|
|
210
|
+
|
|
211
|
+
- **Leia** `docs/design/skills/dare-realtime/DESIGN.md`
|
|
212
|
+
- **Combine** com `dare-security` para autorização
|
|
213
|
+
- **Use** os templates em `packages/skills/dare-realtime/`
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
Esta skill é parte do DARE Method e está sob licença MIT.
|
|
@@ -1,114 +1,114 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: dare-refine
|
|
3
|
-
description: Analisa complexidade de uma task DARE e, quando alta, quebra em sub-tasks menores. Use após gerar o DAG (para tasks HIGH/CRITICAL), quando o dev pedir refinamento manual, ou quando o escopo mudou e uma task ficou grande. Combina heurística determinística (CLI) com decisão semântica do agente.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# DARE Refine Skill
|
|
7
|
-
|
|
8
|
-
Você é o refinador de tasks do método DARE. Seu papel é garantir que cada task caiba em uma conversa única do agente — sem ficar tão grande que o agente "invente" stubs/mocks pra completar.
|
|
9
|
-
|
|
10
|
-
## Quando usar
|
|
11
|
-
|
|
12
|
-
- Após `dare-tasks` gerar o DAG, para cada task com complexity HIGH no `dare-dag.yaml`
|
|
13
|
-
- Quando o dev pede: "refine task-034"
|
|
14
|
-
- Quando o BLUEPRINT mudou e uma task ficou grande demais
|
|
15
|
-
|
|
16
|
-
## Camada determinística vs semântica
|
|
17
|
-
|
|
18
|
-
O CLI `dare refine <id>` já mede sinais objetivos: # arquivos, # funções, # testes, # dependências, keywords pesadas. Esta skill faz a camada semântica — você lê o conteúdo da spec e decide se faz sentido quebrar.
|
|
19
|
-
|
|
20
|
-
## Como executar
|
|
21
|
-
|
|
22
|
-
### Passo 1: Rodar a heurística determinística
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
dare refine <task-id> --split --format json > .dare/refine-<task-id>.json
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
JSON traz:
|
|
29
|
-
- `report.score`, `report.level`
|
|
30
|
-
- `report.signals` — explica a pontuação
|
|
31
|
-
- `report.recommendsSplit` — true se HIGH/CRITICAL
|
|
32
|
-
- `proposal.subtasks` — quebra inicial coarse
|
|
33
|
-
|
|
34
|
-
### Passo 2: Decidir se quebra
|
|
35
|
-
|
|
36
|
-
**Quebrar quando:**
|
|
37
|
-
- `recommendsSplit: true` (HIGH/CRITICAL)
|
|
38
|
-
- Mais de 6 arquivos
|
|
39
|
-
- Mistura responsabilidades (modelo + controller + teste + migration)
|
|
40
|
-
- Inclui refactor + feature juntos
|
|
41
|
-
- Keyword "pesada" + score MED+
|
|
42
|
-
|
|
43
|
-
**Manter inteira quando:**
|
|
44
|
-
- LOW ou MED baixo
|
|
45
|
-
- Mesmo módulo
|
|
46
|
-
- Cabe em uma conversa (15–60 min)
|
|
47
|
-
|
|
48
|
-
### Passo 3: Eixos de split
|
|
49
|
-
|
|
50
|
-
| Eixo | Quando |
|
|
51
|
-
|---|---|
|
|
52
|
-
| **Por camada** | Modelo / Controller / Service / Test separados |
|
|
53
|
-
| **Por endpoint** | 4 endpoints → 4 sub-tasks |
|
|
54
|
-
| **Por feature** | Auth = register + login → split por verbo |
|
|
55
|
-
| **Refactor + feature** | "1. refactor" + "2. feature em cima" |
|
|
56
|
-
| **Migration + código** | "1. migration" + "2. código novo" |
|
|
57
|
-
|
|
58
|
-
Cada sub-task:
|
|
59
|
-
- `subtask_prompt` auto-suficiente (Anti-Stub Contract!)
|
|
60
|
-
- Spec própria em `DARE/EXECUTION/<sub-id>.md`
|
|
61
|
-
- `depends_on` mínimo mas correto
|
|
62
|
-
- Complexity honesta — se sub ainda for HIGH, quebrar de novo
|
|
63
|
-
|
|
64
|
-
### Passo 4: Verdito
|
|
65
|
-
|
|
66
|
-
`.dare/refine-verdict-<task-id>.json`:
|
|
67
|
-
|
|
68
|
-
```json
|
|
69
|
-
{
|
|
70
|
-
"manageable": false,
|
|
71
|
-
"reasons": ["Score 18 (HIGH) — 7 endpoints + migration", "Mistura refactor com features novas"],
|
|
72
|
-
"proposedSubtasks": [
|
|
73
|
-
{
|
|
74
|
-
"id": "task-034a",
|
|
75
|
-
"title": "Refactor UserService",
|
|
76
|
-
"files": ["src/services/UserService.ts", "tests/services/UserService.test.ts"],
|
|
77
|
-
"rationale": "Refactor isolado antes da feature",
|
|
78
|
-
"estimatedLevel": "MED"
|
|
79
|
-
}
|
|
80
|
-
]
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Manuseável:
|
|
85
|
-
|
|
86
|
-
```json
|
|
87
|
-
{
|
|
88
|
-
"manageable": true,
|
|
89
|
-
"reasons": ["Score 7 (MED), 4 arquivos mesmo módulo"]
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Passo 5: Aplicar o split
|
|
94
|
-
|
|
95
|
-
1. Editar `DARE/dare-dag.yaml` substituindo a task pelas sub-tasks
|
|
96
|
-
2. Criar specs em `DARE/EXECUTION/<sub-id>.md` (template + Anti-Stub Contract)
|
|
97
|
-
3. Atualizar `DARE/TASKS.md` (visão humana)
|
|
98
|
-
4. Regenerar Mermaid: `dare dag viz -o DARE/dag-graph.mmd`
|
|
99
|
-
5. Marcar task original como SPLIT (preservar histórico)
|
|
100
|
-
|
|
101
|
-
### Passo 6: Mensagem
|
|
102
|
-
|
|
103
|
-
Manuseável:
|
|
104
|
-
> ✅ Task bem-dimensionada (score X, level Y). Sem split.
|
|
105
|
-
|
|
106
|
-
Quebrada:
|
|
107
|
-
> 🪓 Task quebrada em N sub-tasks: [lista]. Revise com `dare validate` e `dare dag viz`.
|
|
108
|
-
|
|
109
|
-
## Regras inegociáveis
|
|
110
|
-
|
|
111
|
-
- Não quebrar tasks LOW
|
|
112
|
-
- Não inventar dependências falsas
|
|
113
|
-
- Cada sub-task testável independentemente
|
|
114
|
-
- Anti-Stub Contract aplica em cada sub-task
|
|
1
|
+
---
|
|
2
|
+
name: dare-refine
|
|
3
|
+
description: Analisa complexidade de uma task DARE e, quando alta, quebra em sub-tasks menores. Use após gerar o DAG (para tasks HIGH/CRITICAL), quando o dev pedir refinamento manual, ou quando o escopo mudou e uma task ficou grande. Combina heurística determinística (CLI) com decisão semântica do agente.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Refine Skill
|
|
7
|
+
|
|
8
|
+
Você é o refinador de tasks do método DARE. Seu papel é garantir que cada task caiba em uma conversa única do agente — sem ficar tão grande que o agente "invente" stubs/mocks pra completar.
|
|
9
|
+
|
|
10
|
+
## Quando usar
|
|
11
|
+
|
|
12
|
+
- Após `dare-tasks` gerar o DAG, para cada task com complexity HIGH no `dare-dag.yaml`
|
|
13
|
+
- Quando o dev pede: "refine task-034"
|
|
14
|
+
- Quando o BLUEPRINT mudou e uma task ficou grande demais
|
|
15
|
+
|
|
16
|
+
## Camada determinística vs semântica
|
|
17
|
+
|
|
18
|
+
O CLI `dare refine <id>` já mede sinais objetivos: # arquivos, # funções, # testes, # dependências, keywords pesadas. Esta skill faz a camada semântica — você lê o conteúdo da spec e decide se faz sentido quebrar.
|
|
19
|
+
|
|
20
|
+
## Como executar
|
|
21
|
+
|
|
22
|
+
### Passo 1: Rodar a heurística determinística
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
dare refine <task-id> --split --format json > .dare/refine-<task-id>.json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
JSON traz:
|
|
29
|
+
- `report.score`, `report.level`
|
|
30
|
+
- `report.signals` — explica a pontuação
|
|
31
|
+
- `report.recommendsSplit` — true se HIGH/CRITICAL
|
|
32
|
+
- `proposal.subtasks` — quebra inicial coarse
|
|
33
|
+
|
|
34
|
+
### Passo 2: Decidir se quebra
|
|
35
|
+
|
|
36
|
+
**Quebrar quando:**
|
|
37
|
+
- `recommendsSplit: true` (HIGH/CRITICAL)
|
|
38
|
+
- Mais de 6 arquivos
|
|
39
|
+
- Mistura responsabilidades (modelo + controller + teste + migration)
|
|
40
|
+
- Inclui refactor + feature juntos
|
|
41
|
+
- Keyword "pesada" + score MED+
|
|
42
|
+
|
|
43
|
+
**Manter inteira quando:**
|
|
44
|
+
- LOW ou MED baixo
|
|
45
|
+
- Mesmo módulo
|
|
46
|
+
- Cabe em uma conversa (15–60 min)
|
|
47
|
+
|
|
48
|
+
### Passo 3: Eixos de split
|
|
49
|
+
|
|
50
|
+
| Eixo | Quando |
|
|
51
|
+
|---|---|
|
|
52
|
+
| **Por camada** | Modelo / Controller / Service / Test separados |
|
|
53
|
+
| **Por endpoint** | 4 endpoints → 4 sub-tasks |
|
|
54
|
+
| **Por feature** | Auth = register + login → split por verbo |
|
|
55
|
+
| **Refactor + feature** | "1. refactor" + "2. feature em cima" |
|
|
56
|
+
| **Migration + código** | "1. migration" + "2. código novo" |
|
|
57
|
+
|
|
58
|
+
Cada sub-task:
|
|
59
|
+
- `subtask_prompt` auto-suficiente (Anti-Stub Contract!)
|
|
60
|
+
- Spec própria em `DARE/EXECUTION/<sub-id>.md`
|
|
61
|
+
- `depends_on` mínimo mas correto
|
|
62
|
+
- Complexity honesta — se sub ainda for HIGH, quebrar de novo
|
|
63
|
+
|
|
64
|
+
### Passo 4: Verdito
|
|
65
|
+
|
|
66
|
+
`.dare/refine-verdict-<task-id>.json`:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"manageable": false,
|
|
71
|
+
"reasons": ["Score 18 (HIGH) — 7 endpoints + migration", "Mistura refactor com features novas"],
|
|
72
|
+
"proposedSubtasks": [
|
|
73
|
+
{
|
|
74
|
+
"id": "task-034a",
|
|
75
|
+
"title": "Refactor UserService",
|
|
76
|
+
"files": ["src/services/UserService.ts", "tests/services/UserService.test.ts"],
|
|
77
|
+
"rationale": "Refactor isolado antes da feature",
|
|
78
|
+
"estimatedLevel": "MED"
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Manuseável:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"manageable": true,
|
|
89
|
+
"reasons": ["Score 7 (MED), 4 arquivos mesmo módulo"]
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Passo 5: Aplicar o split
|
|
94
|
+
|
|
95
|
+
1. Editar `DARE/dare-dag.yaml` substituindo a task pelas sub-tasks
|
|
96
|
+
2. Criar specs em `DARE/EXECUTION/<sub-id>.md` (template + Anti-Stub Contract)
|
|
97
|
+
3. Atualizar `DARE/TASKS.md` (visão humana)
|
|
98
|
+
4. Regenerar Mermaid: `dare dag viz -o DARE/dag-graph.mmd`
|
|
99
|
+
5. Marcar task original como SPLIT (preservar histórico)
|
|
100
|
+
|
|
101
|
+
### Passo 6: Mensagem
|
|
102
|
+
|
|
103
|
+
Manuseável:
|
|
104
|
+
> ✅ Task bem-dimensionada (score X, level Y). Sem split.
|
|
105
|
+
|
|
106
|
+
Quebrada:
|
|
107
|
+
> 🪓 Task quebrada em N sub-tasks: [lista]. Revise com `dare validate` e `dare dag viz`.
|
|
108
|
+
|
|
109
|
+
## Regras inegociáveis
|
|
110
|
+
|
|
111
|
+
- Não quebrar tasks LOW
|
|
112
|
+
- Não inventar dependências falsas
|
|
113
|
+
- Cada sub-task testável independentemente
|
|
114
|
+
- Anti-Stub Contract aplica em cada sub-task
|