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
|
@@ -61,9 +61,10 @@ function truncateMessage(msg: string, maxLen: number): string {
|
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
63
|
* Build compact health lines for the widget.
|
|
64
|
-
*
|
|
64
|
+
* When `width` is provided, system + budget render left and last-commit
|
|
65
|
+
* right-aligned. Without width, all parts are joined inline (RPC fallback).
|
|
65
66
|
*/
|
|
66
|
-
export function buildHealthLines(data: HealthWidgetData): string[] {
|
|
67
|
+
export function buildHealthLines(data: HealthWidgetData, width?: number): string[] {
|
|
67
68
|
if (data.projectState === "none") {
|
|
68
69
|
return [" GSD No project loaded — run /gsd to start"];
|
|
69
70
|
}
|
|
@@ -72,40 +73,68 @@ export function buildHealthLines(data: HealthWidgetData): string[] {
|
|
|
72
73
|
return [" GSD Project initialized — run /gsd to continue setup"];
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
const
|
|
76
|
+
const leftParts: string[] = [];
|
|
76
77
|
|
|
77
78
|
const totalIssues = data.environmentErrorCount + data.environmentWarningCount + (data.providerIssue ? 1 : 0);
|
|
78
79
|
if (totalIssues === 0) {
|
|
79
|
-
|
|
80
|
+
leftParts.push("● System OK");
|
|
80
81
|
} else if (data.environmentErrorCount > 0 || data.providerIssue?.includes("✗")) {
|
|
81
|
-
|
|
82
|
+
leftParts.push(`✗ ${totalIssues} issue${totalIssues > 1 ? "s" : ""}`);
|
|
82
83
|
} else {
|
|
83
|
-
|
|
84
|
+
leftParts.push(`⚠ ${totalIssues} warning${totalIssues > 1 ? "s" : ""}`);
|
|
84
85
|
}
|
|
85
86
|
|
|
86
87
|
if (data.budgetCeiling !== undefined && data.budgetCeiling > 0) {
|
|
87
88
|
const pct = Math.min(100, (data.budgetSpent / data.budgetCeiling) * 100);
|
|
88
|
-
|
|
89
|
+
leftParts.push(`Budget: ${formatCost(data.budgetSpent)}/${formatCost(data.budgetCeiling)} (${pct.toFixed(0)}%)`);
|
|
89
90
|
} else if (data.budgetSpent > 0) {
|
|
90
|
-
|
|
91
|
+
leftParts.push(`Spent: ${formatCost(data.budgetSpent)}`);
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
if (data.providerIssue) {
|
|
94
|
-
|
|
95
|
+
leftParts.push(data.providerIssue);
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
if (data.environmentErrorCount > 0) {
|
|
98
|
-
|
|
99
|
+
leftParts.push(`Env: ${data.environmentErrorCount} error${data.environmentErrorCount > 1 ? "s" : ""}`);
|
|
99
100
|
} else if (data.environmentWarningCount > 0) {
|
|
100
|
-
|
|
101
|
+
leftParts.push(`Env: ${data.environmentWarningCount} warning${data.environmentWarningCount > 1 ? "s" : ""}`);
|
|
101
102
|
}
|
|
102
103
|
|
|
103
|
-
//
|
|
104
|
+
// Last commit goes on the right-hand side when width is known.
|
|
105
|
+
let rightText = "";
|
|
104
106
|
if (data.lastCommitEpoch !== null && data.lastCommitEpoch > 0) {
|
|
105
107
|
const relTime = formatRelativeTime(data.lastCommitEpoch);
|
|
106
108
|
const msg = data.lastCommitMessage ? ` — ${truncateMessage(data.lastCommitMessage, 50)}` : "";
|
|
107
|
-
|
|
109
|
+
rightText = `Last commit: ${relTime}${msg}`;
|
|
108
110
|
}
|
|
109
111
|
|
|
110
|
-
|
|
112
|
+
const leftText = leftParts.join(" │ ");
|
|
113
|
+
|
|
114
|
+
if (width === undefined) {
|
|
115
|
+
const inline = rightText ? `${leftText} │ ${rightText}` : leftText;
|
|
116
|
+
return [` ${inline}`];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const prefix = " ";
|
|
120
|
+
const innerWidth = Math.max(0, width - prefix.length);
|
|
121
|
+
const leftVis = leftText.length;
|
|
122
|
+
const rightVis = rightText.length;
|
|
123
|
+
|
|
124
|
+
if (!rightText) return [`${prefix}${truncateMessage(leftText, innerWidth)}`];
|
|
125
|
+
const MIN_GAP = 2;
|
|
126
|
+
if (leftVis + MIN_GAP + rightVis > innerWidth) {
|
|
127
|
+
// Preserve the left (status + budget) and truncate the right side
|
|
128
|
+
// (last commit) with an ellipsis so the combined line never exceeds
|
|
129
|
+
// innerWidth. If even the left alone overflows, clamp it too.
|
|
130
|
+
const leftRoom = Math.max(1, Math.min(leftVis, innerWidth - MIN_GAP - 1));
|
|
131
|
+
const clampedLeft = truncateMessage(leftText, leftRoom);
|
|
132
|
+
const rightRoom = Math.max(0, innerWidth - clampedLeft.length - MIN_GAP);
|
|
133
|
+
const clampedRight = rightRoom > 0 ? truncateMessage(rightText, rightRoom) : "";
|
|
134
|
+
if (!clampedRight) return [`${prefix}${clampedLeft}`];
|
|
135
|
+
const pad = " ".repeat(Math.max(MIN_GAP, innerWidth - clampedLeft.length - clampedRight.length));
|
|
136
|
+
return [`${prefix}${clampedLeft}${pad}${clampedRight}`];
|
|
137
|
+
}
|
|
138
|
+
const padding = " ".repeat(innerWidth - leftVis - rightVis);
|
|
139
|
+
return [`${prefix}${leftText}${padding}${rightText}`];
|
|
111
140
|
}
|
|
@@ -129,12 +129,16 @@ export function initHealthWidget(ctx: ExtensionContext): void {
|
|
|
129
129
|
void refresh();
|
|
130
130
|
}, REFRESH_INTERVAL_MS);
|
|
131
131
|
|
|
132
|
+
let cachedWidth: number | undefined;
|
|
132
133
|
return {
|
|
133
|
-
render(
|
|
134
|
-
if (!cachedLines
|
|
134
|
+
render(width: number): string[] {
|
|
135
|
+
if (!cachedLines || cachedWidth !== width) {
|
|
136
|
+
cachedLines = buildHealthLines(data, width);
|
|
137
|
+
cachedWidth = width;
|
|
138
|
+
}
|
|
135
139
|
return cachedLines;
|
|
136
140
|
},
|
|
137
|
-
invalidate(): void { cachedLines = undefined; },
|
|
141
|
+
invalidate(): void { cachedLines = undefined; cachedWidth = undefined; },
|
|
138
142
|
dispose(): void {
|
|
139
143
|
clearInterval(refreshTimer);
|
|
140
144
|
},
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// GSD Extension — Layer 2 Event Emitter Bridge
|
|
2
|
+
//
|
|
3
|
+
// Holds a module-scoped reference to the ExtensionAPI so deeply-nested code
|
|
4
|
+
// (auto-loop, git-service callers, verification, budget) can emit Layer 2
|
|
5
|
+
// events without having to thread `pi` through every function signature.
|
|
6
|
+
//
|
|
7
|
+
// Set once from `registerGsdExtension`. All emitters are best-effort — a
|
|
8
|
+
// missing `pi` (e.g. in standalone unit tests) silently becomes a no-op.
|
|
9
|
+
|
|
10
|
+
import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
11
|
+
import type {
|
|
12
|
+
BeforeCommitEventResult,
|
|
13
|
+
BeforePrEventResult,
|
|
14
|
+
BeforePushEventResult,
|
|
15
|
+
BeforeVerifyEventResult,
|
|
16
|
+
BudgetThresholdEventResult,
|
|
17
|
+
VerifyFailure,
|
|
18
|
+
} from "@gsd/pi-coding-agent";
|
|
19
|
+
|
|
20
|
+
let _pi: ExtensionAPI | undefined;
|
|
21
|
+
|
|
22
|
+
export function setHookEmitter(pi: ExtensionAPI): void {
|
|
23
|
+
_pi = pi;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function clearHookEmitter(): void {
|
|
27
|
+
_pi = undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ─── Notification ──────────────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
export async function emitNotification(
|
|
33
|
+
kind: "blocked" | "input_needed" | "milestone_ready" | "idle" | "error",
|
|
34
|
+
message: string,
|
|
35
|
+
details?: Record<string, unknown>,
|
|
36
|
+
): Promise<void> {
|
|
37
|
+
if (!_pi) return;
|
|
38
|
+
await _pi.emitExtensionEvent({ type: "notification", kind, message, details });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ─── Git Lifecycle ─────────────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
export async function emitBeforeCommit(args: {
|
|
44
|
+
message: string;
|
|
45
|
+
files: string[];
|
|
46
|
+
cwd: string;
|
|
47
|
+
author?: string;
|
|
48
|
+
}): Promise<BeforeCommitEventResult | undefined> {
|
|
49
|
+
if (!_pi) return undefined;
|
|
50
|
+
return (await _pi.emitExtensionEvent({
|
|
51
|
+
type: "before_commit",
|
|
52
|
+
...args,
|
|
53
|
+
})) as BeforeCommitEventResult | undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function emitCommit(args: {
|
|
57
|
+
sha: string;
|
|
58
|
+
message: string;
|
|
59
|
+
files: string[];
|
|
60
|
+
cwd: string;
|
|
61
|
+
}): Promise<void> {
|
|
62
|
+
if (!_pi) return;
|
|
63
|
+
await _pi.emitExtensionEvent({ type: "commit", ...args });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function emitBeforePush(args: {
|
|
67
|
+
remote: string;
|
|
68
|
+
branch: string;
|
|
69
|
+
cwd: string;
|
|
70
|
+
}): Promise<BeforePushEventResult | undefined> {
|
|
71
|
+
if (!_pi) return undefined;
|
|
72
|
+
return (await _pi.emitExtensionEvent({
|
|
73
|
+
type: "before_push",
|
|
74
|
+
...args,
|
|
75
|
+
})) as BeforePushEventResult | undefined;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export async function emitPush(args: { remote: string; branch: string; cwd: string }): Promise<void> {
|
|
79
|
+
if (!_pi) return;
|
|
80
|
+
await _pi.emitExtensionEvent({ type: "push", ...args });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function emitBeforePr(args: {
|
|
84
|
+
branch: string;
|
|
85
|
+
targetBranch: string;
|
|
86
|
+
title: string;
|
|
87
|
+
body: string;
|
|
88
|
+
cwd: string;
|
|
89
|
+
}): Promise<BeforePrEventResult | undefined> {
|
|
90
|
+
if (!_pi) return undefined;
|
|
91
|
+
return (await _pi.emitExtensionEvent({
|
|
92
|
+
type: "before_pr",
|
|
93
|
+
...args,
|
|
94
|
+
})) as BeforePrEventResult | undefined;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export async function emitPrOpened(args: {
|
|
98
|
+
url: string;
|
|
99
|
+
branch: string;
|
|
100
|
+
targetBranch: string;
|
|
101
|
+
cwd: string;
|
|
102
|
+
}): Promise<void> {
|
|
103
|
+
if (!_pi) return;
|
|
104
|
+
await _pi.emitExtensionEvent({ type: "pr_opened", ...args });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// ─── Verification ──────────────────────────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
export async function emitBeforeVerify(args: {
|
|
110
|
+
unitType?: string;
|
|
111
|
+
unitId?: string;
|
|
112
|
+
cwd: string;
|
|
113
|
+
}): Promise<BeforeVerifyEventResult | undefined> {
|
|
114
|
+
if (!_pi) return undefined;
|
|
115
|
+
return (await _pi.emitExtensionEvent({
|
|
116
|
+
type: "before_verify",
|
|
117
|
+
...args,
|
|
118
|
+
})) as BeforeVerifyEventResult | undefined;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export async function emitVerifyResult(args: {
|
|
122
|
+
passed: boolean;
|
|
123
|
+
failures: VerifyFailure[];
|
|
124
|
+
unitType?: string;
|
|
125
|
+
unitId?: string;
|
|
126
|
+
cwd: string;
|
|
127
|
+
}): Promise<void> {
|
|
128
|
+
if (!_pi) return;
|
|
129
|
+
await _pi.emitExtensionEvent({ type: "verify_result", ...args });
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ─── Budget ────────────────────────────────────────────────────────────────
|
|
133
|
+
|
|
134
|
+
export async function emitBudgetThreshold(args: {
|
|
135
|
+
fraction: number;
|
|
136
|
+
spent: number;
|
|
137
|
+
limit: number;
|
|
138
|
+
}): Promise<BudgetThresholdEventResult | undefined> {
|
|
139
|
+
if (!_pi) return undefined;
|
|
140
|
+
return (await _pi.emitExtensionEvent({
|
|
141
|
+
type: "budget_threshold",
|
|
142
|
+
fraction: args.fraction,
|
|
143
|
+
spent: args.spent,
|
|
144
|
+
limit: args.limit,
|
|
145
|
+
currency: "USD",
|
|
146
|
+
})) as BudgetThresholdEventResult | undefined;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ─── Orchestrator Boundaries ───────────────────────────────────────────────
|
|
150
|
+
|
|
151
|
+
export async function emitMilestoneStart(args: {
|
|
152
|
+
milestoneId: string;
|
|
153
|
+
title?: string;
|
|
154
|
+
cwd: string;
|
|
155
|
+
}): Promise<void> {
|
|
156
|
+
if (!_pi) return;
|
|
157
|
+
await _pi.emitExtensionEvent({ type: "milestone_start", ...args });
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export async function emitMilestoneEnd(args: {
|
|
161
|
+
milestoneId: string;
|
|
162
|
+
status: "completed" | "failed" | "cancelled";
|
|
163
|
+
cwd: string;
|
|
164
|
+
}): Promise<void> {
|
|
165
|
+
if (!_pi) return;
|
|
166
|
+
await _pi.emitExtensionEvent({ type: "milestone_end", ...args });
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export async function emitUnitStart(args: {
|
|
170
|
+
unitType: string;
|
|
171
|
+
unitId: string;
|
|
172
|
+
milestoneId?: string;
|
|
173
|
+
cwd: string;
|
|
174
|
+
}): Promise<void> {
|
|
175
|
+
if (!_pi) return;
|
|
176
|
+
await _pi.emitExtensionEvent({ type: "unit_start", ...args });
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export async function emitUnitEnd(args: {
|
|
180
|
+
unitType: string;
|
|
181
|
+
unitId: string;
|
|
182
|
+
milestoneId?: string;
|
|
183
|
+
status: "completed" | "failed" | "cancelled" | "blocked";
|
|
184
|
+
cwd: string;
|
|
185
|
+
}): Promise<void> {
|
|
186
|
+
if (!_pi) return;
|
|
187
|
+
await _pi.emitExtensionEvent({ type: "unit_end", ...args });
|
|
188
|
+
}
|
|
@@ -17,6 +17,7 @@ import { assertSafeDirectory } from "./validate-directory.js";
|
|
|
17
17
|
import type { ProjectDetection, ProjectSignals } from "./detection.js";
|
|
18
18
|
import { runSkillInstallStep } from "./skill-catalog.js";
|
|
19
19
|
import { generateCodebaseMap, writeCodebaseMap } from "./codebase-generator.js";
|
|
20
|
+
import { handlePrefsWizard, writePreferencesFile } from "./commands-prefs-wizard.js";
|
|
20
21
|
|
|
21
22
|
// ─── Types ──────────────────────────────────────────────────────────────────────
|
|
22
23
|
|
|
@@ -232,8 +233,53 @@ export async function showProjectInit(
|
|
|
232
233
|
// Non-fatal — skill installation failure should never block project init
|
|
233
234
|
}
|
|
234
235
|
|
|
235
|
-
// ── Step 9:
|
|
236
|
-
|
|
236
|
+
// ── Step 9: Optional full-prefs review ─────────────────────────────────────
|
|
237
|
+
// Ask BEFORE bootstrapping so a defer (`not_yet`) leaves the project untouched.
|
|
238
|
+
// Once the user commits, we bootstrap and route preferences through the unified
|
|
239
|
+
// writer (commands-prefs-wizard.writePreferencesFile) so init and the prefs
|
|
240
|
+
// wizard share one serializer. The "Open full wizard" branch surfaces every
|
|
241
|
+
// configurable preference, prefilled with the init answers.
|
|
242
|
+
const reviewChoice = await showNextAction(ctx, {
|
|
243
|
+
title: "GSD — Review All Preferences (Optional)",
|
|
244
|
+
summary: [
|
|
245
|
+
"Open the full preferences wizard now? It includes models, timeouts,",
|
|
246
|
+
"budget, notifications, and skills — all pre-filled with your answers.",
|
|
247
|
+
"",
|
|
248
|
+
"Skip if you just want sensible defaults; you can always run /gsd prefs project later.",
|
|
249
|
+
],
|
|
250
|
+
actions: [
|
|
251
|
+
{ id: "skip", label: "Skip — use defaults", description: "Save preferences and continue", recommended: true },
|
|
252
|
+
{ id: "review", label: "Open full wizard", description: "Tweak any category before saving" },
|
|
253
|
+
],
|
|
254
|
+
notYetMessage: "Run /gsd init when ready.",
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
if (reviewChoice === "not_yet") {
|
|
258
|
+
// User deferred — don't create .gsd/ or persist preferences. Pre-step state
|
|
259
|
+
// (e.g. git init from Step 2) remains as-is, matching prior step semantics.
|
|
260
|
+
return { completed: false, bootstrapped: false };
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// ── Step 10: Bootstrap .gsd/ + write preferences ───────────────────────────
|
|
264
|
+
bootstrapGsdDirectoryStructure(basePath, signals);
|
|
265
|
+
const prefillPrefs = mapInitPrefsToWizardShape(prefs);
|
|
266
|
+
// Always derive the preferences path from basePath so init writing the
|
|
267
|
+
// structure to one location and preferences to another (cwd-derived) is
|
|
268
|
+
// impossible — see #4457 codex review.
|
|
269
|
+
const projectPrefsPath = join(gsdRoot(basePath), "PREFERENCES.md");
|
|
270
|
+
|
|
271
|
+
if (reviewChoice === "review") {
|
|
272
|
+
// Wizard writes via writePreferencesFile internally; pass pathOverride so it
|
|
273
|
+
// targets basePath rather than cwd.
|
|
274
|
+
await handlePrefsWizard(ctx, "project", prefillPrefs, { pathOverride: projectPrefsPath });
|
|
275
|
+
} else {
|
|
276
|
+
// Direct path: write the init-collected prefs through the unified writer.
|
|
277
|
+
await writePreferencesFile(projectPrefsPath, prefillPrefs, ctx, {
|
|
278
|
+
scope: "project",
|
|
279
|
+
defaultBody: buildInitPreferencesBody(),
|
|
280
|
+
notifyOnSave: false,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
237
283
|
|
|
238
284
|
// Initialize SQLite database so GSD starts in full-capability mode (#3880).
|
|
239
285
|
// Without this, isDbAvailable() returns false and GSD enters degraded
|
|
@@ -453,11 +499,13 @@ async function customizeAdvancedPrefs(
|
|
|
453
499
|
|
|
454
500
|
// ─── Bootstrap ──────────────────────────────────────────────────────────────────
|
|
455
501
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
502
|
+
/**
|
|
503
|
+
* Create .gsd/ directory structure and seed CONTEXT.md.
|
|
504
|
+
*
|
|
505
|
+
* Preferences are written separately by the caller via the unified
|
|
506
|
+
* writePreferencesFile helper so init and the prefs wizard share one path.
|
|
507
|
+
*/
|
|
508
|
+
function bootstrapGsdDirectoryStructure(basePath: string, signals: ProjectSignals): void {
|
|
461
509
|
// Final safety check before writing any files
|
|
462
510
|
assertSafeDirectory(basePath);
|
|
463
511
|
|
|
@@ -465,10 +513,6 @@ function bootstrapGsdDirectory(
|
|
|
465
513
|
mkdirSync(join(gsd, "milestones"), { recursive: true });
|
|
466
514
|
mkdirSync(join(gsd, "runtime"), { recursive: true });
|
|
467
515
|
|
|
468
|
-
// Write PREFERENCES.md from wizard answers
|
|
469
|
-
const preferencesContent = buildPreferencesFile(prefs);
|
|
470
|
-
writeFileSync(join(gsd, "PREFERENCES.md"), preferencesContent, "utf-8");
|
|
471
|
-
|
|
472
516
|
// Seed CONTEXT.md with detected project signals
|
|
473
517
|
const contextContent = buildContextSeed(signals);
|
|
474
518
|
if (contextContent) {
|
|
@@ -476,60 +520,49 @@ function bootstrapGsdDirectory(
|
|
|
476
520
|
}
|
|
477
521
|
}
|
|
478
522
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
523
|
+
/**
|
|
524
|
+
* Map init wizard's typed ProjectPreferences to the prefs-wizard's
|
|
525
|
+
* Record<string, unknown> shape, matching the keys serializePreferencesToFrontmatter
|
|
526
|
+
* expects (mode, git.{isolation,main_branch,auto_push}, verification_commands, etc.).
|
|
527
|
+
*
|
|
528
|
+
* Exported for testing; init-wizard uses it inline.
|
|
529
|
+
*/
|
|
530
|
+
export function mapInitPrefsToWizardShape(prefs: ProjectPreferences): Record<string, unknown> {
|
|
531
|
+
const out: Record<string, unknown> = {
|
|
532
|
+
mode: prefs.mode,
|
|
533
|
+
git: {
|
|
534
|
+
isolation: prefs.gitIsolation,
|
|
535
|
+
main_branch: prefs.mainBranch,
|
|
536
|
+
auto_push: prefs.autoPush,
|
|
537
|
+
},
|
|
538
|
+
};
|
|
489
539
|
|
|
490
|
-
// Verification commands
|
|
491
540
|
if (prefs.verificationCommands.length > 0) {
|
|
492
|
-
|
|
493
|
-
for (const cmd of prefs.verificationCommands) {
|
|
494
|
-
lines.push(` - "${cmd}"`);
|
|
495
|
-
}
|
|
541
|
+
out.verification_commands = prefs.verificationCommands;
|
|
496
542
|
}
|
|
497
|
-
|
|
498
|
-
// Custom instructions
|
|
499
543
|
if (prefs.customInstructions.length > 0) {
|
|
500
|
-
|
|
501
|
-
for (const inst of prefs.customInstructions) {
|
|
502
|
-
lines.push(` - "${inst.replace(/"/g, '\\"')}"`);
|
|
503
|
-
}
|
|
544
|
+
out.custom_instructions = prefs.customInstructions;
|
|
504
545
|
}
|
|
505
|
-
|
|
506
|
-
// Token profile (only if non-default)
|
|
507
546
|
if (prefs.tokenProfile !== "balanced") {
|
|
508
|
-
|
|
547
|
+
out.token_profile = prefs.tokenProfile;
|
|
509
548
|
}
|
|
510
|
-
|
|
511
|
-
// Phase skips
|
|
512
549
|
if (prefs.skipResearch) {
|
|
513
|
-
|
|
514
|
-
lines.push(" skip_research: true");
|
|
550
|
+
out.phases = { skip_research: true };
|
|
515
551
|
}
|
|
516
552
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
lines.push("prefer_skills: []");
|
|
520
|
-
lines.push("avoid_skills: []");
|
|
521
|
-
lines.push("skill_rules: []");
|
|
522
|
-
|
|
523
|
-
lines.push("---");
|
|
524
|
-
lines.push("");
|
|
525
|
-
lines.push("# GSD Project Preferences");
|
|
526
|
-
lines.push("");
|
|
527
|
-
lines.push("Generated by `/gsd init`. Edit directly or use `/gsd prefs project` to modify.");
|
|
528
|
-
lines.push("");
|
|
529
|
-
lines.push("See `~/.gsd/agent/extensions/gsd/docs/preferences-reference.md` for full field documentation.");
|
|
530
|
-
lines.push("");
|
|
553
|
+
return out;
|
|
554
|
+
}
|
|
531
555
|
|
|
532
|
-
|
|
556
|
+
function buildInitPreferencesBody(): string {
|
|
557
|
+
return [
|
|
558
|
+
"",
|
|
559
|
+
"# GSD Project Preferences",
|
|
560
|
+
"",
|
|
561
|
+
"Generated by `/gsd init`. Edit directly or use `/gsd prefs project` to modify.",
|
|
562
|
+
"",
|
|
563
|
+
"See `~/.gsd/agent/extensions/gsd/docs/preferences-reference.md` for full field documentation.",
|
|
564
|
+
"",
|
|
565
|
+
].join("\n");
|
|
533
566
|
}
|
|
534
567
|
|
|
535
568
|
function buildContextSeed(signals: ProjectSignals): string | null {
|
|
@@ -169,7 +169,7 @@ function renderRoadmapMarkdown(milestone: MilestoneRow, slices: SliceRow[]): str
|
|
|
169
169
|
lines.push("## Slices");
|
|
170
170
|
lines.push("");
|
|
171
171
|
for (const slice of slices) {
|
|
172
|
-
const done = slice.status
|
|
172
|
+
const done = isClosedStatus(slice.status) ? "x" : " ";
|
|
173
173
|
const depends = `[${(slice.depends ?? []).join(",")}]`;
|
|
174
174
|
lines.push(`- [${done}] **${slice.id}: ${slice.title}** \`risk:${slice.risk}\` \`depends:${depends}\``);
|
|
175
175
|
lines.push(` > After this: ${slice.demo}`);
|
|
@@ -496,7 +496,7 @@ export async function renderRoadmapCheckboxes(
|
|
|
496
496
|
// Apply checkbox patches for each slice
|
|
497
497
|
let updated = content;
|
|
498
498
|
for (const slice of slices) {
|
|
499
|
-
const isDone = slice.status
|
|
499
|
+
const isDone = isClosedStatus(slice.status);
|
|
500
500
|
const sid = slice.id;
|
|
501
501
|
|
|
502
502
|
if (isDone) {
|
|
@@ -821,19 +821,19 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
821
821
|
const parsed = parseRoadmap(content);
|
|
822
822
|
|
|
823
823
|
for (const slice of slices) {
|
|
824
|
-
const isCompleteInDb = slice.status
|
|
824
|
+
const isCompleteInDb = isClosedStatus(slice.status);
|
|
825
825
|
const roadmapSlice = parsed.slices.find((s: { id: string }) => s.id === slice.id);
|
|
826
826
|
if (!roadmapSlice) continue;
|
|
827
827
|
|
|
828
828
|
if (isCompleteInDb && !roadmapSlice.done) {
|
|
829
829
|
stale.push({
|
|
830
830
|
path: roadmapPath,
|
|
831
|
-
reason: `${slice.id} is
|
|
831
|
+
reason: `${slice.id} is closed in DB but unchecked in roadmap`,
|
|
832
832
|
});
|
|
833
833
|
} else if (!isCompleteInDb && roadmapSlice.done) {
|
|
834
834
|
stale.push({
|
|
835
835
|
path: roadmapPath,
|
|
836
|
-
reason: `${slice.id} is not
|
|
836
|
+
reason: `${slice.id} is not closed in DB but checked in roadmap`,
|
|
837
837
|
});
|
|
838
838
|
}
|
|
839
839
|
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// GSD2 — Decisions -> memories backfill (ADR-013 step 5)
|
|
2
|
+
//
|
|
3
|
+
// Idempotent one-shot migration that copies every active decisions row into
|
|
4
|
+
// the memories table with category="architecture" and a structured_fields
|
|
5
|
+
// payload preserving the original gsd_save_decision schema (when_context,
|
|
6
|
+
// scope, decision, choice, rationale, made_by, revisable, sourceDecisionId).
|
|
7
|
+
//
|
|
8
|
+
// The backfill exists so the cutover in ADR-013 step 6 can drop the
|
|
9
|
+
// decisions table without losing schema fidelity. Idempotency is enforced
|
|
10
|
+
// by tagging each backfilled memory with structured_fields.sourceDecisionId
|
|
11
|
+
// and skipping any decision whose ID already appears in the memories table.
|
|
12
|
+
//
|
|
13
|
+
// Triggered opportunistically by buildBeforeAgentStartResult so the cost
|
|
14
|
+
// only ever fires once per project. Costs O(N) inserts on first run where
|
|
15
|
+
// N is the active-decisions count; subsequent runs are an O(N) lookup that
|
|
16
|
+
// finds existing markers and exits.
|
|
17
|
+
|
|
18
|
+
import { isDbAvailable, _getAdapter } from "./gsd-db.js";
|
|
19
|
+
import { createMemory } from "./memory-store.js";
|
|
20
|
+
import { logWarning } from "./workflow-logger.js";
|
|
21
|
+
|
|
22
|
+
interface DecisionRow {
|
|
23
|
+
id: string;
|
|
24
|
+
when_context: string;
|
|
25
|
+
scope: string;
|
|
26
|
+
decision: string;
|
|
27
|
+
choice: string;
|
|
28
|
+
rationale: string;
|
|
29
|
+
made_by: string;
|
|
30
|
+
revisable: string;
|
|
31
|
+
superseded_by: string | null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Backfill active decisions rows into the memories table.
|
|
36
|
+
*
|
|
37
|
+
* - Idempotent (per-row): every row written carries
|
|
38
|
+
* `structured_fields.sourceDecisionId = "<decisionId>"`. Each candidate
|
|
39
|
+
* decision is checked individually; only decisions whose id is already
|
|
40
|
+
* present in the memory store are skipped. A user-authored memory with
|
|
41
|
+
* their own `sourceDecisionId` does NOT abort the backfill.
|
|
42
|
+
* - Best-effort: never throws. Logs and returns 0 on failure so a broken
|
|
43
|
+
* backfill cannot block agent startup.
|
|
44
|
+
* - Active-only: skips rows where `superseded_by IS NOT NULL`. Superseded
|
|
45
|
+
* decisions are historical record; the memory store is for active
|
|
46
|
+
* knowledge.
|
|
47
|
+
*
|
|
48
|
+
* Returns the number of memories written (0 when already backfilled or
|
|
49
|
+
* when the DB has no decisions). Callers can log the result or surface it
|
|
50
|
+
* to the user.
|
|
51
|
+
*/
|
|
52
|
+
export function backfillDecisionsToMemories(): number {
|
|
53
|
+
if (!isDbAvailable()) return 0;
|
|
54
|
+
const adapter = _getAdapter();
|
|
55
|
+
if (!adapter) return 0;
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
const decisions = adapter
|
|
59
|
+
.prepare("SELECT id, when_context, scope, decision, choice, rationale, made_by, revisable, superseded_by FROM decisions WHERE superseded_by IS NULL")
|
|
60
|
+
.all() as Array<Record<string, unknown>>;
|
|
61
|
+
|
|
62
|
+
if (decisions.length === 0) return 0;
|
|
63
|
+
|
|
64
|
+
// Per-row idempotency: each memory backfilled from a decision carries
|
|
65
|
+
// structured_fields.sourceDecisionId="<decisionId>". Skipping is decided
|
|
66
|
+
// per row by matching that exact id, NOT by a global sentinel — a global
|
|
67
|
+
// sentinel would silently abort the backfill if a user manually called
|
|
68
|
+
// capture_thought with their own structuredFields.sourceDecisionId.
|
|
69
|
+
const checkExisting = adapter.prepare(
|
|
70
|
+
"SELECT 1 FROM memories WHERE structured_fields LIKE :pattern LIMIT 1",
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
let written = 0;
|
|
74
|
+
for (const raw of decisions) {
|
|
75
|
+
const row: DecisionRow = {
|
|
76
|
+
id: String(raw["id"] ?? ""),
|
|
77
|
+
when_context: String(raw["when_context"] ?? ""),
|
|
78
|
+
scope: String(raw["scope"] ?? ""),
|
|
79
|
+
decision: String(raw["decision"] ?? ""),
|
|
80
|
+
choice: String(raw["choice"] ?? ""),
|
|
81
|
+
rationale: String(raw["rationale"] ?? ""),
|
|
82
|
+
made_by: String(raw["made_by"] ?? "agent"),
|
|
83
|
+
revisable: String(raw["revisable"] ?? ""),
|
|
84
|
+
superseded_by: raw["superseded_by"] == null ? null : String(raw["superseded_by"]),
|
|
85
|
+
};
|
|
86
|
+
if (!row.id) continue;
|
|
87
|
+
|
|
88
|
+
// Pattern is anchored to the JSON-stringified shape and the exact
|
|
89
|
+
// decision id to avoid prefix collisions (e.g. "D1" vs "D10").
|
|
90
|
+
if (checkExisting.get({ ":pattern": `%"sourceDecisionId":"${row.id}"%` })) continue;
|
|
91
|
+
|
|
92
|
+
const content = synthesizeContent(row);
|
|
93
|
+
const id = createMemory({
|
|
94
|
+
category: "architecture",
|
|
95
|
+
content,
|
|
96
|
+
scope: row.scope || "project",
|
|
97
|
+
confidence: 0.85,
|
|
98
|
+
structuredFields: {
|
|
99
|
+
sourceDecisionId: row.id,
|
|
100
|
+
when_context: row.when_context,
|
|
101
|
+
scope: row.scope,
|
|
102
|
+
decision: row.decision,
|
|
103
|
+
choice: row.choice,
|
|
104
|
+
rationale: row.rationale,
|
|
105
|
+
made_by: row.made_by,
|
|
106
|
+
revisable: row.revisable,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
if (id) written += 1;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return written;
|
|
113
|
+
} catch (e) {
|
|
114
|
+
logWarning("memory-backfill", `decisions->memories backfill failed: ${(e as Error).message}`);
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Combine the decision's structured fields into a 1-3 sentence content
|
|
121
|
+
* string suitable for keyword retrieval and human review.
|
|
122
|
+
*
|
|
123
|
+
* Format: "<decision> Chose: <choice>. Rationale: <rationale>."
|
|
124
|
+
* Truncates each field to keep the synthesized line under ~600 chars so
|
|
125
|
+
* memory_query rendering stays readable.
|
|
126
|
+
*/
|
|
127
|
+
function synthesizeContent(row: DecisionRow): string {
|
|
128
|
+
const trim = (value: string, max: number): string => {
|
|
129
|
+
const cleaned = value.replace(/\s+/g, " ").trim();
|
|
130
|
+
return cleaned.length > max ? cleaned.slice(0, max - 1) + "\u2026" : cleaned;
|
|
131
|
+
};
|
|
132
|
+
const parts: string[] = [];
|
|
133
|
+
const decision = trim(row.decision, 240);
|
|
134
|
+
const choice = trim(row.choice, 200);
|
|
135
|
+
const rationale = trim(row.rationale, 200);
|
|
136
|
+
if (decision) parts.push(decision);
|
|
137
|
+
if (choice) parts.push(`Chose: ${choice}.`);
|
|
138
|
+
if (rationale) parts.push(`Rationale: ${rationale}.`);
|
|
139
|
+
return parts.join(" ");
|
|
140
|
+
}
|