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
|
@@ -37,7 +37,7 @@ interface RemoteResultDetails {
|
|
|
37
37
|
threadUrl?: string;
|
|
38
38
|
status?: string;
|
|
39
39
|
questions?: Question[];
|
|
40
|
-
response?:
|
|
40
|
+
response?: RoundResult;
|
|
41
41
|
error?: boolean;
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -435,10 +435,13 @@ export default function AskUserQuestions(pi: ExtensionAPI) {
|
|
|
435
435
|
lines.push(`${theme.fg("accent", q.header)}: ${theme.fg("dim", "(no answer)")}`);
|
|
436
436
|
continue;
|
|
437
437
|
}
|
|
438
|
-
const
|
|
438
|
+
const selected = answer.selected;
|
|
439
|
+
const answerText = Array.isArray(selected)
|
|
440
|
+
? (selected.length > 0 ? selected.join(", ") : "(custom)")
|
|
441
|
+
: (selected || "(custom)");
|
|
439
442
|
let line = `${theme.fg("success", "✓ ")}${theme.fg("accent", q.header)}: ${answerText}`;
|
|
440
|
-
if (answer.
|
|
441
|
-
line += ` ${theme.fg("muted", `[note: ${answer.
|
|
443
|
+
if (answer.notes) {
|
|
444
|
+
line += ` ${theme.fg("muted", `[note: ${answer.notes}]`)}`;
|
|
442
445
|
}
|
|
443
446
|
lines.push(line);
|
|
444
447
|
}
|
|
@@ -11,6 +11,40 @@
|
|
|
11
11
|
|
|
12
12
|
import { execFileSync } from "node:child_process";
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Candidate executable names for the Claude Code CLI.
|
|
16
|
+
*
|
|
17
|
+
* Keep the explicit win32 ternary selector for regression coverage (Issue #4424):
|
|
18
|
+
* Node's execFileSync must target `claude.cmd` directly on Windows.
|
|
19
|
+
*/
|
|
20
|
+
const CLAUDE_COMMAND = process.platform === "win32" ? "claude.cmd" : "claude";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Windows installs vary: some environments expose `claude.cmd` (npm shim),
|
|
24
|
+
* others expose a `claude` shim on PATH (for example Git Bash wrappers).
|
|
25
|
+
* Try both to avoid false "not installed" results in readiness checks.
|
|
26
|
+
*/
|
|
27
|
+
const CLAUDE_COMMAND_CANDIDATES = process.platform === "win32" ? [CLAUDE_COMMAND, "claude"] : [CLAUDE_COMMAND];
|
|
28
|
+
|
|
29
|
+
function execClaude(args: string[]): Buffer {
|
|
30
|
+
let lastError: unknown;
|
|
31
|
+
for (const command of CLAUDE_COMMAND_CANDIDATES) {
|
|
32
|
+
try {
|
|
33
|
+
return execFileSync(command, args, { timeout: 5_000, stdio: "pipe" });
|
|
34
|
+
} catch (error) {
|
|
35
|
+
lastError = error;
|
|
36
|
+
const code = (error as NodeJS.ErrnoException | undefined)?.code;
|
|
37
|
+
// Windows Git Bash can surface `.cmd` spawn failures as EINVAL instead
|
|
38
|
+
// of ENOENT. Treat both as "try next candidate".
|
|
39
|
+
if (code === "ENOENT" || code === "EINVAL") {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
throw lastError ?? new Error(`Claude CLI executable not found (tried: ${CLAUDE_COMMAND_CANDIDATES.join(", ")})`);
|
|
46
|
+
}
|
|
47
|
+
|
|
14
48
|
let cachedBinaryPresent: boolean | null = null;
|
|
15
49
|
let cachedAuthed: boolean | null = null;
|
|
16
50
|
let lastCheckMs = 0;
|
|
@@ -27,7 +61,7 @@ function refreshCache(): void {
|
|
|
27
61
|
|
|
28
62
|
// Check binary presence
|
|
29
63
|
try {
|
|
30
|
-
|
|
64
|
+
execClaude(["--version"]);
|
|
31
65
|
cachedBinaryPresent = true;
|
|
32
66
|
} catch {
|
|
33
67
|
cachedBinaryPresent = false;
|
|
@@ -37,7 +71,7 @@ function refreshCache(): void {
|
|
|
37
71
|
|
|
38
72
|
// Check auth status — exit code 0 with non-error output means authenticated
|
|
39
73
|
try {
|
|
40
|
-
const output =
|
|
74
|
+
const output = execClaude(["auth", "status"])
|
|
41
75
|
.toString()
|
|
42
76
|
.toLowerCase();
|
|
43
77
|
// The CLI outputs "not logged in", "no credentials", or similar when unauthenticated
|
|
@@ -31,6 +31,7 @@ import type {
|
|
|
31
31
|
SDKUserMessage,
|
|
32
32
|
} from "./sdk-types.js";
|
|
33
33
|
|
|
34
|
+
/** A single content block returned by an external (SDK-executed) tool call. */
|
|
34
35
|
export interface ExternalToolResultContentBlock {
|
|
35
36
|
type: string;
|
|
36
37
|
text?: string;
|
|
@@ -38,25 +39,30 @@ export interface ExternalToolResultContentBlock {
|
|
|
38
39
|
mimeType?: string;
|
|
39
40
|
}
|
|
40
41
|
|
|
42
|
+
/** The full result payload returned by an external tool, including content blocks and error status. */
|
|
41
43
|
export interface ExternalToolResultPayload {
|
|
42
44
|
content: ExternalToolResultContentBlock[];
|
|
43
45
|
details?: Record<string, unknown>;
|
|
44
46
|
isError: boolean;
|
|
45
47
|
}
|
|
46
48
|
|
|
49
|
+
/** A `ToolCall` block augmented with the external result attached by the SDK synthetic user message. */
|
|
47
50
|
type ToolCallWithExternalResult = ToolCall & {
|
|
48
51
|
externalResult?: ExternalToolResultPayload;
|
|
49
52
|
};
|
|
50
53
|
|
|
54
|
+
/** `SimpleStreamOptions` extended with an optional extension UI context for elicitation dialogs. */
|
|
51
55
|
interface ClaudeCodeStreamOptions extends SimpleStreamOptions {
|
|
52
56
|
extensionUIContext?: ExtensionUIContext;
|
|
53
57
|
}
|
|
54
58
|
|
|
59
|
+
/** A single selectable option within an SDK elicitation schema field. */
|
|
55
60
|
interface SdkElicitationRequestOption {
|
|
56
61
|
const?: string;
|
|
57
62
|
title?: string;
|
|
58
63
|
}
|
|
59
64
|
|
|
65
|
+
/** JSON-Schema-like descriptor for a single field within an SDK elicitation request schema. */
|
|
60
66
|
interface SdkElicitationFieldSchema {
|
|
61
67
|
type?: string;
|
|
62
68
|
title?: string;
|
|
@@ -69,6 +75,7 @@ interface SdkElicitationFieldSchema {
|
|
|
69
75
|
};
|
|
70
76
|
}
|
|
71
77
|
|
|
78
|
+
/** The full elicitation request object received from an MCP server via the Claude Agent SDK. */
|
|
72
79
|
interface SdkElicitationRequest {
|
|
73
80
|
serverName: string;
|
|
74
81
|
message: string;
|
|
@@ -80,15 +87,18 @@ interface SdkElicitationRequest {
|
|
|
80
87
|
};
|
|
81
88
|
}
|
|
82
89
|
|
|
90
|
+
/** The result returned by an elicitation handler back to the Claude Agent SDK. */
|
|
83
91
|
interface SdkElicitationResult {
|
|
84
92
|
action: "accept" | "decline" | "cancel";
|
|
85
93
|
content?: Record<string, string | string[]>;
|
|
86
94
|
}
|
|
87
95
|
|
|
96
|
+
/** A TUI `Question` extended with an optional note-field ID for "None of the above" free-text capture. */
|
|
88
97
|
interface ParsedElicitationQuestion extends Question {
|
|
89
98
|
noteFieldId?: string;
|
|
90
99
|
}
|
|
91
100
|
|
|
101
|
+
/** Descriptor for a single free-text input field parsed from an SDK elicitation form schema. */
|
|
92
102
|
interface ParsedTextInputField {
|
|
93
103
|
id: string;
|
|
94
104
|
title: string;
|
|
@@ -97,6 +107,7 @@ interface ParsedTextInputField {
|
|
|
97
107
|
secure: boolean;
|
|
98
108
|
}
|
|
99
109
|
|
|
110
|
+
/** A base64-encoded image block in the format accepted by the Claude Agent SDK input message. */
|
|
100
111
|
interface SDKInputImageBlock {
|
|
101
112
|
type: "image";
|
|
102
113
|
source: {
|
|
@@ -106,13 +117,16 @@ interface SDKInputImageBlock {
|
|
|
106
117
|
};
|
|
107
118
|
}
|
|
108
119
|
|
|
120
|
+
/** A plain-text block in the format accepted by the Claude Agent SDK input message. */
|
|
109
121
|
interface SDKInputTextBlock {
|
|
110
122
|
type: "text";
|
|
111
123
|
text: string;
|
|
112
124
|
}
|
|
113
125
|
|
|
126
|
+
/** Union of content block types that may appear in a Claude Agent SDK user input message. */
|
|
114
127
|
type SDKInputUserContentBlock = SDKInputImageBlock | SDKInputTextBlock;
|
|
115
128
|
|
|
129
|
+
/** A synthetic user message in the Claude Agent SDK's async-iterable prompt format, used when images are present. */
|
|
116
130
|
interface SDKInputUserMessage {
|
|
117
131
|
type: "user";
|
|
118
132
|
message: {
|
|
@@ -122,7 +136,9 @@ interface SDKInputUserMessage {
|
|
|
122
136
|
parent_tool_use_id: null;
|
|
123
137
|
}
|
|
124
138
|
|
|
139
|
+
/** Label used for the free-text fallback option in single-choice elicitation questions. */
|
|
125
140
|
const OTHER_OPTION_LABEL = "None of the above";
|
|
141
|
+
/** Regex pattern that identifies field names and descriptions that should be treated as sensitive/secure inputs. */
|
|
126
142
|
const SENSITIVE_FIELD_PATTERN = /(password|passphrase|secret|token|api[_\s-]*key|private[_\s-]*key|credential)/i;
|
|
127
143
|
|
|
128
144
|
// ---------------------------------------------------------------------------
|
|
@@ -144,6 +160,7 @@ function createAssistantStream(): AssistantMessageEventStream {
|
|
|
144
160
|
) as AssistantMessageEventStream;
|
|
145
161
|
}
|
|
146
162
|
|
|
163
|
+
/** Extract a human-readable error string from an SDK result message. */
|
|
147
164
|
export function getResultErrorMessage(result: SDKResultMessage): string {
|
|
148
165
|
if ("errors" in result && Array.isArray(result.errors) && result.errors.length > 0) {
|
|
149
166
|
return result.errors.join("; ");
|
|
@@ -160,12 +177,15 @@ export function getResultErrorMessage(result: SDKResultMessage): string {
|
|
|
160
177
|
// Claude binary resolution
|
|
161
178
|
// ---------------------------------------------------------------------------
|
|
162
179
|
|
|
180
|
+
/** Cached result of the `which`/`where claude` lookup so the shell is only spawned once per process. */
|
|
163
181
|
let cachedClaudePath: string | null = null;
|
|
164
182
|
|
|
183
|
+
/** Return the shell command used to locate the `claude` binary on the given platform. */
|
|
165
184
|
export function getClaudeLookupCommand(platform: NodeJS.Platform = process.platform): string {
|
|
166
185
|
return platform === "win32" ? "where claude" : "which claude";
|
|
167
186
|
}
|
|
168
187
|
|
|
188
|
+
/** Extract the first line of `which`/`where` output as the resolved binary path. */
|
|
169
189
|
export function parseClaudeLookupOutput(output: Buffer | string): string {
|
|
170
190
|
return output
|
|
171
191
|
.toString()
|
|
@@ -248,6 +268,7 @@ export function buildPromptFromContext(context: Context): string {
|
|
|
248
268
|
return parts.join("\n\n");
|
|
249
269
|
}
|
|
250
270
|
|
|
271
|
+
/** Strip the `data:<mime>;base64,` prefix from a data URI, returning only the raw base64 payload. */
|
|
251
272
|
function stripDataUriPrefix(value: string): string {
|
|
252
273
|
const commaIndex = value.indexOf(",");
|
|
253
274
|
if (value.startsWith("data:") && commaIndex !== -1) {
|
|
@@ -256,11 +277,13 @@ function stripDataUriPrefix(value: string): string {
|
|
|
256
277
|
return value;
|
|
257
278
|
}
|
|
258
279
|
|
|
280
|
+
/** Extract the MIME type from a data URI string, or return `null` if the value is not a valid data URI. */
|
|
259
281
|
function inferMimeTypeFromDataUri(value: string): string | null {
|
|
260
282
|
const match = /^data:([^;,]+);base64,/.exec(value);
|
|
261
283
|
return match?.[1] ?? null;
|
|
262
284
|
}
|
|
263
285
|
|
|
286
|
+
/** Collect all base64 image blocks from user messages in the context for inclusion in the SDK prompt. */
|
|
264
287
|
export function extractImageBlocksFromContext(context: Context): SDKInputImageBlock[] {
|
|
265
288
|
const imageBlocks: SDKInputImageBlock[] = [];
|
|
266
289
|
|
|
@@ -291,6 +314,7 @@ export function extractImageBlocksFromContext(context: Context): SDKInputImageBl
|
|
|
291
314
|
return imageBlocks;
|
|
292
315
|
}
|
|
293
316
|
|
|
317
|
+
/** Build the SDK query prompt, wrapping image blocks into an async iterable user message when present. */
|
|
294
318
|
export function buildSdkQueryPrompt(
|
|
295
319
|
context: Context,
|
|
296
320
|
textPrompt: string = buildPromptFromContext(context),
|
|
@@ -320,6 +344,7 @@ export function buildSdkQueryPrompt(
|
|
|
320
344
|
// Error helper
|
|
321
345
|
// ---------------------------------------------------------------------------
|
|
322
346
|
|
|
347
|
+
/** Build a minimal error `AssistantMessage` with the given model ID and error text. */
|
|
323
348
|
function makeErrorMessage(model: string, errorMsg: string): AssistantMessage {
|
|
324
349
|
return {
|
|
325
350
|
role: "assistant",
|
|
@@ -348,6 +373,7 @@ export function makeStreamExhaustedErrorMessage(model: string, lastTextContent:
|
|
|
348
373
|
return message;
|
|
349
374
|
}
|
|
350
375
|
|
|
376
|
+
/** Extract the string labels from an array of SDK elicitation option objects, filtering out blank entries. */
|
|
351
377
|
function readElicitationChoices(options: SdkElicitationRequestOption[] | undefined): string[] {
|
|
352
378
|
if (!Array.isArray(options)) return [];
|
|
353
379
|
return options
|
|
@@ -355,6 +381,7 @@ function readElicitationChoices(options: SdkElicitationRequestOption[] | undefin
|
|
|
355
381
|
.filter((option): option is string => option.length > 0);
|
|
356
382
|
}
|
|
357
383
|
|
|
384
|
+
/** Parse an SDK elicitation request into structured multiple-choice questions, or null if the schema is unsupported. */
|
|
358
385
|
export function parseAskUserQuestionsElicitation(
|
|
359
386
|
request: Pick<SdkElicitationRequest, "mode" | "requestedSchema">,
|
|
360
387
|
): ParsedElicitationQuestion[] | null {
|
|
@@ -408,6 +435,7 @@ export function parseAskUserQuestionsElicitation(
|
|
|
408
435
|
return questions.length > 0 ? questions : null;
|
|
409
436
|
}
|
|
410
437
|
|
|
438
|
+
/** Return true if the elicitation field should be treated as sensitive and rendered as a secure/password input. */
|
|
411
439
|
function isSecureElicitationField(
|
|
412
440
|
requestMessage: string,
|
|
413
441
|
fieldId: string,
|
|
@@ -431,6 +459,7 @@ function isSecureElicitationField(
|
|
|
431
459
|
return SENSITIVE_FIELD_PATTERN.test(haystack);
|
|
432
460
|
}
|
|
433
461
|
|
|
462
|
+
/** Parse an SDK elicitation request into free-text input field descriptors, or null if unsupported. */
|
|
434
463
|
export function parseTextInputElicitation(
|
|
435
464
|
request: Pick<SdkElicitationRequest, "message" | "mode" | "requestedSchema">,
|
|
436
465
|
): ParsedTextInputField[] | null {
|
|
@@ -469,6 +498,7 @@ export function parseTextInputElicitation(
|
|
|
469
498
|
return fields.length > 0 ? fields : null;
|
|
470
499
|
}
|
|
471
500
|
|
|
501
|
+
/** Convert a TUI interview round result into the SDK elicitation content map. */
|
|
472
502
|
export function roundResultToElicitationContent(
|
|
473
503
|
questions: ParsedElicitationQuestion[],
|
|
474
504
|
result: RoundResult,
|
|
@@ -495,6 +525,7 @@ export function roundResultToElicitationContent(
|
|
|
495
525
|
return content;
|
|
496
526
|
}
|
|
497
527
|
|
|
528
|
+
/** Build the dialog title string for a multiple-choice elicitation question, combining server name, header, and question text. */
|
|
498
529
|
function buildElicitationPromptTitle(request: SdkElicitationRequest, question: ParsedElicitationQuestion): string {
|
|
499
530
|
const parts = [
|
|
500
531
|
request.serverName ? `[${request.serverName}]` : "",
|
|
@@ -504,6 +535,7 @@ function buildElicitationPromptTitle(request: SdkElicitationRequest, question: P
|
|
|
504
535
|
return parts.join("\n\n");
|
|
505
536
|
}
|
|
506
537
|
|
|
538
|
+
/** Drive each multiple-choice elicitation question through the extension UI's `select` dialog, collecting answers into an SDK result. */
|
|
507
539
|
async function promptElicitationWithDialogs(
|
|
508
540
|
request: SdkElicitationRequest,
|
|
509
541
|
questions: ParsedElicitationQuestion[],
|
|
@@ -550,6 +582,7 @@ async function promptElicitationWithDialogs(
|
|
|
550
582
|
return { action: "accept", content };
|
|
551
583
|
}
|
|
552
584
|
|
|
585
|
+
/** Build the dialog title string for a free-text input field, combining server name, field title, and description. */
|
|
553
586
|
function buildTextInputPromptTitle(request: SdkElicitationRequest, field: ParsedTextInputField): string {
|
|
554
587
|
const parts = [
|
|
555
588
|
request.serverName ? `[${request.serverName}]` : "",
|
|
@@ -559,6 +592,7 @@ function buildTextInputPromptTitle(request: SdkElicitationRequest, field: Parsed
|
|
|
559
592
|
return parts.join("\n\n");
|
|
560
593
|
}
|
|
561
594
|
|
|
595
|
+
/** Derive a placeholder hint for a free-text input field from its description, falling back to "Required" or "Leave empty to skip". */
|
|
562
596
|
function buildTextInputPlaceholder(field: ParsedTextInputField): string | undefined {
|
|
563
597
|
const desc = field.description.trim();
|
|
564
598
|
if (!desc) return field.required ? "Required" : "Leave empty to skip";
|
|
@@ -573,6 +607,7 @@ function buildTextInputPlaceholder(field: ParsedTextInputField): string | undefi
|
|
|
573
607
|
return hint.length > 0 ? hint : field.required ? "Required" : "Leave empty to skip";
|
|
574
608
|
}
|
|
575
609
|
|
|
610
|
+
/** Collect each free-text input field via the extension UI's `input` dialog, returning the filled SDK elicitation result. */
|
|
576
611
|
async function promptTextInputElicitation(
|
|
577
612
|
request: SdkElicitationRequest,
|
|
578
613
|
fields: ParsedTextInputField[],
|
|
@@ -596,6 +631,7 @@ async function promptTextInputElicitation(
|
|
|
596
631
|
return { action: "accept", content };
|
|
597
632
|
}
|
|
598
633
|
|
|
634
|
+
/** Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available. */
|
|
599
635
|
export function createClaudeCodeElicitationHandler(
|
|
600
636
|
ui: ExtensionUIContext | undefined,
|
|
601
637
|
): ((request: SdkElicitationRequest, options: { signal: AbortSignal }) => Promise<SdkElicitationResult>) | undefined {
|
|
@@ -682,6 +718,7 @@ export async function resolveClaudePermissionMode(
|
|
|
682
718
|
// NOTE: These helpers intentionally mirror @gsd/pi-ai anthropic-shared
|
|
683
719
|
// behavior so this extension remains typecheck-stable even when the published
|
|
684
720
|
// @gsd/pi-ai barrel lags behind monorepo source exports.
|
|
721
|
+
/** Return true for model IDs that support the adaptive thinking API (Opus 4.6/4.7, Sonnet 4.6/4.7, Haiku 4.5). */
|
|
685
722
|
function modelSupportsAdaptiveThinking(modelId: string): boolean {
|
|
686
723
|
return (
|
|
687
724
|
modelId.includes("opus-4-6")
|
|
@@ -690,9 +727,14 @@ function modelSupportsAdaptiveThinking(modelId: string): boolean {
|
|
|
690
727
|
|| modelId.includes("opus-4.7")
|
|
691
728
|
|| modelId.includes("sonnet-4-6")
|
|
692
729
|
|| modelId.includes("sonnet-4.6")
|
|
730
|
+
|| modelId.includes("sonnet-4-7")
|
|
731
|
+
|| modelId.includes("sonnet-4.7")
|
|
732
|
+
|| modelId.includes("haiku-4-5")
|
|
733
|
+
|| modelId.includes("haiku-4.5")
|
|
693
734
|
);
|
|
694
735
|
}
|
|
695
736
|
|
|
737
|
+
/** Map a GSD thinking level to the Anthropic effort value, clamping xhigh to max for models that lack native xhigh support. */
|
|
696
738
|
function mapThinkingLevelToAnthropicEffort(level: ThinkingLevel | undefined, modelId: string): "low" | "medium" | "high" | "xhigh" | "max" {
|
|
697
739
|
switch (level) {
|
|
698
740
|
case "minimal":
|
|
@@ -747,10 +789,21 @@ export function buildSdkOptions(
|
|
|
747
789
|
"Bash(pwd)",
|
|
748
790
|
...(mcpServers ? Object.keys(mcpServers).map((serverName) => `mcp__${serverName}__*`) : []),
|
|
749
791
|
];
|
|
792
|
+
const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
|
|
750
793
|
const effort =
|
|
751
|
-
reasoning &&
|
|
794
|
+
reasoning && supportsAdaptive
|
|
752
795
|
? mapThinkingLevelToAnthropicEffort(reasoning, modelId)
|
|
753
796
|
: undefined;
|
|
797
|
+
|
|
798
|
+
// Bug B: SDK requires thinking:{type:"adaptive"} alongside effort for adaptive thinking to activate.
|
|
799
|
+
// Bug C: SDK requires thinking:{type:"disabled"} to actually stop adaptive thinking when reasoning is off;
|
|
800
|
+
// omitting the field leaves the SDK in its adaptive default (or persisted session state).
|
|
801
|
+
const thinkingConfig = supportsAdaptive
|
|
802
|
+
? effort
|
|
803
|
+
? { thinking: { type: "adaptive" } }
|
|
804
|
+
: { thinking: { type: "disabled" } }
|
|
805
|
+
: undefined;
|
|
806
|
+
|
|
754
807
|
return {
|
|
755
808
|
pathToClaudeCodeExecutable: getClaudePath(),
|
|
756
809
|
model: modelId,
|
|
@@ -765,11 +818,13 @@ export function buildSdkOptions(
|
|
|
765
818
|
...(allowedTools.length > 0 ? { allowedTools } : {}),
|
|
766
819
|
...(mcpServers ? { mcpServers } : {}),
|
|
767
820
|
betas: (modelId.includes("sonnet") || modelId.includes("opus-4-7") || modelId.includes("opus-4.7")) ? ["context-1m-2025-08-07"] : [],
|
|
821
|
+
...(thinkingConfig ?? {}),
|
|
768
822
|
...(effort ? { effort } : {}),
|
|
769
823
|
...sdkExtraOptions,
|
|
770
824
|
};
|
|
771
825
|
}
|
|
772
826
|
|
|
827
|
+
/** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
|
|
773
828
|
function normalizeToolResultContent(content: unknown): ExternalToolResultContentBlock[] {
|
|
774
829
|
if (typeof content === "string") {
|
|
775
830
|
return [{ type: "text", text: content }];
|
|
@@ -812,6 +867,7 @@ function normalizeToolResultContent(content: unknown): ExternalToolResultContent
|
|
|
812
867
|
return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
|
|
813
868
|
}
|
|
814
869
|
|
|
870
|
+
/** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
|
|
815
871
|
export function extractToolResultsFromSdkUserMessage(message: SDKUserMessage): Array<{
|
|
816
872
|
toolUseId: string;
|
|
817
873
|
result: ExternalToolResultPayload;
|
|
@@ -862,6 +918,7 @@ export function extractToolResultsFromSdkUserMessage(message: SDKUserMessage): A
|
|
|
862
918
|
return extracted;
|
|
863
919
|
}
|
|
864
920
|
|
|
921
|
+
/** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
|
|
865
922
|
function attachExternalResultsToToolBlocks(
|
|
866
923
|
toolBlocks: AssistantMessage["content"],
|
|
867
924
|
toolResultsById: ReadonlyMap<string, ExternalToolResultPayload>,
|
|
@@ -920,6 +977,7 @@ export function streamViaClaudeCode(
|
|
|
920
977
|
return stream;
|
|
921
978
|
}
|
|
922
979
|
|
|
980
|
+
/** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
|
|
923
981
|
async function pumpSdkMessages(
|
|
924
982
|
model: Model<any>,
|
|
925
983
|
context: Context,
|
|
@@ -469,6 +469,72 @@ describe("stream-adapter — session persistence (#2859)", () => {
|
|
|
469
469
|
assert.equal("effort" in options, false);
|
|
470
470
|
});
|
|
471
471
|
|
|
472
|
+
// --- Bug fixes #4392: thinking field & model coverage ---
|
|
473
|
+
|
|
474
|
+
test("buildSdkOptions sets thinking disabled when reasoning is undefined on adaptive model (#4392)", () => {
|
|
475
|
+
// Bug C: thinkingLevel="off" means reasoning===undefined; SDK needs thinking:{type:"disabled"}
|
|
476
|
+
const options = buildSdkOptions("claude-sonnet-4-6", "test", undefined, {});
|
|
477
|
+
assert.deepEqual(
|
|
478
|
+
(options as any).thinking,
|
|
479
|
+
{ type: "disabled" },
|
|
480
|
+
"thinking must be {type:'disabled'} when reasoning is undefined so SDK stops adaptive thinking",
|
|
481
|
+
);
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
test("buildSdkOptions omits effort when reasoning is undefined (thinking disabled) (#4392)", () => {
|
|
485
|
+
// Bug C corollary: no effort when thinking is off
|
|
486
|
+
const options = buildSdkOptions("claude-sonnet-4-6", "test", undefined, {});
|
|
487
|
+
assert.equal("effort" in options, false, "effort must not be set when reasoning is undefined");
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
test("buildSdkOptions sets thinking adaptive when reasoning is provided (#4392)", () => {
|
|
491
|
+
// Bug B: when effort is set, thinking:{type:"adaptive"} must also be present
|
|
492
|
+
const options = buildSdkOptions("claude-opus-4-6", "test", undefined, { reasoning: "high" });
|
|
493
|
+
assert.deepEqual(
|
|
494
|
+
(options as any).thinking,
|
|
495
|
+
{ type: "adaptive" },
|
|
496
|
+
"thinking must be {type:'adaptive'} alongside effort when reasoning is set",
|
|
497
|
+
);
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
test("buildSdkOptions includes both effort and thinking.type=adaptive when reasoning is set (#4392)", () => {
|
|
501
|
+
// Bug B: both fields must be present together
|
|
502
|
+
const options = buildSdkOptions("claude-opus-4-6", "test", undefined, { reasoning: "high" });
|
|
503
|
+
assert.equal(options.effort, "high", "effort must be set");
|
|
504
|
+
assert.deepEqual((options as any).thinking, { type: "adaptive" }, "thinking must be adaptive");
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
test("buildSdkOptions maps reasoning to effort for sonnet-4-7 (modelSupportsAdaptiveThinking #4392)", () => {
|
|
508
|
+
// Bug D: sonnet-4-7 was missing from modelSupportsAdaptiveThinking
|
|
509
|
+
const options = buildSdkOptions("claude-sonnet-4-7", "test", undefined, { reasoning: "high" });
|
|
510
|
+
assert.equal(options.effort, "high", "sonnet-4-7 must support adaptive thinking and map effort");
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
test("buildSdkOptions maps reasoning to effort for haiku-4-5 (modelSupportsAdaptiveThinking #4392)", () => {
|
|
514
|
+
// Bug D: haiku-4-5 was missing from modelSupportsAdaptiveThinking
|
|
515
|
+
const options = buildSdkOptions("claude-haiku-4-5", "test", undefined, { reasoning: "high" });
|
|
516
|
+
assert.equal(options.effort, "high", "haiku-4-5 must support adaptive thinking and map effort");
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
test("buildSdkOptions maps reasoning to effort for sonnet-4.7 dot-form (modelSupportsAdaptiveThinking #4392)", () => {
|
|
520
|
+
// Dot-form aliases (e.g. claude-sonnet-4.7) must also be recognised
|
|
521
|
+
const options = buildSdkOptions("claude-sonnet-4.7", "test", undefined, { reasoning: "high" });
|
|
522
|
+
assert.equal(options.effort, "high", "claude-sonnet-4.7 must support adaptive thinking and map effort");
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
test("buildSdkOptions maps reasoning to effort for haiku-4.5 dot-form (modelSupportsAdaptiveThinking #4392)", () => {
|
|
526
|
+
// Dot-form aliases (e.g. claude-haiku-4.5) must also be recognised
|
|
527
|
+
const options = buildSdkOptions("claude-haiku-4.5", "test", undefined, { reasoning: "high" });
|
|
528
|
+
assert.equal(options.effort, "high", "claude-haiku-4.5 must support adaptive thinking and map effort");
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
test("buildSdkOptions does not set thinking field for non-adaptive model when reasoning is undefined (#4392)", () => {
|
|
532
|
+
// Non-adaptive models (e.g. claude-sonnet-4-20250514) don't use the thinking API at all;
|
|
533
|
+
// no thinking field should be set when reasoning is undefined
|
|
534
|
+
const options = buildSdkOptions("claude-sonnet-4-20250514", "test", undefined, {});
|
|
535
|
+
assert.equal("thinking" in options, false, "non-adaptive models must not receive a thinking field");
|
|
536
|
+
});
|
|
537
|
+
|
|
472
538
|
test("buildSdkOptions includes workflow MCP server config when env is set", () => {
|
|
473
539
|
const prev = {
|
|
474
540
|
GSD_WORKFLOW_MCP_COMMAND: process.env.GSD_WORKFLOW_MCP_COMMAND,
|
|
@@ -16,7 +16,7 @@ import type {
|
|
|
16
16
|
VerificationContext,
|
|
17
17
|
VerificationResult,
|
|
18
18
|
} from "../auto-verification.js";
|
|
19
|
-
import type { DispatchAction } from "../auto-dispatch.js";
|
|
19
|
+
import type { DispatchAction, DispatchContext } from "../auto-dispatch.js";
|
|
20
20
|
import type { WorktreeResolver } from "../worktree-resolver.js";
|
|
21
21
|
import type { CmuxLogLevel } from "../../cmux/index.js";
|
|
22
22
|
import type { JournalEntry } from "../journal.js";
|
|
@@ -145,15 +145,7 @@ export interface LoopDeps {
|
|
|
145
145
|
} | null>;
|
|
146
146
|
|
|
147
147
|
// Dispatch
|
|
148
|
-
resolveDispatch: (dctx:
|
|
149
|
-
basePath: string;
|
|
150
|
-
mid: string;
|
|
151
|
-
midTitle: string;
|
|
152
|
-
state: GSDState;
|
|
153
|
-
prefs: GSDPreferences | undefined;
|
|
154
|
-
session?: AutoSession;
|
|
155
|
-
structuredQuestionsAvailable?: "true" | "false";
|
|
156
|
-
}) => Promise<DispatchAction>;
|
|
148
|
+
resolveDispatch: (dctx: DispatchContext) => Promise<DispatchAction>;
|
|
157
149
|
runPreDispatchHooks: (
|
|
158
150
|
unitType: string,
|
|
159
151
|
unitId: string,
|
|
@@ -50,6 +50,7 @@ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "
|
|
|
50
50
|
import { getEligibleSlices } from "../slice-parallel-eligibility.js";
|
|
51
51
|
import { startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
52
52
|
import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
|
|
53
|
+
import type { MinimalModelRegistry } from "../context-budget.js";
|
|
53
54
|
import { ensurePlanV2Graph } from "../uok/plan-v2.js";
|
|
54
55
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
55
56
|
import { UokGateRunner } from "../uok/gate-runner.js";
|
|
@@ -857,6 +858,8 @@ export async function runDispatch(
|
|
|
857
858
|
prefs,
|
|
858
859
|
session: s,
|
|
859
860
|
structuredQuestionsAvailable,
|
|
861
|
+
sessionContextWindow: ctx.model?.contextWindow,
|
|
862
|
+
modelRegistry: ctx.modelRegistry as MinimalModelRegistry | undefined,
|
|
860
863
|
});
|
|
861
864
|
|
|
862
865
|
if (dispatchResult.action === "stop") {
|
|
@@ -1128,16 +1131,42 @@ export async function runGuards(
|
|
|
1128
1131
|
s.lastBudgetAlertLevel =
|
|
1129
1132
|
newBudgetAlertLevel as AutoSession["lastBudgetAlertLevel"];
|
|
1130
1133
|
|
|
1131
|
-
|
|
1134
|
+
// Emit Layer 2 budget_threshold event (post-plan hook recommendation).
|
|
1135
|
+
// Extensions / Layer 0 shell hooks may return an action override.
|
|
1136
|
+
let hookAction: "pause" | "downgrade" | "continue" | undefined;
|
|
1137
|
+
try {
|
|
1138
|
+
const { emitBudgetThreshold } = await import("../hook-emitter.js");
|
|
1139
|
+
const hookResult = await emitBudgetThreshold({
|
|
1140
|
+
fraction: budgetPct,
|
|
1141
|
+
spent: totalCost,
|
|
1142
|
+
limit: budgetCeiling,
|
|
1143
|
+
});
|
|
1144
|
+
if (hookResult?.action) hookAction = hookResult.action;
|
|
1145
|
+
} catch (hookErr) {
|
|
1146
|
+
logWarning("engine", `budget_threshold hook emission failed: ${(hookErr as Error).message}`);
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1149
|
+
// Apply hook override to enforcement action. "continue" → "none" (no enforcement),
|
|
1150
|
+
// "pause" and "downgrade" map to the matching enforcement path below.
|
|
1151
|
+
let effectiveAction = budgetEnforcementAction;
|
|
1152
|
+
if (hookAction === "continue") {
|
|
1153
|
+
effectiveAction = "none";
|
|
1154
|
+
} else if (hookAction === "pause") {
|
|
1155
|
+
effectiveAction = "pause";
|
|
1156
|
+
} else if (hookAction === "downgrade") {
|
|
1157
|
+
effectiveAction = "warn";
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
if (threshold.pct === 100 && effectiveAction !== "none") {
|
|
1132
1161
|
// 100% — special enforcement logic (halt/pause/warn)
|
|
1133
1162
|
const msg = `Budget ceiling ${deps.formatCost(budgetCeiling)} reached (spent ${deps.formatCost(totalCost)}).`;
|
|
1134
|
-
if (
|
|
1163
|
+
if (effectiveAction === "halt") {
|
|
1135
1164
|
deps.sendDesktopNotification("GSD", msg, "error", "budget", basename(s.originalBasePath || s.basePath));
|
|
1136
1165
|
await deps.stopAuto(ctx, pi, "Budget ceiling reached");
|
|
1137
1166
|
debugLog("autoLoop", { phase: "exit", reason: "budget-halt" });
|
|
1138
1167
|
return { action: "break", reason: "budget-halt" };
|
|
1139
1168
|
}
|
|
1140
|
-
if (
|
|
1169
|
+
if (effectiveAction === "pause") {
|
|
1141
1170
|
ctx.ui.notify(
|
|
1142
1171
|
`${msg} Pausing auto-mode — /gsd auto to override and continue.`,
|
|
1143
1172
|
"warning",
|
|
@@ -1586,21 +1615,24 @@ export async function runUnitPhase(
|
|
|
1586
1615
|
}
|
|
1587
1616
|
|
|
1588
1617
|
if (unitResult.status === "cancelled") {
|
|
1618
|
+
const errorCategory = unitResult.errorContext?.category;
|
|
1589
1619
|
// Provider-error pause: pauseAuto already handled cleanup and scheduled
|
|
1590
1620
|
// recovery. Don't hard-stop — just break out of the loop (#2762).
|
|
1591
|
-
if (
|
|
1621
|
+
if (errorCategory === "provider") {
|
|
1592
1622
|
await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
|
|
1593
|
-
debugLog("autoLoop", { phase: "exit", reason: "provider-pause", isTransient: unitResult.errorContext
|
|
1623
|
+
debugLog("autoLoop", { phase: "exit", reason: "provider-pause", isTransient: unitResult.errorContext?.isTransient });
|
|
1594
1624
|
return { action: "break", reason: "provider-pause" };
|
|
1595
1625
|
}
|
|
1596
1626
|
// Timeout category covers two distinct scenarios:
|
|
1597
1627
|
// 1. Session creation timeout (120s) — transient, auto-resume with backoff
|
|
1598
1628
|
// 2. Unit hard timeout (30min+) — stuck agent, pause for manual review
|
|
1629
|
+
// Transient session-failed covers recoverable newSession failures and should
|
|
1630
|
+
// pause instead of hard-stopping.
|
|
1599
1631
|
// Structural errors (TypeError, is not a function) are NOT transient
|
|
1600
1632
|
// and must hard-stop to avoid infinite retry loops.
|
|
1601
1633
|
if (
|
|
1602
1634
|
unitResult.errorContext?.isTransient &&
|
|
1603
|
-
|
|
1635
|
+
errorCategory === "timeout"
|
|
1604
1636
|
) {
|
|
1605
1637
|
const isSessionCreationTimeout = unitResult.errorContext.message?.includes("Session creation timed out");
|
|
1606
1638
|
|
|
@@ -1663,6 +1695,20 @@ export async function runUnitPhase(
|
|
|
1663
1695
|
await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
|
|
1664
1696
|
return { action: "break", reason: "unit-hard-timeout" };
|
|
1665
1697
|
}
|
|
1698
|
+
if (
|
|
1699
|
+
unitResult.errorContext?.isTransient &&
|
|
1700
|
+
errorCategory === "session-failed"
|
|
1701
|
+
) {
|
|
1702
|
+
ctx.ui.notify(
|
|
1703
|
+
`Session creation failed transiently for ${unitType} ${unitId}: ${unitResult.errorContext?.message ?? "unknown"}. Pausing auto-mode (recoverable).`,
|
|
1704
|
+
"warning",
|
|
1705
|
+
);
|
|
1706
|
+
debugLog("autoLoop", { phase: "session-start-transient-pause", unitType, unitId, category: errorCategory });
|
|
1707
|
+
await deps.pauseAuto(ctx, pi);
|
|
1708
|
+
await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
|
|
1709
|
+
await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
|
|
1710
|
+
return { action: "break", reason: "session-timeout" };
|
|
1711
|
+
}
|
|
1666
1712
|
// All other cancelled states (structural errors, non-transient failures): hard stop
|
|
1667
1713
|
if (s.currentUnit) {
|
|
1668
1714
|
await deps.closeoutUnit(
|
|
@@ -43,6 +43,16 @@ export function resolveExpectedArtifactPath(
|
|
|
43
43
|
return dir ? join(dir, buildMilestoneFileName(mid, "ROADMAP")) : null;
|
|
44
44
|
}
|
|
45
45
|
case "research-slice": {
|
|
46
|
+
// #4414: Sentinel unitId "{mid}/parallel-research" fans out across
|
|
47
|
+
// multiple slices. Resolve to a milestone-level placeholder path so
|
|
48
|
+
// blocker escalation has somewhere to write. Verification for this
|
|
49
|
+
// sentinel is handled directly in verifyExpectedArtifact.
|
|
50
|
+
if (sid === "parallel-research") {
|
|
51
|
+
const mdir = resolveMilestonePath(base, mid);
|
|
52
|
+
return mdir
|
|
53
|
+
? join(mdir, buildMilestoneFileName(mid, "PARALLEL-BLOCKER"))
|
|
54
|
+
: null;
|
|
55
|
+
}
|
|
46
56
|
const dir = resolveSlicePath(base, mid, sid!);
|
|
47
57
|
return dir ? join(dir, buildSliceFileName(sid!, "RESEARCH")) : null;
|
|
48
58
|
}
|
|
@@ -50,6 +60,11 @@ export function resolveExpectedArtifactPath(
|
|
|
50
60
|
const dir = resolveSlicePath(base, mid, sid!);
|
|
51
61
|
return dir ? join(dir, buildSliceFileName(sid!, "PLAN")) : null;
|
|
52
62
|
}
|
|
63
|
+
case "refine-slice": {
|
|
64
|
+
// ADR-011: refine-slice expands a sketch and writes the same PLAN.md as plan-slice.
|
|
65
|
+
const dir = resolveSlicePath(base, mid, sid!);
|
|
66
|
+
return dir ? join(dir, buildSliceFileName(sid!, "PLAN")) : null;
|
|
67
|
+
}
|
|
53
68
|
case "reassess-roadmap": {
|
|
54
69
|
const dir = resolveSlicePath(base, mid, sid!);
|
|
55
70
|
return dir ? join(dir, buildSliceFileName(sid!, "ASSESSMENT")) : null;
|
|
@@ -109,9 +124,14 @@ export function diagnoseExpectedArtifact(
|
|
|
109
124
|
case "plan-milestone":
|
|
110
125
|
return `${relMilestoneFile(base, mid, "ROADMAP")} (milestone roadmap)`;
|
|
111
126
|
case "research-slice":
|
|
127
|
+
if (sid === "parallel-research") {
|
|
128
|
+
return `${relMilestoneFile(base, mid, "PARALLEL-BLOCKER")} (parallel slice research sentinel)`;
|
|
129
|
+
}
|
|
112
130
|
return `${relSliceFile(base, mid, sid!, "RESEARCH")} (slice research)`;
|
|
113
131
|
case "plan-slice":
|
|
114
132
|
return `${relSliceFile(base, mid, sid!, "PLAN")} (slice plan)`;
|
|
133
|
+
case "refine-slice":
|
|
134
|
+
return `${relSliceFile(base, mid, sid!, "PLAN")} (refined slice plan from sketch)`;
|
|
115
135
|
case "execute-task": {
|
|
116
136
|
return `Task ${tid} marked [x] in ${relSliceFile(base, mid, sid!, "PLAN")} + summary written`;
|
|
117
137
|
}
|