@dewtech/dare-cli 2.16.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 +196 -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.d.ts +2 -0
- package/dist/__tests__/refine.test.d.ts.map +1 -0
- package/dist/__tests__/refine.test.js +186 -0
- package/dist/__tests__/refine.test.js.map +1 -0
- 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.d.ts +2 -0
- package/dist/__tests__/review.test.d.ts.map +1 -0
- package/dist/__tests__/review.test.js +242 -0
- package/dist/__tests__/review.test.js.map +1 -0
- package/dist/__tests__/update.test.d.ts +2 -0
- package/dist/__tests__/update.test.d.ts.map +1 -0
- package/dist/__tests__/update.test.js +150 -0
- package/dist/__tests__/update.test.js.map +1 -0
- package/dist/__tests__/validate.test.js +65 -65
- package/dist/bin/dare.js +38 -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/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +76 -0
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +101 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +16 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +103 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/refine.d.ts +16 -0
- package/dist/commands/refine.d.ts.map +1 -0
- package/dist/commands/refine.js +167 -0
- package/dist/commands/refine.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/review.d.ts +16 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +106 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/update.d.ts +13 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +149 -0
- package/dist/commands/update.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/types/Refine.types.d.ts +96 -0
- package/dist/types/Refine.types.d.ts.map +1 -0
- package/dist/types/Refine.types.js +19 -0
- package/dist/types/Refine.types.js.map +1 -0
- package/dist/types/Review.types.d.ts +86 -0
- package/dist/types/Review.types.d.ts.map +1 -0
- package/dist/types/Review.types.js +15 -0
- package/dist/types/Review.types.js.map +1 -0
- package/dist/types/UpdateManifest.types.d.ts +91 -0
- package/dist/types/UpdateManifest.types.d.ts.map +1 -0
- package/dist/types/UpdateManifest.types.js +13 -0
- package/dist/types/UpdateManifest.types.js.map +1 -0
- package/dist/utils/ReviewRunner.d.ts +42 -0
- package/dist/utils/ReviewRunner.d.ts.map +1 -0
- package/dist/utils/ReviewRunner.js +175 -0
- package/dist/utils/ReviewRunner.js.map +1 -0
- package/dist/utils/UpdateApplier.d.ts +42 -0
- package/dist/utils/UpdateApplier.d.ts.map +1 -0
- package/dist/utils/UpdateApplier.js +207 -0
- package/dist/utils/UpdateApplier.js.map +1 -0
- package/dist/utils/UpdateDetector.d.ts +56 -0
- package/dist/utils/UpdateDetector.d.ts.map +1 -0
- package/dist/utils/UpdateDetector.js +164 -0
- package/dist/utils/UpdateDetector.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/complexity-analyzer.d.ts +60 -0
- package/dist/utils/complexity-analyzer.d.ts.map +1 -0
- package/dist/utils/complexity-analyzer.js +292 -0
- package/dist/utils/complexity-analyzer.js.map +1 -0
- package/dist/utils/confidence.d.ts +41 -0
- package/dist/utils/confidence.d.ts.map +1 -0
- package/dist/utils/confidence.js +101 -0
- package/dist/utils/confidence.js.map +1 -0
- package/dist/utils/datamodel.d.ts +41 -0
- package/dist/utils/datamodel.d.ts.map +1 -0
- package/dist/utils/datamodel.js +535 -0
- package/dist/utils/datamodel.js.map +1 -0
- package/dist/utils/dna-detector.d.ts +61 -0
- package/dist/utils/dna-detector.d.ts.map +1 -0
- package/dist/utils/dna-detector.js +354 -0
- package/dist/utils/dna-detector.js.map +1 -0
- package/dist/utils/dna-facts.d.ts +13 -0
- package/dist/utils/dna-facts.d.ts.map +1 -0
- package/dist/utils/dna-facts.js +109 -0
- package/dist/utils/dna-facts.js.map +1 -0
- package/dist/utils/excalidraw-renderer.d.ts +11 -71
- package/dist/utils/excalidraw-renderer.d.ts.map +1 -1
- package/dist/utils/excalidraw-renderer.js +29 -162
- package/dist/utils/excalidraw-renderer.js.map +1 -1
- package/dist/utils/graph-renderer.d.ts +115 -0
- package/dist/utils/graph-renderer.d.ts.map +1 -0
- package/dist/utils/graph-renderer.js +216 -0
- package/dist/utils/graph-renderer.js.map +1 -0
- package/dist/utils/migration.d.ts +64 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +183 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/module-detector.d.ts +46 -0
- package/dist/utils/module-detector.d.ts.map +1 -0
- package/dist/utils/module-detector.js +348 -0
- package/dist/utils/module-detector.js.map +1 -0
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +273 -254
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/reverse-facts.d.ts +50 -0
- package/dist/utils/reverse-facts.d.ts.map +1 -0
- package/dist/utils/reverse-facts.js +291 -0
- package/dist/utils/reverse-facts.js.map +1 -0
- package/dist/utils/stack-bootstrap.js +371 -371
- package/dist/utils/static-analyzer.d.ts +29 -0
- package/dist/utils/static-analyzer.d.ts.map +1 -0
- package/dist/utils/static-analyzer.js +390 -0
- package/dist/utils/static-analyzer.js.map +1 -0
- package/dist/utils/version-compare.d.ts +27 -0
- package/dist/utils/version-compare.d.ts.map +1 -0
- package/dist/utils/version-compare.js +47 -0
- package/dist/utils/version-compare.js.map +1 -0
- package/package.json +8 -3
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +48 -0
- 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-blueprint/SKILL.md +180 -36
- 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 -0
- package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -0
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -0
- 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 -224
- 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 -100
- package/templates/ide/claude/.claude/commands/dare-ax.md +131 -0
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -78
- package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -0
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -110
- 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 -0
- package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -0
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -0
- 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 -100
- package/templates/ide/cursor/.cursor/commands/dag-viz.md +139 -0
- package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +86 -41
- package/templates/ide/cursor/.cursor/commands/generate-design.md +35 -35
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +184 -142
- package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -0
- package/templates/ide/cursor/.cursor/commands/review-task.md +91 -0
- 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 -100
- 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
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for DARE CLI — ASCII art banner (printBanner / renderBanner)
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Mocks — must be declared BEFORE importing the module under test
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Mock figlet so tests don't depend on bundled font files
|
|
9
|
+
vi.mock('figlet', () => {
|
|
10
|
+
const textSync = vi.fn((_text, opts) => {
|
|
11
|
+
// Simulate font-not-found for 'Alligator' to test fallback
|
|
12
|
+
if (opts?.font === 'Alligator') {
|
|
13
|
+
throw new Error('Font not found: Alligator');
|
|
14
|
+
}
|
|
15
|
+
if (opts?.font === 'Larry 3D') {
|
|
16
|
+
throw new Error('Font not found: Larry 3D');
|
|
17
|
+
}
|
|
18
|
+
// 'Big', 'Slant', 'Standard' succeed
|
|
19
|
+
return ` ____ _ ____ _____\n | __ ) / \\ | _ \\| ____|\n | _ \\ / _ \\ | |_) | _| \n | |_) / ___ \\| _ <| |___ \n |____/_/ \\_\\_| \\_\\_____|\n`;
|
|
20
|
+
});
|
|
21
|
+
return { default: { textSync } };
|
|
22
|
+
});
|
|
23
|
+
// Mock gradient-string (CommonJS module loaded via createRequire)
|
|
24
|
+
vi.mock('gradient-string', () => {
|
|
25
|
+
const mockMultiline = vi.fn((text) => `\x1b[32m${text}\x1b[0m`);
|
|
26
|
+
const mockGradient = vi.fn(() => ({ multiline: mockMultiline }));
|
|
27
|
+
return { default: mockGradient };
|
|
28
|
+
});
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Import after mocks
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
import { printBanner, renderBanner } from './banner.js';
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Helper: spy on console.log
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
function spyConsole() {
|
|
37
|
+
return vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Tests
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
describe('renderBanner()', () => {
|
|
43
|
+
it('returns a non-empty string', () => {
|
|
44
|
+
const result = renderBanner();
|
|
45
|
+
expect(result).toBeTruthy();
|
|
46
|
+
expect(result.trim().length).toBeGreaterThan(0);
|
|
47
|
+
});
|
|
48
|
+
it('falls back when Alligator and Larry 3D throw — still returns text', () => {
|
|
49
|
+
// Our mock throws for Alligator and Larry 3D, succeeds for Big
|
|
50
|
+
const result = renderBanner();
|
|
51
|
+
expect(result).not.toBe('');
|
|
52
|
+
});
|
|
53
|
+
it('returns "DARE" plain text as last resort when all fonts fail', async () => {
|
|
54
|
+
// Override figlet mock to always throw for this test
|
|
55
|
+
const figlet = await import('figlet');
|
|
56
|
+
const textSyncSpy = vi.spyOn(figlet.default, 'textSync').mockImplementation(() => {
|
|
57
|
+
throw new Error('no font');
|
|
58
|
+
});
|
|
59
|
+
const result = renderBanner();
|
|
60
|
+
expect(result).toBe('DARE');
|
|
61
|
+
textSyncSpy.mockRestore();
|
|
62
|
+
});
|
|
63
|
+
it('returns non-empty string even when figlet returns empty string for first font', async () => {
|
|
64
|
+
const figlet = await import('figlet');
|
|
65
|
+
let callCount = 0;
|
|
66
|
+
const textSyncSpy = vi.spyOn(figlet.default, 'textSync').mockImplementation(() => {
|
|
67
|
+
callCount++;
|
|
68
|
+
if (callCount === 1)
|
|
69
|
+
return ' '; // whitespace-only → should skip
|
|
70
|
+
return 'DARE ART';
|
|
71
|
+
});
|
|
72
|
+
const result = renderBanner();
|
|
73
|
+
expect(result.trim().length).toBeGreaterThan(0);
|
|
74
|
+
textSyncSpy.mockRestore();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('printBanner()', () => {
|
|
78
|
+
let originalIsTTY;
|
|
79
|
+
let originalNoBanner;
|
|
80
|
+
let originalForceBanner;
|
|
81
|
+
let originalColorterm;
|
|
82
|
+
beforeEach(() => {
|
|
83
|
+
originalIsTTY = process.stdout.isTTY;
|
|
84
|
+
originalNoBanner = process.env.DARE_NO_BANNER;
|
|
85
|
+
originalForceBanner = process.env.FORCE_BANNER;
|
|
86
|
+
originalColorterm = process.env.COLORTERM;
|
|
87
|
+
// Reset env vars
|
|
88
|
+
delete process.env.DARE_NO_BANNER;
|
|
89
|
+
delete process.env.FORCE_BANNER;
|
|
90
|
+
delete process.env.COLORTERM;
|
|
91
|
+
});
|
|
92
|
+
afterEach(() => {
|
|
93
|
+
// Restore isTTY
|
|
94
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
95
|
+
value: originalIsTTY,
|
|
96
|
+
writable: true,
|
|
97
|
+
configurable: true,
|
|
98
|
+
});
|
|
99
|
+
// Restore env vars
|
|
100
|
+
if (originalNoBanner === undefined) {
|
|
101
|
+
delete process.env.DARE_NO_BANNER;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
process.env.DARE_NO_BANNER = originalNoBanner;
|
|
105
|
+
}
|
|
106
|
+
if (originalForceBanner === undefined) {
|
|
107
|
+
delete process.env.FORCE_BANNER;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
process.env.FORCE_BANNER = originalForceBanner;
|
|
111
|
+
}
|
|
112
|
+
if (originalColorterm === undefined) {
|
|
113
|
+
delete process.env.COLORTERM;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
process.env.COLORTERM = originalColorterm;
|
|
117
|
+
}
|
|
118
|
+
vi.restoreAllMocks();
|
|
119
|
+
});
|
|
120
|
+
// --- TTY suppression ---
|
|
121
|
+
it('does NOT print when process.stdout.isTTY is false', () => {
|
|
122
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
123
|
+
value: false,
|
|
124
|
+
writable: true,
|
|
125
|
+
configurable: true,
|
|
126
|
+
});
|
|
127
|
+
const spy = spyConsole();
|
|
128
|
+
printBanner();
|
|
129
|
+
expect(spy).not.toHaveBeenCalled();
|
|
130
|
+
});
|
|
131
|
+
it('prints when FORCE_BANNER=1 even if isTTY is false', () => {
|
|
132
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
133
|
+
value: false,
|
|
134
|
+
writable: true,
|
|
135
|
+
configurable: true,
|
|
136
|
+
});
|
|
137
|
+
process.env.FORCE_BANNER = '1';
|
|
138
|
+
const spy = spyConsole();
|
|
139
|
+
printBanner();
|
|
140
|
+
expect(spy).toHaveBeenCalled();
|
|
141
|
+
});
|
|
142
|
+
// --- DARE_NO_BANNER suppression ---
|
|
143
|
+
it('does NOT print when DARE_NO_BANNER=1', () => {
|
|
144
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
145
|
+
value: true,
|
|
146
|
+
writable: true,
|
|
147
|
+
configurable: true,
|
|
148
|
+
});
|
|
149
|
+
process.env.DARE_NO_BANNER = '1';
|
|
150
|
+
const spy = spyConsole();
|
|
151
|
+
printBanner();
|
|
152
|
+
expect(spy).not.toHaveBeenCalled();
|
|
153
|
+
});
|
|
154
|
+
it('prints normally when DARE_NO_BANNER is not set', () => {
|
|
155
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
156
|
+
value: true,
|
|
157
|
+
writable: true,
|
|
158
|
+
configurable: true,
|
|
159
|
+
});
|
|
160
|
+
const spy = spyConsole();
|
|
161
|
+
printBanner();
|
|
162
|
+
expect(spy).toHaveBeenCalled();
|
|
163
|
+
});
|
|
164
|
+
// --- Colour mode ---
|
|
165
|
+
it('uses ANSI fallback green when noColor=true', () => {
|
|
166
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
167
|
+
value: true,
|
|
168
|
+
writable: true,
|
|
169
|
+
configurable: true,
|
|
170
|
+
});
|
|
171
|
+
const spy = spyConsole();
|
|
172
|
+
printBanner({ noColor: true });
|
|
173
|
+
// At least one call should contain the ANSI green escape code
|
|
174
|
+
const calls = spy.mock.calls.map((c) => String(c[0]));
|
|
175
|
+
const hasGreen = calls.some((s) => s.includes('\x1b[32m'));
|
|
176
|
+
expect(hasGreen).toBe(true);
|
|
177
|
+
});
|
|
178
|
+
it('uses ANSI fallback when COLORTERM is not set', () => {
|
|
179
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
180
|
+
value: true,
|
|
181
|
+
writable: true,
|
|
182
|
+
configurable: true,
|
|
183
|
+
});
|
|
184
|
+
delete process.env.COLORTERM;
|
|
185
|
+
const spy = spyConsole();
|
|
186
|
+
printBanner();
|
|
187
|
+
const calls = spy.mock.calls.map((c) => String(c[0]));
|
|
188
|
+
const hasGreen = calls.some((s) => s.includes('\x1b[32m'));
|
|
189
|
+
expect(hasGreen).toBe(true);
|
|
190
|
+
});
|
|
191
|
+
it('uses gradient when COLORTERM=truecolor', () => {
|
|
192
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
193
|
+
value: true,
|
|
194
|
+
writable: true,
|
|
195
|
+
configurable: true,
|
|
196
|
+
});
|
|
197
|
+
process.env.COLORTERM = 'truecolor';
|
|
198
|
+
const spy = spyConsole();
|
|
199
|
+
printBanner();
|
|
200
|
+
// gradient mock wraps with \x1b[32m too (our mock implementation)
|
|
201
|
+
// The important thing is that console.log was called
|
|
202
|
+
expect(spy).toHaveBeenCalled();
|
|
203
|
+
});
|
|
204
|
+
// --- Tagline and subtitle ---
|
|
205
|
+
it('prints tagline "Design · Architecture · Review · Execute"', () => {
|
|
206
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
207
|
+
value: true,
|
|
208
|
+
writable: true,
|
|
209
|
+
configurable: true,
|
|
210
|
+
});
|
|
211
|
+
const spy = spyConsole();
|
|
212
|
+
printBanner();
|
|
213
|
+
const calls = spy.mock.calls.map((c) => String(c[0]));
|
|
214
|
+
const hasTagline = calls.some((s) => s.includes('Design · Architecture · Review · Execute'));
|
|
215
|
+
expect(hasTagline).toBe(true);
|
|
216
|
+
});
|
|
217
|
+
it('prints subtitle containing "by Dewtech" and version', () => {
|
|
218
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
219
|
+
value: true,
|
|
220
|
+
writable: true,
|
|
221
|
+
configurable: true,
|
|
222
|
+
});
|
|
223
|
+
const spy = spyConsole();
|
|
224
|
+
printBanner();
|
|
225
|
+
const calls = spy.mock.calls.map((c) => String(c[0]));
|
|
226
|
+
const hasSubtitle = calls.some((s) => s.includes('by Dewtech') && s.includes('dewtech.tech'));
|
|
227
|
+
expect(hasSubtitle).toBe(true);
|
|
228
|
+
});
|
|
229
|
+
it('prints an empty line at the end of the banner output', () => {
|
|
230
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
231
|
+
value: true,
|
|
232
|
+
writable: true,
|
|
233
|
+
configurable: true,
|
|
234
|
+
});
|
|
235
|
+
const spy = spyConsole();
|
|
236
|
+
printBanner();
|
|
237
|
+
// The last call should be console.log() with no args (empty line)
|
|
238
|
+
const lastCall = spy.mock.calls[spy.mock.calls.length - 1];
|
|
239
|
+
expect(lastCall).toEqual([]);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
describe('welcomeCommand', () => {
|
|
243
|
+
it('exports a Commander command named "welcome"', async () => {
|
|
244
|
+
const { welcomeCommand } = await import('../commands/welcome.js');
|
|
245
|
+
expect(welcomeCommand.name()).toBe('welcome');
|
|
246
|
+
});
|
|
247
|
+
it('welcomeCommand has a description', async () => {
|
|
248
|
+
const { welcomeCommand } = await import('../commands/welcome.js');
|
|
249
|
+
expect(welcomeCommand.description()).toBeTruthy();
|
|
250
|
+
expect(welcomeCommand.description().length).toBeGreaterThan(0);
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
//# sourceMappingURL=banner.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.spec.js","sourceRoot":"","sources":["../../src/utils/banner.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic complexity heuristic for `dare refine`.
|
|
3
|
+
*
|
|
4
|
+
* Scans a task spec for signals that correlate with implementation effort
|
|
5
|
+
* and aggregates them into a single score → bucket. The breakdown is
|
|
6
|
+
* preserved so the CLI / agent can explain *why* a task scored high.
|
|
7
|
+
*
|
|
8
|
+
* Signals (weights tuned empirically — start conservative; bump as we learn):
|
|
9
|
+
* - Files to create/modify (1 each, cap at 10)
|
|
10
|
+
* - Public functions/endpoints declared in spec (1.5 each, cap at 10)
|
|
11
|
+
* - Test cases listed (0.5 each, cap at 8)
|
|
12
|
+
* - Inbound dependencies in dare-dag.yaml (0.5 each, no cap)
|
|
13
|
+
* - "Heavy" keywords in prompt/spec (+2 each: refactor, migrate, integrate,
|
|
14
|
+
* multiple, audit, replace, rewrite, parallelize, cross-cutting)
|
|
15
|
+
* - HIGH complexity declared by author (+3 baseline)
|
|
16
|
+
*
|
|
17
|
+
* Buckets:
|
|
18
|
+
* 0–5 → LOW
|
|
19
|
+
* 6–12 → MED
|
|
20
|
+
* 13–20 → HIGH ← recommends split
|
|
21
|
+
* 21+ → CRITICAL ← strongly recommends split
|
|
22
|
+
*
|
|
23
|
+
* The thresholds are tunable via `dare.config.json#refine.thresholds` (see
|
|
24
|
+
* Frente 4) — defaults below.
|
|
25
|
+
*/
|
|
26
|
+
import type { ComplexityLevel, ComplexityReport, SplitProposal } from '../types/Refine.types.js';
|
|
27
|
+
export interface ComplexityThresholds {
|
|
28
|
+
low: number;
|
|
29
|
+
med: number;
|
|
30
|
+
high: number;
|
|
31
|
+
}
|
|
32
|
+
export declare const DEFAULT_THRESHOLDS: ComplexityThresholds;
|
|
33
|
+
export declare function levelFromScore(score: number, thresholds?: ComplexityThresholds): ComplexityLevel;
|
|
34
|
+
export interface AnalyzeOptions {
|
|
35
|
+
/** Override default thresholds (e.g. from dare.config.json#refine). */
|
|
36
|
+
thresholds?: ComplexityThresholds;
|
|
37
|
+
/** Extra `depends_on` count from `dare-dag.yaml` (optional — caller resolves). */
|
|
38
|
+
dependsOnCount?: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build a complexity report for a single task. Returns `null` if the spec
|
|
42
|
+
* can't be found, so the caller can produce a user-friendly error.
|
|
43
|
+
*/
|
|
44
|
+
export declare function analyzeTaskComplexity(taskId: string, projectRoot: string, options?: AnalyzeOptions): Promise<ComplexityReport | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Produce a coarse split proposal. The algorithm:
|
|
47
|
+
* 1. Group files by top-level directory (e.g. `src/auth/*` vs `tests/*`
|
|
48
|
+
* vs `migrations/*`).
|
|
49
|
+
* 2. Each group becomes a candidate sub-task. If a group has more than
|
|
50
|
+
* `maxFilesPerSubtask` files, split it further alphabetically.
|
|
51
|
+
* 3. Generate suffixed ids: `task-034a`, `task-034b`, ...
|
|
52
|
+
*
|
|
53
|
+
* Intentionally not too clever — the IDE agent (via the `dare-refine` skill)
|
|
54
|
+
* is expected to refine this with semantic awareness. The CLI proposal is
|
|
55
|
+
* a sane default that gets it 70% of the way there.
|
|
56
|
+
*/
|
|
57
|
+
export declare function proposeSplit(taskId: string, files: string[], options?: {
|
|
58
|
+
maxFilesPerSubtask?: number;
|
|
59
|
+
}): SplitProposal;
|
|
60
|
+
//# sourceMappingURL=complexity-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-analyzer.d.ts","sourceRoot":"","sources":["../../src/utils/complexity-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAGhB,aAAa,EACd,MAAM,0BAA0B,CAAC;AAIlC,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,kBAAkB,EAAE,oBAIhC,CAAC;AA+GF,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,oBAAyC,GACpD,eAAe,CAKjB;AAID,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAuFlC;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,aAAa,CAoDf"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic complexity heuristic for `dare refine`.
|
|
3
|
+
*
|
|
4
|
+
* Scans a task spec for signals that correlate with implementation effort
|
|
5
|
+
* and aggregates them into a single score → bucket. The breakdown is
|
|
6
|
+
* preserved so the CLI / agent can explain *why* a task scored high.
|
|
7
|
+
*
|
|
8
|
+
* Signals (weights tuned empirically — start conservative; bump as we learn):
|
|
9
|
+
* - Files to create/modify (1 each, cap at 10)
|
|
10
|
+
* - Public functions/endpoints declared in spec (1.5 each, cap at 10)
|
|
11
|
+
* - Test cases listed (0.5 each, cap at 8)
|
|
12
|
+
* - Inbound dependencies in dare-dag.yaml (0.5 each, no cap)
|
|
13
|
+
* - "Heavy" keywords in prompt/spec (+2 each: refactor, migrate, integrate,
|
|
14
|
+
* multiple, audit, replace, rewrite, parallelize, cross-cutting)
|
|
15
|
+
* - HIGH complexity declared by author (+3 baseline)
|
|
16
|
+
*
|
|
17
|
+
* Buckets:
|
|
18
|
+
* 0–5 → LOW
|
|
19
|
+
* 6–12 → MED
|
|
20
|
+
* 13–20 → HIGH ← recommends split
|
|
21
|
+
* 21+ → CRITICAL ← strongly recommends split
|
|
22
|
+
*
|
|
23
|
+
* The thresholds are tunable via `dare.config.json#refine.thresholds` (see
|
|
24
|
+
* Frente 4) — defaults below.
|
|
25
|
+
*/
|
|
26
|
+
import fs from 'fs-extra';
|
|
27
|
+
import path from 'path';
|
|
28
|
+
import { findSpecFile, parseFilesFromSpec } from './ReviewRunner.js';
|
|
29
|
+
export const DEFAULT_THRESHOLDS = {
|
|
30
|
+
low: 5,
|
|
31
|
+
med: 12,
|
|
32
|
+
high: 20,
|
|
33
|
+
};
|
|
34
|
+
/** Maximum contribution from any single signal — keeps the score bounded. */
|
|
35
|
+
const SIGNAL_CAPS = {
|
|
36
|
+
files: 10,
|
|
37
|
+
functions: 10,
|
|
38
|
+
tests: 8,
|
|
39
|
+
};
|
|
40
|
+
/** Weights per occurrence. */
|
|
41
|
+
const WEIGHTS = {
|
|
42
|
+
perFile: 1,
|
|
43
|
+
perFunction: 1.5,
|
|
44
|
+
perTest: 0.5,
|
|
45
|
+
perDependency: 0.5,
|
|
46
|
+
heavyKeyword: 2,
|
|
47
|
+
authorDeclaredHigh: 3,
|
|
48
|
+
};
|
|
49
|
+
/** Keywords that historically correlate with "this is bigger than it looks". */
|
|
50
|
+
const HEAVY_KEYWORDS = [
|
|
51
|
+
'refactor',
|
|
52
|
+
'refatorar',
|
|
53
|
+
'migrate',
|
|
54
|
+
'migrar',
|
|
55
|
+
'migração',
|
|
56
|
+
'integrate',
|
|
57
|
+
'integrar',
|
|
58
|
+
'integração',
|
|
59
|
+
'multiple',
|
|
60
|
+
'múltiplos',
|
|
61
|
+
'audit',
|
|
62
|
+
'auditar',
|
|
63
|
+
'replace',
|
|
64
|
+
'substituir',
|
|
65
|
+
'rewrite',
|
|
66
|
+
'reescrever',
|
|
67
|
+
'parallelize',
|
|
68
|
+
'paralelizar',
|
|
69
|
+
'cross-cutting',
|
|
70
|
+
'orchestrate',
|
|
71
|
+
'orquestrar',
|
|
72
|
+
];
|
|
73
|
+
// ── Signal extractors ────────────────────────────────────────────────────────
|
|
74
|
+
/**
|
|
75
|
+
* Count public functions/endpoints declared in the spec. We look at:
|
|
76
|
+
* - "Implementar `POST /…`" style mentions
|
|
77
|
+
* - "função `name()`" / "function `name()`"
|
|
78
|
+
* - Code-fence assinaturas (`fn x() -> ...`, `function x()`, `def x()`)
|
|
79
|
+
*
|
|
80
|
+
* Imperfect, but consistent — the test for refinement is "does this slope
|
|
81
|
+
* up monotonically with effort?", not "is this exact?".
|
|
82
|
+
*/
|
|
83
|
+
function countDeclaredFunctions(specMarkdown) {
|
|
84
|
+
const patterns = [
|
|
85
|
+
// HTTP verbs inside backticks: `POST /auth/login`, `GET /users/:id`
|
|
86
|
+
/`(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+\/[^`]+`/gi,
|
|
87
|
+
// Function-like in backticks: `name()`, `name(arg: Type)`
|
|
88
|
+
/`\w+\s*\([^)]*\)`/g,
|
|
89
|
+
// Inline `fn x(...)` / `function x(...)` / `def x(...)` / `func x(...)`
|
|
90
|
+
/\b(function|fn|func|def|method)\s+\w+\s*\(/g,
|
|
91
|
+
];
|
|
92
|
+
let total = 0;
|
|
93
|
+
for (const re of patterns) {
|
|
94
|
+
const matches = specMarkdown.match(re);
|
|
95
|
+
if (matches)
|
|
96
|
+
total += matches.length;
|
|
97
|
+
}
|
|
98
|
+
// Deduplicate-ish: a single endpoint may match both verb pattern and code-block.
|
|
99
|
+
// Halve to avoid double-counting; floor so a single hit still counts as 1.
|
|
100
|
+
return Math.max(1, Math.floor(total / 2));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Count test cases listed in the spec. We look at checkbox-style entries
|
|
104
|
+
* under the "Testes" / "Testing" section and `should_*` / `it(...)` names.
|
|
105
|
+
*/
|
|
106
|
+
function countDeclaredTests(specMarkdown) {
|
|
107
|
+
const patterns = [
|
|
108
|
+
/^\s*-\s*\[\s*\]\s*(Teste|Test)\b/gim,
|
|
109
|
+
/\bshould_[a-z_]+/g,
|
|
110
|
+
/\bit\(['"]/g,
|
|
111
|
+
];
|
|
112
|
+
let total = 0;
|
|
113
|
+
for (const re of patterns) {
|
|
114
|
+
const matches = specMarkdown.match(re);
|
|
115
|
+
if (matches)
|
|
116
|
+
total += matches.length;
|
|
117
|
+
}
|
|
118
|
+
return total;
|
|
119
|
+
}
|
|
120
|
+
/** Count occurrences of heavy keywords (case-insensitive, word-boundary). */
|
|
121
|
+
function countHeavyKeywords(specMarkdown) {
|
|
122
|
+
const lower = specMarkdown.toLowerCase();
|
|
123
|
+
let total = 0;
|
|
124
|
+
for (const kw of HEAVY_KEYWORDS) {
|
|
125
|
+
const re = new RegExp(`\\b${kw.toLowerCase()}\\b`, 'g');
|
|
126
|
+
const matches = lower.match(re);
|
|
127
|
+
if (matches)
|
|
128
|
+
total += matches.length;
|
|
129
|
+
}
|
|
130
|
+
return total;
|
|
131
|
+
}
|
|
132
|
+
/** Parse `**Complexidade:** HIGH` or similar from the spec header. */
|
|
133
|
+
function authorDeclaredHigh(specMarkdown) {
|
|
134
|
+
return /\*\*Complexidade:\*\*\s*HIGH/i.test(specMarkdown);
|
|
135
|
+
}
|
|
136
|
+
// ── Bucket selection ─────────────────────────────────────────────────────────
|
|
137
|
+
export function levelFromScore(score, thresholds = DEFAULT_THRESHOLDS) {
|
|
138
|
+
if (score <= thresholds.low)
|
|
139
|
+
return 'LOW';
|
|
140
|
+
if (score <= thresholds.med)
|
|
141
|
+
return 'MED';
|
|
142
|
+
if (score <= thresholds.high)
|
|
143
|
+
return 'HIGH';
|
|
144
|
+
return 'CRITICAL';
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Build a complexity report for a single task. Returns `null` if the spec
|
|
148
|
+
* can't be found, so the caller can produce a user-friendly error.
|
|
149
|
+
*/
|
|
150
|
+
export async function analyzeTaskComplexity(taskId, projectRoot, options = {}) {
|
|
151
|
+
const specPath = await findSpecFile(projectRoot, taskId);
|
|
152
|
+
if (!specPath) {
|
|
153
|
+
return {
|
|
154
|
+
taskId,
|
|
155
|
+
specPath: null,
|
|
156
|
+
score: 0,
|
|
157
|
+
level: 'LOW',
|
|
158
|
+
recommendsSplit: false,
|
|
159
|
+
signals: [
|
|
160
|
+
{ kind: 'no-spec', weight: 0, detail: 'Spec não encontrada — refinamento ignorado.' },
|
|
161
|
+
],
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const md = await fs.readFile(specPath, 'utf-8');
|
|
165
|
+
const projectRelSpec = path.relative(projectRoot, specPath).replace(/\\/g, '/');
|
|
166
|
+
const fileCount = parseFilesFromSpec(md).length;
|
|
167
|
+
const fnCount = countDeclaredFunctions(md);
|
|
168
|
+
const testCount = countDeclaredTests(md);
|
|
169
|
+
const kwCount = countHeavyKeywords(md);
|
|
170
|
+
const deps = options.dependsOnCount ?? 0;
|
|
171
|
+
const high = authorDeclaredHigh(md);
|
|
172
|
+
const signals = [];
|
|
173
|
+
if (fileCount > 0) {
|
|
174
|
+
const w = Math.min(fileCount, SIGNAL_CAPS.files) * WEIGHTS.perFile;
|
|
175
|
+
signals.push({
|
|
176
|
+
kind: 'files',
|
|
177
|
+
weight: w,
|
|
178
|
+
detail: `${fileCount} arquivo(s) a criar/modificar`,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
if (fnCount > 0) {
|
|
182
|
+
const w = Math.min(fnCount, SIGNAL_CAPS.functions) * WEIGHTS.perFunction;
|
|
183
|
+
signals.push({
|
|
184
|
+
kind: 'functions',
|
|
185
|
+
weight: w,
|
|
186
|
+
detail: `${fnCount} função(ões)/endpoint(s) público(s)`,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
if (testCount > 0) {
|
|
190
|
+
const w = Math.min(testCount, SIGNAL_CAPS.tests) * WEIGHTS.perTest;
|
|
191
|
+
signals.push({
|
|
192
|
+
kind: 'tests',
|
|
193
|
+
weight: w,
|
|
194
|
+
detail: `${testCount} teste(s) declarado(s)`,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
if (deps > 0) {
|
|
198
|
+
signals.push({
|
|
199
|
+
kind: 'dependencies',
|
|
200
|
+
weight: deps * WEIGHTS.perDependency,
|
|
201
|
+
detail: `${deps} dependência(s) (depends_on)`,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
if (kwCount > 0) {
|
|
205
|
+
signals.push({
|
|
206
|
+
kind: 'keywords',
|
|
207
|
+
weight: kwCount * WEIGHTS.heavyKeyword,
|
|
208
|
+
detail: `${kwCount} palavra-chave(s) "pesada(s)" (refactor/migrate/integrate/...)`,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if (high) {
|
|
212
|
+
signals.push({
|
|
213
|
+
kind: 'author-high',
|
|
214
|
+
weight: WEIGHTS.authorDeclaredHigh,
|
|
215
|
+
detail: 'Spec já declarada como HIGH pelo autor',
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
signals.sort((a, b) => b.weight - a.weight);
|
|
219
|
+
const score = signals.reduce((acc, s) => acc + s.weight, 0);
|
|
220
|
+
const level = levelFromScore(score, options.thresholds ?? DEFAULT_THRESHOLDS);
|
|
221
|
+
const recommendsSplit = level === 'HIGH' || level === 'CRITICAL';
|
|
222
|
+
return {
|
|
223
|
+
taskId,
|
|
224
|
+
specPath: projectRelSpec,
|
|
225
|
+
score,
|
|
226
|
+
level,
|
|
227
|
+
recommendsSplit,
|
|
228
|
+
signals,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// ── Split proposal ───────────────────────────────────────────────────────────
|
|
232
|
+
/**
|
|
233
|
+
* Produce a coarse split proposal. The algorithm:
|
|
234
|
+
* 1. Group files by top-level directory (e.g. `src/auth/*` vs `tests/*`
|
|
235
|
+
* vs `migrations/*`).
|
|
236
|
+
* 2. Each group becomes a candidate sub-task. If a group has more than
|
|
237
|
+
* `maxFilesPerSubtask` files, split it further alphabetically.
|
|
238
|
+
* 3. Generate suffixed ids: `task-034a`, `task-034b`, ...
|
|
239
|
+
*
|
|
240
|
+
* Intentionally not too clever — the IDE agent (via the `dare-refine` skill)
|
|
241
|
+
* is expected to refine this with semantic awareness. The CLI proposal is
|
|
242
|
+
* a sane default that gets it 70% of the way there.
|
|
243
|
+
*/
|
|
244
|
+
export function proposeSplit(taskId, files, options = {}) {
|
|
245
|
+
const maxFiles = options.maxFilesPerSubtask ?? 4;
|
|
246
|
+
if (files.length === 0) {
|
|
247
|
+
return {
|
|
248
|
+
originalTaskId: taskId,
|
|
249
|
+
subtasks: [],
|
|
250
|
+
notes: 'Nenhum arquivo listado na spec — split automático impossível. ' +
|
|
251
|
+
'Adicione a tabela "ARQUIVOS A CRIAR / MODIFICAR" ou rode `/dare-refine <id>` para o agente sugerir.',
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// Group by top-level directory (or first 2 segments if same root).
|
|
255
|
+
const groups = new Map();
|
|
256
|
+
for (const f of files) {
|
|
257
|
+
const parts = f.split('/');
|
|
258
|
+
const key = parts.length >= 2 ? `${parts[0]}/${parts[1]}` : parts[0];
|
|
259
|
+
if (!groups.has(key))
|
|
260
|
+
groups.set(key, []);
|
|
261
|
+
groups.get(key).push(f);
|
|
262
|
+
}
|
|
263
|
+
const subtasks = [];
|
|
264
|
+
let suffixIdx = 0;
|
|
265
|
+
for (const [groupKey, groupFiles] of groups) {
|
|
266
|
+
// Split overlarge groups alphabetically.
|
|
267
|
+
const sorted = [...groupFiles].sort();
|
|
268
|
+
const chunks = [];
|
|
269
|
+
for (let i = 0; i < sorted.length; i += maxFiles) {
|
|
270
|
+
chunks.push(sorted.slice(i, i + maxFiles));
|
|
271
|
+
}
|
|
272
|
+
for (const chunk of chunks) {
|
|
273
|
+
const suffix = String.fromCharCode(97 + suffixIdx); // a, b, c, ...
|
|
274
|
+
suffixIdx++;
|
|
275
|
+
subtasks.push({
|
|
276
|
+
id: `${taskId}${suffix}`,
|
|
277
|
+
title: `${taskId}${suffix}: ${groupKey}`,
|
|
278
|
+
files: chunk,
|
|
279
|
+
rationale: `Slice de ${groupKey} (${chunk.length} arquivo(s)) — cabe em uma conversa.`,
|
|
280
|
+
estimatedLevel: chunk.length >= maxFiles ? 'MED' : 'LOW',
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
originalTaskId: taskId,
|
|
286
|
+
subtasks,
|
|
287
|
+
notes: `Split proposto em ${subtasks.length} sub-task(s) agrupando por diretório raiz. ` +
|
|
288
|
+
`Cada slice fica ≤ ${maxFiles} arquivos. Revise: o agrupamento por diretório é uma heurística — ` +
|
|
289
|
+
`o agente pode reorganizar se o domínio sugerir slices melhores.`,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=complexity-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-analyzer.js","sourceRoot":"","sources":["../../src/utils/complexity-analyzer.ts"],"names":[],"mappings":"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"}
|