@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,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
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-reverse
|
|
3
|
+
description: Camada semântica da engenharia reversa (Fase 0 / brownfield). Roda depois do comando `dare reverse` e preenche as inferências — propósito, domínio, responsabilidades e diagramas de fluxo — nos artefatos DARE/IDEIA.md e DARE/REVERSE/module-*.md.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Reverse Skill — Engenharia Reversa (Fase 0)
|
|
7
|
+
|
|
8
|
+
Você é o agente da **Fase 0 (brownfield)** do método DARE no Antigravity. Esta skill é a
|
|
9
|
+
**camada semântica** da engenharia reversa: roda **depois** do comando `dare reverse`, que já
|
|
10
|
+
varreu o código e gerou os esqueletos determinísticos. Sua função é **preencher as inferências**
|
|
11
|
+
que o CLI não faz: propósito, domínio, responsabilidades e os **diagramas de fluxo**
|
|
12
|
+
("como a coisa funciona").
|
|
13
|
+
|
|
14
|
+
> Pré-requisito: o comando `dare reverse` precisa ter rodado antes (gera `DARE/IDEIA.md`,
|
|
15
|
+
> `DARE/REVERSE/module-*.md` e `DARE/REVERSE/reverse-facts.json`). Se não existirem, peça ao
|
|
16
|
+
> usuário para rodar `dare reverse` primeiro.
|
|
17
|
+
|
|
18
|
+
## Quando usar esta skill
|
|
19
|
+
|
|
20
|
+
- O usuário quer entender / documentar um projeto **legado** antes de adotar o DARE.
|
|
21
|
+
- Acabou de rodar `dare reverse` e os artefatos têm seções `<!-- AGENT: ... -->` em aberto.
|
|
22
|
+
- O objetivo é gerar uma **pré-arquitetura** (`IDEIA.md`) que depois vira `DESIGN.md`.
|
|
23
|
+
|
|
24
|
+
## Marcação de confiança (obrigatória)
|
|
25
|
+
|
|
26
|
+
Ao preencher cada `<!-- AGENT -->`, marque **cada afirmação** com seu nível de confiança + evidência:
|
|
27
|
+
|
|
28
|
+
- `- 🟢 <claim>. ` + `` `arquivo:linha` `` — **CONFIRMED**: evidência direta no código.
|
|
29
|
+
- `- 🟡 <claim>. ` + `` `arquivo:linha` `` — **INFERRED**: padrão/dedução; pode estar errado.
|
|
30
|
+
- `- 🔴 <claim>. → ver gaps.md` — **GAP**: não determinável pelo código.
|
|
31
|
+
|
|
32
|
+
Regra: só 🟢 com evidência direta; na dúvida, 🟡; sem base, 🔴 (registre em `gaps.md`). Os fatos
|
|
33
|
+
estruturais (caminho, LOC, deps) já vêm pré-marcados 🟢 pelo CLI — **não os altere**.
|
|
34
|
+
|
|
35
|
+
## Passo a passo
|
|
36
|
+
|
|
37
|
+
### 1. Carregar os fatos (não re-varrer tudo)
|
|
38
|
+
|
|
39
|
+
- Leia `DARE/REVERSE/reverse-facts.json` — fonte de fatos determinística (stack, módulos, LOC,
|
|
40
|
+
grafo de dependências). **Confie nela** para o inventário; não reconte arquivos.
|
|
41
|
+
- Por módulo, abra **2-5 arquivos representativos** (entrypoints, controllers, services, models)
|
|
42
|
+
— o suficiente para inferir responsabilidade e fluxo. Não leia o módulo inteiro.
|
|
43
|
+
|
|
44
|
+
### 2. Preencher `DARE/IDEIA.md`
|
|
45
|
+
|
|
46
|
+
Substitua cada bloco `<!-- AGENT: ... -->`:
|
|
47
|
+
|
|
48
|
+
- **Propósito Inferido** — 2-4 frases: o que o software faz e por quê.
|
|
49
|
+
- **Domínio & Conceitos** — entidades de negócio + glossário.
|
|
50
|
+
- **Modelo de Dados (reconstruído)** — entidades, campos-chave, relacionamentos.
|
|
51
|
+
- **Superfície de API** — endpoints inferidos de rotas/controllers.
|
|
52
|
+
- **Fluxo do Sistema** — um `flowchart TD` Mermaid do caminho principal de request/dados
|
|
53
|
+
atravessando os módulos.
|
|
54
|
+
- **⚠️ Incertezas / Gaps** — o que NÃO deu pra inferir + perguntas objetivas para o humano.
|
|
55
|
+
|
|
56
|
+
**Não toque** no Mapa de Módulos nem na tabela (determinísticos, gerados pelo CLI).
|
|
57
|
+
|
|
58
|
+
### 3. Preencher cada `DARE/REVERSE/module-*.md`
|
|
59
|
+
|
|
60
|
+
- **Responsabilidade** — papel do módulo no sistema (1-3 frases).
|
|
61
|
+
- **Superfície Pública** — o que expõe (funções/classes/endpoints/tipos exportados).
|
|
62
|
+
- **Como Funciona (fluxo)** — um `sequenceDiagram` Mermaid do fluxo típico
|
|
63
|
+
(entrypoint → service → repository → DB/externo).
|
|
64
|
+
- **Dependências & Acoplamento** — comente o acoplamento e riscos (circular, hotspot HIGH).
|
|
65
|
+
|
|
66
|
+
### 4. Apresentar ao usuário
|
|
67
|
+
|
|
68
|
+
Resumo: propósito inferido, nº de módulos, principais incertezas. Reforce que o `IDEIA.md` é um
|
|
69
|
+
**rascunho a validar** antes de promover a DESIGN com `dare design`.
|
|
70
|
+
|
|
71
|
+
## Passo final — Gaps, Questions e Reviewer
|
|
72
|
+
|
|
73
|
+
1. **`gaps.md`** — consolide os 🔴 classificados por severidade (crítico/moderado/cosmético/fora-escopo) + tratamento.
|
|
74
|
+
2. **`questions.md`** — perguntas objetivas ao humano.
|
|
75
|
+
3. **Reviewer** — releia os arquivos-chave e rebaixe claims sem evidência (🟢→🟡 ou 🟡→🔴).
|
|
76
|
+
4. **Rode `dare reverse --report`** — gera `confidence-report.md` + `traceability/code-spec-matrix.md` (índice determinístico).
|
|
77
|
+
|
|
78
|
+
## Modo `--deep` (Fase 3)
|
|
79
|
+
|
|
80
|
+
Se `dare reverse --deep` foi usado, complete os artefatos extras em `DARE/REVERSE/`:
|
|
81
|
+
- **`erd.md`** — entidades extraídas pelo CLI (🟢); complete relações não-explícitas (🟡).
|
|
82
|
+
- **`domain-rules.md`** — regras de negócio (validações, invariantes, cálculos), 🟢/🟡/🔴.
|
|
83
|
+
- **`state-machines.md`** — `stateDiagram-v2` por entidade/fluxo (estados/transições reais).
|
|
84
|
+
- **`permissions.md`** — papéis, recursos e regras de autorização.
|
|
85
|
+
- **`c4/c4-context.md`** e **`c4/c4-container.md`** — atores/externos e containers (component = mapa de módulos).
|
|
86
|
+
|
|
87
|
+
## Regras de ouro
|
|
88
|
+
|
|
89
|
+
1. **Não invente** — fluxo não-claro vira 🔴 (gap), não chute.
|
|
90
|
+
2. **Fidelidade ao código real** — descreva o que o código faz, não o que deveria fazer.
|
|
91
|
+
3. **Diagramas enxutos** — legibilidade acima de exaustividade.
|
|
92
|
+
4. **Não re-varra** — os fatos já estão em `reverse-facts.json`.
|
|
93
|
+
5. **Preserve o determinístico** — nunca edite o Mapa de Módulos/tabela/grafo do CLI.
|
|
94
|
+
|
|
95
|
+
## Antipatterns
|
|
96
|
+
|
|
97
|
+
| AP | Antipattern | Por quê |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| AP-01 | Inventar endpoints/entidades inexistentes | Polui a pré-arquitetura com ficção |
|
|
100
|
+
| AP-02 | Reescrever a tabela de módulos do CLI | Quebra a fonte determinística |
|
|
101
|
+
| AP-03 | `sequenceDiagram` gigante e ilegível | Anula o propósito do diagrama |
|
|
102
|
+
| AP-04 | Pular a seção de Incertezas | Remove o ponto de validação humana |
|
|
103
|
+
| AP-05 | Ler o projeto inteiro arquivo a arquivo | Desperdiça contexto; os fatos já estão no JSON |
|
|
104
|
+
| AP-06 | Marcar tudo 🟢 sem evidência `file:line` | Infla a confiança e engana o humano |
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
Skill MIT — parte do DARE Method. Fase 0 (brownfield). Pareia com o comando `dare reverse`.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-review
|
|
3
|
+
description: Audita uma task DARE implementada — cruza a spec com o código real para detectar stubs, mocks fora de testes, funções vazias, TODOs e validar critério-a-critério se a implementação satisfaz o que a spec prometeu. Use antes de marcar uma task como DONE, ou quando o dev pedir revisão manual. Combina análise estática (via CLI) com verdito semântico (você).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Review Skill
|
|
7
|
+
|
|
8
|
+
Você é o auditor de qualidade do método DARE. Seu papel é verificar se uma task implementada **realmente** entrega o que a spec promete — sem stubs, sem mocks em produção, sem funções vazias, sem TODOs pendentes.
|
|
9
|
+
|
|
10
|
+
## Quando usar esta skill
|
|
11
|
+
|
|
12
|
+
- Antes de marcar uma task como DONE (gate obrigatório no Definition of Done)
|
|
13
|
+
- Quando `dare review <id>` estático passa mas precisa validação semântica
|
|
14
|
+
- Quando o dev pede revisão manual: "revise a task-034"
|
|
15
|
+
|
|
16
|
+
## Camada estática vs semântica
|
|
17
|
+
|
|
18
|
+
O CLI `dare review <id>` já faz a camada **estática**: regex sobre os arquivos detecta TODO/FIXME/stubs/mocks/funções vazias. Esta skill faz a camada **semântica**: critério-a-critério da spec contra a implementação real.
|
|
19
|
+
|
|
20
|
+
## Como executar
|
|
21
|
+
|
|
22
|
+
### Passo 1: Rodar a camada estática
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
dare review <task-id> --format json > .dare/review-static-<task-id>.json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Leia o JSON. Se houver erros estáticos, reporte-os primeiro. Geralmente não vale prosseguir com semântica se a estática falhou.
|
|
29
|
+
|
|
30
|
+
### Passo 2: Carregar contexto
|
|
31
|
+
|
|
32
|
+
- `DARE/EXECUTION/<task-id>.md` — spec da task
|
|
33
|
+
- Cada arquivo listado na seção 3 ("ARQUIVOS A CRIAR / MODIFICAR")
|
|
34
|
+
- `DARE/BLUEPRINT.md` — contratos de API / modelos
|
|
35
|
+
|
|
36
|
+
### Passo 3: Auditoria critério-a-critério
|
|
37
|
+
|
|
38
|
+
Para **cada** item das seções abaixo, marque ✅ / ❌ com evidência (arquivo + linha):
|
|
39
|
+
|
|
40
|
+
#### 3.1 Objetivo (seção 1 da spec)
|
|
41
|
+
A implementação atinge o estado observável prometido? Encontre evidência concreta.
|
|
42
|
+
|
|
43
|
+
#### 3.2 Arquivos (seção 3)
|
|
44
|
+
- Todos existem com conteúdo descrito?
|
|
45
|
+
- Arquivos extras suspeitos?
|
|
46
|
+
|
|
47
|
+
#### 3.3 Implementação (seção 4)
|
|
48
|
+
- Cada passo numerado foi executado?
|
|
49
|
+
- Assinaturas exatas correspondem?
|
|
50
|
+
- Validações têm regras concretas (não "valida email" — a regex específica)?
|
|
51
|
+
|
|
52
|
+
#### 3.4 Testes (seção 4 — subitem testes)
|
|
53
|
+
- Cada teste listado existe?
|
|
54
|
+
- Tem assertions reais (não `assertTrue(true)`)?
|
|
55
|
+
- Edge cases enumerados cobertos?
|
|
56
|
+
|
|
57
|
+
#### 3.5 Segurança (seção 5)
|
|
58
|
+
- Input validation conforme spec?
|
|
59
|
+
- Não há secrets/tokens hardcoded?
|
|
60
|
+
- SQL/Command injection mitigado?
|
|
61
|
+
|
|
62
|
+
#### 3.6 Anti-Stub (seção 7)
|
|
63
|
+
A camada estática já checou. Só anote se encontrar algo que regex não pegaria (ex.: dados hardcoded disfarçados).
|
|
64
|
+
|
|
65
|
+
### Passo 4: Emitir verdito semântico
|
|
66
|
+
|
|
67
|
+
Salve em `.dare/review-semantic-<task-id>.json`:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"passed": true,
|
|
72
|
+
"unmetCriteria": [],
|
|
73
|
+
"notes": "Resumo de 1-3 frases"
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Falha:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"passed": false,
|
|
82
|
+
"unmetCriteria": [
|
|
83
|
+
"Seção 4.3: validação de senha sem regex de força",
|
|
84
|
+
"Seção 4.4: teste de 'email duplicado' não existe"
|
|
85
|
+
],
|
|
86
|
+
"notes": "2 critérios não atendidos em src/auth/register.ts"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Passo 5: Rodar o review fundido
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
dare review <task-id> --from-agent .dare/review-semantic-<task-id>.json
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Exit code 0 = pode ir para DONE; 1 = não pode.
|
|
97
|
+
|
|
98
|
+
### Passo 6: Mensagem final
|
|
99
|
+
|
|
100
|
+
Se passou:
|
|
101
|
+
> ✅ Task aprovada. Marque DONE: `dare execute --complete <task-id>`
|
|
102
|
+
|
|
103
|
+
Se falhou:
|
|
104
|
+
> ❌ Task não passou. Itens a corrigir: [lista]. Re-rode após corrigir.
|
|
105
|
+
|
|
106
|
+
## Regras inegociáveis
|
|
107
|
+
|
|
108
|
+
- **Não invente** que algo está implementado se não viu o código no disco
|
|
109
|
+
- **Não aceite** mocks/stubs em código de produção mesmo que façam testes passar
|
|
110
|
+
- **Mocks são OK** dentro de `*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/`
|
|
111
|
+
- **Evidência concreta:** sempre cite arquivo + linha para suas conclusões
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-rust-leptos
|
|
3
|
+
description: Guia DARE para desenvolvimento Leptos (Rust + WASM) — decisão CSR vs Fullstack, idioms 0.7, antipatterns, tipos compartilhados server+WASM com cfg_attr, workspace misto WASM+nativo, templates de tasks.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Rust/Leptos Skill
|
|
7
|
+
|
|
8
|
+
Você é um especialista em Leptos 0.7+ (framework reativo Rust → WASM). Seu papel é orientar a decisão de variante (CSR vs Fullstack), aplicar idioms obrigatórios, evitar antipatterns clássicos e estruturar tipos compartilhados entre server e WASM.
|
|
9
|
+
|
|
10
|
+
## Quando usar
|
|
11
|
+
|
|
12
|
+
- Projeto novo Leptos sendo iniciado
|
|
13
|
+
- Decisão CSR vs Fullstack precisa ser tomada
|
|
14
|
+
- Workspace misto (Leptos + Axum + napi-rs) com problemas de target
|
|
15
|
+
- Tipos compartilhados quebrando entre server e WASM
|
|
16
|
+
- Effect/Resource/Action sendo mal usados
|
|
17
|
+
|
|
18
|
+
## 1. Decisão de variante: CSR vs Fullstack
|
|
19
|
+
|
|
20
|
+
| Critério | CSR (trunk) | Fullstack (cargo-leptos) |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| SEO necessário | ❌ | ✅ |
|
|
23
|
+
| Time-to-interactive crítico | ❌ | ✅ |
|
|
24
|
+
| Dashboard interno / admin | ✅ | ✅ |
|
|
25
|
+
| Backend Axum existente | indiferente | ✅ integração direta |
|
|
26
|
+
| Simplicidade de deploy | ✅ arquivos estáticos | ⚠️ binário Axum |
|
|
27
|
+
| Server functions (`#[server]`) | ❌ não existe | ✅ |
|
|
28
|
+
|
|
29
|
+
**Regra de ouro:**
|
|
30
|
+
- Atrás de login e SEO não importa → **CSR**
|
|
31
|
+
- Precisa SEO, carregamento inicial rápido, ou server functions → **Fullstack**
|
|
32
|
+
- Já tem Axum no monorepo → **Fullstack** (workspace unificado)
|
|
33
|
+
|
|
34
|
+
## 2. Ferramentas — nunca misturar
|
|
35
|
+
|
|
36
|
+
| Variante | Build | Dev server | Test |
|
|
37
|
+
|---|---|---|---|
|
|
38
|
+
| CSR | `trunk build --release` | `trunk serve` | `cargo test --workspace` |
|
|
39
|
+
| Fullstack | `cargo leptos build --release` | `cargo leptos watch` | `cargo test --workspace` |
|
|
40
|
+
|
|
41
|
+
> `cargo leptos test` **não existe**. Use `cargo test --workspace`.
|
|
42
|
+
> Não use `trunk` para fullstack nem `cargo leptos` para CSR.
|
|
43
|
+
|
|
44
|
+
## 3. Idioms obrigatórios Leptos 0.7
|
|
45
|
+
|
|
46
|
+
### Estado reativo
|
|
47
|
+
|
|
48
|
+
```rust
|
|
49
|
+
// Signals — só re-renderiza o que usa
|
|
50
|
+
let (count, set_count) = signal(0);
|
|
51
|
+
let doubled = move || count.get() * 2; // derived (memo inline)
|
|
52
|
+
|
|
53
|
+
// Para estado compartilhado:
|
|
54
|
+
let count = RwSignal::new(0);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Dados assíncronos
|
|
58
|
+
|
|
59
|
+
```rust
|
|
60
|
+
// ✅ Resource — declarativo, integra com Suspense
|
|
61
|
+
let user = Resource::new(|| user_id(), |id| async move { fetch_user(id).await });
|
|
62
|
+
|
|
63
|
+
view! {
|
|
64
|
+
<Suspense fallback=|| view! { <p>"Loading..."</p> }>
|
|
65
|
+
{move || user.get().map(|u| view! { <p>{u.name}</p> })}
|
|
66
|
+
</Suspense>
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ❌ Effect que faz fetch (re-executa em todo render)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Mutações
|
|
73
|
+
|
|
74
|
+
```rust
|
|
75
|
+
// ✅ Action — submits, forms, operações
|
|
76
|
+
let save = Action::new(|input: &String| {
|
|
77
|
+
let input = input.clone();
|
|
78
|
+
async move { api::save(input).await }
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
view! {
|
|
82
|
+
<button on:click=move |_| save.dispatch("hello".to_string())>"Save"</button>
|
|
83
|
+
<Show when=move || save.pending().get()><p>"Saving..."</p></Show>
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Listas e condicionais
|
|
88
|
+
|
|
89
|
+
```rust
|
|
90
|
+
view! {
|
|
91
|
+
<Show when=move || logged_in.get() fallback=|| view! { <Login/> }>
|
|
92
|
+
<Dashboard/>
|
|
93
|
+
</Show>
|
|
94
|
+
|
|
95
|
+
<For
|
|
96
|
+
each=move || items.get()
|
|
97
|
+
key=|item| item.id
|
|
98
|
+
children=move |item| view! { <ItemRow item=item/> }
|
|
99
|
+
/>
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Server functions (fullstack only)
|
|
104
|
+
|
|
105
|
+
```rust
|
|
106
|
+
#[server(SaveUser, "/api")]
|
|
107
|
+
pub async fn save_user(name: String) -> Result<User, ServerFnError> {
|
|
108
|
+
// Só roda no server (feature = "ssr")
|
|
109
|
+
db::create_user(name).await.map_err(Into::into)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// No componente
|
|
113
|
+
let save = ServerAction::<SaveUser>::new();
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 4. Tipos compartilhados server + WASM
|
|
117
|
+
|
|
118
|
+
```rust
|
|
119
|
+
// crates/<projeto>-domain/src/lib.rs
|
|
120
|
+
use serde::{Deserialize, Serialize};
|
|
121
|
+
|
|
122
|
+
#[cfg_attr(feature = "ssr", derive(sqlx::FromRow))] // só no server
|
|
123
|
+
#[derive(Clone, Debug, Serialize, Deserialize)] // server + WASM
|
|
124
|
+
pub struct SecurityEvent {
|
|
125
|
+
pub id: uuid::Uuid,
|
|
126
|
+
pub attack_type: String,
|
|
127
|
+
pub risk_score: f32,
|
|
128
|
+
pub blocked: bool,
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
`Cargo.toml`:
|
|
133
|
+
|
|
134
|
+
```toml
|
|
135
|
+
[dependencies]
|
|
136
|
+
serde = { version = "1.0", features = ["derive"] }
|
|
137
|
+
uuid = { version = "1.10", features = ["v4", "serde"] }
|
|
138
|
+
|
|
139
|
+
[dependencies.sqlx]
|
|
140
|
+
version = "0.8"
|
|
141
|
+
features = ["postgres", "runtime-tokio", "uuid"]
|
|
142
|
+
optional = true
|
|
143
|
+
|
|
144
|
+
[features]
|
|
145
|
+
ssr = ["dep:sqlx"]
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## 5. Workspace misto (WASM + nativo)
|
|
149
|
+
|
|
150
|
+
```toml
|
|
151
|
+
# Cargo.toml do workspace
|
|
152
|
+
[workspace]
|
|
153
|
+
resolver = "2"
|
|
154
|
+
members = [
|
|
155
|
+
"crates/<p>-core", # lib nativa (x86)
|
|
156
|
+
"crates/<p>-server", # bin nativo — Axum
|
|
157
|
+
"crates/<p>-web", # bin+lib WASM — Leptos
|
|
158
|
+
"crates/<p>-cli", # bin nativo
|
|
159
|
+
]
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
```toml
|
|
163
|
+
# crates/<p>-web/Cargo.toml — features separam server de WASM
|
|
164
|
+
[features]
|
|
165
|
+
default = []
|
|
166
|
+
hydrate = ["leptos/hydrate"]
|
|
167
|
+
ssr = ["dep:axum", "dep:leptos_axum", "dep:tokio", "leptos/ssr"]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
> **Antipattern crítico:** `[build] target = "wasm32-unknown-unknown"` no `.cargo/config.toml` raiz quebra todos os crates nativos. `cargo leptos` gerencia o target WASM internamente — não interfira.
|
|
171
|
+
|
|
172
|
+
## 6. Antipatterns
|
|
173
|
+
|
|
174
|
+
| Antipattern | Por quê | Alternativa |
|
|
175
|
+
|---|---|---|
|
|
176
|
+
| `wasm_bindgen` direto | Bypassa abstrações Leptos, frágil | APIs do Leptos (`web_sys` via feature) |
|
|
177
|
+
| `panic!` em componentes | Derruba o app sem `ErrorBoundary` | `Result<_, ServerFnError>` + `ErrorBoundary` |
|
|
178
|
+
| `Effect` que faz fetch | Re-executa a cada render | `Resource::new()` |
|
|
179
|
+
| `tokio::spawn` no client | `tokio` não existe no WASM | `spawn_local()` ou server function |
|
|
180
|
+
| `std::thread` no client | Não existe no WASM | Signals para paralelismo reativo |
|
|
181
|
+
| `cargo leptos test` | Comando inválido | `cargo test --workspace` |
|
|
182
|
+
| `[build] target` global | Quebra crates nativos | Sem target global; cargo-leptos gerencia |
|
|
183
|
+
|
|
184
|
+
## 7. Templates de tasks DARE
|
|
185
|
+
|
|
186
|
+
Cole no `DARE/dare-dag.yaml` após blueprint:
|
|
187
|
+
|
|
188
|
+
```yaml
|
|
189
|
+
- id: leptos-001
|
|
190
|
+
title: "Workspace, AppShell e Router base"
|
|
191
|
+
description: |
|
|
192
|
+
Cargo workspace com resolver = "2".
|
|
193
|
+
App component com leptos_router::Router.
|
|
194
|
+
Layout base (header, main, footer). Rota "/" → HomePage.
|
|
195
|
+
Ralph Loop: cargo leptos build --release + cargo test --workspace + cargo clippy
|
|
196
|
+
depends_on: []
|
|
197
|
+
|
|
198
|
+
- id: leptos-002
|
|
199
|
+
title: "Form com Action + server function"
|
|
200
|
+
description: |
|
|
201
|
+
#[server] fn para processar o form.
|
|
202
|
+
ActionForm ou Action manual.
|
|
203
|
+
Validar input no server (ServerFnError em erro).
|
|
204
|
+
Pending state com Action::pending().
|
|
205
|
+
depends_on: [leptos-001]
|
|
206
|
+
|
|
207
|
+
- id: leptos-003
|
|
208
|
+
title: "Lista paginada com Resource + Suspense"
|
|
209
|
+
description: |
|
|
210
|
+
Resource recebendo página como signal.
|
|
211
|
+
Envolver em Suspense com fallback loading.
|
|
212
|
+
ErrorBoundary para erros de fetch.
|
|
213
|
+
Paginação com For + key por ID.
|
|
214
|
+
depends_on: [leptos-001]
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 8. Stack canônica
|
|
218
|
+
|
|
219
|
+
| Camada | Cliente (WASM) | Server (Fullstack) |
|
|
220
|
+
|---|---|---|
|
|
221
|
+
| Framework | Leptos 0.7+ | Leptos 0.7 + leptos_axum |
|
|
222
|
+
| Roteamento | leptos_router | (compartilhado) |
|
|
223
|
+
| Estado server | Resource + Server Functions | sqlx + Axum |
|
|
224
|
+
| Estilo | Tailwind | — |
|
|
225
|
+
| Build | cargo-leptos / trunk | cargo-leptos |
|
|
226
|
+
|
|
227
|
+
## Como aplicar
|
|
228
|
+
|
|
229
|
+
### Passo 1: Decidir variante
|
|
230
|
+
|
|
231
|
+
Use a tabela em §1. Documente decisão no DESIGN.md.
|
|
232
|
+
|
|
233
|
+
### Passo 2: Setup workspace
|
|
234
|
+
|
|
235
|
+
Aplique `dare-rust-workspace` para layout multi-crate. `<p>-domain` em separado para tipos compartilhados.
|
|
236
|
+
|
|
237
|
+
### Passo 3: Implementar componentes seguindo idioms §3
|
|
238
|
+
|
|
239
|
+
Resource para fetch, Action para mutação, Show/For para condicional/lista.
|
|
240
|
+
|
|
241
|
+
### Passo 4: Server functions (fullstack)
|
|
242
|
+
|
|
243
|
+
`#[server]` para qualquer comunicação client→server. Validação no server, ServerFnError em erro.
|
|
244
|
+
|
|
245
|
+
### Passo 5: Ralph Loop validation
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
cargo leptos build --release # fullstack
|
|
249
|
+
# ou
|
|
250
|
+
trunk build --release # CSR
|
|
251
|
+
cargo test --workspace
|
|
252
|
+
cargo clippy --workspace --all-targets -- -D warnings
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Dicas
|
|
256
|
+
|
|
257
|
+
- **Combine** com `dare-rust-workspace` para decisão de layout
|
|
258
|
+
- **Para SSR**, use `leptos_axum` (não axum direto)
|
|
259
|
+
- **Hidratação** — sempre `view!` em ambos lados, server gera HTML inicial
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
Esta skill é parte do DARE Method e está sob licença MIT.
|