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
|
@@ -24,10 +24,30 @@ const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
|
24
24
|
* hardcoding absolute paths in the system prompt template. Only skills
|
|
25
25
|
* that actually exist on disk are included in the table. (#3575)
|
|
26
26
|
*/
|
|
27
|
-
const BUNDLED_SKILL_TRIGGERS = [
|
|
27
|
+
export const BUNDLED_SKILL_TRIGGERS = [
|
|
28
28
|
{ trigger: "Frontend UI - web components, pages, landing pages, dashboards, React/HTML/CSS, styling", skill: "frontend-design" },
|
|
29
29
|
{ trigger: "macOS or iOS apps - SwiftUI, Xcode, App Store", skill: "swiftui" },
|
|
30
30
|
{ trigger: "Debugging - complex bugs, failing tests, root-cause investigation after standard approaches fail", skill: "debug-like-expert" },
|
|
31
|
+
{ trigger: "Code review - security, performance, bugs, quality review of staged/unstaged diffs or PRs", skill: "review" },
|
|
32
|
+
{ trigger: "Test generation or execution - auto-detect framework, generate tests, run suite, analyze failures", skill: "test" },
|
|
33
|
+
{ trigger: "Linting/formatting - run the detected linter/formatter with auto-fix, report remaining issues", skill: "lint" },
|
|
34
|
+
{ trigger: "Polishing UI details - animations, hover states, typography, borders, micro-interactions, optical alignment", skill: "make-interfaces-feel-better" },
|
|
35
|
+
{ trigger: "Accessibility audit - WCAG, screen reader, keyboard navigation, a11y review", skill: "accessibility" },
|
|
36
|
+
{ trigger: "Planning interviews - stress-test a plan, grill the user, resolve decision trees one branch at a time", skill: "grill-me" },
|
|
37
|
+
{ trigger: "Interface design - produce 3+ radically different designs for a module/API, compare in prose, synthesize", skill: "design-an-interface" },
|
|
38
|
+
{ trigger: "TDD - red-green-refactor vertical slices, never refactor while red, tests survive refactors", skill: "tdd" },
|
|
39
|
+
{ trigger: "Draft a milestone brief (M###-CONTEXT.md) or PRD from current conversation context", skill: "write-milestone-brief" },
|
|
40
|
+
{ trigger: "Break a plan into vertical-slice roadmap slices (M###-ROADMAP.md) or GitHub issues with dependency ordering", skill: "decompose-into-slices" },
|
|
41
|
+
{ trigger: "Package spike findings into a reusable project-local skill at .claude/skills/", skill: "spike-wrap-up" },
|
|
42
|
+
{ trigger: "Block completion claims until verification evidence has been produced in this message", skill: "verify-before-complete" },
|
|
43
|
+
{ trigger: "Create a Model Context Protocol (MCP) server — tool design, error handling, Inspector testing, evals", skill: "create-mcp-server" },
|
|
44
|
+
{ trigger: "Write documentation, proposals, specs, RFCs, or READMEs for a fresh reader", skill: "write-docs" },
|
|
45
|
+
{ trigger: "Post-mortem a failed GSD auto-mode run using .gsd/activity, .gsd/journal, and .gsd/metrics.json", skill: "forensics" },
|
|
46
|
+
{ trigger: "Prepare a clean cross-session handoff — continue.md + summary updates (pause/resume work)", skill: "handoff" },
|
|
47
|
+
{ trigger: "Security review with STRIDE threat modeling and exploit-scenario reporting", skill: "security-review" },
|
|
48
|
+
{ trigger: "HTTP/REST/GraphQL API design — verbs, status codes, pagination, errors, idempotency, versioning", skill: "api-design" },
|
|
49
|
+
{ trigger: "Dependency upgrades — risk-batched, verified between batches, one major per commit", skill: "dependency-upgrade" },
|
|
50
|
+
{ trigger: "Agent-first observability — structured logs, persisted failure state, health surfaces, explicit failure modes", skill: "observability" },
|
|
31
51
|
];
|
|
32
52
|
function buildBundledSkillsTable() {
|
|
33
53
|
const cwd = process.cwd();
|
|
@@ -87,20 +107,20 @@ export async function buildBeforeAgentStartResult(event, ctx) {
|
|
|
87
107
|
if (globalSizeKb > 4) {
|
|
88
108
|
ctx.ui.notify(`GSD: ~/.gsd/agent/KNOWLEDGE.md is ${globalSizeKb.toFixed(1)}KB — consider trimming to keep system prompt lean.`, "warning");
|
|
89
109
|
}
|
|
90
|
-
|
|
110
|
+
// ADR-013 step 5: opportunistic decisions->memories backfill. Idempotent
|
|
111
|
+
// and best-effort — first run absorbs the existing decisions table into
|
|
112
|
+
// the memory store; subsequent runs are a single sentinel SELECT.
|
|
91
113
|
try {
|
|
92
|
-
const {
|
|
93
|
-
const
|
|
94
|
-
if (
|
|
95
|
-
|
|
96
|
-
if (formatted) {
|
|
97
|
-
memoryBlock = `\n\n${formatted}`;
|
|
98
|
-
}
|
|
114
|
+
const { backfillDecisionsToMemories } = await import("../memory-backfill.js");
|
|
115
|
+
const written = backfillDecisionsToMemories();
|
|
116
|
+
if (written > 0) {
|
|
117
|
+
ctx.ui.notify(`GSD: backfilled ${written} decision${written === 1 ? "" : "s"} into the memory store (ADR-013).`, "info");
|
|
99
118
|
}
|
|
100
119
|
}
|
|
101
120
|
catch (e) {
|
|
102
|
-
logWarning("bootstrap", `
|
|
121
|
+
logWarning("bootstrap", `decisions backfill failed: ${e.message}`);
|
|
103
122
|
}
|
|
123
|
+
const memoryBlock = await loadMemoryBlock(event.prompt ?? "");
|
|
104
124
|
let newSkillsBlock = "";
|
|
105
125
|
if (hasSkillSnapshot()) {
|
|
106
126
|
const newSkills = detectNewSkills();
|
|
@@ -170,6 +190,60 @@ export async function buildBeforeAgentStartResult(event, ctx) {
|
|
|
170
190
|
...(contextMessage ? { message: contextMessage } : {}),
|
|
171
191
|
};
|
|
172
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* ADR-013 step 4 — auto-injection parity for the memories table.
|
|
195
|
+
*
|
|
196
|
+
* Mirrors loadKnowledgeBlock by producing a labeled, deterministic block
|
|
197
|
+
* combining two memory sets:
|
|
198
|
+
*
|
|
199
|
+
* 1. Always-on "critical" set — top-ranked active memories in categories
|
|
200
|
+
* that future GSD turns generally want without asking. After ADR-013
|
|
201
|
+
* expands this to include "architecture", these memories serve as the
|
|
202
|
+
* auto-injected replacement for inlineDecisionsFromDb when the cutover
|
|
203
|
+
* in step 6 lands.
|
|
204
|
+
* 2. Prompt-relevance set — FTS5/semantic hits against the current user
|
|
205
|
+
* prompt, deduplicated against the critical set.
|
|
206
|
+
*
|
|
207
|
+
* Both sets are ranked, merged, and rendered via formatMemoriesForPrompt
|
|
208
|
+
* with a token-budget cap. Failures degrade gracefully — the function never
|
|
209
|
+
* throws and returns "" so the system prompt construction continues.
|
|
210
|
+
*/
|
|
211
|
+
export async function loadMemoryBlock(userPrompt) {
|
|
212
|
+
try {
|
|
213
|
+
const { formatMemoriesForPrompt, getActiveMemoriesRanked, queryMemoriesRanked } = await import("../memory-store.js");
|
|
214
|
+
// Categories that belong in every turn. Pre-ADR-013 this was just
|
|
215
|
+
// {gotcha, environment, convention}. ADR-013 adds "architecture" so
|
|
216
|
+
// decision-equivalent memories survive the inlineDecisionsFromDb cutover
|
|
217
|
+
// in step 6.
|
|
218
|
+
const CRITICAL_CATEGORIES = new Set(["gotcha", "environment", "convention", "architecture"]);
|
|
219
|
+
const CRITICAL_CAP = 8;
|
|
220
|
+
const QUERY_K = 10;
|
|
221
|
+
// ~1 token ≈ 4 chars. 4000 chars ≈ 1000 tokens — comfortably under the
|
|
222
|
+
// KNOWLEDGE.md 4KB warning threshold and roughly twice the pre-ADR-013
|
|
223
|
+
// budget so the absorbed DECISIONS surface fits.
|
|
224
|
+
const CHAR_BUDGET = 4000;
|
|
225
|
+
const allRanked = getActiveMemoriesRanked(80);
|
|
226
|
+
const critical = allRanked.filter((m) => CRITICAL_CATEGORIES.has(m.category)).slice(0, CRITICAL_CAP);
|
|
227
|
+
const criticalIds = new Set(critical.map((m) => m.id));
|
|
228
|
+
let relevant = [];
|
|
229
|
+
const trimmed = userPrompt.trim();
|
|
230
|
+
if (trimmed) {
|
|
231
|
+
const hits = queryMemoriesRanked({ query: trimmed, k: QUERY_K });
|
|
232
|
+
relevant = hits.map((h) => h.memory).filter((m) => !criticalIds.has(m.id));
|
|
233
|
+
}
|
|
234
|
+
const merged = [...critical, ...relevant];
|
|
235
|
+
if (merged.length === 0)
|
|
236
|
+
return "";
|
|
237
|
+
const formatted = formatMemoriesForPrompt(merged, CHAR_BUDGET);
|
|
238
|
+
if (!formatted)
|
|
239
|
+
return "";
|
|
240
|
+
return `\n\n[MEMORY — Critical and prompt-relevant memories from the GSD memory store]\n\n${formatted}`;
|
|
241
|
+
}
|
|
242
|
+
catch (e) {
|
|
243
|
+
logWarning("bootstrap", `memory block fetch failed: ${e.message}`);
|
|
244
|
+
return "";
|
|
245
|
+
}
|
|
246
|
+
}
|
|
173
247
|
export function loadKnowledgeBlock(gsdHomeDir, cwd) {
|
|
174
248
|
// 1. Global knowledge (~/.gsd/agent/KNOWLEDGE.md) — cross-project, user-maintained
|
|
175
249
|
let globalKnowledge = "";
|
|
@@ -4,7 +4,7 @@ import { join } from "node:path";
|
|
|
4
4
|
import { loadRegistry } from "../workflow-templates.js";
|
|
5
5
|
import { resolveProjectRoot } from "../worktree.js";
|
|
6
6
|
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
7
|
-
export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|model|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|debug|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink|codebase|notifications|ship|do|session-report|backlog|pr-branch|add-tests|scan|language";
|
|
7
|
+
export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|model|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|debug|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|onboarding|inspect|extensions|update|fast|mcp|rethink|codebase|notifications|ship|do|session-report|backlog|pr-branch|add-tests|scan|language";
|
|
8
8
|
export const TOP_LEVEL_SUBCOMMANDS = [
|
|
9
9
|
{ cmd: "help", desc: "Categorized command reference with descriptions" },
|
|
10
10
|
{ cmd: "next", desc: "Explicit step mode (same as /gsd)" },
|
|
@@ -32,7 +32,7 @@ export const TOP_LEVEL_SUBCOMMANDS = [
|
|
|
32
32
|
{ cmd: "model", desc: "Switch the active session model or open a picker" },
|
|
33
33
|
{ cmd: "mode", desc: "Switch workflow mode (solo/team)" },
|
|
34
34
|
{ cmd: "prefs", desc: "Manage preferences (model selection, timeouts, etc.)" },
|
|
35
|
-
{ cmd: "config", desc: "Set API keys
|
|
35
|
+
{ cmd: "config", desc: "(deprecated) Set tool API keys — use /gsd keys instead" },
|
|
36
36
|
{ cmd: "keys", desc: "API key manager — list, add, remove, test, rotate, doctor" },
|
|
37
37
|
{ cmd: "hooks", desc: "Show configured post-unit and pre-dispatch hooks" },
|
|
38
38
|
{ cmd: "run-hook", desc: "Manually trigger a specific hook" },
|
|
@@ -43,7 +43,8 @@ export const TOP_LEVEL_SUBCOMMANDS = [
|
|
|
43
43
|
{ cmd: "debug", desc: "Create and inspect persistent /gsd debug sessions" },
|
|
44
44
|
{ cmd: "forensics", desc: "Examine execution logs" },
|
|
45
45
|
{ cmd: "init", desc: "Project init wizard — detect, configure, bootstrap .gsd/" },
|
|
46
|
-
{ cmd: "setup", desc: "
|
|
46
|
+
{ cmd: "setup", desc: "Configuration hub: status + sub-routes (llm, model, search, remote, keys, prefs, onboarding)" },
|
|
47
|
+
{ cmd: "onboarding", desc: "Re-run the setup wizard [--resume|--reset|--step <name>]" },
|
|
47
48
|
{ cmd: "migrate", desc: "Migrate a v1 .planning directory to .gsd format" },
|
|
48
49
|
{ cmd: "remote", desc: "Control remote auto-mode" },
|
|
49
50
|
{ cmd: "steer", desc: "Hard-steer plan documents during execution" },
|
|
@@ -102,11 +103,18 @@ const NESTED_COMPLETIONS = {
|
|
|
102
103
|
{ cmd: "watch", desc: "Live TUI dashboard monitoring all workers" },
|
|
103
104
|
],
|
|
104
105
|
setup: [
|
|
105
|
-
{ cmd: "llm", desc: "Configure LLM provider
|
|
106
|
+
{ cmd: "llm", desc: "Configure LLM provider & auth" },
|
|
107
|
+
{ cmd: "model", desc: "Pick default model for the active provider" },
|
|
106
108
|
{ cmd: "search", desc: "Configure web search provider" },
|
|
107
|
-
{ cmd: "remote", desc: "Configure remote integrations" },
|
|
108
|
-
{ cmd: "keys", desc: "Manage API keys" },
|
|
109
|
-
{ cmd: "prefs", desc: "
|
|
109
|
+
{ cmd: "remote", desc: "Configure remote integrations (Discord/Slack/Telegram)" },
|
|
110
|
+
{ cmd: "keys", desc: "Manage API keys (alias for /gsd keys)" },
|
|
111
|
+
{ cmd: "prefs", desc: "Global preferences wizard (alias for /gsd prefs)" },
|
|
112
|
+
{ cmd: "onboarding", desc: "Run the full onboarding wizard (alias for /gsd onboarding)" },
|
|
113
|
+
],
|
|
114
|
+
onboarding: [
|
|
115
|
+
{ cmd: "--resume", desc: "Resume from the last completed step" },
|
|
116
|
+
{ cmd: "--reset", desc: "Reset onboarding state and start over (does not clear API keys)" },
|
|
117
|
+
{ cmd: "--step", desc: "Run a single step: llm|model|search|remote|tool-keys|prefs|skills|doctor|project" },
|
|
110
118
|
],
|
|
111
119
|
notifications: [
|
|
112
120
|
{ cmd: "clear", desc: "Clear all notifications" },
|
|
@@ -36,10 +36,12 @@ export function showHelp(ctx, args = "") {
|
|
|
36
36
|
" /gsd debug Create/list/continue persistent debug sessions",
|
|
37
37
|
"",
|
|
38
38
|
"SETUP",
|
|
39
|
+
" /gsd onboarding Re-run setup wizard [--resume|--reset|--step <name>]",
|
|
40
|
+
" /gsd setup Configuration hub [llm|model|search|remote|keys|prefs|onboarding]",
|
|
39
41
|
" /gsd init Project init wizard",
|
|
40
|
-
" /gsd setup Global setup status [llm|search|remote|keys|prefs]",
|
|
41
42
|
" /gsd model Switch active session model",
|
|
42
|
-
" /gsd prefs Manage preferences",
|
|
43
|
+
" /gsd prefs Manage preferences (alias for /gsd setup prefs)",
|
|
44
|
+
" /gsd keys API key manager (LLM + tool keys)",
|
|
43
45
|
" /gsd doctor Diagnose and repair .gsd/ state",
|
|
44
46
|
"",
|
|
45
47
|
"Use /gsd help full for the complete command reference.",
|
|
@@ -83,14 +85,15 @@ export function showHelp(ctx, args = "") {
|
|
|
83
85
|
" /gsd codebase [generate|update|stats] Manage the CODEBASE.md cache used in prompt context",
|
|
84
86
|
"",
|
|
85
87
|
"SETUP & CONFIGURATION",
|
|
88
|
+
" /gsd onboarding Re-run setup wizard [--resume|--reset|--step <name>]",
|
|
89
|
+
" /gsd setup Configuration hub [llm|model|search|remote|keys|prefs|onboarding]",
|
|
86
90
|
" /gsd init Project init wizard — detect, configure, bootstrap .gsd/",
|
|
87
|
-
" /gsd setup Global setup status [llm|search|remote|keys|prefs]",
|
|
88
91
|
" /gsd model Switch active session model [provider/model|model-id]",
|
|
89
92
|
" /gsd mode Set workflow mode (solo/team) [global|project]",
|
|
90
|
-
" /gsd prefs Manage preferences [global|project|status|wizard|setup|import-claude]",
|
|
93
|
+
" /gsd prefs Manage preferences [global|project|status|wizard|setup|import-claude] (alias for /gsd setup prefs)",
|
|
91
94
|
" /gsd cmux Manage cmux integration [status|on|off|notifications|sidebar|splits|browser]",
|
|
92
|
-
" /gsd
|
|
93
|
-
" /gsd
|
|
95
|
+
" /gsd keys API key manager (LLM + tool keys) [list|add|remove|test|rotate|doctor]",
|
|
96
|
+
" /gsd config (deprecated) Set tool API keys — use /gsd keys instead",
|
|
94
97
|
" /gsd show-config Show effective configuration (models, routing, toggles)",
|
|
95
98
|
" /gsd hooks Show post-unit hook configuration",
|
|
96
99
|
" /gsd extensions Manage extensions [list|enable|disable|info]",
|
|
@@ -155,29 +158,38 @@ export async function handleVisualize(ctx) {
|
|
|
155
158
|
ctx.ui.notify("Visualizer requires an interactive terminal. Use /gsd status for a text-based overview.", "warning");
|
|
156
159
|
}
|
|
157
160
|
}
|
|
158
|
-
export async function handleSetup(args, ctx) {
|
|
161
|
+
export async function handleSetup(args, ctx, pi) {
|
|
159
162
|
const { detectProjectState, hasGlobalSetup } = await import("../../detection.js");
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
163
|
+
const { isOnboardingComplete, readOnboardingRecord } = await import("../../onboarding-state.js");
|
|
164
|
+
// Sub-route dispatch — keep redirects but route the canonical work to /gsd
|
|
165
|
+
// onboarding (single source for wizard steps) and /gsd keys (single source
|
|
166
|
+
// for credentials).
|
|
167
|
+
if (args === "onboarding" || args === "wizard") {
|
|
168
|
+
const { handleOnboarding } = await import("./onboarding.js");
|
|
169
|
+
await handleOnboarding("", ctx);
|
|
170
|
+
return;
|
|
167
171
|
}
|
|
168
172
|
if (args === "llm" || args === "auth") {
|
|
169
|
-
|
|
173
|
+
const { handleOnboarding } = await import("./onboarding.js");
|
|
174
|
+
await handleOnboarding("--step llm", ctx);
|
|
170
175
|
return;
|
|
171
176
|
}
|
|
172
177
|
if (args === "search") {
|
|
173
|
-
|
|
178
|
+
const { handleOnboarding } = await import("./onboarding.js");
|
|
179
|
+
await handleOnboarding("--step search", ctx);
|
|
174
180
|
return;
|
|
175
181
|
}
|
|
176
182
|
if (args === "remote") {
|
|
177
|
-
|
|
183
|
+
const { handleOnboarding } = await import("./onboarding.js");
|
|
184
|
+
await handleOnboarding("--step remote", ctx);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (args === "model") {
|
|
188
|
+
await handleModel("", ctx, pi);
|
|
178
189
|
return;
|
|
179
190
|
}
|
|
180
191
|
if (args === "keys") {
|
|
192
|
+
ctx.ui.notify("Tip: /gsd keys is the canonical command for API key management.", "info");
|
|
181
193
|
const { handleKeys } = await import("../../key-manager.js");
|
|
182
194
|
await handleKeys("", ctx);
|
|
183
195
|
return;
|
|
@@ -187,13 +199,30 @@ export async function handleSetup(args, ctx) {
|
|
|
187
199
|
await handlePrefsWizard(ctx, "global");
|
|
188
200
|
return;
|
|
189
201
|
}
|
|
202
|
+
// Bare /gsd setup — render the hub: status + actions
|
|
203
|
+
const globalConfigured = hasGlobalSetup();
|
|
204
|
+
const detection = detectProjectState(projectRoot());
|
|
205
|
+
const onboardingDone = isOnboardingComplete();
|
|
206
|
+
const record = readOnboardingRecord();
|
|
207
|
+
const statusLines = ["GSD Setup\n"];
|
|
208
|
+
statusLines.push(onboardingDone
|
|
209
|
+
? ` Onboarding: ✓ complete${record.completedAt ? ` (${record.completedAt.slice(0, 10)})` : ""}`
|
|
210
|
+
: ` Onboarding: ○ not complete — /gsd onboarding to start`);
|
|
211
|
+
statusLines.push(` Global preferences: ${globalConfigured ? "configured" : "not set"}`);
|
|
212
|
+
statusLines.push(` Project state: ${detection.state}`);
|
|
213
|
+
if (detection.projectSignals.primaryLanguage) {
|
|
214
|
+
statusLines.push(` Detected: ${detection.projectSignals.primaryLanguage}`);
|
|
215
|
+
}
|
|
190
216
|
ctx.ui.notify(statusLines.join("\n"), "info");
|
|
191
|
-
ctx.ui.notify("
|
|
192
|
-
" /gsd setup llm
|
|
193
|
-
" /gsd setup
|
|
194
|
-
" /gsd setup
|
|
195
|
-
" /gsd setup
|
|
196
|
-
" /gsd setup
|
|
217
|
+
ctx.ui.notify("Configuration hub:\n" +
|
|
218
|
+
" /gsd setup llm — LLM provider & auth\n" +
|
|
219
|
+
" /gsd setup model — Default model picker\n" +
|
|
220
|
+
" /gsd setup search — Web search provider\n" +
|
|
221
|
+
" /gsd setup remote — Remote questions (Discord/Slack/Telegram)\n" +
|
|
222
|
+
" /gsd setup keys — API keys (alias for /gsd keys)\n" +
|
|
223
|
+
" /gsd setup prefs — Global preferences (alias for /gsd prefs)\n" +
|
|
224
|
+
" /gsd setup onboarding — Full wizard (alias for /gsd onboarding)\n\n" +
|
|
225
|
+
"Tip: /gsd onboarding --resume to continue an incomplete setup.", "info");
|
|
197
226
|
}
|
|
198
227
|
function sortModelsForSelection(models, currentModel) {
|
|
199
228
|
return [...models].sort((a, b) => {
|
|
@@ -370,7 +399,12 @@ export async function handleCoreCommand(trimmed, ctx, pi) {
|
|
|
370
399
|
return true;
|
|
371
400
|
}
|
|
372
401
|
if (trimmed === "setup" || trimmed.startsWith("setup ")) {
|
|
373
|
-
await handleSetup(trimmed.replace(/^setup\s*/, "").trim(), ctx);
|
|
402
|
+
await handleSetup(trimmed.replace(/^setup\s*/, "").trim(), ctx, pi);
|
|
403
|
+
return true;
|
|
404
|
+
}
|
|
405
|
+
if (trimmed === "onboarding" || trimmed.startsWith("onboarding ")) {
|
|
406
|
+
const { handleOnboarding } = await import("./onboarding.js");
|
|
407
|
+
await handleOnboarding(trimmed.replace(/^onboarding\s*/, "").trim(), ctx);
|
|
374
408
|
return true;
|
|
375
409
|
}
|
|
376
410
|
return false;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// GSD Extension — /gsd escalate Command Handler (ADR-011 Phase 2)
|
|
2
|
+
// Surface and resolve mid-execution escalations from the CLI.
|
|
3
|
+
import { projectRoot } from "../context.js";
|
|
4
|
+
import { getActiveMilestoneId } from "../../state.js";
|
|
5
|
+
import { readEscalationArtifact, formatEscalationForDisplay, resolveEscalation, listActionableEscalations, listAllEscalations, } from "../../escalation.js";
|
|
6
|
+
import { saveDecisionToDb } from "../../db-writer.js";
|
|
7
|
+
import { loadEffectiveGSDPreferences } from "../../preferences.js";
|
|
8
|
+
import { invalidateStateCache } from "../../state.js";
|
|
9
|
+
import { emitUokAuditEvent, buildAuditEnvelope } from "../../uok/audit.js";
|
|
10
|
+
function helpMessage() {
|
|
11
|
+
return [
|
|
12
|
+
"/gsd escalate — manage mid-execution escalations (ADR-011 Phase 2)",
|
|
13
|
+
"",
|
|
14
|
+
"Subcommands:",
|
|
15
|
+
" list [--all] show pending escalations (use --all to include resolved)",
|
|
16
|
+
" show <taskId> print the escalation artifact",
|
|
17
|
+
" resolve <taskId> <choice> [rationale...]",
|
|
18
|
+
" resolve an escalation — choice is an option id,",
|
|
19
|
+
" `accept` (use recommendation), or `reject-blocker`",
|
|
20
|
+
" (convert to a blocker and trigger slice replan)",
|
|
21
|
+
"",
|
|
22
|
+
"Note: disabling `phases.mid_execution_escalation` does NOT clear pending",
|
|
23
|
+
"escalations. If you need to drain them, re-enable the flag, resolve via",
|
|
24
|
+
"`/gsd escalate resolve`, then disable.",
|
|
25
|
+
].join("\n");
|
|
26
|
+
}
|
|
27
|
+
function formatListEntries(rows, basePath) {
|
|
28
|
+
if (rows.length === 0)
|
|
29
|
+
return "No escalations.";
|
|
30
|
+
return rows.map((t) => {
|
|
31
|
+
const art = t.escalation_artifact_path ? readEscalationArtifact(t.escalation_artifact_path) : null;
|
|
32
|
+
const status = t.escalation_pending ? "PENDING (paused)" : t.escalation_awaiting_review ? "awaiting-review" : "resolved";
|
|
33
|
+
const question = art?.question ?? "(artifact missing)";
|
|
34
|
+
return ` ${t.slice_id}/${t.id} [${status}] ${question}`;
|
|
35
|
+
}).join("\n");
|
|
36
|
+
}
|
|
37
|
+
export async function handleEscalateCommand(args, ctx, pi) {
|
|
38
|
+
void pi;
|
|
39
|
+
const trimmed = args.trim();
|
|
40
|
+
if (trimmed === "" || trimmed === "help") {
|
|
41
|
+
ctx.ui.notify(helpMessage(), "info");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const basePath = projectRoot();
|
|
45
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
46
|
+
if (prefs?.phases?.mid_execution_escalation !== true) {
|
|
47
|
+
ctx.ui.notify("Escalation is off. Enable with `phases: { mid_execution_escalation: true }` in your PREFERENCES.md.", "warning");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const milestoneId = await getActiveMilestoneId(basePath);
|
|
51
|
+
if (!milestoneId) {
|
|
52
|
+
ctx.ui.notify("No active milestone — cannot list escalations.", "warning");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// ── list ────────────────────────────────────────────────────────────────
|
|
56
|
+
if (trimmed === "list" || trimmed === "list --all" || trimmed === "--all") {
|
|
57
|
+
const includeAll = trimmed.includes("--all");
|
|
58
|
+
const rows = includeAll ? listAllEscalations(milestoneId) : listActionableEscalations(milestoneId);
|
|
59
|
+
const body = formatListEntries(rows, basePath);
|
|
60
|
+
ctx.ui.notify(`${includeAll ? "All escalations" : "Actionable escalations"} for ${milestoneId}:\n${body}`, "info");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Parse a possibly-slice-qualified task id: "Sxx/Tyy" or plain "Tyy".
|
|
64
|
+
// Returns { sliceId?, taskId }.
|
|
65
|
+
const parseTaskRef = (ref) => {
|
|
66
|
+
const slash = ref.indexOf("/");
|
|
67
|
+
if (slash > 0) {
|
|
68
|
+
return { sliceId: ref.slice(0, slash), taskId: ref.slice(slash + 1) };
|
|
69
|
+
}
|
|
70
|
+
return { taskId: ref };
|
|
71
|
+
};
|
|
72
|
+
// Resolve a task ref to a single row, surfacing ambiguity when a bare task
|
|
73
|
+
// id matches more than one slice.
|
|
74
|
+
const locateRow = (ref) => {
|
|
75
|
+
const { sliceId, taskId } = parseTaskRef(ref);
|
|
76
|
+
const rows = listAllEscalations(milestoneId).filter((t) => t.id === taskId && (sliceId === undefined || t.slice_id === sliceId));
|
|
77
|
+
if (rows.length === 0)
|
|
78
|
+
return "not-found";
|
|
79
|
+
if (rows.length > 1)
|
|
80
|
+
return "ambiguous";
|
|
81
|
+
return rows[0];
|
|
82
|
+
};
|
|
83
|
+
// ── show <taskRef> ──────────────────────────────────────────────────────
|
|
84
|
+
if (trimmed.startsWith("show ")) {
|
|
85
|
+
const ref = trimmed.slice(5).trim();
|
|
86
|
+
const row = locateRow(ref);
|
|
87
|
+
if (row === "ambiguous") {
|
|
88
|
+
ctx.ui.notify(`Task ${ref} matches multiple slices. Use Sxx/Tyy format.`, "warning");
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (row === "not-found" || !row.escalation_artifact_path) {
|
|
92
|
+
ctx.ui.notify(`No escalation found for ${ref} in ${milestoneId}.`, "warning");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const art = readEscalationArtifact(row.escalation_artifact_path);
|
|
96
|
+
if (!art) {
|
|
97
|
+
ctx.ui.notify(`Escalation artifact at ${row.escalation_artifact_path} is missing or malformed.`, "error");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
ctx.ui.notify(formatEscalationForDisplay(art), "info");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// ── resolve <taskRef> <choice> [rationale...] ───────────────────────────
|
|
104
|
+
if (trimmed.startsWith("resolve ")) {
|
|
105
|
+
const parts = trimmed.slice(8).trim().split(/\s+/);
|
|
106
|
+
const ref = parts[0];
|
|
107
|
+
const choice = parts[1];
|
|
108
|
+
const rationale = parts.slice(2).join(" ").trim();
|
|
109
|
+
if (!ref || !choice) {
|
|
110
|
+
ctx.ui.notify("Usage: /gsd escalate resolve <taskId|Sxx/Tyy> <choice> [rationale...]", "warning");
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const row = locateRow(ref);
|
|
114
|
+
if (row === "ambiguous") {
|
|
115
|
+
ctx.ui.notify(`Task ${ref} matches multiple slices. Use Sxx/Tyy format.`, "warning");
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (row === "not-found") {
|
|
119
|
+
ctx.ui.notify(`No escalation found for ${ref} in ${milestoneId}.`, "warning");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const taskId = row.id;
|
|
123
|
+
const result = resolveEscalation(basePath, milestoneId, row.slice_id, taskId, choice, rationale);
|
|
124
|
+
invalidateStateCache();
|
|
125
|
+
if (result.status !== "resolved" && result.status !== "rejected-to-blocker") {
|
|
126
|
+
ctx.ui.notify(result.message, result.status === "invalid-choice" ? "warning" : "error");
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// Persist the user's choice as a decision (only for resolved, not reject-blocker).
|
|
130
|
+
if (result.status === "resolved") {
|
|
131
|
+
try {
|
|
132
|
+
const art = row.escalation_artifact_path ? readEscalationArtifact(row.escalation_artifact_path) : null;
|
|
133
|
+
const scope = `${milestoneId}/${row.slice_id}/${taskId}`;
|
|
134
|
+
const decisionText = art?.question ?? `escalation on ${taskId}`;
|
|
135
|
+
const choiceLabel = choice === "accept"
|
|
136
|
+
? `${art?.recommendation ?? "accepted"} (recommended)`
|
|
137
|
+
: (result.chosenOption?.label ?? choice);
|
|
138
|
+
const { id: decisionId } = await saveDecisionToDb({
|
|
139
|
+
scope,
|
|
140
|
+
decision: decisionText,
|
|
141
|
+
choice: choiceLabel,
|
|
142
|
+
rationale: rationale || result.chosenOption?.tradeoffs || "User-resolved escalation.",
|
|
143
|
+
made_by: "human",
|
|
144
|
+
source: "escalation",
|
|
145
|
+
when_context: `ADR-011 escalation resolved ${new Date().toISOString()}`,
|
|
146
|
+
}, basePath);
|
|
147
|
+
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
148
|
+
traceId: `escalation:${milestoneId}:${row.slice_id}:${taskId}`,
|
|
149
|
+
category: "gate",
|
|
150
|
+
type: "escalation-decision-persisted",
|
|
151
|
+
payload: {
|
|
152
|
+
milestoneId,
|
|
153
|
+
sliceId: row.slice_id,
|
|
154
|
+
taskId,
|
|
155
|
+
decisionId,
|
|
156
|
+
choice,
|
|
157
|
+
},
|
|
158
|
+
}));
|
|
159
|
+
ctx.ui.notify(`${result.message}\nDecision recorded as ${decisionId}. Run /gsd auto to continue.`, "success");
|
|
160
|
+
}
|
|
161
|
+
catch (decErr) {
|
|
162
|
+
ctx.ui.notify(`${result.message}\nWARN: decision persistence failed: ${decErr.message}`, "warning");
|
|
163
|
+
}
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// rejected-to-blocker path
|
|
167
|
+
ctx.ui.notify(`${result.message} Run /gsd auto to trigger the replan.`, "success");
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
ctx.ui.notify(`Unknown subcommand. ${helpMessage()}`, "warning");
|
|
171
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// GSD — /gsd onboarding command handler (re-entry hub)
|
|
2
|
+
//
|
|
3
|
+
// The first-run wizard in src/onboarding.ts uses @clack/prompts and takes over
|
|
4
|
+
// raw stdin. Running it from inside the pi-coding-agent TUI wedges the TUI
|
|
5
|
+
// (clack leaves stdin paused + cooked, pi-tui's data handler then receives no
|
|
6
|
+
// keypresses). So re-entry cannot replay the clack wizard — instead it routes
|
|
7
|
+
// to a setup hub built from ctx.ui.select, which the TUI owns.
|
|
8
|
+
//
|
|
9
|
+
// Clack-only steps (llm/search/remote/tool-keys via the first-run wizard) are
|
|
10
|
+
// surfaced as notifications pointing the user at the canonical per-step
|
|
11
|
+
// commands (/login, /gsd keys, /gsd remote) that are already ctx.ui-safe.
|
|
12
|
+
import { ONBOARDING_STEPS, isValidStepId, } from "../../setup-catalog.js";
|
|
13
|
+
import { isOnboardingComplete, readOnboardingRecord, resetOnboarding, } from "../../onboarding-state.js";
|
|
14
|
+
function parseArgs(raw) {
|
|
15
|
+
const tokens = raw.split(/\s+/).filter(Boolean);
|
|
16
|
+
const out = { reset: false, step: null, stepValid: null };
|
|
17
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
18
|
+
const t = tokens[i];
|
|
19
|
+
if (t === "--reset" || t === "reset")
|
|
20
|
+
out.reset = true;
|
|
21
|
+
else if (t === "--resume" || t === "resume") {
|
|
22
|
+
// Re-entry no longer replays the wizard; --resume collapses into the hub.
|
|
23
|
+
}
|
|
24
|
+
else if (t === "--step" || t === "step") {
|
|
25
|
+
const next = tokens[i + 1];
|
|
26
|
+
if (next) {
|
|
27
|
+
out.step = next;
|
|
28
|
+
out.stepValid = isValidStepId(next);
|
|
29
|
+
i++;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else if (t.startsWith("--step=")) {
|
|
33
|
+
const v = t.slice(7);
|
|
34
|
+
out.step = v;
|
|
35
|
+
out.stepValid = isValidStepId(v);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
// ─── Per-step routing ────────────────────────────────────────────────────────
|
|
41
|
+
//
|
|
42
|
+
// Clack-based steps are surfaced as notifications — running them inline from
|
|
43
|
+
// the TUI would wedge stdin (see header comment). Everything else routes to an
|
|
44
|
+
// existing ctx.ui-safe handler.
|
|
45
|
+
async function runStep(ctx, stepId) {
|
|
46
|
+
switch (stepId) {
|
|
47
|
+
case "llm":
|
|
48
|
+
ctx.ui.notify("LLM provider setup: run /login to sign in via OAuth, or /gsd keys add to paste an API key.", "info");
|
|
49
|
+
return;
|
|
50
|
+
case "search":
|
|
51
|
+
ctx.ui.notify("Web search setup: run /gsd keys add and pick a search provider (brave, tavily, etc.).", "info");
|
|
52
|
+
return;
|
|
53
|
+
case "remote":
|
|
54
|
+
ctx.ui.notify("Remote questions setup: run /gsd remote to configure Discord / Slack / Telegram notifications.", "info");
|
|
55
|
+
return;
|
|
56
|
+
case "tool-keys":
|
|
57
|
+
ctx.ui.notify("Tool keys setup: run /gsd keys add to save API keys for Context7, Jina, Groq voice, etc.", "info");
|
|
58
|
+
return;
|
|
59
|
+
case "model": {
|
|
60
|
+
const { handleCoreCommand } = await import("./core.js");
|
|
61
|
+
await handleCoreCommand("model", ctx);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
case "prefs": {
|
|
65
|
+
const { ensurePreferencesFile, handlePrefsWizard } = await import("../../commands-prefs-wizard.js");
|
|
66
|
+
const { getGlobalGSDPreferencesPath } = await import("../../preferences.js");
|
|
67
|
+
await ensurePreferencesFile(getGlobalGSDPreferencesPath(), ctx, "global");
|
|
68
|
+
await handlePrefsWizard(ctx, "global");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
case "doctor": {
|
|
72
|
+
try {
|
|
73
|
+
const { runProviderDoctor } = await import("../../doctor-providers.js");
|
|
74
|
+
if (typeof runProviderDoctor === "function") {
|
|
75
|
+
await runProviderDoctor(ctx);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch { /* fall through */ }
|
|
80
|
+
ctx.ui.notify("Run /gsd doctor to validate your setup.", "info");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
case "skills":
|
|
84
|
+
ctx.ui.notify("Skill install runs during /gsd init. Use /gsd init or /skill manage.", "info");
|
|
85
|
+
return;
|
|
86
|
+
case "project": {
|
|
87
|
+
const { handleCoreCommand } = await import("./core.js");
|
|
88
|
+
await handleCoreCommand("init", ctx);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// ─── Setup hub ───────────────────────────────────────────────────────────────
|
|
94
|
+
async function renderSetupHub(ctx) {
|
|
95
|
+
const record = readOnboardingRecord();
|
|
96
|
+
const completed = new Set(record.completedSteps);
|
|
97
|
+
const skipped = new Set(record.skippedSteps);
|
|
98
|
+
const labels = ONBOARDING_STEPS.map(step => {
|
|
99
|
+
const mark = completed.has(step.id) ? "✓" : skipped.has(step.id) ? "↷" : "○";
|
|
100
|
+
const req = step.required ? " (required)" : "";
|
|
101
|
+
return `${mark} ${step.label}${req} — ${step.hint}`;
|
|
102
|
+
});
|
|
103
|
+
const labelToStep = new Map(labels.map((label, i) => [label, ONBOARDING_STEPS[i].id]));
|
|
104
|
+
const choice = await ctx.ui.select("GSD Setup — pick a step to configure", labels);
|
|
105
|
+
if (typeof choice !== "string")
|
|
106
|
+
return;
|
|
107
|
+
const stepId = labelToStep.get(choice);
|
|
108
|
+
if (!stepId)
|
|
109
|
+
return;
|
|
110
|
+
await runStep(ctx, stepId);
|
|
111
|
+
}
|
|
112
|
+
function renderStatus() {
|
|
113
|
+
const r = readOnboardingRecord();
|
|
114
|
+
const lines = ["GSD Onboarding\n"];
|
|
115
|
+
if (r.completedAt) {
|
|
116
|
+
lines.push(` Completed: ${r.completedAt}`);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
lines.push(` Status: not complete`);
|
|
120
|
+
}
|
|
121
|
+
if (r.lastResumePoint)
|
|
122
|
+
lines.push(` Last step: ${r.lastResumePoint}`);
|
|
123
|
+
lines.push("");
|
|
124
|
+
lines.push(" Steps:");
|
|
125
|
+
for (const step of ONBOARDING_STEPS) {
|
|
126
|
+
const mark = r.completedSteps.includes(step.id)
|
|
127
|
+
? "✓"
|
|
128
|
+
: r.skippedSteps.includes(step.id)
|
|
129
|
+
? "↷"
|
|
130
|
+
: "○";
|
|
131
|
+
const reqTag = step.required ? " (required)" : "";
|
|
132
|
+
lines.push(` ${mark} ${step.id.padEnd(10)} — ${step.label}${reqTag}`);
|
|
133
|
+
}
|
|
134
|
+
return lines.join("\n");
|
|
135
|
+
}
|
|
136
|
+
export async function handleOnboarding(rawArgs, ctx) {
|
|
137
|
+
const args = parseArgs(rawArgs.trim());
|
|
138
|
+
if (args.step !== null) {
|
|
139
|
+
if (!args.stepValid) {
|
|
140
|
+
const validIds = ONBOARDING_STEPS.map(s => s.id).join(", ");
|
|
141
|
+
ctx.ui.notify(`Unknown step "${args.step}". Valid: ${validIds}`, "warning");
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
await runStep(ctx, args.step);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (args.reset) {
|
|
148
|
+
resetOnboarding();
|
|
149
|
+
ctx.ui.notify("Onboarding state cleared. API keys/credentials are unchanged — manage them with /gsd keys. Restart GSD to re-run the first-run wizard, or pick a step below.", "info");
|
|
150
|
+
await renderSetupHub(ctx);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// No flags (or --resume). Show status if complete, then open the hub.
|
|
154
|
+
if (isOnboardingComplete()) {
|
|
155
|
+
ctx.ui.notify(renderStatus(), "info");
|
|
156
|
+
}
|
|
157
|
+
await renderSetupHub(ctx);
|
|
158
|
+
}
|
|
159
|
+
export { renderStatus as renderOnboardingStatus };
|