@dewtech/dare-cli 2.17.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 +98 -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.js +49 -49
- 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.js +38 -38
- package/dist/__tests__/validate.test.js +65 -65
- package/dist/bin/dare.js +32 -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/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/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/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/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/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.js +252 -252
- 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/package.json +8 -3
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +48 -48
- package/templates/backend/node-nestjs/.env.example +9 -9
- package/templates/backend/node-nestjs/nest-cli.json +8 -8
- package/templates/backend/node-nestjs/package.json +50 -50
- package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
- package/templates/backend/node-nestjs/src/app.module.ts +15 -15
- package/templates/backend/node-nestjs/src/app.service.ts +8 -8
- package/templates/backend/node-nestjs/src/main.ts +24 -24
- package/templates/backend/node-nestjs/tsconfig.json +21 -21
- package/templates/backend/php-laravel/.env.example +22 -22
- package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
- package/templates/backend/php-laravel/composer.json +40 -40
- package/templates/backend/python-fastapi/.env.example +4 -4
- package/templates/backend/python-fastapi/app/api/router.py +8 -8
- package/templates/backend/python-fastapi/app/core/config.py +20 -20
- package/templates/backend/python-fastapi/main.py +35 -35
- package/templates/backend/python-fastapi/requirements.txt +13 -13
- package/templates/backend/rust-axum/.env.example +3 -3
- package/templates/backend/rust-axum/Cargo.toml +23 -23
- package/templates/backend/rust-axum/src/errors.rs +30 -30
- package/templates/backend/rust-axum/src/main.rs +32 -32
- package/templates/backend/rust-axum/src/routes.rs +6 -6
- package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
- package/templates/frontend/leptos-csr/Cargo.toml +16 -16
- package/templates/frontend/leptos-csr/Trunk.toml +10 -10
- package/templates/frontend/leptos-csr/index.html +11 -11
- package/templates/frontend/leptos-csr/src/lib.rs +20 -20
- package/templates/frontend/leptos-csr/style/main.scss +19 -19
- package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
- package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
- package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
- package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
- package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
- package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
- package/templates/frontend/react/index.html +12 -12
- package/templates/frontend/react/package.json +35 -35
- package/templates/frontend/react/src/App.tsx +25 -25
- package/templates/frontend/react/src/main.tsx +9 -9
- package/templates/frontend/vue/package.json +32 -32
- package/templates/frontend/vue/src/App.vue +7 -7
- package/templates/frontend/vue/src/main.ts +10 -10
- package/templates/frontend/vue/src/router/index.ts +14 -14
- package/templates/frontend/vue/src/views/HomeView.vue +6 -6
- package/templates/hooks/pre-commit-dare-validate +24 -24
- package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -0
- 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 -114
- package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -0
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
- 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 -265
- 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 -141
- package/templates/ide/claude/.claude/commands/dare-ax.md +131 -0
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
- package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -0
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
- package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -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 -145
- package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -0
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
- package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
- package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
- package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
- package/templates/ide/claude/.claude/commands/dare-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 -141
- package/templates/ide/cursor/.cursor/commands/dag-viz.md +139 -0
- package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +86 -86
- package/templates/ide/cursor/.cursor/commands/generate-design.md +35 -35
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +184 -184
- package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -107
- package/templates/ide/cursor/.cursor/commands/review-task.md +91 -91
- 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 -141
- 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
|
@@ -1,275 +1,275 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: dare-rust-workspace
|
|
3
|
-
description: Decisão e migração de Cargo workspace multi-crate para projetos Rust/Axum. Use durante design/blueprint para decidir o layout, ou quando um projeto single-crate cresceu além do que comporta confortavelmente. Cobre os 2 cenários — escolher na fase de design + migrar projeto existente — com critérios objetivos e plano em PRs.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# DARE — Rust Workspace Skill (single-crate vs multi-crate)
|
|
7
|
-
|
|
8
|
-
Use esta skill em dois momentos:
|
|
9
|
-
|
|
10
|
-
- **Design / Blueprint:** projeto Rust novo na stack `rust-axum`. Decida
|
|
11
|
-
desde o início se ele nasce single-crate ou em workspace multi-crate.
|
|
12
|
-
- **Migração:** projeto Rust single-crate **já existente** que cresceu
|
|
13
|
-
demais e está doendo. Proponha o plano de migração.
|
|
14
|
-
|
|
15
|
-
Regra geral: **comece simples, migre quando os critérios objetivos
|
|
16
|
-
abaixo aparecerem.** Workspace é a estrutura idiomática Rust para projetos
|
|
17
|
-
maduros, mas é overengineering para o "hello world".
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Cenário A — Decisão na fase Design/Blueprint
|
|
22
|
-
|
|
23
|
-
### Comece **single-crate** quando TODOS forem verdadeiros
|
|
24
|
-
|
|
25
|
-
- Apenas **1 binário** (HTTP server).
|
|
26
|
-
- Estimativa de **< 30 arquivos `.rs`** no `src/`.
|
|
27
|
-
- **1–2 sistemas externos** (apenas DB; ou DB + cache).
|
|
28
|
-
- **Equipe ≤ 2 devs**.
|
|
29
|
-
- Nenhum requisito de deploy independente para subcomponentes.
|
|
30
|
-
|
|
31
|
-
### Comece **workspace multi-crate** quando QUALQUER um for verdadeiro
|
|
32
|
-
|
|
33
|
-
- **≥ 2 binários** previstos (API + worker; API + admin; API + CLI).
|
|
34
|
-
- **Múltiplos sistemas externos** (3+: PG + Redis + Rabbit + Qdrant + Neo4j…).
|
|
35
|
-
- **Deploy independente** desejado (workers em pods separados no k8s).
|
|
36
|
-
- **Fronteiras arquiteturais** críticas (domain puro sem HTTP/DB; SDK
|
|
37
|
-
publicável; cliente compartilhado com outros projetos).
|
|
38
|
-
- **Equipe ≥ 3 devs** trabalhando em paralelo.
|
|
39
|
-
|
|
40
|
-
### Layout convencional para workspace
|
|
41
|
-
|
|
42
|
-
Use o prefixo do projeto (`<p>`) — ex: `wa-` para `wa-business-api`,
|
|
43
|
-
`agent-` para `agent-ai`.
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
projeto/
|
|
47
|
-
├── Cargo.toml # workspace root
|
|
48
|
-
├── docker-compose.yml
|
|
49
|
-
├── Dockerfile
|
|
50
|
-
├── crates/
|
|
51
|
-
│ ├── <p>-domain/ (lib) # entities puras
|
|
52
|
-
│ ├── <p>-config/ (lib) # AppConfig::from_env()
|
|
53
|
-
│ ├── <p>-db/ (lib) # sqlx pool, migrations
|
|
54
|
-
│ ├── <p>-cache/ (lib) # redis/moka
|
|
55
|
-
│ ├── <p>-queue/ (lib) # lapin/kafka
|
|
56
|
-
│ ├── <p>-crypto/ (lib) # bcrypt, jwt
|
|
57
|
-
│ ├── <p>-services/ (lib) # business logic, sem HTTP
|
|
58
|
-
│ ├── <p>-integrators/ (lib) # clientes externos (LLM, Stripe…)
|
|
59
|
-
│ ├── <p>-api/ (bin + lib) # HTTP server
|
|
60
|
-
│ ├── <p>-worker-<X>/ (bin) # 1 binário por tipo de worker
|
|
61
|
-
│ ├── <p>-admin/ (bin) # CLI admin
|
|
62
|
-
│ └── <p>-e2e/ (tests) # integration tests
|
|
63
|
-
└── xtask/ # scripts em Rust
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Granularidade: **um crate por bounded context**, NÃO por arquivo. Resista
|
|
67
|
-
ao "crate util" / "common" — vira lixeira.
|
|
68
|
-
|
|
69
|
-
### Cargo.toml workspace template
|
|
70
|
-
|
|
71
|
-
```toml
|
|
72
|
-
[workspace]
|
|
73
|
-
resolver = "2"
|
|
74
|
-
members = [
|
|
75
|
-
"crates/<p>-domain",
|
|
76
|
-
"crates/<p>-config",
|
|
77
|
-
"crates/<p>-db",
|
|
78
|
-
"crates/<p>-services",
|
|
79
|
-
"crates/<p>-api",
|
|
80
|
-
"crates/<p>-worker-x",
|
|
81
|
-
"crates/<p>-e2e",
|
|
82
|
-
"xtask",
|
|
83
|
-
]
|
|
84
|
-
|
|
85
|
-
[workspace.package]
|
|
86
|
-
version = "0.1.0"
|
|
87
|
-
edition = "2021"
|
|
88
|
-
rust-version = "1.80"
|
|
89
|
-
|
|
90
|
-
[workspace.dependencies]
|
|
91
|
-
tokio = { version = "1.40", features = ["full"] }
|
|
92
|
-
axum = { version = "0.7", features = ["macros"] }
|
|
93
|
-
sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "uuid", "chrono", "migrate"] }
|
|
94
|
-
serde = { version = "1.0", features = ["derive"] }
|
|
95
|
-
serde_json = "1.0"
|
|
96
|
-
thiserror = "1.0"
|
|
97
|
-
anyhow = "1.0"
|
|
98
|
-
tracing = "0.1"
|
|
99
|
-
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
|
|
100
|
-
uuid = { version = "1.10", features = ["v4", "serde"] }
|
|
101
|
-
chrono = { version = "0.4", features = ["serde"] }
|
|
102
|
-
|
|
103
|
-
[profile.release]
|
|
104
|
-
opt-level = 3
|
|
105
|
-
lto = "thin"
|
|
106
|
-
codegen-units = 1
|
|
107
|
-
strip = true
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Cada crate filho herda com `version.workspace = true` e
|
|
111
|
-
`<dep> = { workspace = true }`. Atualizar versão de uma dep = uma linha
|
|
112
|
-
no root.
|
|
113
|
-
|
|
114
|
-
### Diagrama Mermaid no BLUEPRINT.md
|
|
115
|
-
|
|
116
|
-
```mermaid
|
|
117
|
-
graph TD
|
|
118
|
-
api[<p>-api]
|
|
119
|
-
admin[<p>-admin]
|
|
120
|
-
worker[<p>-worker-flow]
|
|
121
|
-
services[<p>-services]
|
|
122
|
-
integrators[<p>-integrators]
|
|
123
|
-
db[<p>-db]
|
|
124
|
-
queue[<p>-queue]
|
|
125
|
-
domain[<p>-domain]
|
|
126
|
-
|
|
127
|
-
api --> services
|
|
128
|
-
admin --> services
|
|
129
|
-
worker --> services
|
|
130
|
-
services --> db
|
|
131
|
-
services --> queue
|
|
132
|
-
services --> integrators
|
|
133
|
-
services --> domain
|
|
134
|
-
db --> domain
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
Regras de seta:
|
|
138
|
-
- `<p>-domain` no fundo: ninguém depende para baixo dele.
|
|
139
|
-
- `<p>-services` no meio: depende de domain/db/queue, nunca de api.
|
|
140
|
-
- Binários (api/admin/worker) no topo: dependem de services, nunca um do
|
|
141
|
-
outro.
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## Cenário B — Migração de single-crate para workspace
|
|
146
|
-
|
|
147
|
-
### Sintomas objetivos de "hora de migrar"
|
|
148
|
-
|
|
149
|
-
- `src/` tem > 30 arquivos `.rs` ou > 6 subpastas top-level.
|
|
150
|
-
- Múltiplos "domínios verticais" misturados (handlers, services, workers,
|
|
151
|
-
integrators, mcp, acp, skills, tools…).
|
|
152
|
-
- Workers usam `tokio::spawn` no mesmo processo do API.
|
|
153
|
-
- `cargo build` incremental > 10s.
|
|
154
|
-
- Conflitos de merge frequentes no mesmo crate.
|
|
155
|
-
- Quer expor parte do código (cliente, SDK) como crate publicável.
|
|
156
|
-
|
|
157
|
-
### Plano em 4 PRs incrementais
|
|
158
|
-
|
|
159
|
-
Migração nunca é big-bang. Cada PR deve passar build/test/clippy no fim e
|
|
160
|
-
ser deployável.
|
|
161
|
-
|
|
162
|
-
#### PR 1 — Workers (mais isolados, menor risco)
|
|
163
|
-
|
|
164
|
-
```
|
|
165
|
-
src/workers/ → crates/<p>-worker-<nome>/
|
|
166
|
-
├── Cargo.toml
|
|
167
|
-
└── src/main.rs
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
- Cada `tokio::spawn(worker_x)` do `main.rs` da API vira um binário
|
|
171
|
-
próprio.
|
|
172
|
-
- API server **para de spawn workers** — workers sobem como processo
|
|
173
|
-
independente.
|
|
174
|
-
- `docker-compose.yml` ganha service novo por worker.
|
|
175
|
-
- Em k8s, cada worker vira Deployment próprio com scaling independente.
|
|
176
|
-
|
|
177
|
-
#### PR 2 — Integrators (clientes externos)
|
|
178
|
-
|
|
179
|
-
```
|
|
180
|
-
src/integrators/{llm, neo4j, qdrant}.rs → crates/<p>-integrators/src/lib.rs
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
- Tudo que fala com o mundo externo (LLM, DB externo, Stripe, Meta…) vira
|
|
184
|
-
lib.
|
|
185
|
-
- API e workers importam via `<p>-integrators = { path = "../<p>-integrators" }`.
|
|
186
|
-
- Crate é folha do grafo: NÃO depende de domain/services — só conhece
|
|
187
|
-
tipos request/response da API externa.
|
|
188
|
-
|
|
189
|
-
#### PR 3 — Domain (entidades puras)
|
|
190
|
-
|
|
191
|
-
```
|
|
192
|
-
src/models/ \
|
|
193
|
-
src/dto/ → crates/<p>-domain/src/lib.rs
|
|
194
|
-
src/error.rs (parte DomainError) /
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
- `<p>-domain` tem dependências **mínimas**: `serde`, `uuid`, `chrono`,
|
|
198
|
-
`thiserror`. Nada de axum, sqlx, redis.
|
|
199
|
-
- Force a regra: o Cargo.toml do domain NÃO inclui essas deps. Build
|
|
200
|
-
falha se alguém tentar.
|
|
201
|
-
- Todos os outros crates passam a usar `<p>-domain` em vez de
|
|
202
|
-
`crate::models::`.
|
|
203
|
-
|
|
204
|
-
#### PR 4 — API e raiz do workspace
|
|
205
|
-
|
|
206
|
-
```
|
|
207
|
-
Cargo.toml (raiz) → vira [workspace] puro, sem [package]
|
|
208
|
-
src/ (resto) → crates/<p>-api/src/
|
|
209
|
-
├── main.rs
|
|
210
|
-
├── lib.rs
|
|
211
|
-
├── handlers/
|
|
212
|
-
├── routes.rs
|
|
213
|
-
└── middleware/
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
- `Cargo.toml` raiz só tem `[workspace]` + `[workspace.package]` +
|
|
217
|
-
`[workspace.dependencies]` + `[profile.*]`.
|
|
218
|
-
- API vai pra `crates/<p>-api/`.
|
|
219
|
-
- Todas as deps centralizadas em `workspace.dependencies`.
|
|
220
|
-
|
|
221
|
-
### Validação após CADA PR
|
|
222
|
-
|
|
223
|
-
```bash
|
|
224
|
-
cargo build --workspace --all-targets
|
|
225
|
-
cargo test --workspace
|
|
226
|
-
cargo clippy --workspace --all-targets -- -D warnings
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
Mais o smoke E2E (subir compose, hitar `/healthz`, login, operação CRUD).
|
|
230
|
-
Se algum quebrar, o PR está incompleto.
|
|
231
|
-
|
|
232
|
-
### Antipatterns ao migrar
|
|
233
|
-
|
|
234
|
-
| Antipattern | Por que evitar |
|
|
235
|
-
|-------------|----------------|
|
|
236
|
-
| Big-bang (1 PR mexe em tudo) | Impossível revisar; impossível reverter |
|
|
237
|
-
| Crate `common`/`shared`/`utils` | Vira lixeira; viola SRP |
|
|
238
|
-
| Crate por arquivo (granular demais) | 50 crates de 100 linhas → parar build |
|
|
239
|
-
| Refactor de lógica + migração no mesmo PR | Bug fica escondido |
|
|
240
|
-
| Mover testes em PR separado | Crate sem test em produção é bug em standby |
|
|
241
|
-
| Esquecer de atualizar `xtask`/CI | Pipeline quebra; deploy vira pesadelo |
|
|
242
|
-
|
|
243
|
-
### Tradução de imports
|
|
244
|
-
|
|
245
|
-
| Antes (single-crate) | Depois (workspace) |
|
|
246
|
-
|----------------------|--------------------|
|
|
247
|
-
| `use crate::models::User;` | `use <p>_domain::User;` |
|
|
248
|
-
| `use crate::services::auth::login;` | `use <p>_services::auth::login;` |
|
|
249
|
-
| `use crate::integrators::llm::Gemini;` | `use <p>_integrators::llm::Gemini;` |
|
|
250
|
-
| `use crate::handlers::health::router;` | *fica igual — mesmo crate* |
|
|
251
|
-
|
|
252
|
-
Hifens (Cargo) viram underlines (Rust idents).
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
## Quando NÃO migrar
|
|
257
|
-
|
|
258
|
-
- Projeto < 30 arquivos, 1 binário, 1 dev → single-crate é mais simples.
|
|
259
|
-
- Sprint crítico em curso → migração é refactor estrutural; não combina
|
|
260
|
-
com prazo.
|
|
261
|
-
- Sem sinais reais de dor → build < 5s, sem conflitos, sem segundo
|
|
262
|
-
binário planejado.
|
|
263
|
-
|
|
264
|
-
Migração tem custo. Faça quando o ganho compensar.
|
|
265
|
-
|
|
266
|
-
## Checklist final
|
|
267
|
-
|
|
268
|
-
- [ ] Critérios objetivos documentados no BLUEPRINT
|
|
269
|
-
- [ ] Lista de crates com responsabilidade de cada
|
|
270
|
-
- [ ] Diagrama Mermaid do grafo de dependências
|
|
271
|
-
- [ ] `Cargo.toml` raiz com `workspace.dependencies` centralizadas
|
|
272
|
-
- [ ] `<p>-domain` sem dependência de HTTP/DB/cache
|
|
273
|
-
- [ ] Cada binário com `[[bin]]` no Cargo.toml do seu crate
|
|
274
|
-
- [ ] Migração em PRs incrementais (não big-bang)
|
|
275
|
-
- [ ] Ralph Loop verde após cada PR (`cargo build/test/clippy --workspace`)
|
|
1
|
+
---
|
|
2
|
+
name: dare-rust-workspace
|
|
3
|
+
description: Decisão e migração de Cargo workspace multi-crate para projetos Rust/Axum. Use durante design/blueprint para decidir o layout, ou quando um projeto single-crate cresceu além do que comporta confortavelmente. Cobre os 2 cenários — escolher na fase de design + migrar projeto existente — com critérios objetivos e plano em PRs.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE — Rust Workspace Skill (single-crate vs multi-crate)
|
|
7
|
+
|
|
8
|
+
Use esta skill em dois momentos:
|
|
9
|
+
|
|
10
|
+
- **Design / Blueprint:** projeto Rust novo na stack `rust-axum`. Decida
|
|
11
|
+
desde o início se ele nasce single-crate ou em workspace multi-crate.
|
|
12
|
+
- **Migração:** projeto Rust single-crate **já existente** que cresceu
|
|
13
|
+
demais e está doendo. Proponha o plano de migração.
|
|
14
|
+
|
|
15
|
+
Regra geral: **comece simples, migre quando os critérios objetivos
|
|
16
|
+
abaixo aparecerem.** Workspace é a estrutura idiomática Rust para projetos
|
|
17
|
+
maduros, mas é overengineering para o "hello world".
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Cenário A — Decisão na fase Design/Blueprint
|
|
22
|
+
|
|
23
|
+
### Comece **single-crate** quando TODOS forem verdadeiros
|
|
24
|
+
|
|
25
|
+
- Apenas **1 binário** (HTTP server).
|
|
26
|
+
- Estimativa de **< 30 arquivos `.rs`** no `src/`.
|
|
27
|
+
- **1–2 sistemas externos** (apenas DB; ou DB + cache).
|
|
28
|
+
- **Equipe ≤ 2 devs**.
|
|
29
|
+
- Nenhum requisito de deploy independente para subcomponentes.
|
|
30
|
+
|
|
31
|
+
### Comece **workspace multi-crate** quando QUALQUER um for verdadeiro
|
|
32
|
+
|
|
33
|
+
- **≥ 2 binários** previstos (API + worker; API + admin; API + CLI).
|
|
34
|
+
- **Múltiplos sistemas externos** (3+: PG + Redis + Rabbit + Qdrant + Neo4j…).
|
|
35
|
+
- **Deploy independente** desejado (workers em pods separados no k8s).
|
|
36
|
+
- **Fronteiras arquiteturais** críticas (domain puro sem HTTP/DB; SDK
|
|
37
|
+
publicável; cliente compartilhado com outros projetos).
|
|
38
|
+
- **Equipe ≥ 3 devs** trabalhando em paralelo.
|
|
39
|
+
|
|
40
|
+
### Layout convencional para workspace
|
|
41
|
+
|
|
42
|
+
Use o prefixo do projeto (`<p>`) — ex: `wa-` para `wa-business-api`,
|
|
43
|
+
`agent-` para `agent-ai`.
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
projeto/
|
|
47
|
+
├── Cargo.toml # workspace root
|
|
48
|
+
├── docker-compose.yml
|
|
49
|
+
├── Dockerfile
|
|
50
|
+
├── crates/
|
|
51
|
+
│ ├── <p>-domain/ (lib) # entities puras
|
|
52
|
+
│ ├── <p>-config/ (lib) # AppConfig::from_env()
|
|
53
|
+
│ ├── <p>-db/ (lib) # sqlx pool, migrations
|
|
54
|
+
│ ├── <p>-cache/ (lib) # redis/moka
|
|
55
|
+
│ ├── <p>-queue/ (lib) # lapin/kafka
|
|
56
|
+
│ ├── <p>-crypto/ (lib) # bcrypt, jwt
|
|
57
|
+
│ ├── <p>-services/ (lib) # business logic, sem HTTP
|
|
58
|
+
│ ├── <p>-integrators/ (lib) # clientes externos (LLM, Stripe…)
|
|
59
|
+
│ ├── <p>-api/ (bin + lib) # HTTP server
|
|
60
|
+
│ ├── <p>-worker-<X>/ (bin) # 1 binário por tipo de worker
|
|
61
|
+
│ ├── <p>-admin/ (bin) # CLI admin
|
|
62
|
+
│ └── <p>-e2e/ (tests) # integration tests
|
|
63
|
+
└── xtask/ # scripts em Rust
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Granularidade: **um crate por bounded context**, NÃO por arquivo. Resista
|
|
67
|
+
ao "crate util" / "common" — vira lixeira.
|
|
68
|
+
|
|
69
|
+
### Cargo.toml workspace template
|
|
70
|
+
|
|
71
|
+
```toml
|
|
72
|
+
[workspace]
|
|
73
|
+
resolver = "2"
|
|
74
|
+
members = [
|
|
75
|
+
"crates/<p>-domain",
|
|
76
|
+
"crates/<p>-config",
|
|
77
|
+
"crates/<p>-db",
|
|
78
|
+
"crates/<p>-services",
|
|
79
|
+
"crates/<p>-api",
|
|
80
|
+
"crates/<p>-worker-x",
|
|
81
|
+
"crates/<p>-e2e",
|
|
82
|
+
"xtask",
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
[workspace.package]
|
|
86
|
+
version = "0.1.0"
|
|
87
|
+
edition = "2021"
|
|
88
|
+
rust-version = "1.80"
|
|
89
|
+
|
|
90
|
+
[workspace.dependencies]
|
|
91
|
+
tokio = { version = "1.40", features = ["full"] }
|
|
92
|
+
axum = { version = "0.7", features = ["macros"] }
|
|
93
|
+
sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "uuid", "chrono", "migrate"] }
|
|
94
|
+
serde = { version = "1.0", features = ["derive"] }
|
|
95
|
+
serde_json = "1.0"
|
|
96
|
+
thiserror = "1.0"
|
|
97
|
+
anyhow = "1.0"
|
|
98
|
+
tracing = "0.1"
|
|
99
|
+
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
|
|
100
|
+
uuid = { version = "1.10", features = ["v4", "serde"] }
|
|
101
|
+
chrono = { version = "0.4", features = ["serde"] }
|
|
102
|
+
|
|
103
|
+
[profile.release]
|
|
104
|
+
opt-level = 3
|
|
105
|
+
lto = "thin"
|
|
106
|
+
codegen-units = 1
|
|
107
|
+
strip = true
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Cada crate filho herda com `version.workspace = true` e
|
|
111
|
+
`<dep> = { workspace = true }`. Atualizar versão de uma dep = uma linha
|
|
112
|
+
no root.
|
|
113
|
+
|
|
114
|
+
### Diagrama Mermaid no BLUEPRINT.md
|
|
115
|
+
|
|
116
|
+
```mermaid
|
|
117
|
+
graph TD
|
|
118
|
+
api[<p>-api]
|
|
119
|
+
admin[<p>-admin]
|
|
120
|
+
worker[<p>-worker-flow]
|
|
121
|
+
services[<p>-services]
|
|
122
|
+
integrators[<p>-integrators]
|
|
123
|
+
db[<p>-db]
|
|
124
|
+
queue[<p>-queue]
|
|
125
|
+
domain[<p>-domain]
|
|
126
|
+
|
|
127
|
+
api --> services
|
|
128
|
+
admin --> services
|
|
129
|
+
worker --> services
|
|
130
|
+
services --> db
|
|
131
|
+
services --> queue
|
|
132
|
+
services --> integrators
|
|
133
|
+
services --> domain
|
|
134
|
+
db --> domain
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Regras de seta:
|
|
138
|
+
- `<p>-domain` no fundo: ninguém depende para baixo dele.
|
|
139
|
+
- `<p>-services` no meio: depende de domain/db/queue, nunca de api.
|
|
140
|
+
- Binários (api/admin/worker) no topo: dependem de services, nunca um do
|
|
141
|
+
outro.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Cenário B — Migração de single-crate para workspace
|
|
146
|
+
|
|
147
|
+
### Sintomas objetivos de "hora de migrar"
|
|
148
|
+
|
|
149
|
+
- `src/` tem > 30 arquivos `.rs` ou > 6 subpastas top-level.
|
|
150
|
+
- Múltiplos "domínios verticais" misturados (handlers, services, workers,
|
|
151
|
+
integrators, mcp, acp, skills, tools…).
|
|
152
|
+
- Workers usam `tokio::spawn` no mesmo processo do API.
|
|
153
|
+
- `cargo build` incremental > 10s.
|
|
154
|
+
- Conflitos de merge frequentes no mesmo crate.
|
|
155
|
+
- Quer expor parte do código (cliente, SDK) como crate publicável.
|
|
156
|
+
|
|
157
|
+
### Plano em 4 PRs incrementais
|
|
158
|
+
|
|
159
|
+
Migração nunca é big-bang. Cada PR deve passar build/test/clippy no fim e
|
|
160
|
+
ser deployável.
|
|
161
|
+
|
|
162
|
+
#### PR 1 — Workers (mais isolados, menor risco)
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
src/workers/ → crates/<p>-worker-<nome>/
|
|
166
|
+
├── Cargo.toml
|
|
167
|
+
└── src/main.rs
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
- Cada `tokio::spawn(worker_x)` do `main.rs` da API vira um binário
|
|
171
|
+
próprio.
|
|
172
|
+
- API server **para de spawn workers** — workers sobem como processo
|
|
173
|
+
independente.
|
|
174
|
+
- `docker-compose.yml` ganha service novo por worker.
|
|
175
|
+
- Em k8s, cada worker vira Deployment próprio com scaling independente.
|
|
176
|
+
|
|
177
|
+
#### PR 2 — Integrators (clientes externos)
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
src/integrators/{llm, neo4j, qdrant}.rs → crates/<p>-integrators/src/lib.rs
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
- Tudo que fala com o mundo externo (LLM, DB externo, Stripe, Meta…) vira
|
|
184
|
+
lib.
|
|
185
|
+
- API e workers importam via `<p>-integrators = { path = "../<p>-integrators" }`.
|
|
186
|
+
- Crate é folha do grafo: NÃO depende de domain/services — só conhece
|
|
187
|
+
tipos request/response da API externa.
|
|
188
|
+
|
|
189
|
+
#### PR 3 — Domain (entidades puras)
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
src/models/ \
|
|
193
|
+
src/dto/ → crates/<p>-domain/src/lib.rs
|
|
194
|
+
src/error.rs (parte DomainError) /
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
- `<p>-domain` tem dependências **mínimas**: `serde`, `uuid`, `chrono`,
|
|
198
|
+
`thiserror`. Nada de axum, sqlx, redis.
|
|
199
|
+
- Force a regra: o Cargo.toml do domain NÃO inclui essas deps. Build
|
|
200
|
+
falha se alguém tentar.
|
|
201
|
+
- Todos os outros crates passam a usar `<p>-domain` em vez de
|
|
202
|
+
`crate::models::`.
|
|
203
|
+
|
|
204
|
+
#### PR 4 — API e raiz do workspace
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
Cargo.toml (raiz) → vira [workspace] puro, sem [package]
|
|
208
|
+
src/ (resto) → crates/<p>-api/src/
|
|
209
|
+
├── main.rs
|
|
210
|
+
├── lib.rs
|
|
211
|
+
├── handlers/
|
|
212
|
+
├── routes.rs
|
|
213
|
+
└── middleware/
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
- `Cargo.toml` raiz só tem `[workspace]` + `[workspace.package]` +
|
|
217
|
+
`[workspace.dependencies]` + `[profile.*]`.
|
|
218
|
+
- API vai pra `crates/<p>-api/`.
|
|
219
|
+
- Todas as deps centralizadas em `workspace.dependencies`.
|
|
220
|
+
|
|
221
|
+
### Validação após CADA PR
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
cargo build --workspace --all-targets
|
|
225
|
+
cargo test --workspace
|
|
226
|
+
cargo clippy --workspace --all-targets -- -D warnings
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Mais o smoke E2E (subir compose, hitar `/healthz`, login, operação CRUD).
|
|
230
|
+
Se algum quebrar, o PR está incompleto.
|
|
231
|
+
|
|
232
|
+
### Antipatterns ao migrar
|
|
233
|
+
|
|
234
|
+
| Antipattern | Por que evitar |
|
|
235
|
+
|-------------|----------------|
|
|
236
|
+
| Big-bang (1 PR mexe em tudo) | Impossível revisar; impossível reverter |
|
|
237
|
+
| Crate `common`/`shared`/`utils` | Vira lixeira; viola SRP |
|
|
238
|
+
| Crate por arquivo (granular demais) | 50 crates de 100 linhas → parar build |
|
|
239
|
+
| Refactor de lógica + migração no mesmo PR | Bug fica escondido |
|
|
240
|
+
| Mover testes em PR separado | Crate sem test em produção é bug em standby |
|
|
241
|
+
| Esquecer de atualizar `xtask`/CI | Pipeline quebra; deploy vira pesadelo |
|
|
242
|
+
|
|
243
|
+
### Tradução de imports
|
|
244
|
+
|
|
245
|
+
| Antes (single-crate) | Depois (workspace) |
|
|
246
|
+
|----------------------|--------------------|
|
|
247
|
+
| `use crate::models::User;` | `use <p>_domain::User;` |
|
|
248
|
+
| `use crate::services::auth::login;` | `use <p>_services::auth::login;` |
|
|
249
|
+
| `use crate::integrators::llm::Gemini;` | `use <p>_integrators::llm::Gemini;` |
|
|
250
|
+
| `use crate::handlers::health::router;` | *fica igual — mesmo crate* |
|
|
251
|
+
|
|
252
|
+
Hifens (Cargo) viram underlines (Rust idents).
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Quando NÃO migrar
|
|
257
|
+
|
|
258
|
+
- Projeto < 30 arquivos, 1 binário, 1 dev → single-crate é mais simples.
|
|
259
|
+
- Sprint crítico em curso → migração é refactor estrutural; não combina
|
|
260
|
+
com prazo.
|
|
261
|
+
- Sem sinais reais de dor → build < 5s, sem conflitos, sem segundo
|
|
262
|
+
binário planejado.
|
|
263
|
+
|
|
264
|
+
Migração tem custo. Faça quando o ganho compensar.
|
|
265
|
+
|
|
266
|
+
## Checklist final
|
|
267
|
+
|
|
268
|
+
- [ ] Critérios objetivos documentados no BLUEPRINT
|
|
269
|
+
- [ ] Lista de crates com responsabilidade de cada
|
|
270
|
+
- [ ] Diagrama Mermaid do grafo de dependências
|
|
271
|
+
- [ ] `Cargo.toml` raiz com `workspace.dependencies` centralizadas
|
|
272
|
+
- [ ] `<p>-domain` sem dependência de HTTP/DB/cache
|
|
273
|
+
- [ ] Cada binário com `[[bin]]` no Cargo.toml do seu crate
|
|
274
|
+
- [ ] Migração em PRs incrementais (não big-bang)
|
|
275
|
+
- [ ] Ralph Loop verde após cada PR (`cargo build/test/clippy --workspace`)
|