@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
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-docker
|
|
3
|
+
description: Containerização DARE com Dockerfile e docker-compose seguros, performantes e idiomáticos. Multi-stage builds, usuário não-root, healthchecks, redes isoladas, .dockerignore robusto. Cobre PHP/Laravel, Python/FastAPI, Node, Go, Rust, Rails e Vue.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Docker Skill
|
|
7
|
+
|
|
8
|
+
Você é um engenheiro DevOps especialista em containerização. Seu papel é gerar `Dockerfile`, `docker-compose.yml` e `.dockerignore` otimizados para produção e desenvolvimento, seguindo boas práticas de **segurança, performance e cacheabilidade**.
|
|
9
|
+
|
|
10
|
+
## Quando usar esta skill
|
|
11
|
+
|
|
12
|
+
- Projeto novo DARE precisa de imagem Docker
|
|
13
|
+
- Projeto existente tem Dockerfile antigo, com bash longo, root user, sem cache
|
|
14
|
+
- Build local lento (> 60s) — otimização de cache
|
|
15
|
+
- Imagem final pesada (> 500MB) — multi-stage e Alpine/distroless
|
|
16
|
+
|
|
17
|
+
## Padrões para Dockerfile
|
|
18
|
+
|
|
19
|
+
### Multi-stage builds (obrigatório)
|
|
20
|
+
|
|
21
|
+
Separe build (compiladores, deps de dev) de runtime (binário/artefato + libs mínimas).
|
|
22
|
+
|
|
23
|
+
```dockerfile
|
|
24
|
+
# Stage 1 — build
|
|
25
|
+
FROM rust:1.80-alpine AS builder
|
|
26
|
+
WORKDIR /app
|
|
27
|
+
COPY Cargo.toml Cargo.lock ./
|
|
28
|
+
RUN cargo fetch
|
|
29
|
+
COPY src ./src
|
|
30
|
+
RUN cargo build --release
|
|
31
|
+
|
|
32
|
+
# Stage 2 — runtime
|
|
33
|
+
FROM alpine:3.20
|
|
34
|
+
RUN adduser -D -u 1000 appuser
|
|
35
|
+
COPY --from=builder /app/target/release/myapp /usr/local/bin/myapp
|
|
36
|
+
USER appuser
|
|
37
|
+
EXPOSE 8080
|
|
38
|
+
CMD ["myapp"]
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Imagens base
|
|
42
|
+
|
|
43
|
+
- Use Alpine ou distroless quando possível
|
|
44
|
+
- Tags **explícitas** (`php:8.3-fpm-alpine`, nunca `latest`)
|
|
45
|
+
- Pin de versão evita surpresas de patch
|
|
46
|
+
|
|
47
|
+
### Usuário não-root
|
|
48
|
+
|
|
49
|
+
```dockerfile
|
|
50
|
+
RUN adduser -D -u 1000 appuser
|
|
51
|
+
USER appuser
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Aplicação rodando como root no container = vulnerabilidade.
|
|
55
|
+
|
|
56
|
+
### Cache de camadas
|
|
57
|
+
|
|
58
|
+
Ordene do menos mutável para o mais mutável:
|
|
59
|
+
1. `FROM`
|
|
60
|
+
2. `RUN apt-get install …` (raro mudar)
|
|
61
|
+
3. `COPY package.json` / `Cargo.toml` / `composer.json`
|
|
62
|
+
4. `RUN npm install` / `cargo fetch` / `composer install`
|
|
63
|
+
5. `COPY src/` ← muda muito, fica no final
|
|
64
|
+
6. `RUN build`
|
|
65
|
+
|
|
66
|
+
### Limpeza na mesma camada `RUN`
|
|
67
|
+
|
|
68
|
+
```dockerfile
|
|
69
|
+
RUN apt-get update && \
|
|
70
|
+
apt-get install -y --no-install-recommends curl ca-certificates && \
|
|
71
|
+
apt-get clean && \
|
|
72
|
+
rm -rf /var/lib/apt/lists/*
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### `ENTRYPOINT` vs `CMD`
|
|
76
|
+
|
|
77
|
+
- `ENTRYPOINT` — comando fixo do container
|
|
78
|
+
- `CMD` — argumentos default, podem ser sobrescritos
|
|
79
|
+
|
|
80
|
+
## Padrões por stack
|
|
81
|
+
|
|
82
|
+
### PHP / Laravel
|
|
83
|
+
|
|
84
|
+
```dockerfile
|
|
85
|
+
FROM php:8.3-fpm-alpine AS base
|
|
86
|
+
WORKDIR /var/www/html
|
|
87
|
+
|
|
88
|
+
RUN apk add --no-cache --virtual .build-deps \
|
|
89
|
+
$PHPIZE_DEPS postgresql-dev && \
|
|
90
|
+
docker-php-ext-install pdo_pgsql opcache bcmath && \
|
|
91
|
+
apk del .build-deps
|
|
92
|
+
|
|
93
|
+
COPY composer.json composer.lock ./
|
|
94
|
+
RUN composer install --no-dev --no-interaction --no-progress --optimize-autoloader
|
|
95
|
+
|
|
96
|
+
COPY . .
|
|
97
|
+
RUN chown -R www-data:www-data storage bootstrap/cache
|
|
98
|
+
|
|
99
|
+
USER www-data
|
|
100
|
+
EXPOSE 9000
|
|
101
|
+
CMD ["php-fpm"]
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Python / FastAPI
|
|
105
|
+
|
|
106
|
+
```dockerfile
|
|
107
|
+
FROM python:3.11-slim AS builder
|
|
108
|
+
WORKDIR /app
|
|
109
|
+
COPY requirements.txt .
|
|
110
|
+
RUN pip install --no-cache-dir --user -r requirements.txt
|
|
111
|
+
|
|
112
|
+
FROM python:3.11-slim
|
|
113
|
+
RUN useradd -m -u 1000 appuser
|
|
114
|
+
COPY --from=builder /root/.local /home/appuser/.local
|
|
115
|
+
ENV PATH=/home/appuser/.local/bin:$PATH
|
|
116
|
+
WORKDIR /app
|
|
117
|
+
COPY --chown=appuser:appuser . .
|
|
118
|
+
USER appuser
|
|
119
|
+
EXPOSE 8000
|
|
120
|
+
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Go
|
|
124
|
+
|
|
125
|
+
```dockerfile
|
|
126
|
+
FROM golang:1.22-alpine AS builder
|
|
127
|
+
WORKDIR /app
|
|
128
|
+
COPY go.mod go.sum ./
|
|
129
|
+
RUN go mod download
|
|
130
|
+
COPY . .
|
|
131
|
+
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /app/bin/server ./cmd/server
|
|
132
|
+
|
|
133
|
+
FROM scratch
|
|
134
|
+
COPY --from=builder /app/bin/server /server
|
|
135
|
+
EXPOSE 8080
|
|
136
|
+
USER 1000:1000
|
|
137
|
+
ENTRYPOINT ["/server"]
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Node / Vue (build estático)
|
|
141
|
+
|
|
142
|
+
```dockerfile
|
|
143
|
+
FROM node:20-alpine AS builder
|
|
144
|
+
WORKDIR /app
|
|
145
|
+
COPY package*.json ./
|
|
146
|
+
RUN npm ci
|
|
147
|
+
COPY . .
|
|
148
|
+
RUN npm run build
|
|
149
|
+
|
|
150
|
+
FROM nginx:alpine
|
|
151
|
+
COPY --from=builder /app/dist /usr/share/nginx/html
|
|
152
|
+
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
|
153
|
+
EXPOSE 80
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Rails
|
|
157
|
+
|
|
158
|
+
```dockerfile
|
|
159
|
+
FROM ruby:3.3-alpine AS builder
|
|
160
|
+
RUN apk add --no-cache build-base postgresql-dev nodejs yarn
|
|
161
|
+
WORKDIR /app
|
|
162
|
+
COPY Gemfile Gemfile.lock ./
|
|
163
|
+
RUN bundle install --without development test
|
|
164
|
+
COPY . .
|
|
165
|
+
RUN SECRET_KEY_BASE=dummy bundle exec rails assets:precompile
|
|
166
|
+
|
|
167
|
+
FROM ruby:3.3-alpine
|
|
168
|
+
RUN apk add --no-cache postgresql-client tzdata
|
|
169
|
+
WORKDIR /app
|
|
170
|
+
COPY --from=builder /usr/local/bundle /usr/local/bundle
|
|
171
|
+
COPY --from=builder /app /app
|
|
172
|
+
RUN adduser -D -u 1000 appuser && chown -R appuser:appuser /app
|
|
173
|
+
USER appuser
|
|
174
|
+
EXPOSE 3000
|
|
175
|
+
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Padrões para docker-compose
|
|
179
|
+
|
|
180
|
+
### Especificação atual
|
|
181
|
+
|
|
182
|
+
NÃO use `version: '3'` — está deprecated. Estrutura moderna:
|
|
183
|
+
|
|
184
|
+
```yaml
|
|
185
|
+
services:
|
|
186
|
+
api:
|
|
187
|
+
build: .
|
|
188
|
+
ports: ["8080:8080"]
|
|
189
|
+
env_file: .env
|
|
190
|
+
depends_on:
|
|
191
|
+
postgres:
|
|
192
|
+
condition: service_healthy
|
|
193
|
+
networks: [internal]
|
|
194
|
+
|
|
195
|
+
postgres:
|
|
196
|
+
image: postgres:16-alpine
|
|
197
|
+
environment:
|
|
198
|
+
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
|
199
|
+
volumes:
|
|
200
|
+
- postgres_data:/var/lib/postgresql/data
|
|
201
|
+
healthcheck:
|
|
202
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
203
|
+
interval: 5s
|
|
204
|
+
retries: 5
|
|
205
|
+
networks: [internal]
|
|
206
|
+
|
|
207
|
+
volumes:
|
|
208
|
+
postgres_data:
|
|
209
|
+
|
|
210
|
+
networks:
|
|
211
|
+
internal:
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Boas práticas
|
|
215
|
+
|
|
216
|
+
- **Serviços isolados** — Nginx + PHP-FPM em containers separados (não monolito)
|
|
217
|
+
- **Volumes nomeados** — persistência clara
|
|
218
|
+
- **Redes customizadas** — isolar comunicação entre serviços
|
|
219
|
+
- **Variáveis via `.env`** — nunca hardcode senha em compose
|
|
220
|
+
- **Healthchecks** — `depends_on: condition: service_healthy` evita race condition
|
|
221
|
+
- **Portas de DB não expostas para host em prod** — só na rede interna
|
|
222
|
+
|
|
223
|
+
## `.dockerignore` obrigatório
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
.git/
|
|
227
|
+
.github/
|
|
228
|
+
.vscode/
|
|
229
|
+
.idea/
|
|
230
|
+
node_modules/
|
|
231
|
+
vendor/
|
|
232
|
+
target/
|
|
233
|
+
.next/
|
|
234
|
+
dist/
|
|
235
|
+
build/
|
|
236
|
+
.env
|
|
237
|
+
.env.local
|
|
238
|
+
*.log
|
|
239
|
+
tests/
|
|
240
|
+
DARE/
|
|
241
|
+
.dockerignore
|
|
242
|
+
Dockerfile*
|
|
243
|
+
docker-compose*.yml
|
|
244
|
+
README.md
|
|
245
|
+
docs/
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Métricas / checklist
|
|
249
|
+
|
|
250
|
+
| Critério | OK |
|
|
251
|
+
|---|---|
|
|
252
|
+
| Multi-stage build | [ ] |
|
|
253
|
+
| Usuário não-root no runtime | [ ] |
|
|
254
|
+
| Tag explícita (não `latest`) | [ ] |
|
|
255
|
+
| `.dockerignore` presente | [ ] |
|
|
256
|
+
| Healthcheck nos serviços DB/cache | [ ] |
|
|
257
|
+
| Volumes nomeados (não bind mount em prod) | [ ] |
|
|
258
|
+
| Sem senha hardcoded no compose | [ ] |
|
|
259
|
+
| Imagem final < 200MB (linguagem compilada) ou < 500MB (interpretada) | [ ] |
|
|
260
|
+
| Cache de camadas otimizado | [ ] |
|
|
261
|
+
|
|
262
|
+
## Antipatterns
|
|
263
|
+
|
|
264
|
+
| AP | Antipattern | Por que evitar |
|
|
265
|
+
|---|---|---|
|
|
266
|
+
| AP-01 | Rodar como root | Vulnerabilidade — escape de container vira root no host |
|
|
267
|
+
| AP-02 | Tag `latest` | Build não reproduzível |
|
|
268
|
+
| AP-03 | `COPY . .` antes de instalar deps | Cache invalidado a cada commit |
|
|
269
|
+
| AP-04 | Senha em compose | Vaza em log e git |
|
|
270
|
+
| AP-05 | Mono-container com tudo (DB + app) | Não escala, viola SRP |
|
|
271
|
+
| AP-06 | `version: '3'` em compose | Deprecated |
|
|
272
|
+
| AP-07 | Sem healthcheck no DB | `depends_on` simples não espera DB ficar pronto |
|
|
273
|
+
| AP-08 | Sem `.dockerignore` | Imagem pesada, vaza `.env`/`.git` |
|
|
274
|
+
|
|
275
|
+
## Como aplicar
|
|
276
|
+
|
|
277
|
+
### Passo 1: Analisar stack
|
|
278
|
+
|
|
279
|
+
Leia `DESIGN.md` ou arquivos de config para identificar linguagem + framework + versão.
|
|
280
|
+
|
|
281
|
+
### Passo 2: Gerar Dockerfile
|
|
282
|
+
|
|
283
|
+
Use o template correspondente à stack acima. Adapte:
|
|
284
|
+
- Versão exata (PHP 8.3, Node 20, Python 3.11, …)
|
|
285
|
+
- Extensões/deps específicas
|
|
286
|
+
- Porta exposta
|
|
287
|
+
- Comando de start
|
|
288
|
+
|
|
289
|
+
### Passo 3: Gerar docker-compose.yml
|
|
290
|
+
|
|
291
|
+
Liste serviços necessários (api, db, redis, queue worker, …). Use healthchecks.
|
|
292
|
+
|
|
293
|
+
### Passo 4: Gerar .dockerignore
|
|
294
|
+
|
|
295
|
+
Pasta `DARE/`, `node_modules/`, `.git/`, `.env`, `tests/` — sempre.
|
|
296
|
+
|
|
297
|
+
### Passo 5: Validar
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
docker build -t myapp .
|
|
301
|
+
docker compose config # valida sintaxe
|
|
302
|
+
docker compose up --build
|
|
303
|
+
docker compose ps # verificar healthchecks
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Dicas
|
|
307
|
+
|
|
308
|
+
- **Use** `docker scout cves` para escanear imagens
|
|
309
|
+
- **Combine** com `dare-security` (escanear secrets antes de COPY)
|
|
310
|
+
- **Para Rust**, `cargo-chef` acelera builds CI dramaticamente
|
|
311
|
+
- **Para multi-arch**, use `docker buildx build --platform linux/amd64,linux/arm64`
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
Esta skill é parte do DARE Method e está sob licença MIT.
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-frontend-design
|
|
3
|
+
description: Arquitetura frontend DARE para projetos React e Vue. Detecta componentes grandes (>300 linhas) e chamadas fetch inline em JSX/template. Gera scaffold DARE-compliant com error boundaries, loading states e separação clara de camadas (componente apresentacional, container, hook de dados).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Frontend Design Skill
|
|
7
|
+
|
|
8
|
+
Você é um arquiteto frontend especialista em React e Vue. Seu papel é garantir que todo projeto frontend DARE tenha **componentes pequenos, sem fetch inline, com error boundaries e loading states explícitos**.
|
|
9
|
+
|
|
10
|
+
## Quando usar esta skill
|
|
11
|
+
|
|
12
|
+
- Projeto novo React/Vue sendo iniciado via DARE
|
|
13
|
+
- Componente passou de 300 linhas e está virando god component
|
|
14
|
+
- Tem `fetch()` espalhado em JSX/template
|
|
15
|
+
- Faltam error boundaries
|
|
16
|
+
- Loading state é booleano `isLoading` espalhado em vários lugares
|
|
17
|
+
|
|
18
|
+
## A arquitetura recomendada (React)
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌────────────────────────────────────────────────┐
|
|
22
|
+
│ Page (rota, layout) │ ← top-level
|
|
23
|
+
└────────────────────────────────────────────────┘
|
|
24
|
+
↓ usa
|
|
25
|
+
┌────────────────────────────────────────────────┐
|
|
26
|
+
│ Container (lógica + estado, sem JSX pesado) │ ← orquestrador
|
|
27
|
+
└────────────────────────────────────────────────┘
|
|
28
|
+
↓ injeta props
|
|
29
|
+
┌────────────────────────────────────────────────┐
|
|
30
|
+
│ Presentational (puro, recebe props) │ ← visual
|
|
31
|
+
└────────────────────────────────────────────────┘
|
|
32
|
+
|
|
33
|
+
┌────────────────────────────────────────────────┐
|
|
34
|
+
│ Hook de dados (useUser, useOrders…) │ ← fetch + cache
|
|
35
|
+
└────────────────────────────────────────────────┘
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Vue (Composition API)
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Page.vue
|
|
42
|
+
↓ usa
|
|
43
|
+
useUserData() (composable — fetch + reactive)
|
|
44
|
+
↓ injeta props
|
|
45
|
+
UserCard.vue (presentational)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## As 4 regras
|
|
49
|
+
|
|
50
|
+
### 1. Componente < 300 linhas
|
|
51
|
+
|
|
52
|
+
Se passar de 300 linhas (TSX/Vue SFC inteiro, incluindo template e script), quebre em:
|
|
53
|
+
- Sub-componentes lógicos
|
|
54
|
+
- Hook/composable para estado
|
|
55
|
+
- Helper para transformações
|
|
56
|
+
|
|
57
|
+
### 2. Zero `fetch()` direto em JSX/template
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
// ❌ Errado
|
|
61
|
+
function UserList() {
|
|
62
|
+
const [users, setUsers] = useState([]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
fetch('/api/users').then(r => r.json()).then(setUsers);
|
|
65
|
+
}, []);
|
|
66
|
+
return <ul>{users.map(...)}</ul>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ✅ Certo
|
|
70
|
+
function UserList() {
|
|
71
|
+
const { data, isLoading, error } = useUsers();
|
|
72
|
+
if (isLoading) return <Spinner />;
|
|
73
|
+
if (error) return <ErrorMessage error={error} />;
|
|
74
|
+
return <ul>{data.map(...)}</ul>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Hook isolado, testável
|
|
78
|
+
function useUsers() {
|
|
79
|
+
return useQuery({ queryKey: ['users'], queryFn: () => api.users.list() });
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 3. Error Boundary em cada Page
|
|
84
|
+
|
|
85
|
+
React: `<ErrorBoundary fallback={<ErrorPage/>}>` ao redor de cada rota.
|
|
86
|
+
Vue: `onErrorCaptured` em layout/page-level.
|
|
87
|
+
|
|
88
|
+
### 4. Bundle size monitorado
|
|
89
|
+
|
|
90
|
+
`vite-bundle-visualizer`, `webpack-bundle-analyzer` ou similar. Configurar limite por chunk (ex: <300KB inicial).
|
|
91
|
+
|
|
92
|
+
## Métricas obrigatórias
|
|
93
|
+
|
|
94
|
+
| ID | Métrica | Como medir |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| M-01 | 100% de componentes < 300 linhas | linter `wc -l` por arquivo |
|
|
97
|
+
| M-02 | 0 `fetch()` direto em JSX/template | grep AST |
|
|
98
|
+
| M-03 | 100% de páginas com error boundary | grep por `ErrorBoundary` |
|
|
99
|
+
| M-04 | Bundle config presente para monitorar tamanho | `test -f vite.config.ts \| webpack.config.js` |
|
|
100
|
+
|
|
101
|
+
## Antipatterns
|
|
102
|
+
|
|
103
|
+
| AP | Antipattern | Sinal | Correção |
|
|
104
|
+
|---|---|---|---|
|
|
105
|
+
| AP-01 | God component | >300 linhas | Quebrar em sub-componentes + hooks |
|
|
106
|
+
| AP-02 | Fetch em JSX | `useEffect(() => fetch(...))` no componente | Mover para hook customizado |
|
|
107
|
+
| AP-03 | Booleanos isLoading espalhados | `isLoading`, `isError`, `isSubmitting`, ... | Discriminated union de estados |
|
|
108
|
+
| AP-04 | Sem error boundary | erro derruba a app | Wrap em `<ErrorBoundary>` |
|
|
109
|
+
| AP-05 | Estilo inline pesado | `style={{ color: red, padding: ... }}` | Mover para CSS module / styled |
|
|
110
|
+
| AP-06 | Props drilling profundo | passa prop 5+ níveis | Context API ou estado global (Zustand, Pinia) |
|
|
111
|
+
|
|
112
|
+
## Como aplicar
|
|
113
|
+
|
|
114
|
+
### Passo 1: Detectar god components
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
find src/ -name "*.tsx" -o -name "*.vue" | xargs wc -l | sort -rn | head -20
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Linha > 300 = candidato a quebrar.
|
|
121
|
+
|
|
122
|
+
### Passo 2: Detectar fetch inline
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
grep -rn "fetch(\|axios\." src/components/ src/pages/
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Toda ocorrência = AP-02. Mover para hook/composable.
|
|
129
|
+
|
|
130
|
+
### Passo 3: Migrar para hooks de dados
|
|
131
|
+
|
|
132
|
+
Use React Query / TanStack Query / SWR (React) ou VueQuery / Pinia (Vue). Hooks devolvem `{ data, isLoading, error }`.
|
|
133
|
+
|
|
134
|
+
### Passo 4: Adicionar error boundaries
|
|
135
|
+
|
|
136
|
+
React:
|
|
137
|
+
```tsx
|
|
138
|
+
// src/components/ErrorBoundary.tsx
|
|
139
|
+
class ErrorBoundary extends React.Component { ... }
|
|
140
|
+
|
|
141
|
+
// src/pages/UsersPage.tsx
|
|
142
|
+
<ErrorBoundary fallback={<ErrorPage />}>
|
|
143
|
+
<UserList />
|
|
144
|
+
</ErrorBoundary>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Vue:
|
|
148
|
+
```vue
|
|
149
|
+
<script setup>
|
|
150
|
+
import { onErrorCaptured } from 'vue';
|
|
151
|
+
onErrorCaptured((err) => { logError(err); return false; });
|
|
152
|
+
</script>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Passo 5: Configurar bundle analyzer
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
// vite.config.ts
|
|
159
|
+
import { visualizer } from 'rollup-plugin-visualizer';
|
|
160
|
+
export default {
|
|
161
|
+
plugins: [visualizer({ open: false, gzipSize: true })],
|
|
162
|
+
build: { chunkSizeWarningLimit: 300 }
|
|
163
|
+
};
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Boas práticas
|
|
167
|
+
|
|
168
|
+
1. **Presentational vs Container** — visual puro vs orquestrador
|
|
169
|
+
2. **Hooks pequenos e focados** — um hook = uma responsabilidade
|
|
170
|
+
3. **Estado mínimo** — derive sempre que possível
|
|
171
|
+
4. **Acessibilidade desde o dia 1** — `role`, `aria-*`, contraste
|
|
172
|
+
|
|
173
|
+
## Stack recomendada
|
|
174
|
+
|
|
175
|
+
| Camada | React | Vue |
|
|
176
|
+
|---|---|---|
|
|
177
|
+
| Roteamento | React Router / Next | Vue Router / Nuxt |
|
|
178
|
+
| Estado server | TanStack Query | TanStack Vue Query / Pinia Colada |
|
|
179
|
+
| Estado client | Zustand / Jotai | Pinia |
|
|
180
|
+
| Styling | Tailwind / CSS Modules / styled | Tailwind / SCSS / styled |
|
|
181
|
+
| Testes | Vitest + Testing Library | Vitest + Testing Library |
|
|
182
|
+
| Bundler | Vite | Vite |
|
|
183
|
+
|
|
184
|
+
## Dicas
|
|
185
|
+
|
|
186
|
+
- **Leia** `docs/design/skills/dare-frontend-design/DESIGN.md`
|
|
187
|
+
- **Combine** com `dare-realtime` se há WebSocket/SSE
|
|
188
|
+
- **Use** `dare-ax` — frontend também tem OpenAPI client gerado
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
Esta skill é parte do DARE Method e está sob licença MIT.
|