@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,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.
|