@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
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-llm-integration
|
|
3
|
+
description: Integração com LLMs (Large Language Models) em projetos DARE. Fornece abstração LLMProvider, cache em memória com TTL, rate limiting via token bucket, prompt templates versionados e validação de output via JSON Schema. Cobre antipatterns crítico de prompt injection e LLM output não validado.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE LLM Integration Skill
|
|
7
|
+
|
|
8
|
+
Você é um especialista em integração com LLMs (Gemini, Claude, GPT, modelos locais). Seu papel é garantir que toda chamada a LLM em projeto DARE seja **abstraída, cacheada, rate-limited, validada e auditável**.
|
|
9
|
+
|
|
10
|
+
## Quando usar esta skill
|
|
11
|
+
|
|
12
|
+
- Projeto vai consumir Gemini, Claude API, OpenAI, Ollama ou similar
|
|
13
|
+
- Você está revisando Handler que chama SDK de LLM diretamente
|
|
14
|
+
- Você está auditando custos de LLM no projeto
|
|
15
|
+
- Você está adicionando proteção contra prompt injection
|
|
16
|
+
|
|
17
|
+
## A arquitetura recomendada
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌────────────────────────────────────────────────────────┐
|
|
21
|
+
│ Handler / Service │
|
|
22
|
+
└────────────────────────────────────────────────────────┘
|
|
23
|
+
↓ injeta
|
|
24
|
+
┌────────────────────────────────────────────────────────┐
|
|
25
|
+
│ LLMProvider (interface) │
|
|
26
|
+
│ ├── GeminiProvider │
|
|
27
|
+
│ ├── ClaudeProvider │
|
|
28
|
+
│ ├── OpenAIProvider │
|
|
29
|
+
│ └── OllamaProvider (local) │
|
|
30
|
+
└────────────────────────────────────────────────────────┘
|
|
31
|
+
↓ wrapping
|
|
32
|
+
┌────────────────────────────────────────────────────────┐
|
|
33
|
+
│ Cache (TTL) + RateLimit (token bucket) + Schema │
|
|
34
|
+
└────────────────────────────────────────────────────────┘
|
|
35
|
+
↓
|
|
36
|
+
┌────────────────────────────────────────────────────────┐
|
|
37
|
+
│ HTTP call externo (Gemini API, etc.) │
|
|
38
|
+
└────────────────────────────────────────────────────────┘
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Os 5 pilares
|
|
42
|
+
|
|
43
|
+
### 1. LLMProvider abstraction
|
|
44
|
+
|
|
45
|
+
NUNCA chame SDK do Gemini/OpenAI dentro de um Handler ou Service de negócio. Sempre passe pela interface `LLMProvider`.
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// ❌ Errado
|
|
49
|
+
class SummaryService {
|
|
50
|
+
async run(text: string) {
|
|
51
|
+
const client = new GoogleGenAI({apiKey: 'xxx'});
|
|
52
|
+
return client.generateContent({contents: text});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ✅ Certo
|
|
57
|
+
class SummaryService {
|
|
58
|
+
constructor(private llm: LLMProvider) {}
|
|
59
|
+
async run(text: string) {
|
|
60
|
+
return this.llm.complete({
|
|
61
|
+
promptId: 'summarize-v1',
|
|
62
|
+
input: { text },
|
|
63
|
+
schema: SummarySchema,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 2. Cache em memória com TTL
|
|
70
|
+
|
|
71
|
+
Toda chamada deve passar por cache. Cache key = `hash(promptId + input + model)`. TTL configurável por prompt (default 1 hora).
|
|
72
|
+
|
|
73
|
+
**Antipattern AP-02:** Sem cache → custo explode em loops.
|
|
74
|
+
|
|
75
|
+
### 3. Rate limit via token bucket
|
|
76
|
+
|
|
77
|
+
Proteja a integração externa **e** seu wallet. Configure tokens/segundo por provider.
|
|
78
|
+
|
|
79
|
+
| Provider | Limite típico |
|
|
80
|
+
|---|---|
|
|
81
|
+
| Gemini Free | 15 RPM, 1 milhão tokens/dia |
|
|
82
|
+
| Claude API | 50 RPM (tier 1) |
|
|
83
|
+
| OpenAI | 500 RPM (tier 1) |
|
|
84
|
+
| Ollama local | sem limite, mas latência alta |
|
|
85
|
+
|
|
86
|
+
### 4. Prompt templates versionados
|
|
87
|
+
|
|
88
|
+
Prompts NUNCA ficam inline em código. Vivem em `prompts/<id>.v<n>.md`:
|
|
89
|
+
|
|
90
|
+
```markdown
|
|
91
|
+
---
|
|
92
|
+
id: summarize
|
|
93
|
+
version: 1
|
|
94
|
+
model: gemini-2.0-flash
|
|
95
|
+
temperature: 0.2
|
|
96
|
+
max_tokens: 500
|
|
97
|
+
schema: SummarySchema
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
# System
|
|
101
|
+
|
|
102
|
+
You are a concise summarizer. Output JSON with this schema:
|
|
103
|
+
{schema}
|
|
104
|
+
|
|
105
|
+
# User
|
|
106
|
+
|
|
107
|
+
Summarize the following text in 3 bullet points:
|
|
108
|
+
|
|
109
|
+
<text>{{ text }}</text>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Substituição usa **template engine seguro** (Jinja2, Handlebars com sandbox, ou string interpolation com escape) — nunca `eval` ou `f-string` direto com user input.
|
|
113
|
+
|
|
114
|
+
### 5. Validação via JSON Schema
|
|
115
|
+
|
|
116
|
+
LLM mente. Sempre valide o output:
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
const result = await llm.complete({...});
|
|
120
|
+
const validated = SummarySchema.parse(result); // Zod, Pydantic, ajv...
|
|
121
|
+
if (!validated.success) {
|
|
122
|
+
throw new LLMOutputInvalidError(validated.error);
|
|
123
|
+
// Logar + alertar — pode indicar prompt injection ou drift de modelo
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Métricas obrigatórias
|
|
128
|
+
|
|
129
|
+
| ID | Métrica | Como medir |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| M-01 | 100% das chamadas LLM via LLMProvider injetado | grep por `new GoogleGenAI \| new OpenAI \| Anthropic(` em Services |
|
|
132
|
+
| M-02 | 100% das responses LLM cacheadas | logs do cache layer |
|
|
133
|
+
| M-03 | 100% das requests LLM com rate limit | rate limiter ativo em todo provider |
|
|
134
|
+
| M-04 | 100% das respostas LLM validadas contra schema | grep por `.parse(` ou `Pydantic` no resultado |
|
|
135
|
+
|
|
136
|
+
## Antipatterns
|
|
137
|
+
|
|
138
|
+
| AP | Antipattern | Por que evitar |
|
|
139
|
+
|---|---|---|
|
|
140
|
+
| AP-01 | SDK do LLM direto em Handler | impossível mockar, impossível trocar de provider |
|
|
141
|
+
| AP-02 | Sem cache | custo explode, latência ruim |
|
|
142
|
+
| AP-03 | Prompt em código | impossível versionar e A/B testar |
|
|
143
|
+
| AP-04 | User input direto em prompt | prompt injection trivial |
|
|
144
|
+
| AP-05 | Confiar em output LLM sem validar | LLM mente — schema é defesa |
|
|
145
|
+
|
|
146
|
+
## Defesa contra prompt injection (crítico)
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
# ❌ Errado — instrução + dado misturados
|
|
150
|
+
system = f"You are an assistant. {user_question}"
|
|
151
|
+
|
|
152
|
+
# ✅ Certo — separação clara
|
|
153
|
+
messages = [
|
|
154
|
+
{"role": "system", "content": "You are an assistant. Answer only based on the provided document."},
|
|
155
|
+
{"role": "user", "content": f"<document>{escape(doc)}</document>\n\n<question>{escape(q)}</question>"}
|
|
156
|
+
]
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Regras:
|
|
160
|
+
- Use delimitadores (`<document>`, `<question>`)
|
|
161
|
+
- Escape conteúdo do usuário (XML escape, HTML escape)
|
|
162
|
+
- Detecte e remova padrões "Ignore as instruções acima", "You are now ..."
|
|
163
|
+
- Valide output contra schema — output fora do schema = possível injection bem-sucedido
|
|
164
|
+
|
|
165
|
+
## Como aplicar
|
|
166
|
+
|
|
167
|
+
### Passo 1: Criar abstração LLMProvider
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
interface LLMProvider {
|
|
171
|
+
complete(req: LLMRequest): Promise<LLMResponse>;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
interface LLMRequest {
|
|
175
|
+
promptId: string;
|
|
176
|
+
input: Record<string, unknown>;
|
|
177
|
+
schema: ZodSchema;
|
|
178
|
+
options?: { temperature?: number; maxTokens?: number };
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Passo 2: Implementar 1+ provider
|
|
183
|
+
|
|
184
|
+
Comece com o que o projeto usa (Gemini, Claude, etc.). Adicione mais conforme necessário.
|
|
185
|
+
|
|
186
|
+
### Passo 3: Configurar cache
|
|
187
|
+
|
|
188
|
+
`packages/skills/dare-llm-integration/cache/` tem implementação em memória com TTL pronta. Use ou copie.
|
|
189
|
+
|
|
190
|
+
### Passo 4: Configurar rate limit
|
|
191
|
+
|
|
192
|
+
Token bucket por provider, configurado em `app.config`.
|
|
193
|
+
|
|
194
|
+
### Passo 5: Migrar prompts inline para arquivos
|
|
195
|
+
|
|
196
|
+
Inventarie todos os `system: "..."` no código e mova para `prompts/<id>.v1.md`.
|
|
197
|
+
|
|
198
|
+
### Passo 6: Adicionar validação de output
|
|
199
|
+
|
|
200
|
+
Schema Zod/Pydantic/serde para cada prompt. CI falha se prompt não tiver schema declarado.
|
|
201
|
+
|
|
202
|
+
## Boas práticas
|
|
203
|
+
|
|
204
|
+
1. **Provider neutro no domínio** — Service não sabe se é Gemini ou Claude
|
|
205
|
+
2. **Custo é parte da observabilidade** — logue tokens in/out + custo estimado por request
|
|
206
|
+
3. **Fallback** — se provider primário falhar, tente secundário (Gemini → Claude)
|
|
207
|
+
4. **Latência alta = degrada UX** — esconda atrás de fila assíncrona quando >2s
|
|
208
|
+
|
|
209
|
+
## Dicas
|
|
210
|
+
|
|
211
|
+
- **Leia** `docs/design/skills/dare-llm-integration/DESIGN.md`
|
|
212
|
+
- **Combine** com `dare-security` (RS-* para prompt injection)
|
|
213
|
+
- **Use** os providers em `packages/skills/dare-llm-integration/providers/` como referência
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
Esta skill é parte do DARE Method e está sob licença MIT.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-migrate
|
|
3
|
+
description: Camada semântica da migração (Fase 2 brownfield). Roda depois do comando `dare migrate` e escreve a estratégia de migração + cenários Gherkin de paridade reais no DARE/MIGRATION/, garantindo reimplementação fiel ao legado.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Migrate Skill — Migração com paridade (brownfield Fase 2)
|
|
7
|
+
|
|
8
|
+
Você é o agente que transforma o entendimento do legado em um **plano de migração com paridade**.
|
|
9
|
+
Esta skill é a camada **semântica**: roda **depois** do comando `dare migrate`, que já leu os
|
|
10
|
+
artefatos do `reverse`/`dna` e gerou os esqueletos. Sua função é **escrever a estratégia de migração
|
|
11
|
+
e os cenários Gherkin de paridade reais** — o contrato comportamental que garante uma reimplementação
|
|
12
|
+
fiel ao legado.
|
|
13
|
+
|
|
14
|
+
> Pré-requisito: o comando `dare migrate --to <stack>` precisa ter rodado antes (gera
|
|
15
|
+
> `DARE/MIGRATION/MIGRATION.md`, `migration-facts.json`, `parity/*.feature`). Que por sua vez exige
|
|
16
|
+
> `dare reverse` já executado. Se faltar, peça ao usuário para rodar na ordem.
|
|
17
|
+
|
|
18
|
+
## Quando usar esta skill
|
|
19
|
+
- Projeto legado entendido (`reverse` + `dna`) que será reimplementado em outra stack.
|
|
20
|
+
- Acabou de rodar `dare migrate` e há seções `<!-- AGENT -->` / `# AGENT` em aberto.
|
|
21
|
+
|
|
22
|
+
## Passo a passo
|
|
23
|
+
|
|
24
|
+
### 1. Carregar contexto (não re-varrer)
|
|
25
|
+
Leia `migration-facts.json` (origem/alvo/módulos/blocking gaps), `IDEIA.md` + `REVERSE/module-*.md`
|
|
26
|
+
e `PROJECT-DNA.md`. Abra arquivos-chave do legado só o necessário para inferir comportamento.
|
|
27
|
+
|
|
28
|
+
### 2. Preencher `DARE/MIGRATION/MIGRATION.md`
|
|
29
|
+
- **Decisão de Paradigma** — mudou (procedural→OO, monólito→serviços)? Decisão + justificativa.
|
|
30
|
+
- **Estratégia** — big-bang vs. strangler/parallel-run; ordem dos módulos; feature flags.
|
|
31
|
+
- **Registro de Risco** — tratar cada blocking gap (🔴) + riscos de regressão/dados/performance.
|
|
32
|
+
- **Arquitetura-alvo** — na stack-alvo, alinhada ao DNA quando o paradigma for preservado.
|
|
33
|
+
- **Cutover & Rollback** — passos, validação de paridade (rodar `.feature`), go/no-go, rollback.
|
|
34
|
+
|
|
35
|
+
### 3. Gherkin de paridade (`parity/<módulo>.feature`)
|
|
36
|
+
Um `Scenario` por fluxo observável, derivado do **comportamento legado real**: `Given` → `When` →
|
|
37
|
+
`Then` idêntico ao legado. Inclua bordas/formatos (arredondamento, máscaras). É o contrato de aceite
|
|
38
|
+
da reimplementação na stack-alvo.
|
|
39
|
+
|
|
40
|
+
### 4. Apresentar ao usuário
|
|
41
|
+
Resumo: paradigma, estratégia, nº de cenários de paridade, blocking gaps a resolver.
|
|
42
|
+
|
|
43
|
+
## Regras de ouro
|
|
44
|
+
1. **Paridade primeiro** — todo fluxo crítico vira `Scenario`.
|
|
45
|
+
2. **Blocking gaps são bloqueantes** — 🔴 não resolvido é risco; trate ou registre.
|
|
46
|
+
3. **Respeite o DNA** — arquitetura-alvo segue as convenções da casa.
|
|
47
|
+
4. **Não invente comportamento** — cenário sem base no legado = regressão silenciosa.
|
|
48
|
+
5. **Strangler quando possível** — incremental com parallel-run reduz risco.
|
|
49
|
+
|
|
50
|
+
## Antipatterns
|
|
51
|
+
| AP | Antipattern | Por quê |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| AP-01 | Gherkin genérico sem base no legado | Não garante paridade |
|
|
54
|
+
| AP-02 | Ignorar blocking gaps (🔴) | Reimplementa sobre incerteza |
|
|
55
|
+
| AP-03 | Big-bang sem necessidade | Maximiza risco |
|
|
56
|
+
| AP-04 | Arquitetura-alvo desalinhada do DNA | Código vira ilha inconsistente |
|
|
57
|
+
| AP-05 | Reescrever os fatos determinísticos do CLI | Quebra a fonte de verdade |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
Skill MIT — parte do DARE Method. Fase 2 (brownfield). Pareia com o comando `dare migrate`.
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-quality-telemetry
|
|
3
|
+
description: Coleta de métricas de qualidade e detecção de regressões em projetos DARE. Agrega métricas das skills filhas (dare-ax, dare-layered-design, etc.), persiste histórico em tmp/dare_metrics.json e detecta regressões contra baseline. Inclui template de GitHub Actions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Quality Telemetry Skill
|
|
7
|
+
|
|
8
|
+
Você é um engenheiro de plataforma especialista em observabilidade de qualidade. Seu papel é garantir que todo projeto DARE colete métricas das skills aplicadas, persista histórico, e detecte regressões antes do release.
|
|
9
|
+
|
|
10
|
+
## Quando usar esta skill
|
|
11
|
+
|
|
12
|
+
- Projeto já tem várias skills DARE configuradas (ax, layered-design, llm-integration, etc.)
|
|
13
|
+
- Você quer ver evolução de métricas ao longo do tempo
|
|
14
|
+
- Você quer falhar o CI quando uma métrica regredir
|
|
15
|
+
- Você quer dashboards/reports de saúde do projeto
|
|
16
|
+
|
|
17
|
+
## O que essa skill faz
|
|
18
|
+
|
|
19
|
+
1. **Coleta** — roda os collectors de cada skill filha em paralelo
|
|
20
|
+
2. **Agrega** — junta todas as métricas em um snapshot estruturado
|
|
21
|
+
3. **Persiste** — guarda em `tmp/dare_metrics.json` (histórico append-only)
|
|
22
|
+
4. **Compara** — diff contra `tmp/dare_metrics_baseline.json`
|
|
23
|
+
5. **Reporta** — gera markdown report para CI ou stdout
|
|
24
|
+
6. **Bloqueia** — exit code ≠ 0 se regressão crítica
|
|
25
|
+
|
|
26
|
+
## Arquitetura
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
┌──────────────────────────────────────────────────────────┐
|
|
30
|
+
│ collect.ts (orquestrador) │
|
|
31
|
+
└──────────────────────────────────────────────────────────┘
|
|
32
|
+
↓ chama em paralelo
|
|
33
|
+
┌────────────────┬────────────────┬────────────────┐
|
|
34
|
+
│ ax collector │ layered coll. │ llm coll. │ …
|
|
35
|
+
└────────────────┴────────────────┴────────────────┘
|
|
36
|
+
↓
|
|
37
|
+
┌──────────────────────────────────────────────────────────┐
|
|
38
|
+
│ Aggregator → snapshot { skill: { M-01: value, ... } } │
|
|
39
|
+
└──────────────────────────────────────────────────────────┘
|
|
40
|
+
↓
|
|
41
|
+
┌──────────────────────────────────────────────────────────┐
|
|
42
|
+
│ tmp/dare_metrics.json (append) + Regression detector │
|
|
43
|
+
└──────────────────────────────────────────────────────────┘
|
|
44
|
+
↓
|
|
45
|
+
┌──────────────────────────────────────────────────────────┐
|
|
46
|
+
│ Reporter → markdown / json / GitHub Action summary │
|
|
47
|
+
└──────────────────────────────────────────────────────────┘
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Métricas obrigatórias da própria skill
|
|
51
|
+
|
|
52
|
+
| ID | Métrica | Como medir |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| M-01 | 100% dos builds incluem coleta de métricas (skill instalada = sempre true) | Verifica `package.json` ou pipeline yml |
|
|
55
|
+
| M-02 | 0 regressões passam despercebidas (baseline existe para comparação) | `test -f tmp/dare_metrics_baseline.json` |
|
|
56
|
+
| M-03 | Histórico de métricas mantido | `test -f tmp/dare_metrics.json` |
|
|
57
|
+
| M-04 | Workflow GitHub Actions existe | `test -f .github/workflows/dare-metrics.yml` |
|
|
58
|
+
|
|
59
|
+
## Como aplicar
|
|
60
|
+
|
|
61
|
+
### Passo 1: Instalar a skill no projeto
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Dentro do projeto
|
|
65
|
+
pnpm add @dare/quality-telemetry
|
|
66
|
+
# ou
|
|
67
|
+
npm install @dare/quality-telemetry
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Passo 2: Configurar quais skills rastrear
|
|
71
|
+
|
|
72
|
+
```yaml
|
|
73
|
+
# dare.config.yml
|
|
74
|
+
telemetry:
|
|
75
|
+
skills:
|
|
76
|
+
- dare-ax
|
|
77
|
+
- dare-layered-design
|
|
78
|
+
- dare-llm-integration
|
|
79
|
+
- dare-frontend-design
|
|
80
|
+
- dare-realtime
|
|
81
|
+
output: tmp/dare_metrics.json
|
|
82
|
+
baseline: tmp/dare_metrics_baseline.json
|
|
83
|
+
fail_on_regression: true
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Passo 3: Rodar collect
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
dare metrics collect
|
|
90
|
+
# saída:
|
|
91
|
+
# ✓ dare-ax M-01:1.0 M-02:1.0 M-03:1.0 M-04:1.0
|
|
92
|
+
# ✓ dare-layered M-01:0.95 M-02:1.0 M-03:1.0 M-04:1.0
|
|
93
|
+
# ✓ dare-llm M-01:1.0 M-02:0.92 M-03:1.0 M-04:1.0
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Passo 4: Capturar baseline
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
dare metrics baseline
|
|
100
|
+
# copia tmp/dare_metrics.json → tmp/dare_metrics_baseline.json
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Passo 5: Adicionar workflow CI
|
|
104
|
+
|
|
105
|
+
```yaml
|
|
106
|
+
# .github/workflows/dare-metrics.yml
|
|
107
|
+
name: DARE Metrics
|
|
108
|
+
|
|
109
|
+
on: [push, pull_request]
|
|
110
|
+
|
|
111
|
+
jobs:
|
|
112
|
+
metrics:
|
|
113
|
+
runs-on: ubuntu-latest
|
|
114
|
+
steps:
|
|
115
|
+
- uses: actions/checkout@v4
|
|
116
|
+
- uses: actions/setup-node@v4
|
|
117
|
+
with: { node-version: '20' }
|
|
118
|
+
- run: pnpm install
|
|
119
|
+
- run: pnpm dare metrics collect
|
|
120
|
+
- run: pnpm dare metrics compare
|
|
121
|
+
# exit 1 se regressão crítica detectada
|
|
122
|
+
- uses: actions/upload-artifact@v4
|
|
123
|
+
with:
|
|
124
|
+
name: dare-metrics
|
|
125
|
+
path: tmp/dare_metrics*.json
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Schema do snapshot
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"timestamp": "2026-05-26T10:30:00Z",
|
|
133
|
+
"commit": "1d4a1417",
|
|
134
|
+
"branch": "main",
|
|
135
|
+
"skills": {
|
|
136
|
+
"dare-ax": {
|
|
137
|
+
"M-01": { "value": 1.0, "status": "PASS" },
|
|
138
|
+
"M-02": { "value": 1.0, "status": "PASS" },
|
|
139
|
+
"M-03": { "value": 1.0, "status": "PASS" },
|
|
140
|
+
"M-04": { "value": 1.0, "status": "PASS" }
|
|
141
|
+
},
|
|
142
|
+
"dare-layered-design": {
|
|
143
|
+
"M-01": { "value": 0.95, "status": "PASS" },
|
|
144
|
+
"M-02": { "value": 1.0, "status": "PASS" },
|
|
145
|
+
"M-03": { "value": 1.0, "status": "PASS" },
|
|
146
|
+
"M-04": { "value": 1.0, "status": "PASS" }
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Detecção de regressão
|
|
153
|
+
|
|
154
|
+
Para cada métrica, comparar valor atual com baseline:
|
|
155
|
+
|
|
156
|
+
| Mudança | Severidade | Ação |
|
|
157
|
+
|---|---|---|
|
|
158
|
+
| value caiu ≥ 5% | CRITICAL | bloquear PR |
|
|
159
|
+
| value caiu < 5% mas ≥ 1% | WARNING | comentar no PR, não bloquear |
|
|
160
|
+
| value subiu | INFO | celebrar |
|
|
161
|
+
| value igual | NEUTRAL | nenhuma |
|
|
162
|
+
|
|
163
|
+
## Antipatterns
|
|
164
|
+
|
|
165
|
+
| AP | Antipattern | Por que evitar |
|
|
166
|
+
|---|---|---|
|
|
167
|
+
| AP-01 | Coletar métricas sem baseline | Não dá pra detectar regressão |
|
|
168
|
+
| AP-02 | Histórico não versionado | Perde contexto histórico |
|
|
169
|
+
| AP-03 | Coletar mas não bloquear regressão | CI vira teatro |
|
|
170
|
+
| AP-04 | Baseline desatualizado | Regressão real fica invisível |
|
|
171
|
+
|
|
172
|
+
## Boas práticas
|
|
173
|
+
|
|
174
|
+
1. **Baseline atualizado a cada release** — não a cada commit
|
|
175
|
+
2. **Regressão = bloqueio de release**, não comentário ignorável
|
|
176
|
+
3. **Métricas exportadas para Datadog/Grafana** após N coletas, para visualizar tendência
|
|
177
|
+
4. **Skill deve rodar em < 60s** — se demorar, paralelizar collectors
|
|
178
|
+
|
|
179
|
+
## Dicas
|
|
180
|
+
|
|
181
|
+
- **Use** o template `packages/skills/dare-quality-telemetry/github_actions_template.ts` para gerar `.github/workflows/dare-metrics.yml`
|
|
182
|
+
- **Combine** com `dare-ax` (M-01 a M-04 dela são coletadas aqui)
|
|
183
|
+
- **Estenda** criando collectors custom para métricas específicas do projeto (cobertura de testes, build time, etc.)
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
Esta skill é parte do DARE Method e está sob licença MIT.
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-realtime
|
|
3
|
+
description: Comunicação real-time (WebSocket, SSE) em projetos DARE. Fornece schema validation de eventos, registro central de tipos, reconexão com exponential backoff, e gerenciamento de subscriptions com limpeza garantida (zero ghost listeners).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Realtime Skill
|
|
7
|
+
|
|
8
|
+
Você é um especialista em comunicação real-time. Seu papel é garantir que toda integração WebSocket/SSE em projeto DARE seja **tipada, autorizada, reconectável e sem ghost listeners**.
|
|
9
|
+
|
|
10
|
+
## Quando usar esta skill
|
|
11
|
+
|
|
12
|
+
- Projeto precisa de WebSocket (chat, notifications, live updates)
|
|
13
|
+
- Projeto precisa de SSE (logs streaming, métricas em tempo real)
|
|
14
|
+
- Você está auditando ghost listeners (memória crescendo após desconexão)
|
|
15
|
+
- Você está revisando código que faz `socket.on('event', ...)` sem cleanup
|
|
16
|
+
|
|
17
|
+
## Arquitetura recomendada
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌─────────────────────────────────────────────────────────┐
|
|
21
|
+
│ Event Registry │
|
|
22
|
+
│ - Tipos de evento com schema JSON │
|
|
23
|
+
│ - Versionamento (v1, v2…) │
|
|
24
|
+
│ - Autorização por evento │
|
|
25
|
+
└─────────────────────────────────────────────────────────┘
|
|
26
|
+
↓
|
|
27
|
+
┌─────────────────────────────────────────────────────────┐
|
|
28
|
+
│ Subscription Manager │
|
|
29
|
+
│ - Map<connection_id, Set<event_type>> │
|
|
30
|
+
│ - Cleanup garantido on disconnect │
|
|
31
|
+
└─────────────────────────────────────────────────────────┘
|
|
32
|
+
↓
|
|
33
|
+
┌─────────────────────────────────────────────────────────┐
|
|
34
|
+
│ Reconnect Strategy │
|
|
35
|
+
│ - Exponential backoff (1s, 2s, 4s, 8s, max 30s) │
|
|
36
|
+
│ - Jitter para evitar thundering herd │
|
|
37
|
+
│ - Resync de estado após reconectar │
|
|
38
|
+
└─────────────────────────────────────────────────────────┘
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Os 4 pilares
|
|
42
|
+
|
|
43
|
+
### 1. Schema validation de eventos
|
|
44
|
+
|
|
45
|
+
Todo evento WebSocket/SSE tem schema JSON:
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// event_registry.ts
|
|
49
|
+
const events = {
|
|
50
|
+
'user.created.v1': z.object({
|
|
51
|
+
id: z.string().uuid(),
|
|
52
|
+
email: z.string().email(),
|
|
53
|
+
createdAt: z.string().datetime(),
|
|
54
|
+
}),
|
|
55
|
+
'message.sent.v1': z.object({
|
|
56
|
+
conversationId: z.string().uuid(),
|
|
57
|
+
senderId: z.string().uuid(),
|
|
58
|
+
body: z.string().max(2000),
|
|
59
|
+
sentAt: z.string().datetime(),
|
|
60
|
+
}),
|
|
61
|
+
};
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Server valida antes de emitir, client valida antes de processar. Evento inválido = log + drop.
|
|
65
|
+
|
|
66
|
+
### 2. Registro central de tipos
|
|
67
|
+
|
|
68
|
+
Um único `event_registry.ts/py/rs` lista todos os event types. Adicionar evento novo passa por PR explícito. Versionamento via sufixo (`.v1`, `.v2`).
|
|
69
|
+
|
|
70
|
+
### 3. Reconexão com exponential backoff
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
class ReconnectStrategy {
|
|
74
|
+
private attempt = 0;
|
|
75
|
+
next(): number {
|
|
76
|
+
const base = Math.min(1000 * 2 ** this.attempt, 30_000);
|
|
77
|
+
const jitter = Math.random() * 1000;
|
|
78
|
+
this.attempt++;
|
|
79
|
+
return base + jitter;
|
|
80
|
+
}
|
|
81
|
+
reset() { this.attempt = 0; }
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Após reconectar, **resync de estado** — buscar eventos perdidos via REST ou pedir snapshot via WS.
|
|
86
|
+
|
|
87
|
+
### 4. Subscription manager (zero ghost listeners)
|
|
88
|
+
|
|
89
|
+
Cada subscription rastreada em map, com cleanup automático:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
class SubscriptionManager {
|
|
93
|
+
private subs = new Map<string, Set<string>>(); // connectionId → events
|
|
94
|
+
|
|
95
|
+
subscribe(connId: string, event: string) {
|
|
96
|
+
if (!this.subs.has(connId)) this.subs.set(connId, new Set());
|
|
97
|
+
this.subs.get(connId)!.add(event);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
unsubscribeAll(connId: string) {
|
|
101
|
+
this.subs.delete(connId);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Forçar limpeza on disconnect — SEMPRE
|
|
105
|
+
onDisconnect(connId: string) {
|
|
106
|
+
this.unsubscribeAll(connId);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Métricas obrigatórias
|
|
112
|
+
|
|
113
|
+
| ID | Métrica | Como medir |
|
|
114
|
+
|---|---|---|
|
|
115
|
+
| M-01 | 100% de event types com JSON Schema definido | grep no registry |
|
|
116
|
+
| M-02 | 100% de subscriptions autorizadas | verificar `authorize()` antes de `subscribe()` |
|
|
117
|
+
| M-03 | 0 ghost listeners após desconexão | métrica `subs.size` por conexão = 0 após disconnect |
|
|
118
|
+
| M-04 | Estratégia de reconexão configurada | grep por `ReconnectStrategy` ou similar |
|
|
119
|
+
|
|
120
|
+
## Antipatterns
|
|
121
|
+
|
|
122
|
+
| AP | Antipattern | Sinal | Correção |
|
|
123
|
+
|---|---|---|---|
|
|
124
|
+
| AP-01 | Evento sem schema | `socket.emit('foo', anything)` | Adicionar schema no registry |
|
|
125
|
+
| AP-02 | `socket.on(...)` sem cleanup | listener fica vivo após disconnect | Usar SubscriptionManager |
|
|
126
|
+
| AP-03 | Reconexão sem backoff | reconecta imediatamente em loop | Exponential backoff + jitter |
|
|
127
|
+
| AP-04 | Sem autorização de subscription | usuário ouve eventos de outro tenant | `authorize(user, event)` antes de `subscribe()` |
|
|
128
|
+
| AP-05 | Broadcast sem filtro | `io.emit()` para todos | Use rooms / channels por tenant |
|
|
129
|
+
| AP-06 | Estado não recuperado após reconectar | UI mostra dados stale | Resync via REST ou snapshot |
|
|
130
|
+
|
|
131
|
+
## Como aplicar
|
|
132
|
+
|
|
133
|
+
### Passo 1: Criar event registry
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
// src/realtime/event_registry.ts
|
|
137
|
+
export const EventRegistry = {
|
|
138
|
+
'user.created.v1': { schema: UserCreatedSchema, requires: 'admin' },
|
|
139
|
+
'message.sent.v1': { schema: MessageSentSchema, requires: 'participant' },
|
|
140
|
+
};
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Passo 2: Implementar subscription manager
|
|
144
|
+
|
|
145
|
+
Use `packages/skills/dare-realtime/subscription_manager.ts` como template. Garante cleanup on disconnect.
|
|
146
|
+
|
|
147
|
+
### Passo 3: Configurar reconexão no client
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
const strategy = new ReconnectStrategy({ base: 1000, max: 30_000 });
|
|
151
|
+
socket.on('disconnect', () => {
|
|
152
|
+
setTimeout(() => socket.connect(), strategy.next());
|
|
153
|
+
});
|
|
154
|
+
socket.on('connect', () => {
|
|
155
|
+
strategy.reset();
|
|
156
|
+
resyncState(); // fetch via REST eventos perdidos
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Passo 4: Adicionar autorização
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
socket.on('subscribe', (eventType) => {
|
|
164
|
+
if (!authorize(socket.user, eventType)) {
|
|
165
|
+
socket.emit('error', { code: 'FORBIDDEN' });
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
subscriptionManager.subscribe(socket.id, eventType);
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Passo 5: Validar eventos no client e server
|
|
173
|
+
|
|
174
|
+
Server antes de emitir:
|
|
175
|
+
```typescript
|
|
176
|
+
const schema = EventRegistry[eventType].schema;
|
|
177
|
+
const valid = schema.safeParse(payload);
|
|
178
|
+
if (!valid.success) { log.error(...); return; }
|
|
179
|
+
io.to(room).emit(eventType, valid.data);
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Client antes de processar:
|
|
183
|
+
```typescript
|
|
184
|
+
socket.on(eventType, (payload) => {
|
|
185
|
+
const valid = EventRegistry[eventType].schema.safeParse(payload);
|
|
186
|
+
if (!valid.success) { log.warn(...); return; }
|
|
187
|
+
handleEvent(valid.data);
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Boas práticas
|
|
192
|
+
|
|
193
|
+
1. **WebSocket vs SSE** — SSE para server→client unidirecional (logs, métricas). WS para bidirectional (chat).
|
|
194
|
+
2. **Rooms/channels por tenant** — evita broadcast cross-tenant
|
|
195
|
+
3. **Heartbeat / ping-pong** — detectar conexão zumbi (network OK mas peer não responde)
|
|
196
|
+
4. **Backpressure** — se client lento, fila no server explode. Drop eventos antigos ou aplicar rate limit.
|
|
197
|
+
5. **Replay limitado** — guardar últimos N eventos por room para reconexão recente, não histórico completo
|
|
198
|
+
|
|
199
|
+
## Stack recomendada
|
|
200
|
+
|
|
201
|
+
| Stack | WebSocket | SSE |
|
|
202
|
+
|---|---|---|
|
|
203
|
+
| Node | `socket.io`, `ws` | `eventsource` (client) + endpoint custom |
|
|
204
|
+
| Rails | Action Cable | Rack streaming |
|
|
205
|
+
| Rust/Axum | `tokio-tungstenite`, `axum` ws | `axum::sse::Sse` |
|
|
206
|
+
| FastAPI | `fastapi.WebSocket` | `EventSourceResponse` |
|
|
207
|
+
| Go | `gorilla/websocket`, `melody` | stdlib `http.Flusher` |
|
|
208
|
+
|
|
209
|
+
## Dicas
|
|
210
|
+
|
|
211
|
+
- **Leia** `docs/design/skills/dare-realtime/DESIGN.md`
|
|
212
|
+
- **Combine** com `dare-security` para autorização
|
|
213
|
+
- **Use** os templates em `packages/skills/dare-realtime/`
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
Esta skill é parte do DARE Method e está sob licença MIT.
|