@dewtech/dare-cli 3.3.0 → 3.4.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/LICENSE +21 -0
- package/README.md +764 -764
- package/dist/__tests__/confidence.test.js +13 -13
- package/dist/__tests__/dag-converter.test.js +56 -56
- package/dist/__tests__/mcp-server/server.test.js +3 -16
- package/dist/__tests__/mcp-server/server.test.js.map +1 -1
- package/dist/__tests__/project-generator.test.js +2 -2
- package/dist/__tests__/project-generator.test.js.map +1 -1
- package/dist/__tests__/refine.test.js +49 -49
- package/dist/__tests__/reverse-collection.test.js +6 -6
- package/dist/__tests__/review.test.js +38 -38
- package/dist/__tests__/security-hardening.test.d.ts +2 -0
- package/dist/__tests__/security-hardening.test.d.ts.map +1 -0
- package/dist/__tests__/security-hardening.test.js +101 -0
- package/dist/__tests__/security-hardening.test.js.map +1 -0
- package/dist/__tests__/validate.test.js +65 -65
- package/dist/bin/dare.js +0 -0
- package/dist/commands/__tests__/init-validation.test.d.ts +2 -0
- package/dist/commands/__tests__/init-validation.test.d.ts.map +1 -0
- package/dist/commands/__tests__/init-validation.test.js +81 -0
- package/dist/commands/__tests__/init-validation.test.js.map +1 -0
- package/dist/commands/__tests__/init.integration.spec.js +6 -4
- package/dist/commands/__tests__/init.integration.spec.js.map +1 -1
- package/dist/commands/__tests__/init.spec.d.ts +2 -0
- package/dist/commands/__tests__/init.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/init.spec.js +88 -0
- package/dist/commands/__tests__/init.spec.js.map +1 -0
- package/dist/commands/blueprint.js +122 -122
- package/dist/commands/design.js +20 -20
- package/dist/commands/init-validation.d.ts +22 -0
- package/dist/commands/init-validation.d.ts.map +1 -0
- package/dist/commands/init-validation.js +54 -0
- package/dist/commands/init-validation.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +26 -10
- package/dist/commands/init.js.map +1 -1
- package/dist/graphrag/graph-rag.js +24 -24
- package/dist/mcp-server/__tests__/auth.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/auth.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/auth.test.js +72 -0
- package/dist/mcp-server/__tests__/auth.test.js.map +1 -0
- package/dist/mcp-server/__tests__/boot-config.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/boot-config.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/boot-config.test.js +29 -0
- package/dist/mcp-server/__tests__/boot-config.test.js.map +1 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.js +66 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.js.map +1 -0
- package/dist/mcp-server/__tests__/path-confinement.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/path-confinement.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/path-confinement.test.js +135 -0
- package/dist/mcp-server/__tests__/path-confinement.test.js.map +1 -0
- package/dist/mcp-server/bin/server.js +18 -6
- package/dist/mcp-server/bin/server.js.map +1 -1
- package/dist/mcp-server/boot-config.d.ts +6 -0
- package/dist/mcp-server/boot-config.d.ts.map +1 -0
- package/dist/mcp-server/boot-config.js +17 -0
- package/dist/mcp-server/boot-config.js.map +1 -0
- package/dist/mcp-server/middleware/auth.d.ts +10 -0
- package/dist/mcp-server/middleware/auth.d.ts.map +1 -0
- package/dist/mcp-server/middleware/auth.js +44 -0
- package/dist/mcp-server/middleware/auth.js.map +1 -0
- package/dist/mcp-server/middleware/cors.d.ts +6 -0
- package/dist/mcp-server/middleware/cors.d.ts.map +1 -0
- package/dist/mcp-server/middleware/cors.js +30 -0
- package/dist/mcp-server/middleware/cors.js.map +1 -0
- package/dist/mcp-server/middleware/error-handler.d.ts +11 -0
- package/dist/mcp-server/middleware/error-handler.d.ts.map +1 -0
- package/dist/mcp-server/middleware/error-handler.js +14 -0
- package/dist/mcp-server/middleware/error-handler.js.map +1 -0
- package/dist/mcp-server/server.d.ts +7 -2
- package/dist/mcp-server/server.d.ts.map +1 -1
- package/dist/mcp-server/server.js +185 -105
- package/dist/mcp-server/server.js.map +1 -1
- package/dist/skills/registry-mock.json +109 -109
- package/dist/skills/tests/manifest.spec.js +20 -20
- package/dist/stacks/__tests__/dna-emitter.spec.js +6 -6
- package/dist/stacks/dna-emitter.js +69 -69
- package/dist/stacks/ruby-rails-8/scaffold.js +15 -15
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +254 -252
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/stack-bootstrap.js +371 -371
- package/dist/utils/templates.js +394 -394
- package/dist/verification/__tests__/anti-tamper.test.js +13 -13
- package/package.json +96 -93
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +68 -68
- 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 -152
- package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -21
- package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +368 -368
- package/templates/ide/antigravity/.agents/skills/dare-bootstrap/SKILL.md +32 -32
- package/templates/ide/antigravity/.agents/skills/dare-bugfix-design/SKILL.md +76 -76
- package/templates/ide/antigravity/.agents/skills/dare-dag/SKILL.md +32 -32
- package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -154
- package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -130
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
- package/templates/ide/antigravity/.agents/skills/dare-design/SKILL.md +180 -180
- package/templates/ide/antigravity/.agents/skills/dare-discover/SKILL.md +33 -33
- package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -63
- package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -315
- package/templates/ide/antigravity/.agents/skills/dare-execute/SKILL.md +264 -264
- package/templates/ide/antigravity/.agents/skills/dare-feature-design/SKILL.md +74 -74
- package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -192
- package/templates/ide/antigravity/.agents/skills/dare-graph/SKILL.md +35 -35
- package/templates/ide/antigravity/.agents/skills/dare-info/SKILL.md +31 -31
- package/templates/ide/antigravity/.agents/skills/dare-init/SKILL.md +35 -35
- package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -337
- package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -166
- package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -217
- package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -61
- package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -187
- package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -217
- package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
- package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -108
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
- package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -263
- package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
- package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -274
- package/templates/ide/antigravity/.agents/skills/dare-skill/SKILL.md +35 -35
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
- package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -188
- package/templates/ide/antigravity/.agents/skills/dare-update/SKILL.md +33 -33
- package/templates/ide/antigravity/.agents/skills/dare-validate/SKILL.md +33 -33
- package/templates/ide/antigravity/.agents/skills/dare-welcome/SKILL.md +30 -30
- package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -343
- package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -377
- package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -382
- package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -326
- package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -393
- 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/antigravity/templates/TASKS-template.md +26 -26
- package/templates/ide/antigravity/templates/TELEMETRY-template.md +125 -125
- package/templates/ide/claude/.claude/commands/dare-ax.md +131 -131
- package/templates/ide/claude/.claude/commands/dare-bench.md +18 -18
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
- package/templates/ide/claude/.claude/commands/dare-bootstrap.md +27 -27
- package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -119
- 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 -117
- package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
- package/templates/ide/claude/.claude/commands/dare-dag.md +27 -27
- package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
- package/templates/ide/claude/.claude/commands/dare-discover.md +28 -28
- package/templates/ide/claude/.claude/commands/dare-dna.md +75 -75
- package/templates/ide/claude/.claude/commands/dare-docker.md +207 -207
- package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
- package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -147
- package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -149
- package/templates/ide/claude/.claude/commands/dare-graph.md +30 -30
- package/templates/ide/claude/.claude/commands/dare-info.md +26 -26
- package/templates/ide/claude/.claude/commands/dare-init.md +30 -30
- package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -211
- package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -124
- package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -148
- package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -72
- package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -166
- package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -159
- package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
- package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -139
- 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-skill.md +30 -30
- package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
- package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -132
- package/templates/ide/claude/.claude/commands/dare-update.md +28 -28
- package/templates/ide/claude/.claude/commands/dare-validate.md +28 -28
- package/templates/ide/claude/.claude/commands/dare-welcome.md +25 -25
- package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -205
- package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -232
- package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -228
- package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -210
- package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -236
- 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/claude/templates/TASKS-template.md +26 -26
- package/templates/ide/claude/templates/TELEMETRY-template.md +125 -125
- package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -18
- package/templates/ide/cursor/.cursor/commands/dare-blueprint.md +86 -86
- package/templates/ide/cursor/.cursor/commands/dare-bootstrap.md +27 -27
- package/templates/ide/cursor/.cursor/commands/dare-bugfix-design.md +64 -64
- package/templates/ide/cursor/.cursor/commands/dare-dag-run.md +110 -110
- package/templates/ide/cursor/.cursor/commands/dare-dag-viz.md +139 -139
- package/templates/ide/cursor/.cursor/commands/dare-dag.md +27 -27
- package/templates/ide/cursor/.cursor/commands/dare-design.md +35 -35
- package/templates/ide/cursor/.cursor/commands/dare-discover.md +28 -28
- package/templates/ide/cursor/.cursor/commands/dare-dna.md +75 -75
- package/templates/ide/cursor/.cursor/commands/dare-docker-compose.md +18 -18
- package/templates/ide/cursor/.cursor/commands/dare-dockerfile.md +17 -17
- package/templates/ide/cursor/.cursor/commands/dare-execute.md +19 -19
- package/templates/ide/cursor/.cursor/commands/dare-feature-design.md +64 -64
- package/templates/ide/cursor/.cursor/commands/dare-graph.md +30 -30
- package/templates/ide/cursor/.cursor/commands/dare-info.md +26 -26
- package/templates/ide/cursor/.cursor/commands/dare-init.md +30 -30
- package/templates/ide/cursor/.cursor/commands/dare-migrate.md +72 -72
- package/templates/ide/cursor/.cursor/commands/dare-refine.md +107 -107
- package/templates/ide/cursor/.cursor/commands/dare-reverse.md +139 -139
- package/templates/ide/cursor/.cursor/commands/dare-review.md +91 -91
- package/templates/ide/cursor/.cursor/commands/dare-skill.md +30 -30
- package/templates/ide/cursor/.cursor/commands/dare-tasks.md +184 -184
- package/templates/ide/cursor/.cursor/commands/dare-telemetry.md +42 -42
- package/templates/ide/cursor/.cursor/commands/dare-update.md +28 -28
- package/templates/ide/cursor/.cursor/commands/dare-validate.md +28 -28
- package/templates/ide/cursor/.cursor/commands/dare-welcome.md +25 -25
- package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -263
- package/templates/ide/cursor/.cursor/rules/skill-bugfix-design.mdc +51 -51
- package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -173
- package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -134
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
- package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -63
- package/templates/ide/cursor/.cursor/rules/skill-docker.mdc +33 -33
- package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -352
- package/templates/ide/cursor/.cursor/rules/skill-feature-design.mdc +43 -43
- package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -244
- package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -371
- package/templates/ide/cursor/.cursor/rules/skill-laravel-api.mdc +44 -44
- package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -266
- package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -295
- package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -367
- package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -58
- package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -346
- package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -248
- package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -400
- package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -262
- package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -107
- package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -281
- 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/.cursor/rules/skill-telemetry.mdc +156 -156
- 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/ide/cursor/templates/TASKS-template.md +26 -26
- package/templates/ide/cursor/templates/TELEMETRY-template.md +125 -125
- package/templates/shared/docker-compose.yml +41 -41
- package/templates/stacks/go-gin/.dare/skills.yml +11 -11
- package/templates/stacks/go-gin/.env.example +24 -24
- package/templates/stacks/go-gin/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/go-gin/README.md.tpl +38 -38
- package/templates/stacks/go-gin/cmd/server/main.go.tpl +78 -78
- package/templates/stacks/go-gin/db/migrations/0001_create_users.down.sql +2 -2
- package/templates/stacks/go-gin/db/migrations/0001_create_users.up.sql +12 -12
- package/templates/stacks/go-gin/db/queries/users.sql +23 -23
- package/templates/stacks/go-gin/gitignore +7 -7
- package/templates/stacks/go-gin/go.mod.tpl +17 -17
- package/templates/stacks/go-gin/internal/config/config.go +41 -41
- package/templates/stacks/go-gin/internal/db/postgres.go.tpl +25 -25
- package/templates/stacks/go-gin/internal/handler/auth_handler.go.tpl +72 -72
- package/templates/stacks/go-gin/internal/handler/users_handler.go.tpl +72 -72
- package/templates/stacks/go-gin/internal/handler/ws_handler.go +37 -37
- package/templates/stacks/go-gin/internal/llm/dummy.go +14 -14
- package/templates/stacks/go-gin/internal/llm/provider.go +8 -8
- package/templates/stacks/go-gin/internal/middleware/jwt.go.tpl +58 -58
- package/templates/stacks/go-gin/internal/middleware/rate_limit.go +55 -55
- package/templates/stacks/go-gin/internal/model/user.go +17 -17
- package/templates/stacks/go-gin/internal/repository/users_repository.go.tpl +79 -79
- package/templates/stacks/go-gin/internal/service/auth_service.go.tpl +55 -55
- package/templates/stacks/go-gin/internal/service/users_service.go.tpl +53 -53
- package/templates/stacks/go-gin/llms.txt.tpl +54 -54
- package/templates/stacks/go-gin/openapi.json.tpl +46 -46
- package/templates/stacks/go-gin/sqlc.yaml +14 -14
- package/templates/stacks/go-gin/tests/smoke_test.go.tpl +22 -22
- package/templates/stacks/go-stdlib/.dare/skills.yml +11 -11
- package/templates/stacks/go-stdlib/.env.example +24 -24
- package/templates/stacks/go-stdlib/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/go-stdlib/README.md.tpl +41 -41
- package/templates/stacks/go-stdlib/cmd/server/main.go.tpl +82 -82
- package/templates/stacks/go-stdlib/db/migrations/0001_create_users.down.sql +2 -2
- package/templates/stacks/go-stdlib/db/migrations/0001_create_users.up.sql +12 -12
- package/templates/stacks/go-stdlib/db/queries/users.sql +23 -23
- package/templates/stacks/go-stdlib/gitignore +6 -6
- package/templates/stacks/go-stdlib/go.mod.tpl +15 -15
- package/templates/stacks/go-stdlib/internal/config/config.go +41 -41
- package/templates/stacks/go-stdlib/internal/db/postgres.go.tpl +24 -24
- package/templates/stacks/go-stdlib/internal/handler/auth_handler.go.tpl +71 -71
- package/templates/stacks/go-stdlib/internal/handler/users_handler.go.tpl +84 -84
- package/templates/stacks/go-stdlib/internal/handler/ws_handler.go +36 -36
- package/templates/stacks/go-stdlib/internal/httpx/json.go +32 -32
- package/templates/stacks/go-stdlib/internal/llm/dummy.go +14 -14
- package/templates/stacks/go-stdlib/internal/llm/provider.go +8 -8
- package/templates/stacks/go-stdlib/internal/middleware/chain.go +21 -21
- package/templates/stacks/go-stdlib/internal/middleware/cors.go +27 -27
- package/templates/stacks/go-stdlib/internal/middleware/jwt.go.tpl +51 -51
- package/templates/stacks/go-stdlib/internal/middleware/rate_limit.go +81 -81
- package/templates/stacks/go-stdlib/internal/model/user.go +17 -17
- package/templates/stacks/go-stdlib/internal/repository/users_repository.go.tpl +75 -75
- package/templates/stacks/go-stdlib/internal/service/auth_service.go.tpl +55 -55
- package/templates/stacks/go-stdlib/internal/service/users_service.go.tpl +53 -53
- package/templates/stacks/go-stdlib/llms.txt.tpl +60 -60
- package/templates/stacks/go-stdlib/openapi.json.tpl +46 -46
- package/templates/stacks/go-stdlib/sqlc.yaml +14 -14
- package/templates/stacks/go-stdlib/tests/smoke_test.go.tpl +45 -45
- package/templates/stacks/mcp-go/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-go/.env.example +14 -14
- package/templates/stacks/mcp-go/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/mcp-go/README.md.tpl +50 -50
- package/templates/stacks/mcp-go/cmd/server/main.go.tpl +62 -62
- package/templates/stacks/mcp-go/gitignore +6 -6
- package/templates/stacks/mcp-go/go.mod.tpl +9 -9
- package/templates/stacks/mcp-go/internal/prompts/summarize.go +9 -9
- package/templates/stacks/mcp-go/internal/server/server.go.tpl +80 -80
- package/templates/stacks/mcp-go/internal/tools/echo.go +15 -15
- package/templates/stacks/mcp-go/internal/transports/http.go.tpl +21 -21
- package/templates/stacks/mcp-go/internal/transports/sse.go.tpl +17 -17
- package/templates/stacks/mcp-go/internal/transports/stdio.go.tpl +14 -14
- package/templates/stacks/mcp-go/llms.txt.tpl +60 -60
- package/templates/stacks/mcp-go/openapi.json.tpl +31 -31
- package/templates/stacks/mcp-go/tests/echo_test.go.tpl +37 -37
- package/templates/stacks/mcp-node-ts/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-node-ts/.env.example +16 -16
- package/templates/stacks/mcp-node-ts/.github/workflows/dare-ci.yml +54 -54
- package/templates/stacks/mcp-node-ts/README.md.hbs +49 -49
- package/templates/stacks/mcp-node-ts/gitignore +7 -7
- package/templates/stacks/mcp-node-ts/llms.txt.hbs +61 -61
- package/templates/stacks/mcp-node-ts/openapi.json.hbs +39 -39
- package/templates/stacks/mcp-node-ts/package.json.hbs +35 -35
- package/templates/stacks/mcp-node-ts/src/cli.ts.hbs +71 -71
- package/templates/stacks/mcp-node-ts/src/prompts/index.ts +36 -36
- package/templates/stacks/mcp-node-ts/src/server.ts.hbs +45 -45
- package/templates/stacks/mcp-node-ts/src/tools/echo.ts +23 -23
- package/templates/stacks/mcp-node-ts/src/tools/index.ts +18 -18
- package/templates/stacks/mcp-node-ts/src/transports/http.ts +68 -68
- package/templates/stacks/mcp-node-ts/src/transports/sse.ts +58 -58
- package/templates/stacks/mcp-node-ts/src/transports/stdio.ts +5 -5
- package/templates/stacks/mcp-node-ts/tests/echo.test.ts +50 -50
- package/templates/stacks/mcp-node-ts/tsconfig.json +17 -17
- package/templates/stacks/mcp-python/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-python/.env.example +14 -14
- package/templates/stacks/mcp-python/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/mcp-python/README.md.j2 +49 -49
- package/templates/stacks/mcp-python/gitignore +12 -12
- package/templates/stacks/mcp-python/llms.txt.j2 +56 -56
- package/templates/stacks/mcp-python/openapi.json.j2 +33 -33
- package/templates/stacks/mcp-python/pyproject.toml.j2 +37 -37
- package/templates/stacks/mcp-python/src/cli.py.j2 +68 -68
- package/templates/stacks/mcp-python/src/prompts/summarize.py +10 -10
- package/templates/stacks/mcp-python/src/server.py.j2 +28 -28
- package/templates/stacks/mcp-python/src/tools/echo.py +12 -12
- package/templates/stacks/mcp-python/src/transports/http.py +12 -12
- package/templates/stacks/mcp-python/src/transports/sse.py +13 -13
- package/templates/stacks/mcp-python/src/transports/stdio.py +6 -6
- package/templates/stacks/mcp-python/tests/test_echo.py +28 -28
- package/templates/stacks/mcp-rust/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-rust/.env.example +14 -14
- package/templates/stacks/mcp-rust/.github/workflows/dare-ci.yml +38 -38
- package/templates/stacks/mcp-rust/Cargo.toml.tera +35 -35
- package/templates/stacks/mcp-rust/README.md.tera +50 -50
- package/templates/stacks/mcp-rust/gitignore +5 -5
- package/templates/stacks/mcp-rust/llms.txt.tera +60 -60
- package/templates/stacks/mcp-rust/openapi.json.tera +31 -31
- package/templates/stacks/mcp-rust/src/cli.rs.tera +33 -33
- package/templates/stacks/mcp-rust/src/lib.rs +6 -6
- package/templates/stacks/mcp-rust/src/main.rs.tera +30 -30
- package/templates/stacks/mcp-rust/src/prompts/mod.rs +1 -1
- package/templates/stacks/mcp-rust/src/prompts/summarize.rs +5 -5
- package/templates/stacks/mcp-rust/src/server.rs.tera +38 -38
- package/templates/stacks/mcp-rust/src/tools/echo.rs +18 -18
- package/templates/stacks/mcp-rust/src/tools/mod.rs +22 -22
- package/templates/stacks/mcp-rust/src/transports/http.rs +27 -27
- package/templates/stacks/mcp-rust/src/transports/mod.rs +3 -3
- package/templates/stacks/mcp-rust/src/transports/sse.rs +33 -33
- package/templates/stacks/mcp-rust/src/transports/stdio.rs +14 -14
- package/templates/stacks/mcp-rust/tests/echo_test.rs.tera +27 -27
- package/templates/stacks/node-nestjs/.dare/skills.yml +11 -11
- package/templates/stacks/node-nestjs/.env.example +21 -21
- package/templates/stacks/node-nestjs/.github/workflows/dare-ci.yml +54 -54
- package/templates/stacks/node-nestjs/README.md.hbs +35 -35
- package/templates/stacks/node-nestjs/gitignore +7 -7
- package/templates/stacks/node-nestjs/llms.txt.hbs +47 -47
- package/templates/stacks/node-nestjs/nest-cli.json +16 -16
- package/templates/stacks/node-nestjs/openapi.json.hbs +75 -75
- package/templates/stacks/node-nestjs/package.json.hbs +57 -57
- package/templates/stacks/node-nestjs/prisma/schema.prisma +25 -25
- package/templates/stacks/node-nestjs/prisma/seed.ts.hbs +25 -25
- package/templates/stacks/node-nestjs/src/app.module.ts +39 -39
- package/templates/stacks/node-nestjs/src/auth/auth.controller.ts +29 -29
- package/templates/stacks/node-nestjs/src/auth/auth.module.ts +25 -25
- package/templates/stacks/node-nestjs/src/auth/auth.service.ts +36 -36
- package/templates/stacks/node-nestjs/src/auth/dto/login-response.dto.ts +9 -9
- package/templates/stacks/node-nestjs/src/auth/dto/login.dto.ts +17 -17
- package/templates/stacks/node-nestjs/src/auth/jwt.strategy.ts +25 -25
- package/templates/stacks/node-nestjs/src/common/filters/problem-details.filter.ts +38 -38
- package/templates/stacks/node-nestjs/src/common/interceptors/json-response.interceptor.ts +13 -13
- package/templates/stacks/node-nestjs/src/main.ts.hbs +44 -44
- package/templates/stacks/node-nestjs/src/prisma/prisma.module.ts +9 -9
- package/templates/stacks/node-nestjs/src/prisma/prisma.service.ts +9 -9
- package/templates/stacks/node-nestjs/src/users/dto/create-user.dto.ts +22 -22
- package/templates/stacks/node-nestjs/src/users/dto/user.dto.ts +15 -15
- package/templates/stacks/node-nestjs/src/users/users.controller.ts +41 -41
- package/templates/stacks/node-nestjs/src/users/users.module.ts +11 -11
- package/templates/stacks/node-nestjs/src/users/users.repository.ts +38 -38
- package/templates/stacks/node-nestjs/src/users/users.service.ts +38 -38
- package/templates/stacks/node-nestjs/tsconfig.build.json +4 -4
- package/templates/stacks/node-nestjs/tsconfig.json +28 -28
- package/templates/stacks/php-laravel/.dare/skills.yml +11 -11
- package/templates/stacks/php-laravel/.env.example +41 -41
- package/templates/stacks/php-laravel/.github/workflows/dare-ci.yml +43 -43
- package/templates/stacks/php-laravel/README.md.hbs +36 -36
- package/templates/stacks/php-laravel/app/Http/Controllers/Api/AuthController.php +36 -36
- package/templates/stacks/php-laravel/app/Http/Controllers/Api/UsersController.php +33 -33
- package/templates/stacks/php-laravel/app/Http/Requests/CreateUserRequest.php +26 -26
- package/templates/stacks/php-laravel/app/Http/Requests/LoginRequest.php +34 -34
- package/templates/stacks/php-laravel/app/Llm/Contracts/LlmProvider.php +12 -12
- package/templates/stacks/php-laravel/app/Llm/Providers/DummyProvider.php +13 -13
- package/templates/stacks/php-laravel/app/Llm/Providers/OpenAiProvider.php +33 -33
- package/templates/stacks/php-laravel/app/Models/User.php +44 -44
- package/templates/stacks/php-laravel/app/Repositories/UsersRepository.php +32 -32
- package/templates/stacks/php-laravel/app/Services/AuthService.php +37 -37
- package/templates/stacks/php-laravel/app/Services/UsersService.php +57 -57
- package/templates/stacks/php-laravel/artisan +12 -12
- package/templates/stacks/php-laravel/bootstrap/app.php +29 -29
- package/templates/stacks/php-laravel/bootstrap/providers.php +5 -5
- package/templates/stacks/php-laravel/composer.json.hbs +58 -58
- package/templates/stacks/php-laravel/config/l5-swagger.php +41 -41
- package/templates/stacks/php-laravel/config/reverb.php +34 -34
- package/templates/stacks/php-laravel/config/sanctum.php +15 -15
- package/templates/stacks/php-laravel/database/migrations/2026_06_01_000001_create_users_table.php +27 -27
- package/templates/stacks/php-laravel/database/seeders/DatabaseSeeder.php +21 -21
- package/templates/stacks/php-laravel/gitignore +23 -23
- package/templates/stacks/php-laravel/llms.txt.hbs +53 -53
- package/templates/stacks/php-laravel/openapi.json.hbs +43 -43
- package/templates/stacks/php-laravel/phpstan.neon +9 -9
- package/templates/stacks/php-laravel/routes/api.php +13 -13
- package/templates/stacks/php-laravel/routes/channels.php +7 -7
- package/templates/stacks/php-laravel/tests/Feature/AuthTest.php +35 -35
- package/templates/stacks/php-laravel/tests/Feature/UsersTest.php +30 -30
- package/templates/stacks/php-laravel/tests/Pest.php +5 -5
- package/templates/stacks/python-fastapi/.dare/skills.yml +11 -11
- package/templates/stacks/python-fastapi/.env.example +21 -21
- package/templates/stacks/python-fastapi/.github/workflows/dare-ci.yml +43 -43
- package/templates/stacks/python-fastapi/README.md.j2 +35 -35
- package/templates/stacks/python-fastapi/alembic/env.py +46 -46
- package/templates/stacks/python-fastapi/alembic/script.py.mako +26 -26
- package/templates/stacks/python-fastapi/alembic/versions/0001_create_users.py.j2 +37 -37
- package/templates/stacks/python-fastapi/alembic.ini.j2 +39 -39
- package/templates/stacks/python-fastapi/app/core/config.py +24 -24
- package/templates/stacks/python-fastapi/app/core/security.py +34 -34
- package/templates/stacks/python-fastapi/app/db/session.py +22 -22
- package/templates/stacks/python-fastapi/app/main.py.j2 +36 -36
- package/templates/stacks/python-fastapi/app/models/__init__.py +3 -3
- package/templates/stacks/python-fastapi/app/models/user.py +30 -30
- package/templates/stacks/python-fastapi/app/repositories/user_repository.py +34 -34
- package/templates/stacks/python-fastapi/app/routers/auth.py +37 -37
- package/templates/stacks/python-fastapi/app/routers/users.py +46 -46
- package/templates/stacks/python-fastapi/app/schemas/user.py +56 -56
- package/templates/stacks/python-fastapi/app/services/auth_service.py +22 -22
- package/templates/stacks/python-fastapi/app/services/user_service.py +31 -31
- package/templates/stacks/python-fastapi/gitignore +12 -12
- package/templates/stacks/python-fastapi/llms.txt.j2 +53 -53
- package/templates/stacks/python-fastapi/openapi.json.j2 +43 -43
- package/templates/stacks/python-fastapi/pyproject.toml.j2 +45 -45
- package/templates/stacks/python-fastapi/tests/test_auth.py +22 -22
- package/templates/stacks/ruby-rails-8/.dare/skills.yml +50 -50
- package/templates/stacks/ruby-rails-8/.env.example +20 -20
- package/templates/stacks/ruby-rails-8/.github/workflows/dare-ci.yml +112 -112
- package/templates/stacks/ruby-rails-8/Gemfile.erb +61 -61
- package/templates/stacks/ruby-rails-8/app/channels/application_cable/channel.rb +11 -11
- package/templates/stacks/ruby-rails-8/app/channels/application_cable/connection.rb +34 -34
- package/templates/stacks/ruby-rails-8/app/channels/dare_updates_channel.rb +18 -18
- package/templates/stacks/ruby-rails-8/app/channels/user_updates_channel.rb +23 -23
- package/templates/stacks/ruby-rails-8/app/controllers/application_controller.rb +44 -44
- package/templates/stacks/ruby-rails-8/app/controllers/concerns/problem_details.rb +93 -93
- package/templates/stacks/ruby-rails-8/app/handlers/summarize_handler.rb +33 -33
- package/templates/stacks/ruby-rails-8/app/handlers/users_handler.rb +68 -68
- package/templates/stacks/ruby-rails-8/app/llm/cache/llm_cache.rb +44 -44
- package/templates/stacks/ruby-rails-8/app/llm/prompts/prompt_loader.rb +54 -54
- package/templates/stacks/ruby-rails-8/app/llm/prompts/summarize_v1.jinja2 +12 -12
- package/templates/stacks/ruby-rails-8/app/llm/providers/dummy_provider.rb +35 -35
- package/templates/stacks/ruby-rails-8/app/llm/providers/llm_provider.rb +67 -67
- package/templates/stacks/ruby-rails-8/app/llm/providers/openai_provider.rb +62 -62
- package/templates/stacks/ruby-rails-8/app/llm/rate_limit/token_bucket.rb +82 -82
- package/templates/stacks/ruby-rails-8/app/llm/validators/summarize_output_schema.json +21 -21
- package/templates/stacks/ruby-rails-8/app/llm/validators/validator.rb +52 -52
- package/templates/stacks/ruby-rails-8/app/models/user.rb +36 -36
- package/templates/stacks/ruby-rails-8/app/presenters/user_presenter.rb +48 -48
- package/templates/stacks/ruby-rails-8/app/repositories/document_repository.rb +57 -57
- package/templates/stacks/ruby-rails-8/app/repositories/user_repository.rb +73 -73
- package/templates/stacks/ruby-rails-8/app/services/create_user_service.rb +67 -67
- package/templates/stacks/ruby-rails-8/app/services/realtime_service.rb +53 -53
- package/templates/stacks/ruby-rails-8/app/services/summarize_document_service.rb +57 -57
- package/templates/stacks/ruby-rails-8/config/dare.yml +42 -42
- package/templates/stacks/ruby-rails-8/config/initializers/dare.rb +31 -31
- package/templates/stacks/ruby-rails-8/config/initializers/rack_attack.rb +64 -64
- package/templates/stacks/ruby-rails-8/config/initializers/rswag_api.rb +12 -12
- package/templates/stacks/ruby-rails-8/lib/tasks/dare.rake +159 -159
- package/templates/stacks/ruby-rails-8/llms.txt.erb +69 -69
- package/templates/stacks/ruby-rails-8/spec/api/summarize_spec.rb +56 -56
- package/templates/stacks/ruby-rails-8/spec/api/users_spec.rb +72 -72
- package/templates/stacks/ruby-rails-8/spec/channels/dare_updates_channel_spec.rb +61 -61
- package/templates/stacks/ruby-rails-8/spec/channels/user_updates_channel_spec.rb +56 -56
- package/templates/stacks/ruby-rails-8/spec/factories/users.rb +27 -27
- package/templates/stacks/ruby-rails-8/spec/handlers/users_handler_spec.rb +88 -88
- package/templates/stacks/ruby-rails-8/spec/rails_helper.rb +31 -31
- package/templates/stacks/ruby-rails-8/spec/services/create_user_service_spec.rb +88 -88
- package/templates/stacks/ruby-rails-8/spec/services/summarize_document_service_spec.rb +142 -142
- package/templates/stacks/ruby-rails-8/spec/swagger_helper.rb +73 -73
- package/templates/stacks/rust-axum/.dare/skills.yml +11 -11
- package/templates/stacks/rust-axum/.env.example +26 -26
- package/templates/stacks/rust-axum/.github/workflows/dare-ci.yml +40 -40
- package/templates/stacks/rust-axum/Cargo.toml.tera +53 -53
- package/templates/stacks/rust-axum/README.md.tera +37 -37
- package/templates/stacks/rust-axum/gitignore +5 -5
- package/templates/stacks/rust-axum/llms.txt.tera +54 -54
- package/templates/stacks/rust-axum/migrations/0001_create_users.sql +13 -13
- package/templates/stacks/rust-axum/openapi.json.tera +46 -46
- package/templates/stacks/rust-axum/src/config.rs +45 -45
- package/templates/stacks/rust-axum/src/errors.rs +48 -48
- package/templates/stacks/rust-axum/src/handlers/auth.rs +48 -48
- package/templates/stacks/rust-axum/src/handlers/mod.rs +3 -3
- package/templates/stacks/rust-axum/src/handlers/users.rs +81 -81
- package/templates/stacks/rust-axum/src/handlers/ws.rs +24 -24
- package/templates/stacks/rust-axum/src/lib.rs +19 -19
- package/templates/stacks/rust-axum/src/llm/mod.rs +1 -1
- package/templates/stacks/rust-axum/src/llm/provider.rs +48 -48
- package/templates/stacks/rust-axum/src/main.rs.tera +64 -64
- package/templates/stacks/rust-axum/src/middleware/auth.rs +20 -20
- package/templates/stacks/rust-axum/src/middleware/mod.rs +2 -2
- package/templates/stacks/rust-axum/src/middleware/rate_limit.rs +27 -27
- package/templates/stacks/rust-axum/src/models/mod.rs +1 -1
- package/templates/stacks/rust-axum/src/models/user.rs +13 -13
- package/templates/stacks/rust-axum/src/repositories/mod.rs +1 -1
- package/templates/stacks/rust-axum/src/repositories/user_repository.rs +62 -62
- package/templates/stacks/rust-axum/src/services/auth_service.rs +50 -50
- package/templates/stacks/rust-axum/src/services/mod.rs +2 -2
- package/templates/stacks/rust-axum/src/services/user_service.rs +53 -53
- package/templates/stacks/rust-axum/tests/integration_test.rs.tera +13 -13
- package/dist/commands/new.d.ts +0 -16
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -104
- package/dist/commands/new.js.map +0 -1
|
@@ -1,166 +1,166 @@
|
|
|
1
|
-
# /dare-quality-telemetry
|
|
2
|
-
|
|
3
|
-
Coleta métricas das skills DARE (ax, layered-design, llm-integration, frontend, realtime…), persiste histórico em `tmp/dare_metrics.json` e detecta regressões contra baseline.
|
|
4
|
-
|
|
5
|
-
## Como usar
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
/dare-quality-telemetry collect # roda todos os collectors
|
|
9
|
-
/dare-quality-telemetry baseline # captura baseline atual
|
|
10
|
-
/dare-quality-telemetry compare # compara contra baseline (CI)
|
|
11
|
-
/dare-quality-telemetry report # gera markdown report
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
## O que faz
|
|
15
|
-
|
|
16
|
-
1. Roda collectors das skills configuradas em paralelo
|
|
17
|
-
2. Agrega em um snapshot
|
|
18
|
-
3. Persiste em `tmp/dare_metrics.json`
|
|
19
|
-
4. Compara com `tmp/dare_metrics_baseline.json`
|
|
20
|
-
5. Reporta em markdown / JSON
|
|
21
|
-
6. Exit code ≠ 0 se regressão crítica
|
|
22
|
-
|
|
23
|
-
## Arquitetura
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
collect.ts
|
|
27
|
-
↓ chama em paralelo
|
|
28
|
-
[ax collector] [layered coll.] [llm coll.] [frontend coll.] [realtime coll.]
|
|
29
|
-
↓
|
|
30
|
-
Aggregator → snapshot { skill: { M-01: value, ... } }
|
|
31
|
-
↓
|
|
32
|
-
tmp/dare_metrics.json + Regression detector
|
|
33
|
-
↓
|
|
34
|
-
Reporter → markdown / JSON / GH Actions summary
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Métricas obrigatórias
|
|
38
|
-
|
|
39
|
-
| ID | Métrica |
|
|
40
|
-
|---|---|
|
|
41
|
-
| M-01 | 100% dos builds incluem coleta (skill instalada = true) |
|
|
42
|
-
| M-02 | 0 regressões passam despercebidas (baseline existe) |
|
|
43
|
-
| M-03 | Histórico mantido em `tmp/dare_metrics.json` |
|
|
44
|
-
| M-04 | Workflow `.github/workflows/dare-metrics.yml` existe |
|
|
45
|
-
|
|
46
|
-
## Configuração
|
|
47
|
-
|
|
48
|
-
```yaml
|
|
49
|
-
# dare.config.yml
|
|
50
|
-
telemetry:
|
|
51
|
-
skills:
|
|
52
|
-
- dare-ax
|
|
53
|
-
- dare-layered-design
|
|
54
|
-
- dare-llm-integration
|
|
55
|
-
- dare-frontend-design
|
|
56
|
-
- dare-realtime
|
|
57
|
-
output: tmp/dare_metrics.json
|
|
58
|
-
baseline: tmp/dare_metrics_baseline.json
|
|
59
|
-
fail_on_regression: true
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## Schema do snapshot
|
|
63
|
-
|
|
64
|
-
```json
|
|
65
|
-
{
|
|
66
|
-
"timestamp": "2026-05-26T10:30:00Z",
|
|
67
|
-
"commit": "1d4a1417",
|
|
68
|
-
"branch": "main",
|
|
69
|
-
"skills": {
|
|
70
|
-
"dare-ax": {
|
|
71
|
-
"M-01": { "value": 1.0, "status": "PASS" },
|
|
72
|
-
"M-04": { "value": 1.0, "status": "PASS" }
|
|
73
|
-
},
|
|
74
|
-
"dare-layered-design": {
|
|
75
|
-
"M-01": { "value": 0.95, "status": "PASS" }
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## Detecção de regressão
|
|
82
|
-
|
|
83
|
-
| Mudança | Severidade | Ação |
|
|
84
|
-
|---|---|---|
|
|
85
|
-
| value caiu ≥ 5% | CRITICAL | bloquear PR |
|
|
86
|
-
| value caiu < 5% mas ≥ 1% | WARNING | comentar no PR |
|
|
87
|
-
| value subiu | INFO | celebrar |
|
|
88
|
-
| value igual | NEUTRAL | nenhuma |
|
|
89
|
-
|
|
90
|
-
## O que fazer
|
|
91
|
-
|
|
92
|
-
### Passo 1: Instalar
|
|
93
|
-
|
|
94
|
-
```bash
|
|
95
|
-
pnpm add @dare/quality-telemetry
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Passo 2: Configurar `dare.config.yml`
|
|
99
|
-
|
|
100
|
-
Listar as skills filhas a rastrear.
|
|
101
|
-
|
|
102
|
-
### Passo 3: Rodar collect
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
dare metrics collect
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### Passo 4: Capturar baseline
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
dare metrics baseline
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Geralmente capturado uma vez por release tag, não a cada commit.
|
|
115
|
-
|
|
116
|
-
### Passo 5: Workflow CI
|
|
117
|
-
|
|
118
|
-
```yaml
|
|
119
|
-
# .github/workflows/dare-metrics.yml
|
|
120
|
-
name: DARE Metrics
|
|
121
|
-
on: [push, pull_request]
|
|
122
|
-
jobs:
|
|
123
|
-
metrics:
|
|
124
|
-
runs-on: ubuntu-latest
|
|
125
|
-
steps:
|
|
126
|
-
- uses: actions/checkout@v4
|
|
127
|
-
- uses: actions/setup-node@v4
|
|
128
|
-
with: { node-version: '20' }
|
|
129
|
-
- run: pnpm install
|
|
130
|
-
- run: pnpm dare metrics collect
|
|
131
|
-
- run: pnpm dare metrics compare
|
|
132
|
-
- uses: actions/upload-artifact@v4
|
|
133
|
-
with:
|
|
134
|
-
name: dare-metrics
|
|
135
|
-
path: tmp/dare_metrics*.json
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## Antipatterns
|
|
139
|
-
|
|
140
|
-
| AP | Antipattern | Por quê |
|
|
141
|
-
|---|---|---|
|
|
142
|
-
| AP-01 | Métricas sem baseline | Não detecta regressão |
|
|
143
|
-
| AP-02 | Histórico não versionado | Perde contexto |
|
|
144
|
-
| AP-03 | Coletar mas não bloquear | CI vira teatro |
|
|
145
|
-
| AP-04 | Baseline desatualizado | Regressão real fica invisível |
|
|
146
|
-
|
|
147
|
-
## Boas práticas
|
|
148
|
-
|
|
149
|
-
1. **Baseline por release**, não por commit
|
|
150
|
-
2. **Regressão = bloqueio**, não comentário ignorável
|
|
151
|
-
3. **Exportar para Datadog/Grafana** após N coletas
|
|
152
|
-
4. **Collectors paralelos** — skill deve rodar em < 60s
|
|
153
|
-
|
|
154
|
-
## Saída esperada
|
|
155
|
-
|
|
156
|
-
Reporte markdown com:
|
|
157
|
-
- Tabela por skill com M-01 a M-04
|
|
158
|
-
- Comparação contra baseline (delta por métrica)
|
|
159
|
-
- Status final: PASS / WARNING / CRITICAL
|
|
160
|
-
- Link para snapshot completo em `tmp/dare_metrics.json`
|
|
161
|
-
|
|
162
|
-
$ARGUMENTS
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
Skill MIT — parte do DARE Method.
|
|
1
|
+
# /dare-quality-telemetry
|
|
2
|
+
|
|
3
|
+
Coleta métricas das skills DARE (ax, layered-design, llm-integration, frontend, realtime…), persiste histórico em `tmp/dare_metrics.json` e detecta regressões contra baseline.
|
|
4
|
+
|
|
5
|
+
## Como usar
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/dare-quality-telemetry collect # roda todos os collectors
|
|
9
|
+
/dare-quality-telemetry baseline # captura baseline atual
|
|
10
|
+
/dare-quality-telemetry compare # compara contra baseline (CI)
|
|
11
|
+
/dare-quality-telemetry report # gera markdown report
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## O que faz
|
|
15
|
+
|
|
16
|
+
1. Roda collectors das skills configuradas em paralelo
|
|
17
|
+
2. Agrega em um snapshot
|
|
18
|
+
3. Persiste em `tmp/dare_metrics.json`
|
|
19
|
+
4. Compara com `tmp/dare_metrics_baseline.json`
|
|
20
|
+
5. Reporta em markdown / JSON
|
|
21
|
+
6. Exit code ≠ 0 se regressão crítica
|
|
22
|
+
|
|
23
|
+
## Arquitetura
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
collect.ts
|
|
27
|
+
↓ chama em paralelo
|
|
28
|
+
[ax collector] [layered coll.] [llm coll.] [frontend coll.] [realtime coll.]
|
|
29
|
+
↓
|
|
30
|
+
Aggregator → snapshot { skill: { M-01: value, ... } }
|
|
31
|
+
↓
|
|
32
|
+
tmp/dare_metrics.json + Regression detector
|
|
33
|
+
↓
|
|
34
|
+
Reporter → markdown / JSON / GH Actions summary
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Métricas obrigatórias
|
|
38
|
+
|
|
39
|
+
| ID | Métrica |
|
|
40
|
+
|---|---|
|
|
41
|
+
| M-01 | 100% dos builds incluem coleta (skill instalada = true) |
|
|
42
|
+
| M-02 | 0 regressões passam despercebidas (baseline existe) |
|
|
43
|
+
| M-03 | Histórico mantido em `tmp/dare_metrics.json` |
|
|
44
|
+
| M-04 | Workflow `.github/workflows/dare-metrics.yml` existe |
|
|
45
|
+
|
|
46
|
+
## Configuração
|
|
47
|
+
|
|
48
|
+
```yaml
|
|
49
|
+
# dare.config.yml
|
|
50
|
+
telemetry:
|
|
51
|
+
skills:
|
|
52
|
+
- dare-ax
|
|
53
|
+
- dare-layered-design
|
|
54
|
+
- dare-llm-integration
|
|
55
|
+
- dare-frontend-design
|
|
56
|
+
- dare-realtime
|
|
57
|
+
output: tmp/dare_metrics.json
|
|
58
|
+
baseline: tmp/dare_metrics_baseline.json
|
|
59
|
+
fail_on_regression: true
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Schema do snapshot
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"timestamp": "2026-05-26T10:30:00Z",
|
|
67
|
+
"commit": "1d4a1417",
|
|
68
|
+
"branch": "main",
|
|
69
|
+
"skills": {
|
|
70
|
+
"dare-ax": {
|
|
71
|
+
"M-01": { "value": 1.0, "status": "PASS" },
|
|
72
|
+
"M-04": { "value": 1.0, "status": "PASS" }
|
|
73
|
+
},
|
|
74
|
+
"dare-layered-design": {
|
|
75
|
+
"M-01": { "value": 0.95, "status": "PASS" }
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Detecção de regressão
|
|
82
|
+
|
|
83
|
+
| Mudança | Severidade | Ação |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| value caiu ≥ 5% | CRITICAL | bloquear PR |
|
|
86
|
+
| value caiu < 5% mas ≥ 1% | WARNING | comentar no PR |
|
|
87
|
+
| value subiu | INFO | celebrar |
|
|
88
|
+
| value igual | NEUTRAL | nenhuma |
|
|
89
|
+
|
|
90
|
+
## O que fazer
|
|
91
|
+
|
|
92
|
+
### Passo 1: Instalar
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
pnpm add @dare/quality-telemetry
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Passo 2: Configurar `dare.config.yml`
|
|
99
|
+
|
|
100
|
+
Listar as skills filhas a rastrear.
|
|
101
|
+
|
|
102
|
+
### Passo 3: Rodar collect
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
dare metrics collect
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Passo 4: Capturar baseline
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
dare metrics baseline
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Geralmente capturado uma vez por release tag, não a cada commit.
|
|
115
|
+
|
|
116
|
+
### Passo 5: Workflow CI
|
|
117
|
+
|
|
118
|
+
```yaml
|
|
119
|
+
# .github/workflows/dare-metrics.yml
|
|
120
|
+
name: DARE Metrics
|
|
121
|
+
on: [push, pull_request]
|
|
122
|
+
jobs:
|
|
123
|
+
metrics:
|
|
124
|
+
runs-on: ubuntu-latest
|
|
125
|
+
steps:
|
|
126
|
+
- uses: actions/checkout@v4
|
|
127
|
+
- uses: actions/setup-node@v4
|
|
128
|
+
with: { node-version: '20' }
|
|
129
|
+
- run: pnpm install
|
|
130
|
+
- run: pnpm dare metrics collect
|
|
131
|
+
- run: pnpm dare metrics compare
|
|
132
|
+
- uses: actions/upload-artifact@v4
|
|
133
|
+
with:
|
|
134
|
+
name: dare-metrics
|
|
135
|
+
path: tmp/dare_metrics*.json
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Antipatterns
|
|
139
|
+
|
|
140
|
+
| AP | Antipattern | Por quê |
|
|
141
|
+
|---|---|---|
|
|
142
|
+
| AP-01 | Métricas sem baseline | Não detecta regressão |
|
|
143
|
+
| AP-02 | Histórico não versionado | Perde contexto |
|
|
144
|
+
| AP-03 | Coletar mas não bloquear | CI vira teatro |
|
|
145
|
+
| AP-04 | Baseline desatualizado | Regressão real fica invisível |
|
|
146
|
+
|
|
147
|
+
## Boas práticas
|
|
148
|
+
|
|
149
|
+
1. **Baseline por release**, não por commit
|
|
150
|
+
2. **Regressão = bloqueio**, não comentário ignorável
|
|
151
|
+
3. **Exportar para Datadog/Grafana** após N coletas
|
|
152
|
+
4. **Collectors paralelos** — skill deve rodar em < 60s
|
|
153
|
+
|
|
154
|
+
## Saída esperada
|
|
155
|
+
|
|
156
|
+
Reporte markdown com:
|
|
157
|
+
- Tabela por skill com M-01 a M-04
|
|
158
|
+
- Comparação contra baseline (delta por métrica)
|
|
159
|
+
- Status final: PASS / WARNING / CRITICAL
|
|
160
|
+
- Link para snapshot completo em `tmp/dare_metrics.json`
|
|
161
|
+
|
|
162
|
+
$ARGUMENTS
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
Skill MIT — parte do DARE Method.
|
|
@@ -1,159 +1,159 @@
|
|
|
1
|
-
# /dare-realtime
|
|
2
|
-
|
|
3
|
-
Comunicação real-time (WebSocket, SSE) DARE-compliant — eventos tipados, subscriptions autorizadas, reconexão com backoff, zero ghost listeners.
|
|
4
|
-
|
|
5
|
-
## Como usar
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
/dare-realtime # audita uso de WS/SSE no projeto
|
|
9
|
-
/dare-realtime scaffold ws # gera event registry + subscription manager + reconnect
|
|
10
|
-
/dare-realtime audit ghosts # detecta listeners sem cleanup
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Os 4 pilares
|
|
14
|
-
|
|
15
|
-
### 1. Schema validation de eventos
|
|
16
|
-
|
|
17
|
-
Todo evento WS/SSE tem schema JSON. Server valida antes de emitir, client valida antes de processar.
|
|
18
|
-
|
|
19
|
-
### 2. Registro central de tipos
|
|
20
|
-
|
|
21
|
-
Um único `event_registry.ts` lista todos os event types com versão (`.v1`, `.v2`).
|
|
22
|
-
|
|
23
|
-
### 3. Reconexão com exponential backoff
|
|
24
|
-
|
|
25
|
-
```typescript
|
|
26
|
-
class ReconnectStrategy {
|
|
27
|
-
private attempt = 0;
|
|
28
|
-
next(): number {
|
|
29
|
-
const base = Math.min(1000 * 2 ** this.attempt, 30_000);
|
|
30
|
-
return base + Math.random() * 1000; // jitter
|
|
31
|
-
}
|
|
32
|
-
reset() { this.attempt = 0; }
|
|
33
|
-
}
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### 4. Subscription manager (zero ghost listeners)
|
|
37
|
-
|
|
38
|
-
Map de subscriptions com cleanup automático on disconnect.
|
|
39
|
-
|
|
40
|
-
## Métricas obrigatórias
|
|
41
|
-
|
|
42
|
-
| ID | Métrica |
|
|
43
|
-
|---|---|
|
|
44
|
-
| M-01 | 100% de event types com JSON Schema |
|
|
45
|
-
| M-02 | 100% de subscriptions autorizadas |
|
|
46
|
-
| M-03 | 0 ghost listeners após desconexão |
|
|
47
|
-
| M-04 | Estratégia de reconexão configurada |
|
|
48
|
-
|
|
49
|
-
## Antipatterns
|
|
50
|
-
|
|
51
|
-
| AP | Antipattern | Correção |
|
|
52
|
-
|---|---|---|
|
|
53
|
-
| AP-01 | Evento sem schema | Adicionar no registry |
|
|
54
|
-
| AP-02 | `socket.on()` sem cleanup | SubscriptionManager |
|
|
55
|
-
| AP-03 | Reconexão sem backoff | Exponential + jitter |
|
|
56
|
-
| AP-04 | Sem autorização de subscription | `authorize()` antes de `subscribe()` |
|
|
57
|
-
| AP-05 | Broadcast sem filtro | Rooms por tenant |
|
|
58
|
-
| AP-06 | Estado stale após reconectar | Resync via REST/snapshot |
|
|
59
|
-
|
|
60
|
-
## O que fazer
|
|
61
|
-
|
|
62
|
-
### Passo 1: Event Registry
|
|
63
|
-
|
|
64
|
-
```typescript
|
|
65
|
-
export const EventRegistry = {
|
|
66
|
-
'user.created.v1': { schema: UserCreatedSchema, requires: 'admin' },
|
|
67
|
-
'message.sent.v1': { schema: MessageSentSchema, requires: 'participant' },
|
|
68
|
-
};
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Passo 2: Subscription Manager
|
|
72
|
-
|
|
73
|
-
```typescript
|
|
74
|
-
class SubscriptionManager {
|
|
75
|
-
private subs = new Map<string, Set<string>>();
|
|
76
|
-
|
|
77
|
-
subscribe(connId: string, event: string) {
|
|
78
|
-
if (!this.subs.has(connId)) this.subs.set(connId, new Set());
|
|
79
|
-
this.subs.get(connId)!.add(event);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
onDisconnect(connId: string) {
|
|
83
|
-
this.subs.delete(connId); // cleanup SEMPRE
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### Passo 3: Reconnect com backoff
|
|
89
|
-
|
|
90
|
-
```typescript
|
|
91
|
-
const strategy = new ReconnectStrategy();
|
|
92
|
-
socket.on('disconnect', () => {
|
|
93
|
-
setTimeout(() => socket.connect(), strategy.next());
|
|
94
|
-
});
|
|
95
|
-
socket.on('connect', () => {
|
|
96
|
-
strategy.reset();
|
|
97
|
-
resyncState(); // buscar eventos perdidos via REST
|
|
98
|
-
});
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### Passo 4: Autorização por subscription
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
socket.on('subscribe', (eventType) => {
|
|
105
|
-
if (!authorize(socket.user, eventType)) {
|
|
106
|
-
return socket.emit('error', { code: 'FORBIDDEN' });
|
|
107
|
-
}
|
|
108
|
-
subscriptionManager.subscribe(socket.id, eventType);
|
|
109
|
-
});
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Passo 5: Validação no server e client
|
|
113
|
-
|
|
114
|
-
```typescript
|
|
115
|
-
// Server antes de emitir
|
|
116
|
-
const valid = EventRegistry[eventType].schema.safeParse(payload);
|
|
117
|
-
if (!valid.success) return log.error('invalid event', valid.error);
|
|
118
|
-
io.to(room).emit(eventType, valid.data);
|
|
119
|
-
|
|
120
|
-
// Client antes de processar
|
|
121
|
-
socket.on(eventType, (payload) => {
|
|
122
|
-
const valid = EventRegistry[eventType].schema.safeParse(payload);
|
|
123
|
-
if (!valid.success) return log.warn('invalid event received');
|
|
124
|
-
handleEvent(valid.data);
|
|
125
|
-
});
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## Stack recomendada
|
|
129
|
-
|
|
130
|
-
| Stack | WebSocket | SSE |
|
|
131
|
-
|---|---|---|
|
|
132
|
-
| Node | `socket.io`, `ws` | `eventsource` + endpoint custom |
|
|
133
|
-
| Rails | Action Cable | Rack streaming |
|
|
134
|
-
| Rust/Axum | `tokio-tungstenite` | `axum::sse::Sse` |
|
|
135
|
-
| FastAPI | `fastapi.WebSocket` | `EventSourceResponse` |
|
|
136
|
-
| Go | `gorilla/websocket` | stdlib `http.Flusher` |
|
|
137
|
-
|
|
138
|
-
## Boas práticas
|
|
139
|
-
|
|
140
|
-
1. **SSE para server→client unidirecional** (logs, métricas)
|
|
141
|
-
2. **WS para bidirectional** (chat, colaboração)
|
|
142
|
-
3. **Rooms/channels por tenant** — evita cross-tenant
|
|
143
|
-
4. **Heartbeat ping-pong** — detectar conexão zumbi
|
|
144
|
-
5. **Backpressure** — drop eventos antigos se client lento
|
|
145
|
-
6. **Replay limitado** — últimos N eventos por room para reconexão recente
|
|
146
|
-
|
|
147
|
-
## Saída esperada
|
|
148
|
-
|
|
149
|
-
Reporte:
|
|
150
|
-
- Lista de event types e seus schemas (ou falta de)
|
|
151
|
-
- Subscriptions sem autorização
|
|
152
|
-
- Listeners sem cleanup (grep `socket.on` sem `removeListener` ou cleanup)
|
|
153
|
-
- Stack escolhida e configuração de reconnect
|
|
154
|
-
|
|
155
|
-
$ARGUMENTS
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
Skill MIT — parte do DARE Method.
|
|
1
|
+
# /dare-realtime
|
|
2
|
+
|
|
3
|
+
Comunicação real-time (WebSocket, SSE) DARE-compliant — eventos tipados, subscriptions autorizadas, reconexão com backoff, zero ghost listeners.
|
|
4
|
+
|
|
5
|
+
## Como usar
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/dare-realtime # audita uso de WS/SSE no projeto
|
|
9
|
+
/dare-realtime scaffold ws # gera event registry + subscription manager + reconnect
|
|
10
|
+
/dare-realtime audit ghosts # detecta listeners sem cleanup
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Os 4 pilares
|
|
14
|
+
|
|
15
|
+
### 1. Schema validation de eventos
|
|
16
|
+
|
|
17
|
+
Todo evento WS/SSE tem schema JSON. Server valida antes de emitir, client valida antes de processar.
|
|
18
|
+
|
|
19
|
+
### 2. Registro central de tipos
|
|
20
|
+
|
|
21
|
+
Um único `event_registry.ts` lista todos os event types com versão (`.v1`, `.v2`).
|
|
22
|
+
|
|
23
|
+
### 3. Reconexão com exponential backoff
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
class ReconnectStrategy {
|
|
27
|
+
private attempt = 0;
|
|
28
|
+
next(): number {
|
|
29
|
+
const base = Math.min(1000 * 2 ** this.attempt, 30_000);
|
|
30
|
+
return base + Math.random() * 1000; // jitter
|
|
31
|
+
}
|
|
32
|
+
reset() { this.attempt = 0; }
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 4. Subscription manager (zero ghost listeners)
|
|
37
|
+
|
|
38
|
+
Map de subscriptions com cleanup automático on disconnect.
|
|
39
|
+
|
|
40
|
+
## Métricas obrigatórias
|
|
41
|
+
|
|
42
|
+
| ID | Métrica |
|
|
43
|
+
|---|---|
|
|
44
|
+
| M-01 | 100% de event types com JSON Schema |
|
|
45
|
+
| M-02 | 100% de subscriptions autorizadas |
|
|
46
|
+
| M-03 | 0 ghost listeners após desconexão |
|
|
47
|
+
| M-04 | Estratégia de reconexão configurada |
|
|
48
|
+
|
|
49
|
+
## Antipatterns
|
|
50
|
+
|
|
51
|
+
| AP | Antipattern | Correção |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| AP-01 | Evento sem schema | Adicionar no registry |
|
|
54
|
+
| AP-02 | `socket.on()` sem cleanup | SubscriptionManager |
|
|
55
|
+
| AP-03 | Reconexão sem backoff | Exponential + jitter |
|
|
56
|
+
| AP-04 | Sem autorização de subscription | `authorize()` antes de `subscribe()` |
|
|
57
|
+
| AP-05 | Broadcast sem filtro | Rooms por tenant |
|
|
58
|
+
| AP-06 | Estado stale após reconectar | Resync via REST/snapshot |
|
|
59
|
+
|
|
60
|
+
## O que fazer
|
|
61
|
+
|
|
62
|
+
### Passo 1: Event Registry
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
export const EventRegistry = {
|
|
66
|
+
'user.created.v1': { schema: UserCreatedSchema, requires: 'admin' },
|
|
67
|
+
'message.sent.v1': { schema: MessageSentSchema, requires: 'participant' },
|
|
68
|
+
};
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Passo 2: Subscription Manager
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
class SubscriptionManager {
|
|
75
|
+
private subs = new Map<string, Set<string>>();
|
|
76
|
+
|
|
77
|
+
subscribe(connId: string, event: string) {
|
|
78
|
+
if (!this.subs.has(connId)) this.subs.set(connId, new Set());
|
|
79
|
+
this.subs.get(connId)!.add(event);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
onDisconnect(connId: string) {
|
|
83
|
+
this.subs.delete(connId); // cleanup SEMPRE
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Passo 3: Reconnect com backoff
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
const strategy = new ReconnectStrategy();
|
|
92
|
+
socket.on('disconnect', () => {
|
|
93
|
+
setTimeout(() => socket.connect(), strategy.next());
|
|
94
|
+
});
|
|
95
|
+
socket.on('connect', () => {
|
|
96
|
+
strategy.reset();
|
|
97
|
+
resyncState(); // buscar eventos perdidos via REST
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Passo 4: Autorização por subscription
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
socket.on('subscribe', (eventType) => {
|
|
105
|
+
if (!authorize(socket.user, eventType)) {
|
|
106
|
+
return socket.emit('error', { code: 'FORBIDDEN' });
|
|
107
|
+
}
|
|
108
|
+
subscriptionManager.subscribe(socket.id, eventType);
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Passo 5: Validação no server e client
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// Server antes de emitir
|
|
116
|
+
const valid = EventRegistry[eventType].schema.safeParse(payload);
|
|
117
|
+
if (!valid.success) return log.error('invalid event', valid.error);
|
|
118
|
+
io.to(room).emit(eventType, valid.data);
|
|
119
|
+
|
|
120
|
+
// Client antes de processar
|
|
121
|
+
socket.on(eventType, (payload) => {
|
|
122
|
+
const valid = EventRegistry[eventType].schema.safeParse(payload);
|
|
123
|
+
if (!valid.success) return log.warn('invalid event received');
|
|
124
|
+
handleEvent(valid.data);
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Stack recomendada
|
|
129
|
+
|
|
130
|
+
| Stack | WebSocket | SSE |
|
|
131
|
+
|---|---|---|
|
|
132
|
+
| Node | `socket.io`, `ws` | `eventsource` + endpoint custom |
|
|
133
|
+
| Rails | Action Cable | Rack streaming |
|
|
134
|
+
| Rust/Axum | `tokio-tungstenite` | `axum::sse::Sse` |
|
|
135
|
+
| FastAPI | `fastapi.WebSocket` | `EventSourceResponse` |
|
|
136
|
+
| Go | `gorilla/websocket` | stdlib `http.Flusher` |
|
|
137
|
+
|
|
138
|
+
## Boas práticas
|
|
139
|
+
|
|
140
|
+
1. **SSE para server→client unidirecional** (logs, métricas)
|
|
141
|
+
2. **WS para bidirectional** (chat, colaboração)
|
|
142
|
+
3. **Rooms/channels por tenant** — evita cross-tenant
|
|
143
|
+
4. **Heartbeat ping-pong** — detectar conexão zumbi
|
|
144
|
+
5. **Backpressure** — drop eventos antigos se client lento
|
|
145
|
+
6. **Replay limitado** — últimos N eventos por room para reconexão recente
|
|
146
|
+
|
|
147
|
+
## Saída esperada
|
|
148
|
+
|
|
149
|
+
Reporte:
|
|
150
|
+
- Lista de event types e seus schemas (ou falta de)
|
|
151
|
+
- Subscriptions sem autorização
|
|
152
|
+
- Listeners sem cleanup (grep `socket.on` sem `removeListener` ou cleanup)
|
|
153
|
+
- Stack escolhida e configuração de reconnect
|
|
154
|
+
|
|
155
|
+
$ARGUMENTS
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
Skill MIT — parte do DARE Method.
|