gsd-pi 2.44.0-dev.62b5d6c → 2.44.0-dev.73f2fd5
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 +30 -12
- package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
- package/dist/resources/extensions/gsd/auto/phases.js +36 -36
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +10 -0
- package/dist/resources/extensions/gsd/auto-timers.js +57 -3
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +9 -6
- package/dist/resources/extensions/gsd/auto.js +30 -3
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +156 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
- package/dist/resources/extensions/gsd/db-writer.js +34 -16
- package/dist/resources/extensions/gsd/doctor.js +8 -0
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +12 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/preferences.js +9 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
- package/dist/resources/extensions/gsd/state.js +19 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +6 -0
- package/dist/resources/extensions/mcp-client/index.js +14 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +20 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +17 -0
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +21 -1
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/main.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
- package/src/resources/extensions/gsd/auto/phases.ts +45 -48
- package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +14 -0
- package/src/resources/extensions/gsd/auto-timers.ts +64 -3
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +9 -6
- package/src/resources/extensions/gsd/auto.ts +37 -3
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +148 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
- package/src/resources/extensions/gsd/db-writer.ts +39 -17
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +16 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
- package/src/resources/extensions/gsd/preferences.ts +11 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/state.ts +19 -1
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/preferences.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
- package/src/resources/extensions/gsd/worktree-resolver.ts +7 -0
- package/src/resources/extensions/mcp-client/index.ts +20 -0
- /package/dist/web/standalone/.next/static/{fOnWQBjWXMKUs4bqTg530 → kxxAA66bah_yhPYqLBHE2}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{fOnWQBjWXMKUs4bqTg530 → kxxAA66bah_yhPYqLBHE2}/_ssgManifest.js +0 -0
|
@@ -4,90 +4,90 @@
|
|
|
4
4
|
import { readFileSync } from "node:fs";
|
|
5
5
|
import { join, dirname } from "node:path";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
|
-
import {
|
|
7
|
+
import { test } from 'node:test';
|
|
8
|
+
import assert from 'node:assert/strict';
|
|
8
9
|
|
|
9
10
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
|
-
const { assertTrue, assertEq, report } = createTestContext();
|
|
11
11
|
|
|
12
12
|
const overlaySrc = readFileSync(join(__dirname, "..", "visualizer-overlay.ts"), "utf-8");
|
|
13
13
|
|
|
14
14
|
console.log("\n=== Overlay: Tab Configuration ===");
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
assert.ok(
|
|
17
17
|
overlaySrc.includes("TAB_COUNT = 10"),
|
|
18
18
|
"TAB_COUNT is 10",
|
|
19
19
|
);
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
assert.ok(
|
|
22
22
|
overlaySrc.includes('"1 Progress"'),
|
|
23
23
|
"has Progress tab label",
|
|
24
24
|
);
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
assert.ok(
|
|
27
27
|
overlaySrc.includes('"2 Timeline"'),
|
|
28
28
|
"has Timeline tab label",
|
|
29
29
|
);
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
assert.ok(
|
|
32
32
|
overlaySrc.includes('"3 Deps"'),
|
|
33
33
|
"has Deps tab label",
|
|
34
34
|
);
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
assert.ok(
|
|
37
37
|
overlaySrc.includes('"5 Health"'),
|
|
38
38
|
"has Health tab label",
|
|
39
39
|
);
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
assert.ok(
|
|
42
42
|
overlaySrc.includes('"6 Agent"'),
|
|
43
43
|
"has Agent tab label",
|
|
44
44
|
);
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
assert.ok(
|
|
47
47
|
overlaySrc.includes('"7 Changes"'),
|
|
48
48
|
"has Changes tab label",
|
|
49
49
|
);
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
assert.ok(
|
|
52
52
|
overlaySrc.includes('"8 Knowledge"'),
|
|
53
53
|
"has Knowledge tab label",
|
|
54
54
|
);
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
assert.ok(
|
|
57
57
|
overlaySrc.includes('"9 Captures"'),
|
|
58
58
|
"has Captures tab label",
|
|
59
59
|
);
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
assert.ok(
|
|
62
62
|
overlaySrc.includes('"0 Export"'),
|
|
63
63
|
"has Export tab label",
|
|
64
64
|
);
|
|
65
65
|
|
|
66
66
|
console.log("\n=== Overlay: Filter Mode ===");
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
assert.ok(
|
|
69
69
|
overlaySrc.includes('filterMode = false'),
|
|
70
70
|
"filterMode initialized to false",
|
|
71
71
|
);
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
assert.ok(
|
|
74
74
|
overlaySrc.includes('filterText = ""'),
|
|
75
75
|
"filterText initialized to empty string",
|
|
76
76
|
);
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
assert.ok(
|
|
79
79
|
overlaySrc.includes('filterField:'),
|
|
80
80
|
"has filterField state",
|
|
81
81
|
);
|
|
82
82
|
|
|
83
83
|
// Filter mode entry via "/"
|
|
84
|
-
|
|
84
|
+
assert.ok(
|
|
85
85
|
overlaySrc.includes('data === "/"') || overlaySrc.includes("data === '/'"),
|
|
86
86
|
"/ key enters filter mode",
|
|
87
87
|
);
|
|
88
88
|
|
|
89
89
|
// Filter field cycling via "f"
|
|
90
|
-
|
|
90
|
+
assert.ok(
|
|
91
91
|
overlaySrc.includes('data === "f"') || overlaySrc.includes("data === 'f'"),
|
|
92
92
|
"f key cycles filter field",
|
|
93
93
|
);
|
|
@@ -95,143 +95,141 @@ assertTrue(
|
|
|
95
95
|
console.log("\n=== Overlay: Tab Switching ===");
|
|
96
96
|
|
|
97
97
|
// Supports 1-9,0 keys
|
|
98
|
-
|
|
98
|
+
assert.ok(
|
|
99
99
|
overlaySrc.includes('"1234567890"'),
|
|
100
100
|
"supports keys 1-9,0 for tab switching",
|
|
101
101
|
);
|
|
102
102
|
|
|
103
103
|
// Tab wraps with TAB_COUNT
|
|
104
|
-
|
|
104
|
+
assert.ok(
|
|
105
105
|
overlaySrc.includes("% TAB_COUNT"),
|
|
106
106
|
"tab key wraps around TAB_COUNT",
|
|
107
107
|
);
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
assert.ok(
|
|
110
110
|
overlaySrc.includes('Key.shift("tab")') || overlaySrc.includes("Key.shift('tab')"),
|
|
111
111
|
"supports Shift+Tab for reverse tab switching",
|
|
112
112
|
);
|
|
113
113
|
|
|
114
114
|
console.log("\n=== Overlay: Page/Half-Page Scroll ===");
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
assert.ok(
|
|
117
117
|
overlaySrc.includes("Key.pageUp"),
|
|
118
118
|
"has Key.pageUp handler",
|
|
119
119
|
);
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
assert.ok(
|
|
122
122
|
overlaySrc.includes("Key.pageDown"),
|
|
123
123
|
"has Key.pageDown handler",
|
|
124
124
|
);
|
|
125
125
|
|
|
126
|
-
|
|
126
|
+
assert.ok(
|
|
127
127
|
overlaySrc.includes('Key.ctrl("u")'),
|
|
128
128
|
"has Ctrl+U half-page scroll",
|
|
129
129
|
);
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
assert.ok(
|
|
132
132
|
overlaySrc.includes('Key.ctrl("d")'),
|
|
133
133
|
"has Ctrl+D half-page scroll",
|
|
134
134
|
);
|
|
135
135
|
|
|
136
136
|
console.log("\n=== Overlay: Mouse Support ===");
|
|
137
137
|
|
|
138
|
-
|
|
138
|
+
assert.ok(
|
|
139
139
|
overlaySrc.includes("parseSGRMouse"),
|
|
140
140
|
"has parseSGRMouse method",
|
|
141
141
|
);
|
|
142
142
|
|
|
143
|
-
|
|
143
|
+
assert.ok(
|
|
144
144
|
overlaySrc.includes("?1003h"),
|
|
145
145
|
"enables mouse tracking in constructor",
|
|
146
146
|
);
|
|
147
147
|
|
|
148
|
-
|
|
148
|
+
assert.ok(
|
|
149
149
|
overlaySrc.includes("?1003l"),
|
|
150
150
|
"disables mouse tracking in dispose",
|
|
151
151
|
);
|
|
152
152
|
|
|
153
153
|
console.log("\n=== Overlay: Collapsible Milestones ===");
|
|
154
154
|
|
|
155
|
-
|
|
155
|
+
assert.ok(
|
|
156
156
|
overlaySrc.includes("collapsedMilestones"),
|
|
157
157
|
"has collapsedMilestones state",
|
|
158
158
|
);
|
|
159
159
|
|
|
160
160
|
console.log("\n=== Overlay: Help Overlay ===");
|
|
161
161
|
|
|
162
|
-
|
|
162
|
+
assert.ok(
|
|
163
163
|
overlaySrc.includes("showHelp"),
|
|
164
164
|
"has showHelp state",
|
|
165
165
|
);
|
|
166
166
|
|
|
167
|
-
|
|
167
|
+
assert.ok(
|
|
168
168
|
overlaySrc.includes('data === "?"'),
|
|
169
169
|
"? key toggles help",
|
|
170
170
|
);
|
|
171
171
|
|
|
172
172
|
console.log("\n=== Overlay: Export Key Interception ===");
|
|
173
173
|
|
|
174
|
-
|
|
174
|
+
assert.ok(
|
|
175
175
|
overlaySrc.includes("activeTab === 9"),
|
|
176
176
|
"export key handling checks for tab 0 (index 9)",
|
|
177
177
|
);
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
assert.ok(
|
|
180
180
|
overlaySrc.includes('handleExportKey'),
|
|
181
181
|
"has handleExportKey method",
|
|
182
182
|
);
|
|
183
183
|
|
|
184
|
-
|
|
184
|
+
assert.ok(
|
|
185
185
|
overlaySrc.includes('"m"') && overlaySrc.includes('"j"') && overlaySrc.includes('"s"'),
|
|
186
186
|
"handles m, j, s keys for export",
|
|
187
187
|
);
|
|
188
188
|
|
|
189
189
|
console.log("\n=== Overlay: Footer ===");
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
assert.ok(
|
|
192
192
|
overlaySrc.includes("1-9,0"),
|
|
193
193
|
"footer hint shows 1-9,0 tab range",
|
|
194
194
|
);
|
|
195
195
|
|
|
196
|
-
|
|
196
|
+
assert.ok(
|
|
197
197
|
overlaySrc.includes("PgUp/PgDn"),
|
|
198
198
|
"footer hint mentions PgUp/PgDn",
|
|
199
199
|
);
|
|
200
200
|
|
|
201
|
-
|
|
201
|
+
assert.ok(
|
|
202
202
|
overlaySrc.includes("? help"),
|
|
203
203
|
"footer hint mentions ? for help",
|
|
204
204
|
);
|
|
205
205
|
|
|
206
206
|
console.log("\n=== Overlay: Scroll Offsets ===");
|
|
207
207
|
|
|
208
|
-
|
|
208
|
+
assert.ok(
|
|
209
209
|
overlaySrc.includes(`new Array(TAB_COUNT).fill(0)`),
|
|
210
210
|
"scroll offsets sized to TAB_COUNT",
|
|
211
211
|
);
|
|
212
212
|
|
|
213
213
|
console.log("\n=== Overlay: Terminal Resize Handling ===");
|
|
214
214
|
|
|
215
|
-
|
|
215
|
+
assert.ok(
|
|
216
216
|
overlaySrc.includes('resizeHandler'),
|
|
217
217
|
"has resizeHandler property",
|
|
218
218
|
);
|
|
219
219
|
|
|
220
|
-
|
|
220
|
+
assert.ok(
|
|
221
221
|
overlaySrc.includes('"resize"'),
|
|
222
222
|
"listens for resize events",
|
|
223
223
|
);
|
|
224
224
|
|
|
225
|
-
|
|
225
|
+
assert.ok(
|
|
226
226
|
overlaySrc.includes('removeListener("resize"'),
|
|
227
227
|
"removes resize listener on dispose",
|
|
228
228
|
);
|
|
229
229
|
|
|
230
230
|
console.log("\n=== Overlay: Shared Imports ===");
|
|
231
231
|
|
|
232
|
-
|
|
232
|
+
assert.ok(
|
|
233
233
|
overlaySrc.includes('from "../shared/mod.js"'),
|
|
234
234
|
"imports from shared barrel",
|
|
235
235
|
);
|
|
236
|
-
|
|
237
|
-
report();
|
|
@@ -14,9 +14,9 @@ import {
|
|
|
14
14
|
renderHealthView,
|
|
15
15
|
} from "../visualizer-views.js";
|
|
16
16
|
import type { VisualizerData } from "../visualizer-data.js";
|
|
17
|
-
import {
|
|
17
|
+
import { test } from 'node:test';
|
|
18
|
+
import assert from 'node:assert/strict';
|
|
18
19
|
|
|
19
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
20
20
|
|
|
21
21
|
// ─── Mock theme ─────────────────────────────────────────────────────────────
|
|
22
22
|
|
|
@@ -165,19 +165,19 @@ console.log("\n=== renderProgressView ===");
|
|
|
165
165
|
});
|
|
166
166
|
|
|
167
167
|
const lines = renderProgressView(data, mockTheme, 80);
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
168
|
+
assert.ok(lines.length > 0, "progress view produces output");
|
|
169
|
+
assert.ok(lines.some(l => l.includes("M001")), "shows milestone M001");
|
|
170
|
+
assert.ok(lines.some(l => l.includes("S01")), "shows slice S01");
|
|
171
|
+
assert.ok(lines.some(l => l.includes("T01")), "shows task T01 for active slice");
|
|
172
|
+
assert.ok(lines.some(l => l.includes("M002")), "shows milestone M002");
|
|
173
|
+
assert.ok(lines.some(l => l.includes("depends on M001")), "shows dependency note");
|
|
174
|
+
assert.ok(lines.some(l => l.includes("30m")), "shows task estimate");
|
|
175
|
+
assert.ok(lines.some(l => l.includes("Feature Snapshot")), "shows stats header");
|
|
176
|
+
assert.ok(lines.some(l => l.includes("Missing slices")), "shows missing slices count");
|
|
177
|
+
assert.ok(lines.some(l => l.includes("State Engine")), "shows missing slice preview");
|
|
178
|
+
assert.ok(lines.some(l => l.includes("Updated (last 7 days)")), "shows updated count");
|
|
179
|
+
assert.ok(lines.some(l => l.includes("Recent completions")), "shows recent completions section");
|
|
180
|
+
assert.ok(lines.some(l => l.includes("Core structures assembled")), "shows recent one-liner entry");
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
{
|
|
@@ -211,10 +211,10 @@ console.log("\n=== renderProgressView ===");
|
|
|
211
211
|
});
|
|
212
212
|
|
|
213
213
|
const lines = renderProgressView(data, mockTheme, 80);
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
214
|
+
assert.ok(lines.some(l => l.includes("Discussion Status")), "shows discussion section");
|
|
215
|
+
assert.ok(lines.some(l => l.includes("Discussed: 1")), "counts discussed milestones");
|
|
216
|
+
assert.ok(lines.some(l => l.includes("Draft")), "shows draft badge");
|
|
217
|
+
assert.ok(lines.some(l => l.includes("Pending")), "shows pending badge");
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
// Verification badges
|
|
@@ -239,14 +239,14 @@ console.log("\n=== renderProgressView ===");
|
|
|
239
239
|
|
|
240
240
|
const lines = renderProgressView(data, mockTheme, 80);
|
|
241
241
|
// The verification badge should show check mark and warning
|
|
242
|
-
|
|
242
|
+
assert.ok(lines.some(l => l.includes("S01")), "shows slice with verification");
|
|
243
243
|
}
|
|
244
244
|
|
|
245
245
|
{
|
|
246
246
|
const data = makeVisualizerData({ milestones: [] });
|
|
247
247
|
const lines = renderProgressView(data, mockTheme, 80);
|
|
248
|
-
|
|
249
|
-
|
|
248
|
+
assert.ok(lines.some(l => l.includes("Feature Snapshot")), "shows stats snapshot even when no milestones");
|
|
249
|
+
assert.ok(lines.some(l => l.includes("Missing slices")), "reports missing slices count");
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
// ─── Risk Heatmap ───────────────────────────────────────────────────────────
|
|
@@ -272,9 +272,9 @@ console.log("\n=== Risk Heatmap ===");
|
|
|
272
272
|
});
|
|
273
273
|
|
|
274
274
|
const lines = renderProgressView(data, mockTheme, 80);
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
275
|
+
assert.ok(lines.some(l => l.includes("Risk Heatmap")), "heatmap header present");
|
|
276
|
+
assert.ok(lines.some(l => l.includes("1 low, 1 med, 2 high")), "risk summary counts");
|
|
277
|
+
assert.ok(lines.some(l => l.includes("1 high-risk not started")), "high-risk not started warning");
|
|
278
278
|
}
|
|
279
279
|
|
|
280
280
|
// ─── Search/Filter ──────────────────────────────────────────────────────────
|
|
@@ -305,11 +305,11 @@ console.log("\n=== Search/Filter ===");
|
|
|
305
305
|
});
|
|
306
306
|
|
|
307
307
|
const filtered = renderProgressView(data, mockTheme, 80, { text: "auth", field: "all" });
|
|
308
|
-
|
|
309
|
-
|
|
308
|
+
assert.ok(filtered.some(l => l.includes("M001")), "filter shows matching milestone");
|
|
309
|
+
assert.ok(filtered.some(l => l.includes("Filter (all): auth")), "filter indicator present");
|
|
310
310
|
|
|
311
311
|
const riskFiltered = renderProgressView(data, mockTheme, 80, { text: "high", field: "risk" });
|
|
312
|
-
|
|
312
|
+
assert.ok(riskFiltered.some(l => l.includes("M001")), "risk filter shows milestone with high-risk slice");
|
|
313
313
|
}
|
|
314
314
|
|
|
315
315
|
// ─── renderDepsView ─────────────────────────────────────────────────────────
|
|
@@ -354,13 +354,13 @@ console.log("\n=== renderDepsView ===");
|
|
|
354
354
|
});
|
|
355
355
|
|
|
356
356
|
const lines = renderDepsView(data, mockTheme, 80);
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
357
|
+
assert.ok(lines.length > 0, "deps view produces output");
|
|
358
|
+
assert.ok(lines.some(l => l.includes("M001") && l.includes("M002")), "shows milestone dep edge");
|
|
359
|
+
assert.ok(lines.some(l => l.includes("S01") && l.includes("S02")), "shows slice dep edge");
|
|
360
|
+
assert.ok(lines.some(l => l.includes("Critical Path")), "shows critical path section");
|
|
361
|
+
assert.ok(lines.some(l => l.includes("[CRITICAL]")), "shows CRITICAL badge");
|
|
362
|
+
assert.ok(lines.some(l => l.includes("Data Flow")), "shows data flow section");
|
|
363
|
+
assert.ok(lines.some(l => l.includes("api-types")), "shows provides artifact");
|
|
364
364
|
}
|
|
365
365
|
|
|
366
366
|
{
|
|
@@ -371,7 +371,7 @@ console.log("\n=== renderDepsView ===");
|
|
|
371
371
|
});
|
|
372
372
|
|
|
373
373
|
const lines = renderDepsView(data, mockTheme, 80);
|
|
374
|
-
|
|
374
|
+
assert.ok(lines.some(l => l.includes("No milestone dependencies")), "shows no-deps message");
|
|
375
375
|
}
|
|
376
376
|
|
|
377
377
|
// ─── renderMetricsView ──────────────────────────────────────────────────────
|
|
@@ -422,21 +422,21 @@ console.log("\n=== renderMetricsView ===");
|
|
|
422
422
|
});
|
|
423
423
|
|
|
424
424
|
const lines = renderMetricsView(data, mockTheme, 80);
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
425
|
+
assert.ok(lines.length > 0, "metrics view produces output");
|
|
426
|
+
assert.ok(lines.some(l => l.includes("$2.50")), "shows total cost");
|
|
427
|
+
assert.ok(lines.some(l => l.includes("execution")), "shows phase name");
|
|
428
|
+
assert.ok(lines.some(l => l.includes("claude-opus-4-6")), "shows model name");
|
|
429
|
+
assert.ok(lines.some(l => l.includes("By Tier")), "shows tier breakdown section");
|
|
430
|
+
assert.ok(lines.some(l => l.includes("standard")), "shows tier name");
|
|
431
|
+
assert.ok(lines.some(l => l.includes("Dynamic routing")), "shows tier savings line");
|
|
432
|
+
assert.ok(lines.some(l => l.includes("Tools: 15")), "shows tool call count");
|
|
433
|
+
assert.ok(lines.some(l => l.includes("10") && l.includes("sent")), "shows message counts");
|
|
434
434
|
}
|
|
435
435
|
|
|
436
436
|
{
|
|
437
437
|
const data = makeVisualizerData({ totals: null });
|
|
438
438
|
const lines = renderMetricsView(data, mockTheme, 80);
|
|
439
|
-
|
|
439
|
+
assert.ok(lines.some(l => l.includes("No metrics data")), "shows no-data message");
|
|
440
440
|
}
|
|
441
441
|
|
|
442
442
|
// ─── renderTimelineView ─────────────────────────────────────────────────────
|
|
@@ -464,16 +464,16 @@ console.log("\n=== renderTimelineView ===");
|
|
|
464
464
|
});
|
|
465
465
|
|
|
466
466
|
const listLines = renderTimelineView(data, mockTheme, 80);
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
467
|
+
assert.ok(listLines.length >= 1, "list view produces lines");
|
|
468
|
+
assert.ok(listLines.some(l => l.includes("execute-task")), "shows unit type");
|
|
469
|
+
assert.ok(listLines.some(l => l.includes("[standard]")), "shows tier in timeline");
|
|
470
|
+
assert.ok(listLines.some(l => l.includes("opus-4-6")), "shows shortened model");
|
|
471
471
|
}
|
|
472
472
|
|
|
473
473
|
{
|
|
474
474
|
const data = makeVisualizerData({ units: [] });
|
|
475
475
|
const lines = renderTimelineView(data, mockTheme, 80);
|
|
476
|
-
|
|
476
|
+
assert.ok(lines.some(l => l.includes("No execution history")), "shows empty message");
|
|
477
477
|
}
|
|
478
478
|
|
|
479
479
|
// ─── renderAgentView ────────────────────────────────────────────────────────
|
|
@@ -514,17 +514,17 @@ console.log("\n=== renderAgentView ===");
|
|
|
514
514
|
});
|
|
515
515
|
|
|
516
516
|
const lines = renderAgentView(data, mockTheme, 80);
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
517
|
+
assert.ok(lines.length > 0, "agent view produces output");
|
|
518
|
+
assert.ok(lines.some(l => l.includes("ACTIVE")), "shows active status");
|
|
519
|
+
assert.ok(lines.some(l => l.includes("Pressure")), "shows pressure section");
|
|
520
|
+
assert.ok(lines.some(l => l.includes("15.5%")), "shows truncation rate");
|
|
521
|
+
assert.ok(lines.some(l => l.includes("Pending captures: 3")), "shows pending captures");
|
|
522
522
|
}
|
|
523
523
|
|
|
524
524
|
{
|
|
525
525
|
const data = makeVisualizerData({ agentActivity: null });
|
|
526
526
|
const lines = renderAgentView(data, mockTheme, 80);
|
|
527
|
-
|
|
527
|
+
assert.ok(lines.some(l => l.includes("No agent activity")), "shows no-activity message");
|
|
528
528
|
}
|
|
529
529
|
|
|
530
530
|
// ─── renderChangelogView ────────────────────────────────────────────────────
|
|
@@ -559,17 +559,17 @@ console.log("\n=== renderChangelogView ===");
|
|
|
559
559
|
});
|
|
560
560
|
|
|
561
561
|
const lines = renderChangelogView(data, mockTheme, 80);
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
562
|
+
assert.ok(lines.some(l => l.includes("M001/S01")), "shows slice reference");
|
|
563
|
+
assert.ok(lines.some(l => l.includes("Decisions:")), "shows decisions section");
|
|
564
|
+
assert.ok(lines.some(l => l.includes("RS256")), "shows decision content");
|
|
565
|
+
assert.ok(lines.some(l => l.includes("Patterns:")), "shows patterns section");
|
|
566
|
+
assert.ok(lines.some(l => l.includes("Repository pattern")), "shows pattern content");
|
|
567
567
|
}
|
|
568
568
|
|
|
569
569
|
{
|
|
570
570
|
const data = makeVisualizerData({ changelog: { entries: [] } });
|
|
571
571
|
const lines = renderChangelogView(data, mockTheme, 80);
|
|
572
|
-
|
|
572
|
+
assert.ok(lines.some(l => l.includes("No completed slices")), "shows empty state");
|
|
573
573
|
}
|
|
574
574
|
|
|
575
575
|
// ─── renderExportView ───────────────────────────────────────────────────────
|
|
@@ -579,10 +579,10 @@ console.log("\n=== renderExportView ===");
|
|
|
579
579
|
{
|
|
580
580
|
const data = makeVisualizerData();
|
|
581
581
|
const lines = renderExportView(data, mockTheme, 80);
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
582
|
+
assert.ok(lines.some(l => l.includes("Export Options")), "shows export header");
|
|
583
|
+
assert.ok(lines.some(l => l.includes("[m]")), "shows markdown option");
|
|
584
|
+
assert.ok(lines.some(l => l.includes("[j]")), "shows json option");
|
|
585
|
+
assert.ok(lines.some(l => l.includes("[s]")), "shows snapshot option");
|
|
586
586
|
}
|
|
587
587
|
|
|
588
588
|
// ─── renderKnowledgeView ────────────────────────────────────────────────────
|
|
@@ -600,13 +600,13 @@ console.log("\n=== renderKnowledgeView ===");
|
|
|
600
600
|
});
|
|
601
601
|
|
|
602
602
|
const lines = renderKnowledgeView(data, mockTheme, 80);
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
603
|
+
assert.ok(lines.some(l => l.includes("Rules")), "shows rules section");
|
|
604
|
+
assert.ok(lines.some(l => l.includes("K001")), "shows rule ID");
|
|
605
|
+
assert.ok(lines.some(l => l.includes("Always use transactions")), "shows rule content");
|
|
606
|
+
assert.ok(lines.some(l => l.includes("Patterns")), "shows patterns section");
|
|
607
|
+
assert.ok(lines.some(l => l.includes("P001")), "shows pattern ID");
|
|
608
|
+
assert.ok(lines.some(l => l.includes("Lessons Learned")), "shows lessons section");
|
|
609
|
+
assert.ok(lines.some(l => l.includes("L001")), "shows lesson ID");
|
|
610
610
|
}
|
|
611
611
|
|
|
612
612
|
{
|
|
@@ -614,7 +614,7 @@ console.log("\n=== renderKnowledgeView ===");
|
|
|
614
614
|
knowledge: { exists: false, rules: [], patterns: [], lessons: [] },
|
|
615
615
|
});
|
|
616
616
|
const lines = renderKnowledgeView(data, mockTheme, 80);
|
|
617
|
-
|
|
617
|
+
assert.ok(lines.some(l => l.includes("No KNOWLEDGE.md found")), "shows no-knowledge message");
|
|
618
618
|
}
|
|
619
619
|
|
|
620
620
|
// ─── renderCapturesView ─────────────────────────────────────────────────────
|
|
@@ -635,11 +635,11 @@ console.log("\n=== renderCapturesView ===");
|
|
|
635
635
|
});
|
|
636
636
|
|
|
637
637
|
const lines = renderCapturesView(data, mockTheme, 80);
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
638
|
+
assert.ok(lines.some(l => l.includes("3") && l.includes("total")), "shows total count");
|
|
639
|
+
assert.ok(lines.some(l => l.includes("1") && l.includes("pending")), "shows pending count");
|
|
640
|
+
assert.ok(lines.some(l => l.includes("CAP-abc123")), "shows capture ID");
|
|
641
|
+
assert.ok(lines.some(l => l.includes("(inject)")), "shows classification badge");
|
|
642
|
+
assert.ok(lines.some(l => l.includes("[pending]")), "shows status badge");
|
|
643
643
|
}
|
|
644
644
|
|
|
645
645
|
{
|
|
@@ -647,7 +647,7 @@ console.log("\n=== renderCapturesView ===");
|
|
|
647
647
|
captures: { entries: [], pendingCount: 0, totalCount: 0 },
|
|
648
648
|
});
|
|
649
649
|
const lines = renderCapturesView(data, mockTheme, 80);
|
|
650
|
-
|
|
650
|
+
assert.ok(lines.some(l => l.includes("No captures recorded")), "shows empty state");
|
|
651
651
|
}
|
|
652
652
|
|
|
653
653
|
// ─── renderHealthView ───────────────────────────────────────────────────────
|
|
@@ -682,17 +682,17 @@ console.log("\n=== renderHealthView ===");
|
|
|
682
682
|
});
|
|
683
683
|
|
|
684
684
|
const lines = renderHealthView(data, mockTheme, 80);
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
685
|
+
assert.ok(lines.some(l => l.includes("Budget")), "shows budget section");
|
|
686
|
+
assert.ok(lines.some(l => l.includes("Ceiling")), "shows budget ceiling");
|
|
687
|
+
assert.ok(lines.some(l => l.includes("$20.00")), "shows ceiling amount");
|
|
688
|
+
assert.ok(lines.some(l => l.includes("Pressure")), "shows pressure section");
|
|
689
|
+
assert.ok(lines.some(l => l.includes("30.0%")), "shows truncation rate");
|
|
690
|
+
assert.ok(lines.some(l => l.includes("Routing")), "shows routing section");
|
|
691
|
+
assert.ok(lines.some(l => l.includes("standard")), "shows tier name");
|
|
692
|
+
assert.ok(lines.some(l => l.includes("2 downgraded")), "shows downgraded count");
|
|
693
|
+
assert.ok(lines.some(l => l.includes("Dynamic routing")), "shows savings line");
|
|
694
|
+
assert.ok(lines.some(l => l.includes("Session")), "shows session section");
|
|
695
|
+
assert.ok(lines.some(l => l.includes("Tool calls: 50")), "shows tool calls");
|
|
696
696
|
}
|
|
697
697
|
|
|
698
698
|
{
|
|
@@ -709,10 +709,8 @@ console.log("\n=== renderHealthView ===");
|
|
|
709
709
|
});
|
|
710
710
|
|
|
711
711
|
const lines = renderHealthView(data, mockTheme, 80);
|
|
712
|
-
|
|
713
|
-
|
|
712
|
+
assert.ok(lines.some(l => l.includes("No budget ceiling set")), "shows no-ceiling message");
|
|
713
|
+
assert.ok(lines.some(l => l.includes("compact")), "shows token profile");
|
|
714
714
|
}
|
|
715
715
|
|
|
716
716
|
// ─── Report ─────────────────────────────────────────────────────────────────
|
|
717
|
-
|
|
718
|
-
report();
|