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
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// GSD — Setup catalog (single source of truth for onboarding steps + provider sub-views)
|
|
2
|
+
//
|
|
3
|
+
// Re-exports filtered views over PROVIDER_REGISTRY (key-manager.ts) and owns the
|
|
4
|
+
// canonical ONBOARDING_STEPS list. Consumers (CLI wizard, /gsd setup hub,
|
|
5
|
+
// onboarding handler, web alignment) all read from here so adding a step or
|
|
6
|
+
// provider lands in one place. Keep this module thin: no behavior beyond
|
|
7
|
+
// filters + lookup helpers, so it stays cycle-safe even though it depends on
|
|
8
|
+
// key-manager for the provider catalog.
|
|
9
|
+
|
|
10
|
+
import { PROVIDER_REGISTRY, type ProviderInfo } from "./key-manager.js"
|
|
11
|
+
|
|
12
|
+
export type OnboardingStepId =
|
|
13
|
+
| "llm"
|
|
14
|
+
| "model"
|
|
15
|
+
| "search"
|
|
16
|
+
| "remote"
|
|
17
|
+
| "tool-keys"
|
|
18
|
+
| "prefs"
|
|
19
|
+
| "skills"
|
|
20
|
+
| "doctor"
|
|
21
|
+
| "project"
|
|
22
|
+
|
|
23
|
+
export interface OnboardingStepDef {
|
|
24
|
+
id: OnboardingStepId
|
|
25
|
+
label: string
|
|
26
|
+
/** Required steps gate the "complete" flag. Skipped required steps mark the wizard incomplete. */
|
|
27
|
+
required: boolean
|
|
28
|
+
/** Short description shown in /gsd setup status hub. */
|
|
29
|
+
hint: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Canonical ordered list of onboarding steps.
|
|
34
|
+
*
|
|
35
|
+
* To add a new step:
|
|
36
|
+
* 1. Append here (or insert at the right position).
|
|
37
|
+
* 2. Bump FLOW_VERSION in onboarding-state.ts so existing users get re-prompted.
|
|
38
|
+
* 3. Wire its CLI runner in src/onboarding.ts (and handlers/onboarding.ts for --step).
|
|
39
|
+
*/
|
|
40
|
+
export const ONBOARDING_STEPS: readonly OnboardingStepDef[] = [
|
|
41
|
+
{ id: "llm", label: "LLM provider & auth", required: true, hint: "Sign in or paste an API key" },
|
|
42
|
+
{ id: "model", label: "Default model", required: false, hint: "Pick a default model for the chosen provider" },
|
|
43
|
+
{ id: "search", label: "Web search provider", required: false, hint: "Brave, Tavily, or Anthropic built-in" },
|
|
44
|
+
{ id: "remote", label: "Remote questions", required: false, hint: "Discord / Slack / Telegram notifications" },
|
|
45
|
+
{ id: "tool-keys", label: "Tool API keys", required: false, hint: "Context7, Jina, Groq voice, etc." },
|
|
46
|
+
{ id: "prefs", label: "Global preferences", required: false, hint: "Mode, profile, notifications" },
|
|
47
|
+
{ id: "skills", label: "Skills install", required: false, hint: "Browse and install skill plugins" },
|
|
48
|
+
{ id: "doctor", label: "Validate setup", required: false, hint: "Run provider doctor checks" },
|
|
49
|
+
{ id: "project", label: "Project init", required: false, hint: "Bootstrap .gsd/ in this repo" },
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
const STEP_INDEX = new Map(ONBOARDING_STEPS.map((s, i) => [s.id, i]))
|
|
53
|
+
|
|
54
|
+
export function getStep(id: string): OnboardingStepDef | undefined {
|
|
55
|
+
const idx = STEP_INDEX.get(id as OnboardingStepId)
|
|
56
|
+
return idx === undefined ? undefined : ONBOARDING_STEPS[idx]
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function isValidStepId(id: string): id is OnboardingStepId {
|
|
60
|
+
return STEP_INDEX.has(id as OnboardingStepId)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Given a possibly-stale resume point, return the nearest next step that is
|
|
65
|
+
* still defined in the catalog. Falls back to the first step.
|
|
66
|
+
*/
|
|
67
|
+
export function nearestResumeStep(lastResumePoint: string | null, completedSteps: string[]): OnboardingStepId {
|
|
68
|
+
const completed = new Set(completedSteps)
|
|
69
|
+
// First incomplete step at or after the lastResumePoint
|
|
70
|
+
let startIdx = 0
|
|
71
|
+
if (lastResumePoint && STEP_INDEX.has(lastResumePoint as OnboardingStepId)) {
|
|
72
|
+
startIdx = STEP_INDEX.get(lastResumePoint as OnboardingStepId) ?? 0
|
|
73
|
+
}
|
|
74
|
+
for (let i = startIdx; i < ONBOARDING_STEPS.length; i++) {
|
|
75
|
+
if (!completed.has(ONBOARDING_STEPS[i].id)) return ONBOARDING_STEPS[i].id
|
|
76
|
+
}
|
|
77
|
+
// Everything from the resume point is complete — try from the start
|
|
78
|
+
for (const step of ONBOARDING_STEPS) {
|
|
79
|
+
if (!completed.has(step.id)) return step.id
|
|
80
|
+
}
|
|
81
|
+
return ONBOARDING_STEPS[0].id
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ─── Provider catalog views ───────────────────────────────────────────────────
|
|
85
|
+
|
|
86
|
+
export function getLlmProviders(): ProviderInfo[] {
|
|
87
|
+
return PROVIDER_REGISTRY.filter(p => p.category === "llm")
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function getToolProviders(): ProviderInfo[] {
|
|
91
|
+
return PROVIDER_REGISTRY.filter(p => p.category === "tool")
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function getSearchProviders(): ProviderInfo[] {
|
|
95
|
+
return PROVIDER_REGISTRY.filter(p => p.category === "search")
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function getRemoteProviders(): ProviderInfo[] {
|
|
99
|
+
return PROVIDER_REGISTRY.filter(p => p.category === "remote")
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Provider IDs that count as "the user has an LLM configured" for shouldRunOnboarding. */
|
|
103
|
+
export function getLlmProviderIds(): string[] {
|
|
104
|
+
return Array.from(new Set([...getLlmProviders().map(p => p.id), "claude-code"]))
|
|
105
|
+
}
|
|
@@ -44,6 +44,8 @@ import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
|
44
44
|
import { debugCount, debugTime } from './debug-logger.js';
|
|
45
45
|
import { logWarning, logError } from './workflow-logger.js';
|
|
46
46
|
import { extractVerdict } from './verdict-parser.js';
|
|
47
|
+
import { loadEffectiveGSDPreferences } from './preferences.js';
|
|
48
|
+
import { detectPendingEscalation } from './escalation.js';
|
|
47
49
|
|
|
48
50
|
import {
|
|
49
51
|
isDbAvailable,
|
|
@@ -60,6 +62,7 @@ import {
|
|
|
60
62
|
updateSliceStatus,
|
|
61
63
|
updateTaskStatus,
|
|
62
64
|
getPendingGateCountForTurn,
|
|
65
|
+
autoHealSketchFlags,
|
|
63
66
|
type MilestoneRow,
|
|
64
67
|
type SliceRow,
|
|
65
68
|
type TaskRow,
|
|
@@ -610,7 +613,7 @@ async function handleAllSlicesDone(
|
|
|
610
613
|
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
611
614
|
const verdict = validationContent ? extractVerdict(validationContent) : undefined;
|
|
612
615
|
|
|
613
|
-
if (!validationTerminal
|
|
616
|
+
if (!validationTerminal) {
|
|
614
617
|
return {
|
|
615
618
|
activeMilestone, activeSlice: null, activeTask: null,
|
|
616
619
|
phase: 'validating-milestone',
|
|
@@ -621,6 +624,24 @@ async function handleAllSlicesDone(
|
|
|
621
624
|
};
|
|
622
625
|
}
|
|
623
626
|
|
|
627
|
+
// All roadmap slices are done (enforced by caller) and verdict is
|
|
628
|
+
// needs-remediation — remediation cannot progress without new slices.
|
|
629
|
+
// Return blocked instead of re-dispatching validate-milestone (#4506).
|
|
630
|
+
if (verdict === 'needs-remediation') {
|
|
631
|
+
return {
|
|
632
|
+
activeMilestone, activeSlice: null, activeTask: null,
|
|
633
|
+
phase: 'blocked',
|
|
634
|
+
recentDecisions: [],
|
|
635
|
+
blockers: [
|
|
636
|
+
`Milestone ${activeMilestone.id} validation verdict is needs-remediation but all slices are complete. ` +
|
|
637
|
+
`Add remediation slices via gsd_reassess_roadmap or override the verdict manually.`,
|
|
638
|
+
],
|
|
639
|
+
nextAction: `Resolve ${activeMilestone.id} remediation before proceeding.`,
|
|
640
|
+
registry, requirements,
|
|
641
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
|
|
624
645
|
return {
|
|
625
646
|
activeMilestone, activeSlice: null, activeTask: null,
|
|
626
647
|
phase: 'completing-milestone',
|
|
@@ -849,7 +870,15 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
849
870
|
return handleAllSlicesDone(basePath, activeMilestone, registry, requirements, milestoneProgress, sliceProgress);
|
|
850
871
|
}
|
|
851
872
|
|
|
852
|
-
|
|
873
|
+
// ADR-011 auto-heal: if a slice has a PLAN on disk but is still flagged is_sketch=1
|
|
874
|
+
// (e.g. a crash between plan-slice write and the sketch flip), reconcile before
|
|
875
|
+
// running phase derivation so the flag doesn't misroute state.
|
|
876
|
+
autoHealSketchFlags(activeMilestone.id, (sid) =>
|
|
877
|
+
!!resolveSliceFile(basePath, activeMilestone.id, sid, "PLAN"),
|
|
878
|
+
);
|
|
879
|
+
// Re-read slices after auto-heal so downstream reads see fresh is_sketch values.
|
|
880
|
+
const healedSlices = getMilestoneSlices(activeMilestone.id);
|
|
881
|
+
const activeSliceContext = resolveSliceDependencies(healedSlices);
|
|
853
882
|
if (!activeSliceContext.activeSlice) {
|
|
854
883
|
// If locked slice wasn't found, it returns null but logs warning, we need to return 'blocked'
|
|
855
884
|
if (process.env.GSD_SLICE_LOCK) {
|
|
@@ -869,10 +898,24 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
869
898
|
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
870
899
|
};
|
|
871
900
|
}
|
|
872
|
-
const { activeSlice } = activeSliceContext;
|
|
901
|
+
const { activeSlice, activeSliceRow } = activeSliceContext;
|
|
873
902
|
|
|
874
903
|
const planFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "PLAN");
|
|
875
904
|
if (!planFile) {
|
|
905
|
+
// ADR-011: sketch slices with progressive_planning enabled enter the
|
|
906
|
+
// `refining` phase — a refine-slice unit expands the sketch into a full plan
|
|
907
|
+
// before execution. When the flag is off, sketches are indistinguishable
|
|
908
|
+
// from a missing plan and fall through to the normal `planning` phase.
|
|
909
|
+
const progressive = loadEffectiveGSDPreferences()?.preferences?.phases?.progressive_planning === true;
|
|
910
|
+
if (progressive && activeSliceRow?.is_sketch === 1) {
|
|
911
|
+
return {
|
|
912
|
+
activeMilestone, activeSlice, activeTask: null,
|
|
913
|
+
phase: 'refining', recentDecisions: [], blockers: [],
|
|
914
|
+
nextAction: `Refine sketch slice ${activeSlice.id} (${activeSlice.title}) using prior slice context.`,
|
|
915
|
+
registry, requirements,
|
|
916
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
917
|
+
};
|
|
918
|
+
}
|
|
876
919
|
return {
|
|
877
920
|
activeMilestone, activeSlice, activeTask: null,
|
|
878
921
|
phase: 'planning', recentDecisions: [], blockers: [],
|
|
@@ -965,6 +1008,29 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
|
965
1008
|
}
|
|
966
1009
|
}
|
|
967
1010
|
|
|
1011
|
+
// ADR-011 Phase 2: pause-on-escalation takes precedence over dispatching the
|
|
1012
|
+
// next task. `awaiting_review` tasks (continueWithDefault=true) are NOT
|
|
1013
|
+
// surfaced here — they let the loop continue.
|
|
1014
|
+
//
|
|
1015
|
+
// We do NOT gate this on `phases.mid_execution_escalation` — creation of
|
|
1016
|
+
// new escalations is gated at the write site (tools/complete-task.ts:315),
|
|
1017
|
+
// but any escalation_pending row already persisted in the DB must be
|
|
1018
|
+
// honored even if the user later toggles the flag off. Otherwise those
|
|
1019
|
+
// rows would silently orphan, the loop would advance past the paused task,
|
|
1020
|
+
// and the user's prior resolution never lands.
|
|
1021
|
+
const escalatingTaskId = detectPendingEscalation(tasks, basePath);
|
|
1022
|
+
if (escalatingTaskId) {
|
|
1023
|
+
return {
|
|
1024
|
+
activeMilestone, activeSlice, activeTask,
|
|
1025
|
+
phase: 'escalating-task', recentDecisions: [],
|
|
1026
|
+
blockers: [`Task ${escalatingTaskId} requires a user decision before the loop can proceed`],
|
|
1027
|
+
nextAction: `Run /gsd escalate show ${escalatingTaskId} to review, then /gsd escalate resolve ${escalatingTaskId} <choice> to proceed.`,
|
|
1028
|
+
activeWorkspace: undefined,
|
|
1029
|
+
registry, requirements,
|
|
1030
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
1031
|
+
};
|
|
1032
|
+
}
|
|
1033
|
+
|
|
968
1034
|
if (!blockerTaskId) {
|
|
969
1035
|
const isTriggered = checkReplanTrigger(basePath, activeMilestone.id, activeSlice.id);
|
|
970
1036
|
if (isTriggered) {
|
|
@@ -1402,9 +1468,11 @@ export async function _deriveStateImpl(basePath: string): Promise<GSDState> {
|
|
|
1402
1468
|
total: activeRoadmap.slices.length,
|
|
1403
1469
|
};
|
|
1404
1470
|
|
|
1405
|
-
// Force re-validation when
|
|
1406
|
-
// may have completed since the stale validation was
|
|
1407
|
-
|
|
1471
|
+
// Force re-validation when VALIDATION.md is absent or non-terminal —
|
|
1472
|
+
// remediation slices may have completed since the stale validation was
|
|
1473
|
+
// written (#3596). But needs-remediation with all slices done is a dead
|
|
1474
|
+
// end — return blocked to avoid an infinite dispatch loop (#4506).
|
|
1475
|
+
if (!validationTerminal) {
|
|
1408
1476
|
return {
|
|
1409
1477
|
activeMilestone,
|
|
1410
1478
|
activeSlice: null,
|
|
@@ -1422,6 +1490,27 @@ export async function _deriveStateImpl(basePath: string): Promise<GSDState> {
|
|
|
1422
1490
|
};
|
|
1423
1491
|
}
|
|
1424
1492
|
|
|
1493
|
+
if (verdict === 'needs-remediation') {
|
|
1494
|
+
return {
|
|
1495
|
+
activeMilestone,
|
|
1496
|
+
activeSlice: null,
|
|
1497
|
+
activeTask: null,
|
|
1498
|
+
phase: 'blocked',
|
|
1499
|
+
recentDecisions: [],
|
|
1500
|
+
blockers: [
|
|
1501
|
+
`Milestone ${activeMilestone.id} validation verdict is needs-remediation but all slices are complete. ` +
|
|
1502
|
+
`Add remediation slices via gsd_reassess_roadmap or override the verdict manually.`,
|
|
1503
|
+
],
|
|
1504
|
+
nextAction: `Resolve ${activeMilestone.id} remediation before proceeding.`,
|
|
1505
|
+
registry,
|
|
1506
|
+
requirements,
|
|
1507
|
+
progress: {
|
|
1508
|
+
milestones: milestoneProgress,
|
|
1509
|
+
slices: sliceProgress,
|
|
1510
|
+
},
|
|
1511
|
+
};
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1425
1514
|
return {
|
|
1426
1515
|
activeMilestone,
|
|
1427
1516
|
activeSlice: null,
|
|
@@ -46,6 +46,8 @@ function makeSliceRow(overrides?: Partial<SliceRow>): SliceRow {
|
|
|
46
46
|
observability_impact: '',
|
|
47
47
|
sequence: 4,
|
|
48
48
|
replan_triggered_at: null,
|
|
49
|
+
is_sketch: 0,
|
|
50
|
+
sketch_scope: '',
|
|
49
51
|
...overrides,
|
|
50
52
|
};
|
|
51
53
|
}
|
|
@@ -77,6 +79,11 @@ function makeTaskRow(overrides?: Partial<TaskRow>): TaskRow {
|
|
|
77
79
|
expected_output: [],
|
|
78
80
|
observability_impact: '',
|
|
79
81
|
sequence: 0,
|
|
82
|
+
blocker_source: '',
|
|
83
|
+
escalation_pending: 0,
|
|
84
|
+
escalation_awaiting_review: 0,
|
|
85
|
+
escalation_artifact_path: null,
|
|
86
|
+
escalation_override_applied_at: null,
|
|
80
87
|
...overrides,
|
|
81
88
|
};
|
|
82
89
|
}
|
|
@@ -3,6 +3,7 @@ import assert from "node:assert/strict";
|
|
|
3
3
|
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
|
+
import { execFileSync } from "node:child_process";
|
|
6
7
|
|
|
7
8
|
import {
|
|
8
9
|
unitVerb,
|
|
@@ -15,6 +16,10 @@ import {
|
|
|
15
16
|
getWidgetMode,
|
|
16
17
|
cycleWidgetMode,
|
|
17
18
|
_resetWidgetModeForTests,
|
|
19
|
+
_resetLastCommitCacheForTests,
|
|
20
|
+
_refreshLastCommitForTests,
|
|
21
|
+
_getLastCommitForTests,
|
|
22
|
+
_getLastCommitFetchedAtForTests,
|
|
18
23
|
} from "../auto-dashboard.ts";
|
|
19
24
|
|
|
20
25
|
const autoSource = readFileSync(join(process.cwd(), "src", "resources", "extensions", "gsd", "auto.ts"), "utf-8");
|
|
@@ -215,6 +220,50 @@ test("auto progress widget renders RTK savings under the footer stats line", ()
|
|
|
215
220
|
assert.match(dashboardSource, /lines\.push\(rightAlign\("", theme\.fg\("dim", cachedRtkLabel\), width\)\);/);
|
|
216
221
|
});
|
|
217
222
|
|
|
223
|
+
test("last commit refresh backs off cleanly when base path is not a git repo", (t) => {
|
|
224
|
+
const dir = makeTempDir("non-git");
|
|
225
|
+
mkdirSync(dir, { recursive: true });
|
|
226
|
+
|
|
227
|
+
t.after(() => {
|
|
228
|
+
cleanup(dir);
|
|
229
|
+
_resetLastCommitCacheForTests();
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
_resetLastCommitCacheForTests();
|
|
233
|
+
_refreshLastCommitForTests(dir);
|
|
234
|
+
|
|
235
|
+
assert.equal(_getLastCommitForTests(dir), null);
|
|
236
|
+
assert.ok(
|
|
237
|
+
_getLastCommitFetchedAtForTests() > 0,
|
|
238
|
+
"non-git refresh should still advance fetchedAt to avoid render-loop retries",
|
|
239
|
+
);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test("last commit refresh still returns commit info for a valid git repo", (t) => {
|
|
243
|
+
const dir = makeTempDir("git");
|
|
244
|
+
mkdirSync(dir, { recursive: true });
|
|
245
|
+
|
|
246
|
+
execFileSync("git", ["init", "-b", "main"], { cwd: dir, stdio: "pipe" });
|
|
247
|
+
execFileSync("git", ["config", "user.name", "GSD Test"], { cwd: dir, stdio: "pipe" });
|
|
248
|
+
execFileSync("git", ["config", "user.email", "gsd@example.com"], { cwd: dir, stdio: "pipe" });
|
|
249
|
+
writeFileSync(join(dir, "README.md"), "hello\n", "utf-8");
|
|
250
|
+
execFileSync("git", ["add", "README.md"], { cwd: dir, stdio: "pipe" });
|
|
251
|
+
execFileSync("git", ["commit", "-m", "test: seed dashboard repo"], { cwd: dir, stdio: "pipe" });
|
|
252
|
+
|
|
253
|
+
t.after(() => {
|
|
254
|
+
cleanup(dir);
|
|
255
|
+
_resetLastCommitCacheForTests();
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
_resetLastCommitCacheForTests();
|
|
259
|
+
_refreshLastCommitForTests(dir);
|
|
260
|
+
|
|
261
|
+
const lastCommit = _getLastCommitForTests(dir);
|
|
262
|
+
assert.ok(lastCommit, "git repo should produce last commit metadata");
|
|
263
|
+
assert.match(lastCommit!.message, /test: seed dashboard repo/);
|
|
264
|
+
assert.ok(lastCommit!.timeAgo.length > 0, "relative time should be populated");
|
|
265
|
+
});
|
|
266
|
+
|
|
218
267
|
// ─── extractUatSliceId ───────────────────────────────────────────────────
|
|
219
268
|
|
|
220
269
|
test("extractUatSliceId extracts slice ID from M001/S01 format", () => {
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync, mkdirSync, writeFileSync, existsSync, rmSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
|
|
7
|
+
import { recoverFailedMigration } from "../migrate-external.ts";
|
|
8
|
+
|
|
9
|
+
// Regression tests for #4416: `.gsd.migrating` must be healed before auto-mode
|
|
10
|
+
// proceeds, including on the resume path in auto.ts (fixed at auto.ts:1325).
|
|
11
|
+
// The `recoverFailedMigration` function is already called in `auto-start.ts:350`
|
|
12
|
+
// for fresh-start sessions. The fix adds an identical call to `auto.ts:startAuto`
|
|
13
|
+
// so that resume sessions (triggered by a persisted paused-session.json) also heal
|
|
14
|
+
// a leftover `.gsd.migrating` directory before acquiring the session lock.
|
|
15
|
+
|
|
16
|
+
test("recoverFailedMigration renames .gsd.migrating to .gsd when .gsd is absent", (t) => {
|
|
17
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-migrating-recovery-"));
|
|
18
|
+
t.after(() => rmSync(base, { recursive: true, force: true }));
|
|
19
|
+
|
|
20
|
+
const migratingPath = join(base, ".gsd.migrating");
|
|
21
|
+
mkdirSync(join(migratingPath, "milestones"), { recursive: true });
|
|
22
|
+
|
|
23
|
+
const recovered = recoverFailedMigration(base);
|
|
24
|
+
|
|
25
|
+
assert.equal(recovered, true, "expected recovery to succeed");
|
|
26
|
+
assert.ok(existsSync(join(base, ".gsd")), ".gsd must exist after recovery");
|
|
27
|
+
assert.ok(!existsSync(migratingPath), ".gsd.migrating must not exist after recovery");
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("recoverFailedMigration returns false when .gsd.migrating is absent (nothing to do)", (t) => {
|
|
31
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-migrating-noop-"));
|
|
32
|
+
t.after(() => rmSync(base, { recursive: true, force: true }));
|
|
33
|
+
|
|
34
|
+
const recovered = recoverFailedMigration(base);
|
|
35
|
+
assert.equal(recovered, false, "no migration to recover");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("recoverFailedMigration returns false when both .gsd and .gsd.migrating exist (ambiguous)", (t) => {
|
|
39
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-migrating-ambig-"));
|
|
40
|
+
t.after(() => rmSync(base, { recursive: true, force: true }));
|
|
41
|
+
|
|
42
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
43
|
+
mkdirSync(join(base, ".gsd.migrating"), { recursive: true });
|
|
44
|
+
|
|
45
|
+
const recovered = recoverFailedMigration(base);
|
|
46
|
+
assert.equal(recovered, false, "should not touch ambiguous state");
|
|
47
|
+
assert.ok(existsSync(join(base, ".gsd")), ".gsd must still exist");
|
|
48
|
+
assert.ok(existsSync(join(base, ".gsd.migrating")), ".gsd.migrating must still exist");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("recoverFailedMigration preserves contents of .gsd.migrating", (t) => {
|
|
52
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-migrating-contents-"));
|
|
53
|
+
t.after(() => rmSync(base, { recursive: true, force: true }));
|
|
54
|
+
|
|
55
|
+
const migratingPath = join(base, ".gsd.migrating");
|
|
56
|
+
mkdirSync(join(migratingPath, "milestones", "M001"), { recursive: true });
|
|
57
|
+
writeFileSync(join(migratingPath, "milestones", "M001", "M001-ROADMAP.md"), "# M001\n");
|
|
58
|
+
|
|
59
|
+
recoverFailedMigration(base);
|
|
60
|
+
|
|
61
|
+
const roadmap = join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md");
|
|
62
|
+
assert.ok(existsSync(roadmap), "Milestone file must be accessible via .gsd after recovery");
|
|
63
|
+
});
|
|
@@ -7,7 +7,7 @@ import { fileURLToPath } from "node:url";
|
|
|
7
7
|
|
|
8
8
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
9
|
|
|
10
|
-
import { resolvePreferredModelConfig, resolveModelId } from "../auto-model-selection.js";
|
|
10
|
+
import { resolvePreferredModelConfig, resolveModelId, selectAndApplyModel } from "../auto-model-selection.js";
|
|
11
11
|
|
|
12
12
|
function makeTempDir(prefix: string): string {
|
|
13
13
|
return mkdtempSync(join(tmpdir(), prefix));
|
|
@@ -46,6 +46,7 @@ test("resolvePreferredModelConfig synthesizes heavy routing ceiling when models
|
|
|
46
46
|
assert.deepEqual(config, {
|
|
47
47
|
primary: "claude-opus-4-6",
|
|
48
48
|
fallbacks: [],
|
|
49
|
+
source: "synthesized",
|
|
49
50
|
});
|
|
50
51
|
} finally {
|
|
51
52
|
process.chdir(originalCwd);
|
|
@@ -88,6 +89,7 @@ test("resolvePreferredModelConfig falls back to auto start model when heavy tier
|
|
|
88
89
|
assert.deepEqual(config, {
|
|
89
90
|
primary: "openai/gpt-5.4",
|
|
90
91
|
fallbacks: [],
|
|
92
|
+
source: "synthesized",
|
|
91
93
|
});
|
|
92
94
|
} finally {
|
|
93
95
|
process.chdir(originalCwd);
|
|
@@ -131,6 +133,7 @@ test("resolvePreferredModelConfig keeps explicit phase models as the ceiling", (
|
|
|
131
133
|
assert.deepEqual(config, {
|
|
132
134
|
primary: "claude-sonnet-4-6",
|
|
133
135
|
fallbacks: [],
|
|
136
|
+
source: "explicit",
|
|
134
137
|
});
|
|
135
138
|
} finally {
|
|
136
139
|
process.chdir(originalCwd);
|
|
@@ -141,6 +144,85 @@ test("resolvePreferredModelConfig keeps explicit phase models as the ceiling", (
|
|
|
141
144
|
}
|
|
142
145
|
});
|
|
143
146
|
|
|
147
|
+
test("selectAndApplyModel honors explicit phase models without downgrading (#3617)", async () => {
|
|
148
|
+
const originalCwd = process.cwd();
|
|
149
|
+
const originalGsdHome = process.env.GSD_HOME;
|
|
150
|
+
const tempProject = makeTempDir("gsd-routing-project-");
|
|
151
|
+
const tempGsdHome = makeTempDir("gsd-routing-home-");
|
|
152
|
+
const setModelCalls: string[] = [];
|
|
153
|
+
let beforeModelSelectCalled = false;
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
mkdirSync(join(tempProject, ".gsd"), { recursive: true });
|
|
157
|
+
writeFileSync(
|
|
158
|
+
join(tempProject, ".gsd", "PREFERENCES.md"),
|
|
159
|
+
[
|
|
160
|
+
"---",
|
|
161
|
+
"models:",
|
|
162
|
+
" planning: claude-opus-4-6",
|
|
163
|
+
"dynamic_routing:",
|
|
164
|
+
" enabled: true",
|
|
165
|
+
" tier_models:",
|
|
166
|
+
" light: gpt-4o-mini",
|
|
167
|
+
" standard: claude-sonnet-4-6",
|
|
168
|
+
" heavy: claude-opus-4-6",
|
|
169
|
+
"---",
|
|
170
|
+
].join("\n"),
|
|
171
|
+
"utf-8",
|
|
172
|
+
);
|
|
173
|
+
process.env.GSD_HOME = tempGsdHome;
|
|
174
|
+
process.chdir(tempProject);
|
|
175
|
+
|
|
176
|
+
const availableModels = [
|
|
177
|
+
{ id: "claude-opus-4-6", provider: "anthropic", api: "anthropic-messages" },
|
|
178
|
+
{ id: "claude-sonnet-4-6", provider: "anthropic", api: "anthropic-messages" },
|
|
179
|
+
{ id: "gpt-4o-mini", provider: "openai", api: "responses" },
|
|
180
|
+
];
|
|
181
|
+
|
|
182
|
+
const result = await selectAndApplyModel(
|
|
183
|
+
{
|
|
184
|
+
modelRegistry: { getAvailable: () => availableModels },
|
|
185
|
+
sessionManager: { getSessionId: () => "test-session" },
|
|
186
|
+
ui: { notify: () => {} },
|
|
187
|
+
model: { provider: "anthropic", id: "claude-opus-4-6", api: "anthropic-messages" },
|
|
188
|
+
} as any,
|
|
189
|
+
{
|
|
190
|
+
setModel: async (model: { provider: string; id: string }) => {
|
|
191
|
+
setModelCalls.push(`${model.provider}/${model.id}`);
|
|
192
|
+
return true;
|
|
193
|
+
},
|
|
194
|
+
emitBeforeModelSelect: async () => {
|
|
195
|
+
beforeModelSelectCalled = true;
|
|
196
|
+
return undefined;
|
|
197
|
+
},
|
|
198
|
+
getActiveTools: () => [],
|
|
199
|
+
emitAdjustToolSet: async () => undefined,
|
|
200
|
+
setActiveTools: () => {},
|
|
201
|
+
} as any,
|
|
202
|
+
"plan-slice",
|
|
203
|
+
"slice-1",
|
|
204
|
+
tempProject,
|
|
205
|
+
undefined,
|
|
206
|
+
false,
|
|
207
|
+
{ provider: "anthropic", id: "claude-opus-4-6" },
|
|
208
|
+
undefined,
|
|
209
|
+
true,
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
assert.equal(beforeModelSelectCalled, false, "explicit phase models should skip dynamic routing hooks");
|
|
213
|
+
assert.deepEqual(setModelCalls, ["anthropic/claude-opus-4-6"]);
|
|
214
|
+
assert.equal(result.routing, null, "explicit phase models should not record a routing downgrade");
|
|
215
|
+
assert.equal(result.appliedModel?.provider, "anthropic");
|
|
216
|
+
assert.equal(result.appliedModel?.id, "claude-opus-4-6");
|
|
217
|
+
} finally {
|
|
218
|
+
process.chdir(originalCwd);
|
|
219
|
+
if (originalGsdHome === undefined) delete process.env.GSD_HOME;
|
|
220
|
+
else process.env.GSD_HOME = originalGsdHome;
|
|
221
|
+
rmSync(tempProject, { recursive: true, force: true });
|
|
222
|
+
rmSync(tempGsdHome, { recursive: true, force: true });
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
|
|
144
226
|
// ─── resolveModelId tests ─────────────────────────────────────────────────
|
|
145
227
|
|
|
146
228
|
test("resolveModelId: bare ID resolves to claude-code when session is claude-code (#3772)", () => {
|
|
@@ -247,6 +329,18 @@ test("model policy receives task metadata for requirement-vector decisions", ()
|
|
|
247
329
|
);
|
|
248
330
|
});
|
|
249
331
|
|
|
332
|
+
test("dynamic routing passes provider-qualified model keys to the router", () => {
|
|
333
|
+
const src = readFileSync(join(__dirname, "..", "auto-model-selection.ts"), "utf-8");
|
|
334
|
+
assert.ok(
|
|
335
|
+
src.includes("routingEligibleModels.map(m => `${m.provider}/${m.id}`)"),
|
|
336
|
+
"selectAndApplyModel should preserve provider prefixes for dynamic routing candidates",
|
|
337
|
+
);
|
|
338
|
+
assert.ok(
|
|
339
|
+
!src.includes("routingEligibleModels.map(m => m.id)"),
|
|
340
|
+
"selectAndApplyModel must not strip providers before resolving tier_models",
|
|
341
|
+
);
|
|
342
|
+
});
|
|
343
|
+
|
|
250
344
|
test("resolveModelId: anthropic wins over claude-code when session provider is not claude-code", () => {
|
|
251
345
|
const availableModels = [
|
|
252
346
|
{ id: "claude-sonnet-4-6", provider: "claude-code" },
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
|
|
7
|
+
import { buildSourceFilePaths } from "../auto-prompts.ts";
|
|
8
|
+
|
|
9
|
+
// Regression test for #4416: the fallback string must not mention `rg` because
|
|
10
|
+
// auto-mode runs on systems where ripgrep is not installed (e.g. Windows).
|
|
11
|
+
test("buildSourceFilePaths fallback does not reference rg or ripgrep", (t) => {
|
|
12
|
+
const tmp = mkdtempSync(join(tmpdir(), "gsd-prompts-fallback-"));
|
|
13
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
14
|
+
|
|
15
|
+
// No GSD files exist in tmp — forces the fallback branch.
|
|
16
|
+
const result = buildSourceFilePaths(tmp, "M001");
|
|
17
|
+
|
|
18
|
+
assert.ok(
|
|
19
|
+
!result.includes("rg ") && !result.includes("`rg`") && !result.includes("ripgrep"),
|
|
20
|
+
`Fallback string must not reference rg/ripgrep. Got: ${result}`,
|
|
21
|
+
);
|
|
22
|
+
assert.ok(result.length > 0, "Fallback string must not be empty");
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test("buildSourceFilePaths with sid also produces rg-free fallback", (t) => {
|
|
26
|
+
const tmp = mkdtempSync(join(tmpdir(), "gsd-prompts-fallback-sid-"));
|
|
27
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
28
|
+
|
|
29
|
+
const result = buildSourceFilePaths(tmp, "M001", "S01");
|
|
30
|
+
|
|
31
|
+
assert.ok(
|
|
32
|
+
!result.includes("rg ") && !result.includes("`rg`") && !result.includes("ripgrep"),
|
|
33
|
+
`Fallback string must not reference rg/ripgrep. Got: ${result}`,
|
|
34
|
+
);
|
|
35
|
+
});
|