gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.2203010a0
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 +186 -149
- package/dist/claude-cli-check.d.ts +10 -0
- package/dist/claude-cli-check.js +13 -3
- package/dist/headless-events.d.ts +1 -1
- package/dist/headless-events.js +5 -2
- package/dist/headless.js +5 -6
- package/dist/loader.js +0 -0
- package/dist/onboarding.d.ts +15 -0
- package/dist/onboarding.js +94 -36
- package/dist/resources/extensions/ask-user-questions.js +17 -5
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
- package/dist/resources/extensions/gsd/auto/loop.js +67 -4
- package/dist/resources/extensions/gsd/auto/phases.js +70 -47
- package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
- package/dist/resources/extensions/gsd/auto/session.js +5 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +15 -7
- package/dist/resources/extensions/gsd/auto-dispatch.js +112 -6
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +10 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +173 -39
- package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
- package/dist/resources/extensions/gsd/auto-start.js +5 -3
- package/dist/resources/extensions/gsd/auto-verification.js +3 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +55 -1
- package/dist/resources/extensions/gsd/auto.js +57 -25
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +22 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
- package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
- package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
- package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +175 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +16 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
- package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
- package/dist/resources/extensions/gsd/commands-config.js +5 -0
- package/dist/resources/extensions/gsd/commands-debug.js +388 -0
- package/dist/resources/extensions/gsd/commands-do.js +1 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +233 -75
- package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
- package/dist/resources/extensions/gsd/commands-scan.js +94 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
- package/dist/resources/extensions/gsd/db-writer.js +1 -0
- package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
- package/dist/resources/extensions/gsd/definition-loader.js +7 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
- package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
- package/dist/resources/extensions/gsd/doctor.js +7 -1
- package/dist/resources/extensions/gsd/error-classifier.js +6 -3
- package/dist/resources/extensions/gsd/escalation.js +321 -0
- package/dist/resources/extensions/gsd/forensics.js +26 -29
- package/dist/resources/extensions/gsd/git-service.js +0 -1
- package/dist/resources/extensions/gsd/graph.js +26 -2
- package/dist/resources/extensions/gsd/gsd-db.js +254 -29
- 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/init-wizard.js +86 -45
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
- package/dist/resources/extensions/gsd/metrics.js +1 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
- package/dist/resources/extensions/gsd/model-router.js +7 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
- package/dist/resources/extensions/gsd/notification-widget.js +24 -39
- package/dist/resources/extensions/gsd/notifications.js +4 -0
- 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 +97 -4
- 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/preferences.js +10 -10
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
- package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/dist/resources/extensions/gsd/python-resolver.js +70 -0
- package/dist/resources/extensions/gsd/run-manager.js +37 -17
- package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
- package/dist/resources/extensions/gsd/state.js +47 -3
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +80 -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/uok/flags.js +7 -7
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/verification-gate.js +2 -1
- package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
- package/dist/resources/extensions/gsd/workflow-install.js +327 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
- package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
- package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
- package/dist/resources/extensions/remote-questions/commands.js +380 -0
- package/dist/resources/extensions/remote-questions/manager.js +39 -5
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
- package/dist/resources/extensions/shared/interview-ui.js +189 -1
- package/dist/resources/extensions/shared/layout-utils.js +17 -0
- package/dist/resources/extensions/shared/rtk-shared.js +47 -0
- package/dist/resources/extensions/shared/rtk.js +3 -46
- package/dist/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/rtk-shared.d.ts +10 -0
- package/dist/rtk-shared.js +47 -0
- package/dist/rtk.d.ts +2 -6
- package/dist/rtk.js +3 -48
- package/dist/shared/workspace-types.d.ts +52 -0
- package/dist/shared/workspace-types.js +1 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +10 -0
- package/dist/update-check.js +24 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
- 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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.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 +16 -16
- 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.e59e8578e2e28639.js +9 -0
- 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-b868033a5834586d.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/dist/wizard.js +2 -2
- package/dist/worktree-cli.d.ts +6 -5
- package/dist/worktree-cli.js +23 -7
- package/package.json +3 -3
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +3 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/groq.js +0 -153
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
- 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/openrouter.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +17 -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 -6
- 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-shared.d.ts +20 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.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 +18 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- 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 +50 -0
- package/packages/pi-ai/src/models/capability-patches.ts +5 -2
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
- package/packages/pi-ai/src/models/generated/groq.ts +0 -153
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +17 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
- package/packages/pi-ai/src/providers/anthropic.ts +19 -1
- 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/core/agent-session-abort-order.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -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 +34 -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 +74 -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/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/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
- package/packages/pi-coding-agent/dist/core/skill-tool.test.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 +70 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
- 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 +1 -75
- 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 +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 +192 -24
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
- 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 +83 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +1 -75
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +192 -24
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/src/resources/extensions/ask-user-questions.ts +24 -6
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/loop.ts +109 -3
- package/src/resources/extensions/gsd/auto/phases.ts +94 -60
- package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
- package/src/resources/extensions/gsd/auto/session.ts +7 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +123 -5
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +13 -2
- package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +201 -40
- package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
- package/src/resources/extensions/gsd/auto-start.ts +8 -6
- package/src/resources/extensions/gsd/auto-verification.ts +3 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
- package/src/resources/extensions/gsd/auto.ts +61 -28
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
- package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
- package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
- package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +229 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +16 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
- package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
- package/src/resources/extensions/gsd/commands-config.ts +10 -0
- package/src/resources/extensions/gsd/commands-debug.ts +484 -0
- package/src/resources/extensions/gsd/commands-do.ts +1 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
- package/src/resources/extensions/gsd/commands-scan.ts +125 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
- package/src/resources/extensions/gsd/db-writer.ts +3 -0
- package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
- package/src/resources/extensions/gsd/definition-loader.ts +7 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
- package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/error-classifier.ts +6 -3
- package/src/resources/extensions/gsd/escalation.ts +367 -0
- package/src/resources/extensions/gsd/forensics.ts +25 -29
- package/src/resources/extensions/gsd/git-service.ts +0 -1
- package/src/resources/extensions/gsd/graph.ts +33 -3
- package/src/resources/extensions/gsd/gsd-db.ts +306 -29
- 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/init-wizard.ts +87 -54
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
- package/src/resources/extensions/gsd/metrics.ts +1 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
- package/src/resources/extensions/gsd/model-router.ts +15 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
- package/src/resources/extensions/gsd/notification-widget.ts +25 -43
- package/src/resources/extensions/gsd/notifications.ts +6 -0
- 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 +98 -8
- package/src/resources/extensions/gsd/preferences-models.ts +1 -0
- package/src/resources/extensions/gsd/preferences-types.ts +10 -2
- package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
- package/src/resources/extensions/gsd/preferences.ts +10 -10
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/src/resources/extensions/gsd/prompts/scan.md +79 -0
- package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/src/resources/extensions/gsd/python-resolver.ts +76 -0
- package/src/resources/extensions/gsd/run-manager.ts +53 -19
- package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
- package/src/resources/extensions/gsd/state.ts +50 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
- 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/autocomplete-regressions-1675.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
- package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
- 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/debug-command-handler.test.ts +905 -0
- package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
- package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
- 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.test.ts +39 -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 +68 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
- 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/journal-integration.test.ts +171 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- 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 +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
- 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 +275 -6
- package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -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 +27 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
- 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/remote-notification-from-desktop.test.ts +107 -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/slice-context-injection.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -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 +31 -1
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
- 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/plan-milestone.ts +42 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
- package/src/resources/extensions/gsd/types.ts +62 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
- package/src/resources/extensions/gsd/uok/flags.ts +7 -7
- package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
- package/src/resources/extensions/gsd/verification-gate.ts +2 -1
- package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
- package/src/resources/extensions/gsd/workflow-install.ts +423 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
- package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
- package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
- package/src/resources/extensions/gsd/workspace-index.ts +9 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
- package/src/resources/extensions/remote-questions/commands.ts +480 -0
- package/src/resources/extensions/remote-questions/manager.ts +49 -4
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
- package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
- package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
- package/src/resources/extensions/shared/interview-ui.ts +195 -1
- package/src/resources/extensions/shared/layout-utils.ts +26 -0
- package/src/resources/extensions/shared/rtk-shared.ts +58 -0
- package/src/resources/extensions/shared/rtk.ts +12 -52
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
- package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
- package/src/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/dist/ps/types.d.ts +0 -5
- package/packages/native/dist/ps/types.js +0 -2
- package/packages/native/src/ps/types.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
- package/packages/pi-ai/oauth.d.ts +0 -1
- package/packages/pi-ai/oauth.js +0 -1
- /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → 8FZqxNe9FxQDmsbRzR8tA}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → 8FZqxNe9FxQDmsbRzR8tA}/_ssgManifest.js +0 -0
|
@@ -78,6 +78,18 @@ Apply these when decomposing and ordering slices:
|
|
|
78
78
|
- **Ambition matches the milestone.** The number and depth of slices should match the milestone's ambition. A milestone promising "core platform with auth, data model, and primary user loop" should have enough slices to actually deliver all three as working features — not two proof-of-concept slices and a note that "the rest will come in the next milestone." If the milestone's context promises an outcome, the roadmap must deliver it.
|
|
79
79
|
- **Right-size the decomposition.** Match slice count to actual complexity. If the work is small enough to build and verify in one pass, it's one slice — don't split it into three just because you can identify sub-steps. Multiple requirements can share a single slice. Conversely, don't cram genuinely independent capabilities into one slice just to keep the count low. Let the work dictate the structure.
|
|
80
80
|
|
|
81
|
+
## Progressive Planning (ADR-011)
|
|
82
|
+
|
|
83
|
+
If the preference `phases.progressive_planning` is enabled and the roadmap has **2 or more slices**, you SHOULD plan S01 in full detail and S02+ as sketches. Plan S02+ full only when the slice is trivially determined (pure boilerplate that cannot meaningfully change based on what S01 ships).
|
|
84
|
+
|
|
85
|
+
A **sketch slice** has the same roadmap entry as today (title, risk, depends, demo line) plus a `sketchScope` of 2–3 sentences describing the scope boundary. Do NOT attempt to decompose it into tasks during this unit — provide a one-sentence `goal` (the tool schema requires it; keep it at the same level of detail as the roadmap demo line) and leave `successCriteria`, `proofLevel`, `integrationClosure`, `observabilityImpact` blank (or provide them if genuinely known). When the prior slice completes, a separate `refine-slice` unit will expand the sketch into a full plan using the real codebase state and the prior slice SUMMARY.
|
|
86
|
+
|
|
87
|
+
**To mark a slice as a sketch in the `gsd_plan_milestone` tool call:** set `isSketch: true` and `sketchScope: "<2-3 sentence scope>"` on that slice entry.
|
|
88
|
+
|
|
89
|
+
S01 is never a sketch — it must always be fully decomposed in this unit.
|
|
90
|
+
|
|
91
|
+
If the preference is off, ignore this section and plan every slice in full detail as you would normally.
|
|
92
|
+
|
|
81
93
|
## Single-Slice Fast Path
|
|
82
94
|
|
|
83
95
|
If the roadmap has only one slice, also plan the slice and its tasks inline during this unit — don't leave them for a separate planning session.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
You are executing GSD auto-mode.
|
|
2
|
+
|
|
3
|
+
## UNIT: Refine Slice {{sliceId}} ("{{sliceTitle}}") — Milestone {{milestoneId}}
|
|
4
|
+
|
|
5
|
+
## Working Directory
|
|
6
|
+
|
|
7
|
+
Your working directory is `{{workingDirectory}}`. All file reads, writes, and shell commands MUST operate relative to this directory. Do NOT `cd` to any other directory.
|
|
8
|
+
|
|
9
|
+
This unit **expands an approved sketch into a full plan**. It is not a blank-sheet planning pass — the sketch's scope is the authoritative boundary, and the prior slice's real outcomes are the authoritative context. Your job is to produce a detailed plan that fits inside the sketch while reflecting what actually shipped in earlier slices.
|
|
10
|
+
|
|
11
|
+
All relevant context has been preloaded below — start working immediately without re-reading these files.
|
|
12
|
+
|
|
13
|
+
{{inlinedContext}}
|
|
14
|
+
|
|
15
|
+
### Dependency Slice Summaries
|
|
16
|
+
|
|
17
|
+
Pay particular attention to **Forward Intelligence** sections — they contain hard-won knowledge about what's fragile, what assumptions changed, and what this slice should watch out for. These summaries are the single most important input to refinement: the sketch was written before these slices shipped, so your plan MUST reconcile against what they actually built.
|
|
18
|
+
|
|
19
|
+
{{dependencySummaries}}
|
|
20
|
+
|
|
21
|
+
## Your Role in the Pipeline
|
|
22
|
+
|
|
23
|
+
### Respect the Sketch Scope
|
|
24
|
+
|
|
25
|
+
The sketch scope inlined above is a **hard constraint**. Plan within it. If, after exploring the codebase, the scope is too narrow to deliver the goal, surface this as a deviation in the plan's narrative and still produce the plan — do not silently expand the scope.
|
|
26
|
+
|
|
27
|
+
### Reconcile Against Reality
|
|
28
|
+
|
|
29
|
+
Before decomposing:
|
|
30
|
+
|
|
31
|
+
1. Read the prior slice SUMMARY files that were inlined above. Note any interface shifts, file-layout changes, or discovered constraints.
|
|
32
|
+
2. Use `rg`, `find`, and targeted reads to confirm the current codebase state for files the sketch references. If an assumed module/type/API has moved or changed shape, your plan must reflect that.
|
|
33
|
+
3. If prior slices flagged fragility or known issues relevant to this slice, fold them into task verification.
|
|
34
|
+
|
|
35
|
+
### Source Files
|
|
36
|
+
|
|
37
|
+
{{sourceFilePaths}}
|
|
38
|
+
|
|
39
|
+
If slice research exists (inlined above), trust those findings and skip redundant exploration.
|
|
40
|
+
|
|
41
|
+
After you finish, **executor agents** implement each task in isolated fresh context windows. They see only their task plan, the slice plan excerpt, and compressed summaries of prior tasks. Everything an executor needs must be in the task plan itself — file paths, specific steps, expected inputs and outputs.
|
|
42
|
+
|
|
43
|
+
Narrate your decomposition reasoning in complete sentences. Explain what the sketch promised, what prior slices changed, and how those two inputs shape the decomposition. Keep narration proportional to the work.
|
|
44
|
+
|
|
45
|
+
**Right-size the plan.** If the slice is simple enough to be 1 task, plan 1 task. Don't fill in sections with "None" — omit them entirely.
|
|
46
|
+
|
|
47
|
+
{{executorContextConstraints}}
|
|
48
|
+
|
|
49
|
+
Then:
|
|
50
|
+
0. If `REQUIREMENTS.md` was preloaded above, identify which Active requirements the sketch says this slice owns or supports. Every owned requirement needs at least one task that directly advances it.
|
|
51
|
+
1. Read the templates:
|
|
52
|
+
- `~/.gsd/agent/extensions/gsd/templates/plan.md`
|
|
53
|
+
- `~/.gsd/agent/extensions/gsd/templates/task-plan.md`
|
|
54
|
+
2. {{skillActivation}} Record the installed skills you expect executors to use in each task plan's `skills_used` frontmatter.
|
|
55
|
+
3. Define slice-level verification — the objective stopping condition. Plan real test files with real assertions; for simple slices, executable commands are fine.
|
|
56
|
+
4. For non-trivial slices, plan observability / proof level / integration closure, threat surface, and requirement impact. Omit entirely for simple slices.
|
|
57
|
+
5. Decompose the slice into tasks that fit one context window each. Every task must have Why / Files / Do / Verify / Done-when, plus a task plan with description, steps, must-haves, verification, inputs (backtick-wrapped paths), and expected output (backtick-wrapped paths).
|
|
58
|
+
6. **Persist planning state through `gsd_plan_slice`.** Call it with the full payload. The tool writes to the DB and renders `{{outputPath}}` and `{{slicePath}}/tasks/T##-PLAN.md` automatically. Do NOT rely on direct `PLAN.md` writes.
|
|
59
|
+
7. **Self-audit the plan.** If every task were completed exactly as written, the slice goal/demo should actually be true. Every must-have maps to at least one task. Inputs and Expected Output are backtick-wrapped file paths.
|
|
60
|
+
8. If refinement produced structural decisions that diverge from the sketch, append them to `.gsd/DECISIONS.md`.
|
|
61
|
+
9. {{commitInstruction}}
|
|
62
|
+
|
|
63
|
+
The slice directory and tasks/ subdirectory already exist. Do NOT mkdir.
|
|
64
|
+
|
|
65
|
+
**Autonomous execution:** Do not call `ask_user_questions` or `secure_env_collect`. Document assumptions in the plan.
|
|
66
|
+
|
|
67
|
+
**You MUST call `gsd_plan_slice` to persist the planning state before finishing.** After it returns successfully, the pipeline will automatically clear the sketch flag on the next state derivation (the on-disk PLAN file is the signal).
|
|
68
|
+
|
|
69
|
+
When done, say: "Slice {{sliceId}} refined."
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
You are performing a focused codebase scan.
|
|
2
|
+
|
|
3
|
+
## Scan Parameters
|
|
4
|
+
|
|
5
|
+
- **Focus:** {{focus}}
|
|
6
|
+
- **Documents to produce:** {{documents}}
|
|
7
|
+
- **Output directory:** `{{outputDir}}`
|
|
8
|
+
|
|
9
|
+
## Working Directory
|
|
10
|
+
|
|
11
|
+
`{{workingDirectory}}`
|
|
12
|
+
|
|
13
|
+
## Instructions
|
|
14
|
+
|
|
15
|
+
1. Explore the codebase to understand its structure, technology choices, and patterns
|
|
16
|
+
2. For each document listed above, produce a well-structured Markdown file in `{{outputDir}}/`
|
|
17
|
+
3. Use the document schemas below as a guide for each output file
|
|
18
|
+
|
|
19
|
+
For this scan, only these documents are relevant: **{{documents}}**. Refer only to those schemas below and ignore the rest.
|
|
20
|
+
|
|
21
|
+
### Document Schemas
|
|
22
|
+
|
|
23
|
+
**STACK.md** — Technology stack overview
|
|
24
|
+
- Languages, runtimes, and versions
|
|
25
|
+
- Key frameworks and libraries (with versions where visible)
|
|
26
|
+
- Build tools and bundlers
|
|
27
|
+
- Package manager
|
|
28
|
+
|
|
29
|
+
**INTEGRATIONS.md** — External dependencies and integrations
|
|
30
|
+
- Third-party APIs and services
|
|
31
|
+
- Database systems
|
|
32
|
+
- Authentication providers
|
|
33
|
+
- Infrastructure and deployment platforms
|
|
34
|
+
- Communication services (email, messaging, etc.)
|
|
35
|
+
|
|
36
|
+
**ARCHITECTURE.md** — Architectural patterns and design decisions
|
|
37
|
+
- Overall architecture style (monolith, microservices, monorepo, etc.)
|
|
38
|
+
- Core data flow
|
|
39
|
+
- Key design patterns in use
|
|
40
|
+
- Module/package boundaries
|
|
41
|
+
|
|
42
|
+
**STRUCTURE.md** — Directory and code organization
|
|
43
|
+
- Top-level directory layout with purpose
|
|
44
|
+
- Source code organization
|
|
45
|
+
- Test organization
|
|
46
|
+
- Configuration file locations
|
|
47
|
+
|
|
48
|
+
**CONVENTIONS.md** — Coding conventions and standards
|
|
49
|
+
- Naming conventions (files, functions, variables)
|
|
50
|
+
- Code style and formatting rules
|
|
51
|
+
- Import/export patterns
|
|
52
|
+
- Error handling patterns
|
|
53
|
+
- TypeScript/language-specific conventions
|
|
54
|
+
|
|
55
|
+
**TESTING.md** — Testing patterns and practices
|
|
56
|
+
- Test framework(s) in use
|
|
57
|
+
- Test file naming and location conventions
|
|
58
|
+
- Test helper and fixture patterns
|
|
59
|
+
- Coverage requirements (if any)
|
|
60
|
+
- How to run tests
|
|
61
|
+
|
|
62
|
+
**CONCERNS.md** — Technical debt and risks
|
|
63
|
+
- Known areas of technical debt
|
|
64
|
+
- Fragile or high-risk code areas
|
|
65
|
+
- Missing test coverage
|
|
66
|
+
- Outdated dependencies
|
|
67
|
+
- Performance bottlenecks
|
|
68
|
+
- Security considerations
|
|
69
|
+
|
|
70
|
+
## Rules
|
|
71
|
+
|
|
72
|
+
- Write only the documents listed in **Documents to produce** — do not generate extra files
|
|
73
|
+
- Each document must be a clean, standalone Markdown file starting with a `# Heading`
|
|
74
|
+
- Be factual: report what you observe in the code, not what might be ideal
|
|
75
|
+
- Keep each document focused and scannable — use headers, bullet points, and code snippets
|
|
76
|
+
- Do NOT modify any source files
|
|
77
|
+
- After writing all documents, summarize what was produced (file names and line counts)
|
|
78
|
+
|
|
79
|
+
{{skillActivation}}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Oneshot Workflow: {{displayName}}
|
|
2
|
+
|
|
3
|
+
You are running a **oneshot** workflow called `{{name}}`. Oneshot workflows are
|
|
4
|
+
prompt-only — there is no STATE.json, no phase tracking, no artifact directory,
|
|
5
|
+
and no resume mechanism. Just execute the instructions below and return.
|
|
6
|
+
|
|
7
|
+
## User Arguments
|
|
8
|
+
|
|
9
|
+
`{{userArgs}}`
|
|
10
|
+
|
|
11
|
+
(If empty, use sensible defaults from the workflow body.)
|
|
12
|
+
|
|
13
|
+
## Workflow Instructions
|
|
14
|
+
|
|
15
|
+
{{body}}
|
|
16
|
+
|
|
17
|
+
## Execution Rules
|
|
18
|
+
|
|
19
|
+
1. **No scaffolding.** Do not create `.gsd/workflows/` directories, STATE.json
|
|
20
|
+
files, or run directories unless the instructions explicitly tell you to
|
|
21
|
+
write a specific artifact.
|
|
22
|
+
2. **No branch switching.** Work on the current branch.
|
|
23
|
+
3. **Be concise.** Oneshot workflows produce a single focused output (a report,
|
|
24
|
+
a summary, a code change, a PR comment) — finish in this turn.
|
|
25
|
+
4. **Ask only when blocked.** If the instructions need information you can't
|
|
26
|
+
discover, ask one clear question. Otherwise proceed.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform Python interpreter resolver.
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities to detect the available Python interpreter on the current
|
|
5
|
+
* system and to normalize shell commands that reference `python`/`python3` so
|
|
6
|
+
* that they use whichever interpreter is actually installed.
|
|
7
|
+
*
|
|
8
|
+
* On Windows the canonical names differ (`py -3`, `python`, `python3`), so
|
|
9
|
+
* hard-coded `python3` invocations fail with exit 127. This module detects the
|
|
10
|
+
* working interpreter once (cached for the process lifetime) and rewrites
|
|
11
|
+
* commands accordingly.
|
|
12
|
+
*
|
|
13
|
+
* @module python-resolver
|
|
14
|
+
*/
|
|
15
|
+
import { spawnSync } from "node:child_process";
|
|
16
|
+
/** Cached result of `detectPythonExecutable`. `undefined` means not yet probed. */
|
|
17
|
+
let cached;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the first working Python invocation on this system, or `null` if no
|
|
20
|
+
* Python interpreter is found.
|
|
21
|
+
*
|
|
22
|
+
* Probe order:
|
|
23
|
+
* - Windows: `py -3` → `python` → `python3`
|
|
24
|
+
* - All other platforms: `python3` → `python`
|
|
25
|
+
*
|
|
26
|
+
* The result is cached for the lifetime of the process to avoid repeated
|
|
27
|
+
* `spawnSync` calls.
|
|
28
|
+
*/
|
|
29
|
+
export function detectPythonExecutable() {
|
|
30
|
+
if (cached !== undefined)
|
|
31
|
+
return cached;
|
|
32
|
+
const candidates = process.platform === "win32"
|
|
33
|
+
? ["py -3", "python", "python3"]
|
|
34
|
+
: ["python3", "python"];
|
|
35
|
+
for (const candidate of candidates) {
|
|
36
|
+
const [bin, ...args] = candidate.split(" ");
|
|
37
|
+
const r = spawnSync(bin, [...args, "--version"], { stdio: "ignore" });
|
|
38
|
+
if (!r.error && r.status === 0) {
|
|
39
|
+
cached = candidate;
|
|
40
|
+
return candidate;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
cached = null;
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Rewrites a shell command string so that leading `python`/`python3`/`py`
|
|
48
|
+
* tokens at command boundaries are replaced with the interpreter returned by
|
|
49
|
+
* `detectPythonExecutable`.
|
|
50
|
+
*
|
|
51
|
+
* Only tokens at command boundaries (start of string, or after `&&`, `||`,
|
|
52
|
+
* `;`) are rewritten — mid-string occurrences (e.g. file paths containing
|
|
53
|
+
* "python") are left intact.
|
|
54
|
+
*
|
|
55
|
+
* When no Python interpreter is detected, the command is returned unchanged so
|
|
56
|
+
* that the caller receives a meaningful "command not found" error rather than a
|
|
57
|
+
* silent no-op.
|
|
58
|
+
*
|
|
59
|
+
* @param command - The shell command string to normalize.
|
|
60
|
+
* @returns The command with Python interpreter tokens rewritten, or the
|
|
61
|
+
* original command if no rewrite is needed.
|
|
62
|
+
*/
|
|
63
|
+
export function normalizePythonCommand(command) {
|
|
64
|
+
const executable = detectPythonExecutable();
|
|
65
|
+
if (!executable)
|
|
66
|
+
return command;
|
|
67
|
+
// Split on common shell separators to handle compound commands.
|
|
68
|
+
// We reconstruct the string preserving the original separators.
|
|
69
|
+
return command.replace(/(^\s*|(?:&&|\|\||;)\s*)(?:python3?|py(?:\s+-\d+)?)(?=\s|$)/g, (_match, pre) => `${pre}${executable}`);
|
|
70
|
+
}
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
import { mkdirSync, writeFileSync, existsSync, readdirSync, statSync } from "node:fs";
|
|
16
16
|
import { join } from "node:path";
|
|
17
17
|
import { stringify } from "yaml";
|
|
18
|
-
import { loadDefinition, substituteParams } from "./definition-loader.js";
|
|
18
|
+
import { loadDefinition, loadDefinitionFromFile, substituteParams } from "./definition-loader.js";
|
|
19
19
|
import { initializeGraph, writeGraph, readGraph } from "./graph.js";
|
|
20
|
+
import { resolvePlugin } from "./workflow-plugins.js";
|
|
20
21
|
// ─── Constants ───────────────────────────────────────────────────────────
|
|
21
22
|
const RUNS_DIR = "workflow-runs";
|
|
22
23
|
const DEFS_DIR = "workflow-defs";
|
|
@@ -42,38 +43,57 @@ function deriveStatus(graph) {
|
|
|
42
43
|
return "pending";
|
|
43
44
|
}
|
|
44
45
|
// ─── Public API ──────────────────────────────────────────────────────────
|
|
46
|
+
/**
|
|
47
|
+
* Create a run directory from an explicit definition file path.
|
|
48
|
+
* Preferred over `createRun` when the caller has already resolved the file
|
|
49
|
+
* (e.g. via the plugin resolver).
|
|
50
|
+
*/
|
|
51
|
+
export function createRunFromDefinition(basePath, defName, definitionFile, overrides) {
|
|
52
|
+
const rawDef = loadDefinitionFromFile(definitionFile);
|
|
53
|
+
const def = overrides
|
|
54
|
+
? substituteParams(rawDef, overrides)
|
|
55
|
+
: substituteParams(rawDef);
|
|
56
|
+
const timestamp = makeTimestamp();
|
|
57
|
+
const runDir = join(basePath, ".gsd", RUNS_DIR, defName, timestamp);
|
|
58
|
+
mkdirSync(runDir, { recursive: true });
|
|
59
|
+
writeFileSync(join(runDir, "DEFINITION.yaml"), stringify(def), "utf-8");
|
|
60
|
+
const graph = initializeGraph(def);
|
|
61
|
+
writeGraph(runDir, graph);
|
|
62
|
+
if (overrides && Object.keys(overrides).length > 0) {
|
|
63
|
+
writeFileSync(join(runDir, "PARAMS.json"), JSON.stringify(overrides, null, 2), "utf-8");
|
|
64
|
+
}
|
|
65
|
+
return runDir;
|
|
66
|
+
}
|
|
45
67
|
/**
|
|
46
68
|
* Create a new isolated run directory for a workflow definition.
|
|
47
69
|
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* 4. Writes frozen DEFINITION.yaml, initialized GRAPH.yaml, and optional PARAMS.json
|
|
70
|
+
* Resolution order:
|
|
71
|
+
* 1. Plugin resolver (project → global → bundled), YAML format only.
|
|
72
|
+
* 2. Legacy `.gsd/workflow-defs/<defName>.yaml`.
|
|
52
73
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* @
|
|
57
|
-
* @throws Error if the definition file doesn't exist or is invalid
|
|
74
|
+
* Creates `<basePath>/.gsd/workflow-runs/<defName>/<timestamp>/` containing
|
|
75
|
+
* DEFINITION.yaml (frozen), GRAPH.yaml (initialized), and optional PARAMS.json.
|
|
76
|
+
*
|
|
77
|
+
* @throws Error if no matching definition is found anywhere.
|
|
58
78
|
*/
|
|
59
79
|
export function createRun(basePath, defName, overrides) {
|
|
80
|
+
// Try the unified plugin resolver first — honors project/global overrides.
|
|
81
|
+
const plugin = resolvePlugin(basePath, defName);
|
|
82
|
+
if (plugin && plugin.format === "yaml") {
|
|
83
|
+
return createRunFromDefinition(basePath, defName, plugin.path, overrides);
|
|
84
|
+
}
|
|
85
|
+
// Fall back to legacy `.gsd/workflow-defs/<defName>.yaml`.
|
|
60
86
|
const defsDir = join(basePath, ".gsd", DEFS_DIR);
|
|
61
|
-
// Load and validate the definition
|
|
62
87
|
const rawDef = loadDefinition(defsDir, defName);
|
|
63
|
-
// Apply parameter substitution if overrides provided
|
|
64
88
|
const def = overrides
|
|
65
89
|
? substituteParams(rawDef, overrides)
|
|
66
|
-
: substituteParams(rawDef);
|
|
67
|
-
// Create the run directory
|
|
90
|
+
: substituteParams(rawDef);
|
|
68
91
|
const timestamp = makeTimestamp();
|
|
69
92
|
const runDir = join(basePath, ".gsd", RUNS_DIR, defName, timestamp);
|
|
70
93
|
mkdirSync(runDir, { recursive: true });
|
|
71
|
-
// Freeze the definition as DEFINITION.yaml
|
|
72
94
|
writeFileSync(join(runDir, "DEFINITION.yaml"), stringify(def), "utf-8");
|
|
73
|
-
// Initialize and write GRAPH.yaml
|
|
74
95
|
const graph = initializeGraph(def);
|
|
75
96
|
writeGraph(runDir, graph);
|
|
76
|
-
// Write PARAMS.json if overrides were provided
|
|
77
97
|
if (overrides && Object.keys(overrides).length > 0) {
|
|
78
98
|
writeFileSync(join(runDir, "PARAMS.json"), JSON.stringify(overrides, null, 2), "utf-8");
|
|
79
99
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
import { PROVIDER_REGISTRY } from "./key-manager.js";
|
|
10
|
+
/**
|
|
11
|
+
* Canonical ordered list of onboarding steps.
|
|
12
|
+
*
|
|
13
|
+
* To add a new step:
|
|
14
|
+
* 1. Append here (or insert at the right position).
|
|
15
|
+
* 2. Bump FLOW_VERSION in onboarding-state.ts so existing users get re-prompted.
|
|
16
|
+
* 3. Wire its CLI runner in src/onboarding.ts (and handlers/onboarding.ts for --step).
|
|
17
|
+
*/
|
|
18
|
+
export const ONBOARDING_STEPS = [
|
|
19
|
+
{ id: "llm", label: "LLM provider & auth", required: true, hint: "Sign in or paste an API key" },
|
|
20
|
+
{ id: "model", label: "Default model", required: false, hint: "Pick a default model for the chosen provider" },
|
|
21
|
+
{ id: "search", label: "Web search provider", required: false, hint: "Brave, Tavily, or Anthropic built-in" },
|
|
22
|
+
{ id: "remote", label: "Remote questions", required: false, hint: "Discord / Slack / Telegram notifications" },
|
|
23
|
+
{ id: "tool-keys", label: "Tool API keys", required: false, hint: "Context7, Jina, Groq voice, etc." },
|
|
24
|
+
{ id: "prefs", label: "Global preferences", required: false, hint: "Mode, profile, notifications" },
|
|
25
|
+
{ id: "skills", label: "Skills install", required: false, hint: "Browse and install skill plugins" },
|
|
26
|
+
{ id: "doctor", label: "Validate setup", required: false, hint: "Run provider doctor checks" },
|
|
27
|
+
{ id: "project", label: "Project init", required: false, hint: "Bootstrap .gsd/ in this repo" },
|
|
28
|
+
];
|
|
29
|
+
const STEP_INDEX = new Map(ONBOARDING_STEPS.map((s, i) => [s.id, i]));
|
|
30
|
+
export function getStep(id) {
|
|
31
|
+
const idx = STEP_INDEX.get(id);
|
|
32
|
+
return idx === undefined ? undefined : ONBOARDING_STEPS[idx];
|
|
33
|
+
}
|
|
34
|
+
export function isValidStepId(id) {
|
|
35
|
+
return STEP_INDEX.has(id);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Given a possibly-stale resume point, return the nearest next step that is
|
|
39
|
+
* still defined in the catalog. Falls back to the first step.
|
|
40
|
+
*/
|
|
41
|
+
export function nearestResumeStep(lastResumePoint, completedSteps) {
|
|
42
|
+
const completed = new Set(completedSteps);
|
|
43
|
+
// First incomplete step at or after the lastResumePoint
|
|
44
|
+
let startIdx = 0;
|
|
45
|
+
if (lastResumePoint && STEP_INDEX.has(lastResumePoint)) {
|
|
46
|
+
startIdx = STEP_INDEX.get(lastResumePoint) ?? 0;
|
|
47
|
+
}
|
|
48
|
+
for (let i = startIdx; i < ONBOARDING_STEPS.length; i++) {
|
|
49
|
+
if (!completed.has(ONBOARDING_STEPS[i].id))
|
|
50
|
+
return ONBOARDING_STEPS[i].id;
|
|
51
|
+
}
|
|
52
|
+
// Everything from the resume point is complete — try from the start
|
|
53
|
+
for (const step of ONBOARDING_STEPS) {
|
|
54
|
+
if (!completed.has(step.id))
|
|
55
|
+
return step.id;
|
|
56
|
+
}
|
|
57
|
+
return ONBOARDING_STEPS[0].id;
|
|
58
|
+
}
|
|
59
|
+
// ─── Provider catalog views ───────────────────────────────────────────────────
|
|
60
|
+
export function getLlmProviders() {
|
|
61
|
+
return PROVIDER_REGISTRY.filter(p => p.category === "llm");
|
|
62
|
+
}
|
|
63
|
+
export function getToolProviders() {
|
|
64
|
+
return PROVIDER_REGISTRY.filter(p => p.category === "tool");
|
|
65
|
+
}
|
|
66
|
+
export function getSearchProviders() {
|
|
67
|
+
return PROVIDER_REGISTRY.filter(p => p.category === "search");
|
|
68
|
+
}
|
|
69
|
+
export function getRemoteProviders() {
|
|
70
|
+
return PROVIDER_REGISTRY.filter(p => p.category === "remote");
|
|
71
|
+
}
|
|
72
|
+
/** Provider IDs that count as "the user has an LLM configured" for shouldRunOnboarding. */
|
|
73
|
+
export function getLlmProviderIds() {
|
|
74
|
+
return Array.from(new Set([...getLlmProviders().map(p => p.id), "claude-code"]));
|
|
75
|
+
}
|
|
@@ -13,7 +13,9 @@ import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
|
13
13
|
import { debugCount, debugTime } from './debug-logger.js';
|
|
14
14
|
import { logWarning, logError } from './workflow-logger.js';
|
|
15
15
|
import { extractVerdict } from './verdict-parser.js';
|
|
16
|
-
import {
|
|
16
|
+
import { loadEffectiveGSDPreferences } from './preferences.js';
|
|
17
|
+
import { detectPendingEscalation } from './escalation.js';
|
|
18
|
+
import { isDbAvailable, wasDbOpenAttempted, getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, insertSlice, insertTask, updateSliceStatus, updateTaskStatus, getPendingGateCountForTurn, autoHealSketchFlags, } from './gsd-db.js';
|
|
17
19
|
/**
|
|
18
20
|
* A "ghost" milestone directory contains only META.json (and no substantive
|
|
19
21
|
* files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
|
|
@@ -710,7 +712,13 @@ export async function deriveStateFromDb(basePath) {
|
|
|
710
712
|
if (allSlicesDone) {
|
|
711
713
|
return handleAllSlicesDone(basePath, activeMilestone, registry, requirements, milestoneProgress, sliceProgress);
|
|
712
714
|
}
|
|
713
|
-
|
|
715
|
+
// ADR-011 auto-heal: if a slice has a PLAN on disk but is still flagged is_sketch=1
|
|
716
|
+
// (e.g. a crash between plan-slice write and the sketch flip), reconcile before
|
|
717
|
+
// running phase derivation so the flag doesn't misroute state.
|
|
718
|
+
autoHealSketchFlags(activeMilestone.id, (sid) => !!resolveSliceFile(basePath, activeMilestone.id, sid, "PLAN"));
|
|
719
|
+
// Re-read slices after auto-heal so downstream reads see fresh is_sketch values.
|
|
720
|
+
const healedSlices = getMilestoneSlices(activeMilestone.id);
|
|
721
|
+
const activeSliceContext = resolveSliceDependencies(healedSlices);
|
|
714
722
|
if (!activeSliceContext.activeSlice) {
|
|
715
723
|
// If locked slice wasn't found, it returns null but logs warning, we need to return 'blocked'
|
|
716
724
|
if (process.env.GSD_SLICE_LOCK) {
|
|
@@ -730,9 +738,23 @@ export async function deriveStateFromDb(basePath) {
|
|
|
730
738
|
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
731
739
|
};
|
|
732
740
|
}
|
|
733
|
-
const { activeSlice } = activeSliceContext;
|
|
741
|
+
const { activeSlice, activeSliceRow } = activeSliceContext;
|
|
734
742
|
const planFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "PLAN");
|
|
735
743
|
if (!planFile) {
|
|
744
|
+
// ADR-011: sketch slices with progressive_planning enabled enter the
|
|
745
|
+
// `refining` phase — a refine-slice unit expands the sketch into a full plan
|
|
746
|
+
// before execution. When the flag is off, sketches are indistinguishable
|
|
747
|
+
// from a missing plan and fall through to the normal `planning` phase.
|
|
748
|
+
const progressive = loadEffectiveGSDPreferences()?.preferences?.phases?.progressive_planning === true;
|
|
749
|
+
if (progressive && activeSliceRow?.is_sketch === 1) {
|
|
750
|
+
return {
|
|
751
|
+
activeMilestone, activeSlice, activeTask: null,
|
|
752
|
+
phase: 'refining', recentDecisions: [], blockers: [],
|
|
753
|
+
nextAction: `Refine sketch slice ${activeSlice.id} (${activeSlice.title}) using prior slice context.`,
|
|
754
|
+
registry, requirements,
|
|
755
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
756
|
+
};
|
|
757
|
+
}
|
|
736
758
|
return {
|
|
737
759
|
activeMilestone, activeSlice, activeTask: null,
|
|
738
760
|
phase: 'planning', recentDecisions: [], blockers: [],
|
|
@@ -811,6 +833,28 @@ export async function deriveStateFromDb(basePath) {
|
|
|
811
833
|
};
|
|
812
834
|
}
|
|
813
835
|
}
|
|
836
|
+
// ADR-011 Phase 2: pause-on-escalation takes precedence over dispatching the
|
|
837
|
+
// next task. `awaiting_review` tasks (continueWithDefault=true) are NOT
|
|
838
|
+
// surfaced here — they let the loop continue.
|
|
839
|
+
//
|
|
840
|
+
// We do NOT gate this on `phases.mid_execution_escalation` — creation of
|
|
841
|
+
// new escalations is gated at the write site (tools/complete-task.ts:315),
|
|
842
|
+
// but any escalation_pending row already persisted in the DB must be
|
|
843
|
+
// honored even if the user later toggles the flag off. Otherwise those
|
|
844
|
+
// rows would silently orphan, the loop would advance past the paused task,
|
|
845
|
+
// and the user's prior resolution never lands.
|
|
846
|
+
const escalatingTaskId = detectPendingEscalation(tasks, basePath);
|
|
847
|
+
if (escalatingTaskId) {
|
|
848
|
+
return {
|
|
849
|
+
activeMilestone, activeSlice, activeTask,
|
|
850
|
+
phase: 'escalating-task', recentDecisions: [],
|
|
851
|
+
blockers: [`Task ${escalatingTaskId} requires a user decision before the loop can proceed`],
|
|
852
|
+
nextAction: `Run /gsd escalate show ${escalatingTaskId} to review, then /gsd escalate resolve ${escalatingTaskId} <choice> to proceed.`,
|
|
853
|
+
activeWorkspace: undefined,
|
|
854
|
+
registry, requirements,
|
|
855
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
856
|
+
};
|
|
857
|
+
}
|
|
814
858
|
if (!blockerTaskId) {
|
|
815
859
|
const isTriggered = checkReplanTrigger(basePath, activeMilestone.id, activeSlice.id);
|
|
816
860
|
if (isTriggered) {
|
|
@@ -44,19 +44,19 @@ uok:
|
|
|
44
44
|
legacy_fallback:
|
|
45
45
|
enabled: false
|
|
46
46
|
gates:
|
|
47
|
-
enabled:
|
|
47
|
+
enabled: true
|
|
48
48
|
model_policy:
|
|
49
|
-
enabled:
|
|
49
|
+
enabled: true
|
|
50
50
|
execution_graph:
|
|
51
|
-
enabled:
|
|
51
|
+
enabled: true
|
|
52
52
|
gitops:
|
|
53
|
-
enabled:
|
|
54
|
-
turn_action:
|
|
53
|
+
enabled: true
|
|
54
|
+
turn_action: commit
|
|
55
55
|
turn_push: false
|
|
56
56
|
audit_unified:
|
|
57
|
-
enabled:
|
|
57
|
+
enabled: true
|
|
58
58
|
plan_v2:
|
|
59
|
-
enabled:
|
|
59
|
+
enabled: true
|
|
60
60
|
auto_visualize:
|
|
61
61
|
auto_report:
|
|
62
62
|
parallel:
|
|
@@ -20,6 +20,8 @@ import { renderAllProjections, renderSummaryContent } from "../workflow-projecti
|
|
|
20
20
|
import { writeManifest } from "../workflow-manifest.js";
|
|
21
21
|
import { appendEvent } from "../workflow-events.js";
|
|
22
22
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
23
|
+
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
24
|
+
import { buildEscalationArtifact, writeEscalationArtifact } from "../escalation.js";
|
|
23
25
|
/**
|
|
24
26
|
* Map an execute-task-owned gate id to the CompleteTaskParams field whose
|
|
25
27
|
* presence drives `pass` vs. `omitted`. Keep in lockstep with the gates
|
|
@@ -80,6 +82,11 @@ function paramsToTaskRow(params, completedAt) {
|
|
|
80
82
|
observability_impact: "",
|
|
81
83
|
full_plan_md: "",
|
|
82
84
|
sequence: 0,
|
|
85
|
+
blocker_source: "",
|
|
86
|
+
escalation_pending: 0,
|
|
87
|
+
escalation_awaiting_review: 0,
|
|
88
|
+
escalation_artifact_path: null,
|
|
89
|
+
escalation_override_applied_at: null,
|
|
83
90
|
};
|
|
84
91
|
}
|
|
85
92
|
/**
|
|
@@ -111,6 +118,39 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
111
118
|
// ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
|
|
112
119
|
const completedAt = new Date().toISOString();
|
|
113
120
|
let guardError = null;
|
|
121
|
+
// ── ADR-011 Phase 2: validate escalation payload BEFORE any side effects ─
|
|
122
|
+
// Building the artifact runs the full shape validation (2-4 options, unique
|
|
123
|
+
// ids, recommendation references a real id). If the payload is malformed
|
|
124
|
+
// we must reject the call before marking the task complete, writing
|
|
125
|
+
// SUMMARY.md, flipping the plan checkbox, or closing execute-task gates —
|
|
126
|
+
// otherwise a rejected payload would leave the task marked complete with
|
|
127
|
+
// no escalation recorded, and the loop would silently advance past it.
|
|
128
|
+
// The filesystem write happens later (after side effects) because that's
|
|
129
|
+
// the cheapest ordering and validation is where 99% of failures live.
|
|
130
|
+
let validatedEscalationArtifact = null;
|
|
131
|
+
let escalationWriteEnabled = false;
|
|
132
|
+
if (params.escalation) {
|
|
133
|
+
escalationWriteEnabled = loadEffectiveGSDPreferences()?.preferences?.phases?.mid_execution_escalation === true;
|
|
134
|
+
if (escalationWriteEnabled) {
|
|
135
|
+
try {
|
|
136
|
+
validatedEscalationArtifact = buildEscalationArtifact({
|
|
137
|
+
taskId: params.taskId,
|
|
138
|
+
sliceId: params.sliceId,
|
|
139
|
+
milestoneId: params.milestoneId,
|
|
140
|
+
question: params.escalation.question,
|
|
141
|
+
options: params.escalation.options,
|
|
142
|
+
recommendation: params.escalation.recommendation,
|
|
143
|
+
recommendationRationale: params.escalation.recommendationRationale,
|
|
144
|
+
continueWithDefault: params.escalation.continueWithDefault,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
catch (validationErr) {
|
|
148
|
+
return {
|
|
149
|
+
error: `complete-task escalation payload invalid for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${validationErr.message}`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
114
154
|
transaction(() => {
|
|
115
155
|
// State machine preconditions (inside txn for atomicity).
|
|
116
156
|
// Milestone/slice not existing is OK — insertMilestone/insertSlice below will auto-create.
|
|
@@ -239,6 +279,46 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
239
279
|
catch (gateErr) {
|
|
240
280
|
logWarning("tool", `complete-task gate close warning for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${gateErr.message}`);
|
|
241
281
|
}
|
|
282
|
+
// ── ADR-011 Phase 2: write escalation artifact (opt-in) ────────────────
|
|
283
|
+
// Validation already happened BEFORE side effects — this block only
|
|
284
|
+
// performs the disk write for a pre-validated artifact. For
|
|
285
|
+
// continueWithDefault=false, a write failure here would otherwise leave
|
|
286
|
+
// the task marked complete with SUMMARY.md + closed gates but no
|
|
287
|
+
// escalation, which silently advances the loop past a pause the user
|
|
288
|
+
// asked for. We compensate by reverting the DB-level completion: set
|
|
289
|
+
// status back to 'pending' and delete the verification_evidence rows
|
|
290
|
+
// (same shape as the disk-render-failure rollback above). SUMMARY.md
|
|
291
|
+
// on disk is left in place because the next complete-task retry will
|
|
292
|
+
// overwrite it; gate rows are UPSERT-keyed per task and will also be
|
|
293
|
+
// overwritten. This restores the invariant that deriveState() sees a
|
|
294
|
+
// consistent "task not done" view so the loop re-dispatches the task.
|
|
295
|
+
if (validatedEscalationArtifact) {
|
|
296
|
+
try {
|
|
297
|
+
writeEscalationArtifact(basePath, validatedEscalationArtifact);
|
|
298
|
+
}
|
|
299
|
+
catch (escalationErr) {
|
|
300
|
+
const msg = `complete-task escalation write failed for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${escalationErr.message}`;
|
|
301
|
+
logWarning("tool", msg);
|
|
302
|
+
if (validatedEscalationArtifact.continueWithDefault === false) {
|
|
303
|
+
// Compensating rollback: revert DB completion so the loop pauses on
|
|
304
|
+
// re-dispatch instead of silently advancing. Mirror the existing
|
|
305
|
+
// renderErr rollback (line ~261).
|
|
306
|
+
try {
|
|
307
|
+
deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
|
|
308
|
+
updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
|
|
309
|
+
invalidateStateCache();
|
|
310
|
+
logWarning("tool", `complete-task rolled back DB completion for ${params.milestoneId}/${params.sliceId}/${params.taskId} after escalation write failure; SUMMARY.md left on disk for retry.`);
|
|
311
|
+
}
|
|
312
|
+
catch (rollbackErr) {
|
|
313
|
+
logWarning("tool", `complete-task rollback failed after escalation write failure for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${rollbackErr.message}`);
|
|
314
|
+
}
|
|
315
|
+
return { error: msg };
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else if (params.escalation && !escalationWriteEnabled) {
|
|
320
|
+
logWarning("tool", `complete-task received escalation payload but phases.mid_execution_escalation is not enabled; ignoring (${params.milestoneId}/${params.sliceId}/${params.taskId})`);
|
|
321
|
+
}
|
|
242
322
|
// Invalidate all caches
|
|
243
323
|
invalidateStateCache();
|
|
244
324
|
clearPathCache();
|