@dewtech/dare-cli 2.16.0 → 3.0.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/README.md +196 -3
- package/dist/__tests__/confidence.test.d.ts +2 -0
- package/dist/__tests__/confidence.test.d.ts.map +1 -0
- package/dist/__tests__/confidence.test.js +73 -0
- package/dist/__tests__/confidence.test.js.map +1 -0
- package/dist/__tests__/datamodel.test.d.ts +2 -0
- package/dist/__tests__/datamodel.test.d.ts.map +1 -0
- package/dist/__tests__/datamodel.test.js +131 -0
- package/dist/__tests__/datamodel.test.js.map +1 -0
- package/dist/__tests__/dna-detector.test.d.ts +2 -0
- package/dist/__tests__/dna-detector.test.d.ts.map +1 -0
- package/dist/__tests__/dna-detector.test.js +97 -0
- package/dist/__tests__/dna-detector.test.js.map +1 -0
- package/dist/__tests__/dna-facts.test.d.ts +2 -0
- package/dist/__tests__/dna-facts.test.d.ts.map +1 -0
- package/dist/__tests__/dna-facts.test.js +44 -0
- package/dist/__tests__/dna-facts.test.js.map +1 -0
- package/dist/__tests__/graph-renderer.test.d.ts +2 -0
- package/dist/__tests__/graph-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/graph-renderer.test.js +85 -0
- package/dist/__tests__/graph-renderer.test.js.map +1 -0
- package/dist/__tests__/migration.test.d.ts +2 -0
- package/dist/__tests__/migration.test.d.ts.map +1 -0
- package/dist/__tests__/migration.test.js +77 -0
- package/dist/__tests__/migration.test.js.map +1 -0
- package/dist/__tests__/module-detector.test.d.ts +2 -0
- package/dist/__tests__/module-detector.test.d.ts.map +1 -0
- package/dist/__tests__/module-detector.test.js +83 -0
- package/dist/__tests__/module-detector.test.js.map +1 -0
- package/dist/__tests__/refine.test.d.ts +2 -0
- package/dist/__tests__/refine.test.d.ts.map +1 -0
- package/dist/__tests__/refine.test.js +186 -0
- package/dist/__tests__/refine.test.js.map +1 -0
- package/dist/__tests__/reverse-facts.test.d.ts +2 -0
- package/dist/__tests__/reverse-facts.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-facts.test.js +78 -0
- package/dist/__tests__/reverse-facts.test.js.map +1 -0
- package/dist/__tests__/review.test.d.ts +2 -0
- package/dist/__tests__/review.test.d.ts.map +1 -0
- package/dist/__tests__/review.test.js +242 -0
- package/dist/__tests__/review.test.js.map +1 -0
- package/dist/__tests__/update.test.d.ts +2 -0
- package/dist/__tests__/update.test.d.ts.map +1 -0
- package/dist/__tests__/update.test.js +150 -0
- package/dist/__tests__/update.test.js.map +1 -0
- package/dist/__tests__/validate.test.js +65 -65
- package/dist/bin/dare.js +38 -3
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/blueprint.js +122 -122
- package/dist/commands/dag.d.ts.map +1 -1
- package/dist/commands/dag.js +43 -79
- package/dist/commands/dag.js.map +1 -1
- package/dist/commands/dna.d.ts +3 -0
- package/dist/commands/dna.d.ts.map +1 -0
- package/dist/commands/dna.js +69 -0
- package/dist/commands/dna.js.map +1 -0
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +76 -0
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +101 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +16 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +103 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/refine.d.ts +16 -0
- package/dist/commands/refine.d.ts.map +1 -0
- package/dist/commands/refine.js +167 -0
- package/dist/commands/refine.js.map +1 -0
- package/dist/commands/reverse.d.ts +3 -0
- package/dist/commands/reverse.d.ts.map +1 -0
- package/dist/commands/reverse.js +201 -0
- package/dist/commands/reverse.js.map +1 -0
- package/dist/commands/review.d.ts +16 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +106 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/update.d.ts +13 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +149 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/welcome.d.ts +14 -0
- package/dist/commands/welcome.d.ts.map +1 -0
- package/dist/commands/welcome.js +29 -0
- package/dist/commands/welcome.js.map +1 -0
- package/dist/skills/commands/add.d.ts +23 -0
- package/dist/skills/commands/add.d.ts.map +1 -0
- package/dist/skills/commands/add.js +206 -0
- package/dist/skills/commands/add.js.map +1 -0
- package/dist/skills/commands/info.d.ts +14 -0
- package/dist/skills/commands/info.d.ts.map +1 -0
- package/dist/skills/commands/info.js +99 -0
- package/dist/skills/commands/info.js.map +1 -0
- package/dist/skills/commands/list.d.ts +19 -0
- package/dist/skills/commands/list.d.ts.map +1 -0
- package/dist/skills/commands/list.js +163 -0
- package/dist/skills/commands/list.js.map +1 -0
- package/dist/skills/commands/publish.d.ts +56 -0
- package/dist/skills/commands/publish.d.ts.map +1 -0
- package/dist/skills/commands/publish.js +272 -0
- package/dist/skills/commands/publish.js.map +1 -0
- package/dist/skills/commands/remove.d.ts +19 -0
- package/dist/skills/commands/remove.d.ts.map +1 -0
- package/dist/skills/commands/remove.js +96 -0
- package/dist/skills/commands/remove.js.map +1 -0
- package/dist/skills/commands/update.d.ts +31 -0
- package/dist/skills/commands/update.d.ts.map +1 -0
- package/dist/skills/commands/update.js +132 -0
- package/dist/skills/commands/update.js.map +1 -0
- package/dist/skills/index.d.ts +22 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +33 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/manifest.d.ts +54 -0
- package/dist/skills/manifest.d.ts.map +1 -0
- package/dist/skills/manifest.js +162 -0
- package/dist/skills/manifest.js.map +1 -0
- package/dist/skills/registry-local.d.ts +67 -0
- package/dist/skills/registry-local.d.ts.map +1 -0
- package/dist/skills/registry-local.js +130 -0
- package/dist/skills/registry-local.js.map +1 -0
- package/dist/skills/registry-mock.json +109 -0
- package/dist/skills/registry-remote.d.ts +110 -0
- package/dist/skills/registry-remote.d.ts.map +1 -0
- package/dist/skills/registry-remote.js +246 -0
- package/dist/skills/registry-remote.js.map +1 -0
- package/dist/skills/registry.d.ts +49 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +94 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/tests/manifest.spec.d.ts +8 -0
- package/dist/skills/tests/manifest.spec.d.ts.map +1 -0
- package/dist/skills/tests/manifest.spec.js +176 -0
- package/dist/skills/tests/manifest.spec.js.map +1 -0
- package/dist/skills/tests/publish.spec.d.ts +12 -0
- package/dist/skills/tests/publish.spec.d.ts.map +1 -0
- package/dist/skills/tests/publish.spec.js +276 -0
- package/dist/skills/tests/publish.spec.js.map +1 -0
- package/dist/skills/tests/registry-local.spec.d.ts +8 -0
- package/dist/skills/tests/registry-local.spec.d.ts.map +1 -0
- package/dist/skills/tests/registry-local.spec.js +231 -0
- package/dist/skills/tests/registry-local.spec.js.map +1 -0
- package/dist/skills/tests/registry.spec.d.ts +7 -0
- package/dist/skills/tests/registry.spec.d.ts.map +1 -0
- package/dist/skills/tests/registry.spec.js +58 -0
- package/dist/skills/tests/registry.spec.js.map +1 -0
- package/dist/skills/tests/remote-registry.spec.d.ts +9 -0
- package/dist/skills/tests/remote-registry.spec.d.ts.map +1 -0
- package/dist/skills/tests/remote-registry.spec.js +357 -0
- package/dist/skills/tests/remote-registry.spec.js.map +1 -0
- package/dist/skills/tests/update.spec.d.ts +9 -0
- package/dist/skills/tests/update.spec.d.ts.map +1 -0
- package/dist/skills/tests/update.spec.js +166 -0
- package/dist/skills/tests/update.spec.js.map +1 -0
- package/dist/types/Refine.types.d.ts +96 -0
- package/dist/types/Refine.types.d.ts.map +1 -0
- package/dist/types/Refine.types.js +19 -0
- package/dist/types/Refine.types.js.map +1 -0
- package/dist/types/Review.types.d.ts +86 -0
- package/dist/types/Review.types.d.ts.map +1 -0
- package/dist/types/Review.types.js +15 -0
- package/dist/types/Review.types.js.map +1 -0
- package/dist/types/UpdateManifest.types.d.ts +91 -0
- package/dist/types/UpdateManifest.types.d.ts.map +1 -0
- package/dist/types/UpdateManifest.types.js +13 -0
- package/dist/types/UpdateManifest.types.js.map +1 -0
- package/dist/utils/ReviewRunner.d.ts +42 -0
- package/dist/utils/ReviewRunner.d.ts.map +1 -0
- package/dist/utils/ReviewRunner.js +175 -0
- package/dist/utils/ReviewRunner.js.map +1 -0
- package/dist/utils/UpdateApplier.d.ts +42 -0
- package/dist/utils/UpdateApplier.d.ts.map +1 -0
- package/dist/utils/UpdateApplier.js +207 -0
- package/dist/utils/UpdateApplier.js.map +1 -0
- package/dist/utils/UpdateDetector.d.ts +56 -0
- package/dist/utils/UpdateDetector.d.ts.map +1 -0
- package/dist/utils/UpdateDetector.js +164 -0
- package/dist/utils/UpdateDetector.js.map +1 -0
- package/dist/utils/banner.d.ts +28 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +77 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/banner.spec.d.ts +5 -0
- package/dist/utils/banner.spec.d.ts.map +1 -0
- package/dist/utils/banner.spec.js +253 -0
- package/dist/utils/banner.spec.js.map +1 -0
- package/dist/utils/complexity-analyzer.d.ts +60 -0
- package/dist/utils/complexity-analyzer.d.ts.map +1 -0
- package/dist/utils/complexity-analyzer.js +292 -0
- package/dist/utils/complexity-analyzer.js.map +1 -0
- package/dist/utils/confidence.d.ts +41 -0
- package/dist/utils/confidence.d.ts.map +1 -0
- package/dist/utils/confidence.js +101 -0
- package/dist/utils/confidence.js.map +1 -0
- package/dist/utils/datamodel.d.ts +41 -0
- package/dist/utils/datamodel.d.ts.map +1 -0
- package/dist/utils/datamodel.js +535 -0
- package/dist/utils/datamodel.js.map +1 -0
- package/dist/utils/dna-detector.d.ts +61 -0
- package/dist/utils/dna-detector.d.ts.map +1 -0
- package/dist/utils/dna-detector.js +354 -0
- package/dist/utils/dna-detector.js.map +1 -0
- package/dist/utils/dna-facts.d.ts +13 -0
- package/dist/utils/dna-facts.d.ts.map +1 -0
- package/dist/utils/dna-facts.js +109 -0
- package/dist/utils/dna-facts.js.map +1 -0
- package/dist/utils/excalidraw-renderer.d.ts +11 -71
- package/dist/utils/excalidraw-renderer.d.ts.map +1 -1
- package/dist/utils/excalidraw-renderer.js +29 -162
- package/dist/utils/excalidraw-renderer.js.map +1 -1
- package/dist/utils/graph-renderer.d.ts +115 -0
- package/dist/utils/graph-renderer.d.ts.map +1 -0
- package/dist/utils/graph-renderer.js +216 -0
- package/dist/utils/graph-renderer.js.map +1 -0
- package/dist/utils/migration.d.ts +64 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +183 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/module-detector.d.ts +46 -0
- package/dist/utils/module-detector.d.ts.map +1 -0
- package/dist/utils/module-detector.js +348 -0
- package/dist/utils/module-detector.js.map +1 -0
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +273 -254
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/reverse-facts.d.ts +50 -0
- package/dist/utils/reverse-facts.d.ts.map +1 -0
- package/dist/utils/reverse-facts.js +291 -0
- package/dist/utils/reverse-facts.js.map +1 -0
- package/dist/utils/stack-bootstrap.js +371 -371
- package/dist/utils/static-analyzer.d.ts +29 -0
- package/dist/utils/static-analyzer.d.ts.map +1 -0
- package/dist/utils/static-analyzer.js +390 -0
- package/dist/utils/static-analyzer.js.map +1 -0
- package/dist/utils/version-compare.d.ts +27 -0
- package/dist/utils/version-compare.d.ts.map +1 -0
- package/dist/utils/version-compare.js +47 -0
- package/dist/utils/version-compare.js.map +1 -0
- package/package.json +8 -3
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +48 -0
- 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 -0
- package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +180 -36
- package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
- package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -0
- package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -0
- package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -0
- package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -0
- package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -0
- package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -0
- package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -0
- package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -0
- package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -0
- package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -0
- package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -0
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -0
- package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -0
- package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
- package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -0
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -224
- package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -0
- package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -0
- package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -0
- package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -0
- package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -0
- package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -0
- 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 -100
- package/templates/ide/claude/.claude/commands/dare-ax.md +131 -0
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -78
- package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -0
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -110
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
- package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -0
- package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
- package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
- package/templates/ide/claude/.claude/commands/dare-dna.md +75 -0
- package/templates/ide/claude/.claude/commands/dare-docker.md +207 -0
- package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
- package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -0
- package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -0
- package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -0
- package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -0
- package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -0
- package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -0
- package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -0
- package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -0
- package/templates/ide/claude/.claude/commands/dare-refine.md +145 -0
- package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -0
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -0
- 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-tasks.md +70 -70
- package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -0
- package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -0
- package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -0
- package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -0
- package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -0
- package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -0
- 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 -100
- package/templates/ide/cursor/.cursor/commands/dag-viz.md +139 -0
- package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +86 -41
- package/templates/ide/cursor/.cursor/commands/generate-design.md +35 -35
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +184 -142
- package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -0
- package/templates/ide/cursor/.cursor/commands/review-task.md +91 -0
- package/templates/ide/cursor/.cursor/commands/run-dag.md +110 -110
- package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
- package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -0
- package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -0
- package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -0
- package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -0
- package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -0
- package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -0
- package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -0
- package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -0
- package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -0
- package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -0
- package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -0
- package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -0
- package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -0
- package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -0
- 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/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 -100
- package/templates/shared/docker-compose.yml +41 -41
- package/dist/__tests__/dag-runner/adapters.test.d.ts +0 -2
- package/dist/__tests__/dag-runner/adapters.test.d.ts.map +0 -1
- package/dist/__tests__/dag-runner/adapters.test.js +0 -134
- package/dist/__tests__/dag-runner/adapters.test.js.map +0 -1
- package/dist/dag-runner/adapters/antigravity.d.ts +0 -6
- package/dist/dag-runner/adapters/antigravity.d.ts.map +0 -1
- package/dist/dag-runner/adapters/antigravity.js +0 -54
- package/dist/dag-runner/adapters/antigravity.js.map +0 -1
- package/dist/dag-runner/adapters/claude.d.ts +0 -6
- package/dist/dag-runner/adapters/claude.d.ts.map +0 -1
- package/dist/dag-runner/adapters/claude.js +0 -48
- package/dist/dag-runner/adapters/claude.js.map +0 -1
- package/dist/dag-runner/adapters/cursor.d.ts +0 -6
- package/dist/dag-runner/adapters/cursor.d.ts.map +0 -1
- package/dist/dag-runner/adapters/cursor.js +0 -58
- package/dist/dag-runner/adapters/cursor.js.map +0 -1
- package/dist/dag-runner/adapters/index.d.ts +0 -46
- package/dist/dag-runner/adapters/index.d.ts.map +0 -1
- package/dist/dag-runner/adapters/index.js +0 -55
- package/dist/dag-runner/adapters/index.js.map +0 -1
- package/dist/dag-runner/utils/timeout.d.ts +0 -27
- package/dist/dag-runner/utils/timeout.d.ts.map +0 -1
- package/dist/dag-runner/utils/timeout.js +0 -55
- package/dist/dag-runner/utils/timeout.js.map +0 -1
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# /dare-llm-integration
|
|
2
|
+
|
|
3
|
+
Integração segura e eficiente com LLMs (Gemini, Claude, OpenAI, Ollama) em projetos DARE.
|
|
4
|
+
|
|
5
|
+
## Como usar
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/dare-llm-integration # audita uso de LLM no projeto
|
|
9
|
+
/dare-llm-integration scaffold # gera LLMProvider + cache + rate limit
|
|
10
|
+
/dare-llm-integration prompts # extrai prompts inline para arquivos versionados
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Os 5 pilares
|
|
14
|
+
|
|
15
|
+
### 1. LLMProvider abstraction
|
|
16
|
+
|
|
17
|
+
Nunca chame SDK do Gemini/OpenAI direto em Handler ou Service de negócio. Sempre via interface `LLMProvider`.
|
|
18
|
+
|
|
19
|
+
### 2. Cache TTL
|
|
20
|
+
|
|
21
|
+
Toda chamada passa por cache. Key = `hash(promptId + input + model)`. TTL default 1h.
|
|
22
|
+
|
|
23
|
+
### 3. Rate limit via token bucket
|
|
24
|
+
|
|
25
|
+
Token bucket por provider:
|
|
26
|
+
- Gemini Free: 15 RPM, 1M tokens/dia
|
|
27
|
+
- Claude tier 1: 50 RPM
|
|
28
|
+
- OpenAI tier 1: 500 RPM
|
|
29
|
+
|
|
30
|
+
### 4. Prompts versionados
|
|
31
|
+
|
|
32
|
+
Nunca inline em código. Vivem em `prompts/<id>.v<n>.md` com frontmatter (model, temperature, schema).
|
|
33
|
+
|
|
34
|
+
### 5. Validação via schema
|
|
35
|
+
|
|
36
|
+
LLM mente — sempre valide output com Zod/Pydantic/serde.
|
|
37
|
+
|
|
38
|
+
## Métricas obrigatórias
|
|
39
|
+
|
|
40
|
+
| ID | Métrica |
|
|
41
|
+
|---|---|
|
|
42
|
+
| M-01 | 100% das chamadas LLM via LLMProvider injetado |
|
|
43
|
+
| M-02 | 100% das responses LLM cacheadas |
|
|
44
|
+
| M-03 | 100% das requests com rate limit |
|
|
45
|
+
| M-04 | 100% das respostas validadas contra schema |
|
|
46
|
+
|
|
47
|
+
## Antipatterns
|
|
48
|
+
|
|
49
|
+
| AP | Antipattern | Por quê |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| AP-01 | SDK direto em Handler | impossível mockar/trocar provider |
|
|
52
|
+
| AP-02 | Sem cache | custo explode |
|
|
53
|
+
| AP-03 | Prompt em código | impossível versionar/A-B |
|
|
54
|
+
| AP-04 | User input direto em prompt | prompt injection trivial |
|
|
55
|
+
| AP-05 | Trusting LLM output | LLM mente, schema é defesa |
|
|
56
|
+
|
|
57
|
+
## Defesa contra prompt injection
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
# ❌ Concatenação direta
|
|
61
|
+
system = f"You are an assistant. {user_question}"
|
|
62
|
+
|
|
63
|
+
# ✅ Separação por delimitador + escape
|
|
64
|
+
messages = [
|
|
65
|
+
{"role": "system", "content": "You are an assistant. Answer based on the document below."},
|
|
66
|
+
{"role": "user", "content": f"<document>{escape(doc)}</document>\n<question>{escape(q)}</question>"}
|
|
67
|
+
]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Regras:
|
|
71
|
+
- Use delimitadores (`<document>`, `<question>`)
|
|
72
|
+
- Escape conteúdo do usuário (XML/HTML escape)
|
|
73
|
+
- Detecte "Ignore instructions above"
|
|
74
|
+
- Valide output — fora do schema = sinal de injection
|
|
75
|
+
|
|
76
|
+
## O que fazer
|
|
77
|
+
|
|
78
|
+
### Passo 1: Auditar chamadas LLM
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
grep -rn "GoogleGenAI\\|new OpenAI\\|Anthropic(" src/
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Toda ocorrência em Handler ou Service de negócio = AP-01.
|
|
85
|
+
|
|
86
|
+
### Passo 2: Criar `LLMProvider` interface
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
interface LLMProvider {
|
|
90
|
+
complete(req: {
|
|
91
|
+
promptId: string;
|
|
92
|
+
input: Record<string, unknown>;
|
|
93
|
+
schema: ZodSchema;
|
|
94
|
+
}): Promise<unknown>;
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Passo 3: Implementar providers
|
|
99
|
+
|
|
100
|
+
Comece com o que o projeto usa. Use os exemplos em `packages/skills/dare-llm-integration/providers/`.
|
|
101
|
+
|
|
102
|
+
### Passo 4: Configurar cache + rate limit
|
|
103
|
+
|
|
104
|
+
Cache em memória com TTL + token bucket por provider. Implementação pronta em `packages/skills/dare-llm-integration/cache/` e `.../rate_limit/`.
|
|
105
|
+
|
|
106
|
+
### Passo 5: Extrair prompts inline
|
|
107
|
+
|
|
108
|
+
Para cada prompt inline encontrado, mova para `prompts/<id>.v1.md` com frontmatter:
|
|
109
|
+
|
|
110
|
+
```markdown
|
|
111
|
+
---
|
|
112
|
+
id: summarize
|
|
113
|
+
version: 1
|
|
114
|
+
model: gemini-2.0-flash
|
|
115
|
+
temperature: 0.2
|
|
116
|
+
max_tokens: 500
|
|
117
|
+
schema: SummarySchema
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
# System
|
|
121
|
+
You are a concise summarizer.
|
|
122
|
+
|
|
123
|
+
# User
|
|
124
|
+
Summarize: <text>{{ text }}</text>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Passo 6: Adicionar validação no chamador
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
const raw = await llm.complete({...});
|
|
131
|
+
const parsed = SummarySchema.parse(raw); // joga LLMOutputInvalidError se falhar
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Saída esperada
|
|
135
|
+
|
|
136
|
+
Reporte numerado:
|
|
137
|
+
- Quantas chamadas LLM no projeto
|
|
138
|
+
- Quantas via LLMProvider (M-01)
|
|
139
|
+
- Quantas cacheadas (M-02)
|
|
140
|
+
- Quantas com rate limit (M-03)
|
|
141
|
+
- Quantas validadas contra schema (M-04)
|
|
142
|
+
- Lista de prompts inline a extrair
|
|
143
|
+
|
|
144
|
+
$ARGUMENTS
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
Skill MIT — parte do DARE Method.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# /dare-migrate
|
|
2
|
+
|
|
3
|
+
Camada semântica da migração (Fase 2 brownfield). Roda **depois** de `dare migrate`, que já leu os
|
|
4
|
+
artefatos do `reverse`/`dna` e gerou os esqueletos. Sua função é **escrever a estratégia de migração
|
|
5
|
+
e os cenários Gherkin de paridade reais** — o contrato comportamental que garante uma reimplementação
|
|
6
|
+
fiel ao legado.
|
|
7
|
+
|
|
8
|
+
## Como usar
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
/dare-migrate
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
> Pré-requisito: rodar `dare migrate --to <stack>` antes (gera `DARE/MIGRATION/MIGRATION.md`,
|
|
15
|
+
> `migration-facts.json` e `parity/*.feature`). Isso por sua vez exige `dare reverse` já executado.
|
|
16
|
+
|
|
17
|
+
## Quando usar
|
|
18
|
+
|
|
19
|
+
- Projeto legado entendido (`reverse` + `dna` feitos) que será **reimplementado** em outra stack.
|
|
20
|
+
- Acabou de rodar `dare migrate` e o `MIGRATION.md`/`.feature` têm seções `<!-- AGENT -->`/`# AGENT`.
|
|
21
|
+
|
|
22
|
+
## O que fazer
|
|
23
|
+
|
|
24
|
+
### 1. Carregar contexto (não re-varrer)
|
|
25
|
+
- Leia `DARE/MIGRATION/migration-facts.json` (origem, alvo, módulos, blocking gaps).
|
|
26
|
+
- Leia `DARE/IDEIA.md` + `DARE/REVERSE/module-*.md` (o que cada módulo faz) e `DARE/PROJECT-DNA.md`
|
|
27
|
+
(convenções). Abra arquivos-chave do legado só o necessário para inferir comportamento.
|
|
28
|
+
|
|
29
|
+
### 2. Preencher `DARE/MIGRATION/MIGRATION.md`
|
|
30
|
+
- **Decisão de Paradigma** — origem e alvo mudam de paradigma (procedural→OO, monólito→serviços)?
|
|
31
|
+
Registre decisão + justificativa; se preservado, diga.
|
|
32
|
+
- **Estratégia de Migração** — big-bang vs. **strangler/parallel-run**; ordem dos módulos; feature flags.
|
|
33
|
+
- **Registro de Risco** — para cada **blocking gap** (🔴) pré-listado, escreva o tratamento; some os
|
|
34
|
+
riscos de regressão/dados/performance + mitigações.
|
|
35
|
+
- **Arquitetura-alvo** — desenhe na stack-alvo, **alinhada ao DNA** (camadas/convenções) quando o
|
|
36
|
+
paradigma for preservado; senão justifique a nova organização.
|
|
37
|
+
- **Plano de Cutover & Rollback** — passos de corte, validação de paridade (rodar os `.feature`),
|
|
38
|
+
critério de go/no-go e rollback.
|
|
39
|
+
|
|
40
|
+
### 3. Escrever os Gherkin de paridade (`parity/<módulo>.feature`)
|
|
41
|
+
- Um `Scenario` por **fluxo observável** do módulo, derivado do **comportamento legado real**
|
|
42
|
+
(não invente). `Given` estado inicial → `When` ação → `Then` resultado **idêntico ao legado**.
|
|
43
|
+
- Inclua casos de borda e formatação que o legado garante (ex.: arredondamento monetário, máscaras).
|
|
44
|
+
- Esses `.feature` são o **contrato de aceite** da reimplementação na stack-alvo.
|
|
45
|
+
|
|
46
|
+
### 4. Apresentar ao usuário
|
|
47
|
+
Resumo: decisão de paradigma, estratégia, nº de cenários de paridade, blocking gaps a resolver.
|
|
48
|
+
Reforce que cenários de paridade só valem se vierem do comportamento legado observado.
|
|
49
|
+
|
|
50
|
+
## Regras de ouro
|
|
51
|
+
|
|
52
|
+
1. **Paridade primeiro** — o objetivo é não quebrar comportamento; todo fluxo crítico vira `Scenario`.
|
|
53
|
+
2. **Blocking gaps são bloqueantes** — um 🔴 não resolvido é risco de reimplementação; trate ou registre.
|
|
54
|
+
3. **Respeite o DNA** — a arquitetura-alvo segue as convenções da casa quando faz sentido.
|
|
55
|
+
4. **Não invente comportamento** — cenário sem base no legado é fonte de regressão silenciosa.
|
|
56
|
+
5. **Strangler quando possível** — migração incremental com parallel-run reduz risco vs. big-bang.
|
|
57
|
+
|
|
58
|
+
## Antipatterns
|
|
59
|
+
|
|
60
|
+
| AP | Antipattern | Por quê |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| AP-01 | Gherkin genérico sem base no legado | Não garante paridade — vira regressão |
|
|
63
|
+
| AP-02 | Ignorar blocking gaps (🔴) | Reimplementa em cima de incerteza |
|
|
64
|
+
| AP-03 | Big-bang sem necessidade | Maximiza risco e dificulta rollback |
|
|
65
|
+
| AP-04 | Arquitetura-alvo desalinhada do DNA | Código novo vira ilha inconsistente |
|
|
66
|
+
| AP-05 | Reescrever os fatos determinísticos do CLI | Quebra a fonte de verdade |
|
|
67
|
+
|
|
68
|
+
$ARGUMENTS
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
Skill MIT — parte do DARE Method. Fase 2 (brownfield). Pareia com o comando `dare migrate`.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# /dare-quality-telemetry
|
|
2
|
+
|
|
3
|
+
Coleta métricas das skills DARE (ax, layered-design, llm-integration, frontend, realtime…), persiste histórico em `tmp/dare_metrics.json` e detecta regressões contra baseline.
|
|
4
|
+
|
|
5
|
+
## Como usar
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/dare-quality-telemetry collect # roda todos os collectors
|
|
9
|
+
/dare-quality-telemetry baseline # captura baseline atual
|
|
10
|
+
/dare-quality-telemetry compare # compara contra baseline (CI)
|
|
11
|
+
/dare-quality-telemetry report # gera markdown report
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## O que faz
|
|
15
|
+
|
|
16
|
+
1. Roda collectors das skills configuradas em paralelo
|
|
17
|
+
2. Agrega em um snapshot
|
|
18
|
+
3. Persiste em `tmp/dare_metrics.json`
|
|
19
|
+
4. Compara com `tmp/dare_metrics_baseline.json`
|
|
20
|
+
5. Reporta em markdown / JSON
|
|
21
|
+
6. Exit code ≠ 0 se regressão crítica
|
|
22
|
+
|
|
23
|
+
## Arquitetura
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
collect.ts
|
|
27
|
+
↓ chama em paralelo
|
|
28
|
+
[ax collector] [layered coll.] [llm coll.] [frontend coll.] [realtime coll.]
|
|
29
|
+
↓
|
|
30
|
+
Aggregator → snapshot { skill: { M-01: value, ... } }
|
|
31
|
+
↓
|
|
32
|
+
tmp/dare_metrics.json + Regression detector
|
|
33
|
+
↓
|
|
34
|
+
Reporter → markdown / JSON / GH Actions summary
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Métricas obrigatórias
|
|
38
|
+
|
|
39
|
+
| ID | Métrica |
|
|
40
|
+
|---|---|
|
|
41
|
+
| M-01 | 100% dos builds incluem coleta (skill instalada = true) |
|
|
42
|
+
| M-02 | 0 regressões passam despercebidas (baseline existe) |
|
|
43
|
+
| M-03 | Histórico mantido em `tmp/dare_metrics.json` |
|
|
44
|
+
| M-04 | Workflow `.github/workflows/dare-metrics.yml` existe |
|
|
45
|
+
|
|
46
|
+
## Configuração
|
|
47
|
+
|
|
48
|
+
```yaml
|
|
49
|
+
# dare.config.yml
|
|
50
|
+
telemetry:
|
|
51
|
+
skills:
|
|
52
|
+
- dare-ax
|
|
53
|
+
- dare-layered-design
|
|
54
|
+
- dare-llm-integration
|
|
55
|
+
- dare-frontend-design
|
|
56
|
+
- dare-realtime
|
|
57
|
+
output: tmp/dare_metrics.json
|
|
58
|
+
baseline: tmp/dare_metrics_baseline.json
|
|
59
|
+
fail_on_regression: true
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Schema do snapshot
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"timestamp": "2026-05-26T10:30:00Z",
|
|
67
|
+
"commit": "1d4a1417",
|
|
68
|
+
"branch": "main",
|
|
69
|
+
"skills": {
|
|
70
|
+
"dare-ax": {
|
|
71
|
+
"M-01": { "value": 1.0, "status": "PASS" },
|
|
72
|
+
"M-04": { "value": 1.0, "status": "PASS" }
|
|
73
|
+
},
|
|
74
|
+
"dare-layered-design": {
|
|
75
|
+
"M-01": { "value": 0.95, "status": "PASS" }
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Detecção de regressão
|
|
82
|
+
|
|
83
|
+
| Mudança | Severidade | Ação |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| value caiu ≥ 5% | CRITICAL | bloquear PR |
|
|
86
|
+
| value caiu < 5% mas ≥ 1% | WARNING | comentar no PR |
|
|
87
|
+
| value subiu | INFO | celebrar |
|
|
88
|
+
| value igual | NEUTRAL | nenhuma |
|
|
89
|
+
|
|
90
|
+
## O que fazer
|
|
91
|
+
|
|
92
|
+
### Passo 1: Instalar
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
pnpm add @dare/quality-telemetry
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Passo 2: Configurar `dare.config.yml`
|
|
99
|
+
|
|
100
|
+
Listar as skills filhas a rastrear.
|
|
101
|
+
|
|
102
|
+
### Passo 3: Rodar collect
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
dare metrics collect
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Passo 4: Capturar baseline
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
dare metrics baseline
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Geralmente capturado uma vez por release tag, não a cada commit.
|
|
115
|
+
|
|
116
|
+
### Passo 5: Workflow CI
|
|
117
|
+
|
|
118
|
+
```yaml
|
|
119
|
+
# .github/workflows/dare-metrics.yml
|
|
120
|
+
name: DARE Metrics
|
|
121
|
+
on: [push, pull_request]
|
|
122
|
+
jobs:
|
|
123
|
+
metrics:
|
|
124
|
+
runs-on: ubuntu-latest
|
|
125
|
+
steps:
|
|
126
|
+
- uses: actions/checkout@v4
|
|
127
|
+
- uses: actions/setup-node@v4
|
|
128
|
+
with: { node-version: '20' }
|
|
129
|
+
- run: pnpm install
|
|
130
|
+
- run: pnpm dare metrics collect
|
|
131
|
+
- run: pnpm dare metrics compare
|
|
132
|
+
- uses: actions/upload-artifact@v4
|
|
133
|
+
with:
|
|
134
|
+
name: dare-metrics
|
|
135
|
+
path: tmp/dare_metrics*.json
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Antipatterns
|
|
139
|
+
|
|
140
|
+
| AP | Antipattern | Por quê |
|
|
141
|
+
|---|---|---|
|
|
142
|
+
| AP-01 | Métricas sem baseline | Não detecta regressão |
|
|
143
|
+
| AP-02 | Histórico não versionado | Perde contexto |
|
|
144
|
+
| AP-03 | Coletar mas não bloquear | CI vira teatro |
|
|
145
|
+
| AP-04 | Baseline desatualizado | Regressão real fica invisível |
|
|
146
|
+
|
|
147
|
+
## Boas práticas
|
|
148
|
+
|
|
149
|
+
1. **Baseline por release**, não por commit
|
|
150
|
+
2. **Regressão = bloqueio**, não comentário ignorável
|
|
151
|
+
3. **Exportar para Datadog/Grafana** após N coletas
|
|
152
|
+
4. **Collectors paralelos** — skill deve rodar em < 60s
|
|
153
|
+
|
|
154
|
+
## Saída esperada
|
|
155
|
+
|
|
156
|
+
Reporte markdown com:
|
|
157
|
+
- Tabela por skill com M-01 a M-04
|
|
158
|
+
- Comparação contra baseline (delta por métrica)
|
|
159
|
+
- Status final: PASS / WARNING / CRITICAL
|
|
160
|
+
- Link para snapshot completo em `tmp/dare_metrics.json`
|
|
161
|
+
|
|
162
|
+
$ARGUMENTS
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
Skill MIT — parte do DARE Method.
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# /dare-realtime
|
|
2
|
+
|
|
3
|
+
Comunicação real-time (WebSocket, SSE) DARE-compliant — eventos tipados, subscriptions autorizadas, reconexão com backoff, zero ghost listeners.
|
|
4
|
+
|
|
5
|
+
## Como usar
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/dare-realtime # audita uso de WS/SSE no projeto
|
|
9
|
+
/dare-realtime scaffold ws # gera event registry + subscription manager + reconnect
|
|
10
|
+
/dare-realtime audit ghosts # detecta listeners sem cleanup
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Os 4 pilares
|
|
14
|
+
|
|
15
|
+
### 1. Schema validation de eventos
|
|
16
|
+
|
|
17
|
+
Todo evento WS/SSE tem schema JSON. Server valida antes de emitir, client valida antes de processar.
|
|
18
|
+
|
|
19
|
+
### 2. Registro central de tipos
|
|
20
|
+
|
|
21
|
+
Um único `event_registry.ts` lista todos os event types com versão (`.v1`, `.v2`).
|
|
22
|
+
|
|
23
|
+
### 3. Reconexão com exponential backoff
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
class ReconnectStrategy {
|
|
27
|
+
private attempt = 0;
|
|
28
|
+
next(): number {
|
|
29
|
+
const base = Math.min(1000 * 2 ** this.attempt, 30_000);
|
|
30
|
+
return base + Math.random() * 1000; // jitter
|
|
31
|
+
}
|
|
32
|
+
reset() { this.attempt = 0; }
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 4. Subscription manager (zero ghost listeners)
|
|
37
|
+
|
|
38
|
+
Map de subscriptions com cleanup automático on disconnect.
|
|
39
|
+
|
|
40
|
+
## Métricas obrigatórias
|
|
41
|
+
|
|
42
|
+
| ID | Métrica |
|
|
43
|
+
|---|---|
|
|
44
|
+
| M-01 | 100% de event types com JSON Schema |
|
|
45
|
+
| M-02 | 100% de subscriptions autorizadas |
|
|
46
|
+
| M-03 | 0 ghost listeners após desconexão |
|
|
47
|
+
| M-04 | Estratégia de reconexão configurada |
|
|
48
|
+
|
|
49
|
+
## Antipatterns
|
|
50
|
+
|
|
51
|
+
| AP | Antipattern | Correção |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| AP-01 | Evento sem schema | Adicionar no registry |
|
|
54
|
+
| AP-02 | `socket.on()` sem cleanup | SubscriptionManager |
|
|
55
|
+
| AP-03 | Reconexão sem backoff | Exponential + jitter |
|
|
56
|
+
| AP-04 | Sem autorização de subscription | `authorize()` antes de `subscribe()` |
|
|
57
|
+
| AP-05 | Broadcast sem filtro | Rooms por tenant |
|
|
58
|
+
| AP-06 | Estado stale após reconectar | Resync via REST/snapshot |
|
|
59
|
+
|
|
60
|
+
## O que fazer
|
|
61
|
+
|
|
62
|
+
### Passo 1: Event Registry
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
export const EventRegistry = {
|
|
66
|
+
'user.created.v1': { schema: UserCreatedSchema, requires: 'admin' },
|
|
67
|
+
'message.sent.v1': { schema: MessageSentSchema, requires: 'participant' },
|
|
68
|
+
};
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Passo 2: Subscription Manager
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
class SubscriptionManager {
|
|
75
|
+
private subs = new Map<string, Set<string>>();
|
|
76
|
+
|
|
77
|
+
subscribe(connId: string, event: string) {
|
|
78
|
+
if (!this.subs.has(connId)) this.subs.set(connId, new Set());
|
|
79
|
+
this.subs.get(connId)!.add(event);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
onDisconnect(connId: string) {
|
|
83
|
+
this.subs.delete(connId); // cleanup SEMPRE
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Passo 3: Reconnect com backoff
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
const strategy = new ReconnectStrategy();
|
|
92
|
+
socket.on('disconnect', () => {
|
|
93
|
+
setTimeout(() => socket.connect(), strategy.next());
|
|
94
|
+
});
|
|
95
|
+
socket.on('connect', () => {
|
|
96
|
+
strategy.reset();
|
|
97
|
+
resyncState(); // buscar eventos perdidos via REST
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Passo 4: Autorização por subscription
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
socket.on('subscribe', (eventType) => {
|
|
105
|
+
if (!authorize(socket.user, eventType)) {
|
|
106
|
+
return socket.emit('error', { code: 'FORBIDDEN' });
|
|
107
|
+
}
|
|
108
|
+
subscriptionManager.subscribe(socket.id, eventType);
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Passo 5: Validação no server e client
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// Server antes de emitir
|
|
116
|
+
const valid = EventRegistry[eventType].schema.safeParse(payload);
|
|
117
|
+
if (!valid.success) return log.error('invalid event', valid.error);
|
|
118
|
+
io.to(room).emit(eventType, valid.data);
|
|
119
|
+
|
|
120
|
+
// Client antes de processar
|
|
121
|
+
socket.on(eventType, (payload) => {
|
|
122
|
+
const valid = EventRegistry[eventType].schema.safeParse(payload);
|
|
123
|
+
if (!valid.success) return log.warn('invalid event received');
|
|
124
|
+
handleEvent(valid.data);
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Stack recomendada
|
|
129
|
+
|
|
130
|
+
| Stack | WebSocket | SSE |
|
|
131
|
+
|---|---|---|
|
|
132
|
+
| Node | `socket.io`, `ws` | `eventsource` + endpoint custom |
|
|
133
|
+
| Rails | Action Cable | Rack streaming |
|
|
134
|
+
| Rust/Axum | `tokio-tungstenite` | `axum::sse::Sse` |
|
|
135
|
+
| FastAPI | `fastapi.WebSocket` | `EventSourceResponse` |
|
|
136
|
+
| Go | `gorilla/websocket` | stdlib `http.Flusher` |
|
|
137
|
+
|
|
138
|
+
## Boas práticas
|
|
139
|
+
|
|
140
|
+
1. **SSE para server→client unidirecional** (logs, métricas)
|
|
141
|
+
2. **WS para bidirectional** (chat, colaboração)
|
|
142
|
+
3. **Rooms/channels por tenant** — evita cross-tenant
|
|
143
|
+
4. **Heartbeat ping-pong** — detectar conexão zumbi
|
|
144
|
+
5. **Backpressure** — drop eventos antigos se client lento
|
|
145
|
+
6. **Replay limitado** — últimos N eventos por room para reconexão recente
|
|
146
|
+
|
|
147
|
+
## Saída esperada
|
|
148
|
+
|
|
149
|
+
Reporte:
|
|
150
|
+
- Lista de event types e seus schemas (ou falta de)
|
|
151
|
+
- Subscriptions sem autorização
|
|
152
|
+
- Listeners sem cleanup (grep `socket.on` sem `removeListener` ou cleanup)
|
|
153
|
+
- Stack escolhida e configuração de reconnect
|
|
154
|
+
|
|
155
|
+
$ARGUMENTS
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
Skill MIT — parte do DARE Method.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Comando: /dare-refine
|
|
2
|
+
|
|
3
|
+
## Descrição
|
|
4
|
+
|
|
5
|
+
Analisa a complexidade de uma task e, quando alta, **quebra em sub-tasks menores** com escopo bem delimitado. Pode ser chamada:
|
|
6
|
+
|
|
7
|
+
- Automaticamente pela skill `dare-tasks` logo após gerar o DAG (para cada task ≥ MED)
|
|
8
|
+
- Manualmente pelo dev: `/dare-refine task-034`
|
|
9
|
+
- Após mudança de escopo: quando o BLUEPRINT mudou e uma task ficou grande demais
|
|
10
|
+
|
|
11
|
+
A camada determinística (heurística de complexidade) já é feita pelo CLI: `dare refine <id>`. Este comando adiciona a camada **semântica** — você lê a spec, decide se a quebra é necessária e, se for, produz sub-tasks coerentes.
|
|
12
|
+
|
|
13
|
+
## Quando rodar
|
|
14
|
+
|
|
15
|
+
- Logo após `/dare-tasks` para cada task com complexity HIGH no `dare-dag.yaml`
|
|
16
|
+
- Quando o dev pede explicitamente: `/dare-refine task-034`
|
|
17
|
+
- Quando você gerou uma task e ela "te parece grande" mesmo marcada MED — confie no instinto
|
|
18
|
+
|
|
19
|
+
## Como executar
|
|
20
|
+
|
|
21
|
+
### 1. Validar argumento
|
|
22
|
+
|
|
23
|
+
`$ARGUMENTS` deve ter o `task-id`. Se vazio, peça.
|
|
24
|
+
|
|
25
|
+
### 2. Rodar a camada determinística
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
dare refine $ARGUMENTS --split --format json > .dare/refine-$ARGUMENTS.json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Esse JSON traz:
|
|
32
|
+
- `report.score` e `report.level` (LOW/MED/HIGH/CRITICAL)
|
|
33
|
+
- `report.signals` — explica por que pontuou alto/baixo
|
|
34
|
+
- `report.recommendsSplit` — true se HIGH ou CRITICAL
|
|
35
|
+
- `proposal.subtasks` — quebra inicial baseada em diretórios (chute coarse)
|
|
36
|
+
|
|
37
|
+
### 3. Decidir se vale quebrar
|
|
38
|
+
|
|
39
|
+
Critérios para **quebrar**:
|
|
40
|
+
|
|
41
|
+
- ✅ `recommendsSplit: true` da heurística (HIGH/CRITICAL)
|
|
42
|
+
- ✅ Mais de 6 arquivos a criar/modificar
|
|
43
|
+
- ✅ Mistura responsabilidades fortes (ex.: cria modelo + escreve controller + escreve teste + faz migration — split por camada)
|
|
44
|
+
- ✅ Toca código que outra task ainda não criou (deveria ser depois)
|
|
45
|
+
- ✅ Inclui refactor + feature nova juntos
|
|
46
|
+
- ✅ Tem keyword "pesada" (refactor, migrate, integrate) E score MED+
|
|
47
|
+
|
|
48
|
+
Critérios para **manter inteira**:
|
|
49
|
+
|
|
50
|
+
- ✅ Score LOW e até MED
|
|
51
|
+
- ✅ Todos os arquivos pertencem ao mesmo módulo/feature
|
|
52
|
+
- ✅ Cabe em uma conversa única do agente (15–60 min de trabalho efetivo)
|
|
53
|
+
|
|
54
|
+
### 4. Se decidir quebrar — produzir sub-tasks coerentes
|
|
55
|
+
|
|
56
|
+
Não use a `proposal.subtasks` da CLI sem revisão — ela agrupa por diretório, o que nem sempre faz sentido semantico. **Reagrupe por responsabilidade**:
|
|
57
|
+
|
|
58
|
+
| Eixo de split | Quando aplicar |
|
|
59
|
+
|---|---|
|
|
60
|
+
| **Por camada** | Modelo / Controller / Service / Test ficam em tasks separadas se cada um é grande |
|
|
61
|
+
| **Por endpoint** | Task original tinha 4 endpoints REST → 4 sub-tasks de 1 endpoint cada |
|
|
62
|
+
| **Por feature** | Auth tinha "register + login + refresh + logout" → split por verbo |
|
|
63
|
+
| **Refactor + feature** | Quebra em "1. refactor X para preparar terreno" + "2. adiciona feature Y em cima" |
|
|
64
|
+
| **Migration + código** | "1. migration + seeds" + "2. código que usa o novo schema" |
|
|
65
|
+
|
|
66
|
+
Cada sub-task deve:
|
|
67
|
+
|
|
68
|
+
- Ter `subtask_prompt` auto-suficiente (assinaturas exatas, validações, edge cases — o Anti-Stub Contract aplica)
|
|
69
|
+
- Ter spec_file própria em `DARE/EXECUTION/<sub-id>.md`
|
|
70
|
+
- Ter `depends_on` mínimo mas correto (sub-tasks da mesma família geralmente dependem em ordem)
|
|
71
|
+
- Ter complexity honesta — se a sub ainda ficar HIGH, quebra de novo
|
|
72
|
+
|
|
73
|
+
### 5. Emitir verdito + plano
|
|
74
|
+
|
|
75
|
+
Salve em `.dare/refine-verdict-$ARGUMENTS.json`:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"manageable": false,
|
|
80
|
+
"reasons": [
|
|
81
|
+
"Score 18 (HIGH) — 7 endpoints + migration + 12 testes no mesmo escopo",
|
|
82
|
+
"Mistura refactor de service layer com novos endpoints"
|
|
83
|
+
],
|
|
84
|
+
"proposedSubtasks": [
|
|
85
|
+
{
|
|
86
|
+
"id": "task-034a",
|
|
87
|
+
"title": "Refactor UserService para suportar profile_settings",
|
|
88
|
+
"files": ["src/services/UserService.ts", "tests/services/UserService.test.ts"],
|
|
89
|
+
"rationale": "Refactor isolado antes da feature — gates passam sem mexer em controllers",
|
|
90
|
+
"estimatedLevel": "MED"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "task-034b",
|
|
94
|
+
"title": "Endpoints GET/PATCH /users/me/profile",
|
|
95
|
+
"files": ["src/controllers/profile.ts", "tests/controllers/profile.test.ts"],
|
|
96
|
+
"rationale": "Endpoints novos consumindo o serviço refatorado",
|
|
97
|
+
"estimatedLevel": "MED"
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Se a task **é** manuseável (não precisa quebrar):
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"manageable": true,
|
|
108
|
+
"reasons": ["Score 7 (MED), 4 arquivos no mesmo módulo, 6 testes — cabe em uma conversa"]
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 6. Aplicar o split
|
|
113
|
+
|
|
114
|
+
Se quebrou:
|
|
115
|
+
|
|
116
|
+
1. **Edite** `DARE/dare-dag.yaml` substituindo a task original pelas sub-tasks
|
|
117
|
+
2. **Crie** as specs novas em `DARE/EXECUTION/<sub-id>.md` (use `templates/TASK-SPEC-template.md` — seguindo o Anti-Stub Contract!)
|
|
118
|
+
3. **Atualize** `DARE/TASKS.md` (visão humana) refletindo a quebra
|
|
119
|
+
4. **Regenere** o Mermaid: `dare dag viz -o DARE/dag-graph.mmd`
|
|
120
|
+
5. **Marque** a task original como SPLIT (não deletar — preservar histórico) ou remover e referenciar no header das sub-tasks
|
|
121
|
+
|
|
122
|
+
### 7. Mensagem ao usuário
|
|
123
|
+
|
|
124
|
+
Se manteve inteira:
|
|
125
|
+
> ✅ Task `$ARGUMENTS` está bem-dimensionada (score X, level Y). Sem split necessário.
|
|
126
|
+
|
|
127
|
+
Se quebrou:
|
|
128
|
+
> 🪓 Task `$ARGUMENTS` quebrada em N sub-task(s):
|
|
129
|
+
> - `<id>a`: <título>
|
|
130
|
+
> - `<id>b`: <título>
|
|
131
|
+
> ...
|
|
132
|
+
>
|
|
133
|
+
> Specs criadas em `DARE/EXECUTION/`. Revise antes de executar:
|
|
134
|
+
> ```bash
|
|
135
|
+
> dare validate # verifica DAG
|
|
136
|
+
> dare dag viz # confirma grafo
|
|
137
|
+
> dare execute --next # roda a primeira sub-task pronta
|
|
138
|
+
> ```
|
|
139
|
+
|
|
140
|
+
## Regras inegociáveis
|
|
141
|
+
|
|
142
|
+
- **Não quebre tasks LOW** — overhead não vale a pena
|
|
143
|
+
- **Não invente dependências** — sub-tasks da mesma família frequentemente são sequenciais, não falsamente paralelas
|
|
144
|
+
- **Cada sub-task precisa ser independentemente testável** — se você precisa rodar A para testar B, A precisa ser parent de B no DAG
|
|
145
|
+
- **Anti-Stub Contract aplica em cada sub-task** — não relaxa critérios só porque é menor
|