gsd-pi 2.75.0-next.9c0ec0ba1 → 2.76.0-dev.b072ebb73
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 +145 -125
- package/dist/claude-cli-check.d.ts +10 -0
- package/dist/claude-cli-check.js +13 -3
- package/dist/onboarding.d.ts +20 -1
- package/dist/onboarding.js +60 -25
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +6 -3
- package/dist/resources/extensions/claude-code-cli/readiness.js +34 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -2
- package/dist/resources/extensions/gsd/auto/phases.js +48 -6
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +37 -8
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +87 -9
- package/dist/resources/extensions/gsd/auto-model-selection.js +27 -6
- package/dist/resources/extensions/gsd/auto-post-unit.js +7 -5
- package/dist/resources/extensions/gsd/auto-prompts.js +188 -44
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -0
- package/dist/resources/extensions/gsd/auto-start.js +5 -3
- package/dist/resources/extensions/gsd/auto-verification.js +33 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +71 -2
- package/dist/resources/extensions/gsd/auto.js +25 -3
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +131 -0
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +12 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +84 -10
- package/dist/resources/extensions/gsd/commands/catalog.js +15 -7
- package/dist/resources/extensions/gsd/commands/handlers/core.js +58 -24
- package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
- package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
- package/dist/resources/extensions/gsd/commands-config.js +5 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +200 -77
- package/dist/resources/extensions/gsd/commands-memory.js +462 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +39 -11
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
- package/dist/resources/extensions/gsd/db-writer.js +89 -16
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
- package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +50 -32
- package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +51 -5
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -1
- package/dist/resources/extensions/gsd/doctor.js +7 -1
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -0
- package/dist/resources/extensions/gsd/error-classifier.js +5 -2
- package/dist/resources/extensions/gsd/escalation.js +321 -0
- package/dist/resources/extensions/gsd/graph.js +26 -0
- package/dist/resources/extensions/gsd/gsd-db.js +517 -32
- package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
- package/dist/resources/extensions/gsd/health-widget.js +7 -4
- package/dist/resources/extensions/gsd/hook-emitter.js +108 -0
- package/dist/resources/extensions/gsd/init-wizard.js +86 -45
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
- package/dist/resources/extensions/gsd/memory-backfill.js +126 -0
- package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
- package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
- package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
- package/dist/resources/extensions/gsd/memory-relations.js +189 -0
- package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
- package/dist/resources/extensions/gsd/memory-store.js +318 -6
- package/dist/resources/extensions/gsd/metrics.js +1 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +12 -5
- package/dist/resources/extensions/gsd/native-git-bridge.js +121 -5
- package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
- package/dist/resources/extensions/gsd/notification-widget.js +24 -39
- package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
- package/dist/resources/extensions/gsd/pre-execution-checks.js +98 -8
- package/dist/resources/extensions/gsd/preferences-models.js +1 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
- package/dist/resources/extensions/gsd/prompts/add-tests.md +1 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -3
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -0
- package/dist/resources/extensions/gsd/python-resolver.js +70 -0
- package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
- package/dist/resources/extensions/gsd/state.js +90 -7
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +331 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +14 -0
- package/dist/resources/extensions/gsd/uok/flags.js +1 -1
- package/dist/resources/extensions/gsd/verification-gate.js +2 -1
- package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +1 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +6 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
- package/dist/resources/extensions/remote-questions/manager.js +11 -1
- package/dist/resources/extensions/search-the-web/command-search-provider.js +4 -1
- package/dist/resources/extensions/search-the-web/native-search.js +13 -2
- package/dist/resources/skills/api-design/SKILL.md +190 -0
- package/dist/resources/skills/create-mcp-server/SKILL.md +121 -0
- package/dist/resources/skills/decompose-into-slices/SKILL.md +139 -0
- package/dist/resources/skills/dependency-upgrade/SKILL.md +158 -0
- package/dist/resources/skills/design-an-interface/SKILL.md +102 -0
- package/dist/resources/skills/forensics/SKILL.md +153 -0
- package/dist/resources/skills/grill-me/SKILL.md +93 -0
- package/dist/resources/skills/handoff/SKILL.md +121 -0
- package/dist/resources/skills/observability/SKILL.md +174 -0
- package/dist/resources/skills/security-review/SKILL.md +181 -0
- package/dist/resources/skills/spike-wrap-up/SKILL.md +138 -0
- package/dist/resources/skills/tdd/SKILL.md +112 -0
- package/dist/resources/skills/verify-before-complete/SKILL.md +97 -0
- package/dist/resources/skills/write-docs/SKILL.md +81 -0
- package/dist/resources/skills/write-milestone-brief/SKILL.md +135 -0
- 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 +2 -2
- 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 +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/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.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- 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 +11 -11
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- 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/{2826.02df9631042cc18e.js → 2826.e59e8578e2e28639.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-6c7cda3e318eedb6.js → webpack-5fc74f13a25fa1bb.js} +1 -1
- package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +48 -24
- package/package.json +1 -1
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +12 -10
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +8 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +2 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +306 -71
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/mcp-server.test.ts +40 -4
- package/packages/mcp-server/src/server.ts +12 -10
- package/packages/mcp-server/src/session-manager.ts +10 -3
- package/packages/mcp-server/src/workflow-tools.test.ts +346 -1
- package/packages/mcp-server/src/workflow-tools.ts +359 -75
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +12 -0
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +30 -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/package.json +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +14 -0
- package/packages/pi-agent-core/src/types.ts +34 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +1 -0
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -7
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +13 -0
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +19 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +25 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +23 -2
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/api-family.d.ts +27 -0
- package/packages/pi-ai/dist/providers/api-family.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.js +47 -0
- package/packages/pi-ai/dist/providers/api-family.js.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/api-family.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.test.js +101 -0
- package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +12 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +164 -14
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +15 -3
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +67 -0
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +16 -3
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +67 -0
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +289 -0
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +12 -0
- package/packages/pi-ai/src/index.ts +1 -0
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +1 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -8
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -0
- package/packages/pi-ai/src/providers/anthropic-shared.ts +30 -1
- package/packages/pi-ai/src/providers/anthropic.ts +25 -2
- package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
- package/packages/pi-ai/src/providers/api-family.ts +57 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +200 -23
- package/packages/pi-ai/src/utils/oauth/github-copilot.ts +12 -2
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +84 -0
- package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +15 -5
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +84 -0
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +16 -5
- package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +363 -0
- package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/cli/args.d.ts +6 -0
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js +14 -4
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/cli/args.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/cli/args.test.js +38 -0
- package/packages/pi-coding-agent/dist/cli/args.test.js.map +1 -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 +25 -2
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +7 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +25 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +38 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +4 -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 +34 -2
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +233 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +200 -3
- 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.d.ts +53 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.js +337 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +234 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js +40 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +4 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +33 -5
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +55 -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.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +3 -0
- package/packages/pi-coding-agent/dist/main.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 +17 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
- 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 +83 -33
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +1 -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 +1 -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.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 +13 -9
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
- package/packages/pi-coding-agent/src/cli/args.ts +21 -6
- package/packages/pi-coding-agent/src/core/agent-session.ts +27 -2
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +42 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +25 -0
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
- package/packages/pi-coding-agent/src/core/extensions/index.ts +16 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +353 -1
- package/packages/pi-coding-agent/src/core/extensions/types.ts +253 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +269 -0
- package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
- package/packages/pi-coding-agent/src/core/index.ts +10 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
- package/packages/pi-coding-agent/src/core/retry-handler.ts +4 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +48 -5
- package/packages/pi-coding-agent/src/core/settings-manager.ts +57 -0
- package/packages/pi-coding-agent/src/index.ts +16 -0
- package/packages/pi-coding-agent/src/main.ts +4 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +13 -9
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +1 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.js +1 -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.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +13 -9
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +7 -4
- package/src/resources/extensions/claude-code-cli/readiness.ts +36 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +59 -1
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +66 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -10
- package/src/resources/extensions/gsd/auto/phases.ts +52 -6
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +46 -5
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +96 -4
- package/src/resources/extensions/gsd/auto-model-selection.ts +37 -6
- package/src/resources/extensions/gsd/auto-post-unit.ts +7 -5
- package/src/resources/extensions/gsd/auto-prompts.ts +225 -45
- package/src/resources/extensions/gsd/auto-recovery.ts +47 -0
- package/src/resources/extensions/gsd/auto-start.ts +8 -6
- package/src/resources/extensions/gsd/auto-verification.ts +33 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +81 -1
- package/src/resources/extensions/gsd/auto.ts +27 -2
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +163 -0
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +89 -10
- package/src/resources/extensions/gsd/commands/catalog.ts +15 -7
- package/src/resources/extensions/gsd/commands/handlers/core.ts +63 -27
- package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
- package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
- package/src/resources/extensions/gsd/commands-config.ts +10 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +262 -78
- package/src/resources/extensions/gsd/commands-memory.ts +551 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +48 -11
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
- package/src/resources/extensions/gsd/db-writer.ts +91 -17
- package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
- package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +51 -30
- package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +59 -6
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -1
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +2 -0
- package/src/resources/extensions/gsd/error-classifier.ts +5 -2
- package/src/resources/extensions/gsd/escalation.ts +367 -0
- package/src/resources/extensions/gsd/graph.ts +33 -0
- package/src/resources/extensions/gsd/gsd-db.ts +617 -32
- package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
- package/src/resources/extensions/gsd/health-widget.ts +7 -3
- package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
- package/src/resources/extensions/gsd/init-wizard.ts +87 -54
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
- package/src/resources/extensions/gsd/memory-backfill.ts +140 -0
- package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
- package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
- package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
- package/src/resources/extensions/gsd/memory-relations.ts +240 -0
- package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
- package/src/resources/extensions/gsd/memory-store.ts +377 -7
- package/src/resources/extensions/gsd/metrics.ts +1 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +21 -5
- package/src/resources/extensions/gsd/native-git-bridge.ts +118 -6
- package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
- package/src/resources/extensions/gsd/notification-widget.ts +25 -43
- package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
- package/src/resources/extensions/gsd/pre-execution-checks.ts +100 -12
- package/src/resources/extensions/gsd/preferences-models.ts +1 -0
- package/src/resources/extensions/gsd/preferences-types.ts +9 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
- package/src/resources/extensions/gsd/prompts/add-tests.md +1 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +16 -3
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -0
- package/src/resources/extensions/gsd/python-resolver.ts +76 -0
- package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
- package/src/resources/extensions/gsd/state.ts +95 -6
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -1
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +95 -1
- package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +335 -21
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -3
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +306 -1
- package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +145 -8
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +72 -5
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
- package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +317 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +159 -8
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -3
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- package/src/resources/extensions/gsd/tools/memory-tools.ts +410 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
- package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +14 -0
- package/src/resources/extensions/gsd/types.ts +62 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
- package/src/resources/extensions/gsd/uok/flags.ts +1 -1
- package/src/resources/extensions/gsd/verification-gate.ts +2 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +4 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +1 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
- package/src/resources/extensions/gsd/workflow-templates/spike.md +6 -0
- package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
- package/src/resources/extensions/remote-questions/manager.ts +13 -1
- package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
- package/src/resources/extensions/search-the-web/command-search-provider.ts +4 -1
- package/src/resources/extensions/search-the-web/native-search.ts +13 -3
- package/src/resources/skills/api-design/SKILL.md +190 -0
- package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
- package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
- package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
- package/src/resources/skills/design-an-interface/SKILL.md +102 -0
- package/src/resources/skills/forensics/SKILL.md +153 -0
- package/src/resources/skills/grill-me/SKILL.md +93 -0
- package/src/resources/skills/handoff/SKILL.md +121 -0
- package/src/resources/skills/observability/SKILL.md +174 -0
- package/src/resources/skills/security-review/SKILL.md +181 -0
- package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
- package/src/resources/skills/tdd/SKILL.md +112 -0
- package/src/resources/skills/verify-before-complete/SKILL.md +97 -0
- package/src/resources/skills/write-docs/SKILL.md +81 -0
- package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
- package/dist/web/standalone/.next/static/css/3e9cdadb4d23b8a4.css +0 -1
- /package/dist/web/standalone/.next/static/{JncJywFxCugMuXGs56m-b → pBwmOoye64ZrRp-_rf0v1}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{JncJywFxCugMuXGs56m-b → pBwmOoye64ZrRp-_rf0v1}/_ssgManifest.js +0 -0
|
@@ -23,7 +23,7 @@ import type { GSDPreferences } from "./preferences.js";
|
|
|
23
23
|
import { getLoadedSkills, type Skill } from "@gsd/pi-coding-agent";
|
|
24
24
|
import { join, basename } from "node:path";
|
|
25
25
|
import { existsSync } from "node:fs";
|
|
26
|
-
import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary } from "./context-budget.js";
|
|
26
|
+
import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary, type MinimalModelRegistry } from "./context-budget.js";
|
|
27
27
|
import { getPendingGates, getPendingGatesForTurn } from "./gsd-db.js";
|
|
28
28
|
import {
|
|
29
29
|
GATE_REGISTRY,
|
|
@@ -35,14 +35,56 @@ import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-
|
|
|
35
35
|
import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
|
|
36
36
|
import { logWarning } from "./workflow-logger.js";
|
|
37
37
|
import { inlineGraphSubgraph } from "./graph-context.js";
|
|
38
|
+
import { buildExtractionStepsBlock } from "./commands-extract-learnings.js";
|
|
38
39
|
|
|
39
40
|
// ─── Preamble Cap ─────────────────────────────────────────────────────────────
|
|
40
41
|
|
|
42
|
+
/**
|
|
43
|
+
* Historical static ceiling for the preamble cap. Kept as an upper bound even
|
|
44
|
+
* after context-window-aware sizing so large-window users don't suddenly see
|
|
45
|
+
* 10× looser caps than before. Small-window users get a tighter cap derived
|
|
46
|
+
* from their configured executor window.
|
|
47
|
+
*/
|
|
41
48
|
const MAX_PREAMBLE_CHARS = 30_000;
|
|
42
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Resolve prompt budgets from the configured executor context window.
|
|
52
|
+
*
|
|
53
|
+
* The prompt builders here don't have access to the runtime model registry
|
|
54
|
+
* (they're called from many non-ctx sites), so `resolveExecutorContextWindow`
|
|
55
|
+
* is fed the user-configurable `context_window_override` preference as the
|
|
56
|
+
* `sessionContextWindow` fallback. That preference exists specifically to
|
|
57
|
+
* cover small-window local models (e.g. 32K lemonade/llama.cpp servers) whose
|
|
58
|
+
* n_ctx is not discoverable through the model registry. Issue #4435.
|
|
59
|
+
*/
|
|
60
|
+
function resolvePromptBudgets(): ReturnType<typeof computeBudgets> {
|
|
61
|
+
try {
|
|
62
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
63
|
+
const sessionWindow = prefs?.preferences.context_window_override;
|
|
64
|
+
const windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences, sessionWindow);
|
|
65
|
+
return computeBudgets(windowTokens);
|
|
66
|
+
} catch (e) {
|
|
67
|
+
logWarning("prompt", `resolvePromptBudgets failed: ${(e as Error).message}`);
|
|
68
|
+
return computeBudgets(200_000);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Character budget for dependency/prior slice summaries injected into dispatch
|
|
74
|
+
* prompts. Scales with the executor's configured context window (issue #4435).
|
|
75
|
+
*/
|
|
76
|
+
function resolveSummaryBudgetChars(): number {
|
|
77
|
+
return resolvePromptBudgets().summaryBudgetChars;
|
|
78
|
+
}
|
|
79
|
+
|
|
43
80
|
function capPreamble(preamble: string): string {
|
|
44
|
-
|
|
45
|
-
|
|
81
|
+
// Cap inlined context at min(historical 30K ceiling, scaled inline budget).
|
|
82
|
+
// The ceiling preserves pre-fix behavior for large-window users; the scaled
|
|
83
|
+
// budget tightens the cap for small-window users whose true safe limit is
|
|
84
|
+
// below 30K. `computeBudgets` allocates 40% of total chars to inline context.
|
|
85
|
+
const budget = Math.min(MAX_PREAMBLE_CHARS, resolvePromptBudgets().inlineContextBudgetChars);
|
|
86
|
+
if (preamble.length <= budget) return preamble;
|
|
87
|
+
return truncateAtSectionBoundary(preamble, budget).content;
|
|
46
88
|
}
|
|
47
89
|
|
|
48
90
|
// ─── Executor Constraints ─────────────────────────────────────────────────────
|
|
@@ -52,14 +94,19 @@ function capPreamble(preamble: string): string {
|
|
|
52
94
|
* Uses the budget engine to compute task count ranges and inline context budgets
|
|
53
95
|
* based on the configured executor model's context window.
|
|
54
96
|
*/
|
|
55
|
-
function formatExecutorConstraints(
|
|
97
|
+
function formatExecutorConstraints(
|
|
98
|
+
sessionContextWindow?: number,
|
|
99
|
+
modelRegistry?: MinimalModelRegistry,
|
|
100
|
+
): string {
|
|
56
101
|
let windowTokens: number;
|
|
57
102
|
try {
|
|
58
103
|
const prefs = loadEffectiveGSDPreferences();
|
|
59
|
-
windowTokens = resolveExecutorContextWindow(
|
|
104
|
+
windowTokens = resolveExecutorContextWindow(modelRegistry, prefs?.preferences, sessionContextWindow);
|
|
60
105
|
} catch (e) {
|
|
61
106
|
logWarning("prompt", `resolveExecutorContextWindow failed: ${(e as Error).message}`);
|
|
62
|
-
|
|
107
|
+
// Delegate to the budget engine without prefs (the path that just threw)
|
|
108
|
+
// so DEFAULT_CONTEXT_WINDOW stays the single source of truth.
|
|
109
|
+
windowTokens = resolveExecutorContextWindow(undefined, undefined, sessionContextWindow);
|
|
63
110
|
}
|
|
64
111
|
const budgets = computeBudgets(windowTokens);
|
|
65
112
|
const { min, max } = budgets.taskCountRange;
|
|
@@ -75,7 +122,18 @@ function formatExecutorConstraints(): string {
|
|
|
75
122
|
].join("\n");
|
|
76
123
|
}
|
|
77
124
|
|
|
78
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Returns a markdown bullet list of known context file paths for the given
|
|
127
|
+
* milestone (and optionally slice). Falls back to a generic tool-agnostic
|
|
128
|
+
* instruction when no GSD artifacts are found.
|
|
129
|
+
*
|
|
130
|
+
* @param base - Absolute path to the project root.
|
|
131
|
+
* @param mid - Milestone ID (e.g. `"M001"`).
|
|
132
|
+
* @param sid - Optional slice ID (e.g. `"S01"`). When provided, the slice
|
|
133
|
+
* RESEARCH file is preferred over the milestone-level one.
|
|
134
|
+
* @returns Markdown string of file path bullets, or a fallback instruction.
|
|
135
|
+
*/
|
|
136
|
+
export function buildSourceFilePaths(
|
|
79
137
|
base: string,
|
|
80
138
|
mid: string,
|
|
81
139
|
sid?: string,
|
|
@@ -126,7 +184,7 @@ function buildSourceFilePaths(
|
|
|
126
184
|
|
|
127
185
|
return paths.length > 0
|
|
128
186
|
? paths.join("\n")
|
|
129
|
-
: "- Use
|
|
187
|
+
: "- Use the Grep/Glob/Read tools to identify the relevant source files before planning.";
|
|
130
188
|
}
|
|
131
189
|
|
|
132
190
|
// ─── Inline Helpers ───────────────────────────────────────────────────────
|
|
@@ -1187,7 +1245,7 @@ export async function buildResearchSlicePrompt(
|
|
|
1187
1245
|
|
|
1188
1246
|
inlined.push(inlineTemplate("research", "Research"));
|
|
1189
1247
|
|
|
1190
|
-
const depContent = await inlineDependencySummaries(mid, sid, base);
|
|
1248
|
+
const depContent = await inlineDependencySummaries(mid, sid, base, resolveSummaryBudgetChars());
|
|
1191
1249
|
const activeOverrides = await loadActiveOverrides(base);
|
|
1192
1250
|
const overridesInline = formatOverridesSection(activeOverrides);
|
|
1193
1251
|
if (overridesInline) inlined.unshift(overridesInline);
|
|
@@ -1216,10 +1274,33 @@ export async function buildResearchSlicePrompt(
|
|
|
1216
1274
|
});
|
|
1217
1275
|
}
|
|
1218
1276
|
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1277
|
+
/**
|
|
1278
|
+
* Shared assembly for plan-slice and refine-slice prompts. Both builders need
|
|
1279
|
+
* the same inlined context (roadmap excerpt, slice context, research, decisions,
|
|
1280
|
+
* requirements, knowledge, graph subgraph, templates, dependency summaries,
|
|
1281
|
+
* overrides). Extracted to prevent drift between the two sites.
|
|
1282
|
+
*
|
|
1283
|
+
* `prependBlocks` are pushed onto the start of the inlined array BEFORE any
|
|
1284
|
+
* shared content, so callers can add unit-specific headers (e.g., the refine
|
|
1285
|
+
* sketch-scope constraint).
|
|
1286
|
+
*/
|
|
1287
|
+
async function renderSlicePrompt(options: {
|
|
1288
|
+
mid: string;
|
|
1289
|
+
sid: string;
|
|
1290
|
+
sTitle: string;
|
|
1291
|
+
base: string;
|
|
1292
|
+
level: InlineLevel;
|
|
1293
|
+
promptTemplate: "plan-slice" | "refine-slice";
|
|
1294
|
+
prependBlocks?: string[];
|
|
1295
|
+
extraVars?: Record<string, string>;
|
|
1296
|
+
sessionContextWindow?: number;
|
|
1297
|
+
modelRegistry?: MinimalModelRegistry;
|
|
1298
|
+
}): Promise<string> {
|
|
1299
|
+
const {
|
|
1300
|
+
mid, sid, sTitle, base, level, promptTemplate, prependBlocks = [], extraVars = {},
|
|
1301
|
+
sessionContextWindow, modelRegistry,
|
|
1302
|
+
} = options;
|
|
1303
|
+
|
|
1223
1304
|
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
1224
1305
|
const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
|
|
1225
1306
|
const researchPath = resolveSliceFile(base, mid, sid, "RESEARCH");
|
|
@@ -1227,18 +1308,17 @@ export async function buildPlanSlicePrompt(
|
|
|
1227
1308
|
const sliceContextPath = resolveSliceFile(base, mid, sid, "CONTEXT");
|
|
1228
1309
|
const sliceContextRel = relSliceFile(base, mid, sid, "CONTEXT");
|
|
1229
1310
|
|
|
1230
|
-
const inlined: string[] = [];
|
|
1311
|
+
const inlined: string[] = [...prependBlocks];
|
|
1231
1312
|
|
|
1232
|
-
//
|
|
1313
|
+
// Phase handoff anchor from research phase (if available)
|
|
1233
1314
|
const researchSliceAnchor = readPhaseAnchor(base, mid, "research-slice");
|
|
1234
1315
|
if (researchSliceAnchor) inlined.push(formatAnchorForPrompt(researchSliceAnchor));
|
|
1235
1316
|
|
|
1236
|
-
//
|
|
1237
|
-
const
|
|
1238
|
-
if (
|
|
1239
|
-
inlined.push(
|
|
1317
|
+
// Roadmap excerpt with full-roadmap fallback
|
|
1318
|
+
const roadmapExcerpt = await inlineRoadmapExcerpt(base, mid, sid);
|
|
1319
|
+
if (roadmapExcerpt) {
|
|
1320
|
+
inlined.push(roadmapExcerpt);
|
|
1240
1321
|
} else {
|
|
1241
|
-
// Fall back to full roadmap if excerpt fails
|
|
1242
1322
|
inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
|
|
1243
1323
|
}
|
|
1244
1324
|
|
|
@@ -1246,42 +1326,36 @@ export async function buildPlanSlicePrompt(
|
|
|
1246
1326
|
if (sliceCtxInline) inlined.push(sliceCtxInline);
|
|
1247
1327
|
const researchInline = await inlineFileOptional(researchPath, researchRel, "Slice Research");
|
|
1248
1328
|
if (researchInline) inlined.push(researchInline);
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
const
|
|
1252
|
-
const decisionsInline = await inlineDecisionsFromDb(base, mid,
|
|
1329
|
+
|
|
1330
|
+
if (level !== "minimal") {
|
|
1331
|
+
const derivedScope = deriveSliceScope(sTitle);
|
|
1332
|
+
const decisionsInline = await inlineDecisionsFromDb(base, mid, derivedScope, level);
|
|
1253
1333
|
if (decisionsInline) inlined.push(decisionsInline);
|
|
1254
|
-
const requirementsInline = await inlineRequirementsFromDb(base, mid, sid,
|
|
1334
|
+
const requirementsInline = await inlineRequirementsFromDb(base, mid, sid, level);
|
|
1255
1335
|
if (requirementsInline) inlined.push(requirementsInline);
|
|
1256
1336
|
}
|
|
1257
1337
|
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
const knowledgeInlinePS = await inlineKnowledgeScoped(base, keywordsPS);
|
|
1261
|
-
if (knowledgeInlinePS) inlined.push(knowledgeInlinePS);
|
|
1338
|
+
const knowledgeInline = await inlineKnowledgeScoped(base, extractKeywords(sTitle));
|
|
1339
|
+
if (knowledgeInline) inlined.push(knowledgeInline);
|
|
1262
1340
|
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
if (graphBlockPS) inlined.push(graphBlockPS);
|
|
1341
|
+
const graphBlock = await inlineGraphSubgraph(base, `${sid} ${sTitle}`, { budget: 3000 });
|
|
1342
|
+
if (graphBlock) inlined.push(graphBlock);
|
|
1266
1343
|
|
|
1267
1344
|
inlined.push(inlineTemplate("plan", "Slice Plan"));
|
|
1268
|
-
if (
|
|
1345
|
+
if (level === "full") {
|
|
1269
1346
|
inlined.push(inlineTemplate("task-plan", "Task Plan"));
|
|
1270
1347
|
}
|
|
1271
1348
|
|
|
1272
|
-
const depContent = await inlineDependencySummaries(mid, sid, base);
|
|
1273
|
-
const
|
|
1274
|
-
|
|
1275
|
-
if (planOverridesInline) inlined.unshift(planOverridesInline);
|
|
1349
|
+
const depContent = await inlineDependencySummaries(mid, sid, base, resolveSummaryBudgetChars());
|
|
1350
|
+
const overridesInline = formatOverridesSection(await loadActiveOverrides(base));
|
|
1351
|
+
if (overridesInline) inlined.unshift(overridesInline);
|
|
1276
1352
|
|
|
1277
1353
|
const inlinedContext = capPreamble(`## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`);
|
|
1278
|
-
|
|
1279
|
-
// Build executor context constraints from the budget engine
|
|
1280
|
-
const executorContextConstraints = formatExecutorConstraints();
|
|
1281
|
-
|
|
1354
|
+
const executorContextConstraints = formatExecutorConstraints(sessionContextWindow, modelRegistry);
|
|
1282
1355
|
const outputRelPath = relSliceFile(base, mid, sid, "PLAN");
|
|
1283
1356
|
const commitInstruction = "Do not commit — .gsd/ planning docs are managed externally and not tracked in git.";
|
|
1284
|
-
|
|
1357
|
+
|
|
1358
|
+
return loadPrompt(promptTemplate, {
|
|
1285
1359
|
workingDirectory: base,
|
|
1286
1360
|
milestoneId: mid, sliceId: sid, sliceTitle: sTitle,
|
|
1287
1361
|
slicePath: relSlicePath(base, mid, sid),
|
|
@@ -1300,6 +1374,73 @@ export async function buildPlanSlicePrompt(
|
|
|
1300
1374
|
sliceTitle: sTitle,
|
|
1301
1375
|
extraContext: [inlinedContext, depContent],
|
|
1302
1376
|
}),
|
|
1377
|
+
...extraVars,
|
|
1378
|
+
});
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
export async function buildPlanSlicePrompt(
|
|
1382
|
+
mid: string, _midTitle: string, sid: string, sTitle: string, base: string, level?: InlineLevel,
|
|
1383
|
+
options?: { softScopeHint?: string; sessionContextWindow?: number; modelRegistry?: MinimalModelRegistry },
|
|
1384
|
+
): Promise<string> {
|
|
1385
|
+
const prependBlocks: string[] = [];
|
|
1386
|
+
// ADR-011: when the refining-phase dispatch rule gracefully downgrades to
|
|
1387
|
+
// plan-slice (progressive_planning was toggled off mid-milestone), it
|
|
1388
|
+
// forwards the stored sketch_scope as a SOFT hint — context, not a hard
|
|
1389
|
+
// constraint. The planner is free to expand beyond it.
|
|
1390
|
+
if (options?.softScopeHint && options.softScopeHint.trim().length > 0) {
|
|
1391
|
+
prependBlocks.push(
|
|
1392
|
+
`## Prior Sketch Scope (soft hint — non-binding)\n\n${options.softScopeHint.trim()}\n\n` +
|
|
1393
|
+
`This scope was captured during an earlier progressive-planning pass that was later disabled. Treat it as context only — you may plan beyond it if the work genuinely requires more scope. Do NOT treat this as a hard boundary.`,
|
|
1394
|
+
);
|
|
1395
|
+
}
|
|
1396
|
+
return renderSlicePrompt({
|
|
1397
|
+
mid, sid, sTitle, base,
|
|
1398
|
+
level: level ?? resolveInlineLevel(),
|
|
1399
|
+
promptTemplate: "plan-slice",
|
|
1400
|
+
prependBlocks,
|
|
1401
|
+
sessionContextWindow: options?.sessionContextWindow,
|
|
1402
|
+
modelRegistry: options?.modelRegistry,
|
|
1403
|
+
});
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
/**
|
|
1407
|
+
* ADR-011 refine-slice: expand a sketch into a full plan using the current
|
|
1408
|
+
* codebase state and prior slice summary. Mechanically similar to plan-slice
|
|
1409
|
+
* but framed as a *transformation* (sketch → full plan) rather than a
|
|
1410
|
+
* blank-sheet planning pass. Reuses inlineDependencySummaries for prior
|
|
1411
|
+
* slice SUMMARY and inlines the stored sketch_scope as a hard constraint.
|
|
1412
|
+
*/
|
|
1413
|
+
export async function buildRefineSlicePrompt(
|
|
1414
|
+
mid: string, _midTitle: string, sid: string, sTitle: string, base: string, level?: InlineLevel,
|
|
1415
|
+
options?: { sessionContextWindow?: number; modelRegistry?: MinimalModelRegistry },
|
|
1416
|
+
): Promise<string> {
|
|
1417
|
+
// Pull the stored sketch scope from the DB — the hard constraint we plan within.
|
|
1418
|
+
let sketchScope = "";
|
|
1419
|
+
try {
|
|
1420
|
+
const { isDbAvailable, getSlice } = await import("./gsd-db.js");
|
|
1421
|
+
if (isDbAvailable()) {
|
|
1422
|
+
sketchScope = getSlice(mid, sid)?.sketch_scope ?? "";
|
|
1423
|
+
}
|
|
1424
|
+
} catch {
|
|
1425
|
+
sketchScope = "";
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
const prependBlocks: string[] = [];
|
|
1429
|
+
if (sketchScope.trim().length > 0) {
|
|
1430
|
+
prependBlocks.push(
|
|
1431
|
+
`## Sketch Scope (hard constraint)\n\n${sketchScope.trim()}\n\n` +
|
|
1432
|
+
`Treat this as the authoritative boundary for the slice. Do not plan work outside this scope; if the scope is too narrow, surface it as a deviation rather than expanding silently.`,
|
|
1433
|
+
);
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
return renderSlicePrompt({
|
|
1437
|
+
mid, sid, sTitle, base,
|
|
1438
|
+
level: level ?? resolveInlineLevel(),
|
|
1439
|
+
promptTemplate: "refine-slice",
|
|
1440
|
+
prependBlocks,
|
|
1441
|
+
extraVars: { sketchScope },
|
|
1442
|
+
sessionContextWindow: options?.sessionContextWindow,
|
|
1443
|
+
modelRegistry: options?.modelRegistry,
|
|
1303
1444
|
});
|
|
1304
1445
|
}
|
|
1305
1446
|
|
|
@@ -1308,6 +1449,10 @@ export interface ExecuteTaskPromptOptions {
|
|
|
1308
1449
|
level?: InlineLevel;
|
|
1309
1450
|
/** Override carry-forward paths (dependency-based instead of order-based). */
|
|
1310
1451
|
carryForwardPaths?: string[];
|
|
1452
|
+
/** Session model context window in tokens, forwarded to the budget engine. */
|
|
1453
|
+
sessionContextWindow?: number;
|
|
1454
|
+
/** Model registry forwarded to the budget engine for executor-model lookup. */
|
|
1455
|
+
modelRegistry?: MinimalModelRegistry;
|
|
1311
1456
|
}
|
|
1312
1457
|
|
|
1313
1458
|
export async function buildExecuteTaskPrompt(
|
|
@@ -1399,7 +1544,7 @@ export async function buildExecuteTaskPrompt(
|
|
|
1399
1544
|
|
|
1400
1545
|
// Compute verification budget for the executor's context window (issue #707)
|
|
1401
1546
|
const prefs = loadEffectiveGSDPreferences();
|
|
1402
|
-
const contextWindow = resolveExecutorContextWindow(
|
|
1547
|
+
const contextWindow = resolveExecutorContextWindow(opts.modelRegistry, prefs?.preferences, opts.sessionContextWindow);
|
|
1403
1548
|
const budgets = computeBudgets(contextWindow);
|
|
1404
1549
|
const verificationBudget = `~${Math.round(budgets.verificationBudgetChars / 1000)}K chars`;
|
|
1405
1550
|
|
|
@@ -1417,7 +1562,28 @@ export async function buildExecuteTaskPrompt(
|
|
|
1417
1562
|
? `### Runtime Context\nSource: \`.gsd/RUNTIME.md\`\n\n${runtimeContent.trim()}`
|
|
1418
1563
|
: "";
|
|
1419
1564
|
|
|
1420
|
-
|
|
1565
|
+
let phaseAnchorSection = planAnchor ? formatAnchorForPrompt(planAnchor) : "";
|
|
1566
|
+
|
|
1567
|
+
// ADR-011 Phase 2: inject any resolved-but-unapplied escalation override
|
|
1568
|
+
// into this task's prompt. Claim is atomic via DB UPDATE WHERE IS NULL, so
|
|
1569
|
+
// if a parallel build already injected it, we skip. Feature-gated by
|
|
1570
|
+
// phases.mid_execution_escalation. Prepended to phaseAnchorSection so it
|
|
1571
|
+
// appears near the top of the prompt above planning anchors.
|
|
1572
|
+
if (prefs?.preferences?.phases?.mid_execution_escalation === true) {
|
|
1573
|
+
try {
|
|
1574
|
+
const { claimOverrideForInjection } = await import("./escalation.js");
|
|
1575
|
+
const claimed = claimOverrideForInjection(base, mid, sid);
|
|
1576
|
+
if (claimed) {
|
|
1577
|
+
const block = claimed.injectionBlock + "\n\n---\n\n";
|
|
1578
|
+
phaseAnchorSection = phaseAnchorSection
|
|
1579
|
+
? `${block}${phaseAnchorSection}`
|
|
1580
|
+
: block;
|
|
1581
|
+
}
|
|
1582
|
+
} catch (escalationErr) {
|
|
1583
|
+
// Escalation module unavailable or threw — log and proceed.
|
|
1584
|
+
logWarning("prompt", `escalation override injection failed: ${(escalationErr as Error).message}`);
|
|
1585
|
+
}
|
|
1586
|
+
}
|
|
1421
1587
|
|
|
1422
1588
|
// Task-scoped gates owned by execute-task (Q5/Q6/Q7). Pull only the
|
|
1423
1589
|
// gates that plan-slice actually seeded for this task — tasks with no
|
|
@@ -1598,6 +1764,14 @@ export async function buildCompleteMilestonePrompt(
|
|
|
1598
1764
|
|
|
1599
1765
|
const milestoneSummaryPath = join(base, `${relMilestonePath(base, mid)}/${mid}-SUMMARY.md`);
|
|
1600
1766
|
|
|
1767
|
+
const learningsRelPath = join(relMilestonePath(base, mid), `${mid}-LEARNINGS.md`);
|
|
1768
|
+
const learningsAbsPath = join(base, learningsRelPath);
|
|
1769
|
+
const extractLearningsSteps = buildExtractionStepsBlock({
|
|
1770
|
+
milestoneId: mid,
|
|
1771
|
+
outputPath: learningsAbsPath,
|
|
1772
|
+
relativeOutputPath: learningsRelPath,
|
|
1773
|
+
});
|
|
1774
|
+
|
|
1601
1775
|
return loadPrompt("complete-milestone", {
|
|
1602
1776
|
workingDirectory: base,
|
|
1603
1777
|
milestoneId: mid,
|
|
@@ -1605,6 +1779,7 @@ export async function buildCompleteMilestonePrompt(
|
|
|
1605
1779
|
roadmapPath: roadmapRel,
|
|
1606
1780
|
inlinedContext,
|
|
1607
1781
|
milestoneSummaryPath,
|
|
1782
|
+
extractLearningsSteps,
|
|
1608
1783
|
skillActivation: buildSkillActivationBlock({
|
|
1609
1784
|
base,
|
|
1610
1785
|
milestoneId: mid,
|
|
@@ -1945,6 +2120,7 @@ export async function buildReactiveExecutePrompt(
|
|
|
1945
2120
|
mid: string, midTitle: string, sid: string, sTitle: string,
|
|
1946
2121
|
readyTaskIds: string[], base: string,
|
|
1947
2122
|
subagentModel?: string,
|
|
2123
|
+
opts?: { sessionContextWindow?: number; modelRegistry?: MinimalModelRegistry },
|
|
1948
2124
|
): Promise<string> {
|
|
1949
2125
|
const { loadSliceTaskIO, deriveTaskGraph, graphMetrics } = await import("./reactive-graph.js");
|
|
1950
2126
|
|
|
@@ -1986,7 +2162,11 @@ export async function buildReactiveExecutePrompt(
|
|
|
1986
2162
|
// Build a full execute-task prompt with dependency-based carry-forward
|
|
1987
2163
|
const taskPrompt = await buildExecuteTaskPrompt(
|
|
1988
2164
|
mid, sid, sTitle, tid, tTitle, base,
|
|
1989
|
-
{
|
|
2165
|
+
{
|
|
2166
|
+
carryForwardPaths: depPaths,
|
|
2167
|
+
sessionContextWindow: opts?.sessionContextWindow,
|
|
2168
|
+
modelRegistry: opts?.modelRegistry,
|
|
2169
|
+
},
|
|
1990
2170
|
);
|
|
1991
2171
|
|
|
1992
2172
|
const modelSuffix = subagentModel ? ` with model: "${subagentModel}"` : "";
|
|
@@ -261,6 +261,45 @@ export function verifyExpectedArtifact(
|
|
|
261
261
|
return true;
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
+
// #4414: research-slice parallel-research sentinel. The unitId
|
|
265
|
+
// `{mid}/parallel-research` is not a real slice — it triggers a single agent
|
|
266
|
+
// that fans out research across multiple slices. Verify success by checking
|
|
267
|
+
// that every slice which was "research-ready" in the roadmap now has a
|
|
268
|
+
// RESEARCH file. Without this, resolveExpectedArtifactPath returns null and
|
|
269
|
+
// the retry/escalation machinery silently re-dispatches forever.
|
|
270
|
+
//
|
|
271
|
+
// NOTE: this predicate mirrors the dispatch rule at
|
|
272
|
+
// auto-dispatch.ts parallel-research-slices — keep the two in sync.
|
|
273
|
+
if (unitType === "research-slice" && unitId.endsWith("/parallel-research")) {
|
|
274
|
+
const { milestone: mid } = parseUnitId(unitId);
|
|
275
|
+
if (!mid) return false;
|
|
276
|
+
const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
277
|
+
if (!roadmapFile || !existsSync(roadmapFile)) {
|
|
278
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap missing`);
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
try {
|
|
282
|
+
const roadmap = parseLegacyRoadmap(readFileSync(roadmapFile, "utf-8"));
|
|
283
|
+
const milestoneResearchFile = resolveMilestoneFile(base, mid, "RESEARCH");
|
|
284
|
+
for (const slice of roadmap.slices) {
|
|
285
|
+
if (slice.done) continue;
|
|
286
|
+
if (milestoneResearchFile && slice.id === "S01") continue;
|
|
287
|
+
const depsComplete = (slice.depends ?? []).every((depId) =>
|
|
288
|
+
!!resolveSliceFile(base, mid, depId, "SUMMARY"),
|
|
289
|
+
);
|
|
290
|
+
if (!depsComplete) continue;
|
|
291
|
+
if (!resolveSliceFile(base, mid, slice.id, "RESEARCH")) {
|
|
292
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: slice ${slice.id} missing RESEARCH`);
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return true;
|
|
297
|
+
} catch (err) {
|
|
298
|
+
logWarning("recovery", `parallel-research verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
264
303
|
const absPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
265
304
|
// For unit types with no verifiable artifact (null path), the parent directory
|
|
266
305
|
// is missing on disk — treat as stale completion state so the key gets evicted (#313).
|
|
@@ -455,6 +494,14 @@ export function writeBlockerPlaceholder(
|
|
|
455
494
|
].join("\n");
|
|
456
495
|
writeFileSync(absPath, content, "utf-8");
|
|
457
496
|
|
|
497
|
+
// #4414: Clear caches so subsequent dispatch guards (e.g.
|
|
498
|
+
// resolveMilestoneFile) see the placeholder file. Without this, the
|
|
499
|
+
// cached directory listing is stale and the dispatch rule re-fires,
|
|
500
|
+
// producing an infinite loop despite the placeholder being on disk.
|
|
501
|
+
// Matches the pattern used in verifyExpectedArtifact above.
|
|
502
|
+
clearPathCache();
|
|
503
|
+
clearParseCache();
|
|
504
|
+
|
|
458
505
|
// Mark the task/slice as complete in the DB so verifyExpectedArtifact passes.
|
|
459
506
|
// Without this, the DB status stays "pending" and the dispatch loop
|
|
460
507
|
// re-derives the same unit indefinitely (#2531, #2653).
|
|
@@ -464,11 +464,12 @@ export async function bootstrapAutoSession(
|
|
|
464
464
|
// Detect survivor milestone branches in both pre-planning and complete phases.
|
|
465
465
|
// In phase=complete, the milestone artifacts exist but finalization (merge,
|
|
466
466
|
// worktree cleanup) was never run — the survivor branch must be merged.
|
|
467
|
+
// Applies to both worktree and branch isolation modes.
|
|
467
468
|
let hasSurvivorBranch = false;
|
|
468
469
|
if (
|
|
469
470
|
state.activeMilestone &&
|
|
470
471
|
(state.phase === "pre-planning" || state.phase === "complete") &&
|
|
471
|
-
|
|
472
|
+
getIsolationMode() !== "none" &&
|
|
472
473
|
!detectWorktreeName(base) &&
|
|
473
474
|
!base.includes(`${pathSep}.gsd${pathSep}worktrees${pathSep}`)
|
|
474
475
|
) {
|
|
@@ -711,7 +712,7 @@ export async function bootstrapAutoSession(
|
|
|
711
712
|
|
|
712
713
|
if (
|
|
713
714
|
s.currentMilestoneId &&
|
|
714
|
-
|
|
715
|
+
getIsolationMode() !== "none" &&
|
|
715
716
|
!detectWorktreeName(base) &&
|
|
716
717
|
!isUnderGsdWorktrees(base)
|
|
717
718
|
) {
|
|
@@ -837,10 +838,11 @@ export async function bootstrapAutoSession(
|
|
|
837
838
|
const bannerPrefs = loadEffectiveGSDPreferences()?.preferences;
|
|
838
839
|
const effectiveProvider = s.autoModeStartModel?.provider ?? ctx.model?.provider;
|
|
839
840
|
const effectivelyEnabled = routingConfig.enabled
|
|
840
|
-
&&
|
|
841
|
-
effectiveProvider
|
|
842
|
-
|
|
843
|
-
|
|
841
|
+
&& (routingConfig.allow_flat_rate_providers
|
|
842
|
+
|| !(effectiveProvider && isFlatRateProvider(
|
|
843
|
+
effectiveProvider,
|
|
844
|
+
buildFlatRateContext(effectiveProvider, ctx, bannerPrefs),
|
|
845
|
+
)));
|
|
844
846
|
|
|
845
847
|
// The actual ceiling may come from tier_models.heavy, not the start model.
|
|
846
848
|
const effectiveCeiling = (routingConfig.enabled && routingConfig.tier_models?.heavy)
|
|
@@ -526,6 +526,39 @@ export async function runPostUnitVerification(
|
|
|
526
526
|
result.passed = false;
|
|
527
527
|
}
|
|
528
528
|
|
|
529
|
+
// Emit Layer 2 verify_result event with the final, post-exec verdict so hooks
|
|
530
|
+
// see the authoritative pass/fail and the complete set of failures.
|
|
531
|
+
try {
|
|
532
|
+
const { emitVerifyResult } = await import("./hook-emitter.js");
|
|
533
|
+
const checkFailures = result.checks
|
|
534
|
+
.filter((c) => c.exitCode !== 0)
|
|
535
|
+
.map((c) => ({
|
|
536
|
+
kind: "gate" as const,
|
|
537
|
+
message: `${c.command} exited ${c.exitCode}${c.stderr ? `: ${c.stderr.slice(0, 200)}` : ""}`,
|
|
538
|
+
}));
|
|
539
|
+
const runtimeFailures = (result.runtimeErrors ?? [])
|
|
540
|
+
.filter((e) => e.blocking)
|
|
541
|
+
.map((e) => ({
|
|
542
|
+
kind: "other" as const,
|
|
543
|
+
message: `[${e.source}] ${e.message.slice(0, 200)}`,
|
|
544
|
+
}));
|
|
545
|
+
const postExecFailures = (postExecChecks ?? [])
|
|
546
|
+
.filter((c) => !c.passed)
|
|
547
|
+
.map((c) => ({
|
|
548
|
+
kind: "other" as const,
|
|
549
|
+
message: `[${c.category}] ${c.target}: ${c.message}`,
|
|
550
|
+
}));
|
|
551
|
+
await emitVerifyResult({
|
|
552
|
+
passed: result.passed,
|
|
553
|
+
failures: [...checkFailures, ...runtimeFailures, ...postExecFailures],
|
|
554
|
+
unitType: s.currentUnit.type,
|
|
555
|
+
unitId: s.currentUnit.id,
|
|
556
|
+
cwd: s.basePath,
|
|
557
|
+
});
|
|
558
|
+
} catch (hookErr) {
|
|
559
|
+
logWarning("engine", `verify_result hook emission failed: ${(hookErr as Error).message}`);
|
|
560
|
+
}
|
|
561
|
+
|
|
529
562
|
// ── Auto-fix retry logic ──
|
|
530
563
|
if (result.passed) {
|
|
531
564
|
s.verificationRetryCount.delete(s.currentUnit.id);
|
|
@@ -60,6 +60,7 @@ import {
|
|
|
60
60
|
nativeAddPaths,
|
|
61
61
|
nativeRmForce,
|
|
62
62
|
nativeBranchDelete,
|
|
63
|
+
nativeBranchForceReset,
|
|
63
64
|
nativeBranchExists,
|
|
64
65
|
nativeDiffNumstat,
|
|
65
66
|
nativeUpdateRef,
|
|
@@ -237,6 +238,14 @@ function clearProjectRootStateFiles(basePath: string, milestoneId: string): void
|
|
|
237
238
|
}
|
|
238
239
|
}
|
|
239
240
|
|
|
241
|
+
function isProjectGsdSymlink(basePath: string): boolean {
|
|
242
|
+
try {
|
|
243
|
+
return lstatSyncFn(join(basePath, ".gsd")).isSymbolicLink();
|
|
244
|
+
} catch {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
240
249
|
// ─── Build Artifact Auto-Resolve ─────────────────────────────────────────────
|
|
241
250
|
|
|
242
251
|
/** Patterns for machine-generated build artifacts that can be safely
|
|
@@ -921,10 +930,74 @@ export function runWorktreePostCreateHook(
|
|
|
921
930
|
|
|
922
931
|
// ─── Auto-Worktree Branch Naming ───────────────────────────────────────────
|
|
923
932
|
|
|
933
|
+
/** Returns the git branch name for a milestone worktree (`milestone/<MID>`). */
|
|
924
934
|
export function autoWorktreeBranch(milestoneId: string): string {
|
|
925
935
|
return `milestone/${milestoneId}`;
|
|
926
936
|
}
|
|
927
937
|
|
|
938
|
+
// ─── Branch-mode Entry ─────────────────────────────────────────────────────
|
|
939
|
+
|
|
940
|
+
/**
|
|
941
|
+
* Enter branch isolation mode for a milestone.
|
|
942
|
+
*
|
|
943
|
+
* Creates `milestone/<MID>` from the integration branch (if it doesn't
|
|
944
|
+
* exist yet) and checks out to it. No worktree directory is created — the
|
|
945
|
+
* project root is the working copy; only HEAD changes.
|
|
946
|
+
*
|
|
947
|
+
* Uses the same 3-tier integration-branch fallback as createAutoWorktree:
|
|
948
|
+
* 1. META.json recorded integration branch
|
|
949
|
+
* 2. git.main_branch preference
|
|
950
|
+
* 3. nativeDetectMainBranch (origin/HEAD auto-detection)
|
|
951
|
+
*/
|
|
952
|
+
export function enterBranchModeForMilestone(
|
|
953
|
+
basePath: string,
|
|
954
|
+
milestoneId: string,
|
|
955
|
+
): void {
|
|
956
|
+
const branch = autoWorktreeBranch(milestoneId);
|
|
957
|
+
const branchExists = nativeBranchExists(basePath, branch);
|
|
958
|
+
|
|
959
|
+
if (!branchExists) {
|
|
960
|
+
// Create the milestone branch from the integration branch start-point.
|
|
961
|
+
const integrationBranch =
|
|
962
|
+
readIntegrationBranch(basePath, milestoneId) ?? undefined;
|
|
963
|
+
const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
964
|
+
// Validate main_branch preference exists in the repo before using it —
|
|
965
|
+
// a stale preference (e.g. "master" when repo uses "main") would cause
|
|
966
|
+
// nativeBranchForceReset to fail with a bad start-point reference.
|
|
967
|
+
const validatedPrefBranch =
|
|
968
|
+
gitPrefs?.main_branch &&
|
|
969
|
+
typeof gitPrefs.main_branch === "string" &&
|
|
970
|
+
gitPrefs.main_branch.length > 0 &&
|
|
971
|
+
nativeBranchExists(basePath, gitPrefs.main_branch)
|
|
972
|
+
? gitPrefs.main_branch
|
|
973
|
+
: undefined;
|
|
974
|
+
const startPoint =
|
|
975
|
+
integrationBranch ??
|
|
976
|
+
validatedPrefBranch ??
|
|
977
|
+
nativeDetectMainBranch(basePath);
|
|
978
|
+
|
|
979
|
+
// nativeBranchForceReset creates (or resets) branch at startPoint,
|
|
980
|
+
// then checkout switches HEAD to it.
|
|
981
|
+
nativeBranchForceReset(basePath, branch, startPoint);
|
|
982
|
+
debugLog("auto-worktree", {
|
|
983
|
+
action: "enterBranchMode",
|
|
984
|
+
milestoneId,
|
|
985
|
+
branch,
|
|
986
|
+
startPoint,
|
|
987
|
+
created: true,
|
|
988
|
+
});
|
|
989
|
+
} else {
|
|
990
|
+
debugLog("auto-worktree", {
|
|
991
|
+
action: "enterBranchMode",
|
|
992
|
+
milestoneId,
|
|
993
|
+
branch,
|
|
994
|
+
reused: true,
|
|
995
|
+
});
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
nativeCheckoutBranch(basePath, branch);
|
|
999
|
+
}
|
|
1000
|
+
|
|
928
1001
|
// ─── Public API ────────────────────────────────────────────────────────────
|
|
929
1002
|
|
|
930
1003
|
/**
|
|
@@ -1610,12 +1683,19 @@ export function mergeMilestoneToMain(
|
|
|
1610
1683
|
// CONTEXT files into the stash. If stash pop later fails, those files
|
|
1611
1684
|
// are permanently trapped in the stash entry and lost on the next
|
|
1612
1685
|
// stash push or drop.
|
|
1686
|
+
//
|
|
1687
|
+
// When `.gsd` itself is a symlink, Git rejects pathspecs below it
|
|
1688
|
+
// ("beyond a symbolic link"). In that layout, exclude the whole symlink
|
|
1689
|
+
// and keep stashing real project files that could block the merge.
|
|
1690
|
+
const stashPathspecs = isProjectGsdSymlink(originalBasePath_)
|
|
1691
|
+
? [".", ":(exclude).gsd"]
|
|
1692
|
+
: [":(exclude).gsd/milestones"];
|
|
1613
1693
|
execFileSync(
|
|
1614
1694
|
"git",
|
|
1615
1695
|
[
|
|
1616
1696
|
"stash", "push", "--include-untracked",
|
|
1617
1697
|
"-m", `gsd: pre-merge stash for ${milestoneId}`,
|
|
1618
|
-
"--",
|
|
1698
|
+
"--", ...stashPathspecs,
|
|
1619
1699
|
],
|
|
1620
1700
|
{ cwd: originalBasePath_, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
1621
1701
|
);
|