@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,217 +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.
|
|
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.
|
|
@@ -1,61 +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`.
|
|
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`.
|