gsd-pi 2.80.0-dev.c5f2443b3 → 2.80.0-dev.d4fc28e6b
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 +4 -2
- package/dist/cli.js +0 -19
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +2 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
- package/dist/resources/extensions/github-sync/templates.js +39 -8
- package/dist/resources/extensions/gsd/auto/loop.js +119 -18
- package/dist/resources/extensions/gsd/auto/phases.js +212 -135
- package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +41 -45
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +51 -15
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +27 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
- package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
- package/dist/resources/extensions/gsd/auto-start.js +199 -9
- package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +111 -1
- package/dist/resources/extensions/gsd/auto.js +95 -27
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -3
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +49 -36
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +15 -5
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +33 -20
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +7 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +9 -3
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +8 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -55
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
- package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
- package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/context-budget.js +37 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +22 -2
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
- package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
- package/dist/resources/extensions/gsd/detection.js +106 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +36 -4
- package/dist/resources/extensions/gsd/graph.js +9 -3
- package/dist/resources/extensions/gsd/gsd-db.js +146 -13
- package/dist/resources/extensions/gsd/guided-flow.js +129 -44
- package/dist/resources/extensions/gsd/memory-store.js +69 -12
- package/dist/resources/extensions/gsd/migrate/command.js +40 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
- package/dist/resources/extensions/gsd/pr-evidence.js +57 -16
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/dist/resources/extensions/gsd/quick.js +34 -2
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
- package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
- package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
- package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
- package/dist/resources/extensions/gsd/worktree-resolver.js +68 -21
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- 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/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- 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 +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
- package/dist/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +12 -8
- package/packages/contracts/package.json +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -17
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
- package/packages/mcp-server/src/workflow-tools.ts +30 -16
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +9 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +8 -0
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +14 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
- package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/fake-model.js +27 -0
- package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/index.js +8 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
- package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/fake.js +319 -0
- package/packages/pi-ai/dist/providers/fake.js.map +1 -0
- package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
- package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
- package/packages/pi-ai/src/models/fake-model.ts +30 -0
- package/packages/pi-ai/src/models/index.ts +9 -0
- package/packages/pi-ai/src/providers/fake.ts +376 -0
- package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +44 -7
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +76 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +39 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +24 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +33 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +54 -15
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +10 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +7 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +17 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +109 -17
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.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 +69 -2
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +93 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +26 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +48 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +10 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +48 -7
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +89 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
- package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
- package/packages/pi-coding-agent/src/core/extensions/types.ts +42 -1
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
- package/packages/pi-coding-agent/src/core/settings-manager.ts +51 -1
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +78 -15
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +10 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +10 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +122 -17
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +99 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +92 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +28 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +65 -0
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +14 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
- package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/index.d.ts +1 -0
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -0
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/style.d.ts +41 -0
- package/packages/pi-tui/dist/style.d.ts.map +1 -0
- package/packages/pi-tui/dist/style.js +158 -0
- package/packages/pi-tui/dist/style.js.map +1 -0
- package/packages/pi-tui/dist/tui.d.ts +0 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +21 -16
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
- package/packages/pi-tui/src/index.ts +9 -0
- package/packages/pi-tui/src/style.ts +225 -0
- package/packages/pi-tui/src/tui.ts +23 -16
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +18 -1
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +36 -27
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/src/resources/GSD-WORKFLOW.md +2 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
- package/src/resources/extensions/github-sync/templates.ts +38 -8
- package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
- package/src/resources/extensions/gsd/auto/loop.ts +151 -26
- package/src/resources/extensions/gsd/auto/phases.ts +289 -196
- package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +52 -44
- package/src/resources/extensions/gsd/auto/session.ts +8 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +57 -8
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +28 -14
- package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
- package/src/resources/extensions/gsd/auto-start.ts +237 -15
- package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +123 -0
- package/src/resources/extensions/gsd/auto.ts +110 -22
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +119 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +50 -36
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +16 -5
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +34 -19
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +8 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +10 -3
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +9 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +386 -55
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
- package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
- package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/context-budget.ts +44 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +24 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
- package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
- package/src/resources/extensions/gsd/detection.ts +128 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +46 -8
- package/src/resources/extensions/gsd/graph.ts +12 -5
- package/src/resources/extensions/gsd/gsd-db.ts +168 -13
- package/src/resources/extensions/gsd/guided-flow.ts +150 -51
- package/src/resources/extensions/gsd/memory-store.ts +77 -12
- package/src/resources/extensions/gsd/migrate/command.ts +47 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
- package/src/resources/extensions/gsd/pr-evidence.ts +63 -5
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/src/resources/extensions/gsd/quick.ts +37 -2
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +516 -15
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +56 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +184 -2
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +168 -6
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +117 -7
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +40 -2
- package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +38 -17
- package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -4
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +37 -6
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +167 -4
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
- package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
- package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
- package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
- package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
- package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +85 -19
- package/packages/contracts/tsconfig.tsbuildinfo +0 -1
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +0 -97
- /package/dist/web/standalone/.next/static/{bQDK5_LtkGVS64AirQgQG → cWaxzf-sdbSSbbwYu8q7a}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{bQDK5_LtkGVS64AirQgQG → cWaxzf-sdbSSbbwYu8q7a}/_ssgManifest.js +0 -0
|
@@ -34,6 +34,7 @@ import { snapshotSkills } from "./skill-discovery.js";
|
|
|
34
34
|
import { isDbAvailable, getMilestone, openDatabase, getDbStatus } from "./gsd-db.js";
|
|
35
35
|
import { isClosedStatus } from "./status-guards.js";
|
|
36
36
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
37
|
+
import { auditOrphanedPreflightStashes } from "./orphan-stash-audit.js";
|
|
37
38
|
import { debugLog, enableDebug, isDebugEnabled, getDebugLogPath, } from "./debug-logger.js";
|
|
38
39
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
39
40
|
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, } from "node:fs";
|
|
@@ -224,6 +225,139 @@ export function auditOrphanedMilestoneBranches(basePath, isolationMode) {
|
|
|
224
225
|
}
|
|
225
226
|
return { recovered, warnings };
|
|
226
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* Pure decision function for picking which orphan milestone the auto-loop
|
|
230
|
+
* should resume the merge transition for. Extracted so it can be unit-tested
|
|
231
|
+
* without spinning up a git repo or a SQLite DB.
|
|
232
|
+
*
|
|
233
|
+
* Returns the lexicographically-greatest milestone id (e.g. "M002" beats
|
|
234
|
+
* "M001") whose branch is unmerged AND has commits ahead of main AND whose
|
|
235
|
+
* status is `complete`. Lex-ordering matches the project's M00x convention,
|
|
236
|
+
* which is the most-recently-completed milestone in practice.
|
|
237
|
+
* `isComplete` errors propagate; `commitsAhead` errors are treated as 0.
|
|
238
|
+
*/
|
|
239
|
+
export function _selectResumableMilestone(branchNames, mergedBranches, isComplete, commitsAhead) {
|
|
240
|
+
const candidates = [];
|
|
241
|
+
for (const branch of branchNames) {
|
|
242
|
+
if (!branch.startsWith("milestone/"))
|
|
243
|
+
continue;
|
|
244
|
+
const milestoneId = branch.slice("milestone/".length);
|
|
245
|
+
if (mergedBranches.has(branch))
|
|
246
|
+
continue;
|
|
247
|
+
if (!isComplete(milestoneId))
|
|
248
|
+
continue;
|
|
249
|
+
let ahead = 0;
|
|
250
|
+
try {
|
|
251
|
+
ahead = commitsAhead(branch);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (ahead <= 0)
|
|
257
|
+
continue;
|
|
258
|
+
candidates.push(milestoneId);
|
|
259
|
+
}
|
|
260
|
+
if (candidates.length === 0)
|
|
261
|
+
return null;
|
|
262
|
+
candidates.sort();
|
|
263
|
+
return candidates[candidates.length - 1];
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Find the most-recent completed milestone whose branch still has unmerged
|
|
267
|
+
* commits ahead of the integration branch. Used by `bootstrapAutoSession`
|
|
268
|
+
* to seed `s.currentMilestoneId` so the auto-loop's transition guard at
|
|
269
|
+
* `phases.ts:730` fires on the first iteration after a process restart —
|
|
270
|
+
* without this, the in-memory-only `s.currentMilestoneId` is `null` after
|
|
271
|
+
* restart, the guard short-circuits, and the orphaned milestone branch
|
|
272
|
+
* never gets merged into main (#5538-followup).
|
|
273
|
+
*
|
|
274
|
+
* Returns null when isolation is `none`, the DB is unavailable, or no
|
|
275
|
+
* orphan candidate exists. All git failures degrade silently — startup
|
|
276
|
+
* must never block on this defensive lookup.
|
|
277
|
+
*/
|
|
278
|
+
export function findUnmergedCompletedMilestone(basePath, isolationMode) {
|
|
279
|
+
if (isolationMode === "none")
|
|
280
|
+
return null;
|
|
281
|
+
if (!isDbAvailable())
|
|
282
|
+
return null;
|
|
283
|
+
let milestoneBranches;
|
|
284
|
+
try {
|
|
285
|
+
milestoneBranches = nativeBranchList(basePath, "milestone/*");
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
if (milestoneBranches.length === 0)
|
|
291
|
+
return null;
|
|
292
|
+
let mainBranch;
|
|
293
|
+
try {
|
|
294
|
+
mainBranch = nativeDetectMainBranch(basePath);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
mainBranch = "main";
|
|
298
|
+
}
|
|
299
|
+
let mergedBranches;
|
|
300
|
+
try {
|
|
301
|
+
mergedBranches = new Set(nativeBranchListMerged(basePath, mainBranch, "milestone/*"));
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
mergedBranches = new Set();
|
|
305
|
+
}
|
|
306
|
+
return _selectResumableMilestone(milestoneBranches, mergedBranches, (milestoneId) => {
|
|
307
|
+
const row = getMilestone(milestoneId);
|
|
308
|
+
return !!row && row.status === "complete";
|
|
309
|
+
}, (branch) => nativeCommitCountBetween(basePath, mainBranch, branch));
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Run `mergeAndExit` for a milestone whose worktree/branch finalization
|
|
313
|
+
* never completed in a prior session — the active-milestone in phase
|
|
314
|
+
* `complete` with a survivor `milestone/<id>` branch still around.
|
|
315
|
+
*
|
|
316
|
+
* Wraps the call in try/catch so a thrown error from `_mergeBranchMode`
|
|
317
|
+
* (made fail-loud in commit 68ef58a3c) is converted into a user-facing
|
|
318
|
+
* error notify instead of an unhandled exception that propagates through
|
|
319
|
+
* `bootstrapAutoSession` to the slash-command caller's `.catch` block.
|
|
320
|
+
*
|
|
321
|
+
* Returns `{ merged: true }` on success; `{ merged: false, error }` on
|
|
322
|
+
* throw — caller decides whether to abort bootstrap.
|
|
323
|
+
*/
|
|
324
|
+
export function _finalizeSurvivorBranch(resolver, milestoneId, ui) {
|
|
325
|
+
ui.notify(`Milestone ${milestoneId} is complete but branch/worktree was not finalized. Running merge now.`, "info");
|
|
326
|
+
try {
|
|
327
|
+
resolver.mergeAndExit(milestoneId, { notify: ui.notify.bind(ui) });
|
|
328
|
+
return { merged: true };
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
332
|
+
ui.notify(`Survivor-branch finalization for ${milestoneId} failed: ${msg}. Resolve manually and re-run /gsd auto.`, "error");
|
|
333
|
+
return { merged: false, error: err };
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Merge a milestone whose DB row is `complete` but whose branch is still
|
|
338
|
+
* unmerged into the integration branch. Called from `bootstrapAutoSession`
|
|
339
|
+
* for orphans surfaced by `findUnmergedCompletedMilestone`.
|
|
340
|
+
*
|
|
341
|
+
* Notifies the user before and after, swallowing errors so a transient git
|
|
342
|
+
* failure never blocks bootstrap. Returns `{ merged: true }` when the
|
|
343
|
+
* underlying `mergeAndExit` completes; `{ merged: false, error }` on throw.
|
|
344
|
+
*
|
|
345
|
+
* Extracted to keep `bootstrapAutoSession` testable: the merge call and the
|
|
346
|
+
* notify shape are exercised against a mock resolver in
|
|
347
|
+
* `tests/orphan-merge-bootstrap.test.ts`.
|
|
348
|
+
*/
|
|
349
|
+
export function _mergeOrphanCompletedMilestone(resolver, orphanId, ui) {
|
|
350
|
+
ui.notify(`Detected unmerged completed milestone ${orphanId}. Merging now.`, "info");
|
|
351
|
+
try {
|
|
352
|
+
resolver.mergeAndExit(orphanId, { notify: ui.notify.bind(ui) });
|
|
353
|
+
return { merged: true };
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
357
|
+
ui.notify(`Could not merge orphan milestone ${orphanId}: ${msg}. Resolve manually and re-run /gsd auto.`, "warning");
|
|
358
|
+
return { merged: false, error: err };
|
|
359
|
+
}
|
|
360
|
+
}
|
|
227
361
|
export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, requestedStepMode, deps, interrupted) {
|
|
228
362
|
const { shouldUseWorktreeIsolation, registerSigtermHandler, lockBase, buildResolver, } = deps;
|
|
229
363
|
const dirCheck = validateDirectory(base);
|
|
@@ -420,6 +554,33 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
420
554
|
// Non-fatal — the audit is defensive, never block bootstrap
|
|
421
555
|
logWarning("bootstrap", `orphaned milestone branch audit failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
422
556
|
}
|
|
557
|
+
// ── Orphaned preflight-stash audit (#5538-followup) ──
|
|
558
|
+
// Reapplies pre-merge stashes whose milestone is now complete but whose
|
|
559
|
+
// postflight pop was skipped by an interrupted merge in a prior session.
|
|
560
|
+
// Uses `git stash apply` (not pop) so the entry remains as a backup.
|
|
561
|
+
try {
|
|
562
|
+
if (isDbAvailable()) {
|
|
563
|
+
const stashAudit = auditOrphanedPreflightStashes(base, (milestoneId) => {
|
|
564
|
+
const row = getMilestone(milestoneId);
|
|
565
|
+
return !!row && isClosedStatus(row.status);
|
|
566
|
+
});
|
|
567
|
+
for (const entry of stashAudit.applied) {
|
|
568
|
+
ctx.ui.notify(`Orphan audit: applied preflight stash ${entry.stashRef} for completed milestone ${entry.milestoneId}. The stash entry is preserved as a backup.`, "info");
|
|
569
|
+
}
|
|
570
|
+
for (const msg of stashAudit.warnings) {
|
|
571
|
+
ctx.ui.notify(`Orphan audit: ${msg}`, "warning");
|
|
572
|
+
}
|
|
573
|
+
if (stashAudit.applied.length > 0) {
|
|
574
|
+
debugLog("orphan-stash-audit", {
|
|
575
|
+
applied: stashAudit.applied,
|
|
576
|
+
warnings: stashAudit.warnings,
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
catch (err) {
|
|
582
|
+
logWarning("bootstrap", `orphaned preflight-stash audit failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
583
|
+
}
|
|
423
584
|
let state = await deriveState(base);
|
|
424
585
|
// Stale worktree state recovery (#654)
|
|
425
586
|
if (state.activeMilestone &&
|
|
@@ -476,20 +637,49 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
476
637
|
// hasSurvivorBranch after a successful promotion.
|
|
477
638
|
if (decideSurvivorAction(hasSurvivorBranch, state.phase) === "finalize") {
|
|
478
639
|
const mid = state.activeMilestone.id;
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
640
|
+
// Commit 68ef58a3c made `_mergeBranchMode` throw on wrong-branch
|
|
641
|
+
// instead of returning false silently. Wrap the call so the throw is
|
|
642
|
+
// converted into an error notify + clean bootstrap abort, not an
|
|
643
|
+
// unhandled exception propagating to the slash-command caller (#5549
|
|
644
|
+
// post-merge audit, R2).
|
|
645
|
+
const finalize = _finalizeSurvivorBranch(buildResolver(), mid, ctx.ui);
|
|
646
|
+
if (!finalize.merged) {
|
|
647
|
+
return releaseLockAndReturn();
|
|
648
|
+
}
|
|
484
649
|
invalidateAllCaches();
|
|
485
650
|
state = await deriveState(base);
|
|
486
651
|
// Clear survivor flag — finalization is done
|
|
487
652
|
hasSurvivorBranch = false;
|
|
488
653
|
}
|
|
654
|
+
// ── Orphan-completed-milestone merge (#5538-followup) ──
|
|
655
|
+
// A process killed between `complete-milestone` (DB flip + SUMMARY write)
|
|
656
|
+
// and the loop's transition-guard merge strands the milestone branch
|
|
657
|
+
// forever: `s.currentMilestoneId` is in-memory only, so on the next
|
|
658
|
+
// bootstrap the guard at phases.ts:730 sees `mid === s.currentMilestoneId`
|
|
659
|
+
// and short-circuits.
|
|
660
|
+
//
|
|
661
|
+
// The earlier attempt at this fix seeded `s.currentMilestoneId` to the
|
|
662
|
+
// orphan id pre-state-derivation, but the unconditional assignment at
|
|
663
|
+
// line 948 (`s.currentMilestoneId = state.activeMilestone?.id ?? null`)
|
|
664
|
+
// immediately overwrote the seed. Active-merge is the more durable fix:
|
|
665
|
+
// call `mergeAndExit` directly during bootstrap, then re-derive state so
|
|
666
|
+
// the loop's normal flow continues without an in-memory hint.
|
|
667
|
+
//
|
|
668
|
+
// Mirrors the survivor-finalize block above. Failures degrade to a
|
|
669
|
+
// warning notify so a transient git error doesn't block bootstrap.
|
|
670
|
+
{
|
|
671
|
+
const orphan = findUnmergedCompletedMilestone(base, getIsolationMode(base));
|
|
672
|
+
if (orphan && orphan !== state.activeMilestone?.id) {
|
|
673
|
+
const result = _mergeOrphanCompletedMilestone(buildResolver(), orphan, ctx.ui);
|
|
674
|
+
if (result.merged) {
|
|
675
|
+
invalidateAllCaches();
|
|
676
|
+
state = await deriveState(base);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
}
|
|
489
680
|
const effectivePrefs = loadEffectiveGSDPreferences(base)?.preferences;
|
|
490
|
-
const
|
|
491
|
-
|
|
492
|
-
: false;
|
|
681
|
+
const { shouldRunDeepProjectSetup } = await import("./auto-dispatch.js");
|
|
682
|
+
const deepProjectStagePending = shouldRunDeepProjectSetup(state, effectivePrefs, base, { hasSurvivorBranch });
|
|
493
683
|
if (deepProjectStagePending) {
|
|
494
684
|
// Deep project-level setup runs before the first milestone exists. Let
|
|
495
685
|
// the auto loop dispatch workflow-preferences / project / requirements
|
|
@@ -591,7 +781,7 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
591
781
|
s.resourceVersionOnStart = readResourceVersion();
|
|
592
782
|
s.pendingQuickTasks = [];
|
|
593
783
|
s.currentUnit = null;
|
|
594
|
-
s.currentMilestoneId
|
|
784
|
+
s.currentMilestoneId ??= deepProjectStagePending ? null : state.activeMilestone?.id ?? null;
|
|
595
785
|
s.originalModelId = startModelSnapshot?.id ?? ctx.model?.id ?? null;
|
|
596
786
|
s.originalModelProvider = startModelSnapshot?.provider ?? ctx.model?.provider ?? null;
|
|
597
787
|
s.originalThinkingLevel = startThinkingSnapshot ?? null;
|
|
@@ -24,7 +24,7 @@ let _currentSigtermHandler = null;
|
|
|
24
24
|
*
|
|
25
25
|
* Returns the new handler so the caller can store and deregister it later.
|
|
26
26
|
*/
|
|
27
|
-
export function registerSigtermHandler(currentBasePath, previousHandler) {
|
|
27
|
+
export function registerSigtermHandler(currentBasePath, previousHandler, onSignalCleanup) {
|
|
28
28
|
// Remove the explicitly-passed previous handler
|
|
29
29
|
if (previousHandler) {
|
|
30
30
|
for (const sig of CLEANUP_SIGNALS)
|
|
@@ -37,6 +37,13 @@ export function registerSigtermHandler(currentBasePath, previousHandler) {
|
|
|
37
37
|
process.off(sig, _currentSigtermHandler);
|
|
38
38
|
}
|
|
39
39
|
const handler = () => {
|
|
40
|
+
try {
|
|
41
|
+
onSignalCleanup?.();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
void 0;
|
|
45
|
+
// Signal cleanup is best-effort; lock cleanup and process exit still run.
|
|
46
|
+
}
|
|
40
47
|
clearLock(currentBasePath);
|
|
41
48
|
releaseSessionLock(currentBasePath);
|
|
42
49
|
process.exit(0);
|
|
@@ -35,13 +35,13 @@ export async function recoverTimedOutUnit(ctx, pi, unitType, unitId, reason, rct
|
|
|
35
35
|
writeUnitRuntimeRecord(basePath, unitType, unitId, currentUnitStartedAt, {
|
|
36
36
|
recovery: status,
|
|
37
37
|
});
|
|
38
|
-
const durableComplete = status.summaryExists && status.taskChecked && status.nextActionAdvanced;
|
|
38
|
+
const durableComplete = status.dbComplete || (status.summaryExists && status.taskChecked && status.nextActionAdvanced);
|
|
39
39
|
if (durableComplete) {
|
|
40
40
|
writeUnitRuntimeRecord(basePath, unitType, unitId, currentUnitStartedAt, {
|
|
41
41
|
phase: "finalized",
|
|
42
42
|
recovery: status,
|
|
43
43
|
});
|
|
44
|
-
ctx.ui.notify(`${reason === "idle" ? "Idle" : "Timeout"} recovery: ${unitType} ${unitId} already completed
|
|
44
|
+
ctx.ui.notify(`${reason === "idle" ? "Idle" : "Timeout"} recovery: ${unitType} ${unitId} already completed. Continuing auto-mode. (attempt ${attemptNumber})`, "info");
|
|
45
45
|
unitRecoveryCount.delete(recoveryKey);
|
|
46
46
|
bumpAndResolveSynthetic(`timeout-recovery:${reason}:${unitType}/${unitId}`);
|
|
47
47
|
return "recovered";
|
|
@@ -23,7 +23,7 @@ import { debugLog } from "./debug-logger.js";
|
|
|
23
23
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
24
24
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
25
25
|
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
26
|
-
import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeWorkingTreeStatus, nativeAddAllWithExclusions, nativeCommit, nativeCheckoutBranch, nativeMergeSquash, nativeConflictFiles, nativeCheckoutTheirs, nativeAddPaths, nativeRmForce, nativeBranchDelete, nativeBranchForceReset, nativeBranchExists, nativeDiffNumstat, nativeUpdateRef, nativeIsAncestor, nativeMergeAbort, } from "./native-git-bridge.js";
|
|
26
|
+
import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeWorkingTreeStatus, nativeAddAllWithExclusions, nativeCommit, nativeCheckoutBranch, nativeMergeSquash, nativeConflictFiles, nativeCheckoutTheirs, nativeAddPaths, nativeRmForce, nativeBranchDelete, nativeBranchForceReset, nativeBranchExists, nativeDiffNumstat, nativeUpdateRef, nativeIsAncestor, nativeMergeAbort, nativeWorktreeList, } from "./native-git-bridge.js";
|
|
27
27
|
import { gsdHome } from "./gsd-home.js";
|
|
28
28
|
import { createWorkspace } from "./workspace.js";
|
|
29
29
|
const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
|
|
@@ -1018,6 +1018,111 @@ export function enterBranchModeForMilestone(basePath, milestoneId) {
|
|
|
1018
1018
|
* for both reads and writes. copyPlanningArtifacts and reconcilePlanCheckboxes
|
|
1019
1019
|
* (both formerly here) became dead.
|
|
1020
1020
|
*/
|
|
1021
|
+
/**
|
|
1022
|
+
* True when `branch` is checked out in any worktree listed by
|
|
1023
|
+
* `git worktree list --porcelain`. Used to gate ref updates that would
|
|
1024
|
+
* otherwise leave a concurrent worktree's HEAD inconsistent with its
|
|
1025
|
+
* index/working tree (Codex peer-review of #5538-followup).
|
|
1026
|
+
*
|
|
1027
|
+
* Best-effort: a `nativeWorktreeList` failure returns true so we err on
|
|
1028
|
+
* the side of NOT moving the ref. Better to skip a fast-forward than to
|
|
1029
|
+
* silently corrupt another worktree.
|
|
1030
|
+
*/
|
|
1031
|
+
export function _isBranchCheckedOutElsewhere(basePath, branch) {
|
|
1032
|
+
try {
|
|
1033
|
+
const entries = nativeWorktreeList(basePath);
|
|
1034
|
+
return entries.some((entry) => entry.branch === branch);
|
|
1035
|
+
}
|
|
1036
|
+
catch {
|
|
1037
|
+
return true;
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
/**
|
|
1041
|
+
* Resolve the integration branch using the same 3-tier fallback as the
|
|
1042
|
+
* fresh-create path: META.json → git.main_branch preference → detected
|
|
1043
|
+
* main branch. Returns null when no usable target exists.
|
|
1044
|
+
*/
|
|
1045
|
+
function _resolveIntegrationBranchForReuse(basePath, milestoneId) {
|
|
1046
|
+
const fromMeta = readIntegrationBranch(basePath, milestoneId);
|
|
1047
|
+
if (fromMeta)
|
|
1048
|
+
return fromMeta;
|
|
1049
|
+
const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
1050
|
+
const fromPref = gitPrefs?.main_branch &&
|
|
1051
|
+
typeof gitPrefs.main_branch === "string" &&
|
|
1052
|
+
gitPrefs.main_branch.length > 0 &&
|
|
1053
|
+
nativeBranchExists(basePath, gitPrefs.main_branch)
|
|
1054
|
+
? gitPrefs.main_branch
|
|
1055
|
+
: null;
|
|
1056
|
+
if (fromPref)
|
|
1057
|
+
return fromPref;
|
|
1058
|
+
try {
|
|
1059
|
+
return nativeDetectMainBranch(basePath);
|
|
1060
|
+
}
|
|
1061
|
+
catch {
|
|
1062
|
+
return null;
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
/**
|
|
1066
|
+
* When reusing an existing milestone branch, fast-forward it onto the
|
|
1067
|
+
* integration branch when that's safe (branch is a strict ancestor of
|
|
1068
|
+
* integration — no commits would be lost). Skips when the branch has its
|
|
1069
|
+
* own commits ahead of integration, when the integration branch can't be
|
|
1070
|
+
* resolved, or when any git operation fails — the merge gate at milestone
|
|
1071
|
+
* completion will surface real divergence as a conflict.
|
|
1072
|
+
*
|
|
1073
|
+
* The previous behavior re-attached the worktree to whatever stale tip
|
|
1074
|
+
* the branch held, which caused new milestone work to fork from a base
|
|
1075
|
+
* missing prior milestones' merges (#5538-followup).
|
|
1076
|
+
*/
|
|
1077
|
+
export function fastForwardReusedMilestoneBranchIfSafe(basePath, milestoneId, branch) {
|
|
1078
|
+
try {
|
|
1079
|
+
const integrationBranch = _resolveIntegrationBranchForReuse(basePath, milestoneId);
|
|
1080
|
+
if (!integrationBranch || integrationBranch === branch)
|
|
1081
|
+
return;
|
|
1082
|
+
if (!nativeBranchExists(basePath, integrationBranch))
|
|
1083
|
+
return;
|
|
1084
|
+
// Pure fast-forward only: branch must be a strict ancestor of integration.
|
|
1085
|
+
// If the branch has its own commits ahead, leave it alone.
|
|
1086
|
+
if (!nativeIsAncestor(basePath, branch, integrationBranch)) {
|
|
1087
|
+
debugLog("createAutoWorktree", {
|
|
1088
|
+
phase: "skip-ff-branch-not-ancestor",
|
|
1089
|
+
milestoneId,
|
|
1090
|
+
branch,
|
|
1091
|
+
integration: integrationBranch,
|
|
1092
|
+
});
|
|
1093
|
+
return;
|
|
1094
|
+
}
|
|
1095
|
+
// Codex peer-review: `nativeUpdateRef` succeeds even when the branch is
|
|
1096
|
+
// currently checked out in another worktree, leaving that worktree's HEAD
|
|
1097
|
+
// inconsistent with its index/work tree. Skip the fast-forward if any
|
|
1098
|
+
// listed worktree has this branch checked out — the merge gate at
|
|
1099
|
+
// milestone-completion will surface stale-base divergence as a conflict
|
|
1100
|
+
// instead of silently corrupting the other worktree's state.
|
|
1101
|
+
if (_isBranchCheckedOutElsewhere(basePath, branch)) {
|
|
1102
|
+
debugLog("createAutoWorktree", {
|
|
1103
|
+
phase: "skip-ff-branch-checked-out-elsewhere",
|
|
1104
|
+
milestoneId,
|
|
1105
|
+
branch,
|
|
1106
|
+
});
|
|
1107
|
+
return;
|
|
1108
|
+
}
|
|
1109
|
+
nativeUpdateRef(basePath, `refs/heads/${branch}`, integrationBranch);
|
|
1110
|
+
debugLog("createAutoWorktree", {
|
|
1111
|
+
phase: "fast-forward-reused-branch",
|
|
1112
|
+
milestoneId,
|
|
1113
|
+
branch,
|
|
1114
|
+
integration: integrationBranch,
|
|
1115
|
+
});
|
|
1116
|
+
}
|
|
1117
|
+
catch (err) {
|
|
1118
|
+
debugLog("createAutoWorktree", {
|
|
1119
|
+
phase: "fast-forward-reused-branch-failed",
|
|
1120
|
+
milestoneId,
|
|
1121
|
+
branch,
|
|
1122
|
+
error: err instanceof Error ? err.message : String(err),
|
|
1123
|
+
});
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1021
1126
|
export function createAutoWorktree(basePath, milestoneId) {
|
|
1022
1127
|
basePath = resolveWorktreeProjectRoot(basePath);
|
|
1023
1128
|
// Check if repo has commits — git worktree requires a valid HEAD
|
|
@@ -1035,6 +1140,11 @@ export function createAutoWorktree(basePath, milestoneId) {
|
|
|
1035
1140
|
const branchExists = nativeBranchExists(basePath, branch);
|
|
1036
1141
|
let info;
|
|
1037
1142
|
if (branchExists) {
|
|
1143
|
+
// #5538-followup: fast-forward the reused branch onto the integration
|
|
1144
|
+
// branch when safe so the next milestone forks from up-to-date code.
|
|
1145
|
+
// Without this, a milestone that was created before another milestone
|
|
1146
|
+
// merged into main would carry a stale base into its worktree.
|
|
1147
|
+
fastForwardReusedMilestoneBranchIfSafe(basePath, milestoneId, branch);
|
|
1038
1148
|
// Re-attach worktree to the existing milestone branch (preserving commits)
|
|
1039
1149
|
info = createWorktree(basePath, milestoneId, {
|
|
1040
1150
|
branch,
|
|
@@ -20,7 +20,7 @@ import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveDir, milest
|
|
|
20
20
|
import { invalidateAllCaches } from "./cache.js";
|
|
21
21
|
import { clearActivityLogState } from "./activity-log.js";
|
|
22
22
|
import { synthesizeCrashRecovery, getDeepDiagnostic, readActiveMilestoneId, } from "./session-forensics.js";
|
|
23
|
-
import { writeLock, clearLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, } from "./crash-recovery.js";
|
|
23
|
+
import { writeLock, clearLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
|
|
24
24
|
import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
|
|
25
25
|
import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, } from "./preferences.js";
|
|
26
26
|
import { sendDesktopNotification } from "./notifications.js";
|
|
@@ -45,6 +45,7 @@ import { readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
|
45
45
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
46
46
|
import { autoCommitCurrentBranch, captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, resolveProjectRoot, } from "./worktree.js";
|
|
47
47
|
import { GitServiceImpl } from "./git-service.js";
|
|
48
|
+
import { nativeCheckoutBranch } from "./native-git-bridge.js";
|
|
48
49
|
import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
|
|
49
50
|
import { createAutoWorktree, enterAutoWorktree, enterBranchModeForMilestone, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, syncWorktreeStateBack, syncProjectRootToWorktree, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree.js";
|
|
50
51
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
@@ -61,6 +62,8 @@ import { isClosedStatus } from "./status-guards.js";
|
|
|
61
62
|
import { updateProgressWidget as _updateProgressWidget, updateSliceProgressCache, clearSliceProgressCache, } from "./auto-dashboard.js";
|
|
62
63
|
import { registerSigtermHandler as _registerSigtermHandler, deregisterSigtermHandler as _deregisterSigtermHandler, } from "./auto-supervisor.js";
|
|
63
64
|
import { isDbAvailable, getMilestone } from "./gsd-db.js";
|
|
65
|
+
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
66
|
+
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
64
67
|
import { countPendingCaptures } from "./captures.js";
|
|
65
68
|
import { CMUX_CHANNELS } from "../shared/cmux-events.js";
|
|
66
69
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
@@ -85,6 +88,16 @@ import { validateDirectory } from "./validate-directory.js";
|
|
|
85
88
|
import { createAutoOrchestrator } from "./auto/orchestrator.js";
|
|
86
89
|
import { WorktreeResolver, } from "./worktree-resolver.js";
|
|
87
90
|
import { reorderForCaching } from "./prompt-ordering.js";
|
|
91
|
+
import { initTokenCounter } from "./token-counter.js";
|
|
92
|
+
// Warm the tiktoken encoder at extension startup so context-budget computations
|
|
93
|
+
// can use accurate token counts via countTokensSync without paying the load
|
|
94
|
+
// cost mid-prompt-build. Fire-and-forget — failure falls back to the
|
|
95
|
+
// provider-aware char-ratio estimator already used by getCharsPerToken().
|
|
96
|
+
// Catch rejections explicitly: an unhandled rejection at module-import time
|
|
97
|
+
// can destabilize startup before the engine logger is configured.
|
|
98
|
+
void initTokenCounter().catch((err) => {
|
|
99
|
+
logWarning("engine", `token counter warm-up failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
100
|
+
});
|
|
88
101
|
export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session.js";
|
|
89
102
|
import { autoSession as s } from "./auto-runtime-state.js";
|
|
90
103
|
import { gsdHome } from "./gsd-home.js";
|
|
@@ -112,11 +125,12 @@ const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
|
112
125
|
* the DB is unavailable (e.g. fresh project before init) we skip registration
|
|
113
126
|
* silently rather than blocking session start.
|
|
114
127
|
*/
|
|
115
|
-
function registerAutoWorkerForSession(session) {
|
|
128
|
+
function registerAutoWorkerForSession(session, projectRootOverride) {
|
|
116
129
|
if (session.workerId)
|
|
117
130
|
return; // already registered (e.g. resume re-runs)
|
|
118
131
|
try {
|
|
119
|
-
const projectRootRealpath = normalizeRealPath(
|
|
132
|
+
const projectRootRealpath = normalizeRealPath(projectRootOverride
|
|
133
|
+
?? session.scope?.workspace.projectRoot
|
|
120
134
|
?? (session.originalBasePath || session.basePath));
|
|
121
135
|
session.workerId = registerAutoWorker({ projectRootRealpath });
|
|
122
136
|
}
|
|
@@ -225,8 +239,16 @@ function synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile
|
|
|
225
239
|
export function _synthesizePausedSessionRecoveryForTest(basePath, unitType, unitId, sessionFile) {
|
|
226
240
|
return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
|
|
227
241
|
}
|
|
242
|
+
const DETACHED_AUTO_KEEPALIVE_INTERVAL_MS = 30_000;
|
|
243
|
+
function withDetachedAutoKeepalive(run) {
|
|
244
|
+
const keepAlive = setInterval(() => { }, DETACHED_AUTO_KEEPALIVE_INTERVAL_MS);
|
|
245
|
+
return run.finally(() => {
|
|
246
|
+
clearInterval(keepAlive);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
export const _withDetachedAutoKeepaliveForTest = withDetachedAutoKeepalive;
|
|
228
250
|
export function startAutoDetached(ctx, pi, base, verboseMode, options) {
|
|
229
|
-
void startAuto(ctx, pi, base, verboseMode, options).catch((err) => {
|
|
251
|
+
void withDetachedAutoKeepalive(startAuto(ctx, pi, base, verboseMode, options)).catch((err) => {
|
|
230
252
|
const message = getErrorMessage(err);
|
|
231
253
|
ctx.ui.notify(`Auto-start failed: ${message}`, "error");
|
|
232
254
|
logWarning("engine", `auto start error: ${message}`, { file: "auto.ts" });
|
|
@@ -264,9 +286,50 @@ export function shouldUseWorktreeIsolation(basePath) {
|
|
|
264
286
|
*/
|
|
265
287
|
// Re-export budget utilities for external consumers
|
|
266
288
|
export { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, } from "./auto-budget.js";
|
|
289
|
+
function closeOutSignalInterruptedUnit(currentBasePath) {
|
|
290
|
+
const currentUnit = s.currentUnit;
|
|
291
|
+
if (!currentUnit)
|
|
292
|
+
return;
|
|
293
|
+
const reason = "Auto-mode process received a termination signal";
|
|
294
|
+
const errorContext = {
|
|
295
|
+
message: reason,
|
|
296
|
+
category: "aborted",
|
|
297
|
+
isTransient: false,
|
|
298
|
+
};
|
|
299
|
+
const basePath = s.basePath || currentBasePath;
|
|
300
|
+
try {
|
|
301
|
+
emitOpenUnitEndForUnit(basePath, currentUnit.type, currentUnit.id, "cancelled", errorContext);
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
logWarning("engine", `signal unit-end cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
|
|
305
|
+
}
|
|
306
|
+
try {
|
|
307
|
+
writeUnitRuntimeRecord(basePath, currentUnit.type, currentUnit.id, currentUnit.startedAt, {
|
|
308
|
+
phase: "crashed",
|
|
309
|
+
lastProgressAt: Date.now(),
|
|
310
|
+
lastProgressKind: "signal",
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
logWarning("engine", `signal runtime cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
|
|
315
|
+
}
|
|
316
|
+
try {
|
|
317
|
+
if (s.workerId)
|
|
318
|
+
markLatestActiveForWorkerCanceled(s.workerId, "signal-exit");
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
logWarning("engine", `signal dispatch cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
|
|
322
|
+
}
|
|
323
|
+
try {
|
|
324
|
+
resolveAgentEndCancelled(errorContext);
|
|
325
|
+
}
|
|
326
|
+
catch (err) {
|
|
327
|
+
logWarning("engine", `signal resolve cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
|
|
328
|
+
}
|
|
329
|
+
}
|
|
267
330
|
/** Wrapper: register SIGTERM handler and store reference. */
|
|
268
331
|
function registerSigtermHandler(currentBasePath) {
|
|
269
|
-
s.sigtermHandler = _registerSigtermHandler(currentBasePath, s.sigtermHandler);
|
|
332
|
+
s.sigtermHandler = _registerSigtermHandler(currentBasePath, s.sigtermHandler, () => closeOutSignalInterruptedUnit(currentBasePath));
|
|
270
333
|
}
|
|
271
334
|
/** Wrapper: deregister SIGTERM handler and clear reference. */
|
|
272
335
|
function deregisterSigtermHandler() {
|
|
@@ -658,6 +721,8 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
658
721
|
if (s.workerId) {
|
|
659
722
|
markWorkerStopping(s.workerId);
|
|
660
723
|
}
|
|
724
|
+
s.workerId = null;
|
|
725
|
+
s.milestoneLeaseToken = null;
|
|
661
726
|
}
|
|
662
727
|
catch (e) {
|
|
663
728
|
debugLog("stop-cleanup-coordination", { error: e instanceof Error ? e.message : String(e) });
|
|
@@ -790,6 +855,21 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
790
855
|
catch (e) {
|
|
791
856
|
debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
|
|
792
857
|
}
|
|
858
|
+
// Re-root the active command session/tool runtime after worktree teardown.
|
|
859
|
+
// mergeAndExit restores process.cwd(), but AgentSession has already captured
|
|
860
|
+
// its own cwd for tools and system prompt; refresh it before returning to the
|
|
861
|
+
// user so follow-up commands do not target a removed milestone worktree.
|
|
862
|
+
if (s.originalBasePath && ctx && s.cmdCtx) {
|
|
863
|
+
try {
|
|
864
|
+
const result = await s.cmdCtx.newSession({ workspaceRoot: s.basePath });
|
|
865
|
+
if (result.cancelled) {
|
|
866
|
+
logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
catch (err) {
|
|
870
|
+
logWarning("engine", `post-stop session re-root failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts", basePath: s.basePath });
|
|
871
|
+
}
|
|
872
|
+
}
|
|
793
873
|
// ── Step 8: Ledger notification ──
|
|
794
874
|
try {
|
|
795
875
|
const ledger = getLedger();
|
|
@@ -1038,6 +1118,7 @@ function buildResolverDeps() {
|
|
|
1038
1118
|
getAutoWorktreePath,
|
|
1039
1119
|
autoCommitCurrentBranch,
|
|
1040
1120
|
getCurrentBranch,
|
|
1121
|
+
checkoutBranch: nativeCheckoutBranch,
|
|
1041
1122
|
autoWorktreeBranch,
|
|
1042
1123
|
resolveMilestoneFile,
|
|
1043
1124
|
readFileSync: (path, encoding) => readFileSync(path, encoding),
|
|
@@ -1558,6 +1639,10 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1558
1639
|
: new URL("../../../resource-loader.js", import.meta.url).href;
|
|
1559
1640
|
const { initResources } = await import(resourceLoaderPath);
|
|
1560
1641
|
initResources(agentDir);
|
|
1642
|
+
// initResources() uses synchronous fs APIs, so the prompt-template cache
|
|
1643
|
+
// can be primed immediately — no need for the legacy 1s setTimeout deferral.
|
|
1644
|
+
const { primeCache } = await import("./prompt-loader.js");
|
|
1645
|
+
primeCache();
|
|
1561
1646
|
// Open the project DB before rebuild/derive so resume uses DB-backed
|
|
1562
1647
|
// state instead of falling back to stale markdown parsing (#2940).
|
|
1563
1648
|
await openProjectDbIfPresent(s.basePath);
|
|
@@ -1623,6 +1708,10 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1623
1708
|
lockBase,
|
|
1624
1709
|
buildResolver,
|
|
1625
1710
|
};
|
|
1711
|
+
// Register the worker before bootstrap enters a milestone worktree.
|
|
1712
|
+
// This ensures enterMilestone can claim a lease and seed dispatch claims
|
|
1713
|
+
// for crash-recovery fidelity (#5405).
|
|
1714
|
+
registerAutoWorkerForSession(s, base);
|
|
1626
1715
|
const ready = await bootstrapAutoSession(s, ctx, pi, base, verboseMode, requestedStepMode, bootstrapDeps, freshStartAssessment);
|
|
1627
1716
|
if (!ready)
|
|
1628
1717
|
return;
|
|
@@ -1740,28 +1829,7 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
|
|
|
1740
1829
|
id: triggerUnitId,
|
|
1741
1830
|
startedAt: hookStartedAt,
|
|
1742
1831
|
};
|
|
1743
|
-
|
|
1744
|
-
// newSession() snapshots process.cwd() during construction; chdir-ing
|
|
1745
|
-
// afterward leaves the session rooted to whatever cwd was when the call
|
|
1746
|
-
// was made. Must be synchronous — no awaits between chdir and newSession.
|
|
1747
|
-
try {
|
|
1748
|
-
if (process.cwd() !== s.basePath)
|
|
1749
|
-
process.chdir(s.basePath);
|
|
1750
|
-
}
|
|
1751
|
-
catch (err) {
|
|
1752
|
-
const msg = `Failed to chdir before hook newSession (basePath: ${s.basePath}): ${err instanceof Error ? err.message : String(err)}`;
|
|
1753
|
-
logWarning("engine", msg, { file: "auto.ts", basePath: s.basePath, error: err instanceof Error ? err.message : String(err) });
|
|
1754
|
-
ctx.ui.notify(`${msg}. Cancelling hook dispatch to avoid running in the wrong directory.`, "error");
|
|
1755
|
-
if (wasActive) {
|
|
1756
|
-
s.basePath = previousBasePath;
|
|
1757
|
-
s.currentUnit = previousCurrentUnit;
|
|
1758
|
-
}
|
|
1759
|
-
else {
|
|
1760
|
-
s.reset();
|
|
1761
|
-
}
|
|
1762
|
-
return false;
|
|
1763
|
-
}
|
|
1764
|
-
const result = await s.cmdCtx.newSession();
|
|
1832
|
+
const result = await s.cmdCtx.newSession({ workspaceRoot: s.basePath });
|
|
1765
1833
|
if (result.cancelled) {
|
|
1766
1834
|
await stopAuto(ctx, pi);
|
|
1767
1835
|
return false;
|