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
|
@@ -15,41 +15,79 @@ import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
|
15
15
|
import { saveFile, clearParseCache } from "../files.js";
|
|
16
16
|
import { invalidateStateCache } from "../state.js";
|
|
17
17
|
import { renderPlanCheckboxes } from "../markdown-renderer.js";
|
|
18
|
-
import { renderAllProjections
|
|
18
|
+
import { renderAllProjections } from "../workflow-projections.js";
|
|
19
19
|
import { writeManifest } from "../workflow-manifest.js";
|
|
20
20
|
import { appendEvent } from "../workflow-events.js";
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
22
|
+
* Render task summary markdown matching the template format.
|
|
23
|
+
* YAML frontmatter uses snake_case keys for parseSummary() compatibility.
|
|
24
24
|
*/
|
|
25
|
-
function
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
25
|
+
function renderSummaryMarkdown(params) {
|
|
26
|
+
const now = new Date().toISOString();
|
|
27
|
+
const keyFilesYaml = params.keyFiles.length > 0
|
|
28
|
+
? params.keyFiles.map(f => ` - ${f}`).join("\n")
|
|
29
|
+
: " - (none)";
|
|
30
|
+
const keyDecisionsYaml = params.keyDecisions.length > 0
|
|
31
|
+
? params.keyDecisions.map(d => ` - ${d}`).join("\n")
|
|
32
|
+
: " - (none)";
|
|
33
|
+
// Build verification evidence table rows
|
|
34
|
+
let evidenceTable = "| # | Command | Exit Code | Verdict | Duration |\n|---|---------|-----------|---------|----------|\n";
|
|
35
|
+
if (params.verificationEvidence.length > 0) {
|
|
36
|
+
params.verificationEvidence.forEach((e, i) => {
|
|
37
|
+
evidenceTable += `| ${i + 1} | \`${e.command}\` | ${e.exitCode} | ${e.verdict} | ${e.durationMs}ms |\n`;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
evidenceTable += "| — | No verification commands discovered | — | — | — |\n";
|
|
42
|
+
}
|
|
43
|
+
// Determine verification_result from evidence
|
|
44
|
+
const allPassed = params.verificationEvidence.length > 0 &&
|
|
45
|
+
params.verificationEvidence.every(e => e.exitCode === 0 || e.verdict.includes("✅") || e.verdict.toLowerCase().includes("pass"));
|
|
46
|
+
const verificationResult = allPassed ? "passed" : (params.verificationEvidence.length === 0 ? "untested" : "mixed");
|
|
47
|
+
// Extract a title from the oneLiner or taskId
|
|
48
|
+
const title = params.oneLiner || params.taskId;
|
|
49
|
+
return `---
|
|
50
|
+
id: ${params.taskId}
|
|
51
|
+
parent: ${params.sliceId}
|
|
52
|
+
milestone: ${params.milestoneId}
|
|
53
|
+
key_files:
|
|
54
|
+
${keyFilesYaml}
|
|
55
|
+
key_decisions:
|
|
56
|
+
${keyDecisionsYaml}
|
|
57
|
+
duration: ""
|
|
58
|
+
verification_result: ${verificationResult}
|
|
59
|
+
completed_at: ${now}
|
|
60
|
+
blocker_discovered: ${params.blockerDiscovered}
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
# ${params.taskId}: ${title}
|
|
64
|
+
|
|
65
|
+
**${params.oneLiner}**
|
|
66
|
+
|
|
67
|
+
## What Happened
|
|
68
|
+
|
|
69
|
+
${params.narrative}
|
|
70
|
+
|
|
71
|
+
## Verification
|
|
72
|
+
|
|
73
|
+
${params.verification}
|
|
74
|
+
|
|
75
|
+
## Verification Evidence
|
|
76
|
+
|
|
77
|
+
${evidenceTable}
|
|
78
|
+
|
|
79
|
+
## Deviations
|
|
80
|
+
|
|
81
|
+
${params.deviations || "None."}
|
|
82
|
+
|
|
83
|
+
## Known Issues
|
|
84
|
+
|
|
85
|
+
${params.knownIssues || "None."}
|
|
86
|
+
|
|
87
|
+
## Files Created/Modified
|
|
88
|
+
|
|
89
|
+
${params.keyFiles.map(f => `- \`${f}\``).join("\n") || "None."}
|
|
90
|
+
`;
|
|
53
91
|
}
|
|
54
92
|
/**
|
|
55
93
|
* Handle the complete_task operation end-to-end.
|
|
@@ -136,9 +174,8 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
136
174
|
// ── Filesystem operations (outside transaction) ─────────────────────────
|
|
137
175
|
// If disk render fails, roll back the DB status so deriveState() and
|
|
138
176
|
// verifyExpectedArtifact() stay consistent (both say "not done").
|
|
139
|
-
// Render summary markdown
|
|
140
|
-
const
|
|
141
|
-
const summaryMd = renderSummaryContent(taskRow, params.sliceId, params.milestoneId, params.verificationEvidence);
|
|
177
|
+
// Render summary markdown
|
|
178
|
+
const summaryMd = renderSummaryMarkdown(params);
|
|
142
179
|
// Resolve and write summary to disk
|
|
143
180
|
let summaryPath;
|
|
144
181
|
const tasksDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { clearParseCache } from "../files.js";
|
|
2
2
|
import { isClosedStatus } from "../status-guards.js";
|
|
3
3
|
import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
4
|
-
import { transaction, getMilestone,
|
|
4
|
+
import { transaction, getMilestone, insertMilestone, insertSlice, upsertMilestonePlanning, upsertSlicePlanning, } from "../gsd-db.js";
|
|
5
5
|
import { invalidateStateCache } from "../state.js";
|
|
6
6
|
import { renderRoadmapFromDb } from "../markdown-renderer.js";
|
|
7
7
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
@@ -146,16 +146,6 @@ export async function handlePlanMilestone(rawParams, basePath) {
|
|
|
146
146
|
guardError = `cannot re-plan milestone ${params.milestoneId}: it is already complete`;
|
|
147
147
|
return;
|
|
148
148
|
}
|
|
149
|
-
// Guard: refuse to re-plan a milestone that has completed slices (#2960).
|
|
150
|
-
// INSERT OR IGNORE on slices won't overwrite existing rows, but a full
|
|
151
|
-
// re-plan after worktree recreation or DB resync can create new slice rows
|
|
152
|
-
// that shadow completed work. Block early when any slice is already done.
|
|
153
|
-
const existingSlices = getMilestoneSlices(params.milestoneId);
|
|
154
|
-
const completedSlices = existingSlices.filter(s => isClosedStatus(s.status));
|
|
155
|
-
if (completedSlices.length > 0) {
|
|
156
|
-
guardError = `cannot re-plan milestone ${params.milestoneId}: ${completedSlices.length} slice(s) already completed (${completedSlices.map(s => s.id).join(", ")}). Use gsd_reassess_roadmap to modify the roadmap.`;
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
149
|
// Validate depends_on: all dependencies must exist and be complete
|
|
160
150
|
if (params.dependsOn && params.dependsOn.length > 0) {
|
|
161
151
|
for (const depId of params.dependsOn) {
|
|
@@ -188,7 +178,7 @@ export async function handlePlanMilestone(rawParams, basePath) {
|
|
|
188
178
|
definitionOfDone: params.definitionOfDone,
|
|
189
179
|
requirementCoverage: params.requirementCoverage,
|
|
190
180
|
boundaryMapMarkdown: params.boundaryMapMarkdown,
|
|
191
|
-
}
|
|
181
|
+
});
|
|
192
182
|
for (const slice of params.slices) {
|
|
193
183
|
insertSlice({
|
|
194
184
|
id: slice.sliceId,
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
|
-
import { existsSync, unlinkSync } from "node:fs";
|
|
3
2
|
import { clearParseCache } from "../files.js";
|
|
4
3
|
import { isClosedStatus } from "../status-guards.js";
|
|
5
4
|
import { isNonEmptyString } from "../validation.js";
|
|
6
|
-
import { transaction, getMilestone, getMilestoneSlices, getSlice, insertSlice, updateSliceFields, insertAssessment,
|
|
5
|
+
import { transaction, getMilestone, getMilestoneSlices, getSlice, insertSlice, updateSliceFields, insertAssessment, deleteSlice, } from "../gsd-db.js";
|
|
7
6
|
import { invalidateStateCache } from "../state.js";
|
|
8
7
|
import { renderRoadmapFromDb, renderAssessmentFromDb } from "../markdown-renderer.js";
|
|
9
8
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
@@ -144,18 +143,6 @@ export async function handleReassessRoadmap(rawParams, basePath) {
|
|
|
144
143
|
for (const removedId of params.sliceChanges.removed) {
|
|
145
144
|
deleteSlice(params.milestoneId, removedId);
|
|
146
145
|
}
|
|
147
|
-
// ── Invalidate stale milestone validation (#2957) ──────────────
|
|
148
|
-
// When roadmap structure changes (slices added/modified/removed),
|
|
149
|
-
// any prior milestone-validation verdict is stale. Delete the DB
|
|
150
|
-
// row so deriveState() returns phase: 'validating-milestone' once
|
|
151
|
-
// the new slices complete, rather than advancing directly to
|
|
152
|
-
// 'completing-milestone' with a stale needs-remediation verdict.
|
|
153
|
-
const hasStructuralChanges = params.sliceChanges.added.length > 0 ||
|
|
154
|
-
params.sliceChanges.modified.length > 0 ||
|
|
155
|
-
params.sliceChanges.removed.length > 0;
|
|
156
|
-
if (hasStructuralChanges) {
|
|
157
|
-
deleteAssessmentByScope(params.milestoneId, "milestone-validation");
|
|
158
|
-
}
|
|
159
146
|
});
|
|
160
147
|
}
|
|
161
148
|
catch (err) {
|
|
@@ -172,21 +159,6 @@ export async function handleReassessRoadmap(rawParams, basePath) {
|
|
|
172
159
|
assessment: params.assessment,
|
|
173
160
|
completedSliceId: params.completedSliceId,
|
|
174
161
|
});
|
|
175
|
-
// ── Remove stale VALIDATION file from disk (#2957) ────────────
|
|
176
|
-
const hasStructuralChanges = params.sliceChanges.added.length > 0 ||
|
|
177
|
-
params.sliceChanges.modified.length > 0 ||
|
|
178
|
-
params.sliceChanges.removed.length > 0;
|
|
179
|
-
if (hasStructuralChanges) {
|
|
180
|
-
const validationFile = join(basePath, ".gsd", "milestones", params.milestoneId, `${params.milestoneId}-VALIDATION.md`);
|
|
181
|
-
try {
|
|
182
|
-
if (existsSync(validationFile))
|
|
183
|
-
unlinkSync(validationFile);
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
// Best-effort: DB row is already deleted, so state derivation
|
|
187
|
-
// will not see the file-based verdict as authoritative.
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
162
|
// ── Invalidate caches ─────────────────────────────────────────
|
|
191
163
|
invalidateStateCache();
|
|
192
164
|
clearParseCache();
|
|
@@ -1,20 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* validate-milestone handler — the core operation behind gsd_validate_milestone.
|
|
3
3
|
*
|
|
4
|
-
* Persists milestone validation results to the assessments table
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* #2945 Bug 4: Previously only wrote to assessments — quality_gates records
|
|
8
|
-
* were never persisted, causing M002+ milestones to have zero gate records
|
|
9
|
-
* despite passing validation.
|
|
4
|
+
* Persists milestone validation results to the assessments table,
|
|
5
|
+
* renders VALIDATION.md to disk, and invalidates caches.
|
|
10
6
|
*/
|
|
11
7
|
import { join } from "node:path";
|
|
12
|
-
import { transaction, insertAssessment, deleteAssessmentByScope,
|
|
8
|
+
import { transaction, insertAssessment, deleteAssessmentByScope, } from "../gsd-db.js";
|
|
13
9
|
import { resolveMilestonePath, clearPathCache } from "../paths.js";
|
|
14
10
|
import { saveFile, clearParseCache } from "../files.js";
|
|
15
11
|
import { invalidateStateCache } from "../state.js";
|
|
16
12
|
import { VALIDATION_VERDICTS, isValidMilestoneVerdict } from "../verdict-parser.js";
|
|
17
|
-
import { insertMilestoneValidationGates } from "../milestone-validation-gates.js";
|
|
18
13
|
function renderValidationMarkdown(params) {
|
|
19
14
|
let md = `---
|
|
20
15
|
verdict: ${params.verdict}
|
|
@@ -82,12 +77,6 @@ export async function handleValidateMilestone(params, basePath) {
|
|
|
82
77
|
scope: 'milestone-validation',
|
|
83
78
|
fullContent: validationMd,
|
|
84
79
|
});
|
|
85
|
-
// #2945 Bug 4: persist quality_gates records alongside the assessment.
|
|
86
|
-
// Previously only the assessment was written, leaving M002+ milestones
|
|
87
|
-
// with zero quality_gate records despite passing validation.
|
|
88
|
-
const slices = getMilestoneSlices(params.milestoneId);
|
|
89
|
-
const sliceId = slices.length > 0 ? slices[0].id : "_milestone";
|
|
90
|
-
insertMilestoneValidationGates(params.milestoneId, sliceId, params.verdict, validatedAt);
|
|
91
80
|
});
|
|
92
81
|
// ── Filesystem render (outside transaction) ────────────────────────────
|
|
93
82
|
// If disk render fails, roll back the DB row so state stays consistent.
|
|
@@ -14,7 +14,7 @@ import { join } from "node:path";
|
|
|
14
14
|
import { createRequire } from "node:module";
|
|
15
15
|
import { gsdRoot, milestonesDir } from "./paths.js";
|
|
16
16
|
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
17
|
-
import { loadAllCaptures, loadActionableCaptures, markCaptureExecuted,
|
|
17
|
+
import { loadAllCaptures, loadActionableCaptures, markCaptureExecuted, } from "./captures.js";
|
|
18
18
|
// ─── Resolution Executors ─────────────────────────────────────────────────────
|
|
19
19
|
/**
|
|
20
20
|
* Inject a new task into the current slice plan.
|
|
@@ -209,15 +209,11 @@ export function buildQuickTaskPrompt(capture) {
|
|
|
209
209
|
``,
|
|
210
210
|
`## Instructions`,
|
|
211
211
|
``,
|
|
212
|
-
`1.
|
|
213
|
-
`
|
|
214
|
-
`
|
|
215
|
-
`
|
|
216
|
-
`
|
|
217
|
-
`3. Do NOT modify any \`.gsd/\` plan files — this is a one-off, not a planned task.`,
|
|
218
|
-
`4. Commit your changes with a descriptive message.`,
|
|
219
|
-
`5. Keep changes minimal and focused on the capture text.`,
|
|
220
|
-
`6. When done, say: "Quick task complete."`,
|
|
212
|
+
`1. Execute this task as a small, self-contained change.`,
|
|
213
|
+
`2. Do NOT modify any \`.gsd/\` plan files — this is a one-off, not a planned task.`,
|
|
214
|
+
`3. Commit your changes with a descriptive message.`,
|
|
215
|
+
`4. Keep changes minimal and focused on the capture text.`,
|
|
216
|
+
`5. When done, say: "Quick task complete."`,
|
|
221
217
|
].join("\n");
|
|
222
218
|
}
|
|
223
219
|
/**
|
|
@@ -242,18 +238,7 @@ export function executeTriageResolutions(basePath, mid, sid) {
|
|
|
242
238
|
quickTasks: [],
|
|
243
239
|
actions: [],
|
|
244
240
|
};
|
|
245
|
-
const actionable = loadActionableCaptures(basePath
|
|
246
|
-
// Reconciliation: stamp actionable captures that are missing the Milestone field
|
|
247
|
-
// with the current milestone ID. This covers captures resolved by the triage LLM
|
|
248
|
-
// before the prompt included the Milestone instruction, and acts as a safety net
|
|
249
|
-
// when the LLM omits the field (#2872).
|
|
250
|
-
if (mid) {
|
|
251
|
-
for (const capture of actionable) {
|
|
252
|
-
if (!capture.resolvedInMilestone) {
|
|
253
|
-
stampCaptureMilestone(basePath, capture.id, mid);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
241
|
+
const actionable = loadActionableCaptures(basePath);
|
|
257
242
|
// Also process deferred captures that target milestone IDs — create
|
|
258
243
|
// milestone directories so deriveState() discovers them.
|
|
259
244
|
const deferred = loadAllCaptures(basePath).filter(c => c.status === "resolved" && !c.executed && c.classification === "defer");
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// handleUndoTask: Reset a single task's DB status to "pending" and re-render markdown.
|
|
4
4
|
// handleResetSlice: Reset a slice and all its tasks, re-rendering plan + roadmap.
|
|
5
5
|
import { existsSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
|
|
6
|
-
import { join
|
|
6
|
+
import { join } from "node:path";
|
|
7
7
|
import { nativeRevertCommit, nativeRevertAbort } from "./native-git-bridge.js";
|
|
8
8
|
import { parseUnitId } from "./unit-id.js";
|
|
9
9
|
import { deriveState } from "./state.js";
|
|
@@ -124,7 +124,7 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
124
124
|
results.push(` Review with 'git diff --cached' then 'git commit' or 'git reset HEAD'`);
|
|
125
125
|
}
|
|
126
126
|
ctx.ui.notify(results.join("\n"), "success");
|
|
127
|
-
sendDesktopNotification("GSD", `Undone: ${unitType} (${unitId})`, "info", "complete"
|
|
127
|
+
sendDesktopNotification("GSD", `Undone: ${unitType} (${unitId})`, "info", "complete");
|
|
128
128
|
}
|
|
129
129
|
// ─── Targeted State Reset ────────────────────────────────────────────────────
|
|
130
130
|
/**
|
|
@@ -3,112 +3,17 @@
|
|
|
3
3
|
//
|
|
4
4
|
// An agent can claim a unit (task, slice) before working on it.
|
|
5
5
|
// complete-task and complete-slice enforce ownership when claims exist.
|
|
6
|
-
//
|
|
7
|
-
// first-writer-wins semantics via INSERT OR IGNORE.
|
|
6
|
+
// If no claim file is present, ownership is not enforced (backward compatible).
|
|
8
7
|
//
|
|
8
|
+
// Claim file location: .gsd/unit-claims.json
|
|
9
9
|
// Unit key format:
|
|
10
10
|
// task: "<milestoneId>/<sliceId>/<taskId>"
|
|
11
11
|
// slice: "<milestoneId>/<sliceId>"
|
|
12
12
|
//
|
|
13
13
|
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
14
|
-
import {
|
|
15
|
-
import { mkdirSync } from "node:fs";
|
|
14
|
+
import { existsSync, readFileSync, mkdirSync } from "node:fs";
|
|
16
15
|
import { join } from "node:path";
|
|
17
|
-
|
|
18
|
-
let providerName = null;
|
|
19
|
-
let providerModule = null;
|
|
20
|
-
let loadAttempted = false;
|
|
21
|
-
function suppressSqliteWarning() {
|
|
22
|
-
const origEmit = process.emit;
|
|
23
|
-
// @ts-expect-error overriding process.emit for warning filter
|
|
24
|
-
process.emit = function (event, ...args) {
|
|
25
|
-
if (event === "warning" &&
|
|
26
|
-
args[0] &&
|
|
27
|
-
typeof args[0] === "object" &&
|
|
28
|
-
"name" in args[0] &&
|
|
29
|
-
args[0].name === "ExperimentalWarning" &&
|
|
30
|
-
"message" in args[0] &&
|
|
31
|
-
typeof args[0].message === "string" &&
|
|
32
|
-
args[0].message.includes("SQLite")) {
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
return origEmit.apply(process, [event, ...args]);
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
function loadProvider() {
|
|
39
|
-
if (loadAttempted)
|
|
40
|
-
return;
|
|
41
|
-
loadAttempted = true;
|
|
42
|
-
try {
|
|
43
|
-
suppressSqliteWarning();
|
|
44
|
-
const mod = _require("node:sqlite");
|
|
45
|
-
if (mod.DatabaseSync) {
|
|
46
|
-
providerModule = mod;
|
|
47
|
-
providerName = "node:sqlite";
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
// unavailable
|
|
53
|
-
}
|
|
54
|
-
try {
|
|
55
|
-
const mod = _require("better-sqlite3");
|
|
56
|
-
if (typeof mod === "function" || (mod && mod.default)) {
|
|
57
|
-
providerModule = mod.default || mod;
|
|
58
|
-
providerName = "better-sqlite3";
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
// unavailable
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
function normalizeRow(row) {
|
|
67
|
-
if (row == null)
|
|
68
|
-
return undefined;
|
|
69
|
-
if (Object.getPrototypeOf(row) === null) {
|
|
70
|
-
return { ...row };
|
|
71
|
-
}
|
|
72
|
-
return row;
|
|
73
|
-
}
|
|
74
|
-
function openRawDb(path) {
|
|
75
|
-
loadProvider();
|
|
76
|
-
if (!providerModule || !providerName)
|
|
77
|
-
return null;
|
|
78
|
-
if (providerName === "node:sqlite") {
|
|
79
|
-
const { DatabaseSync } = providerModule;
|
|
80
|
-
return new DatabaseSync(path);
|
|
81
|
-
}
|
|
82
|
-
const Database = providerModule;
|
|
83
|
-
return new Database(path);
|
|
84
|
-
}
|
|
85
|
-
function wrapDb(rawDb) {
|
|
86
|
-
const db = rawDb;
|
|
87
|
-
return {
|
|
88
|
-
exec(sql) { db.exec(sql); },
|
|
89
|
-
prepare(sql) {
|
|
90
|
-
const raw = db.prepare(sql);
|
|
91
|
-
return {
|
|
92
|
-
run(...params) { return raw.run(...params); },
|
|
93
|
-
get(...params) {
|
|
94
|
-
return normalizeRow(raw.get(...params));
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
},
|
|
98
|
-
close() { db.close(); },
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
// ─── Per-basePath DB pool ────────────────────────────────────────────────
|
|
102
|
-
const dbPool = new Map();
|
|
103
|
-
function claimsDbPath(basePath) {
|
|
104
|
-
return join(basePath, ".gsd", "unit-claims.db");
|
|
105
|
-
}
|
|
106
|
-
function getDb(basePath) {
|
|
107
|
-
const existing = dbPool.get(basePath);
|
|
108
|
-
if (existing)
|
|
109
|
-
return existing;
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
16
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
112
17
|
// ─── Key Builders ────────────────────────────────────────────────────────
|
|
113
18
|
export function taskUnitKey(milestoneId, sliceId, taskId) {
|
|
114
19
|
return `${milestoneId}/${sliceId}/${taskId}`;
|
|
@@ -116,92 +21,56 @@ export function taskUnitKey(milestoneId, sliceId, taskId) {
|
|
|
116
21
|
export function sliceUnitKey(milestoneId, sliceId) {
|
|
117
22
|
return `${milestoneId}/${sliceId}`;
|
|
118
23
|
}
|
|
119
|
-
// ───
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
* Creates .gsd/ directory and unit-claims.db with the unit_claims table.
|
|
123
|
-
* Safe to call multiple times (idempotent).
|
|
124
|
-
*/
|
|
125
|
-
export function initOwnershipTable(basePath) {
|
|
126
|
-
if (dbPool.has(basePath))
|
|
127
|
-
return;
|
|
128
|
-
const dir = join(basePath, ".gsd");
|
|
129
|
-
mkdirSync(dir, { recursive: true });
|
|
130
|
-
const raw = openRawDb(claimsDbPath(basePath));
|
|
131
|
-
if (!raw) {
|
|
132
|
-
throw new Error("No SQLite provider available for unit-ownership");
|
|
133
|
-
}
|
|
134
|
-
const db = wrapDb(raw);
|
|
135
|
-
db.exec("PRAGMA journal_mode=WAL");
|
|
136
|
-
db.exec("PRAGMA busy_timeout = 5000");
|
|
137
|
-
db.exec("PRAGMA synchronous = NORMAL");
|
|
138
|
-
db.exec(`
|
|
139
|
-
CREATE TABLE IF NOT EXISTS unit_claims (
|
|
140
|
-
unit_key TEXT PRIMARY KEY,
|
|
141
|
-
agent_name TEXT NOT NULL,
|
|
142
|
-
claimed_at TEXT NOT NULL
|
|
143
|
-
)
|
|
144
|
-
`);
|
|
145
|
-
dbPool.set(basePath, db);
|
|
24
|
+
// ─── File Path ───────────────────────────────────────────────────────────
|
|
25
|
+
function claimsPath(basePath) {
|
|
26
|
+
return join(basePath, ".gsd", "unit-claims.json");
|
|
146
27
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const db = dbPool.get(basePath);
|
|
153
|
-
if (!db)
|
|
154
|
-
return;
|
|
28
|
+
// ─── Read Claims ─────────────────────────────────────────────────────────
|
|
29
|
+
function readClaims(basePath) {
|
|
30
|
+
const path = claimsPath(basePath);
|
|
31
|
+
if (!existsSync(path))
|
|
32
|
+
return null;
|
|
155
33
|
try {
|
|
156
|
-
|
|
34
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
157
38
|
}
|
|
158
|
-
catch { /* swallow */ }
|
|
159
|
-
dbPool.delete(basePath);
|
|
160
39
|
}
|
|
161
40
|
// ─── Public API ──────────────────────────────────────────────────────────
|
|
162
41
|
/**
|
|
163
42
|
* Claim a unit for an agent.
|
|
164
|
-
*
|
|
165
|
-
* Returns true if the claim was acquired (or the same agent already owns it).
|
|
166
|
-
* Returns false if a different agent already owns the unit.
|
|
43
|
+
* Overwrites any existing claim for this unit (last writer wins).
|
|
167
44
|
*/
|
|
168
45
|
export function claimUnit(basePath, unitKey, agentName) {
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
// INSERT OR IGNORE: if the row already exists, this is a no-op.
|
|
176
|
-
// The PRIMARY KEY constraint on unit_key prevents duplicate claims.
|
|
177
|
-
db.prepare("INSERT OR IGNORE INTO unit_claims (unit_key, agent_name, claimed_at) VALUES (?, ?, ?)").run(unitKey, agentName, new Date().toISOString());
|
|
178
|
-
// Check who owns it now
|
|
179
|
-
const row = db.prepare("SELECT agent_name FROM unit_claims WHERE unit_key = ?").get(unitKey);
|
|
180
|
-
const owner = row?.agent_name;
|
|
181
|
-
return owner === agentName;
|
|
46
|
+
const claims = readClaims(basePath) ?? {};
|
|
47
|
+
claims[unitKey] = { agent: agentName, claimed_at: new Date().toISOString() };
|
|
48
|
+
const dir = join(basePath, ".gsd");
|
|
49
|
+
mkdirSync(dir, { recursive: true });
|
|
50
|
+
atomicWriteSync(claimsPath(basePath), JSON.stringify(claims, null, 2) + "\n");
|
|
182
51
|
}
|
|
183
52
|
/**
|
|
184
|
-
* Release a unit claim (remove it from the claims
|
|
53
|
+
* Release a unit claim (remove it from the claims map).
|
|
185
54
|
*/
|
|
186
55
|
export function releaseUnit(basePath, unitKey) {
|
|
187
|
-
const
|
|
188
|
-
if (!
|
|
56
|
+
const claims = readClaims(basePath);
|
|
57
|
+
if (!claims || !(unitKey in claims))
|
|
189
58
|
return;
|
|
190
|
-
|
|
59
|
+
delete claims[unitKey];
|
|
60
|
+
atomicWriteSync(claimsPath(basePath), JSON.stringify(claims, null, 2) + "\n");
|
|
191
61
|
}
|
|
192
62
|
/**
|
|
193
|
-
* Get the current owner of a unit, or null if unclaimed.
|
|
63
|
+
* Get the current owner of a unit, or null if unclaimed / no claims file.
|
|
194
64
|
*/
|
|
195
65
|
export function getOwner(basePath, unitKey) {
|
|
196
|
-
const
|
|
197
|
-
if (!
|
|
66
|
+
const claims = readClaims(basePath);
|
|
67
|
+
if (!claims)
|
|
198
68
|
return null;
|
|
199
|
-
|
|
200
|
-
return row?.agent_name ?? null;
|
|
69
|
+
return claims[unitKey]?.agent ?? null;
|
|
201
70
|
}
|
|
202
71
|
/**
|
|
203
72
|
* Check if an actor is authorized to operate on a unit.
|
|
204
|
-
* Returns null if ownership passes (or is unclaimed).
|
|
73
|
+
* Returns null if ownership passes (or is unclaimed / no file).
|
|
205
74
|
* Returns an error string if a different agent owns the unit.
|
|
206
75
|
*/
|
|
207
76
|
export function checkOwnership(basePath, unitKey, actorName) {
|
|
@@ -209,7 +78,7 @@ export function checkOwnership(basePath, unitKey, actorName) {
|
|
|
209
78
|
return null; // no actor identity provided — opt-in, so allow
|
|
210
79
|
const owner = getOwner(basePath, unitKey);
|
|
211
80
|
if (owner === null)
|
|
212
|
-
return null; // unit unclaimed
|
|
81
|
+
return null; // unit unclaimed or no claims file
|
|
213
82
|
if (owner === actorName)
|
|
214
83
|
return null; // actor is the owner
|
|
215
84
|
return `Unit ${unitKey} is owned by ${owner}, not ${actorName}`;
|
|
@@ -16,28 +16,16 @@ import { extractUatType } from "./files.js";
|
|
|
16
16
|
* Returns `undefined` when frontmatter is absent or has no `verdict` field.
|
|
17
17
|
*/
|
|
18
18
|
export function extractVerdict(content) {
|
|
19
|
-
// Primary: YAML frontmatter verdict (canonical format)
|
|
20
19
|
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
21
|
-
if (fmMatch)
|
|
22
|
-
const verdictMatch = fmMatch[1].match(/verdict:\s*([\w-]+)/i);
|
|
23
|
-
if (verdictMatch) {
|
|
24
|
-
let v = verdictMatch[1].toLowerCase();
|
|
25
|
-
if (v === "passed")
|
|
26
|
-
v = "pass";
|
|
27
|
-
return v;
|
|
28
|
-
}
|
|
20
|
+
if (!fmMatch)
|
|
29
21
|
return undefined;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
v = "pass";
|
|
38
|
-
return v;
|
|
39
|
-
}
|
|
40
|
-
return undefined;
|
|
22
|
+
const verdictMatch = fmMatch[1].match(/verdict:\s*([\w-]+)/i);
|
|
23
|
+
if (!verdictMatch)
|
|
24
|
+
return undefined;
|
|
25
|
+
let v = verdictMatch[1].toLowerCase();
|
|
26
|
+
if (v === "passed")
|
|
27
|
+
v = "pass";
|
|
28
|
+
return v;
|
|
41
29
|
}
|
|
42
30
|
/**
|
|
43
31
|
* Returns `true` when the content's frontmatter contains a `verdict` field.
|