gsd-pi 2.58.0-dev.778d6ac → 2.58.0-dev.d63175c
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 +1 -1
- package/dist/cli.js +35 -49
- package/dist/headless-ui.d.ts +0 -17
- package/dist/headless-ui.js +3 -97
- package/dist/headless.js +6 -67
- package/dist/help-text.js +0 -1
- package/dist/onboarding.js +0 -44
- package/dist/resource-loader.js +1 -16
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -16
- package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +6 -14
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +36 -59
- package/dist/resources/extensions/context7/extension-manifest.json +1 -1
- package/dist/resources/extensions/get-secrets-from-user.js +5 -8
- package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
- package/dist/resources/extensions/google-search/index.js +1 -2
- package/dist/resources/extensions/gsd/auto/phases.js +21 -25
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +20 -37
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +3 -26
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -16
- package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +5 -13
- package/dist/resources/extensions/gsd/auto-start.js +22 -35
- package/dist/resources/extensions/gsd/auto-worktree.js +12 -196
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -32
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -80
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -32
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -33
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -44
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -67
- package/dist/resources/extensions/gsd/captures.js +4 -56
- package/dist/resources/extensions/gsd/db-writer.js +8 -116
- package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -28
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +4 -5
- package/dist/resources/extensions/gsd/doctor.js +1 -3
- package/dist/resources/extensions/gsd/error-classifier.js +10 -13
- package/dist/resources/extensions/gsd/extension-manifest.json +1 -16
- package/dist/resources/extensions/gsd/forensics.js +20 -123
- package/dist/resources/extensions/gsd/git-service.js +1 -23
- package/dist/resources/extensions/gsd/gitignore.js +0 -33
- package/dist/resources/extensions/gsd/gsd-db.js +9 -36
- package/dist/resources/extensions/gsd/guided-flow.js +44 -106
- package/dist/resources/extensions/gsd/health-widget-core.js +0 -31
- package/dist/resources/extensions/gsd/health-widget.js +0 -17
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/memory-extractor.js +0 -7
- package/dist/resources/extensions/gsd/migrate-external.js +1 -8
- package/dist/resources/extensions/gsd/model-cost-table.js +0 -18
- package/dist/resources/extensions/gsd/model-router.js +1 -35
- package/dist/resources/extensions/gsd/native-git-bridge.js +0 -17
- package/dist/resources/extensions/gsd/notifications.js +1 -16
- package/dist/resources/extensions/gsd/parallel-eligibility.js +2 -13
- package/dist/resources/extensions/gsd/parallel-merge.js +5 -78
- package/dist/resources/extensions/gsd/parsers-legacy.js +3 -20
- package/dist/resources/extensions/gsd/paths.js +0 -43
- package/dist/resources/extensions/gsd/preferences-models.js +1 -14
- package/dist/resources/extensions/gsd/preferences-types.js +1 -2
- package/dist/resources/extensions/gsd/preferences.js +16 -13
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/dist/resources/extensions/gsd/repo-identity.js +11 -205
- package/dist/resources/extensions/gsd/rethink.js +0 -5
- package/dist/resources/extensions/gsd/roadmap-slices.js +4 -5
- package/dist/resources/extensions/gsd/state.js +27 -85
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/dist/resources/extensions/gsd/tools/complete-task.js +71 -34
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -12
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +1 -29
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +7 -22
- package/dist/resources/extensions/gsd/undo.js +2 -2
- package/dist/resources/extensions/gsd/unit-ownership.js +33 -164
- package/dist/resources/extensions/gsd/verdict-parser.js +8 -20
- package/dist/resources/extensions/gsd/workflow-manifest.js +5 -24
- package/dist/resources/extensions/gsd/workflow-projections.js +63 -95
- package/dist/resources/extensions/gsd/workflow-reconcile.js +5 -35
- package/dist/resources/extensions/gsd/workspace-index.js +0 -24
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -105
- package/dist/resources/extensions/gsd/worktree-resolver.js +3 -20
- package/dist/resources/extensions/mcp-client/index.js +7 -11
- package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/dist/resources/extensions/shared/interview-ui.js +1 -11
- package/dist/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- 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 +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- 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/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- 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/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-61d3afac6d0f0ce7.js} +1 -1
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +1 -2
- package/package.json +2 -2
- package/packages/native/dist/ast/index.js +5 -9
- package/packages/native/dist/ast/types.js +1 -2
- package/packages/native/dist/clipboard/index.js +7 -12
- package/packages/native/dist/clipboard/types.js +1 -2
- package/packages/native/dist/diff/index.js +7 -12
- package/packages/native/dist/diff/types.js +1 -2
- package/packages/native/dist/fd/index.js +3 -6
- package/packages/native/dist/fd/types.js +1 -2
- package/packages/native/dist/glob/index.js +5 -9
- package/packages/native/dist/glob/types.js +1 -2
- package/packages/native/dist/grep/index.js +5 -9
- package/packages/native/dist/grep/types.js +1 -2
- package/packages/native/dist/gsd-parser/index.js +11 -18
- package/packages/native/dist/gsd-parser/types.js +1 -2
- package/packages/native/dist/highlight/index.js +7 -12
- package/packages/native/dist/highlight/types.js +1 -2
- package/packages/native/dist/html/index.js +3 -6
- package/packages/native/dist/html/types.js +1 -2
- package/packages/native/dist/image/index.js +5 -10
- package/packages/native/dist/image/types.js +4 -7
- package/packages/native/dist/index.js +17 -70
- package/packages/native/dist/json-parse/index.js +8 -13
- package/packages/native/dist/native.js +10 -47
- package/packages/native/dist/ps/index.js +9 -15
- package/packages/native/dist/ps/types.js +1 -2
- package/packages/native/dist/stream-process/index.js +7 -12
- package/packages/native/dist/text/index.js +14 -24
- package/packages/native/dist/text/types.js +2 -5
- package/packages/native/dist/truncate/index.js +7 -12
- package/packages/native/dist/ttsr/index.js +7 -12
- package/packages/native/dist/ttsr/types.js +1 -2
- package/packages/native/dist/xxhash/index.js +5 -9
- package/packages/native/package.json +19 -19
- package/packages/native/src/native.ts +8 -9
- package/packages/pi-agent-core/dist/agent-loop.js +2 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/proxy.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +2 -3
- package/packages/pi-agent-core/src/proxy.ts +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +0 -1
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +0 -1
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +0 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +2 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +3 -3
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.d.ts +0 -3
- package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.js +1 -24
- package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/packages/pi-ai/src/env-api-keys.ts +0 -1
- package/packages/pi-ai/src/index.ts +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +2 -17
- package/packages/pi-ai/src/types.ts +2 -3
- package/packages/pi-ai/src/utils/json-parse.ts +1 -28
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -31
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +1 -17
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +2 -62
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.js +1 -3
- package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +2 -31
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +0 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +0 -10
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -12
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -48
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -10
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +4 -13
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.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 +0 -4
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +0 -5
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -38
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +1 -94
- package/packages/pi-coding-agent/src/core/exec.ts +1 -3
- package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -4
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -5
- package/packages/pi-coding-agent/src/core/index.ts +0 -6
- package/packages/pi-coding-agent/src/core/lsp/index.ts +0 -3
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +0 -3
- package/packages/pi-coding-agent/src/core/messages.ts +2 -29
- package/packages/pi-coding-agent/src/core/model-resolver.ts +0 -1
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -20
- package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -52
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +3 -11
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -14
- package/packages/pi-coding-agent/src/index.ts +0 -6
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -7
- package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +0 -6
- package/packages/pi-tui/dist/terminal.d.ts +0 -2
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +0 -9
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +0 -9
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/terminal.ts +0 -14
- package/packages/pi-tui/src/tui.ts +0 -8
- package/scripts/ensure-workspace-builds.cjs +14 -45
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +3 -21
- package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +6 -13
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +35 -63
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -28
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1 -108
- package/src/resources/extensions/context7/extension-manifest.json +1 -1
- package/src/resources/extensions/get-secrets-from-user.ts +5 -8
- package/src/resources/extensions/google-search/extension-manifest.json +1 -1
- package/src/resources/extensions/google-search/index.ts +1 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +34 -43
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +19 -37
- package/src/resources/extensions/gsd/auto-dispatch.ts +2 -18
- package/src/resources/extensions/gsd/auto-model-selection.ts +5 -26
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +5 -12
- package/src/resources/extensions/gsd/auto-start.ts +26 -35
- package/src/resources/extensions/gsd/auto-worktree.ts +9 -190
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -31
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -85
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -38
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -31
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -50
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -75
- package/src/resources/extensions/gsd/captures.ts +3 -63
- package/src/resources/extensions/gsd/db-writer.ts +7 -140
- package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -26
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +4 -5
- package/src/resources/extensions/gsd/doctor.ts +1 -3
- package/src/resources/extensions/gsd/error-classifier.ts +11 -14
- package/src/resources/extensions/gsd/extension-manifest.json +1 -16
- package/src/resources/extensions/gsd/forensics.ts +20 -144
- package/src/resources/extensions/gsd/git-service.ts +3 -26
- package/src/resources/extensions/gsd/gitignore.ts +0 -33
- package/src/resources/extensions/gsd/gsd-db.ts +7 -43
- package/src/resources/extensions/gsd/guided-flow.ts +45 -114
- package/src/resources/extensions/gsd/health-widget-core.ts +0 -34
- package/src/resources/extensions/gsd/health-widget.ts +0 -17
- package/src/resources/extensions/gsd/index.ts +0 -1
- package/src/resources/extensions/gsd/memory-extractor.ts +0 -8
- package/src/resources/extensions/gsd/migrate-external.ts +1 -9
- package/src/resources/extensions/gsd/model-cost-table.ts +0 -19
- package/src/resources/extensions/gsd/model-router.ts +1 -35
- package/src/resources/extensions/gsd/native-git-bridge.ts +0 -17
- package/src/resources/extensions/gsd/notifications.ts +0 -16
- package/src/resources/extensions/gsd/parallel-eligibility.ts +2 -15
- package/src/resources/extensions/gsd/parallel-merge.ts +4 -87
- package/src/resources/extensions/gsd/parsers-legacy.ts +3 -22
- package/src/resources/extensions/gsd/paths.ts +0 -42
- package/src/resources/extensions/gsd/preferences-models.ts +1 -14
- package/src/resources/extensions/gsd/preferences-types.ts +1 -2
- package/src/resources/extensions/gsd/preferences.ts +15 -13
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/src/resources/extensions/gsd/repo-identity.ts +11 -186
- package/src/resources/extensions/gsd/rethink.ts +0 -6
- package/src/resources/extensions/gsd/roadmap-slices.ts +4 -5
- package/src/resources/extensions/gsd/state.ts +32 -84
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +1 -71
- package/src/resources/extensions/gsd/tests/captures.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -27
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -21
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +12 -7
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +5 -78
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -31
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +12 -125
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +1 -111
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -59
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +2 -85
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -34
- package/src/resources/extensions/gsd/tests/model-router.test.ts +3 -68
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -28
- package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -45
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -33
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -134
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -8
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +17 -100
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -92
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +1 -48
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -29
- package/src/resources/extensions/gsd/tools/complete-task.ts +74 -36
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -13
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -36
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -20
- package/src/resources/extensions/gsd/triage-resolution.ts +6 -23
- package/src/resources/extensions/gsd/types.ts +2 -4
- package/src/resources/extensions/gsd/undo.ts +2 -2
- package/src/resources/extensions/gsd/unit-ownership.ts +35 -206
- package/src/resources/extensions/gsd/verdict-parser.ts +6 -21
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -3
- package/src/resources/extensions/gsd/workflow-manifest.ts +5 -22
- package/src/resources/extensions/gsd/workflow-projections.ts +64 -97
- package/src/resources/extensions/gsd/workflow-reconcile.ts +10 -39
- package/src/resources/extensions/gsd/workspace-index.ts +0 -30
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -120
- package/src/resources/extensions/gsd/worktree-resolver.ts +3 -22
- package/src/resources/extensions/mcp-client/index.ts +7 -13
- package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/src/resources/extensions/shared/interview-ui.ts +1 -12
- package/src/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
- package/dist/resources/extensions/ollama/index.js +0 -112
- package/dist/resources/extensions/ollama/model-capabilities.js +0 -115
- package/dist/resources/extensions/ollama/ollama-client.js +0 -168
- package/dist/resources/extensions/ollama/ollama-commands.js +0 -194
- package/dist/resources/extensions/ollama/ollama-discovery.js +0 -69
- package/dist/resources/extensions/ollama/ollama-tool.js +0 -184
- package/dist/resources/extensions/ollama/types.js +0 -2
- package/dist/startup-model-validation.d.ts +0 -39
- package/dist/startup-model-validation.js +0 -50
- package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/src/__tests__/module-compat.test.mjs +0 -91
- package/packages/pi-agent-core/src/agent-loop.test.ts +0 -45
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +0 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +0 -25
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +0 -37
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +0 -75
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -73
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +0 -29
- package/packages/pi-ai/src/utils/repair-tool-json.ts +0 -88
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -102
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +0 -176
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +0 -28
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +0 -37
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +0 -63
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +0 -19
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +0 -115
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +0 -109
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +0 -44
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +0 -97
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +0 -181
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.js +0 -86
- package/packages/pi-coding-agent/dist/core/messages.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +0 -193
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +0 -16
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +0 -80
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +0 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +0 -236
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +0 -77
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +0 -62
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +0 -134
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +0 -137
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +0 -228
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +0 -118
- package/packages/pi-coding-agent/src/core/messages.test.ts +0 -114
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +0 -255
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +0 -92
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +0 -20
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +0 -135
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -116
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +0 -405
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1628
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +0 -55
- package/src/resources/extensions/ollama/index.ts +0 -130
- package/src/resources/extensions/ollama/model-capabilities.ts +0 -145
- package/src/resources/extensions/ollama/ollama-client.ts +0 -196
- package/src/resources/extensions/ollama/ollama-commands.ts +0 -248
- package/src/resources/extensions/ollama/ollama-discovery.ts +0 -106
- package/src/resources/extensions/ollama/ollama-tool.ts +0 -218
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +0 -162
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +0 -38
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -28
- package/src/resources/extensions/ollama/types.ts +0 -130
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +0 -156
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_ssgManifest.js +0 -0
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
// GSD State Machine Regression Tests — Completion Hierarchy & State Derivation (#3161)
|
|
2
|
-
|
|
3
|
-
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
4
|
-
import assert from "node:assert/strict";
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
openDatabase,
|
|
8
|
-
closeDatabase,
|
|
9
|
-
insertMilestone,
|
|
10
|
-
insertSlice,
|
|
11
|
-
insertTask,
|
|
12
|
-
getTask,
|
|
13
|
-
getSlice,
|
|
14
|
-
getMilestone,
|
|
15
|
-
getSliceTasks,
|
|
16
|
-
updateTaskStatus,
|
|
17
|
-
updateSliceStatus,
|
|
18
|
-
} from "../gsd-db.ts";
|
|
19
|
-
import { isClosedStatus } from "../status-guards.ts";
|
|
20
|
-
|
|
21
|
-
// ─── Setup / Teardown ──────────────────────────────────────────────────────
|
|
22
|
-
|
|
23
|
-
beforeEach(() => {
|
|
24
|
-
openDatabase(":memory:");
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
afterEach(() => {
|
|
28
|
-
try { closeDatabase(); } catch { /* swallow */ }
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
32
|
-
// Tests
|
|
33
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
34
|
-
|
|
35
|
-
describe("completion-hierarchy-guards", () => {
|
|
36
|
-
|
|
37
|
-
// ─── Test 1: isClosedStatus ─────────────────────────────────────────────
|
|
38
|
-
test("isClosedStatus returns true for 'complete' and 'done'", () => {
|
|
39
|
-
assert.ok(isClosedStatus("complete"), "'complete' should be closed");
|
|
40
|
-
assert.ok(isClosedStatus("done"), "'done' should be closed");
|
|
41
|
-
assert.ok(!isClosedStatus("pending"), "'pending' should not be closed");
|
|
42
|
-
assert.ok(!isClosedStatus("in-progress"), "'in-progress' should not be closed");
|
|
43
|
-
assert.ok(!isClosedStatus("blocked"), "'blocked' should not be closed");
|
|
44
|
-
assert.ok(!isClosedStatus(""), "empty string should not be closed");
|
|
45
|
-
assert.ok(!isClosedStatus("active"), "'active' should not be closed");
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// ─── Test 2: vacuous truth guard — slice with zero tasks ───────────────
|
|
49
|
-
test("cannot complete slice with zero tasks — vacuous truth guard", () => {
|
|
50
|
-
insertMilestone({ id: "M001" });
|
|
51
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
52
|
-
|
|
53
|
-
const tasks = getSliceTasks("M001", "S01");
|
|
54
|
-
assert.equal(tasks.length, 0, "newly inserted slice has zero tasks");
|
|
55
|
-
|
|
56
|
-
// The guard: a slice with no tasks is not completable.
|
|
57
|
-
// isSliceComplete from state.ts: plan.tasks.length > 0 && every done.
|
|
58
|
-
// Here we replicate the DB-side equivalent: zero tasks means guard fires.
|
|
59
|
-
const isCompletable = tasks.length > 0 && tasks.every(t => isClosedStatus(t.status));
|
|
60
|
-
assert.equal(isCompletable, false, "vacuous truth guard: zero tasks → not completable");
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
// ─── Test 3: cannot complete slice with incomplete tasks ─────────────────
|
|
64
|
-
test("cannot complete slice with incomplete tasks", () => {
|
|
65
|
-
insertMilestone({ id: "M001" });
|
|
66
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
67
|
-
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", status: "done" });
|
|
68
|
-
insertTask({ id: "T02", sliceId: "S01", milestoneId: "M001", status: "pending" });
|
|
69
|
-
|
|
70
|
-
const tasks = getSliceTasks("M001", "S01");
|
|
71
|
-
assert.equal(tasks.length, 2, "slice has 2 tasks");
|
|
72
|
-
|
|
73
|
-
const incompleteTasks = tasks.filter(t => !isClosedStatus(t.status));
|
|
74
|
-
assert.equal(incompleteTasks.length, 1, "exactly one task is not closed");
|
|
75
|
-
assert.equal(incompleteTasks[0]?.id, "T02", "the incomplete task is T02");
|
|
76
|
-
assert.equal(incompleteTasks[0]?.status, "pending", "incomplete task status is 'pending'");
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
// ─── Test 4: phantom parent milestone and slice (H6) ────────────────────
|
|
80
|
-
test("task completion auto-creates phantom parent milestone and slice (H6)", () => {
|
|
81
|
-
// H6 finding: insertMilestone/insertSlice accept empty titles — phantom
|
|
82
|
-
// parents can be created without substantive content.
|
|
83
|
-
insertMilestone({ id: "M001" });
|
|
84
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
85
|
-
|
|
86
|
-
const milestone = getMilestone("M001");
|
|
87
|
-
assert.ok(milestone !== null, "phantom milestone M001 should exist in DB");
|
|
88
|
-
assert.equal(milestone!.title, "", "phantom milestone has empty title by default");
|
|
89
|
-
|
|
90
|
-
const slice = getSlice("M001", "S01");
|
|
91
|
-
assert.ok(slice !== null, "phantom slice S01 should exist in DB");
|
|
92
|
-
assert.equal(slice!.title, "", "phantom slice has empty title by default");
|
|
93
|
-
|
|
94
|
-
// This documents the H6 finding: the DB allows phantom parents with
|
|
95
|
-
// no meaningful content, which can silently accept task completion calls.
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// ─── Test 5: double task completion is detectable via isClosedStatus ────
|
|
99
|
-
test("double task completion is detectable via isClosedStatus", () => {
|
|
100
|
-
insertMilestone({ id: "M001" });
|
|
101
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
102
|
-
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", status: "done" });
|
|
103
|
-
|
|
104
|
-
const task = getTask("M001", "S01", "T01");
|
|
105
|
-
assert.ok(task !== null, "task T01 should exist");
|
|
106
|
-
assert.ok(
|
|
107
|
-
isClosedStatus(task!.status),
|
|
108
|
-
"isClosedStatus detects already-closed task — prevents double completion",
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
// The guard that prevents double completion: check isClosedStatus before
|
|
112
|
-
// calling updateTaskStatus again.
|
|
113
|
-
const wouldDoubleComplete = isClosedStatus(task!.status);
|
|
114
|
-
assert.ok(wouldDoubleComplete, "guard fires: task is already closed");
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
// ─── Test 6: updateSliceStatus rollback loses original status (M11) ─────
|
|
118
|
-
test("updateSliceStatus rollback goes to 'pending' not original status (M11)", () => {
|
|
119
|
-
insertMilestone({ id: "M001" });
|
|
120
|
-
// Insert with an explicit non-pending status to simulate an in-progress slice
|
|
121
|
-
insertSlice({ id: "S01", milestoneId: "M001", status: "pending" });
|
|
122
|
-
|
|
123
|
-
// Manually advance to "in_progress" equivalent via updateSliceStatus
|
|
124
|
-
updateSliceStatus("M001", "S01", "in_progress");
|
|
125
|
-
const afterProgress = getSlice("M001", "S01");
|
|
126
|
-
assert.equal(afterProgress!.status, "in_progress", "slice is in_progress after update");
|
|
127
|
-
|
|
128
|
-
// Simulate completion
|
|
129
|
-
updateSliceStatus("M001", "S01", "complete", new Date().toISOString());
|
|
130
|
-
const afterComplete = getSlice("M001", "S01");
|
|
131
|
-
assert.equal(afterComplete!.status, "complete", "slice is complete after completion");
|
|
132
|
-
|
|
133
|
-
// Simulate rollback — the DB only stores current status, not history.
|
|
134
|
-
// Rolling back means setting to "pending" — the original "in_progress" is lost.
|
|
135
|
-
updateSliceStatus("M001", "S01", "pending");
|
|
136
|
-
const afterRollback = getSlice("M001", "S01");
|
|
137
|
-
assert.equal(
|
|
138
|
-
afterRollback!.status,
|
|
139
|
-
"pending",
|
|
140
|
-
"M11: rollback sets status to 'pending', original 'in_progress' is lost",
|
|
141
|
-
);
|
|
142
|
-
// Document: there is no completed_at or status history to recover from.
|
|
143
|
-
// The rollback silently discards the in_progress state.
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
// ─── Test 7: milestone completion requires all slices closed ─────────────
|
|
147
|
-
test("milestone completion requires all slices closed", () => {
|
|
148
|
-
insertMilestone({ id: "M001" });
|
|
149
|
-
insertSlice({ id: "S01", milestoneId: "M001", status: "done" });
|
|
150
|
-
insertSlice({ id: "S02", milestoneId: "M001", status: "pending" });
|
|
151
|
-
|
|
152
|
-
const s01 = getSlice("M001", "S01");
|
|
153
|
-
const s02 = getSlice("M001", "S02");
|
|
154
|
-
|
|
155
|
-
assert.ok(s01 !== null, "S01 exists");
|
|
156
|
-
assert.ok(s02 !== null, "S02 exists");
|
|
157
|
-
|
|
158
|
-
const slices = [s01!, s02!];
|
|
159
|
-
const incompleteSlices = slices.filter(s => !isClosedStatus(s.status));
|
|
160
|
-
assert.ok(
|
|
161
|
-
incompleteSlices.length > 0,
|
|
162
|
-
"milestone is not completable — has incomplete slices",
|
|
163
|
-
);
|
|
164
|
-
assert.equal(incompleteSlices[0]?.id, "S02", "S02 is the incomplete slice");
|
|
165
|
-
assert.equal(incompleteSlices[0]?.status, "pending", "S02 status is 'pending'");
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
// ─── Test 8: closed parent blocks child completion ───────────────────────
|
|
169
|
-
test("closed parent blocks child completion", () => {
|
|
170
|
-
// Insert a milestone already in 'complete' state
|
|
171
|
-
insertMilestone({ id: "M001", status: "complete" });
|
|
172
|
-
insertSlice({ id: "S01", milestoneId: "M001" });
|
|
173
|
-
|
|
174
|
-
const milestone = getMilestone("M001");
|
|
175
|
-
assert.ok(milestone !== null, "milestone M001 exists");
|
|
176
|
-
assert.ok(
|
|
177
|
-
isClosedStatus(milestone!.status),
|
|
178
|
-
"parent milestone is closed — isClosedStatus returns true",
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
// The guard in complete-slice checks parent status via isClosedStatus.
|
|
182
|
-
// If isClosedStatus(milestone.status) === true, the child cannot be completed.
|
|
183
|
-
const parentIsClosed = isClosedStatus(milestone!.status);
|
|
184
|
-
assert.ok(parentIsClosed, "closed parent guard fires: milestone.status is 'complete'");
|
|
185
|
-
|
|
186
|
-
// Verify the slice itself is not yet closed
|
|
187
|
-
const slice = getSlice("M001", "S01");
|
|
188
|
-
assert.ok(slice !== null, "slice S01 exists");
|
|
189
|
-
assert.ok(!isClosedStatus(slice!.status), "slice S01 is not yet closed (parent is already closed)");
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
});
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* db-path-worktree-symlink.test.ts — #2517
|
|
3
|
-
*
|
|
4
|
-
* Regression test for the db_unavailable loop in worktree/symlink layouts.
|
|
5
|
-
*
|
|
6
|
-
* The path resolver must handle BOTH worktree path families:
|
|
7
|
-
* - /.gsd/worktrees/<MID>/... (direct layout)
|
|
8
|
-
* - /.gsd/projects/<hash>/worktrees/<MID>/... (symlink-resolved layout)
|
|
9
|
-
*
|
|
10
|
-
* When the second layout is not recognised, ensureDbOpen derives a wrong DB
|
|
11
|
-
* path, the open fails silently, and every completion tool call returns
|
|
12
|
-
* db_unavailable — triggering an artifact retry re-dispatch loop.
|
|
13
|
-
*
|
|
14
|
-
* Additionally, the post-unit artifact retry path must NOT retry when the
|
|
15
|
-
* completion tool failed due to db_unavailable (infra failure), because
|
|
16
|
-
* retrying can never succeed and causes cost spikes.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { readFileSync } from "node:fs";
|
|
20
|
-
import { join, sep } from "node:path";
|
|
21
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
22
|
-
|
|
23
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
24
|
-
|
|
25
|
-
// ── Part 1: resolveProjectRootDbPath handles symlink-resolved layout ─────
|
|
26
|
-
|
|
27
|
-
console.log("\n=== #2517 Part 1: resolveProjectRootDbPath symlink layout ===");
|
|
28
|
-
|
|
29
|
-
// Import the resolver directly
|
|
30
|
-
const { resolveProjectRootDbPath } = await import("../bootstrap/dynamic-tools.js");
|
|
31
|
-
|
|
32
|
-
// Standard worktree layout (already works)
|
|
33
|
-
const standardPath = `/home/user/myproject/.gsd/worktrees/M001/work`;
|
|
34
|
-
const standardResult = resolveProjectRootDbPath(standardPath);
|
|
35
|
-
assertEq(
|
|
36
|
-
standardResult,
|
|
37
|
-
join("/home/user/myproject", ".gsd", "gsd.db"),
|
|
38
|
-
"Standard worktree layout resolves to project root DB path",
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
// Symlink-resolved layout (the regression — /.gsd/projects/<hash>/worktrees/...)
|
|
42
|
-
const symlinkPath = `/home/user/myproject/.gsd/projects/abc123def/worktrees/M001/work`;
|
|
43
|
-
const symlinkResult = resolveProjectRootDbPath(symlinkPath);
|
|
44
|
-
assertEq(
|
|
45
|
-
symlinkResult,
|
|
46
|
-
join("/home/user/myproject", ".gsd", "gsd.db"),
|
|
47
|
-
"Symlink-resolved layout (/.gsd/projects/<hash>/worktrees/) resolves to project root DB path (#2517)",
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
// Windows-style separators for symlink layout
|
|
51
|
-
if (sep === "\\") {
|
|
52
|
-
const winSymlinkPath = `C:\\Users\\dev\\project\\.gsd\\projects\\abc123def\\worktrees\\M001\\work`;
|
|
53
|
-
const winResult = resolveProjectRootDbPath(winSymlinkPath);
|
|
54
|
-
assertEq(
|
|
55
|
-
winResult,
|
|
56
|
-
join("C:\\Users\\dev\\project", ".gsd", "gsd.db"),
|
|
57
|
-
"Windows symlink layout resolves correctly",
|
|
58
|
-
);
|
|
59
|
-
} else {
|
|
60
|
-
// On non-Windows, test forward-slash variant explicitly
|
|
61
|
-
const fwdSymlinkPath = `/home/user/myproject/.gsd/projects/abc123def/worktrees/M001/work`;
|
|
62
|
-
const fwdResult = resolveProjectRootDbPath(fwdSymlinkPath);
|
|
63
|
-
assertEq(
|
|
64
|
-
fwdResult,
|
|
65
|
-
join("/home/user/myproject", ".gsd", "gsd.db"),
|
|
66
|
-
"Forward-slash symlink layout resolves correctly on POSIX",
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Edge: deeper nesting under projects/<hash>/worktrees
|
|
71
|
-
const deepSymlinkPath = `/home/user/myproject/.gsd/projects/deadbeef42/worktrees/M003/sub/dir`;
|
|
72
|
-
const deepResult = resolveProjectRootDbPath(deepSymlinkPath);
|
|
73
|
-
assertEq(
|
|
74
|
-
deepResult,
|
|
75
|
-
join("/home/user/myproject", ".gsd", "gsd.db"),
|
|
76
|
-
"Deep symlink worktree path still resolves to project root DB",
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
// Non-worktree path should be unchanged
|
|
80
|
-
const normalPath = `/home/user/myproject`;
|
|
81
|
-
const normalResult = resolveProjectRootDbPath(normalPath);
|
|
82
|
-
assertEq(
|
|
83
|
-
normalResult,
|
|
84
|
-
join("/home/user/myproject", ".gsd", "gsd.db"),
|
|
85
|
-
"Non-worktree path is unchanged",
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
// ── Part 2: ensureDbOpen returns structured failure context ──────────────
|
|
89
|
-
|
|
90
|
-
console.log("\n=== #2517 Part 2: ensureDbOpen structured diagnostics ===");
|
|
91
|
-
|
|
92
|
-
const dynamicToolsSrc = readFileSync(
|
|
93
|
-
join(import.meta.dirname, "..", "bootstrap", "dynamic-tools.ts"),
|
|
94
|
-
"utf-8",
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
// ensureDbOpen should return a structured result, not just boolean false
|
|
98
|
-
// Check that the catch block provides diagnostic information
|
|
99
|
-
assertTrue(
|
|
100
|
-
dynamicToolsSrc.includes("resolvedPath") || dynamicToolsSrc.includes("diagnostic"),
|
|
101
|
-
"ensureDbOpen catch block surfaces diagnostic information (resolvedPath or diagnostic) instead of bare false (#2517)",
|
|
102
|
-
);
|
|
103
|
-
|
|
104
|
-
// ── Part 3: post-unit does NOT artifact-retry on db_unavailable ──────────
|
|
105
|
-
|
|
106
|
-
console.log("\n=== #2517 Part 3: post-unit db_unavailable is infra-fatal ===");
|
|
107
|
-
|
|
108
|
-
const postUnitSrc = readFileSync(
|
|
109
|
-
join(import.meta.dirname, "..", "auto-post-unit.ts"),
|
|
110
|
-
"utf-8",
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
// The artifact retry block should check DB availability and skip retry
|
|
114
|
-
// when the DB is unavailable (infra failure, not a missing artifact).
|
|
115
|
-
assertTrue(
|
|
116
|
-
postUnitSrc.includes("db_unavailable") || postUnitSrc.includes("isDbAvailable"),
|
|
117
|
-
"post-unit artifact retry path checks DB availability to avoid retry loop (#2517)",
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
// Verify the retry block is guarded: when !isDbAvailable(), the code must
|
|
121
|
-
// NOT return "retry". The pattern should be: if (!verified && !isDbAvailable()) { skip }
|
|
122
|
-
// followed by else if (!verified) { ... return "retry" }
|
|
123
|
-
const dbUnavailableGuard = postUnitSrc.match(
|
|
124
|
-
/!triggerArtifactVerified\s*&&\s*!isDbAvailable\(\)/,
|
|
125
|
-
);
|
|
126
|
-
assertTrue(
|
|
127
|
-
!!dbUnavailableGuard,
|
|
128
|
-
"The retry block explicitly guards against !isDbAvailable() before returning 'retry' (#2517)",
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
report();
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { describe, it } from "node:test";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Validates that all Discord invite links in user-facing files point to valid,
|
|
8
|
-
* consistent invite URLs — not expired vanity links.
|
|
9
|
-
*
|
|
10
|
-
* Regression test for https://github.com/gsd-build/gsd-2/issues/2699
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
const ROOT = process.cwd();
|
|
14
|
-
|
|
15
|
-
/** Canonical Discord invite for the GSD community. */
|
|
16
|
-
const VALID_INVITE = "https://discord.com/invite/nKXTsAcmbT";
|
|
17
|
-
|
|
18
|
-
/** Files that contain user-facing Discord invite links. */
|
|
19
|
-
const FILES_WITH_INVITE_LINKS: string[] = [
|
|
20
|
-
"README.md",
|
|
21
|
-
"docs/what-is-pi/15-pi-packages-the-ecosystem.md",
|
|
22
|
-
];
|
|
23
|
-
|
|
24
|
-
describe("Discord invite links (#2699)", () => {
|
|
25
|
-
for (const relPath of FILES_WITH_INVITE_LINKS) {
|
|
26
|
-
it(`${relPath} contains only the canonical Discord invite`, () => {
|
|
27
|
-
const content = readFileSync(join(ROOT, relPath), "utf8");
|
|
28
|
-
|
|
29
|
-
// Extract all Discord invite URLs (discord.gg/X or discord.com/invite/X)
|
|
30
|
-
const invitePattern = /https?:\/\/(?:discord\.gg|discord\.com\/invite)\/[A-Za-z0-9]+/g;
|
|
31
|
-
const matches = content.match(invitePattern);
|
|
32
|
-
|
|
33
|
-
assert.ok(
|
|
34
|
-
matches && matches.length > 0,
|
|
35
|
-
`Expected at least one Discord invite link in ${relPath}`,
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
for (const link of matches) {
|
|
39
|
-
assert.equal(
|
|
40
|
-
link,
|
|
41
|
-
VALID_INVITE,
|
|
42
|
-
`Invalid Discord invite in ${relPath}: found "${link}", expected "${VALID_INVITE}"`,
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
});
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* discuss-empty-db-fallback.test.ts — Tests for #2892.
|
|
3
|
-
*
|
|
4
|
-
* When the DB is open but empty (e.g., after crash/truncation),
|
|
5
|
-
* getMilestoneSlices() returns [] and showDiscuss() incorrectly declares
|
|
6
|
-
* "All slices are complete." The fix adds a roadmap fallback: when the DB
|
|
7
|
-
* returns zero slices but a ROADMAP file exists, parse slices from the
|
|
8
|
-
* roadmap instead of treating zero slices as "all complete."
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { describe, test } from "node:test";
|
|
12
|
-
import assert from "node:assert/strict";
|
|
13
|
-
import { readFileSync } from "node:fs";
|
|
14
|
-
import { fileURLToPath } from "node:url";
|
|
15
|
-
import { dirname, join } from "node:path";
|
|
16
|
-
import { parseRoadmapSlices } from "../roadmap-slices.ts";
|
|
17
|
-
|
|
18
|
-
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
19
|
-
|
|
20
|
-
function readGuidedFlowSource(): string {
|
|
21
|
-
const thisFile = fileURLToPath(import.meta.url);
|
|
22
|
-
const thisDir = dirname(thisFile);
|
|
23
|
-
return readFileSync(join(thisDir, "..", "guided-flow.ts"), "utf-8");
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const SAMPLE_ROADMAP = `# M012 Roadmap
|
|
27
|
-
|
|
28
|
-
## Slices
|
|
29
|
-
- [ ] **S01: Core setup** \`risk:low\` \`depends:[]\`
|
|
30
|
-
> After this: basic project scaffolding works
|
|
31
|
-
- [ ] **S02: Auth module** \`risk:medium\` \`depends:[S01]\`
|
|
32
|
-
> After this: users can log in
|
|
33
|
-
- [ ] **S03: Dashboard** \`risk:low\` \`depends:[S02]\`
|
|
34
|
-
> After this: dashboard renders
|
|
35
|
-
`;
|
|
36
|
-
|
|
37
|
-
// ─── Tests ───────────────────────────────────────────────────────────────────
|
|
38
|
-
|
|
39
|
-
describe("discuss-empty-db-fallback (#2892)", () => {
|
|
40
|
-
|
|
41
|
-
test("1. parseRoadmapSlices extracts slices from a valid ROADMAP", () => {
|
|
42
|
-
const slices = parseRoadmapSlices(SAMPLE_ROADMAP);
|
|
43
|
-
assert.strictEqual(slices.length, 3, "should parse 3 slices from sample roadmap");
|
|
44
|
-
assert.strictEqual(slices[0]!.id, "S01");
|
|
45
|
-
assert.strictEqual(slices[1]!.id, "S02");
|
|
46
|
-
assert.strictEqual(slices[2]!.id, "S03");
|
|
47
|
-
// All slices are incomplete ([ ] not [x])
|
|
48
|
-
assert.ok(slices.every(s => !s.done), "all slices should be incomplete");
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test("2. guided-flow imports parseRoadmapSlices for roadmap fallback", () => {
|
|
52
|
-
const source = readGuidedFlowSource();
|
|
53
|
-
assert.ok(
|
|
54
|
-
source.includes("parseRoadmapSlices"),
|
|
55
|
-
"guided-flow must import parseRoadmapSlices to support roadmap fallback when DB is empty",
|
|
56
|
-
);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test("3. guided-flow has roadmap fallback when normSlices is empty but roadmapContent exists", () => {
|
|
60
|
-
const source = readGuidedFlowSource();
|
|
61
|
-
// The fix must add a fallback that checks normSlices.length === 0 && roadmapContent
|
|
62
|
-
// and repopulates normSlices from the roadmap before the pendingSlices guard.
|
|
63
|
-
//
|
|
64
|
-
// Pattern: after DB query produces normSlices, if empty + roadmap exists,
|
|
65
|
-
// fall back to parseRoadmapSlices(roadmapContent).
|
|
66
|
-
const fallbackPattern = /normSlices\.length\s*===\s*0\s*&&\s*roadmapContent/;
|
|
67
|
-
assert.ok(
|
|
68
|
-
fallbackPattern.test(source),
|
|
69
|
-
"guided-flow must check normSlices.length === 0 && roadmapContent to trigger roadmap fallback",
|
|
70
|
-
);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
test("4. guided-flow no longer has unguarded pendingSlices === 0 exit after DB-only query", () => {
|
|
74
|
-
const source = readGuidedFlowSource();
|
|
75
|
-
// Extract the showDiscuss function body
|
|
76
|
-
const fnMatch = source.match(
|
|
77
|
-
/async function showDiscuss\s*\([^)]*\)[^{]*\{([\s\S]*?)\nfunction\s/,
|
|
78
|
-
);
|
|
79
|
-
assert.ok(!!fnMatch, "showDiscuss function body must be found");
|
|
80
|
-
|
|
81
|
-
if (fnMatch) {
|
|
82
|
-
const body = fnMatch[1]!;
|
|
83
|
-
// After the DB query block (isDbAvailable/getMilestoneSlices), there should
|
|
84
|
-
// be a roadmap fallback BEFORE the pendingSlices.length === 0 check.
|
|
85
|
-
// Find the getMilestoneSlices call and the pendingSlices === 0 check
|
|
86
|
-
const dbQueryIdx = body.indexOf("getMilestoneSlices");
|
|
87
|
-
const fallbackIdx = body.indexOf("parseRoadmapSlices");
|
|
88
|
-
const pendingGuardIdx = body.indexOf('pendingSlices.length === 0');
|
|
89
|
-
|
|
90
|
-
assert.ok(dbQueryIdx > 0, "getMilestoneSlices call must exist");
|
|
91
|
-
assert.ok(fallbackIdx > 0, "parseRoadmapSlices fallback must exist");
|
|
92
|
-
assert.ok(pendingGuardIdx > 0, "pendingSlices.length === 0 guard must exist");
|
|
93
|
-
assert.ok(
|
|
94
|
-
fallbackIdx > dbQueryIdx && fallbackIdx < pendingGuardIdx,
|
|
95
|
-
"parseRoadmapSlices fallback must appear BETWEEN DB query and pendingSlices === 0 guard",
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
test("5. roadmap-parsed slices map to NormSlice format with done=false by default", () => {
|
|
101
|
-
// When falling back to roadmap, incomplete slices ([ ]) should map to done:false,
|
|
102
|
-
// ensuring they appear as pending and are NOT falsely reported as complete.
|
|
103
|
-
const slices = parseRoadmapSlices(SAMPLE_ROADMAP);
|
|
104
|
-
const normSlices = slices.map(s => ({ id: s.id, done: s.done, title: s.title }));
|
|
105
|
-
const pendingSlices = normSlices.filter(s => !s.done);
|
|
106
|
-
assert.strictEqual(pendingSlices.length, 3,
|
|
107
|
-
"all 3 incomplete roadmap slices should be pending — not falsely treated as complete");
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test("6. roadmap with completed slices correctly reports them as done", () => {
|
|
111
|
-
const completedRoadmap = `# M012 Roadmap
|
|
112
|
-
|
|
113
|
-
## Slices
|
|
114
|
-
- [x] **S01: Core setup** \`risk:low\` \`depends:[]\`
|
|
115
|
-
> After this: basic project scaffolding works
|
|
116
|
-
- [ ] **S02: Auth module** \`risk:medium\` \`depends:[S01]\`
|
|
117
|
-
> After this: users can log in
|
|
118
|
-
- [x] **S03: Dashboard** \`risk:low\` \`depends:[S02]\`
|
|
119
|
-
> After this: dashboard renders
|
|
120
|
-
`;
|
|
121
|
-
const slices = parseRoadmapSlices(completedRoadmap);
|
|
122
|
-
const normSlices = slices.map(s => ({ id: s.id, done: s.done, title: s.title }));
|
|
123
|
-
const pendingSlices = normSlices.filter(s => !s.done);
|
|
124
|
-
assert.strictEqual(pendingSlices.length, 1, "only S02 should be pending");
|
|
125
|
-
assert.strictEqual(pendingSlices[0]!.id, "S02");
|
|
126
|
-
});
|
|
127
|
-
});
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dynamic routing default — verifies routing is enabled by default.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import test from "node:test";
|
|
6
|
-
import assert from "node:assert/strict";
|
|
7
|
-
import { defaultRoutingConfig } from "../model-router.js";
|
|
8
|
-
|
|
9
|
-
test("defaultRoutingConfig returns enabled: true", () => {
|
|
10
|
-
const config = defaultRoutingConfig();
|
|
11
|
-
assert.equal(config.enabled, true, "dynamic routing should be enabled by default");
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
test("defaultRoutingConfig enables all routing features", () => {
|
|
15
|
-
const config = defaultRoutingConfig();
|
|
16
|
-
assert.equal(config.escalate_on_failure, true);
|
|
17
|
-
assert.equal(config.budget_pressure, true);
|
|
18
|
-
assert.equal(config.cross_provider, true);
|
|
19
|
-
assert.equal(config.hooks, true);
|
|
20
|
-
});
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* empty-content-abort-loop.test.ts — Regression test for #2695.
|
|
3
|
-
*
|
|
4
|
-
* When the LLM sends an assistant message with empty `content: []` and
|
|
5
|
-
* `stopReason: "aborted"`, this is NOT a fatal abort — it is a non-fatal
|
|
6
|
-
* end-of-turn. The abort handler in agent-end-recovery.ts must distinguish
|
|
7
|
-
* this case and NOT pause auto-mode, allowing the loop to continue via
|
|
8
|
-
* resolveAgentEnd instead of entering a stuck re-dispatch loop.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import test from "node:test";
|
|
12
|
-
import assert from "node:assert/strict";
|
|
13
|
-
import { readFileSync } from "node:fs";
|
|
14
|
-
import { join, dirname } from "node:path";
|
|
15
|
-
import { fileURLToPath } from "node:url";
|
|
16
|
-
|
|
17
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
|
-
const RECOVERY_PATH = join(__dirname, "..", "bootstrap", "agent-end-recovery.ts");
|
|
19
|
-
|
|
20
|
-
function getRecoverySource(): string {
|
|
21
|
-
return readFileSync(RECOVERY_PATH, "utf-8");
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
test("agent-end-recovery.ts does not pause on aborted messages with empty content (#2695)", () => {
|
|
25
|
-
const source = getRecoverySource();
|
|
26
|
-
|
|
27
|
-
// The abort handler at `stopReason === "aborted"` must check for empty content
|
|
28
|
-
// before deciding to pause. An empty content array is a non-fatal agent stop.
|
|
29
|
-
const abortIdx = source.indexOf('stopReason === "aborted"');
|
|
30
|
-
assert.ok(abortIdx > -1, "abort handler must exist in agent-end-recovery.ts");
|
|
31
|
-
|
|
32
|
-
// Extract the region around the abort handler (enough to see the guard logic)
|
|
33
|
-
const abortRegion = source.slice(Math.max(0, abortIdx - 200), abortIdx + 600);
|
|
34
|
-
|
|
35
|
-
// Must check for empty content before pausing
|
|
36
|
-
assert.ok(
|
|
37
|
-
abortRegion.includes("content") && (abortRegion.includes("length") || abortRegion.includes("?.length")),
|
|
38
|
-
"abort handler must inspect content array length to distinguish empty-content aborts from fatal aborts (#2695)",
|
|
39
|
-
);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test("agent-end-recovery.ts routes empty-content aborted messages to resolveAgentEnd (#2695)", () => {
|
|
43
|
-
const source = getRecoverySource();
|
|
44
|
-
|
|
45
|
-
// The abort block must have a path that calls resolveAgentEnd for empty-content messages
|
|
46
|
-
// instead of unconditionally calling pauseAuto
|
|
47
|
-
const abortIdx = source.indexOf('stopReason === "aborted"');
|
|
48
|
-
assert.ok(abortIdx > -1, "abort handler must exist");
|
|
49
|
-
|
|
50
|
-
// Get the full abort handling block (from the if to the next stopReason check or success path)
|
|
51
|
-
const afterAbort = source.slice(abortIdx, abortIdx + 800);
|
|
52
|
-
|
|
53
|
-
// The abort block must have a code path that calls resolveAgentEnd (for empty-content case)
|
|
54
|
-
assert.ok(
|
|
55
|
-
afterAbort.includes("resolveAgentEnd"),
|
|
56
|
-
"abort handler must route empty-content aborted messages to resolveAgentEnd instead of always pausing (#2695)",
|
|
57
|
-
);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
test("agent-end-recovery.ts checks for errorMessage presence in abort handler (#2695)", () => {
|
|
61
|
-
const source = getRecoverySource();
|
|
62
|
-
|
|
63
|
-
const abortIdx = source.indexOf('stopReason === "aborted"');
|
|
64
|
-
assert.ok(abortIdx > -1, "abort handler must exist");
|
|
65
|
-
|
|
66
|
-
const abortRegion = source.slice(abortIdx, abortIdx + 600);
|
|
67
|
-
|
|
68
|
-
// Fatal aborts should have error context (errorMessage field).
|
|
69
|
-
// The handler should check for this to distinguish fatal from non-fatal aborts.
|
|
70
|
-
assert.ok(
|
|
71
|
-
abortRegion.includes("errorMessage"),
|
|
72
|
-
"abort handler must check for errorMessage to distinguish fatal aborts from empty-content non-fatal stops (#2695)",
|
|
73
|
-
);
|
|
74
|
-
});
|