@dewtech/dare-cli 2.17.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -3
- package/dist/__tests__/confidence.test.d.ts +2 -0
- package/dist/__tests__/confidence.test.d.ts.map +1 -0
- package/dist/__tests__/confidence.test.js +73 -0
- package/dist/__tests__/confidence.test.js.map +1 -0
- package/dist/__tests__/datamodel.test.d.ts +2 -0
- package/dist/__tests__/datamodel.test.d.ts.map +1 -0
- package/dist/__tests__/datamodel.test.js +131 -0
- package/dist/__tests__/datamodel.test.js.map +1 -0
- package/dist/__tests__/dna-detector.test.d.ts +2 -0
- package/dist/__tests__/dna-detector.test.d.ts.map +1 -0
- package/dist/__tests__/dna-detector.test.js +97 -0
- package/dist/__tests__/dna-detector.test.js.map +1 -0
- package/dist/__tests__/dna-facts.test.d.ts +2 -0
- package/dist/__tests__/dna-facts.test.d.ts.map +1 -0
- package/dist/__tests__/dna-facts.test.js +44 -0
- package/dist/__tests__/dna-facts.test.js.map +1 -0
- package/dist/__tests__/graph-renderer.test.d.ts +2 -0
- package/dist/__tests__/graph-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/graph-renderer.test.js +85 -0
- package/dist/__tests__/graph-renderer.test.js.map +1 -0
- package/dist/__tests__/migration.test.d.ts +2 -0
- package/dist/__tests__/migration.test.d.ts.map +1 -0
- package/dist/__tests__/migration.test.js +77 -0
- package/dist/__tests__/migration.test.js.map +1 -0
- package/dist/__tests__/module-detector.test.d.ts +2 -0
- package/dist/__tests__/module-detector.test.d.ts.map +1 -0
- package/dist/__tests__/module-detector.test.js +83 -0
- package/dist/__tests__/module-detector.test.js.map +1 -0
- package/dist/__tests__/refine.test.js +49 -49
- package/dist/__tests__/reverse-facts.test.d.ts +2 -0
- package/dist/__tests__/reverse-facts.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-facts.test.js +78 -0
- package/dist/__tests__/reverse-facts.test.js.map +1 -0
- package/dist/__tests__/review.test.js +38 -38
- package/dist/__tests__/validate.test.js +65 -65
- package/dist/bin/dare.js +32 -3
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/blueprint.js +122 -122
- package/dist/commands/dag.d.ts.map +1 -1
- package/dist/commands/dag.js +43 -79
- package/dist/commands/dag.js.map +1 -1
- package/dist/commands/dna.d.ts +3 -0
- package/dist/commands/dna.d.ts.map +1 -0
- package/dist/commands/dna.js +69 -0
- package/dist/commands/dna.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +101 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +16 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +103 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/reverse.d.ts +3 -0
- package/dist/commands/reverse.d.ts.map +1 -0
- package/dist/commands/reverse.js +201 -0
- package/dist/commands/reverse.js.map +1 -0
- package/dist/commands/welcome.d.ts +14 -0
- package/dist/commands/welcome.d.ts.map +1 -0
- package/dist/commands/welcome.js +29 -0
- package/dist/commands/welcome.js.map +1 -0
- package/dist/skills/commands/add.d.ts +23 -0
- package/dist/skills/commands/add.d.ts.map +1 -0
- package/dist/skills/commands/add.js +206 -0
- package/dist/skills/commands/add.js.map +1 -0
- package/dist/skills/commands/info.d.ts +14 -0
- package/dist/skills/commands/info.d.ts.map +1 -0
- package/dist/skills/commands/info.js +99 -0
- package/dist/skills/commands/info.js.map +1 -0
- package/dist/skills/commands/list.d.ts +19 -0
- package/dist/skills/commands/list.d.ts.map +1 -0
- package/dist/skills/commands/list.js +163 -0
- package/dist/skills/commands/list.js.map +1 -0
- package/dist/skills/commands/publish.d.ts +56 -0
- package/dist/skills/commands/publish.d.ts.map +1 -0
- package/dist/skills/commands/publish.js +272 -0
- package/dist/skills/commands/publish.js.map +1 -0
- package/dist/skills/commands/remove.d.ts +19 -0
- package/dist/skills/commands/remove.d.ts.map +1 -0
- package/dist/skills/commands/remove.js +96 -0
- package/dist/skills/commands/remove.js.map +1 -0
- package/dist/skills/commands/update.d.ts +31 -0
- package/dist/skills/commands/update.d.ts.map +1 -0
- package/dist/skills/commands/update.js +132 -0
- package/dist/skills/commands/update.js.map +1 -0
- package/dist/skills/index.d.ts +22 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +33 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/manifest.d.ts +54 -0
- package/dist/skills/manifest.d.ts.map +1 -0
- package/dist/skills/manifest.js +162 -0
- package/dist/skills/manifest.js.map +1 -0
- package/dist/skills/registry-local.d.ts +67 -0
- package/dist/skills/registry-local.d.ts.map +1 -0
- package/dist/skills/registry-local.js +130 -0
- package/dist/skills/registry-local.js.map +1 -0
- package/dist/skills/registry-mock.json +109 -0
- package/dist/skills/registry-remote.d.ts +110 -0
- package/dist/skills/registry-remote.d.ts.map +1 -0
- package/dist/skills/registry-remote.js +246 -0
- package/dist/skills/registry-remote.js.map +1 -0
- package/dist/skills/registry.d.ts +49 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +94 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/tests/manifest.spec.d.ts +8 -0
- package/dist/skills/tests/manifest.spec.d.ts.map +1 -0
- package/dist/skills/tests/manifest.spec.js +176 -0
- package/dist/skills/tests/manifest.spec.js.map +1 -0
- package/dist/skills/tests/publish.spec.d.ts +12 -0
- package/dist/skills/tests/publish.spec.d.ts.map +1 -0
- package/dist/skills/tests/publish.spec.js +276 -0
- package/dist/skills/tests/publish.spec.js.map +1 -0
- package/dist/skills/tests/registry-local.spec.d.ts +8 -0
- package/dist/skills/tests/registry-local.spec.d.ts.map +1 -0
- package/dist/skills/tests/registry-local.spec.js +231 -0
- package/dist/skills/tests/registry-local.spec.js.map +1 -0
- package/dist/skills/tests/registry.spec.d.ts +7 -0
- package/dist/skills/tests/registry.spec.d.ts.map +1 -0
- package/dist/skills/tests/registry.spec.js +58 -0
- package/dist/skills/tests/registry.spec.js.map +1 -0
- package/dist/skills/tests/remote-registry.spec.d.ts +9 -0
- package/dist/skills/tests/remote-registry.spec.d.ts.map +1 -0
- package/dist/skills/tests/remote-registry.spec.js +357 -0
- package/dist/skills/tests/remote-registry.spec.js.map +1 -0
- package/dist/skills/tests/update.spec.d.ts +9 -0
- package/dist/skills/tests/update.spec.d.ts.map +1 -0
- package/dist/skills/tests/update.spec.js +166 -0
- package/dist/skills/tests/update.spec.js.map +1 -0
- package/dist/utils/banner.d.ts +28 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +77 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/banner.spec.d.ts +5 -0
- package/dist/utils/banner.spec.d.ts.map +1 -0
- package/dist/utils/banner.spec.js +253 -0
- package/dist/utils/banner.spec.js.map +1 -0
- package/dist/utils/confidence.d.ts +41 -0
- package/dist/utils/confidence.d.ts.map +1 -0
- package/dist/utils/confidence.js +101 -0
- package/dist/utils/confidence.js.map +1 -0
- package/dist/utils/datamodel.d.ts +41 -0
- package/dist/utils/datamodel.d.ts.map +1 -0
- package/dist/utils/datamodel.js +535 -0
- package/dist/utils/datamodel.js.map +1 -0
- package/dist/utils/dna-detector.d.ts +61 -0
- package/dist/utils/dna-detector.d.ts.map +1 -0
- package/dist/utils/dna-detector.js +354 -0
- package/dist/utils/dna-detector.js.map +1 -0
- package/dist/utils/dna-facts.d.ts +13 -0
- package/dist/utils/dna-facts.d.ts.map +1 -0
- package/dist/utils/dna-facts.js +109 -0
- package/dist/utils/dna-facts.js.map +1 -0
- package/dist/utils/excalidraw-renderer.d.ts +11 -71
- package/dist/utils/excalidraw-renderer.d.ts.map +1 -1
- package/dist/utils/excalidraw-renderer.js +29 -162
- package/dist/utils/excalidraw-renderer.js.map +1 -1
- package/dist/utils/graph-renderer.d.ts +115 -0
- package/dist/utils/graph-renderer.d.ts.map +1 -0
- package/dist/utils/graph-renderer.js +216 -0
- package/dist/utils/graph-renderer.js.map +1 -0
- package/dist/utils/migration.d.ts +64 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +183 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/module-detector.d.ts +46 -0
- package/dist/utils/module-detector.d.ts.map +1 -0
- package/dist/utils/module-detector.js +348 -0
- package/dist/utils/module-detector.js.map +1 -0
- package/dist/utils/project-generator.js +252 -252
- package/dist/utils/reverse-facts.d.ts +50 -0
- package/dist/utils/reverse-facts.d.ts.map +1 -0
- package/dist/utils/reverse-facts.js +291 -0
- package/dist/utils/reverse-facts.js.map +1 -0
- package/dist/utils/stack-bootstrap.js +371 -371
- package/package.json +8 -3
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +48 -48
- package/templates/backend/node-nestjs/.env.example +9 -9
- package/templates/backend/node-nestjs/nest-cli.json +8 -8
- package/templates/backend/node-nestjs/package.json +50 -50
- package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
- package/templates/backend/node-nestjs/src/app.module.ts +15 -15
- package/templates/backend/node-nestjs/src/app.service.ts +8 -8
- package/templates/backend/node-nestjs/src/main.ts +24 -24
- package/templates/backend/node-nestjs/tsconfig.json +21 -21
- package/templates/backend/php-laravel/.env.example +22 -22
- package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
- package/templates/backend/php-laravel/composer.json +40 -40
- package/templates/backend/python-fastapi/.env.example +4 -4
- package/templates/backend/python-fastapi/app/api/router.py +8 -8
- package/templates/backend/python-fastapi/app/core/config.py +20 -20
- package/templates/backend/python-fastapi/main.py +35 -35
- package/templates/backend/python-fastapi/requirements.txt +13 -13
- package/templates/backend/rust-axum/.env.example +3 -3
- package/templates/backend/rust-axum/Cargo.toml +23 -23
- package/templates/backend/rust-axum/src/errors.rs +30 -30
- package/templates/backend/rust-axum/src/main.rs +32 -32
- package/templates/backend/rust-axum/src/routes.rs +6 -6
- package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
- package/templates/frontend/leptos-csr/Cargo.toml +16 -16
- package/templates/frontend/leptos-csr/Trunk.toml +10 -10
- package/templates/frontend/leptos-csr/index.html +11 -11
- package/templates/frontend/leptos-csr/src/lib.rs +20 -20
- package/templates/frontend/leptos-csr/style/main.scss +19 -19
- package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
- package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
- package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
- package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
- package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
- package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
- package/templates/frontend/react/index.html +12 -12
- package/templates/frontend/react/package.json +35 -35
- package/templates/frontend/react/src/App.tsx +25 -25
- package/templates/frontend/react/src/main.tsx +9 -9
- package/templates/frontend/vue/package.json +32 -32
- package/templates/frontend/vue/src/App.vue +7 -7
- package/templates/frontend/vue/src/main.ts +10 -10
- package/templates/frontend/vue/src/router/index.ts +14 -14
- package/templates/frontend/vue/src/views/HomeView.vue +6 -6
- package/templates/hooks/pre-commit-dare-validate +24 -24
- package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
- package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -0
- package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -0
- package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -0
- package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -0
- package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -0
- package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -0
- package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -0
- package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -0
- package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -0
- package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
- package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -0
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
- package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -0
- package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
- package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -0
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
- package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -0
- package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -0
- package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -0
- package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -0
- package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -0
- package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -0
- package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
- package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/claude/.claude/commands/dare-ax.md +131 -0
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
- package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -0
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
- package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -0
- package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
- package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
- package/templates/ide/claude/.claude/commands/dare-dna.md +75 -0
- package/templates/ide/claude/.claude/commands/dare-docker.md +207 -0
- package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
- package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -0
- package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -0
- package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -0
- package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -0
- package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -0
- package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -0
- package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -0
- package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -0
- package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
- package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -0
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
- package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
- package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
- package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
- package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
- package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -0
- package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -0
- package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -0
- package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -0
- package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -0
- package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -0
- package/templates/ide/claude/.claude/settings.example.json +35 -35
- package/templates/ide/claude/CLAUDE.md +146 -146
- package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/claude/templates/DESIGN-template.md +129 -129
- package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/cursor/.cursor/commands/dag-viz.md +139 -0
- package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +86 -86
- package/templates/ide/cursor/.cursor/commands/generate-design.md +35 -35
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +184 -184
- package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -107
- package/templates/ide/cursor/.cursor/commands/review-task.md +91 -91
- package/templates/ide/cursor/.cursor/commands/run-dag.md +110 -110
- package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
- package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -0
- package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -0
- package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -0
- package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -0
- package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -0
- package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -0
- package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -0
- package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -0
- package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -0
- package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -0
- package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -0
- package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -0
- package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -0
- package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -0
- package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
- package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
- package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
- package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -141
- package/templates/shared/docker-compose.yml +41 -41
- package/dist/__tests__/dag-runner/adapters.test.d.ts +0 -2
- package/dist/__tests__/dag-runner/adapters.test.d.ts.map +0 -1
- package/dist/__tests__/dag-runner/adapters.test.js +0 -134
- package/dist/__tests__/dag-runner/adapters.test.js.map +0 -1
- package/dist/dag-runner/adapters/antigravity.d.ts +0 -6
- package/dist/dag-runner/adapters/antigravity.d.ts.map +0 -1
- package/dist/dag-runner/adapters/antigravity.js +0 -54
- package/dist/dag-runner/adapters/antigravity.js.map +0 -1
- package/dist/dag-runner/adapters/claude.d.ts +0 -6
- package/dist/dag-runner/adapters/claude.d.ts.map +0 -1
- package/dist/dag-runner/adapters/claude.js +0 -48
- package/dist/dag-runner/adapters/claude.js.map +0 -1
- package/dist/dag-runner/adapters/cursor.d.ts +0 -6
- package/dist/dag-runner/adapters/cursor.d.ts.map +0 -1
- package/dist/dag-runner/adapters/cursor.js +0 -58
- package/dist/dag-runner/adapters/cursor.js.map +0 -1
- package/dist/dag-runner/adapters/index.d.ts +0 -46
- package/dist/dag-runner/adapters/index.d.ts.map +0 -1
- package/dist/dag-runner/adapters/index.js +0 -55
- package/dist/dag-runner/adapters/index.js.map +0 -1
- package/dist/dag-runner/utils/timeout.d.ts +0 -27
- package/dist/dag-runner/utils/timeout.d.ts.map +0 -1
- package/dist/dag-runner/utils/timeout.js +0 -55
- package/dist/dag-runner/utils/timeout.js.map +0 -1
|
@@ -1,232 +1,232 @@
|
|
|
1
|
-
# /dare-security
|
|
2
|
-
|
|
3
|
-
Guia completo de segurança para todas as fases do DARE. Use para: revisar o DESIGN/BLUEPRINT com foco em segurança, implementar controles em uma task específica, ou auditar o projeto existente.
|
|
4
|
-
|
|
5
|
-
## Como usar
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
/dare-security # auditoria geral do projeto
|
|
9
|
-
/dare-security task-005 # revisar segurança de uma task específica
|
|
10
|
-
/dare-security design # revisar DARE/DESIGN.md com lente de segurança
|
|
11
|
-
/dare-security deps # auditar dependências vulneráveis agora
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
## Aplicação por fase
|
|
15
|
-
|
|
16
|
-
### `/dare-security design` — Revisar DESIGN.md
|
|
17
|
-
|
|
18
|
-
Leia `DARE/DESIGN.md` e verifique:
|
|
19
|
-
- [ ] Seção RS-* com requisitos de segurança numerados existe
|
|
20
|
-
- [ ] RS-01 (validação de entrada), RS-02 (hash/criptografia), RS-03 (controle de acesso), RS-04 (auditoria de deps), RS-05 (secrets) presentes
|
|
21
|
-
- [ ] Riscos de segurança identificados com mitigações (SSRF, Injection, Auth bypass...)
|
|
22
|
-
- [ ] Fora do escopo não omite itens de segurança críticos para v1
|
|
23
|
-
|
|
24
|
-
### `/dare-security deps` — Auditar dependências
|
|
25
|
-
|
|
26
|
-
Execute o comando de auditoria da stack do projeto:
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
# Detectar stack automaticamente e rodar
|
|
30
|
-
npm audit --audit-level=high # se package.json presente
|
|
31
|
-
cargo audit # se Cargo.toml presente
|
|
32
|
-
pip-audit # se requirements.txt / pyproject.toml presente
|
|
33
|
-
composer audit # se composer.json presente
|
|
34
|
-
govulncheck ./... # se go.mod presente
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
**Critério:** CVE HIGH ou CRITICAL = reportar ao usuário com versão afetada, CVE ID e versão corrigida disponível. Propor o fix (bump de versão ou substituição de pacote).
|
|
38
|
-
|
|
39
|
-
**Auto-fix quando seguro:**
|
|
40
|
-
```bash
|
|
41
|
-
npm audit fix # Node — corrige sem breaking changes
|
|
42
|
-
cargo update # Rust — bumpa dentro das constraints do Cargo.toml
|
|
43
|
-
pip install --upgrade [pacote] # Python — atualizar pacote específico
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## OWASP Top 10 — Referência Rápida por Stack
|
|
49
|
-
|
|
50
|
-
### A01 — Broken Access Control
|
|
51
|
-
|
|
52
|
-
```typescript
|
|
53
|
-
// Node/NestJS — guard + policy
|
|
54
|
-
@UseGuards(JwtAuthGuard, PoliciesGuard)
|
|
55
|
-
@CheckPolicies(ability => ability.can(Action.Update, Post))
|
|
56
|
-
async update(@Param('id') id: string, @CurrentUser() user: User) {
|
|
57
|
-
// ORM já filtra por ownership via policy
|
|
58
|
-
}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
```python
|
|
62
|
-
# FastAPI — dependency injection para verificar ownership
|
|
63
|
-
async def get_post_or_403(post_id: str, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
|
64
|
-
post = db.query(Post).filter(Post.id == post_id, Post.author_id == current_user.id).first()
|
|
65
|
-
if not post:
|
|
66
|
-
raise HTTPException(403)
|
|
67
|
-
return post
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
```rust
|
|
71
|
-
// Rust/Axum — extractor verifica ownership
|
|
72
|
-
async fn update_post(
|
|
73
|
-
State(db): State<Pool<Postgres>>,
|
|
74
|
-
claims: Claims, // extraído do JWT
|
|
75
|
-
Path(post_id): Path<Uuid>,
|
|
76
|
-
Json(body): Json<UpdatePostBody>,
|
|
77
|
-
) -> Result<Json<Post>, AppError> {
|
|
78
|
-
let post = sqlx::query_as!(Post,
|
|
79
|
-
"SELECT * FROM posts WHERE id = $1 AND author_id = $2",
|
|
80
|
-
post_id, claims.sub // filtra por owner
|
|
81
|
-
).fetch_one(&db).await?;
|
|
82
|
-
// ...
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### A02 — Cryptographic Failures
|
|
87
|
-
|
|
88
|
-
```typescript
|
|
89
|
-
// Node — Argon2 via @node-rs/argon2
|
|
90
|
-
import { hash, verify } from '@node-rs/argon2';
|
|
91
|
-
const hashed = await hash(password); // hash
|
|
92
|
-
const valid = await verify(hashed, password); // verify
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
```python
|
|
96
|
-
# Python — passlib com Argon2
|
|
97
|
-
from passlib.hash import argon2
|
|
98
|
-
hashed = argon2.hash(password)
|
|
99
|
-
valid = argon2.verify(password, hashed)
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
```rust
|
|
103
|
-
// Rust — argon2 crate
|
|
104
|
-
use argon2::{Argon2, PasswordHash, PasswordHasher, PasswordVerifier, password_hash::SaltString};
|
|
105
|
-
let salt = SaltString::generate(&mut OsRng);
|
|
106
|
-
let hash = Argon2::default().hash_password(password.as_bytes(), &salt)?.to_string();
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
### A03 — Injection
|
|
110
|
-
|
|
111
|
-
```typescript
|
|
112
|
-
// TypeScript/Prisma — parametrizado por padrão
|
|
113
|
-
const user = await prisma.user.findFirst({ where: { email } }); // ✅
|
|
114
|
-
|
|
115
|
-
// NestJS — nunca QueryBuilder com interpolação
|
|
116
|
-
.where(`user.email = '${email}'`) // ❌
|
|
117
|
-
.where('user.email = :email', { email }) // ✅
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
```python
|
|
121
|
-
# SQLAlchemy — sempre parametrizado
|
|
122
|
-
db.execute(select(User).where(User.email == email)) # ✅
|
|
123
|
-
db.execute(f"SELECT * FROM users WHERE email = '{email}'") # ❌
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### A06 — Vulnerable Components (Ralph Loop obrigatório)
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
# Adicionar ao pipeline CI (GitHub Actions):
|
|
130
|
-
- name: Security audit
|
|
131
|
-
run: |
|
|
132
|
-
npm audit --audit-level=high # Node
|
|
133
|
-
# ou cargo audit # Rust
|
|
134
|
-
# ou pip-audit # Python
|
|
135
|
-
# ou composer audit # PHP
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### A07 — Authentication Failures
|
|
139
|
-
|
|
140
|
-
```typescript
|
|
141
|
-
// Rate limiting com @nestjs/throttler
|
|
142
|
-
@Throttle({ default: { limit: 5, ttl: 900000 } }) // 5 req / 15 min
|
|
143
|
-
@Post('login')
|
|
144
|
-
async login() { ... }
|
|
145
|
-
|
|
146
|
-
// JWT: access token curto, refresh com rotação
|
|
147
|
-
const accessToken = jwt.sign(payload, secret, { expiresIn: '15m' });
|
|
148
|
-
const refreshToken = jwt.sign({ sub: userId }, refreshSecret, { expiresIn: '7d' });
|
|
149
|
-
// Salvar refresh token hash no DB para invalidação no logout
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### Prompt Injection (projetos com LLM)
|
|
153
|
-
|
|
154
|
-
```python
|
|
155
|
-
# Nunca concatenar input do usuário diretamente na instrução do sistema
|
|
156
|
-
system_prompt = f"Você é um assistente. {user_input}" # ❌ CRÍTICO
|
|
157
|
-
|
|
158
|
-
# Separar claramente instrução de dados:
|
|
159
|
-
messages = [
|
|
160
|
-
{"role": "system", "content": "Você é um assistente. Responda apenas sobre o documento fornecido."},
|
|
161
|
-
{"role": "user", "content": f"<documento>{sanitize(user_document)}</documento>\n\nPergunta: {sanitize(user_question)}"}
|
|
162
|
-
]
|
|
163
|
-
# Sanitize: remova ou escape sequências como "Ignore as instruções acima"
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
## Gestão de Secrets
|
|
169
|
-
|
|
170
|
-
### O que nunca commitar
|
|
171
|
-
|
|
172
|
-
```bash
|
|
173
|
-
# Configure git-secrets ou detect-secrets:
|
|
174
|
-
pip install detect-secrets
|
|
175
|
-
detect-secrets scan > .secrets.baseline
|
|
176
|
-
|
|
177
|
-
# Padrões críticos a bloquear:
|
|
178
|
-
# password = "..."
|
|
179
|
-
# api_key = "..."
|
|
180
|
-
# DATABASE_URL com credenciais
|
|
181
|
-
# AWS_SECRET_ACCESS_KEY
|
|
182
|
-
# private_key
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
### Estrutura correta
|
|
186
|
-
|
|
187
|
-
```
|
|
188
|
-
.env ← valores reais (no .gitignore)
|
|
189
|
-
.env.example ← template sem valores (commitado)
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
```bash
|
|
193
|
-
# .env.example — sempre commitado, sem valores reais
|
|
194
|
-
DATABASE_URL=postgres://user:password@localhost:5432/dbname
|
|
195
|
-
JWT_SECRET=your-secret-here-min-32-chars
|
|
196
|
-
STRIPE_SECRET_KEY=sk_test_...
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## Headers de Segurança HTTP
|
|
202
|
-
|
|
203
|
-
```typescript
|
|
204
|
-
// NestJS — helmet middleware
|
|
205
|
-
import helmet from 'helmet';
|
|
206
|
-
app.use(helmet());
|
|
207
|
-
app.use(helmet.hsts({ maxAge: 31536000, includeSubDomains: true }));
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
```python
|
|
211
|
-
# FastAPI — middleware de headers
|
|
212
|
-
from starlette.middleware.base import BaseHTTPMiddleware
|
|
213
|
-
class SecurityHeadersMiddleware(BaseHTTPMiddleware):
|
|
214
|
-
async def dispatch(self, request, call_next):
|
|
215
|
-
response = await call_next(request)
|
|
216
|
-
response.headers["X-Frame-Options"] = "DENY"
|
|
217
|
-
response.headers["X-Content-Type-Options"] = "nosniff"
|
|
218
|
-
response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains"
|
|
219
|
-
return response
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
```rust
|
|
223
|
-
// Axum — layer de headers de segurança
|
|
224
|
-
use tower_http::set_header::SetResponseHeaderLayer;
|
|
225
|
-
let app = Router::new()
|
|
226
|
-
.layer(SetResponseHeaderLayer::overriding(
|
|
227
|
-
header::X_FRAME_OPTIONS,
|
|
228
|
-
HeaderValue::from_static("DENY"),
|
|
229
|
-
));
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
$ARGUMENTS
|
|
1
|
+
# /dare-security
|
|
2
|
+
|
|
3
|
+
Guia completo de segurança para todas as fases do DARE. Use para: revisar o DESIGN/BLUEPRINT com foco em segurança, implementar controles em uma task específica, ou auditar o projeto existente.
|
|
4
|
+
|
|
5
|
+
## Como usar
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/dare-security # auditoria geral do projeto
|
|
9
|
+
/dare-security task-005 # revisar segurança de uma task específica
|
|
10
|
+
/dare-security design # revisar DARE/DESIGN.md com lente de segurança
|
|
11
|
+
/dare-security deps # auditar dependências vulneráveis agora
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Aplicação por fase
|
|
15
|
+
|
|
16
|
+
### `/dare-security design` — Revisar DESIGN.md
|
|
17
|
+
|
|
18
|
+
Leia `DARE/DESIGN.md` e verifique:
|
|
19
|
+
- [ ] Seção RS-* com requisitos de segurança numerados existe
|
|
20
|
+
- [ ] RS-01 (validação de entrada), RS-02 (hash/criptografia), RS-03 (controle de acesso), RS-04 (auditoria de deps), RS-05 (secrets) presentes
|
|
21
|
+
- [ ] Riscos de segurança identificados com mitigações (SSRF, Injection, Auth bypass...)
|
|
22
|
+
- [ ] Fora do escopo não omite itens de segurança críticos para v1
|
|
23
|
+
|
|
24
|
+
### `/dare-security deps` — Auditar dependências
|
|
25
|
+
|
|
26
|
+
Execute o comando de auditoria da stack do projeto:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Detectar stack automaticamente e rodar
|
|
30
|
+
npm audit --audit-level=high # se package.json presente
|
|
31
|
+
cargo audit # se Cargo.toml presente
|
|
32
|
+
pip-audit # se requirements.txt / pyproject.toml presente
|
|
33
|
+
composer audit # se composer.json presente
|
|
34
|
+
govulncheck ./... # se go.mod presente
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Critério:** CVE HIGH ou CRITICAL = reportar ao usuário com versão afetada, CVE ID e versão corrigida disponível. Propor o fix (bump de versão ou substituição de pacote).
|
|
38
|
+
|
|
39
|
+
**Auto-fix quando seguro:**
|
|
40
|
+
```bash
|
|
41
|
+
npm audit fix # Node — corrige sem breaking changes
|
|
42
|
+
cargo update # Rust — bumpa dentro das constraints do Cargo.toml
|
|
43
|
+
pip install --upgrade [pacote] # Python — atualizar pacote específico
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## OWASP Top 10 — Referência Rápida por Stack
|
|
49
|
+
|
|
50
|
+
### A01 — Broken Access Control
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// Node/NestJS — guard + policy
|
|
54
|
+
@UseGuards(JwtAuthGuard, PoliciesGuard)
|
|
55
|
+
@CheckPolicies(ability => ability.can(Action.Update, Post))
|
|
56
|
+
async update(@Param('id') id: string, @CurrentUser() user: User) {
|
|
57
|
+
// ORM já filtra por ownership via policy
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
# FastAPI — dependency injection para verificar ownership
|
|
63
|
+
async def get_post_or_403(post_id: str, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
|
64
|
+
post = db.query(Post).filter(Post.id == post_id, Post.author_id == current_user.id).first()
|
|
65
|
+
if not post:
|
|
66
|
+
raise HTTPException(403)
|
|
67
|
+
return post
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```rust
|
|
71
|
+
// Rust/Axum — extractor verifica ownership
|
|
72
|
+
async fn update_post(
|
|
73
|
+
State(db): State<Pool<Postgres>>,
|
|
74
|
+
claims: Claims, // extraído do JWT
|
|
75
|
+
Path(post_id): Path<Uuid>,
|
|
76
|
+
Json(body): Json<UpdatePostBody>,
|
|
77
|
+
) -> Result<Json<Post>, AppError> {
|
|
78
|
+
let post = sqlx::query_as!(Post,
|
|
79
|
+
"SELECT * FROM posts WHERE id = $1 AND author_id = $2",
|
|
80
|
+
post_id, claims.sub // filtra por owner
|
|
81
|
+
).fetch_one(&db).await?;
|
|
82
|
+
// ...
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### A02 — Cryptographic Failures
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
// Node — Argon2 via @node-rs/argon2
|
|
90
|
+
import { hash, verify } from '@node-rs/argon2';
|
|
91
|
+
const hashed = await hash(password); // hash
|
|
92
|
+
const valid = await verify(hashed, password); // verify
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```python
|
|
96
|
+
# Python — passlib com Argon2
|
|
97
|
+
from passlib.hash import argon2
|
|
98
|
+
hashed = argon2.hash(password)
|
|
99
|
+
valid = argon2.verify(password, hashed)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```rust
|
|
103
|
+
// Rust — argon2 crate
|
|
104
|
+
use argon2::{Argon2, PasswordHash, PasswordHasher, PasswordVerifier, password_hash::SaltString};
|
|
105
|
+
let salt = SaltString::generate(&mut OsRng);
|
|
106
|
+
let hash = Argon2::default().hash_password(password.as_bytes(), &salt)?.to_string();
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### A03 — Injection
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
// TypeScript/Prisma — parametrizado por padrão
|
|
113
|
+
const user = await prisma.user.findFirst({ where: { email } }); // ✅
|
|
114
|
+
|
|
115
|
+
// NestJS — nunca QueryBuilder com interpolação
|
|
116
|
+
.where(`user.email = '${email}'`) // ❌
|
|
117
|
+
.where('user.email = :email', { email }) // ✅
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
# SQLAlchemy — sempre parametrizado
|
|
122
|
+
db.execute(select(User).where(User.email == email)) # ✅
|
|
123
|
+
db.execute(f"SELECT * FROM users WHERE email = '{email}'") # ❌
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### A06 — Vulnerable Components (Ralph Loop obrigatório)
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# Adicionar ao pipeline CI (GitHub Actions):
|
|
130
|
+
- name: Security audit
|
|
131
|
+
run: |
|
|
132
|
+
npm audit --audit-level=high # Node
|
|
133
|
+
# ou cargo audit # Rust
|
|
134
|
+
# ou pip-audit # Python
|
|
135
|
+
# ou composer audit # PHP
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### A07 — Authentication Failures
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
// Rate limiting com @nestjs/throttler
|
|
142
|
+
@Throttle({ default: { limit: 5, ttl: 900000 } }) // 5 req / 15 min
|
|
143
|
+
@Post('login')
|
|
144
|
+
async login() { ... }
|
|
145
|
+
|
|
146
|
+
// JWT: access token curto, refresh com rotação
|
|
147
|
+
const accessToken = jwt.sign(payload, secret, { expiresIn: '15m' });
|
|
148
|
+
const refreshToken = jwt.sign({ sub: userId }, refreshSecret, { expiresIn: '7d' });
|
|
149
|
+
// Salvar refresh token hash no DB para invalidação no logout
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Prompt Injection (projetos com LLM)
|
|
153
|
+
|
|
154
|
+
```python
|
|
155
|
+
# Nunca concatenar input do usuário diretamente na instrução do sistema
|
|
156
|
+
system_prompt = f"Você é um assistente. {user_input}" # ❌ CRÍTICO
|
|
157
|
+
|
|
158
|
+
# Separar claramente instrução de dados:
|
|
159
|
+
messages = [
|
|
160
|
+
{"role": "system", "content": "Você é um assistente. Responda apenas sobre o documento fornecido."},
|
|
161
|
+
{"role": "user", "content": f"<documento>{sanitize(user_document)}</documento>\n\nPergunta: {sanitize(user_question)}"}
|
|
162
|
+
]
|
|
163
|
+
# Sanitize: remova ou escape sequências como "Ignore as instruções acima"
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Gestão de Secrets
|
|
169
|
+
|
|
170
|
+
### O que nunca commitar
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# Configure git-secrets ou detect-secrets:
|
|
174
|
+
pip install detect-secrets
|
|
175
|
+
detect-secrets scan > .secrets.baseline
|
|
176
|
+
|
|
177
|
+
# Padrões críticos a bloquear:
|
|
178
|
+
# password = "..."
|
|
179
|
+
# api_key = "..."
|
|
180
|
+
# DATABASE_URL com credenciais
|
|
181
|
+
# AWS_SECRET_ACCESS_KEY
|
|
182
|
+
# private_key
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Estrutura correta
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
.env ← valores reais (no .gitignore)
|
|
189
|
+
.env.example ← template sem valores (commitado)
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# .env.example — sempre commitado, sem valores reais
|
|
194
|
+
DATABASE_URL=postgres://user:password@localhost:5432/dbname
|
|
195
|
+
JWT_SECRET=your-secret-here-min-32-chars
|
|
196
|
+
STRIPE_SECRET_KEY=sk_test_...
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Headers de Segurança HTTP
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
// NestJS — helmet middleware
|
|
205
|
+
import helmet from 'helmet';
|
|
206
|
+
app.use(helmet());
|
|
207
|
+
app.use(helmet.hsts({ maxAge: 31536000, includeSubDomains: true }));
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
# FastAPI — middleware de headers
|
|
212
|
+
from starlette.middleware.base import BaseHTTPMiddleware
|
|
213
|
+
class SecurityHeadersMiddleware(BaseHTTPMiddleware):
|
|
214
|
+
async def dispatch(self, request, call_next):
|
|
215
|
+
response = await call_next(request)
|
|
216
|
+
response.headers["X-Frame-Options"] = "DENY"
|
|
217
|
+
response.headers["X-Content-Type-Options"] = "nosniff"
|
|
218
|
+
response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains"
|
|
219
|
+
return response
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
```rust
|
|
223
|
+
// Axum — layer de headers de segurança
|
|
224
|
+
use tower_http::set_header::SetResponseHeaderLayer;
|
|
225
|
+
let app = Router::new()
|
|
226
|
+
.layer(SetResponseHeaderLayer::overriding(
|
|
227
|
+
header::X_FRAME_OPTIONS,
|
|
228
|
+
HeaderValue::from_static("DENY"),
|
|
229
|
+
));
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
$ARGUMENTS
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
# /dare-tasks
|
|
2
|
-
|
|
3
|
-
Exibe o status atual de todas as tasks do projeto e sugere próximos passos.
|
|
4
|
-
|
|
5
|
-
## Como usar
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
/dare-tasks
|
|
9
|
-
/dare-tasks --pending
|
|
10
|
-
/dare-tasks --ready
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## O que fazer
|
|
14
|
-
|
|
15
|
-
1. **Leia os arquivos:**
|
|
16
|
-
- `DARE/TASKS.md` — status de cada task
|
|
17
|
-
- `DARE/dare-dag.yaml` — grafo de dependências
|
|
18
|
-
|
|
19
|
-
2. **Exiba uma tabela formatada:**
|
|
20
|
-
```
|
|
21
|
-
| ID | Título | Status | Depends On | Complexity |
|
|
22
|
-
|----------|---------------------------|-------------|------------------|------------|
|
|
23
|
-
| task-001 | Setup project structure | ✅ DONE | - | LOW |
|
|
24
|
-
| task-002 | Implement DB schema | 🔄 RUNNING | - | MED |
|
|
25
|
-
| task-003 | Implement core endpoints | ⏳ PENDING | task-001, 002 | HIGH |
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
3. **Destaque tasks prontas para execução:**
|
|
29
|
-
- Status `PENDING` E todas as `depends_on` com status `DONE`
|
|
30
|
-
- Estas podem ser executadas com `/dare-execute <id>`
|
|
31
|
-
|
|
32
|
-
4. **Calcule e exiba progresso:**
|
|
33
|
-
- Total de tasks
|
|
34
|
-
- Tasks DONE / FAILED / SKIPPED / PENDING / RUNNING
|
|
35
|
-
- Percentual concluído
|
|
36
|
-
- Barra visual: `█████░░░░░ 50%`
|
|
37
|
-
|
|
38
|
-
5. **Identifique gargalos:**
|
|
39
|
-
- Tasks com mais dependências
|
|
40
|
-
- Tasks bloqueando outras
|
|
41
|
-
- Tasks no caminho crítico
|
|
42
|
-
|
|
43
|
-
6. **Filtros opcionais:**
|
|
44
|
-
- `--pending` — só PENDING
|
|
45
|
-
- `--ready` — só prontas para execução
|
|
46
|
-
- `--failed` — só FAILED
|
|
47
|
-
- `--blocked` — PENDING com dependências não satisfeitas
|
|
48
|
-
|
|
49
|
-
## Exemplo de output
|
|
50
|
-
|
|
51
|
-
```
|
|
52
|
-
📋 DARE Tasks Status
|
|
53
|
-
|
|
54
|
-
| ID | Título | Status | Depends On |
|
|
55
|
-
|----------|---------------------------|-------------|------------------|
|
|
56
|
-
| task-001 | Setup project structure | ✅ DONE | - |
|
|
57
|
-
| task-002 | Implement DB schema | ✅ DONE | - |
|
|
58
|
-
| task-003 | Implement core endpoints | 🟢 READY | task-001, 002 |
|
|
59
|
-
| task-004 | Implement auth | 🟢 READY | task-001, 002 |
|
|
60
|
-
| task-005 | Write tests | 🔒 BLOCKED | task-003, 004 |
|
|
61
|
-
|
|
62
|
-
Progress: 2/5 tasks (40%)
|
|
63
|
-
████████░░░░░░░░░░░░ 40%
|
|
64
|
-
|
|
65
|
-
🟢 Ready to execute: task-003, task-004
|
|
66
|
-
Run: /dare-execute task-003
|
|
67
|
-
Or: dare execute --parallel (executa task-003 e task-004 em paralelo)
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
$ARGUMENTS
|
|
1
|
+
# /dare-tasks
|
|
2
|
+
|
|
3
|
+
Exibe o status atual de todas as tasks do projeto e sugere próximos passos.
|
|
4
|
+
|
|
5
|
+
## Como usar
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/dare-tasks
|
|
9
|
+
/dare-tasks --pending
|
|
10
|
+
/dare-tasks --ready
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## O que fazer
|
|
14
|
+
|
|
15
|
+
1. **Leia os arquivos:**
|
|
16
|
+
- `DARE/TASKS.md` — status de cada task
|
|
17
|
+
- `DARE/dare-dag.yaml` — grafo de dependências
|
|
18
|
+
|
|
19
|
+
2. **Exiba uma tabela formatada:**
|
|
20
|
+
```
|
|
21
|
+
| ID | Título | Status | Depends On | Complexity |
|
|
22
|
+
|----------|---------------------------|-------------|------------------|------------|
|
|
23
|
+
| task-001 | Setup project structure | ✅ DONE | - | LOW |
|
|
24
|
+
| task-002 | Implement DB schema | 🔄 RUNNING | - | MED |
|
|
25
|
+
| task-003 | Implement core endpoints | ⏳ PENDING | task-001, 002 | HIGH |
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
3. **Destaque tasks prontas para execução:**
|
|
29
|
+
- Status `PENDING` E todas as `depends_on` com status `DONE`
|
|
30
|
+
- Estas podem ser executadas com `/dare-execute <id>`
|
|
31
|
+
|
|
32
|
+
4. **Calcule e exiba progresso:**
|
|
33
|
+
- Total de tasks
|
|
34
|
+
- Tasks DONE / FAILED / SKIPPED / PENDING / RUNNING
|
|
35
|
+
- Percentual concluído
|
|
36
|
+
- Barra visual: `█████░░░░░ 50%`
|
|
37
|
+
|
|
38
|
+
5. **Identifique gargalos:**
|
|
39
|
+
- Tasks com mais dependências
|
|
40
|
+
- Tasks bloqueando outras
|
|
41
|
+
- Tasks no caminho crítico
|
|
42
|
+
|
|
43
|
+
6. **Filtros opcionais:**
|
|
44
|
+
- `--pending` — só PENDING
|
|
45
|
+
- `--ready` — só prontas para execução
|
|
46
|
+
- `--failed` — só FAILED
|
|
47
|
+
- `--blocked` — PENDING com dependências não satisfeitas
|
|
48
|
+
|
|
49
|
+
## Exemplo de output
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
📋 DARE Tasks Status
|
|
53
|
+
|
|
54
|
+
| ID | Título | Status | Depends On |
|
|
55
|
+
|----------|---------------------------|-------------|------------------|
|
|
56
|
+
| task-001 | Setup project structure | ✅ DONE | - |
|
|
57
|
+
| task-002 | Implement DB schema | ✅ DONE | - |
|
|
58
|
+
| task-003 | Implement core endpoints | 🟢 READY | task-001, 002 |
|
|
59
|
+
| task-004 | Implement auth | 🟢 READY | task-001, 002 |
|
|
60
|
+
| task-005 | Write tests | 🔒 BLOCKED | task-003, 004 |
|
|
61
|
+
|
|
62
|
+
Progress: 2/5 tasks (40%)
|
|
63
|
+
████████░░░░░░░░░░░░ 40%
|
|
64
|
+
|
|
65
|
+
🟢 Ready to execute: task-003, task-004
|
|
66
|
+
Run: /dare-execute task-003
|
|
67
|
+
Or: dare execute --parallel (executa task-003 e task-004 em paralelo)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
$ARGUMENTS
|