@dewtech/dare-cli 2.17.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -3
- package/dist/__tests__/confidence.test.d.ts +2 -0
- package/dist/__tests__/confidence.test.d.ts.map +1 -0
- package/dist/__tests__/confidence.test.js +73 -0
- package/dist/__tests__/confidence.test.js.map +1 -0
- package/dist/__tests__/datamodel.test.d.ts +2 -0
- package/dist/__tests__/datamodel.test.d.ts.map +1 -0
- package/dist/__tests__/datamodel.test.js +131 -0
- package/dist/__tests__/datamodel.test.js.map +1 -0
- package/dist/__tests__/dna-detector.test.d.ts +2 -0
- package/dist/__tests__/dna-detector.test.d.ts.map +1 -0
- package/dist/__tests__/dna-detector.test.js +97 -0
- package/dist/__tests__/dna-detector.test.js.map +1 -0
- package/dist/__tests__/dna-facts.test.d.ts +2 -0
- package/dist/__tests__/dna-facts.test.d.ts.map +1 -0
- package/dist/__tests__/dna-facts.test.js +44 -0
- package/dist/__tests__/dna-facts.test.js.map +1 -0
- package/dist/__tests__/graph-renderer.test.d.ts +2 -0
- package/dist/__tests__/graph-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/graph-renderer.test.js +85 -0
- package/dist/__tests__/graph-renderer.test.js.map +1 -0
- package/dist/__tests__/migration.test.d.ts +2 -0
- package/dist/__tests__/migration.test.d.ts.map +1 -0
- package/dist/__tests__/migration.test.js +77 -0
- package/dist/__tests__/migration.test.js.map +1 -0
- package/dist/__tests__/module-detector.test.d.ts +2 -0
- package/dist/__tests__/module-detector.test.d.ts.map +1 -0
- package/dist/__tests__/module-detector.test.js +83 -0
- package/dist/__tests__/module-detector.test.js.map +1 -0
- package/dist/__tests__/refine.test.js +49 -49
- package/dist/__tests__/reverse-facts.test.d.ts +2 -0
- package/dist/__tests__/reverse-facts.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-facts.test.js +78 -0
- package/dist/__tests__/reverse-facts.test.js.map +1 -0
- package/dist/__tests__/review.test.js +38 -38
- package/dist/__tests__/validate.test.js +65 -65
- package/dist/bin/dare.js +32 -3
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/blueprint.js +122 -122
- package/dist/commands/dag.d.ts.map +1 -1
- package/dist/commands/dag.js +43 -79
- package/dist/commands/dag.js.map +1 -1
- package/dist/commands/dna.d.ts +3 -0
- package/dist/commands/dna.d.ts.map +1 -0
- package/dist/commands/dna.js +69 -0
- package/dist/commands/dna.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +101 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +16 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +103 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/reverse.d.ts +3 -0
- package/dist/commands/reverse.d.ts.map +1 -0
- package/dist/commands/reverse.js +201 -0
- package/dist/commands/reverse.js.map +1 -0
- package/dist/commands/welcome.d.ts +14 -0
- package/dist/commands/welcome.d.ts.map +1 -0
- package/dist/commands/welcome.js +29 -0
- package/dist/commands/welcome.js.map +1 -0
- package/dist/skills/commands/add.d.ts +23 -0
- package/dist/skills/commands/add.d.ts.map +1 -0
- package/dist/skills/commands/add.js +206 -0
- package/dist/skills/commands/add.js.map +1 -0
- package/dist/skills/commands/info.d.ts +14 -0
- package/dist/skills/commands/info.d.ts.map +1 -0
- package/dist/skills/commands/info.js +99 -0
- package/dist/skills/commands/info.js.map +1 -0
- package/dist/skills/commands/list.d.ts +19 -0
- package/dist/skills/commands/list.d.ts.map +1 -0
- package/dist/skills/commands/list.js +163 -0
- package/dist/skills/commands/list.js.map +1 -0
- package/dist/skills/commands/publish.d.ts +56 -0
- package/dist/skills/commands/publish.d.ts.map +1 -0
- package/dist/skills/commands/publish.js +272 -0
- package/dist/skills/commands/publish.js.map +1 -0
- package/dist/skills/commands/remove.d.ts +19 -0
- package/dist/skills/commands/remove.d.ts.map +1 -0
- package/dist/skills/commands/remove.js +96 -0
- package/dist/skills/commands/remove.js.map +1 -0
- package/dist/skills/commands/update.d.ts +31 -0
- package/dist/skills/commands/update.d.ts.map +1 -0
- package/dist/skills/commands/update.js +132 -0
- package/dist/skills/commands/update.js.map +1 -0
- package/dist/skills/index.d.ts +22 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +33 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/manifest.d.ts +54 -0
- package/dist/skills/manifest.d.ts.map +1 -0
- package/dist/skills/manifest.js +162 -0
- package/dist/skills/manifest.js.map +1 -0
- package/dist/skills/registry-local.d.ts +67 -0
- package/dist/skills/registry-local.d.ts.map +1 -0
- package/dist/skills/registry-local.js +130 -0
- package/dist/skills/registry-local.js.map +1 -0
- package/dist/skills/registry-mock.json +109 -0
- package/dist/skills/registry-remote.d.ts +110 -0
- package/dist/skills/registry-remote.d.ts.map +1 -0
- package/dist/skills/registry-remote.js +246 -0
- package/dist/skills/registry-remote.js.map +1 -0
- package/dist/skills/registry.d.ts +49 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +94 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/tests/manifest.spec.d.ts +8 -0
- package/dist/skills/tests/manifest.spec.d.ts.map +1 -0
- package/dist/skills/tests/manifest.spec.js +176 -0
- package/dist/skills/tests/manifest.spec.js.map +1 -0
- package/dist/skills/tests/publish.spec.d.ts +12 -0
- package/dist/skills/tests/publish.spec.d.ts.map +1 -0
- package/dist/skills/tests/publish.spec.js +276 -0
- package/dist/skills/tests/publish.spec.js.map +1 -0
- package/dist/skills/tests/registry-local.spec.d.ts +8 -0
- package/dist/skills/tests/registry-local.spec.d.ts.map +1 -0
- package/dist/skills/tests/registry-local.spec.js +231 -0
- package/dist/skills/tests/registry-local.spec.js.map +1 -0
- package/dist/skills/tests/registry.spec.d.ts +7 -0
- package/dist/skills/tests/registry.spec.d.ts.map +1 -0
- package/dist/skills/tests/registry.spec.js +58 -0
- package/dist/skills/tests/registry.spec.js.map +1 -0
- package/dist/skills/tests/remote-registry.spec.d.ts +9 -0
- package/dist/skills/tests/remote-registry.spec.d.ts.map +1 -0
- package/dist/skills/tests/remote-registry.spec.js +357 -0
- package/dist/skills/tests/remote-registry.spec.js.map +1 -0
- package/dist/skills/tests/update.spec.d.ts +9 -0
- package/dist/skills/tests/update.spec.d.ts.map +1 -0
- package/dist/skills/tests/update.spec.js +166 -0
- package/dist/skills/tests/update.spec.js.map +1 -0
- package/dist/utils/banner.d.ts +28 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +77 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/banner.spec.d.ts +5 -0
- package/dist/utils/banner.spec.d.ts.map +1 -0
- package/dist/utils/banner.spec.js +253 -0
- package/dist/utils/banner.spec.js.map +1 -0
- package/dist/utils/confidence.d.ts +41 -0
- package/dist/utils/confidence.d.ts.map +1 -0
- package/dist/utils/confidence.js +101 -0
- package/dist/utils/confidence.js.map +1 -0
- package/dist/utils/datamodel.d.ts +41 -0
- package/dist/utils/datamodel.d.ts.map +1 -0
- package/dist/utils/datamodel.js +535 -0
- package/dist/utils/datamodel.js.map +1 -0
- package/dist/utils/dna-detector.d.ts +61 -0
- package/dist/utils/dna-detector.d.ts.map +1 -0
- package/dist/utils/dna-detector.js +354 -0
- package/dist/utils/dna-detector.js.map +1 -0
- package/dist/utils/dna-facts.d.ts +13 -0
- package/dist/utils/dna-facts.d.ts.map +1 -0
- package/dist/utils/dna-facts.js +109 -0
- package/dist/utils/dna-facts.js.map +1 -0
- package/dist/utils/excalidraw-renderer.d.ts +11 -71
- package/dist/utils/excalidraw-renderer.d.ts.map +1 -1
- package/dist/utils/excalidraw-renderer.js +29 -162
- package/dist/utils/excalidraw-renderer.js.map +1 -1
- package/dist/utils/graph-renderer.d.ts +115 -0
- package/dist/utils/graph-renderer.d.ts.map +1 -0
- package/dist/utils/graph-renderer.js +216 -0
- package/dist/utils/graph-renderer.js.map +1 -0
- package/dist/utils/migration.d.ts +64 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +183 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/module-detector.d.ts +46 -0
- package/dist/utils/module-detector.d.ts.map +1 -0
- package/dist/utils/module-detector.js +348 -0
- package/dist/utils/module-detector.js.map +1 -0
- package/dist/utils/project-generator.js +252 -252
- package/dist/utils/reverse-facts.d.ts +50 -0
- package/dist/utils/reverse-facts.d.ts.map +1 -0
- package/dist/utils/reverse-facts.js +291 -0
- package/dist/utils/reverse-facts.js.map +1 -0
- package/dist/utils/stack-bootstrap.js +371 -371
- package/package.json +8 -3
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +48 -48
- package/templates/backend/node-nestjs/.env.example +9 -9
- package/templates/backend/node-nestjs/nest-cli.json +8 -8
- package/templates/backend/node-nestjs/package.json +50 -50
- package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
- package/templates/backend/node-nestjs/src/app.module.ts +15 -15
- package/templates/backend/node-nestjs/src/app.service.ts +8 -8
- package/templates/backend/node-nestjs/src/main.ts +24 -24
- package/templates/backend/node-nestjs/tsconfig.json +21 -21
- package/templates/backend/php-laravel/.env.example +22 -22
- package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
- package/templates/backend/php-laravel/composer.json +40 -40
- package/templates/backend/python-fastapi/.env.example +4 -4
- package/templates/backend/python-fastapi/app/api/router.py +8 -8
- package/templates/backend/python-fastapi/app/core/config.py +20 -20
- package/templates/backend/python-fastapi/main.py +35 -35
- package/templates/backend/python-fastapi/requirements.txt +13 -13
- package/templates/backend/rust-axum/.env.example +3 -3
- package/templates/backend/rust-axum/Cargo.toml +23 -23
- package/templates/backend/rust-axum/src/errors.rs +30 -30
- package/templates/backend/rust-axum/src/main.rs +32 -32
- package/templates/backend/rust-axum/src/routes.rs +6 -6
- package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
- package/templates/frontend/leptos-csr/Cargo.toml +16 -16
- package/templates/frontend/leptos-csr/Trunk.toml +10 -10
- package/templates/frontend/leptos-csr/index.html +11 -11
- package/templates/frontend/leptos-csr/src/lib.rs +20 -20
- package/templates/frontend/leptos-csr/style/main.scss +19 -19
- package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
- package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
- package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
- package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
- package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
- package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
- package/templates/frontend/react/index.html +12 -12
- package/templates/frontend/react/package.json +35 -35
- package/templates/frontend/react/src/App.tsx +25 -25
- package/templates/frontend/react/src/main.tsx +9 -9
- package/templates/frontend/vue/package.json +32 -32
- package/templates/frontend/vue/src/App.vue +7 -7
- package/templates/frontend/vue/src/main.ts +10 -10
- package/templates/frontend/vue/src/router/index.ts +14 -14
- package/templates/frontend/vue/src/views/HomeView.vue +6 -6
- package/templates/hooks/pre-commit-dare-validate +24 -24
- package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
- package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -0
- package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -0
- package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -0
- package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -0
- package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -0
- package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -0
- package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -0
- package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -0
- package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -0
- package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
- package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -0
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
- package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -0
- package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
- package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -0
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
- package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -0
- package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -0
- package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -0
- package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -0
- package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -0
- package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -0
- package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
- package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/claude/.claude/commands/dare-ax.md +131 -0
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
- package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -0
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
- package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -0
- package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
- package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
- package/templates/ide/claude/.claude/commands/dare-dna.md +75 -0
- package/templates/ide/claude/.claude/commands/dare-docker.md +207 -0
- package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
- package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -0
- package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -0
- package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -0
- package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -0
- package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -0
- package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -0
- package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -0
- package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -0
- package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
- package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -0
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
- package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
- package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
- package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
- package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
- package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -0
- package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -0
- package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -0
- package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -0
- package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -0
- package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -0
- package/templates/ide/claude/.claude/settings.example.json +35 -35
- package/templates/ide/claude/CLAUDE.md +146 -146
- package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/claude/templates/DESIGN-template.md +129 -129
- package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/cursor/.cursor/commands/dag-viz.md +139 -0
- package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +86 -86
- package/templates/ide/cursor/.cursor/commands/generate-design.md +35 -35
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +184 -184
- package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -107
- package/templates/ide/cursor/.cursor/commands/review-task.md +91 -91
- package/templates/ide/cursor/.cursor/commands/run-dag.md +110 -110
- package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
- package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -0
- package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -0
- package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -0
- package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -0
- package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -0
- package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -0
- package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -0
- package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -0
- package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -0
- package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -0
- package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -0
- package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -0
- package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -0
- package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -0
- package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
- package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
- package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
- package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -141
- package/templates/shared/docker-compose.yml +41 -41
- package/dist/__tests__/dag-runner/adapters.test.d.ts +0 -2
- package/dist/__tests__/dag-runner/adapters.test.d.ts.map +0 -1
- package/dist/__tests__/dag-runner/adapters.test.js +0 -134
- package/dist/__tests__/dag-runner/adapters.test.js.map +0 -1
- package/dist/dag-runner/adapters/antigravity.d.ts +0 -6
- package/dist/dag-runner/adapters/antigravity.d.ts.map +0 -1
- package/dist/dag-runner/adapters/antigravity.js +0 -54
- package/dist/dag-runner/adapters/antigravity.js.map +0 -1
- package/dist/dag-runner/adapters/claude.d.ts +0 -6
- package/dist/dag-runner/adapters/claude.d.ts.map +0 -1
- package/dist/dag-runner/adapters/claude.js +0 -48
- package/dist/dag-runner/adapters/claude.js.map +0 -1
- package/dist/dag-runner/adapters/cursor.d.ts +0 -6
- package/dist/dag-runner/adapters/cursor.d.ts.map +0 -1
- package/dist/dag-runner/adapters/cursor.js +0 -58
- package/dist/dag-runner/adapters/cursor.js.map +0 -1
- package/dist/dag-runner/adapters/index.d.ts +0 -46
- package/dist/dag-runner/adapters/index.d.ts.map +0 -1
- package/dist/dag-runner/adapters/index.js +0 -55
- package/dist/dag-runner/adapters/index.js.map +0 -1
- package/dist/dag-runner/utils/timeout.d.ts +0 -27
- package/dist/dag-runner/utils/timeout.d.ts.map +0 -1
- package/dist/dag-runner/utils/timeout.js +0 -55
- package/dist/dag-runner/utils/timeout.js.map +0 -1
|
@@ -1,188 +1,55 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Excalidraw Renderer for DARE DAG Visualization
|
|
2
|
+
* Excalidraw Renderer for DARE DAG Visualization.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Maps a DARE DAG (task graph) onto the generic graph renderer
|
|
5
|
+
* (`graph-renderer.ts`) so the task DAG and `dare reverse`'s module graph
|
|
6
|
+
* share one rendering engine:
|
|
7
|
+
* - Tasks → rectangles colored by status (complexity as fallback when PENDING)
|
|
8
|
+
* - Dependencies → arrows
|
|
9
|
+
* - Tasks grouped by rank in swim lanes
|
|
8
10
|
*
|
|
9
11
|
* Design tokens: /docs/DESIGN-TOKENS-EXCALIDRAW.md
|
|
10
|
-
* License:
|
|
11
|
-
*/
|
|
12
|
-
import { computeRanks } from '../dag-runner/run_dag.js';
|
|
13
|
-
/**
|
|
14
|
-
* Color palette based on DARE Design Tokens
|
|
12
|
+
* License: MIT (D-001 — part of DARE CLI)
|
|
15
13
|
*/
|
|
14
|
+
import { renderGraphExcalidraw, serializeExcalidraw, } from './graph-renderer.js';
|
|
15
|
+
export { serializeExcalidraw };
|
|
16
|
+
/** Color palette based on DARE Design Tokens. */
|
|
16
17
|
const COLOR_BY_COMPLEXITY = {
|
|
17
|
-
LOW: {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
},
|
|
21
|
-
MED: {
|
|
22
|
-
bg: '#fff3e0', // Orange
|
|
23
|
-
stroke: '#e65100', // Dark orange
|
|
24
|
-
},
|
|
25
|
-
HIGH: {
|
|
26
|
-
bg: '#fce4ec', // Pink/Magenta
|
|
27
|
-
stroke: '#c2185b', // Dark pink
|
|
28
|
-
},
|
|
18
|
+
LOW: { bg: '#e3f2fd', stroke: '#1976d2' }, // Azure blue
|
|
19
|
+
MED: { bg: '#fff3e0', stroke: '#e65100' }, // Orange
|
|
20
|
+
HIGH: { bg: '#fce4ec', stroke: '#c2185b' }, // Pink/Magenta
|
|
29
21
|
};
|
|
30
22
|
const COLOR_BY_STATUS = {
|
|
31
|
-
PENDING: {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
bg: '#e3f2fd', // Azure blue
|
|
37
|
-
stroke: '#1976d2', // Dark blue
|
|
38
|
-
dashed: true,
|
|
39
|
-
},
|
|
40
|
-
DONE: {
|
|
41
|
-
bg: '#e8f5e9', // Light green
|
|
42
|
-
stroke: '#388e3c', // Dark green
|
|
43
|
-
},
|
|
44
|
-
FAILED: {
|
|
45
|
-
bg: '#ffebee', // Light red
|
|
46
|
-
stroke: '#d32f2f', // Dark red
|
|
47
|
-
},
|
|
48
|
-
SKIPPED: {
|
|
49
|
-
bg: '#e5e7eb', // Gray
|
|
50
|
-
stroke: '#6b7280', // Dark gray
|
|
51
|
-
},
|
|
23
|
+
PENDING: { bg: '#f5f5f5', stroke: '#999999' },
|
|
24
|
+
RUNNING: { bg: '#e3f2fd', stroke: '#1976d2', dashed: true },
|
|
25
|
+
DONE: { bg: '#e8f5e9', stroke: '#388e3c' },
|
|
26
|
+
FAILED: { bg: '#ffebee', stroke: '#d32f2f' },
|
|
27
|
+
SKIPPED: { bg: '#e5e7eb', stroke: '#6b7280' },
|
|
52
28
|
};
|
|
53
|
-
/**
|
|
54
|
-
* Generate unique ID for Excalidraw elements
|
|
55
|
-
*/
|
|
56
|
-
function generateId() {
|
|
57
|
-
return Math.random().toString(36).substr(2, 9);
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Get status color, preferring status over complexity
|
|
61
|
-
*/
|
|
29
|
+
/** Status takes precedence; PENDING falls back to complexity for richer color. */
|
|
62
30
|
function getTaskColors(task) {
|
|
63
31
|
const status = task.status ?? 'PENDING';
|
|
64
|
-
// Status takes precedence, but if PENDING, use complexity for better visualization
|
|
65
32
|
if (status === 'PENDING' && task.complexity) {
|
|
66
33
|
return COLOR_BY_COMPLEXITY[task.complexity] || COLOR_BY_COMPLEXITY.MED;
|
|
67
34
|
}
|
|
68
35
|
return COLOR_BY_STATUS[status] || COLOR_BY_STATUS.PENDING;
|
|
69
36
|
}
|
|
70
|
-
|
|
71
|
-
* Create rectangle element for a task
|
|
72
|
-
*/
|
|
73
|
-
function createTaskElement(task, x, y) {
|
|
37
|
+
function taskToGraphNode(task) {
|
|
74
38
|
const colors = getTaskColors(task);
|
|
75
39
|
const complexity = task.complexity || 'MED';
|
|
76
|
-
const text = `${task.id}\n${task.title}\n[${complexity}]`;
|
|
77
40
|
return {
|
|
78
41
|
id: task.id,
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
angle: 0,
|
|
85
|
-
strokeColor: colors.stroke,
|
|
86
|
-
backgroundColor: colors.bg,
|
|
87
|
-
fillStyle: 'hachure',
|
|
88
|
-
strokeWidth: 2,
|
|
89
|
-
strokeStyle: colors.dashed ? 'dashed' : 'solid',
|
|
90
|
-
roughness: 0,
|
|
91
|
-
opacity: 100,
|
|
92
|
-
roundness: { type: 2, value: 6 },
|
|
93
|
-
text,
|
|
94
|
-
fontSize: 12,
|
|
95
|
-
fontFamily: 1, // Virgil (default Excalidraw font)
|
|
96
|
-
textAlign: 'center',
|
|
97
|
-
verticalAlign: 'middle',
|
|
98
|
-
boundElements: [],
|
|
99
|
-
updated: Date.now(),
|
|
100
|
-
link: null,
|
|
101
|
-
locked: false,
|
|
102
|
-
seed: Math.floor(Math.random() * 2147483647),
|
|
103
|
-
versionNonce: Math.floor(Math.random() * 2147483647),
|
|
42
|
+
depends_on: task.depends_on,
|
|
43
|
+
labelLines: [task.id, task.title, `[${complexity}]`],
|
|
44
|
+
bg: colors.bg,
|
|
45
|
+
stroke: colors.stroke,
|
|
46
|
+
dashed: colors.dashed,
|
|
104
47
|
};
|
|
105
48
|
}
|
|
106
|
-
/**
|
|
107
|
-
* Create arrow element for a dependency
|
|
108
|
-
*/
|
|
109
|
-
function createArrowElement(fromTaskId, toTaskId) {
|
|
110
|
-
return {
|
|
111
|
-
id: generateId(),
|
|
112
|
-
type: 'arrow',
|
|
113
|
-
x: 0, // Will be computed from start/end binding
|
|
114
|
-
y: 0,
|
|
115
|
-
startBinding: { elementId: fromTaskId },
|
|
116
|
-
endBinding: { elementId: toTaskId },
|
|
117
|
-
startArrowType: 'dot',
|
|
118
|
-
endArrowType: 'arrow',
|
|
119
|
-
strokeColor: '#999999',
|
|
120
|
-
strokeWidth: 2,
|
|
121
|
-
strokeStyle: 'solid',
|
|
122
|
-
roughness: 0,
|
|
123
|
-
opacity: 100,
|
|
124
|
-
updated: Date.now(),
|
|
125
|
-
link: null,
|
|
126
|
-
locked: false,
|
|
127
|
-
seed: Math.floor(Math.random() * 2147483647),
|
|
128
|
-
versionNonce: Math.floor(Math.random() * 2147483647),
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Render DAG to Excalidraw JSON
|
|
133
|
-
*/
|
|
49
|
+
/** Render a task DAG to Excalidraw JSON via the generic graph renderer. */
|
|
134
50
|
export function renderDagExcalidraw(dag) {
|
|
135
|
-
|
|
136
|
-
const ranks = computeRanks(dag.tasks);
|
|
137
|
-
// Group tasks by rank
|
|
138
|
-
const byRank = new Map();
|
|
139
|
-
for (const task of dag.tasks) {
|
|
140
|
-
const r = ranks.get(task.id) ?? 1;
|
|
141
|
-
if (!byRank.has(r))
|
|
142
|
-
byRank.set(r, []);
|
|
143
|
-
byRank.get(r).push(task);
|
|
144
|
-
}
|
|
145
|
-
// Position elements
|
|
146
|
-
const taskPositions = new Map();
|
|
147
|
-
const sortedRanks = [...byRank.keys()].sort((a, b) => a - b);
|
|
148
|
-
for (const rank of sortedRanks) {
|
|
149
|
-
const tasksInRank = byRank.get(rank);
|
|
150
|
-
for (let i = 0; i < tasksInRank.length; i++) {
|
|
151
|
-
const task = tasksInRank[i];
|
|
152
|
-
// Position: X based on task index in rank, Y based on rank
|
|
153
|
-
const x = 20 + i * 140;
|
|
154
|
-
const y = 20 + rank * 160;
|
|
155
|
-
taskPositions.set(task.id, { x, y });
|
|
156
|
-
// Create rectangle for this task
|
|
157
|
-
const taskElement = createTaskElement(task, x, y);
|
|
158
|
-
elements.push(taskElement);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
// Create arrows for dependencies
|
|
162
|
-
for (const task of dag.tasks) {
|
|
163
|
-
for (const depId of task.depends_on) {
|
|
164
|
-
const arrow = createArrowElement(depId, task.id);
|
|
165
|
-
elements.push(arrow);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
const data = {
|
|
169
|
-
type: 'excalidraw',
|
|
170
|
-
version: 2,
|
|
51
|
+
return renderGraphExcalidraw(dag.tasks.map(taskToGraphNode), {
|
|
171
52
|
source: 'dare-dag-viz',
|
|
172
|
-
|
|
173
|
-
appState: {
|
|
174
|
-
gridMode: 'grid',
|
|
175
|
-
gridSize: 20,
|
|
176
|
-
viewBackgroundColor: '#ffffff',
|
|
177
|
-
},
|
|
178
|
-
files: {},
|
|
179
|
-
};
|
|
180
|
-
return data;
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Serialize Excalidraw data to JSON string
|
|
184
|
-
*/
|
|
185
|
-
export function serializeExcalidraw(data) {
|
|
186
|
-
return JSON.stringify(data, null, 2);
|
|
53
|
+
});
|
|
187
54
|
}
|
|
188
55
|
//# sourceMappingURL=excalidraw-renderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"excalidraw-renderer.js","sourceRoot":"","sources":["../../src/utils/excalidraw-renderer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"excalidraw-renderer.js","sourceRoot":"","sources":["../../src/utils/excalidraw-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GAGpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAuB,CAAC;AAEpD,iDAAiD;AACjD,MAAM,mBAAmB,GAAG;IAC1B,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,aAAa;IACxD,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS;IACpD,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,eAAe;CAC5D,CAAC;AAEF,MAAM,eAAe,GAAyE;IAC5F,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;IAC7C,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;IAC3D,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;IAC1C,MAAM,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;IAC5C,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;CAC9C,CAAC;AAEF,kFAAkF;AAClF,SAAS,aAAa,CAAC,IAAa;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IACxC,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5C,OAAO,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC;IACzE,CAAC;IACD,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;IAC5C,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,UAAU,GAAG,CAAC;QACpD,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,OAAO,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;QAC3D,MAAM,EAAE,cAAc;KACvB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic graph renderer — the shared core behind `dare dag viz` (the task
|
|
3
|
+
* DAG) and `dare reverse` (the module-dependency graph).
|
|
4
|
+
*
|
|
5
|
+
* Callers map their domain objects (DagTask, Module, …) to `GraphNode`,
|
|
6
|
+
* resolving colors / labels / styling, and this module owns the layout
|
|
7
|
+
* (rank grouping via the same Kahn-style traversal the DAG uses) and the
|
|
8
|
+
* serialization to Mermaid, Graphviz DOT, and Excalidraw JSON.
|
|
9
|
+
*
|
|
10
|
+
* Two styling strategies for Mermaid:
|
|
11
|
+
* - `'class'` → emits `class <id> <cls>;` + shared `classDef` lines.
|
|
12
|
+
* Used by the DAG (status-driven palette).
|
|
13
|
+
* - `'inline'` → emits `style <id> fill:…,stroke:…;` per node.
|
|
14
|
+
* Used by `reverse` (arbitrary per-node colors, e.g. size).
|
|
15
|
+
*
|
|
16
|
+
* License: MIT (part of DARE CLI).
|
|
17
|
+
*/
|
|
18
|
+
export interface GraphNode {
|
|
19
|
+
id: string;
|
|
20
|
+
depends_on: string[];
|
|
21
|
+
/** Lines composing the node label (joined with the renderer's separator). */
|
|
22
|
+
labelLines: string[];
|
|
23
|
+
/** Background fill (Excalidraw, Mermaid inline, DOT fillcolor). */
|
|
24
|
+
bg: string;
|
|
25
|
+
/** Stroke / border color. */
|
|
26
|
+
stroke: string;
|
|
27
|
+
/** Dashed border (Excalidraw / inline). */
|
|
28
|
+
dashed?: boolean;
|
|
29
|
+
/** Mermaid class name when using class-based styling (e.g. `st_done`). */
|
|
30
|
+
mermaidClass?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface MermaidOptions {
|
|
33
|
+
/** Goes into `%% <headerComment>` at the top (caller pre-escapes). */
|
|
34
|
+
headerComment: string;
|
|
35
|
+
direction?: 'LR' | 'TB';
|
|
36
|
+
styling: 'class' | 'inline';
|
|
37
|
+
/** Emitted (indented) when `styling === 'class'`. */
|
|
38
|
+
classDefs?: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface DotOptions {
|
|
41
|
+
/** `digraph <name> { … }`. */
|
|
42
|
+
name: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ExcalidrawOptions {
|
|
45
|
+
/** Stamped into the Excalidraw `source` field. */
|
|
46
|
+
source: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Compute layout ranks for a set of nodes from their `depends_on` edges.
|
|
50
|
+
* Nodes with no dependencies are rank 0; otherwise rank = max(parent) + 1.
|
|
51
|
+
* Throws on circular dependencies (same contract as the DAG runner).
|
|
52
|
+
*/
|
|
53
|
+
export declare function computeRanks(nodes: GraphNode[]): Map<string, number>;
|
|
54
|
+
export declare function sanitizeId(id: string): string;
|
|
55
|
+
export declare function escapeMermaid(s: string): string;
|
|
56
|
+
export declare function renderGraphMermaid(nodes: GraphNode[], opts: MermaidOptions): string;
|
|
57
|
+
export declare function renderGraphDot(nodes: GraphNode[], opts: DotOptions): string;
|
|
58
|
+
interface ExcalidrawElement {
|
|
59
|
+
id: string;
|
|
60
|
+
type: string;
|
|
61
|
+
x: number;
|
|
62
|
+
y: number;
|
|
63
|
+
width?: number;
|
|
64
|
+
height?: number;
|
|
65
|
+
angle?: number;
|
|
66
|
+
strokeColor?: string;
|
|
67
|
+
backgroundColor?: string;
|
|
68
|
+
fillStyle?: string;
|
|
69
|
+
strokeWidth?: number;
|
|
70
|
+
strokeStyle?: string;
|
|
71
|
+
roughness?: number;
|
|
72
|
+
opacity?: number;
|
|
73
|
+
roundness?: {
|
|
74
|
+
type: number;
|
|
75
|
+
value: number;
|
|
76
|
+
};
|
|
77
|
+
text?: string;
|
|
78
|
+
fontSize?: number;
|
|
79
|
+
fontFamily?: number;
|
|
80
|
+
textAlign?: string;
|
|
81
|
+
verticalAlign?: string;
|
|
82
|
+
startBinding?: {
|
|
83
|
+
elementId: string;
|
|
84
|
+
};
|
|
85
|
+
endBinding?: {
|
|
86
|
+
elementId: string;
|
|
87
|
+
};
|
|
88
|
+
startArrowType?: string;
|
|
89
|
+
endArrowType?: string;
|
|
90
|
+
boundElements?: Array<{
|
|
91
|
+
id: string;
|
|
92
|
+
type: string;
|
|
93
|
+
}>;
|
|
94
|
+
updated?: number;
|
|
95
|
+
link?: null;
|
|
96
|
+
locked?: boolean;
|
|
97
|
+
seed?: number;
|
|
98
|
+
versionNonce?: number;
|
|
99
|
+
}
|
|
100
|
+
export interface ExcalidrawData {
|
|
101
|
+
type: string;
|
|
102
|
+
version: number;
|
|
103
|
+
source: string;
|
|
104
|
+
elements: ExcalidrawElement[];
|
|
105
|
+
appState: {
|
|
106
|
+
gridMode: string;
|
|
107
|
+
gridSize: number;
|
|
108
|
+
viewBackgroundColor?: string;
|
|
109
|
+
};
|
|
110
|
+
files: Record<string, unknown>;
|
|
111
|
+
}
|
|
112
|
+
export declare function renderGraphExcalidraw(nodes: GraphNode[], opts: ExcalidrawOptions): ExcalidrawData;
|
|
113
|
+
export declare function serializeExcalidraw(data: ExcalidrawData): string;
|
|
114
|
+
export {};
|
|
115
|
+
//# sourceMappingURL=graph-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/graph-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic graph renderer — the shared core behind `dare dag viz` (the task
|
|
3
|
+
* DAG) and `dare reverse` (the module-dependency graph).
|
|
4
|
+
*
|
|
5
|
+
* Callers map their domain objects (DagTask, Module, …) to `GraphNode`,
|
|
6
|
+
* resolving colors / labels / styling, and this module owns the layout
|
|
7
|
+
* (rank grouping via the same Kahn-style traversal the DAG uses) and the
|
|
8
|
+
* serialization to Mermaid, Graphviz DOT, and Excalidraw JSON.
|
|
9
|
+
*
|
|
10
|
+
* Two styling strategies for Mermaid:
|
|
11
|
+
* - `'class'` → emits `class <id> <cls>;` + shared `classDef` lines.
|
|
12
|
+
* Used by the DAG (status-driven palette).
|
|
13
|
+
* - `'inline'` → emits `style <id> fill:…,stroke:…;` per node.
|
|
14
|
+
* Used by `reverse` (arbitrary per-node colors, e.g. size).
|
|
15
|
+
*
|
|
16
|
+
* License: MIT (part of DARE CLI).
|
|
17
|
+
*/
|
|
18
|
+
// ─── Rank computation (Kahn-style, mirrors run_dag.computeRanks) ─────────────
|
|
19
|
+
/**
|
|
20
|
+
* Compute layout ranks for a set of nodes from their `depends_on` edges.
|
|
21
|
+
* Nodes with no dependencies are rank 0; otherwise rank = max(parent) + 1.
|
|
22
|
+
* Throws on circular dependencies (same contract as the DAG runner).
|
|
23
|
+
*/
|
|
24
|
+
export function computeRanks(nodes) {
|
|
25
|
+
const ranks = new Map();
|
|
26
|
+
const byId = new Map(nodes.map((n) => [n.id, n]));
|
|
27
|
+
function getRank(id, visited = new Set()) {
|
|
28
|
+
if (ranks.has(id))
|
|
29
|
+
return ranks.get(id);
|
|
30
|
+
if (visited.has(id)) {
|
|
31
|
+
throw new Error(`Circular dependency detected: ${id}`);
|
|
32
|
+
}
|
|
33
|
+
visited.add(id);
|
|
34
|
+
const node = byId.get(id);
|
|
35
|
+
// Unknown dependency targets are treated as rank-0 anchors so a missing
|
|
36
|
+
// edge never crashes a best-effort reverse-engineering render.
|
|
37
|
+
if (!node || node.depends_on.length === 0) {
|
|
38
|
+
ranks.set(id, 0);
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
const maxDep = Math.max(...node.depends_on.map((dep) => getRank(dep, new Set(visited))));
|
|
42
|
+
const rank = maxDep + 1;
|
|
43
|
+
ranks.set(id, rank);
|
|
44
|
+
return rank;
|
|
45
|
+
}
|
|
46
|
+
for (const n of nodes)
|
|
47
|
+
getRank(n.id);
|
|
48
|
+
return ranks;
|
|
49
|
+
}
|
|
50
|
+
function groupByRank(nodes, ranks) {
|
|
51
|
+
const byRank = new Map();
|
|
52
|
+
for (const node of nodes) {
|
|
53
|
+
const r = ranks.get(node.id) ?? 0;
|
|
54
|
+
if (!byRank.has(r))
|
|
55
|
+
byRank.set(r, []);
|
|
56
|
+
byRank.get(r).push(node);
|
|
57
|
+
}
|
|
58
|
+
return byRank;
|
|
59
|
+
}
|
|
60
|
+
// ─── Shared helpers ──────────────────────────────────────────────────────────
|
|
61
|
+
export function sanitizeId(id) {
|
|
62
|
+
return id.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
63
|
+
}
|
|
64
|
+
export function escapeMermaid(s) {
|
|
65
|
+
return s.replace(/"/g, '"').replace(/[\r\n]+/g, ' ');
|
|
66
|
+
}
|
|
67
|
+
// ─── Mermaid ──────────────────────────────────────────────────────────────────
|
|
68
|
+
export function renderGraphMermaid(nodes, opts) {
|
|
69
|
+
const dir = opts.direction ?? 'LR';
|
|
70
|
+
const lines = [
|
|
71
|
+
`%% ${opts.headerComment}`,
|
|
72
|
+
`%% Generated: ${new Date().toISOString()}`,
|
|
73
|
+
`graph ${dir}`,
|
|
74
|
+
];
|
|
75
|
+
const ranks = computeRanks(nodes);
|
|
76
|
+
const byRank = groupByRank(nodes, ranks);
|
|
77
|
+
const sortedRanks = [...byRank.keys()].sort((a, b) => a - b);
|
|
78
|
+
for (const r of sortedRanks) {
|
|
79
|
+
lines.push(` subgraph rank_${r} ["Rank ${r}"]`);
|
|
80
|
+
lines.push(` direction TB`);
|
|
81
|
+
for (const node of byRank.get(r)) {
|
|
82
|
+
const id = sanitizeId(node.id);
|
|
83
|
+
const label = node.labelLines.map(escapeMermaid).join('\\n');
|
|
84
|
+
lines.push(` ${id}["${label}"]`);
|
|
85
|
+
}
|
|
86
|
+
lines.push(' end');
|
|
87
|
+
}
|
|
88
|
+
for (const node of nodes) {
|
|
89
|
+
for (const dep of node.depends_on) {
|
|
90
|
+
lines.push(` ${sanitizeId(dep)} --> ${sanitizeId(node.id)}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (opts.styling === 'class') {
|
|
94
|
+
for (const node of nodes) {
|
|
95
|
+
lines.push(` class ${sanitizeId(node.id)} ${node.mermaidClass};`);
|
|
96
|
+
}
|
|
97
|
+
for (const cls of opts.classDefs ?? [])
|
|
98
|
+
lines.push(` ${cls}`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
for (const node of nodes) {
|
|
102
|
+
lines.push(` style ${sanitizeId(node.id)} fill:${node.bg},stroke:${node.stroke};`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return lines.join('\n');
|
|
106
|
+
}
|
|
107
|
+
// ─── Graphviz DOT ──────────────────────────────────────────────────────────────
|
|
108
|
+
export function renderGraphDot(nodes, opts) {
|
|
109
|
+
const lines = [
|
|
110
|
+
`digraph ${opts.name} {`,
|
|
111
|
+
' rankdir=LR;',
|
|
112
|
+
' node [shape=box style=filled fontname=Helvetica];',
|
|
113
|
+
];
|
|
114
|
+
for (const node of nodes) {
|
|
115
|
+
const id = JSON.stringify(node.id);
|
|
116
|
+
const label = JSON.stringify(node.labelLines.join('\n'));
|
|
117
|
+
lines.push(` ${id} [label=${label} fillcolor="${node.bg}" color="${node.stroke}"];`);
|
|
118
|
+
}
|
|
119
|
+
for (const node of nodes) {
|
|
120
|
+
for (const dep of node.depends_on) {
|
|
121
|
+
lines.push(` ${JSON.stringify(dep)} -> ${JSON.stringify(node.id)};`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
lines.push('}');
|
|
125
|
+
return lines.join('\n');
|
|
126
|
+
}
|
|
127
|
+
function randomId() {
|
|
128
|
+
return Math.random().toString(36).substr(2, 9);
|
|
129
|
+
}
|
|
130
|
+
function createNodeRect(node, x, y) {
|
|
131
|
+
return {
|
|
132
|
+
id: node.id,
|
|
133
|
+
type: 'rectangle',
|
|
134
|
+
x,
|
|
135
|
+
y,
|
|
136
|
+
width: 120,
|
|
137
|
+
height: 60,
|
|
138
|
+
angle: 0,
|
|
139
|
+
strokeColor: node.stroke,
|
|
140
|
+
backgroundColor: node.bg,
|
|
141
|
+
fillStyle: 'hachure',
|
|
142
|
+
strokeWidth: 2,
|
|
143
|
+
strokeStyle: node.dashed ? 'dashed' : 'solid',
|
|
144
|
+
roughness: 0,
|
|
145
|
+
opacity: 100,
|
|
146
|
+
roundness: { type: 2, value: 6 },
|
|
147
|
+
text: node.labelLines.join('\n'),
|
|
148
|
+
fontSize: 12,
|
|
149
|
+
fontFamily: 1, // Virgil (default Excalidraw font)
|
|
150
|
+
textAlign: 'center',
|
|
151
|
+
verticalAlign: 'middle',
|
|
152
|
+
boundElements: [],
|
|
153
|
+
updated: Date.now(),
|
|
154
|
+
link: null,
|
|
155
|
+
locked: false,
|
|
156
|
+
seed: Math.floor(Math.random() * 2147483647),
|
|
157
|
+
versionNonce: Math.floor(Math.random() * 2147483647),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function createEdgeArrow(fromId, toId) {
|
|
161
|
+
return {
|
|
162
|
+
id: randomId(),
|
|
163
|
+
type: 'arrow',
|
|
164
|
+
x: 0, // computed from start/end binding by Excalidraw
|
|
165
|
+
y: 0,
|
|
166
|
+
startBinding: { elementId: fromId },
|
|
167
|
+
endBinding: { elementId: toId },
|
|
168
|
+
startArrowType: 'dot',
|
|
169
|
+
endArrowType: 'arrow',
|
|
170
|
+
strokeColor: '#999999',
|
|
171
|
+
strokeWidth: 2,
|
|
172
|
+
strokeStyle: 'solid',
|
|
173
|
+
roughness: 0,
|
|
174
|
+
opacity: 100,
|
|
175
|
+
updated: Date.now(),
|
|
176
|
+
link: null,
|
|
177
|
+
locked: false,
|
|
178
|
+
seed: Math.floor(Math.random() * 2147483647),
|
|
179
|
+
versionNonce: Math.floor(Math.random() * 2147483647),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
export function renderGraphExcalidraw(nodes, opts) {
|
|
183
|
+
const elements = [];
|
|
184
|
+
const ranks = computeRanks(nodes);
|
|
185
|
+
const byRank = groupByRank(nodes, ranks);
|
|
186
|
+
const sortedRanks = [...byRank.keys()].sort((a, b) => a - b);
|
|
187
|
+
for (const rank of sortedRanks) {
|
|
188
|
+
const inRank = byRank.get(rank);
|
|
189
|
+
for (let i = 0; i < inRank.length; i++) {
|
|
190
|
+
const x = 20 + i * 140;
|
|
191
|
+
const y = 20 + rank * 160;
|
|
192
|
+
elements.push(createNodeRect(inRank[i], x, y));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
for (const node of nodes) {
|
|
196
|
+
for (const dep of node.depends_on) {
|
|
197
|
+
elements.push(createEdgeArrow(dep, node.id));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
type: 'excalidraw',
|
|
202
|
+
version: 2,
|
|
203
|
+
source: opts.source,
|
|
204
|
+
elements,
|
|
205
|
+
appState: {
|
|
206
|
+
gridMode: 'grid',
|
|
207
|
+
gridSize: 20,
|
|
208
|
+
viewBackgroundColor: '#ffffff',
|
|
209
|
+
},
|
|
210
|
+
files: {},
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export function serializeExcalidraw(data) {
|
|
214
|
+
return JSON.stringify(data, null, 2);
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=graph-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-renderer.js","sourceRoot":"","sources":["../../src/utils/graph-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration planning for `dare migrate` (Phase 2 brownfield).
|
|
3
|
+
*
|
|
4
|
+
* Consumes the reverse/dna artifacts and produces a migration plan skeleton +
|
|
5
|
+
* one Gherkin parity feature stub per module. The CLI is deterministic (reads
|
|
6
|
+
* facts, lists blocking gaps from the Phase-1 confidence markers, scaffolds
|
|
7
|
+
* skeletons); the `/dare-migrate` skill writes the real strategy, risk
|
|
8
|
+
* analysis, and parity scenarios.
|
|
9
|
+
*
|
|
10
|
+
* Concept inspired by the Reversa migration team + parity scenarios
|
|
11
|
+
* (Macedo & da Costa, arXiv:2605.18684, 2026) — clean-room, deterministic.
|
|
12
|
+
*
|
|
13
|
+
* License: MIT (part of DARE CLI).
|
|
14
|
+
*/
|
|
15
|
+
export interface KnownTarget {
|
|
16
|
+
value: string;
|
|
17
|
+
label: string;
|
|
18
|
+
}
|
|
19
|
+
/** Target stacks we give tailored hints for. `--to` also accepts free text. */
|
|
20
|
+
export declare const KNOWN_TARGETS: KnownTarget[];
|
|
21
|
+
export interface MigrationModule {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
path: string;
|
|
25
|
+
size: string;
|
|
26
|
+
}
|
|
27
|
+
export interface BlockingGap {
|
|
28
|
+
spec: string;
|
|
29
|
+
gaps: number;
|
|
30
|
+
}
|
|
31
|
+
export interface MigrationFacts {
|
|
32
|
+
generatedAt: string;
|
|
33
|
+
source: {
|
|
34
|
+
name: string;
|
|
35
|
+
structure: string;
|
|
36
|
+
stack: string;
|
|
37
|
+
};
|
|
38
|
+
target: {
|
|
39
|
+
stack: string;
|
|
40
|
+
};
|
|
41
|
+
modules: MigrationModule[];
|
|
42
|
+
blockingGaps: {
|
|
43
|
+
total: number;
|
|
44
|
+
perSpec: BlockingGap[];
|
|
45
|
+
};
|
|
46
|
+
conventions: {
|
|
47
|
+
architecture?: string;
|
|
48
|
+
testing?: string;
|
|
49
|
+
libraries?: Record<string, string | undefined>;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface ReverseArtifacts {
|
|
53
|
+
reverseFacts: Record<string, any>;
|
|
54
|
+
dnaFacts: Record<string, any> | null;
|
|
55
|
+
}
|
|
56
|
+
/** Path to the reverse-facts.json that `dare migrate` requires. */
|
|
57
|
+
export declare function reverseFactsPath(root: string): string;
|
|
58
|
+
export declare function loadReverseArtifacts(root: string): Promise<ReverseArtifacts | null>;
|
|
59
|
+
export declare function buildMigrationFacts(artifacts: ReverseArtifacts, target: string, generatedAt: string): MigrationFacts;
|
|
60
|
+
/** A safe file slug for a per-module .feature filename. */
|
|
61
|
+
export declare function parityFeatureFilename(mod: MigrationModule): string;
|
|
62
|
+
export declare function renderParityFeature(mod: MigrationFacts['modules'][number]): string;
|
|
63
|
+
export declare function renderMigrationDoc(facts: MigrationFacts): string;
|
|
64
|
+
//# sourceMappingURL=migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/utils/migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,+EAA+E;AAC/E,eAAO,MAAM,aAAa,EAAE,WAAW,EAStC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,WAAW,EAAE,CAAC;KACxB,CAAC;IACF,WAAW,EAAE;QACX,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;KAChD,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CACtC;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAUzF;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,gBAAgB,EAC3B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,cAAc,CA8ChB;AAID,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAElE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAelF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA4EhE"}
|