@dewtech/dare-cli 2.17.0 → 3.1.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 +140 -39
- 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 +30 -3
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/__tests__/init.integration.spec.d.ts +2 -0
- package/dist/commands/__tests__/init.integration.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/init.integration.spec.js +134 -0
- package/dist/commands/__tests__/init.integration.spec.js.map +1 -0
- 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/init.d.ts.map +1 -1
- package/dist/commands/init.js +84 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +101 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +16 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +104 -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/mcp-server/bin/server.js +0 -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/stacks/__tests__/dna-emitter.spec.d.ts +2 -0
- package/dist/stacks/__tests__/dna-emitter.spec.d.ts.map +1 -0
- package/dist/stacks/__tests__/dna-emitter.spec.js +207 -0
- package/dist/stacks/__tests__/dna-emitter.spec.js.map +1 -0
- package/dist/stacks/__tests__/dna.spec.d.ts +2 -0
- package/dist/stacks/__tests__/dna.spec.d.ts.map +1 -0
- package/dist/stacks/__tests__/dna.spec.js +211 -0
- package/dist/stacks/__tests__/dna.spec.js.map +1 -0
- package/dist/stacks/__tests__/parity-rails.fixture.json +228 -0
- package/dist/stacks/__tests__/parity-rails.spec.d.ts +2 -0
- package/dist/stacks/__tests__/parity-rails.spec.d.ts.map +1 -0
- package/dist/stacks/__tests__/parity-rails.spec.js +99 -0
- package/dist/stacks/__tests__/parity-rails.spec.js.map +1 -0
- package/dist/stacks/__tests__/registry.spec.d.ts +2 -0
- package/dist/stacks/__tests__/registry.spec.d.ts.map +1 -0
- package/dist/stacks/__tests__/registry.spec.js +101 -0
- package/dist/stacks/__tests__/registry.spec.js.map +1 -0
- package/dist/stacks/__tests__/template-engine.spec.d.ts +2 -0
- package/dist/stacks/__tests__/template-engine.spec.d.ts.map +1 -0
- package/dist/stacks/__tests__/template-engine.spec.js +149 -0
- package/dist/stacks/__tests__/template-engine.spec.js.map +1 -0
- package/dist/stacks/dna-emitter.d.ts +45 -0
- package/dist/stacks/dna-emitter.d.ts.map +1 -0
- package/dist/stacks/dna-emitter.js +267 -0
- package/dist/stacks/dna-emitter.js.map +1 -0
- package/dist/stacks/go-gin/__tests__/scaffold.spec.d.ts +2 -0
- package/dist/stacks/go-gin/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/go-gin/__tests__/scaffold.spec.js +221 -0
- package/dist/stacks/go-gin/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/go-gin/scaffold.d.ts +3 -0
- package/dist/stacks/go-gin/scaffold.d.ts.map +1 -0
- package/dist/stacks/go-gin/scaffold.js +105 -0
- package/dist/stacks/go-gin/scaffold.js.map +1 -0
- package/dist/stacks/go-stdlib/__tests__/scaffold.spec.d.ts +2 -0
- package/dist/stacks/go-stdlib/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/go-stdlib/__tests__/scaffold.spec.js +215 -0
- package/dist/stacks/go-stdlib/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/go-stdlib/scaffold.d.ts +3 -0
- package/dist/stacks/go-stdlib/scaffold.d.ts.map +1 -0
- package/dist/stacks/go-stdlib/scaffold.js +106 -0
- package/dist/stacks/go-stdlib/scaffold.js.map +1 -0
- package/dist/stacks/mcp-go/__tests__/scaffold.spec.d.ts +2 -0
- package/dist/stacks/mcp-go/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/mcp-go/__tests__/scaffold.spec.js +203 -0
- package/dist/stacks/mcp-go/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/mcp-go/scaffold.d.ts +3 -0
- package/dist/stacks/mcp-go/scaffold.d.ts.map +1 -0
- package/dist/stacks/mcp-go/scaffold.js +94 -0
- package/dist/stacks/mcp-go/scaffold.js.map +1 -0
- package/dist/stacks/mcp-node-ts/__tests__/scaffold.spec.d.ts +2 -0
- package/dist/stacks/mcp-node-ts/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/mcp-node-ts/__tests__/scaffold.spec.js +236 -0
- package/dist/stacks/mcp-node-ts/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/mcp-node-ts/scaffold.d.ts +3 -0
- package/dist/stacks/mcp-node-ts/scaffold.d.ts.map +1 -0
- package/dist/stacks/mcp-node-ts/scaffold.js +95 -0
- package/dist/stacks/mcp-node-ts/scaffold.js.map +1 -0
- package/dist/stacks/mcp-python/__tests__/scaffold.spec.d.ts +2 -0
- package/dist/stacks/mcp-python/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/mcp-python/__tests__/scaffold.spec.js +228 -0
- package/dist/stacks/mcp-python/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/mcp-python/scaffold.d.ts +3 -0
- package/dist/stacks/mcp-python/scaffold.d.ts.map +1 -0
- package/dist/stacks/mcp-python/scaffold.js +98 -0
- package/dist/stacks/mcp-python/scaffold.js.map +1 -0
- package/dist/stacks/mcp-rust/__tests__/scaffold.spec.d.ts +2 -0
- package/dist/stacks/mcp-rust/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/mcp-rust/__tests__/scaffold.spec.js +213 -0
- package/dist/stacks/mcp-rust/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/mcp-rust/scaffold.d.ts +3 -0
- package/dist/stacks/mcp-rust/scaffold.d.ts.map +1 -0
- package/dist/stacks/mcp-rust/scaffold.js +98 -0
- package/dist/stacks/mcp-rust/scaffold.js.map +1 -0
- package/dist/stacks/node-nestjs/__tests__/scaffold.spec.d.ts +2 -0
- package/dist/stacks/node-nestjs/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/node-nestjs/__tests__/scaffold.spec.js +172 -0
- package/dist/stacks/node-nestjs/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/node-nestjs/scaffold.d.ts +3 -0
- package/dist/stacks/node-nestjs/scaffold.d.ts.map +1 -0
- package/dist/stacks/node-nestjs/scaffold.js +117 -0
- package/dist/stacks/node-nestjs/scaffold.js.map +1 -0
- package/dist/stacks/php-laravel/__tests__/scaffold.spec.d.ts +2 -0
- package/dist/stacks/php-laravel/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/php-laravel/__tests__/scaffold.spec.js +205 -0
- package/dist/stacks/php-laravel/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/php-laravel/scaffold.d.ts +3 -0
- package/dist/stacks/php-laravel/scaffold.d.ts.map +1 -0
- package/dist/stacks/php-laravel/scaffold.js +109 -0
- package/dist/stacks/php-laravel/scaffold.js.map +1 -0
- package/dist/stacks/python-fastapi/__tests__/scaffold.spec.d.ts +2 -0
- package/dist/stacks/python-fastapi/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/python-fastapi/__tests__/scaffold.spec.js +168 -0
- package/dist/stacks/python-fastapi/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/python-fastapi/scaffold.d.ts +3 -0
- package/dist/stacks/python-fastapi/scaffold.d.ts.map +1 -0
- package/dist/stacks/python-fastapi/scaffold.js +108 -0
- package/dist/stacks/python-fastapi/scaffold.js.map +1 -0
- package/dist/stacks/registry.d.ts +38 -0
- package/dist/stacks/registry.d.ts.map +1 -0
- package/dist/stacks/registry.js +153 -0
- package/dist/stacks/registry.js.map +1 -0
- package/dist/stacks/ruby-rails-8/__tests__/scaffold.spec.d.ts +6 -0
- package/dist/stacks/ruby-rails-8/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/ruby-rails-8/__tests__/scaffold.spec.js +604 -0
- package/dist/stacks/ruby-rails-8/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/ruby-rails-8/scaffold.d.ts +91 -0
- package/dist/stacks/ruby-rails-8/scaffold.d.ts.map +1 -0
- package/dist/stacks/ruby-rails-8/scaffold.js +410 -0
- package/dist/stacks/ruby-rails-8/scaffold.js.map +1 -0
- package/dist/stacks/rust-axum/__tests__/scaffold.spec.d.ts +2 -0
- package/dist/stacks/rust-axum/__tests__/scaffold.spec.d.ts.map +1 -0
- package/dist/stacks/rust-axum/__tests__/scaffold.spec.js +203 -0
- package/dist/stacks/rust-axum/__tests__/scaffold.spec.js.map +1 -0
- package/dist/stacks/rust-axum/scaffold.d.ts +3 -0
- package/dist/stacks/rust-axum/scaffold.d.ts.map +1 -0
- package/dist/stacks/rust-axum/scaffold.js +105 -0
- package/dist/stacks/rust-axum/scaffold.js.map +1 -0
- package/dist/stacks/template-engine.d.ts +38 -0
- package/dist/stacks/template-engine.d.ts.map +1 -0
- package/dist/stacks/template-engine.js +134 -0
- package/dist/stacks/template-engine.js.map +1 -0
- package/dist/stacks/types.d.ts +69 -0
- package/dist/stacks/types.d.ts.map +1 -0
- package/dist/stacks/types.js +29 -0
- package/dist/stacks/types.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.d.ts +1 -1
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +268 -259
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/reverse-facts.d.ts +50 -0
- package/dist/utils/reverse-facts.d.ts.map +1 -0
- package/dist/utils/reverse-facts.js +291 -0
- package/dist/utils/reverse-facts.js.map +1 -0
- package/dist/utils/stack-bootstrap.d.ts +3 -2
- package/dist/utils/stack-bootstrap.d.ts.map +1 -1
- package/dist/utils/stack-bootstrap.js +417 -387
- package/dist/utils/stack-bootstrap.js.map +1 -1
- package/package.json +91 -82
- 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/templates/stacks/go-gin/.dare/skills.yml +11 -0
- package/templates/stacks/go-gin/.env.example +24 -0
- package/templates/stacks/go-gin/.github/workflows/dare-ci.yml +42 -0
- package/templates/stacks/go-gin/README.md.tpl +38 -0
- package/templates/stacks/go-gin/cmd/server/main.go.tpl +78 -0
- package/templates/stacks/go-gin/db/migrations/0001_create_users.down.sql +2 -0
- package/templates/stacks/go-gin/db/migrations/0001_create_users.up.sql +12 -0
- package/templates/stacks/go-gin/db/queries/users.sql +23 -0
- package/templates/stacks/go-gin/gitignore +7 -0
- package/templates/stacks/go-gin/go.mod.tpl +17 -0
- package/templates/stacks/go-gin/internal/config/config.go +41 -0
- package/templates/stacks/go-gin/internal/db/postgres.go.tpl +25 -0
- package/templates/stacks/go-gin/internal/handler/auth_handler.go.tpl +72 -0
- package/templates/stacks/go-gin/internal/handler/users_handler.go.tpl +72 -0
- package/templates/stacks/go-gin/internal/handler/ws_handler.go +37 -0
- package/templates/stacks/go-gin/internal/llm/dummy.go +14 -0
- package/templates/stacks/go-gin/internal/llm/provider.go +8 -0
- package/templates/stacks/go-gin/internal/middleware/jwt.go.tpl +58 -0
- package/templates/stacks/go-gin/internal/middleware/rate_limit.go +55 -0
- package/templates/stacks/go-gin/internal/model/user.go +17 -0
- package/templates/stacks/go-gin/internal/repository/users_repository.go.tpl +79 -0
- package/templates/stacks/go-gin/internal/service/auth_service.go.tpl +55 -0
- package/templates/stacks/go-gin/internal/service/users_service.go.tpl +53 -0
- package/templates/stacks/go-gin/llms.txt.tpl +54 -0
- package/templates/stacks/go-gin/openapi.json.tpl +46 -0
- package/templates/stacks/go-gin/sqlc.yaml +14 -0
- package/templates/stacks/go-gin/tests/smoke_test.go.tpl +22 -0
- package/templates/stacks/go-stdlib/.dare/skills.yml +11 -0
- package/templates/stacks/go-stdlib/.env.example +24 -0
- package/templates/stacks/go-stdlib/.github/workflows/dare-ci.yml +42 -0
- package/templates/stacks/go-stdlib/README.md.tpl +41 -0
- package/templates/stacks/go-stdlib/cmd/server/main.go.tpl +82 -0
- package/templates/stacks/go-stdlib/db/migrations/0001_create_users.down.sql +2 -0
- package/templates/stacks/go-stdlib/db/migrations/0001_create_users.up.sql +12 -0
- package/templates/stacks/go-stdlib/db/queries/users.sql +23 -0
- package/templates/stacks/go-stdlib/gitignore +6 -0
- package/templates/stacks/go-stdlib/go.mod.tpl +15 -0
- package/templates/stacks/go-stdlib/internal/config/config.go +41 -0
- package/templates/stacks/go-stdlib/internal/db/postgres.go.tpl +24 -0
- package/templates/stacks/go-stdlib/internal/handler/auth_handler.go.tpl +71 -0
- package/templates/stacks/go-stdlib/internal/handler/users_handler.go.tpl +84 -0
- package/templates/stacks/go-stdlib/internal/handler/ws_handler.go +36 -0
- package/templates/stacks/go-stdlib/internal/httpx/json.go +32 -0
- package/templates/stacks/go-stdlib/internal/llm/dummy.go +14 -0
- package/templates/stacks/go-stdlib/internal/llm/provider.go +8 -0
- package/templates/stacks/go-stdlib/internal/middleware/chain.go +21 -0
- package/templates/stacks/go-stdlib/internal/middleware/cors.go +27 -0
- package/templates/stacks/go-stdlib/internal/middleware/jwt.go.tpl +51 -0
- package/templates/stacks/go-stdlib/internal/middleware/rate_limit.go +81 -0
- package/templates/stacks/go-stdlib/internal/model/user.go +17 -0
- package/templates/stacks/go-stdlib/internal/repository/users_repository.go.tpl +75 -0
- package/templates/stacks/go-stdlib/internal/service/auth_service.go.tpl +55 -0
- package/templates/stacks/go-stdlib/internal/service/users_service.go.tpl +53 -0
- package/templates/stacks/go-stdlib/llms.txt.tpl +60 -0
- package/templates/stacks/go-stdlib/openapi.json.tpl +46 -0
- package/templates/stacks/go-stdlib/sqlc.yaml +14 -0
- package/templates/stacks/go-stdlib/tests/smoke_test.go.tpl +45 -0
- package/templates/stacks/mcp-go/.dare/skills.yml +8 -0
- package/templates/stacks/mcp-go/.env.example +14 -0
- package/templates/stacks/mcp-go/.github/workflows/dare-ci.yml +42 -0
- package/templates/stacks/mcp-go/README.md.tpl +50 -0
- package/templates/stacks/mcp-go/cmd/server/main.go.tpl +62 -0
- package/templates/stacks/mcp-go/gitignore +6 -0
- package/templates/stacks/mcp-go/go.mod.tpl +9 -0
- package/templates/stacks/mcp-go/internal/prompts/summarize.go +9 -0
- package/templates/stacks/mcp-go/internal/server/server.go.tpl +80 -0
- package/templates/stacks/mcp-go/internal/tools/echo.go +15 -0
- package/templates/stacks/mcp-go/internal/transports/http.go.tpl +21 -0
- package/templates/stacks/mcp-go/internal/transports/sse.go.tpl +17 -0
- package/templates/stacks/mcp-go/internal/transports/stdio.go.tpl +14 -0
- package/templates/stacks/mcp-go/llms.txt.tpl +60 -0
- package/templates/stacks/mcp-go/openapi.json.tpl +31 -0
- package/templates/stacks/mcp-go/tests/echo_test.go.tpl +37 -0
- package/templates/stacks/mcp-node-ts/.dare/skills.yml +8 -0
- package/templates/stacks/mcp-node-ts/.env.example +16 -0
- package/templates/stacks/mcp-node-ts/.github/workflows/dare-ci.yml +54 -0
- package/templates/stacks/mcp-node-ts/README.md.hbs +49 -0
- package/templates/stacks/mcp-node-ts/gitignore +7 -0
- package/templates/stacks/mcp-node-ts/llms.txt.hbs +61 -0
- package/templates/stacks/mcp-node-ts/openapi.json.hbs +39 -0
- package/templates/stacks/mcp-node-ts/package.json.hbs +35 -0
- package/templates/stacks/mcp-node-ts/src/cli.ts.hbs +71 -0
- package/templates/stacks/mcp-node-ts/src/prompts/index.ts +36 -0
- package/templates/stacks/mcp-node-ts/src/server.ts.hbs +45 -0
- package/templates/stacks/mcp-node-ts/src/tools/echo.ts +23 -0
- package/templates/stacks/mcp-node-ts/src/tools/index.ts +18 -0
- package/templates/stacks/mcp-node-ts/src/transports/http.ts +68 -0
- package/templates/stacks/mcp-node-ts/src/transports/sse.ts +58 -0
- package/templates/stacks/mcp-node-ts/src/transports/stdio.ts +5 -0
- package/templates/stacks/mcp-node-ts/tests/echo.test.ts +50 -0
- package/templates/stacks/mcp-node-ts/tsconfig.json +17 -0
- package/templates/stacks/mcp-python/.dare/skills.yml +8 -0
- package/templates/stacks/mcp-python/.env.example +14 -0
- package/templates/stacks/mcp-python/.github/workflows/dare-ci.yml +42 -0
- package/templates/stacks/mcp-python/README.md.j2 +49 -0
- package/templates/stacks/mcp-python/gitignore +12 -0
- package/templates/stacks/mcp-python/llms.txt.j2 +56 -0
- package/templates/stacks/mcp-python/openapi.json.j2 +33 -0
- package/templates/stacks/mcp-python/pyproject.toml.j2 +37 -0
- package/templates/stacks/mcp-python/src/__init__.py +0 -0
- package/templates/stacks/mcp-python/src/cli.py.j2 +68 -0
- package/templates/stacks/mcp-python/src/prompts/__init__.py +0 -0
- package/templates/stacks/mcp-python/src/prompts/summarize.py +10 -0
- package/templates/stacks/mcp-python/src/server.py.j2 +28 -0
- package/templates/stacks/mcp-python/src/tools/__init__.py +0 -0
- package/templates/stacks/mcp-python/src/tools/echo.py +12 -0
- package/templates/stacks/mcp-python/src/transports/__init__.py +0 -0
- package/templates/stacks/mcp-python/src/transports/http.py +12 -0
- package/templates/stacks/mcp-python/src/transports/sse.py +13 -0
- package/templates/stacks/mcp-python/src/transports/stdio.py +6 -0
- package/templates/stacks/mcp-python/tests/__init__.py +0 -0
- package/templates/stacks/mcp-python/tests/test_echo.py +28 -0
- package/templates/stacks/mcp-rust/.dare/skills.yml +8 -0
- package/templates/stacks/mcp-rust/.env.example +14 -0
- package/templates/stacks/mcp-rust/.github/workflows/dare-ci.yml +38 -0
- package/templates/stacks/mcp-rust/Cargo.toml.tera +35 -0
- package/templates/stacks/mcp-rust/README.md.tera +50 -0
- package/templates/stacks/mcp-rust/gitignore +5 -0
- package/templates/stacks/mcp-rust/llms.txt.tera +60 -0
- package/templates/stacks/mcp-rust/openapi.json.tera +31 -0
- package/templates/stacks/mcp-rust/src/cli.rs.tera +33 -0
- package/templates/stacks/mcp-rust/src/lib.rs +6 -0
- package/templates/stacks/mcp-rust/src/main.rs.tera +30 -0
- package/templates/stacks/mcp-rust/src/prompts/mod.rs +1 -0
- package/templates/stacks/mcp-rust/src/prompts/summarize.rs +5 -0
- package/templates/stacks/mcp-rust/src/server.rs.tera +38 -0
- package/templates/stacks/mcp-rust/src/tools/echo.rs +18 -0
- package/templates/stacks/mcp-rust/src/tools/mod.rs +22 -0
- package/templates/stacks/mcp-rust/src/transports/http.rs +27 -0
- package/templates/stacks/mcp-rust/src/transports/mod.rs +3 -0
- package/templates/stacks/mcp-rust/src/transports/sse.rs +33 -0
- package/templates/stacks/mcp-rust/src/transports/stdio.rs +14 -0
- package/templates/stacks/mcp-rust/tests/echo_test.rs.tera +27 -0
- package/templates/stacks/node-nestjs/.dare/skills.yml +11 -0
- package/templates/stacks/node-nestjs/.env.example +21 -0
- package/templates/stacks/node-nestjs/.github/workflows/dare-ci.yml +54 -0
- package/templates/stacks/node-nestjs/README.md.hbs +35 -0
- package/templates/stacks/node-nestjs/gitignore +7 -0
- package/templates/stacks/node-nestjs/llms.txt.hbs +47 -0
- package/templates/stacks/node-nestjs/nest-cli.json +16 -0
- package/templates/stacks/node-nestjs/openapi.json.hbs +75 -0
- package/templates/stacks/node-nestjs/package.json.hbs +57 -0
- package/templates/stacks/node-nestjs/prisma/schema.prisma +25 -0
- package/templates/stacks/node-nestjs/prisma/seed.ts.hbs +25 -0
- package/templates/stacks/node-nestjs/src/app.module.ts +39 -0
- package/templates/stacks/node-nestjs/src/auth/auth.controller.ts +29 -0
- package/templates/stacks/node-nestjs/src/auth/auth.module.ts +25 -0
- package/templates/stacks/node-nestjs/src/auth/auth.service.ts +36 -0
- package/templates/stacks/node-nestjs/src/auth/dto/login-response.dto.ts +9 -0
- package/templates/stacks/node-nestjs/src/auth/dto/login.dto.ts +17 -0
- package/templates/stacks/node-nestjs/src/auth/jwt.strategy.ts +25 -0
- package/templates/stacks/node-nestjs/src/common/filters/problem-details.filter.ts +38 -0
- package/templates/stacks/node-nestjs/src/common/interceptors/json-response.interceptor.ts +13 -0
- package/templates/stacks/node-nestjs/src/main.ts.hbs +44 -0
- package/templates/stacks/node-nestjs/src/prisma/prisma.module.ts +9 -0
- package/templates/stacks/node-nestjs/src/prisma/prisma.service.ts +9 -0
- package/templates/stacks/node-nestjs/src/users/dto/create-user.dto.ts +22 -0
- package/templates/stacks/node-nestjs/src/users/dto/user.dto.ts +15 -0
- package/templates/stacks/node-nestjs/src/users/users.controller.ts +41 -0
- package/templates/stacks/node-nestjs/src/users/users.module.ts +11 -0
- package/templates/stacks/node-nestjs/src/users/users.repository.ts +38 -0
- package/templates/stacks/node-nestjs/src/users/users.service.ts +38 -0
- package/templates/stacks/node-nestjs/tsconfig.build.json +4 -0
- package/templates/stacks/node-nestjs/tsconfig.json +28 -0
- package/templates/stacks/php-laravel/.dare/skills.yml +11 -0
- package/templates/stacks/php-laravel/.env.example +41 -0
- package/templates/stacks/php-laravel/.github/workflows/dare-ci.yml +43 -0
- package/templates/stacks/php-laravel/README.md.hbs +36 -0
- package/templates/stacks/php-laravel/app/Http/Controllers/Api/AuthController.php +36 -0
- package/templates/stacks/php-laravel/app/Http/Controllers/Api/UsersController.php +33 -0
- package/templates/stacks/php-laravel/app/Http/Requests/CreateUserRequest.php +26 -0
- package/templates/stacks/php-laravel/app/Http/Requests/LoginRequest.php +34 -0
- package/templates/stacks/php-laravel/app/Llm/Contracts/LlmProvider.php +12 -0
- package/templates/stacks/php-laravel/app/Llm/Providers/DummyProvider.php +13 -0
- package/templates/stacks/php-laravel/app/Llm/Providers/OpenAiProvider.php +33 -0
- package/templates/stacks/php-laravel/app/Models/User.php +44 -0
- package/templates/stacks/php-laravel/app/Repositories/UsersRepository.php +32 -0
- package/templates/stacks/php-laravel/app/Services/AuthService.php +37 -0
- package/templates/stacks/php-laravel/app/Services/UsersService.php +57 -0
- package/templates/stacks/php-laravel/artisan +12 -0
- package/templates/stacks/php-laravel/bootstrap/app.php +29 -0
- package/templates/stacks/php-laravel/bootstrap/providers.php +5 -0
- package/templates/stacks/php-laravel/composer.json.hbs +58 -0
- package/templates/stacks/php-laravel/config/l5-swagger.php +41 -0
- package/templates/stacks/php-laravel/config/reverb.php +34 -0
- package/templates/stacks/php-laravel/config/sanctum.php +15 -0
- package/templates/stacks/php-laravel/database/migrations/2026_06_01_000001_create_users_table.php +27 -0
- package/templates/stacks/php-laravel/database/seeders/DatabaseSeeder.php +21 -0
- package/templates/stacks/php-laravel/gitignore +23 -0
- package/templates/stacks/php-laravel/llms.txt.hbs +53 -0
- package/templates/stacks/php-laravel/openapi.json.hbs +43 -0
- package/templates/stacks/php-laravel/phpstan.neon +9 -0
- package/templates/stacks/php-laravel/routes/api.php +13 -0
- package/templates/stacks/php-laravel/routes/channels.php +7 -0
- package/templates/stacks/php-laravel/tests/Feature/AuthTest.php +35 -0
- package/templates/stacks/php-laravel/tests/Feature/UsersTest.php +30 -0
- package/templates/stacks/php-laravel/tests/Pest.php +5 -0
- package/templates/stacks/python-fastapi/.dare/skills.yml +11 -0
- package/templates/stacks/python-fastapi/.env.example +21 -0
- package/templates/stacks/python-fastapi/.github/workflows/dare-ci.yml +43 -0
- package/templates/stacks/python-fastapi/README.md.j2 +35 -0
- package/templates/stacks/python-fastapi/alembic/env.py +46 -0
- package/templates/stacks/python-fastapi/alembic/script.py.mako +26 -0
- package/templates/stacks/python-fastapi/alembic/versions/0001_create_users.py.j2 +37 -0
- package/templates/stacks/python-fastapi/alembic.ini.j2 +39 -0
- package/templates/stacks/python-fastapi/app/__init__.py +0 -0
- package/templates/stacks/python-fastapi/app/core/__init__.py +0 -0
- package/templates/stacks/python-fastapi/app/core/config.py +24 -0
- package/templates/stacks/python-fastapi/app/core/security.py +34 -0
- package/templates/stacks/python-fastapi/app/db/__init__.py +0 -0
- package/templates/stacks/python-fastapi/app/db/session.py +22 -0
- package/templates/stacks/python-fastapi/app/main.py.j2 +36 -0
- package/templates/stacks/python-fastapi/app/models/__init__.py +3 -0
- package/templates/stacks/python-fastapi/app/models/user.py +30 -0
- package/templates/stacks/python-fastapi/app/repositories/__init__.py +0 -0
- package/templates/stacks/python-fastapi/app/repositories/user_repository.py +34 -0
- package/templates/stacks/python-fastapi/app/routers/__init__.py +0 -0
- package/templates/stacks/python-fastapi/app/routers/auth.py +37 -0
- package/templates/stacks/python-fastapi/app/routers/users.py +46 -0
- package/templates/stacks/python-fastapi/app/schemas/__init__.py +0 -0
- package/templates/stacks/python-fastapi/app/schemas/user.py +56 -0
- package/templates/stacks/python-fastapi/app/services/__init__.py +0 -0
- package/templates/stacks/python-fastapi/app/services/auth_service.py +22 -0
- package/templates/stacks/python-fastapi/app/services/user_service.py +31 -0
- package/templates/stacks/python-fastapi/gitignore +12 -0
- package/templates/stacks/python-fastapi/llms.txt.j2 +53 -0
- package/templates/stacks/python-fastapi/openapi.json.j2 +43 -0
- package/templates/stacks/python-fastapi/pyproject.toml.j2 +45 -0
- package/templates/stacks/python-fastapi/tests/__init__.py +0 -0
- package/templates/stacks/python-fastapi/tests/test_auth.py +22 -0
- package/templates/stacks/ruby-rails-8/.dare/skills.yml +50 -0
- package/templates/stacks/ruby-rails-8/.env.example +20 -0
- package/templates/stacks/ruby-rails-8/.github/workflows/dare-ci.yml +112 -0
- package/templates/stacks/ruby-rails-8/Gemfile.erb +61 -0
- package/templates/stacks/ruby-rails-8/app/channels/application_cable/channel.rb +11 -0
- package/templates/stacks/ruby-rails-8/app/channels/application_cable/connection.rb +34 -0
- package/templates/stacks/ruby-rails-8/app/channels/dare_updates_channel.rb +18 -0
- package/templates/stacks/ruby-rails-8/app/channels/user_updates_channel.rb +23 -0
- package/templates/stacks/ruby-rails-8/app/controllers/application_controller.rb +44 -0
- package/templates/stacks/ruby-rails-8/app/controllers/concerns/problem_details.rb +93 -0
- package/templates/stacks/ruby-rails-8/app/handlers/summarize_handler.rb +33 -0
- package/templates/stacks/ruby-rails-8/app/handlers/users_handler.rb +68 -0
- package/templates/stacks/ruby-rails-8/app/llm/cache/llm_cache.rb +44 -0
- package/templates/stacks/ruby-rails-8/app/llm/prompts/prompt_loader.rb +54 -0
- package/templates/stacks/ruby-rails-8/app/llm/prompts/summarize_v1.jinja2 +12 -0
- package/templates/stacks/ruby-rails-8/app/llm/providers/dummy_provider.rb +35 -0
- package/templates/stacks/ruby-rails-8/app/llm/providers/llm_provider.rb +67 -0
- package/templates/stacks/ruby-rails-8/app/llm/providers/openai_provider.rb +62 -0
- package/templates/stacks/ruby-rails-8/app/llm/rate_limit/token_bucket.rb +82 -0
- package/templates/stacks/ruby-rails-8/app/llm/validators/summarize_output_schema.json +21 -0
- package/templates/stacks/ruby-rails-8/app/llm/validators/validator.rb +52 -0
- package/templates/stacks/ruby-rails-8/app/models/user.rb +36 -0
- package/templates/stacks/ruby-rails-8/app/presenters/user_presenter.rb +48 -0
- package/templates/stacks/ruby-rails-8/app/repositories/document_repository.rb +57 -0
- package/templates/stacks/ruby-rails-8/app/repositories/user_repository.rb +73 -0
- package/templates/stacks/ruby-rails-8/app/services/create_user_service.rb +67 -0
- package/templates/stacks/ruby-rails-8/app/services/realtime_service.rb +53 -0
- package/templates/stacks/ruby-rails-8/app/services/summarize_document_service.rb +57 -0
- package/templates/stacks/ruby-rails-8/config/dare.yml +42 -0
- package/templates/stacks/ruby-rails-8/config/initializers/dare.rb +31 -0
- package/templates/stacks/ruby-rails-8/config/initializers/rack_attack.rb +64 -0
- package/templates/stacks/ruby-rails-8/config/initializers/rswag_api.rb +12 -0
- package/templates/stacks/ruby-rails-8/lib/tasks/dare.rake +159 -0
- package/templates/stacks/ruby-rails-8/llms.txt.erb +69 -0
- package/templates/stacks/ruby-rails-8/spec/api/summarize_spec.rb +56 -0
- package/templates/stacks/ruby-rails-8/spec/api/users_spec.rb +72 -0
- package/templates/stacks/ruby-rails-8/spec/channels/dare_updates_channel_spec.rb +61 -0
- package/templates/stacks/ruby-rails-8/spec/channels/user_updates_channel_spec.rb +56 -0
- package/templates/stacks/ruby-rails-8/spec/factories/users.rb +27 -0
- package/templates/stacks/ruby-rails-8/spec/handlers/users_handler_spec.rb +88 -0
- package/templates/stacks/ruby-rails-8/spec/rails_helper.rb +31 -0
- package/templates/stacks/ruby-rails-8/spec/services/create_user_service_spec.rb +88 -0
- package/templates/stacks/ruby-rails-8/spec/services/summarize_document_service_spec.rb +142 -0
- package/templates/stacks/ruby-rails-8/spec/swagger_helper.rb +73 -0
- package/templates/stacks/rust-axum/.dare/skills.yml +11 -0
- package/templates/stacks/rust-axum/.env.example +26 -0
- package/templates/stacks/rust-axum/.github/workflows/dare-ci.yml +40 -0
- package/templates/stacks/rust-axum/Cargo.toml.tera +53 -0
- package/templates/stacks/rust-axum/README.md.tera +37 -0
- package/templates/stacks/rust-axum/gitignore +5 -0
- package/templates/stacks/rust-axum/llms.txt.tera +54 -0
- package/templates/stacks/rust-axum/migrations/0001_create_users.sql +13 -0
- package/templates/stacks/rust-axum/openapi.json.tera +46 -0
- package/templates/stacks/rust-axum/src/config.rs +45 -0
- package/templates/stacks/rust-axum/src/errors.rs +48 -0
- package/templates/stacks/rust-axum/src/handlers/auth.rs +48 -0
- package/templates/stacks/rust-axum/src/handlers/mod.rs +3 -0
- package/templates/stacks/rust-axum/src/handlers/users.rs +81 -0
- package/templates/stacks/rust-axum/src/handlers/ws.rs +24 -0
- package/templates/stacks/rust-axum/src/lib.rs +19 -0
- package/templates/stacks/rust-axum/src/llm/mod.rs +1 -0
- package/templates/stacks/rust-axum/src/llm/provider.rs +48 -0
- package/templates/stacks/rust-axum/src/main.rs.tera +64 -0
- package/templates/stacks/rust-axum/src/middleware/auth.rs +20 -0
- package/templates/stacks/rust-axum/src/middleware/mod.rs +2 -0
- package/templates/stacks/rust-axum/src/middleware/rate_limit.rs +27 -0
- package/templates/stacks/rust-axum/src/models/mod.rs +1 -0
- package/templates/stacks/rust-axum/src/models/user.rs +13 -0
- package/templates/stacks/rust-axum/src/repositories/mod.rs +1 -0
- package/templates/stacks/rust-axum/src/repositories/user_repository.rs +62 -0
- package/templates/stacks/rust-axum/src/services/auth_service.rs +50 -0
- package/templates/stacks/rust-axum/src/services/mod.rs +2 -0
- package/templates/stacks/rust-axum/src/services/user_service.rs +53 -0
- package/templates/stacks/rust-axum/tests/integration_test.rs.tera +13 -0
- package/LICENSE +0 -21
- 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,269 +1,269 @@
|
|
|
1
|
-
# /dare-rust-leptos
|
|
2
|
-
|
|
3
|
-
Guia de desenvolvimento Leptos para projetos DARE. Cobre decisão de variante, idioms obrigatórios, antipatterns, tipos compartilhados e templates de tasks.
|
|
4
|
-
|
|
5
|
-
## Como usar
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
/dare-rust-leptos ← decide variante + configura workspace
|
|
9
|
-
/dare-rust-leptos --csr ← guia específico para CSR + trunk
|
|
10
|
-
/dare-rust-leptos --fullstack ← guia específico para SSR + cargo-leptos
|
|
11
|
-
/dare-rust-leptos --shared-types ← padrão cfg_attr para tipos server + WASM
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## 1. Decisão de variante: CSR vs Fullstack
|
|
17
|
-
|
|
18
|
-
| Critério | CSR (trunk) | Fullstack (cargo-leptos) |
|
|
19
|
-
|---|---|---|
|
|
20
|
-
| SEO necessário | ❌ | ✅ |
|
|
21
|
-
| Time-to-interactive crítico | ❌ | ✅ |
|
|
22
|
-
| Dashboard interno / admin | ✅ | ✅ |
|
|
23
|
-
| Backend Axum existente | indiferente | ✅ integração direta |
|
|
24
|
-
| Simplicidade de deploy | ✅ arquivos estáticos (CDN) | ⚠️ binário Axum |
|
|
25
|
-
| Server functions (`#[server]`) | ❌ não existe | ✅ |
|
|
26
|
-
|
|
27
|
-
**Regra de ouro:**
|
|
28
|
-
- Se o projeto vive atrás de login e SEO não importa → **CSR**
|
|
29
|
-
- Se precisa de SEO, carregamento inicial rápido, ou server functions → **Fullstack**
|
|
30
|
-
- Se já tem `rust-axum` como backend no monorepo → **Fullstack** (workspace unificado)
|
|
31
|
-
|
|
32
|
-
---
|
|
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 sempre `cargo test --workspace`.
|
|
42
|
-
> ⚠️ Não use `trunk` para fullstack nem `cargo leptos` para CSR — ferramentas erradas para o target errado.
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## 3. Idioms obrigatórios Leptos 0.7
|
|
47
|
-
|
|
48
|
-
### Estado reativo
|
|
49
|
-
```rust
|
|
50
|
-
// ✅ Fine-grained signals — só re-renderiza o que usa o signal
|
|
51
|
-
let (count, set_count) = signal(0);
|
|
52
|
-
let doubled = move || count.get() * 2; // derived (memo inline)
|
|
53
|
-
|
|
54
|
-
// Para estado complexo ou compartilhado entre componentes:
|
|
55
|
-
let count = RwSignal::new(0); // read + write em um só
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Dados assíncronos
|
|
59
|
-
```rust
|
|
60
|
-
// ✅ Resource — fetch declarativo, integra com Suspense
|
|
61
|
-
let user = Resource::new(|| user_id(), |id| async move { fetch_user(id).await });
|
|
62
|
-
|
|
63
|
-
// ✅ Suspense — loading state automático
|
|
64
|
-
view! {
|
|
65
|
-
<Suspense fallback=|| view! { <p>"Loading..."</p> }>
|
|
66
|
-
{move || user.get().map(|u| view! { <p>{u.name}</p> })}
|
|
67
|
-
</Suspense>
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// ❌ Nunca — Effect que faz fetch (re-executa em todo render)
|
|
71
|
-
Effect::new(move |_| { spawn_local(async { fetch_user(id).await }); });
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Mutações
|
|
75
|
-
```rust
|
|
76
|
-
// ✅ Action — para submits, forms, operações que mudam estado
|
|
77
|
-
let save = Action::new(|input: &String| {
|
|
78
|
-
let input = input.clone();
|
|
79
|
-
async move { api::save(input).await }
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
view! {
|
|
83
|
-
<button on:click=move |_| save.dispatch("hello".to_string())>
|
|
84
|
-
"Save"
|
|
85
|
-
</button>
|
|
86
|
-
<Show when=move || save.pending().get()>
|
|
87
|
-
<p>"Saving..."</p>
|
|
88
|
-
</Show>
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Renderização condicional e listas
|
|
93
|
-
```rust
|
|
94
|
-
// ✅ Show — condicional com lazy evaluation
|
|
95
|
-
view! {
|
|
96
|
-
<Show when=move || logged_in.get() fallback=|| view! { <Login/> }>
|
|
97
|
-
<Dashboard/>
|
|
98
|
-
</Show>
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// ✅ For — lista reativa com key para reconciliação eficiente
|
|
102
|
-
view! {
|
|
103
|
-
<For
|
|
104
|
-
each=move || items.get()
|
|
105
|
-
key=|item| item.id
|
|
106
|
-
children=move |item| view! { <ItemRow item=item/> }
|
|
107
|
-
/>
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Server functions (fullstack only)
|
|
112
|
-
```rust
|
|
113
|
-
// ✅ #[server] macro — compila para HTTP call no client, fn real no server
|
|
114
|
-
#[server(SaveUser, "/api")]
|
|
115
|
-
pub async fn save_user(name: String) -> Result<User, ServerFnError> {
|
|
116
|
-
// Este código só roda no server (feature = "ssr")
|
|
117
|
-
let user = db::create_user(name).await?;
|
|
118
|
-
Ok(user)
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// No componente — usa como Action normal
|
|
122
|
-
let save = ServerAction::<SaveUser>::new();
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## 4. Tipos compartilhados server + WASM
|
|
128
|
-
|
|
129
|
-
Tipos que precisam existir tanto no server (SQLx, Axum) quanto no client (WASM) usam `cfg_attr`:
|
|
130
|
-
|
|
131
|
-
```rust
|
|
132
|
-
// crates/<projeto>-domain/src/lib.rs (ou src/models.rs)
|
|
133
|
-
use serde::{Deserialize, Serialize};
|
|
134
|
-
|
|
135
|
-
#[cfg_attr(feature = "ssr", derive(sqlx::FromRow))] // só no server
|
|
136
|
-
#[derive(Clone, Debug, Serialize, Deserialize)] // server + WASM
|
|
137
|
-
pub struct SecurityEvent {
|
|
138
|
-
pub id: uuid::Uuid,
|
|
139
|
-
pub attack_type: String,
|
|
140
|
-
pub risk_score: f32,
|
|
141
|
-
pub blocked: bool,
|
|
142
|
-
}
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
**Cargo.toml do crate domain:**
|
|
146
|
-
```toml
|
|
147
|
-
[dependencies]
|
|
148
|
-
serde = { version = "1.0", features = ["derive"] }
|
|
149
|
-
uuid = { version = "1.10", features = ["v4", "serde"] }
|
|
150
|
-
|
|
151
|
-
[dependencies.sqlx]
|
|
152
|
-
version = "0.8"
|
|
153
|
-
features = ["postgres", "runtime-tokio", "uuid"]
|
|
154
|
-
optional = true
|
|
155
|
-
|
|
156
|
-
[features]
|
|
157
|
-
ssr = ["dep:sqlx"]
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
> O crate domain é compilado duas vezes: uma para x86 (server, com sqlx) e uma para wasm32 (client, sem sqlx). O `cfg_attr` garante que `sqlx::FromRow` só aparece na compilação server.
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## 5. Configuração workspace misto (WASM + nativo)
|
|
165
|
-
|
|
166
|
-
Quando o workspace tem crates Leptos/WASM **e** crates nativos (ex: `napi-rs`, `aya`, Axum):
|
|
167
|
-
|
|
168
|
-
```toml
|
|
169
|
-
# .cargo/config.toml na raiz do workspace
|
|
170
|
-
# NÃO definir [build] target global aqui.
|
|
171
|
-
# Cada crate define seu próprio target via features e cargo-leptos/trunk.
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
```toml
|
|
175
|
-
# Cargo.toml do workspace
|
|
176
|
-
[workspace]
|
|
177
|
-
resolver = "2"
|
|
178
|
-
members = [
|
|
179
|
-
"crates/ars-core", # lib nativa (x86)
|
|
180
|
-
"crates/ars-server", # bin nativo — Axum
|
|
181
|
-
"crates/ars-web", # bin+lib WASM — Leptos
|
|
182
|
-
"crates/ars-cli", # bin nativo
|
|
183
|
-
]
|
|
184
|
-
# crates napi-rs ficam em workspace separado ou excluídos do members padrão
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
```toml
|
|
188
|
-
# crates/ars-web/Cargo.toml — features separam server de WASM
|
|
189
|
-
[features]
|
|
190
|
-
default = []
|
|
191
|
-
hydrate = ["leptos/hydrate"]
|
|
192
|
-
ssr = [
|
|
193
|
-
"dep:axum",
|
|
194
|
-
"dep:leptos_axum",
|
|
195
|
-
"dep:tokio",
|
|
196
|
-
"leptos/ssr",
|
|
197
|
-
]
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
> ⚠️ **Antipattern crítico**: adicionar `[build] target = "wasm32-unknown-unknown"` no `.cargo/config.toml` raiz quebra todos os crates nativos. `cargo leptos` e `trunk` gerenciam o target WASM internamente — não interfira.
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## 6. Antipatterns a evitar
|
|
205
|
-
|
|
206
|
-
| Antipattern | Por quê | Alternativa |
|
|
207
|
-
|---|---|---|
|
|
208
|
-
| `wasm_bindgen` direto | Bypassa abstrações do Leptos, código frágil | Use APIs do Leptos (`web_sys` via feature quando necessário) |
|
|
209
|
-
| `panic!` em componentes | Derruba o app inteiro sem `ErrorBoundary` | `Result<_, ServerFnError>` + `ErrorBoundary` |
|
|
210
|
-
| `Effect` que faz fetch | Re-executa a cada render, difícil de cancelar | `Resource::new()` |
|
|
211
|
-
| `tokio::spawn` no client | `tokio` não existe no WASM | `spawn_local()` (wasm) ou só em server functions |
|
|
212
|
-
| `std::thread` no client | Não existe no WASM | Leptos signals para paralelismo reativo |
|
|
213
|
-
| `cargo leptos test` | Não existe — comando inválido | `cargo test --workspace` |
|
|
214
|
-
| `[build] target` global | Quebra crates nativos no workspace misto | Sem target global; cargo-leptos gerencia internamente |
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## 7. Templates de tasks DARE para Leptos
|
|
219
|
-
|
|
220
|
-
Cole no `DARE/dare-dag.yaml` após gerar o blueprint:
|
|
221
|
-
|
|
222
|
-
```yaml
|
|
223
|
-
# Task 1 — Workspace + AppShell + Router
|
|
224
|
-
- id: leptos-001
|
|
225
|
-
title: "Workspace, AppShell e Router base"
|
|
226
|
-
description: |
|
|
227
|
-
Configurar Cargo workspace com resolver = "2".
|
|
228
|
-
Criar App component com leptos_router::Router.
|
|
229
|
-
Criar layout base (header, main, footer).
|
|
230
|
-
Rota "/" → HomePage component.
|
|
231
|
-
Ralph Loop: cargo leptos build --release + cargo test --workspace + cargo clippy
|
|
232
|
-
depends_on: []
|
|
233
|
-
|
|
234
|
-
# Task 2 — Form com Action + server function
|
|
235
|
-
- id: leptos-002
|
|
236
|
-
title: "Form com Action e validação server-side"
|
|
237
|
-
description: |
|
|
238
|
-
Criar #[server] fn para processar o form.
|
|
239
|
-
Criar componente com ActionForm ou Action manual.
|
|
240
|
-
Validar input no server (retorna ServerFnError em caso de erro).
|
|
241
|
-
Exibir pending state com Action::pending() signal.
|
|
242
|
-
Ralph Loop: cargo leptos build --release + cargo test --workspace
|
|
243
|
-
depends_on: [leptos-001]
|
|
244
|
-
|
|
245
|
-
# Task 3 — Lista paginada com Resource + Suspense
|
|
246
|
-
- id: leptos-003
|
|
247
|
-
title: "Lista paginada com Resource, Suspense e error handling"
|
|
248
|
-
description: |
|
|
249
|
-
Criar Resource que recebe página como signal de parâmetro.
|
|
250
|
-
Envolver em Suspense com fallback de loading.
|
|
251
|
-
Usar ErrorBoundary para erros de fetch.
|
|
252
|
-
Adicionar paginação com For component e key por ID.
|
|
253
|
-
Ralph Loop: cargo leptos build --release + cargo test --workspace
|
|
254
|
-
depends_on: [leptos-001]
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
## 8. O que fazer agora
|
|
260
|
-
|
|
261
|
-
1. **Leia `DARE/DESIGN.md`** para entender quais componentes e server functions são necessários
|
|
262
|
-
2. **Rode `cargo leptos watch`** (fullstack) ou **`trunk serve`** (CSR) para confirmar que o scaffold compila
|
|
263
|
-
3. **Gere `DARE/BLUEPRINT.md`** com `/dare-blueprint` — inclua:
|
|
264
|
-
- Tabela de componentes (nome, props, signals usados)
|
|
265
|
-
- Lista de server functions com assinatura
|
|
266
|
-
- Tipos compartilhados no crate domain
|
|
267
|
-
4. **Use `/dare-rust-workspace`** se precisar decidir estrutura multi-crate
|
|
268
|
-
|
|
269
|
-
$ARGUMENTS
|
|
1
|
+
# /dare-rust-leptos
|
|
2
|
+
|
|
3
|
+
Guia de desenvolvimento Leptos para projetos DARE. Cobre decisão de variante, idioms obrigatórios, antipatterns, tipos compartilhados e templates de tasks.
|
|
4
|
+
|
|
5
|
+
## Como usar
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/dare-rust-leptos ← decide variante + configura workspace
|
|
9
|
+
/dare-rust-leptos --csr ← guia específico para CSR + trunk
|
|
10
|
+
/dare-rust-leptos --fullstack ← guia específico para SSR + cargo-leptos
|
|
11
|
+
/dare-rust-leptos --shared-types ← padrão cfg_attr para tipos server + WASM
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. Decisão de variante: CSR vs Fullstack
|
|
17
|
+
|
|
18
|
+
| Critério | CSR (trunk) | Fullstack (cargo-leptos) |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| SEO necessário | ❌ | ✅ |
|
|
21
|
+
| Time-to-interactive crítico | ❌ | ✅ |
|
|
22
|
+
| Dashboard interno / admin | ✅ | ✅ |
|
|
23
|
+
| Backend Axum existente | indiferente | ✅ integração direta |
|
|
24
|
+
| Simplicidade de deploy | ✅ arquivos estáticos (CDN) | ⚠️ binário Axum |
|
|
25
|
+
| Server functions (`#[server]`) | ❌ não existe | ✅ |
|
|
26
|
+
|
|
27
|
+
**Regra de ouro:**
|
|
28
|
+
- Se o projeto vive atrás de login e SEO não importa → **CSR**
|
|
29
|
+
- Se precisa de SEO, carregamento inicial rápido, ou server functions → **Fullstack**
|
|
30
|
+
- Se já tem `rust-axum` como backend no monorepo → **Fullstack** (workspace unificado)
|
|
31
|
+
|
|
32
|
+
---
|
|
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 sempre `cargo test --workspace`.
|
|
42
|
+
> ⚠️ Não use `trunk` para fullstack nem `cargo leptos` para CSR — ferramentas erradas para o target errado.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 3. Idioms obrigatórios Leptos 0.7
|
|
47
|
+
|
|
48
|
+
### Estado reativo
|
|
49
|
+
```rust
|
|
50
|
+
// ✅ Fine-grained signals — só re-renderiza o que usa o signal
|
|
51
|
+
let (count, set_count) = signal(0);
|
|
52
|
+
let doubled = move || count.get() * 2; // derived (memo inline)
|
|
53
|
+
|
|
54
|
+
// Para estado complexo ou compartilhado entre componentes:
|
|
55
|
+
let count = RwSignal::new(0); // read + write em um só
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Dados assíncronos
|
|
59
|
+
```rust
|
|
60
|
+
// ✅ Resource — fetch declarativo, integra com Suspense
|
|
61
|
+
let user = Resource::new(|| user_id(), |id| async move { fetch_user(id).await });
|
|
62
|
+
|
|
63
|
+
// ✅ Suspense — loading state automático
|
|
64
|
+
view! {
|
|
65
|
+
<Suspense fallback=|| view! { <p>"Loading..."</p> }>
|
|
66
|
+
{move || user.get().map(|u| view! { <p>{u.name}</p> })}
|
|
67
|
+
</Suspense>
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ❌ Nunca — Effect que faz fetch (re-executa em todo render)
|
|
71
|
+
Effect::new(move |_| { spawn_local(async { fetch_user(id).await }); });
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Mutações
|
|
75
|
+
```rust
|
|
76
|
+
// ✅ Action — para submits, forms, operações que mudam estado
|
|
77
|
+
let save = Action::new(|input: &String| {
|
|
78
|
+
let input = input.clone();
|
|
79
|
+
async move { api::save(input).await }
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
view! {
|
|
83
|
+
<button on:click=move |_| save.dispatch("hello".to_string())>
|
|
84
|
+
"Save"
|
|
85
|
+
</button>
|
|
86
|
+
<Show when=move || save.pending().get()>
|
|
87
|
+
<p>"Saving..."</p>
|
|
88
|
+
</Show>
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Renderização condicional e listas
|
|
93
|
+
```rust
|
|
94
|
+
// ✅ Show — condicional com lazy evaluation
|
|
95
|
+
view! {
|
|
96
|
+
<Show when=move || logged_in.get() fallback=|| view! { <Login/> }>
|
|
97
|
+
<Dashboard/>
|
|
98
|
+
</Show>
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ✅ For — lista reativa com key para reconciliação eficiente
|
|
102
|
+
view! {
|
|
103
|
+
<For
|
|
104
|
+
each=move || items.get()
|
|
105
|
+
key=|item| item.id
|
|
106
|
+
children=move |item| view! { <ItemRow item=item/> }
|
|
107
|
+
/>
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Server functions (fullstack only)
|
|
112
|
+
```rust
|
|
113
|
+
// ✅ #[server] macro — compila para HTTP call no client, fn real no server
|
|
114
|
+
#[server(SaveUser, "/api")]
|
|
115
|
+
pub async fn save_user(name: String) -> Result<User, ServerFnError> {
|
|
116
|
+
// Este código só roda no server (feature = "ssr")
|
|
117
|
+
let user = db::create_user(name).await?;
|
|
118
|
+
Ok(user)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// No componente — usa como Action normal
|
|
122
|
+
let save = ServerAction::<SaveUser>::new();
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 4. Tipos compartilhados server + WASM
|
|
128
|
+
|
|
129
|
+
Tipos que precisam existir tanto no server (SQLx, Axum) quanto no client (WASM) usam `cfg_attr`:
|
|
130
|
+
|
|
131
|
+
```rust
|
|
132
|
+
// crates/<projeto>-domain/src/lib.rs (ou src/models.rs)
|
|
133
|
+
use serde::{Deserialize, Serialize};
|
|
134
|
+
|
|
135
|
+
#[cfg_attr(feature = "ssr", derive(sqlx::FromRow))] // só no server
|
|
136
|
+
#[derive(Clone, Debug, Serialize, Deserialize)] // server + WASM
|
|
137
|
+
pub struct SecurityEvent {
|
|
138
|
+
pub id: uuid::Uuid,
|
|
139
|
+
pub attack_type: String,
|
|
140
|
+
pub risk_score: f32,
|
|
141
|
+
pub blocked: bool,
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Cargo.toml do crate domain:**
|
|
146
|
+
```toml
|
|
147
|
+
[dependencies]
|
|
148
|
+
serde = { version = "1.0", features = ["derive"] }
|
|
149
|
+
uuid = { version = "1.10", features = ["v4", "serde"] }
|
|
150
|
+
|
|
151
|
+
[dependencies.sqlx]
|
|
152
|
+
version = "0.8"
|
|
153
|
+
features = ["postgres", "runtime-tokio", "uuid"]
|
|
154
|
+
optional = true
|
|
155
|
+
|
|
156
|
+
[features]
|
|
157
|
+
ssr = ["dep:sqlx"]
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
> O crate domain é compilado duas vezes: uma para x86 (server, com sqlx) e uma para wasm32 (client, sem sqlx). O `cfg_attr` garante que `sqlx::FromRow` só aparece na compilação server.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 5. Configuração workspace misto (WASM + nativo)
|
|
165
|
+
|
|
166
|
+
Quando o workspace tem crates Leptos/WASM **e** crates nativos (ex: `napi-rs`, `aya`, Axum):
|
|
167
|
+
|
|
168
|
+
```toml
|
|
169
|
+
# .cargo/config.toml na raiz do workspace
|
|
170
|
+
# NÃO definir [build] target global aqui.
|
|
171
|
+
# Cada crate define seu próprio target via features e cargo-leptos/trunk.
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
```toml
|
|
175
|
+
# Cargo.toml do workspace
|
|
176
|
+
[workspace]
|
|
177
|
+
resolver = "2"
|
|
178
|
+
members = [
|
|
179
|
+
"crates/ars-core", # lib nativa (x86)
|
|
180
|
+
"crates/ars-server", # bin nativo — Axum
|
|
181
|
+
"crates/ars-web", # bin+lib WASM — Leptos
|
|
182
|
+
"crates/ars-cli", # bin nativo
|
|
183
|
+
]
|
|
184
|
+
# crates napi-rs ficam em workspace separado ou excluídos do members padrão
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
```toml
|
|
188
|
+
# crates/ars-web/Cargo.toml — features separam server de WASM
|
|
189
|
+
[features]
|
|
190
|
+
default = []
|
|
191
|
+
hydrate = ["leptos/hydrate"]
|
|
192
|
+
ssr = [
|
|
193
|
+
"dep:axum",
|
|
194
|
+
"dep:leptos_axum",
|
|
195
|
+
"dep:tokio",
|
|
196
|
+
"leptos/ssr",
|
|
197
|
+
]
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
> ⚠️ **Antipattern crítico**: adicionar `[build] target = "wasm32-unknown-unknown"` no `.cargo/config.toml` raiz quebra todos os crates nativos. `cargo leptos` e `trunk` gerenciam o target WASM internamente — não interfira.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## 6. Antipatterns a evitar
|
|
205
|
+
|
|
206
|
+
| Antipattern | Por quê | Alternativa |
|
|
207
|
+
|---|---|---|
|
|
208
|
+
| `wasm_bindgen` direto | Bypassa abstrações do Leptos, código frágil | Use APIs do Leptos (`web_sys` via feature quando necessário) |
|
|
209
|
+
| `panic!` em componentes | Derruba o app inteiro sem `ErrorBoundary` | `Result<_, ServerFnError>` + `ErrorBoundary` |
|
|
210
|
+
| `Effect` que faz fetch | Re-executa a cada render, difícil de cancelar | `Resource::new()` |
|
|
211
|
+
| `tokio::spawn` no client | `tokio` não existe no WASM | `spawn_local()` (wasm) ou só em server functions |
|
|
212
|
+
| `std::thread` no client | Não existe no WASM | Leptos signals para paralelismo reativo |
|
|
213
|
+
| `cargo leptos test` | Não existe — comando inválido | `cargo test --workspace` |
|
|
214
|
+
| `[build] target` global | Quebra crates nativos no workspace misto | Sem target global; cargo-leptos gerencia internamente |
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 7. Templates de tasks DARE para Leptos
|
|
219
|
+
|
|
220
|
+
Cole no `DARE/dare-dag.yaml` após gerar o blueprint:
|
|
221
|
+
|
|
222
|
+
```yaml
|
|
223
|
+
# Task 1 — Workspace + AppShell + Router
|
|
224
|
+
- id: leptos-001
|
|
225
|
+
title: "Workspace, AppShell e Router base"
|
|
226
|
+
description: |
|
|
227
|
+
Configurar Cargo workspace com resolver = "2".
|
|
228
|
+
Criar App component com leptos_router::Router.
|
|
229
|
+
Criar layout base (header, main, footer).
|
|
230
|
+
Rota "/" → HomePage component.
|
|
231
|
+
Ralph Loop: cargo leptos build --release + cargo test --workspace + cargo clippy
|
|
232
|
+
depends_on: []
|
|
233
|
+
|
|
234
|
+
# Task 2 — Form com Action + server function
|
|
235
|
+
- id: leptos-002
|
|
236
|
+
title: "Form com Action e validação server-side"
|
|
237
|
+
description: |
|
|
238
|
+
Criar #[server] fn para processar o form.
|
|
239
|
+
Criar componente com ActionForm ou Action manual.
|
|
240
|
+
Validar input no server (retorna ServerFnError em caso de erro).
|
|
241
|
+
Exibir pending state com Action::pending() signal.
|
|
242
|
+
Ralph Loop: cargo leptos build --release + cargo test --workspace
|
|
243
|
+
depends_on: [leptos-001]
|
|
244
|
+
|
|
245
|
+
# Task 3 — Lista paginada com Resource + Suspense
|
|
246
|
+
- id: leptos-003
|
|
247
|
+
title: "Lista paginada com Resource, Suspense e error handling"
|
|
248
|
+
description: |
|
|
249
|
+
Criar Resource que recebe página como signal de parâmetro.
|
|
250
|
+
Envolver em Suspense com fallback de loading.
|
|
251
|
+
Usar ErrorBoundary para erros de fetch.
|
|
252
|
+
Adicionar paginação com For component e key por ID.
|
|
253
|
+
Ralph Loop: cargo leptos build --release + cargo test --workspace
|
|
254
|
+
depends_on: [leptos-001]
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 8. O que fazer agora
|
|
260
|
+
|
|
261
|
+
1. **Leia `DARE/DESIGN.md`** para entender quais componentes e server functions são necessários
|
|
262
|
+
2. **Rode `cargo leptos watch`** (fullstack) ou **`trunk serve`** (CSR) para confirmar que o scaffold compila
|
|
263
|
+
3. **Gere `DARE/BLUEPRINT.md`** com `/dare-blueprint` — inclua:
|
|
264
|
+
- Tabela de componentes (nome, props, signals usados)
|
|
265
|
+
- Lista de server functions com assinatura
|
|
266
|
+
- Tipos compartilhados no crate domain
|
|
267
|
+
4. **Use `/dare-rust-workspace`** se precisar decidir estrutura multi-crate
|
|
268
|
+
|
|
269
|
+
$ARGUMENTS
|