@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,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applies an `UpdatePlan` to a project on disk.
|
|
3
|
+
*
|
|
4
|
+
* The detector decides *what* would happen; the applier actually writes files,
|
|
5
|
+
* backs up the previous state, prompts on conflicts and runs migrations. Kept
|
|
6
|
+
* separate so unit tests can poke the detector without touching the filesystem.
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import inquirer from 'inquirer';
|
|
12
|
+
import { fileURLToPath } from 'url';
|
|
13
|
+
import { classifyChange, readProjectConfig } from './UpdateDetector.js';
|
|
14
|
+
/** Where templates ship inside the CLI bundle. */
|
|
15
|
+
function getTemplatesRoot() {
|
|
16
|
+
const here = fileURLToPath(import.meta.url);
|
|
17
|
+
return path.resolve(path.dirname(here), '..', '..', 'templates');
|
|
18
|
+
}
|
|
19
|
+
/** Resolve the template source for a change (defaults to mirroring `path`). */
|
|
20
|
+
function resolveTemplateSource(change) {
|
|
21
|
+
const rel = change.templateSource ?? change.path;
|
|
22
|
+
return path.join(getTemplatesRoot(), rel);
|
|
23
|
+
}
|
|
24
|
+
/** Read the new template content for a non-schema change. */
|
|
25
|
+
async function readNewContent(change) {
|
|
26
|
+
if (change.path.includes('#'))
|
|
27
|
+
return null; // schema-only
|
|
28
|
+
if (change.type === 'removed')
|
|
29
|
+
return null;
|
|
30
|
+
const source = resolveTemplateSource(change);
|
|
31
|
+
if (!(await fs.pathExists(source))) {
|
|
32
|
+
throw new Error(`Template source missing for change "${change.path}" (expected at ${source}). ` +
|
|
33
|
+
`Make sure the manifest's templateSource is correct or that templates/ ships the file.`);
|
|
34
|
+
}
|
|
35
|
+
return fs.readFile(source);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Snapshot every file the plan touches into `backupDir`, preserving its
|
|
39
|
+
* relative path. Touches only files that currently exist.
|
|
40
|
+
*/
|
|
41
|
+
export async function backupAffectedFiles(plan, projectRoot, backupDir) {
|
|
42
|
+
let copied = 0;
|
|
43
|
+
for (const change of plan.applicableChanges) {
|
|
44
|
+
if (change.path.includes('#'))
|
|
45
|
+
continue;
|
|
46
|
+
const src = path.join(projectRoot, change.path);
|
|
47
|
+
if (!(await fs.pathExists(src)))
|
|
48
|
+
continue;
|
|
49
|
+
const dest = path.join(backupDir, change.path);
|
|
50
|
+
await fs.ensureDir(path.dirname(dest));
|
|
51
|
+
await fs.copy(src, dest);
|
|
52
|
+
copied++;
|
|
53
|
+
}
|
|
54
|
+
return copied;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Prompt the dev on a customized file. Returns the action to take.
|
|
58
|
+
*
|
|
59
|
+
* Honors `conflictPolicy` to skip the prompt in non-interactive flows
|
|
60
|
+
* (CI, scripted updates) — `'keep'` preserves the local file, `'replace'`
|
|
61
|
+
* overwrites it.
|
|
62
|
+
*/
|
|
63
|
+
async function resolveCustomization(change, conflictPolicy) {
|
|
64
|
+
if (conflictPolicy !== 'ask')
|
|
65
|
+
return conflictPolicy;
|
|
66
|
+
const { decision } = (await inquirer.prompt([
|
|
67
|
+
{
|
|
68
|
+
type: 'list',
|
|
69
|
+
name: 'decision',
|
|
70
|
+
message: `Arquivo customizado: ${chalk.yellow(change.path)}\n ${chalk.gray(change.description)}`,
|
|
71
|
+
choices: [
|
|
72
|
+
{ name: '🔒 Manter minha versão (recomendado se você editou)', value: 'keep' },
|
|
73
|
+
{ name: '⬆️ Substituir pela versão nova do DARE', value: 'replace' },
|
|
74
|
+
],
|
|
75
|
+
default: 'keep',
|
|
76
|
+
},
|
|
77
|
+
]));
|
|
78
|
+
return decision;
|
|
79
|
+
}
|
|
80
|
+
async function applyOne(change, projectRoot, conflictPolicy, dryRun) {
|
|
81
|
+
// Schema-only ("dare.config.json#field") — migrations handle these.
|
|
82
|
+
if (change.path.includes('#')) {
|
|
83
|
+
return { change, resolution: 'apply', action: 'skipped' };
|
|
84
|
+
}
|
|
85
|
+
const target = path.join(projectRoot, change.path);
|
|
86
|
+
const newContent = await readNewContent(change);
|
|
87
|
+
const resolution = await classifyChange(projectRoot, change, newContent);
|
|
88
|
+
if (resolution === 'identical') {
|
|
89
|
+
return { change, resolution, action: 'skipped' };
|
|
90
|
+
}
|
|
91
|
+
if (change.type === 'removed') {
|
|
92
|
+
if (!dryRun && (await fs.pathExists(target))) {
|
|
93
|
+
await fs.remove(target);
|
|
94
|
+
}
|
|
95
|
+
return { change, resolution, action: 'deleted' };
|
|
96
|
+
}
|
|
97
|
+
if (resolution === 'customized') {
|
|
98
|
+
const decision = await resolveCustomization(change, conflictPolicy);
|
|
99
|
+
if (decision === 'keep') {
|
|
100
|
+
return { change, resolution, action: 'kept-custom' };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (change.type === 'renamed' && change.previousPath) {
|
|
104
|
+
const prev = path.join(projectRoot, change.previousPath);
|
|
105
|
+
if (!dryRun && (await fs.pathExists(prev))) {
|
|
106
|
+
await fs.remove(prev);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (newContent && !dryRun) {
|
|
110
|
+
await fs.ensureDir(path.dirname(target));
|
|
111
|
+
await fs.writeFile(target, newContent);
|
|
112
|
+
}
|
|
113
|
+
return { change, resolution, action: 'wrote' };
|
|
114
|
+
}
|
|
115
|
+
/** Run all migrations declared in the plan (post file changes). */
|
|
116
|
+
async function runMigrations(plan, projectRoot, dryRun) {
|
|
117
|
+
const ran = [];
|
|
118
|
+
for (const { release } of plan.pendingReleases) {
|
|
119
|
+
if (!release.migrations)
|
|
120
|
+
continue;
|
|
121
|
+
for (const migration of release.migrations) {
|
|
122
|
+
if (dryRun) {
|
|
123
|
+
ran.push(migration);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
await runMigration(migration, projectRoot);
|
|
127
|
+
ran.push(migration);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return ran;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Built-in migrations. Each `id` maps to a handler — unknown ids are skipped
|
|
134
|
+
* with a warning so an older CLI can still apply a partial update.
|
|
135
|
+
*/
|
|
136
|
+
async function runMigration(migration, projectRoot) {
|
|
137
|
+
switch (migration.id) {
|
|
138
|
+
case 'unify-version-field': {
|
|
139
|
+
// Pre-2.17 projects wrote `version: "0.1.0"` (zombie placeholder) and
|
|
140
|
+
// an early prototype briefly used `dareVersion`. Consolidate both into
|
|
141
|
+
// a single `version` field that now tracks the DARE release.
|
|
142
|
+
const configPath = path.join(projectRoot, 'dare.config.json');
|
|
143
|
+
const cfg = (await readProjectConfig(projectRoot));
|
|
144
|
+
const legacyDareVersion = cfg.dareVersion;
|
|
145
|
+
if (legacyDareVersion) {
|
|
146
|
+
cfg.version = legacyDareVersion;
|
|
147
|
+
delete cfg.dareVersion;
|
|
148
|
+
}
|
|
149
|
+
else if (!cfg.version || cfg.version === '0.1.0') {
|
|
150
|
+
cfg.version = '2.16.0';
|
|
151
|
+
}
|
|
152
|
+
await fs.writeJSON(configPath, cfg, { spaces: 2 });
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
case 'add-review-refine-defaults': {
|
|
156
|
+
// Seed the new review/refine objects so dev can see they exist (and
|
|
157
|
+
// edit). Opt-in stance for legacy projects — review.onComplete: false
|
|
158
|
+
// means the gate is silent until the dev flips it.
|
|
159
|
+
const configPath = path.join(projectRoot, 'dare.config.json');
|
|
160
|
+
const cfg = (await readProjectConfig(projectRoot));
|
|
161
|
+
if (!cfg.review) {
|
|
162
|
+
cfg.review = { onComplete: false, strict: false };
|
|
163
|
+
}
|
|
164
|
+
if (!cfg.refine) {
|
|
165
|
+
cfg.refine = { thresholds: { low: 5, med: 12, high: 20 } };
|
|
166
|
+
}
|
|
167
|
+
await fs.writeJSON(configPath, cfg, { spaces: 2 });
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
default:
|
|
171
|
+
console.log(chalk.yellow(` ⚠ Unknown migration "${migration.id}" — skipping (CLI may be outdated).`));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Bump `version` in `dare.config.json` to the plan's target version. */
|
|
175
|
+
async function stampVersion(projectRoot, toVersion) {
|
|
176
|
+
const configPath = path.join(projectRoot, 'dare.config.json');
|
|
177
|
+
const cfg = (await readProjectConfig(projectRoot));
|
|
178
|
+
cfg.version = toVersion;
|
|
179
|
+
cfg.updatedAt = new Date().toISOString();
|
|
180
|
+
await fs.writeJSON(configPath, cfg, { spaces: 2 });
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Execute the plan. Returns a structured result so the command can print a
|
|
184
|
+
* sensible summary at the end.
|
|
185
|
+
*/
|
|
186
|
+
export async function applyPlan(plan, options) {
|
|
187
|
+
const { projectRoot, backupDir, force = false, dryRun = false, conflictPolicy = force ? 'replace' : 'ask', } = options;
|
|
188
|
+
let backupPath = null;
|
|
189
|
+
let backupFilesCount = 0;
|
|
190
|
+
if (!dryRun) {
|
|
191
|
+
backupPath =
|
|
192
|
+
backupDir ?? path.join(projectRoot, '.dare', `backup-${plan.fromVersion}`);
|
|
193
|
+
await fs.ensureDir(backupPath);
|
|
194
|
+
backupFilesCount = await backupAffectedFiles(plan, projectRoot, backupPath);
|
|
195
|
+
}
|
|
196
|
+
const outcomes = [];
|
|
197
|
+
for (const change of plan.applicableChanges) {
|
|
198
|
+
const outcome = await applyOne(change, projectRoot, conflictPolicy, dryRun);
|
|
199
|
+
outcomes.push(outcome);
|
|
200
|
+
}
|
|
201
|
+
const migrationsRan = await runMigrations(plan, projectRoot, dryRun);
|
|
202
|
+
if (!dryRun) {
|
|
203
|
+
await stampVersion(projectRoot, plan.toVersion);
|
|
204
|
+
}
|
|
205
|
+
return { outcomes, migrationsRan, backupPath, backupFilesCount };
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=UpdateApplier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpdateApplier.js","sourceRoot":"","sources":["../../src/utils/UpdateApplier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects what `dare update` needs to do for a given project.
|
|
3
|
+
*
|
|
4
|
+
* Pure planning — it never writes to disk. Loads the manifest, reads the
|
|
5
|
+
* project's `dare.config.json`, and produces an `UpdatePlan` the applier can
|
|
6
|
+
* execute (or the dev can simply preview with `--dry-run`).
|
|
7
|
+
*/
|
|
8
|
+
import type { ConflictResolution, ManifestChange, UpdateManifest, UpdatePlan } from '../types/UpdateManifest.types.js';
|
|
9
|
+
export declare function loadManifest(): Promise<UpdateManifest>;
|
|
10
|
+
/** Read the current CLI version from the bundled `package.json`. */
|
|
11
|
+
export declare function getCliVersion(): string;
|
|
12
|
+
export interface ProjectConfig {
|
|
13
|
+
ide?: string;
|
|
14
|
+
version?: string;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
/** Baseline assumed for projects with the legacy placeholder or no `version`. */
|
|
18
|
+
export declare const LEGACY_BASELINE_VERSION = "2.16.0";
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the "effective DARE version" of a project, handling the legacy
|
|
21
|
+
* `"0.1.0"` placeholder that was hardcoded by pre-2.17 `dare init`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveProjectVersion(cfg: ProjectConfig): {
|
|
24
|
+
version: string;
|
|
25
|
+
isLegacy: boolean;
|
|
26
|
+
};
|
|
27
|
+
/** Load and return `dare.config.json` from the given project root. */
|
|
28
|
+
export declare function readProjectConfig(projectRoot: string): Promise<ProjectConfig>;
|
|
29
|
+
/**
|
|
30
|
+
* Filter a single change against the IDE configured for this project. A change
|
|
31
|
+
* with `appliesTo: ['*']` (or no `appliesTo`) is universal.
|
|
32
|
+
*
|
|
33
|
+
* Hybrid setups (`hybrid` = cursor+antigravity, `claude-hybrid` = claude+cursor)
|
|
34
|
+
* accept changes targeted at any of their member IDEs.
|
|
35
|
+
*/
|
|
36
|
+
export declare function changeAppliesToIde(change: ManifestChange, ide: string | undefined): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Build the update plan: every release between `from` (exclusive) and `to`
|
|
39
|
+
* (inclusive), with its changes filtered down to what applies to this IDE.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildUpdatePlan(manifest: UpdateManifest, fromVersion: string, toVersion: string, ide: string | undefined): UpdatePlan;
|
|
42
|
+
/** SHA-256 hex digest of file content; returns `null` if the file is absent. */
|
|
43
|
+
export declare function hashFile(absPath: string): Promise<string | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Classify what we'd be doing to a single file on disk:
|
|
46
|
+
* - `identical` → new template content already matches what's on disk
|
|
47
|
+
* - `missing` → file absent in the project, safe to create
|
|
48
|
+
* - `apply` → file present and matches `previousHash`, safe to overwrite
|
|
49
|
+
* - `customized` → file present but doesn't match `previousHash`; ask the dev
|
|
50
|
+
*
|
|
51
|
+
* `newContent` is the bytes we'd write; `previousHash` is the manifest's record
|
|
52
|
+
* of what the file looked like in the prior version (optional — without it we
|
|
53
|
+
* can't tell `apply` from `customized` and conservatively return `customized`).
|
|
54
|
+
*/
|
|
55
|
+
export declare function classifyChange(projectRoot: string, change: ManifestChange, newContent: Buffer | string | null): Promise<ConflictResolution>;
|
|
56
|
+
//# sourceMappingURL=UpdateDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpdateDetector.d.ts","sourceRoot":"","sources":["../../src/utils/UpdateDetector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EACV,kBAAkB,EAElB,cAAc,EACd,cAAc,EACd,UAAU,EACX,MAAM,kCAAkC,CAAC;AAiB1C,wBAAsB,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC,CAY5D;AAED,oEAAoE;AACpE,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AASD,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAMA;AAED,sEAAsE;AACtE,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAQnF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAe3F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,UAAU,CA8BZ;AAED,gFAAgF;AAChF,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAItE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GACjC,OAAO,CAAC,kBAAkB,CAAC,CA2B7B"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects what `dare update` needs to do for a given project.
|
|
3
|
+
*
|
|
4
|
+
* Pure planning — it never writes to disk. Loads the manifest, reads the
|
|
5
|
+
* project's `dare.config.json`, and produces an `UpdatePlan` the applier can
|
|
6
|
+
* execute (or the dev can simply preview with `--dry-run`).
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import crypto from 'crypto';
|
|
11
|
+
import { createRequire } from 'module';
|
|
12
|
+
import { fileURLToPath } from 'url';
|
|
13
|
+
import { compareVersions, isNewerThan, sortVersionsAscending, } from './version-compare.js';
|
|
14
|
+
const require = createRequire(import.meta.url);
|
|
15
|
+
/** Path to `templates/UPDATE-MANIFEST.json`, shipped with the CLI. */
|
|
16
|
+
function getManifestPath() {
|
|
17
|
+
// `import.meta.url` resolves to .../dist/utils/UpdateDetector.js once built.
|
|
18
|
+
// The manifest lives at .../templates/UPDATE-MANIFEST.json, two levels up.
|
|
19
|
+
const here = fileURLToPath(import.meta.url);
|
|
20
|
+
return path.resolve(path.dirname(here), '..', '..', 'templates', 'UPDATE-MANIFEST.json');
|
|
21
|
+
}
|
|
22
|
+
export async function loadManifest() {
|
|
23
|
+
const manifestPath = getManifestPath();
|
|
24
|
+
if (!(await fs.pathExists(manifestPath))) {
|
|
25
|
+
throw new Error(`UPDATE-MANIFEST.json not found at ${manifestPath}`);
|
|
26
|
+
}
|
|
27
|
+
const data = (await fs.readJSON(manifestPath));
|
|
28
|
+
if (data.schemaVersion !== 1) {
|
|
29
|
+
throw new Error(`Unsupported manifest schemaVersion ${data.schemaVersion} (this CLI understands 1).`);
|
|
30
|
+
}
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
/** Read the current CLI version from the bundled `package.json`. */
|
|
34
|
+
export function getCliVersion() {
|
|
35
|
+
const pkg = require('../../package.json');
|
|
36
|
+
return pkg.version;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Legacy `dare init` versions (pre-2.17) wrote a hardcoded `"0.1.0"` placeholder
|
|
40
|
+
* that nothing read. Treat it as "this project was never tracked" — the update
|
|
41
|
+
* flow will assume the project is on 2.16.0 (the last release before this field
|
|
42
|
+
* carried meaning) and run the unification migration.
|
|
43
|
+
*/
|
|
44
|
+
const LEGACY_PLACEHOLDER_VERSION = '0.1.0';
|
|
45
|
+
/** Baseline assumed for projects with the legacy placeholder or no `version`. */
|
|
46
|
+
export const LEGACY_BASELINE_VERSION = '2.16.0';
|
|
47
|
+
/**
|
|
48
|
+
* Resolve the "effective DARE version" of a project, handling the legacy
|
|
49
|
+
* `"0.1.0"` placeholder that was hardcoded by pre-2.17 `dare init`.
|
|
50
|
+
*/
|
|
51
|
+
export function resolveProjectVersion(cfg) {
|
|
52
|
+
const raw = cfg.version;
|
|
53
|
+
if (!raw || raw === LEGACY_PLACEHOLDER_VERSION) {
|
|
54
|
+
return { version: LEGACY_BASELINE_VERSION, isLegacy: true };
|
|
55
|
+
}
|
|
56
|
+
return { version: raw, isLegacy: false };
|
|
57
|
+
}
|
|
58
|
+
/** Load and return `dare.config.json` from the given project root. */
|
|
59
|
+
export async function readProjectConfig(projectRoot) {
|
|
60
|
+
const configPath = path.join(projectRoot, 'dare.config.json');
|
|
61
|
+
if (!(await fs.pathExists(configPath))) {
|
|
62
|
+
throw new Error(`dare.config.json not found in ${projectRoot}. Is this a DARE project? Run \`dare init\` first.`);
|
|
63
|
+
}
|
|
64
|
+
return (await fs.readJSON(configPath));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Filter a single change against the IDE configured for this project. A change
|
|
68
|
+
* with `appliesTo: ['*']` (or no `appliesTo`) is universal.
|
|
69
|
+
*
|
|
70
|
+
* Hybrid setups (`hybrid` = cursor+antigravity, `claude-hybrid` = claude+cursor)
|
|
71
|
+
* accept changes targeted at any of their member IDEs.
|
|
72
|
+
*/
|
|
73
|
+
export function changeAppliesToIde(change, ide) {
|
|
74
|
+
const targets = change.appliesTo ?? ['*'];
|
|
75
|
+
if (targets.includes('*'))
|
|
76
|
+
return true;
|
|
77
|
+
if (!ide)
|
|
78
|
+
return false;
|
|
79
|
+
if (targets.includes(ide))
|
|
80
|
+
return true;
|
|
81
|
+
// Hybrid expansions
|
|
82
|
+
if (ide === 'hybrid') {
|
|
83
|
+
return targets.includes('cursor') || targets.includes('antigravity');
|
|
84
|
+
}
|
|
85
|
+
if (ide === 'claude-hybrid') {
|
|
86
|
+
return targets.includes('claude-code') || targets.includes('cursor');
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build the update plan: every release between `from` (exclusive) and `to`
|
|
92
|
+
* (inclusive), with its changes filtered down to what applies to this IDE.
|
|
93
|
+
*/
|
|
94
|
+
export function buildUpdatePlan(manifest, fromVersion, toVersion, ide) {
|
|
95
|
+
const allVersions = Object.keys(manifest.releases);
|
|
96
|
+
const sorted = sortVersionsAscending(allVersions);
|
|
97
|
+
const pending = sorted.filter((v) => {
|
|
98
|
+
const newerThanFrom = isNewerThan(v, fromVersion);
|
|
99
|
+
const notNewerThanTo = compareVersions(v, toVersion) !== 1;
|
|
100
|
+
return newerThanFrom && notNewerThanTo;
|
|
101
|
+
});
|
|
102
|
+
const pendingReleases = pending.map((version) => ({
|
|
103
|
+
version,
|
|
104
|
+
release: manifest.releases[version],
|
|
105
|
+
}));
|
|
106
|
+
const applicableChanges = [];
|
|
107
|
+
for (const { release } of pendingReleases) {
|
|
108
|
+
for (const change of release.changes) {
|
|
109
|
+
if (changeAppliesToIde(change, ide)) {
|
|
110
|
+
applicableChanges.push(change);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
fromVersion,
|
|
116
|
+
toVersion,
|
|
117
|
+
pendingReleases,
|
|
118
|
+
applicableChanges,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/** SHA-256 hex digest of file content; returns `null` if the file is absent. */
|
|
122
|
+
export async function hashFile(absPath) {
|
|
123
|
+
if (!(await fs.pathExists(absPath)))
|
|
124
|
+
return null;
|
|
125
|
+
const buf = await fs.readFile(absPath);
|
|
126
|
+
return crypto.createHash('sha256').update(buf).digest('hex');
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Classify what we'd be doing to a single file on disk:
|
|
130
|
+
* - `identical` → new template content already matches what's on disk
|
|
131
|
+
* - `missing` → file absent in the project, safe to create
|
|
132
|
+
* - `apply` → file present and matches `previousHash`, safe to overwrite
|
|
133
|
+
* - `customized` → file present but doesn't match `previousHash`; ask the dev
|
|
134
|
+
*
|
|
135
|
+
* `newContent` is the bytes we'd write; `previousHash` is the manifest's record
|
|
136
|
+
* of what the file looked like in the prior version (optional — without it we
|
|
137
|
+
* can't tell `apply` from `customized` and conservatively return `customized`).
|
|
138
|
+
*/
|
|
139
|
+
export async function classifyChange(projectRoot, change, newContent) {
|
|
140
|
+
// Schema-only changes (path includes `#`) are handled by migrations,
|
|
141
|
+
// not by file copy. Treat them as `apply`.
|
|
142
|
+
if (change.path.includes('#'))
|
|
143
|
+
return 'apply';
|
|
144
|
+
const target = path.join(projectRoot, change.path);
|
|
145
|
+
const currentHash = await hashFile(target);
|
|
146
|
+
if (change.type === 'removed') {
|
|
147
|
+
return currentHash === null ? 'identical' : 'apply';
|
|
148
|
+
}
|
|
149
|
+
if (currentHash === null)
|
|
150
|
+
return 'missing';
|
|
151
|
+
if (newContent !== null) {
|
|
152
|
+
const newHash = crypto
|
|
153
|
+
.createHash('sha256')
|
|
154
|
+
.update(typeof newContent === 'string' ? Buffer.from(newContent) : newContent)
|
|
155
|
+
.digest('hex');
|
|
156
|
+
if (newHash === currentHash)
|
|
157
|
+
return 'identical';
|
|
158
|
+
}
|
|
159
|
+
if (change.previousHash && currentHash === change.previousHash) {
|
|
160
|
+
return 'apply';
|
|
161
|
+
}
|
|
162
|
+
return 'customized';
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=UpdateDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpdateDetector.js","sourceRoot":"","sources":["../../src/utils/UpdateDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DARE CLI — ASCII art banner
|
|
3
|
+
* Displayed on: dare (no args), dare new, dare --version, dare welcome
|
|
4
|
+
*
|
|
5
|
+
* Suppressed when:
|
|
6
|
+
* - process.stdout.isTTY is false (pipe/redirect)
|
|
7
|
+
* - DARE_NO_BANNER=1 env var
|
|
8
|
+
* - --no-banner global flag
|
|
9
|
+
*
|
|
10
|
+
* License: MIT (D-001)
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Render the DARE ASCII art using the best available figlet font.
|
|
14
|
+
* Falls back through FONT_FALLBACKS until a non-empty result is obtained.
|
|
15
|
+
*/
|
|
16
|
+
export declare function renderBanner(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Print the DARE ASCII art banner to stdout.
|
|
19
|
+
*
|
|
20
|
+
* Respects suppression rules:
|
|
21
|
+
* - !process.stdout.isTTY → silent (unless FORCE_BANNER=1)
|
|
22
|
+
* - DARE_NO_BANNER=1 → silent
|
|
23
|
+
* - options.noColor=true → ANSI green instead of truecolor gradient
|
|
24
|
+
*/
|
|
25
|
+
export declare function printBanner(options?: {
|
|
26
|
+
noColor?: boolean;
|
|
27
|
+
}): void;
|
|
28
|
+
//# sourceMappingURL=banner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyBH;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAUrC;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CA0BrE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DARE CLI — ASCII art banner
|
|
3
|
+
* Displayed on: dare (no args), dare new, dare --version, dare welcome
|
|
4
|
+
*
|
|
5
|
+
* Suppressed when:
|
|
6
|
+
* - process.stdout.isTTY is false (pipe/redirect)
|
|
7
|
+
* - DARE_NO_BANNER=1 env var
|
|
8
|
+
* - --no-banner global flag
|
|
9
|
+
*
|
|
10
|
+
* License: MIT (D-001)
|
|
11
|
+
*/
|
|
12
|
+
import figlet from 'figlet';
|
|
13
|
+
import { createRequire } from 'module';
|
|
14
|
+
// gradient-string is CommonJS — use createRequire for safe ESM interop
|
|
15
|
+
const _require = createRequire(import.meta.url);
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
17
|
+
const gradient = _require('gradient-string');
|
|
18
|
+
const { version } = _require('../../package.json');
|
|
19
|
+
// Dewtech official green palette
|
|
20
|
+
const DEWTECH_GREEN = gradient('#7FD93A', '#5BCB1B', '#3FA00C');
|
|
21
|
+
const FONT_FALLBACKS = [
|
|
22
|
+
'Alligator',
|
|
23
|
+
'Larry 3D',
|
|
24
|
+
'Big',
|
|
25
|
+
'Slant',
|
|
26
|
+
'Standard',
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Render the DARE ASCII art using the best available figlet font.
|
|
30
|
+
* Falls back through FONT_FALLBACKS until a non-empty result is obtained.
|
|
31
|
+
*/
|
|
32
|
+
export function renderBanner() {
|
|
33
|
+
for (const font of FONT_FALLBACKS) {
|
|
34
|
+
try {
|
|
35
|
+
const art = figlet.textSync('DARE', { font, horizontalLayout: 'default' });
|
|
36
|
+
if (art && art.trim().length > 0)
|
|
37
|
+
return art;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// try next font
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return 'DARE'; // ultimate plain-text fallback
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Print the DARE ASCII art banner to stdout.
|
|
47
|
+
*
|
|
48
|
+
* Respects suppression rules:
|
|
49
|
+
* - !process.stdout.isTTY → silent (unless FORCE_BANNER=1)
|
|
50
|
+
* - DARE_NO_BANNER=1 → silent
|
|
51
|
+
* - options.noColor=true → ANSI green instead of truecolor gradient
|
|
52
|
+
*/
|
|
53
|
+
export function printBanner(options = {}) {
|
|
54
|
+
// TTY guard: skip in pipes/redirects unless explicitly forced (e.g. dare welcome)
|
|
55
|
+
if (!process.stdout.isTTY && process.env.FORCE_BANNER !== '1')
|
|
56
|
+
return;
|
|
57
|
+
// Env-var suppression
|
|
58
|
+
if (process.env.DARE_NO_BANNER === '1')
|
|
59
|
+
return;
|
|
60
|
+
const banner = renderBanner();
|
|
61
|
+
const tagline = ' Design · Architecture · Review · Execute';
|
|
62
|
+
const subtitle = ` by Dewtech · dewtech.tech v${version}`;
|
|
63
|
+
// Colour detection: use truecolor gradient when COLORTERM is set, else basic ANSI green
|
|
64
|
+
const supportsColor = !options.noColor &&
|
|
65
|
+
(process.env.COLORTERM === 'truecolor' || process.env.COLORTERM === '24bit');
|
|
66
|
+
if (supportsColor) {
|
|
67
|
+
console.log(DEWTECH_GREEN.multiline(banner));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Fallback: basic ANSI green (works in all terminals)
|
|
71
|
+
console.log('\x1b[32m' + banner + '\x1b[0m');
|
|
72
|
+
}
|
|
73
|
+
console.log('\x1b[90m' + tagline + '\x1b[0m'); // dim grey
|
|
74
|
+
console.log('\x1b[90m' + subtitle + '\x1b[0m');
|
|
75
|
+
console.log();
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,MAAyB,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,uEAAuE;AACvE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,mEAAmE;AACnE,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,CAEC,CAAC;AAE7C,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,oBAAoB,CAAwB,CAAC;AAE1E,iCAAiC;AACjC,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAEhE,MAAM,cAAc,GAAe;IACjC,WAAW;IACX,UAAU;IACV,KAAK;IACL,OAAO;IACP,UAAU;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3E,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,+BAA+B;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,UAAiC,EAAE;IAC7D,kFAAkF;IAClF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG;QAAE,OAAO;IAEtE,sBAAsB;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG;QAAE,OAAO;IAE/C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,4CAA4C,CAAC;IAC7D,MAAM,QAAQ,GAAG,iCAAiC,OAAO,EAAE,CAAC;IAE5D,wFAAwF;IACxF,MAAM,aAAa,GACjB,CAAC,OAAO,CAAC,OAAO;QAChB,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;IAE/E,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW;IAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.spec.d.ts","sourceRoot":"","sources":["../../src/utils/banner.spec.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|