@dewtech/dare-cli 2.17.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -3
- package/dist/__tests__/confidence.test.d.ts +2 -0
- package/dist/__tests__/confidence.test.d.ts.map +1 -0
- package/dist/__tests__/confidence.test.js +73 -0
- package/dist/__tests__/confidence.test.js.map +1 -0
- package/dist/__tests__/datamodel.test.d.ts +2 -0
- package/dist/__tests__/datamodel.test.d.ts.map +1 -0
- package/dist/__tests__/datamodel.test.js +131 -0
- package/dist/__tests__/datamodel.test.js.map +1 -0
- package/dist/__tests__/dna-detector.test.d.ts +2 -0
- package/dist/__tests__/dna-detector.test.d.ts.map +1 -0
- package/dist/__tests__/dna-detector.test.js +97 -0
- package/dist/__tests__/dna-detector.test.js.map +1 -0
- package/dist/__tests__/dna-facts.test.d.ts +2 -0
- package/dist/__tests__/dna-facts.test.d.ts.map +1 -0
- package/dist/__tests__/dna-facts.test.js +44 -0
- package/dist/__tests__/dna-facts.test.js.map +1 -0
- package/dist/__tests__/graph-renderer.test.d.ts +2 -0
- package/dist/__tests__/graph-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/graph-renderer.test.js +85 -0
- package/dist/__tests__/graph-renderer.test.js.map +1 -0
- package/dist/__tests__/migration.test.d.ts +2 -0
- package/dist/__tests__/migration.test.d.ts.map +1 -0
- package/dist/__tests__/migration.test.js +77 -0
- package/dist/__tests__/migration.test.js.map +1 -0
- package/dist/__tests__/module-detector.test.d.ts +2 -0
- package/dist/__tests__/module-detector.test.d.ts.map +1 -0
- package/dist/__tests__/module-detector.test.js +83 -0
- package/dist/__tests__/module-detector.test.js.map +1 -0
- package/dist/__tests__/refine.test.js +49 -49
- package/dist/__tests__/reverse-facts.test.d.ts +2 -0
- package/dist/__tests__/reverse-facts.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-facts.test.js +78 -0
- package/dist/__tests__/reverse-facts.test.js.map +1 -0
- package/dist/__tests__/review.test.js +38 -38
- package/dist/__tests__/validate.test.js +65 -65
- package/dist/bin/dare.js +32 -3
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/blueprint.js +122 -122
- package/dist/commands/dag.d.ts.map +1 -1
- package/dist/commands/dag.js +43 -79
- package/dist/commands/dag.js.map +1 -1
- package/dist/commands/dna.d.ts +3 -0
- package/dist/commands/dna.d.ts.map +1 -0
- package/dist/commands/dna.js +69 -0
- package/dist/commands/dna.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +101 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +16 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +103 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/reverse.d.ts +3 -0
- package/dist/commands/reverse.d.ts.map +1 -0
- package/dist/commands/reverse.js +201 -0
- package/dist/commands/reverse.js.map +1 -0
- package/dist/commands/welcome.d.ts +14 -0
- package/dist/commands/welcome.d.ts.map +1 -0
- package/dist/commands/welcome.js +29 -0
- package/dist/commands/welcome.js.map +1 -0
- package/dist/skills/commands/add.d.ts +23 -0
- package/dist/skills/commands/add.d.ts.map +1 -0
- package/dist/skills/commands/add.js +206 -0
- package/dist/skills/commands/add.js.map +1 -0
- package/dist/skills/commands/info.d.ts +14 -0
- package/dist/skills/commands/info.d.ts.map +1 -0
- package/dist/skills/commands/info.js +99 -0
- package/dist/skills/commands/info.js.map +1 -0
- package/dist/skills/commands/list.d.ts +19 -0
- package/dist/skills/commands/list.d.ts.map +1 -0
- package/dist/skills/commands/list.js +163 -0
- package/dist/skills/commands/list.js.map +1 -0
- package/dist/skills/commands/publish.d.ts +56 -0
- package/dist/skills/commands/publish.d.ts.map +1 -0
- package/dist/skills/commands/publish.js +272 -0
- package/dist/skills/commands/publish.js.map +1 -0
- package/dist/skills/commands/remove.d.ts +19 -0
- package/dist/skills/commands/remove.d.ts.map +1 -0
- package/dist/skills/commands/remove.js +96 -0
- package/dist/skills/commands/remove.js.map +1 -0
- package/dist/skills/commands/update.d.ts +31 -0
- package/dist/skills/commands/update.d.ts.map +1 -0
- package/dist/skills/commands/update.js +132 -0
- package/dist/skills/commands/update.js.map +1 -0
- package/dist/skills/index.d.ts +22 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +33 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/manifest.d.ts +54 -0
- package/dist/skills/manifest.d.ts.map +1 -0
- package/dist/skills/manifest.js +162 -0
- package/dist/skills/manifest.js.map +1 -0
- package/dist/skills/registry-local.d.ts +67 -0
- package/dist/skills/registry-local.d.ts.map +1 -0
- package/dist/skills/registry-local.js +130 -0
- package/dist/skills/registry-local.js.map +1 -0
- package/dist/skills/registry-mock.json +109 -0
- package/dist/skills/registry-remote.d.ts +110 -0
- package/dist/skills/registry-remote.d.ts.map +1 -0
- package/dist/skills/registry-remote.js +246 -0
- package/dist/skills/registry-remote.js.map +1 -0
- package/dist/skills/registry.d.ts +49 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +94 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/tests/manifest.spec.d.ts +8 -0
- package/dist/skills/tests/manifest.spec.d.ts.map +1 -0
- package/dist/skills/tests/manifest.spec.js +176 -0
- package/dist/skills/tests/manifest.spec.js.map +1 -0
- package/dist/skills/tests/publish.spec.d.ts +12 -0
- package/dist/skills/tests/publish.spec.d.ts.map +1 -0
- package/dist/skills/tests/publish.spec.js +276 -0
- package/dist/skills/tests/publish.spec.js.map +1 -0
- package/dist/skills/tests/registry-local.spec.d.ts +8 -0
- package/dist/skills/tests/registry-local.spec.d.ts.map +1 -0
- package/dist/skills/tests/registry-local.spec.js +231 -0
- package/dist/skills/tests/registry-local.spec.js.map +1 -0
- package/dist/skills/tests/registry.spec.d.ts +7 -0
- package/dist/skills/tests/registry.spec.d.ts.map +1 -0
- package/dist/skills/tests/registry.spec.js +58 -0
- package/dist/skills/tests/registry.spec.js.map +1 -0
- package/dist/skills/tests/remote-registry.spec.d.ts +9 -0
- package/dist/skills/tests/remote-registry.spec.d.ts.map +1 -0
- package/dist/skills/tests/remote-registry.spec.js +357 -0
- package/dist/skills/tests/remote-registry.spec.js.map +1 -0
- package/dist/skills/tests/update.spec.d.ts +9 -0
- package/dist/skills/tests/update.spec.d.ts.map +1 -0
- package/dist/skills/tests/update.spec.js +166 -0
- package/dist/skills/tests/update.spec.js.map +1 -0
- package/dist/utils/banner.d.ts +28 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +77 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/banner.spec.d.ts +5 -0
- package/dist/utils/banner.spec.d.ts.map +1 -0
- package/dist/utils/banner.spec.js +253 -0
- package/dist/utils/banner.spec.js.map +1 -0
- package/dist/utils/confidence.d.ts +41 -0
- package/dist/utils/confidence.d.ts.map +1 -0
- package/dist/utils/confidence.js +101 -0
- package/dist/utils/confidence.js.map +1 -0
- package/dist/utils/datamodel.d.ts +41 -0
- package/dist/utils/datamodel.d.ts.map +1 -0
- package/dist/utils/datamodel.js +535 -0
- package/dist/utils/datamodel.js.map +1 -0
- package/dist/utils/dna-detector.d.ts +61 -0
- package/dist/utils/dna-detector.d.ts.map +1 -0
- package/dist/utils/dna-detector.js +354 -0
- package/dist/utils/dna-detector.js.map +1 -0
- package/dist/utils/dna-facts.d.ts +13 -0
- package/dist/utils/dna-facts.d.ts.map +1 -0
- package/dist/utils/dna-facts.js +109 -0
- package/dist/utils/dna-facts.js.map +1 -0
- package/dist/utils/excalidraw-renderer.d.ts +11 -71
- package/dist/utils/excalidraw-renderer.d.ts.map +1 -1
- package/dist/utils/excalidraw-renderer.js +29 -162
- package/dist/utils/excalidraw-renderer.js.map +1 -1
- package/dist/utils/graph-renderer.d.ts +115 -0
- package/dist/utils/graph-renderer.d.ts.map +1 -0
- package/dist/utils/graph-renderer.js +216 -0
- package/dist/utils/graph-renderer.js.map +1 -0
- package/dist/utils/migration.d.ts +64 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +183 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/module-detector.d.ts +46 -0
- package/dist/utils/module-detector.d.ts.map +1 -0
- package/dist/utils/module-detector.js +348 -0
- package/dist/utils/module-detector.js.map +1 -0
- package/dist/utils/project-generator.js +252 -252
- package/dist/utils/reverse-facts.d.ts +50 -0
- package/dist/utils/reverse-facts.d.ts.map +1 -0
- package/dist/utils/reverse-facts.js +291 -0
- package/dist/utils/reverse-facts.js.map +1 -0
- package/dist/utils/stack-bootstrap.js +371 -371
- package/package.json +8 -3
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +48 -48
- package/templates/backend/node-nestjs/.env.example +9 -9
- package/templates/backend/node-nestjs/nest-cli.json +8 -8
- package/templates/backend/node-nestjs/package.json +50 -50
- package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
- package/templates/backend/node-nestjs/src/app.module.ts +15 -15
- package/templates/backend/node-nestjs/src/app.service.ts +8 -8
- package/templates/backend/node-nestjs/src/main.ts +24 -24
- package/templates/backend/node-nestjs/tsconfig.json +21 -21
- package/templates/backend/php-laravel/.env.example +22 -22
- package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
- package/templates/backend/php-laravel/composer.json +40 -40
- package/templates/backend/python-fastapi/.env.example +4 -4
- package/templates/backend/python-fastapi/app/api/router.py +8 -8
- package/templates/backend/python-fastapi/app/core/config.py +20 -20
- package/templates/backend/python-fastapi/main.py +35 -35
- package/templates/backend/python-fastapi/requirements.txt +13 -13
- package/templates/backend/rust-axum/.env.example +3 -3
- package/templates/backend/rust-axum/Cargo.toml +23 -23
- package/templates/backend/rust-axum/src/errors.rs +30 -30
- package/templates/backend/rust-axum/src/main.rs +32 -32
- package/templates/backend/rust-axum/src/routes.rs +6 -6
- package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
- package/templates/frontend/leptos-csr/Cargo.toml +16 -16
- package/templates/frontend/leptos-csr/Trunk.toml +10 -10
- package/templates/frontend/leptos-csr/index.html +11 -11
- package/templates/frontend/leptos-csr/src/lib.rs +20 -20
- package/templates/frontend/leptos-csr/style/main.scss +19 -19
- package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
- package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
- package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
- package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
- package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
- package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
- package/templates/frontend/react/index.html +12 -12
- package/templates/frontend/react/package.json +35 -35
- package/templates/frontend/react/src/App.tsx +25 -25
- package/templates/frontend/react/src/main.tsx +9 -9
- package/templates/frontend/vue/package.json +32 -32
- package/templates/frontend/vue/src/App.vue +7 -7
- package/templates/frontend/vue/src/main.ts +10 -10
- package/templates/frontend/vue/src/router/index.ts +14 -14
- package/templates/frontend/vue/src/views/HomeView.vue +6 -6
- package/templates/hooks/pre-commit-dare-validate +24 -24
- package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
- package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -0
- package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -0
- package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -0
- package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -0
- package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -0
- package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -0
- package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -0
- package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -0
- package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -0
- package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
- package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -0
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
- package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -0
- package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
- package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -0
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
- package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -0
- package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -0
- package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -0
- package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -0
- package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -0
- package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -0
- package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
- package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/claude/.claude/commands/dare-ax.md +131 -0
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
- package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -0
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
- package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -0
- package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
- package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
- package/templates/ide/claude/.claude/commands/dare-dna.md +75 -0
- package/templates/ide/claude/.claude/commands/dare-docker.md +207 -0
- package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
- package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -0
- package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -0
- package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -0
- package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -0
- package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -0
- package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -0
- package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -0
- package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -0
- package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
- package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -0
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
- package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
- package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
- package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
- package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
- package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -0
- package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -0
- package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -0
- package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -0
- package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -0
- package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -0
- package/templates/ide/claude/.claude/settings.example.json +35 -35
- package/templates/ide/claude/CLAUDE.md +146 -146
- package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/claude/templates/DESIGN-template.md +129 -129
- package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/cursor/.cursor/commands/dag-viz.md +139 -0
- package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +86 -86
- package/templates/ide/cursor/.cursor/commands/generate-design.md +35 -35
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +184 -184
- package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -107
- package/templates/ide/cursor/.cursor/commands/review-task.md +91 -91
- package/templates/ide/cursor/.cursor/commands/run-dag.md +110 -110
- package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
- package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -0
- package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -0
- package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -0
- package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -0
- package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -0
- package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -0
- package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -0
- package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -0
- package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -0
- package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -0
- package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -0
- package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -0
- package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -0
- package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -0
- package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
- package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
- package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
- package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -141
- package/templates/shared/docker-compose.yml +41 -41
- package/dist/__tests__/dag-runner/adapters.test.d.ts +0 -2
- package/dist/__tests__/dag-runner/adapters.test.d.ts.map +0 -1
- package/dist/__tests__/dag-runner/adapters.test.js +0 -134
- package/dist/__tests__/dag-runner/adapters.test.js.map +0 -1
- package/dist/dag-runner/adapters/antigravity.d.ts +0 -6
- package/dist/dag-runner/adapters/antigravity.d.ts.map +0 -1
- package/dist/dag-runner/adapters/antigravity.js +0 -54
- package/dist/dag-runner/adapters/antigravity.js.map +0 -1
- package/dist/dag-runner/adapters/claude.d.ts +0 -6
- package/dist/dag-runner/adapters/claude.d.ts.map +0 -1
- package/dist/dag-runner/adapters/claude.js +0 -48
- package/dist/dag-runner/adapters/claude.js.map +0 -1
- package/dist/dag-runner/adapters/cursor.d.ts +0 -6
- package/dist/dag-runner/adapters/cursor.d.ts.map +0 -1
- package/dist/dag-runner/adapters/cursor.js +0 -58
- package/dist/dag-runner/adapters/cursor.js.map +0 -1
- package/dist/dag-runner/adapters/index.d.ts +0 -46
- package/dist/dag-runner/adapters/index.d.ts.map +0 -1
- package/dist/dag-runner/adapters/index.js +0 -55
- package/dist/dag-runner/adapters/index.js.map +0 -1
- package/dist/dag-runner/utils/timeout.d.ts +0 -27
- package/dist/dag-runner/utils/timeout.d.ts.map +0 -1
- package/dist/dag-runner/utils/timeout.js +0 -55
- package/dist/dag-runner/utils/timeout.js.map +0 -1
|
@@ -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"}
|
|
@@ -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,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confidence & traceability for `dare reverse --report`.
|
|
3
|
+
*
|
|
4
|
+
* Parses the confidence markers the `/dare-reverse` skill writes into the
|
|
5
|
+
* Phase-0 specs (🟢 CONFIRMED / 🟡 INFERRED / 🔴 GAP) and computes a
|
|
6
|
+
* deterministic confidence index per spec plus a code↔spec traceability
|
|
7
|
+
* matrix. Because the index is *computed from markers* (not self-reported by
|
|
8
|
+
* an LLM), it is reproducible and auditable.
|
|
9
|
+
*
|
|
10
|
+
* Concept inspired by the Reversa framework (Macedo & da Costa,
|
|
11
|
+
* arXiv:2605.18684, 2026) — clean-room reimplementation, deterministic.
|
|
12
|
+
*
|
|
13
|
+
* License: MIT (part of DARE CLI).
|
|
14
|
+
*/
|
|
15
|
+
export type Marker = 'confirmed' | 'inferred' | 'gap';
|
|
16
|
+
export interface ClaimCounts {
|
|
17
|
+
confirmed: number;
|
|
18
|
+
inferred: number;
|
|
19
|
+
gap: number;
|
|
20
|
+
total: number;
|
|
21
|
+
}
|
|
22
|
+
export interface SpecConfidence {
|
|
23
|
+
/** Spec label (e.g. `IDEIA.md`, `module-01-auth.md`). */
|
|
24
|
+
spec: string;
|
|
25
|
+
counts: ClaimCounts;
|
|
26
|
+
/** Confidence index 0–100 (one decimal): (🟢·1 + 🟡·0.5) / total. */
|
|
27
|
+
index: number;
|
|
28
|
+
/** Unique `path:line` evidence references cited in this spec. */
|
|
29
|
+
evidence: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare function emptyCounts(): ClaimCounts;
|
|
32
|
+
export declare function computeIndex(c: ClaimCounts): number;
|
|
33
|
+
/** Parse one spec's markdown into confidence counts + evidence refs. */
|
|
34
|
+
export declare function parseSpecConfidence(spec: string, content: string): SpecConfidence;
|
|
35
|
+
export declare function aggregate(specs: SpecConfidence[]): {
|
|
36
|
+
counts: ClaimCounts;
|
|
37
|
+
index: number;
|
|
38
|
+
};
|
|
39
|
+
export declare function renderConfidenceReport(specs: SpecConfidence[], generatedAt: string): string;
|
|
40
|
+
export declare function renderCodeSpecMatrix(specs: SpecConfidence[], generatedAt: string): string;
|
|
41
|
+
//# sourceMappingURL=confidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence.d.ts","sourceRoot":"","sources":["../../src/utils/confidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,KAAK,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAaD,wBAAgB,WAAW,IAAI,WAAW,CAEzC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAGnD;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAejF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CASzF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAwB3F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAkBzF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confidence & traceability for `dare reverse --report`.
|
|
3
|
+
*
|
|
4
|
+
* Parses the confidence markers the `/dare-reverse` skill writes into the
|
|
5
|
+
* Phase-0 specs (🟢 CONFIRMED / 🟡 INFERRED / 🔴 GAP) and computes a
|
|
6
|
+
* deterministic confidence index per spec plus a code↔spec traceability
|
|
7
|
+
* matrix. Because the index is *computed from markers* (not self-reported by
|
|
8
|
+
* an LLM), it is reproducible and auditable.
|
|
9
|
+
*
|
|
10
|
+
* Concept inspired by the Reversa framework (Macedo & da Costa,
|
|
11
|
+
* arXiv:2605.18684, 2026) — clean-room reimplementation, deterministic.
|
|
12
|
+
*
|
|
13
|
+
* License: MIT (part of DARE CLI).
|
|
14
|
+
*/
|
|
15
|
+
// A claim line: list bullet + marker emoji + text.
|
|
16
|
+
const MARKER_RE = /^\s*[-*]\s+(🟢|🟡|🔴)\s+/u;
|
|
17
|
+
// Evidence reference inside backticks ending in `:<digits>` (e.g. `src/x.ts:42`).
|
|
18
|
+
const EVIDENCE_RE = /`([^`]+?:\d+)`/gu;
|
|
19
|
+
const MARKER_KIND = {
|
|
20
|
+
'🟢': 'confirmed',
|
|
21
|
+
'🟡': 'inferred',
|
|
22
|
+
'🔴': 'gap',
|
|
23
|
+
};
|
|
24
|
+
export function emptyCounts() {
|
|
25
|
+
return { confirmed: 0, inferred: 0, gap: 0, total: 0 };
|
|
26
|
+
}
|
|
27
|
+
export function computeIndex(c) {
|
|
28
|
+
if (c.total === 0)
|
|
29
|
+
return 0;
|
|
30
|
+
return Math.round(((c.confirmed + 0.5 * c.inferred) / c.total) * 1000) / 10;
|
|
31
|
+
}
|
|
32
|
+
/** Parse one spec's markdown into confidence counts + evidence refs. */
|
|
33
|
+
export function parseSpecConfidence(spec, content) {
|
|
34
|
+
const counts = emptyCounts();
|
|
35
|
+
const evidence = new Set();
|
|
36
|
+
for (const line of content.split(/\r?\n/)) {
|
|
37
|
+
const m = MARKER_RE.exec(line);
|
|
38
|
+
if (!m)
|
|
39
|
+
continue;
|
|
40
|
+
counts[MARKER_KIND[m[1]]]++;
|
|
41
|
+
counts.total++;
|
|
42
|
+
EVIDENCE_RE.lastIndex = 0;
|
|
43
|
+
let e;
|
|
44
|
+
while ((e = EVIDENCE_RE.exec(line)) !== null)
|
|
45
|
+
evidence.add(e[1]);
|
|
46
|
+
}
|
|
47
|
+
return { spec, counts, index: computeIndex(counts), evidence: [...evidence].sort() };
|
|
48
|
+
}
|
|
49
|
+
export function aggregate(specs) {
|
|
50
|
+
const counts = emptyCounts();
|
|
51
|
+
for (const s of specs) {
|
|
52
|
+
counts.confirmed += s.counts.confirmed;
|
|
53
|
+
counts.inferred += s.counts.inferred;
|
|
54
|
+
counts.gap += s.counts.gap;
|
|
55
|
+
counts.total += s.counts.total;
|
|
56
|
+
}
|
|
57
|
+
return { counts, index: computeIndex(counts) };
|
|
58
|
+
}
|
|
59
|
+
export function renderConfidenceReport(specs, generatedAt) {
|
|
60
|
+
const { counts, index } = aggregate(specs);
|
|
61
|
+
const rows = specs.map((s) => `| ${s.spec} | ${s.counts.confirmed} | ${s.counts.inferred} | ${s.counts.gap} | ${s.index}% |`);
|
|
62
|
+
return [
|
|
63
|
+
'# Confidence Report — engenharia reversa',
|
|
64
|
+
'',
|
|
65
|
+
`*Gerado: ${generatedAt}*`,
|
|
66
|
+
'',
|
|
67
|
+
'> Marcação: 🟢 CONFIRMED (evidência direta no código) · 🟡 INFERRED (padrão/dedução) · 🔴 GAP (não determinável).',
|
|
68
|
+
'> Índice = (🟢·1.0 + 🟡·0.5) / total. **É a classificação do pipeline, não auditoria factual externa.**',
|
|
69
|
+
'',
|
|
70
|
+
'| Spec | 🟢 | 🟡 | 🔴 | Índice |',
|
|
71
|
+
'|---|---|---|---|---|',
|
|
72
|
+
...rows,
|
|
73
|
+
`| **Total** | **${counts.confirmed}** | **${counts.inferred}** | **${counts.gap}** | **${index}%** |`,
|
|
74
|
+
'',
|
|
75
|
+
`**${counts.total} claims** · ${counts.gap} gap(s) para validação humana (ver \`gaps.md\`).`,
|
|
76
|
+
'',
|
|
77
|
+
'---',
|
|
78
|
+
'*DARE Method — Fase 0 brownfield. Conceito de confiança inspirado em Reversa (arXiv:2605.18684), '
|
|
79
|
+
+ 'computado deterministicamente a partir dos marcadores. License: MIT.*',
|
|
80
|
+
].join('\n') + '\n';
|
|
81
|
+
}
|
|
82
|
+
export function renderCodeSpecMatrix(specs, generatedAt) {
|
|
83
|
+
const rows = specs
|
|
84
|
+
.filter((s) => s.evidence.length > 0)
|
|
85
|
+
.map((s) => `| \`${s.spec}\` | ${s.evidence.map((e) => `\`${e}\``).join(', ')} |`);
|
|
86
|
+
return [
|
|
87
|
+
'# Code ↔ Spec Matrix (rastreabilidade)',
|
|
88
|
+
'',
|
|
89
|
+
`*Gerado: ${generatedAt}*`,
|
|
90
|
+
'',
|
|
91
|
+
'Cada spec e os arquivos de código citados como evidência nas suas afirmações.',
|
|
92
|
+
'',
|
|
93
|
+
'| Spec | Evidência (arquivo:linha) |',
|
|
94
|
+
'|---|---|',
|
|
95
|
+
...(rows.length ? rows : ['| _(nenhuma evidência `arquivo:linha` citada ainda)_ | — |']),
|
|
96
|
+
'',
|
|
97
|
+
'---',
|
|
98
|
+
'*DARE Method — rastreabilidade brownfield. License: MIT.*',
|
|
99
|
+
].join('\n') + '\n';
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=confidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence.js","sourceRoot":"","sources":["../../src/utils/confidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic data-model (ERD) + API-surface extraction for
|
|
3
|
+
* `dare reverse --deep` (Phase 3 brownfield).
|
|
4
|
+
*
|
|
5
|
+
* Line/regex-based — no AST — matching the rest of the CLI. Covers the common
|
|
6
|
+
* cases (SQL migrations, Prisma, light ORM relations, and routes for
|
|
7
|
+
* Express/Nest/Laravel/FastAPI/Gin); anything it can't parse is left for the
|
|
8
|
+
* `/dare-reverse` skill to complete (marked 🟡).
|
|
9
|
+
*
|
|
10
|
+
* Concept inspired by the Reversa Architect/Detective agents
|
|
11
|
+
* (Macedo & da Costa, arXiv:2605.18684, 2026) — clean-room, deterministic.
|
|
12
|
+
*
|
|
13
|
+
* License: MIT (part of DARE CLI).
|
|
14
|
+
*/
|
|
15
|
+
export interface EntityField {
|
|
16
|
+
name: string;
|
|
17
|
+
type: string;
|
|
18
|
+
}
|
|
19
|
+
export interface EntityRelation {
|
|
20
|
+
to: string;
|
|
21
|
+
kind: string;
|
|
22
|
+
}
|
|
23
|
+
export interface Entity {
|
|
24
|
+
name: string;
|
|
25
|
+
fields: EntityField[];
|
|
26
|
+
relations: EntityRelation[];
|
|
27
|
+
source: string;
|
|
28
|
+
}
|
|
29
|
+
export interface Endpoint {
|
|
30
|
+
method: string;
|
|
31
|
+
route: string;
|
|
32
|
+
source: string;
|
|
33
|
+
}
|
|
34
|
+
export interface DataModel {
|
|
35
|
+
entities: Entity[];
|
|
36
|
+
endpoints: Endpoint[];
|
|
37
|
+
}
|
|
38
|
+
export declare function extractDataModel(root: string): Promise<DataModel>;
|
|
39
|
+
export declare function renderErd(model: DataModel, generatedAt: string): string;
|
|
40
|
+
export declare function renderApiSurface(model: DataModel, generatedAt: string): string;
|
|
41
|
+
//# sourceMappingURL=datamodel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datamodel.d.ts","sourceRoot":"","sources":["../../src/utils/datamodel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AA2CD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAuBvE;AAiVD,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAwCvE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAmB9E"}
|