@opengsd/gsd-pi 1.4.0 → 1.5.0-dev.4fb2d460
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 +11 -11
- package/dist/onboarding.js +11 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +20 -25
- package/dist/resources/extensions/ask-user-questions.js +1 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +118 -53
- package/dist/resources/extensions/cursor-cli/index.js +16 -0
- package/dist/resources/extensions/cursor-cli/models.js +63 -0
- package/dist/resources/extensions/cursor-cli/package.json +11 -0
- package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
- package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
- package/dist/resources/extensions/gsd/activity-log.js +4 -1
- package/dist/resources/extensions/gsd/artifact-verification.js +25 -9
- package/dist/resources/extensions/gsd/auto/closeout.js +137 -42
- package/dist/resources/extensions/gsd/auto/finalize.js +9 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -3
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +5 -2
- package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +12 -3
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -7
- package/dist/resources/extensions/gsd/auto-dispatch.js +31 -7
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
- package/dist/resources/extensions/gsd/auto-prompts.js +76 -2
- package/dist/resources/extensions/gsd/auto-recovery.js +50 -6
- package/dist/resources/extensions/gsd/auto-start.js +8 -6
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
- package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
- package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
- package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
- package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
- package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
- package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
- package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
- package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
- package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +20 -2046
- package/dist/resources/extensions/gsd/auto.js +31 -5
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -0
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +134 -7
- package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +58 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +194 -28
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +14 -1
- package/dist/resources/extensions/gsd/codebase-generator.js +164 -20
- package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +153 -1
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
- package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
- package/dist/resources/extensions/gsd/db/queries.js +48 -9
- package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
- package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +292 -18
- package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
- package/dist/resources/extensions/gsd/doctor.js +93 -3
- package/dist/resources/extensions/gsd/exec-sandbox.js +6 -2
- package/dist/resources/extensions/gsd/flat-phase-migration.js +106 -26
- package/dist/resources/extensions/gsd/forensics.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
- package/dist/resources/extensions/gsd/git-service.js +59 -18
- package/dist/resources/extensions/gsd/gsd-db.js +75 -11
- package/dist/resources/extensions/gsd/guidance.js +1 -0
- package/dist/resources/extensions/gsd/guided-flow.js +62 -19
- package/dist/resources/extensions/gsd/key-manager.js +1 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +40 -11
- package/dist/resources/extensions/gsd/md-importer.js +89 -23
- package/dist/resources/extensions/gsd/migrate-external.js +24 -7
- package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +14 -3
- package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
- package/dist/resources/extensions/gsd/paths.js +17 -3
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- package/dist/resources/extensions/gsd/preferences-skills.js +10 -16
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +107 -2
- package/dist/resources/extensions/gsd/preferences.js +49 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -2
- package/dist/resources/extensions/gsd/prompts/system.md +6 -6
- package/dist/resources/extensions/gsd/quick.js +12 -3
- package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
- package/dist/resources/extensions/gsd/repo-identity.js +16 -0
- package/dist/resources/extensions/gsd/repository-registry.js +6 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +4 -2
- package/dist/resources/extensions/gsd/safe-fs.js +23 -2
- package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
- package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
- package/dist/resources/extensions/gsd/tool-contract.js +14 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +76 -8
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +13 -5
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
- package/dist/resources/extensions/gsd/unit-registry.js +37 -2
- package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
- package/dist/resources/extensions/gsd/workspace.js +26 -8
- package/dist/resources/extensions/gsd/worktree-command.js +1 -1
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +81 -14
- package/dist/resources/extensions/gsd/worktree-manager.js +97 -4
- package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
- package/dist/resources/extensions/shared/interview-ui.js +62 -9
- 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 +9 -9
- 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/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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.js +2 -2
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +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 +9 -9
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- 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/app/_not-found/page-a6fb1847f67f167c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/wizard.d.ts +8 -0
- package/dist/wizard.js +8 -1
- package/integrations/hermes/CONTEXT.md +47 -0
- package/integrations/hermes/README.md +21 -0
- package/integrations/hermes/__init__.py +31 -0
- package/integrations/hermes/docs/issue-1162-grilling.md +197 -0
- package/integrations/hermes/docs/setup.md +4 -0
- package/integrations/hermes/open_gsd_hermes/commands.py +141 -0
- package/integrations/hermes/open_gsd_hermes/config.py +2 -0
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +591 -39
- package/integrations/hermes/open_gsd_hermes/notifications.py +10 -1
- package/integrations/hermes/plugin.yaml +4 -0
- package/integrations/hermes/tests/test_config.py +6 -0
- package/integrations/hermes/tests/test_directory_loader.py +37 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +3 -0
- package/integrations/hermes/tests/test_gsd_client_execute.py +35 -0
- package/integrations/hermes/tests/test_gsd_client_process_cwd.py +22 -0
- package/integrations/hermes/tests/test_gsd_client_timeout.py +98 -0
- package/integrations/hermes/tests/test_milestone_client.py +447 -0
- package/integrations/hermes/tests/test_new_milestone_command.py +313 -0
- package/integrations/hermes/tests/test_supervisor_fsm.py +40 -0
- package/package.json +8 -8
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
- package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-runtime.js +25 -1
- package/packages/daemon/dist/cloud-runtime.js.map +1 -1
- package/packages/daemon/dist/cloud-runtime.test.js +51 -0
- package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
- package/packages/daemon/dist/message-batcher.d.ts +7 -0
- package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
- package/packages/daemon/dist/message-batcher.js +13 -0
- package/packages/daemon/dist/message-batcher.js.map +1 -1
- package/packages/daemon/dist/message-batcher.test.js +48 -0
- package/packages/daemon/dist/message-batcher.test.js.map +1 -1
- package/packages/daemon/dist/session-manager.js +1 -1
- package/packages/daemon/dist/session-manager.js.map +1 -1
- package/packages/daemon/package.json +5 -5
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js +4 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +3 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +18 -5
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +46 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +14 -9
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +3 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +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/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
- package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
- package/packages/pi-ai/dist/tool-result-content.js +62 -0
- package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
- package/packages/pi-ai/dist/types.d.ts +10 -22
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +74 -53
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +30 -2
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +3 -0
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-directories.d.ts +66 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.js +138 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +4 -1
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/dist/rpc-client.js +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/core/export-html/template.js +53 -4
- package/pkg/package.json +1 -1
- package/scripts/link-workspace-packages.cjs +14 -4
- package/src/resources/GSD-WORKFLOW.md +20 -25
- package/src/resources/extensions/ask-user-questions.ts +1 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +130 -51
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +371 -39
- package/src/resources/extensions/cursor-cli/index.ts +18 -0
- package/src/resources/extensions/cursor-cli/models.ts +65 -0
- package/src/resources/extensions/cursor-cli/package.json +11 -0
- package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
- package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
- package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
- package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
- package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
- package/src/resources/extensions/gsd/activity-log.ts +4 -1
- package/src/resources/extensions/gsd/artifact-verification.ts +25 -9
- package/src/resources/extensions/gsd/auto/closeout.ts +163 -58
- package/src/resources/extensions/gsd/auto/finalize.ts +8 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -3
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +5 -2
- package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +8 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +12 -3
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
- package/src/resources/extensions/gsd/auto-dispatch.ts +35 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +73 -2
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
- package/src/resources/extensions/gsd/auto-start.ts +9 -6
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
- package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
- package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
- package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
- package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
- package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
- package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
- package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
- package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
- package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
- package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +69 -2390
- package/src/resources/extensions/gsd/auto.ts +32 -19
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -0
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +148 -7
- package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +80 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +229 -28
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +23 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +186 -19
- package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +135 -1
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
- package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
- package/src/resources/extensions/gsd/db/queries.ts +49 -9
- package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
- package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +372 -22
- package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
- package/src/resources/extensions/gsd/doctor-types.ts +5 -1
- package/src/resources/extensions/gsd/doctor.ts +95 -3
- package/src/resources/extensions/gsd/exec-sandbox.ts +6 -2
- package/src/resources/extensions/gsd/flat-phase-migration.ts +132 -25
- package/src/resources/extensions/gsd/forensics.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
- package/src/resources/extensions/gsd/git-service.ts +67 -17
- package/src/resources/extensions/gsd/gsd-db.ts +105 -11
- package/src/resources/extensions/gsd/guidance.ts +2 -0
- package/src/resources/extensions/gsd/guided-flow.ts +71 -20
- package/src/resources/extensions/gsd/key-manager.ts +1 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +40 -10
- package/src/resources/extensions/gsd/md-importer.ts +93 -22
- package/src/resources/extensions/gsd/migrate-external.ts +23 -6
- package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +19 -4
- package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
- package/src/resources/extensions/gsd/model-router.ts +4 -5
- package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
- package/src/resources/extensions/gsd/paths.ts +21 -3
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -3
- package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
- package/src/resources/extensions/gsd/preferences-types.ts +30 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +97 -2
- package/src/resources/extensions/gsd/preferences.ts +58 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -2
- package/src/resources/extensions/gsd/prompts/system.md +6 -6
- package/src/resources/extensions/gsd/quick.ts +11 -3
- package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
- package/src/resources/extensions/gsd/repo-identity.ts +17 -0
- package/src/resources/extensions/gsd/repository-registry.ts +7 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +3 -2
- package/src/resources/extensions/gsd/safe-fs.ts +22 -2
- package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
- package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -5
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +111 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +387 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +571 -5
- package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +109 -2
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/import-completion-lost-update.test.ts +196 -0
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
- package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -15
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +592 -23
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +50 -6
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +264 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/preferences.test.ts +169 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +31 -9
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/schedule-wakeup-tool.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +259 -0
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +208 -1
- package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +36 -3
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
- package/src/resources/extensions/gsd/tool-contract.ts +29 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +107 -9
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +13 -5
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
- package/src/resources/extensions/gsd/unit-registry.ts +48 -2
- package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
- package/src/resources/extensions/gsd/workspace.ts +42 -8
- package/src/resources/extensions/gsd/worktree-command.ts +1 -1
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +154 -26
- package/src/resources/extensions/gsd/worktree-manager.ts +143 -5
- package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
- package/src/resources/extensions/shared/interview-ui.ts +58 -11
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +32 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
- /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → gXoWec4UNqcR0tkuHwYCr}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → gXoWec4UNqcR0tkuHwYCr}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
import { computeProgressScore, formatProgressLine } from "../../progress-score.js";
|
|
3
|
-
import {
|
|
3
|
+
import { isRepositoryDirty } from "../../git-service.js";
|
|
4
|
+
import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath, modelIdsForProfileResolution, resolveProfileAnchorProvider, resolveDisabledModelProvidersFromPreferences } from "../../preferences.js";
|
|
5
|
+
import { createRepositoryRegistryFromPreferences } from "../../repository-registry.js";
|
|
4
6
|
import { ensurePreferencesFile, handlePrefs, handlePrefsMode, handlePrefsWizard, handleLanguage } from "../../commands-prefs-wizard.js";
|
|
5
7
|
import { runEnvironmentChecks } from "../../doctor-environment.js";
|
|
6
8
|
import { deriveState } from "../../state.js";
|
|
@@ -206,7 +208,7 @@ export async function handleStatus(ctx) {
|
|
|
206
208
|
},
|
|
207
209
|
});
|
|
208
210
|
if (result === undefined) {
|
|
209
|
-
ctx.ui.notify(formatTextStatus(state), "info");
|
|
211
|
+
ctx.ui.notify(formatTextStatus(state, basePath), "info");
|
|
210
212
|
}
|
|
211
213
|
}
|
|
212
214
|
export async function fireStatusViaCommand(ctx) {
|
|
@@ -539,7 +541,8 @@ export async function handleCoreCommand(trimmed, ctx, pi) {
|
|
|
539
541
|
}
|
|
540
542
|
return false;
|
|
541
543
|
}
|
|
542
|
-
export function formatTextStatus(state) {
|
|
544
|
+
export function formatTextStatus(state, basePath) {
|
|
545
|
+
const root = basePath ?? projectRoot();
|
|
543
546
|
const lines = ["GSD Status\n"];
|
|
544
547
|
lines.push(formatProgressLine(computeProgressScore()));
|
|
545
548
|
lines.push("");
|
|
@@ -582,7 +585,7 @@ export function formatTextStatus(state) {
|
|
|
582
585
|
lines.push(` ${icon} ${milestone.id}: ${milestone.title} (${milestone.status})`);
|
|
583
586
|
}
|
|
584
587
|
}
|
|
585
|
-
const envResults = runEnvironmentChecks(
|
|
588
|
+
const envResults = runEnvironmentChecks(root);
|
|
586
589
|
const envIssues = envResults.filter((result) => result.status !== "ok");
|
|
587
590
|
if (envIssues.length > 0) {
|
|
588
591
|
lines.push("");
|
|
@@ -591,5 +594,38 @@ export function formatTextStatus(state) {
|
|
|
591
594
|
lines.push(` ${issue.status === "error" ? "✗" : "⚠"} ${issue.message}`);
|
|
592
595
|
}
|
|
593
596
|
}
|
|
597
|
+
// Parent-workspace per-repository git health (#818). No-op for single-repo
|
|
598
|
+
// projects; surfaces which declared child repos have uncommitted changes.
|
|
599
|
+
const repoBlock = buildWorkspaceRepoStatusBlock(root);
|
|
600
|
+
if (repoBlock) {
|
|
601
|
+
lines.push("");
|
|
602
|
+
lines.push("Repositories:");
|
|
603
|
+
lines.push(repoBlock);
|
|
604
|
+
}
|
|
594
605
|
return lines.join("\n");
|
|
595
606
|
}
|
|
607
|
+
/**
|
|
608
|
+
* Build a per-repository dirty/clean summary for parent-workspace status.
|
|
609
|
+
* Returns "" for single-repo (project-mode) projects so the status output is
|
|
610
|
+
* unchanged; otherwise one line per declared child repository.
|
|
611
|
+
*/
|
|
612
|
+
function buildWorkspaceRepoStatusBlock(basePath) {
|
|
613
|
+
let registry;
|
|
614
|
+
try {
|
|
615
|
+
registry = createRepositoryRegistryFromPreferences(basePath, loadEffectiveGSDPreferences(basePath)?.preferences);
|
|
616
|
+
}
|
|
617
|
+
catch {
|
|
618
|
+
return "";
|
|
619
|
+
}
|
|
620
|
+
if (registry.mode !== "parent")
|
|
621
|
+
return "";
|
|
622
|
+
const childRepos = registry.repositories.filter((repo) => repo.id !== "project");
|
|
623
|
+
if (childRepos.length === 0)
|
|
624
|
+
return "";
|
|
625
|
+
return childRepos
|
|
626
|
+
.map((repo) => {
|
|
627
|
+
const dirty = isRepositoryDirty(repo.root);
|
|
628
|
+
return ` ${dirty ? "✗" : "✓"} ${repo.id}${repo.role ? ` — ${repo.role}` : ""}${dirty ? " (uncommitted changes)" : " (clean)"}`;
|
|
629
|
+
})
|
|
630
|
+
.join("\n");
|
|
631
|
+
}
|
|
@@ -16,7 +16,7 @@ import { appendCapture, hasPendingCaptures, loadPendingCaptures } from "./captur
|
|
|
16
16
|
import { appendOverride, appendKnowledge } from "./files.js";
|
|
17
17
|
import { formatDoctorIssuesForPrompt, formatDoctorReport, formatDoctorReportJson, runGSDDoctor, selectDoctorScope, filterDoctorIssues, } from "./doctor.js";
|
|
18
18
|
import { isAutoActive, checkRemoteAutoSession } from "./auto.js";
|
|
19
|
-
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
19
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
20
20
|
import { currentDirectoryRoot, projectRoot } from "./commands/context.js";
|
|
21
21
|
import { loadPrompt } from "./prompt-loader.js";
|
|
22
22
|
import { buildClaudeRuntimeFloorAdvisory } from "../../shared/claude-runtime-floor.js";
|
|
@@ -533,6 +533,19 @@ export function buildCategorySummaries(prefs) {
|
|
|
533
533
|
if (parts.length > 0)
|
|
534
534
|
integrationsSummary = parts.join(", ");
|
|
535
535
|
}
|
|
536
|
+
// Workspace (parent-workspace multi-repo)
|
|
537
|
+
const workspace = prefs.workspace;
|
|
538
|
+
const workspaceRepos = workspace?.repositories;
|
|
539
|
+
let workspaceSummary = "(single-repo)";
|
|
540
|
+
{
|
|
541
|
+
const parts = [];
|
|
542
|
+
if (workspace?.mode)
|
|
543
|
+
parts.push(`mode: ${workspace.mode}`);
|
|
544
|
+
if (workspaceRepos && Object.keys(workspaceRepos).length > 0)
|
|
545
|
+
parts.push(`${Object.keys(workspaceRepos).length} repo(s)`);
|
|
546
|
+
if (parts.length > 0)
|
|
547
|
+
workspaceSummary = parts.join(", ");
|
|
548
|
+
}
|
|
536
549
|
return {
|
|
537
550
|
mode: modeSummary,
|
|
538
551
|
models: modelsSummary,
|
|
@@ -550,6 +563,7 @@ export function buildCategorySummaries(prefs) {
|
|
|
550
563
|
hooks: hooksSummary,
|
|
551
564
|
uok: uokSummary,
|
|
552
565
|
integrations: integrationsSummary,
|
|
566
|
+
workspace: workspaceSummary,
|
|
553
567
|
};
|
|
554
568
|
}
|
|
555
569
|
// ─── Category configuration functions ────────────────────────────────────────
|
|
@@ -716,7 +730,10 @@ async function configureDynamicRouting(ctx, prefs) {
|
|
|
716
730
|
const hooks = await promptBoolean(ctx, "Route hook sessions dynamically", dr.hooks, true);
|
|
717
731
|
if (hooks !== undefined)
|
|
718
732
|
dr.hooks = hooks;
|
|
719
|
-
|
|
733
|
+
// Opt-out flag (#1115): routing is allowed for flat-rate providers by
|
|
734
|
+
// default; only an explicit `false` suppresses it. The default hint reflects
|
|
735
|
+
// that allow-by-default behavior.
|
|
736
|
+
const flatRate = await promptBoolean(ctx, "Allow dynamic routing for flat-rate providers", dr.allow_flat_rate_providers, true);
|
|
720
737
|
if (flatRate !== undefined)
|
|
721
738
|
dr.allow_flat_rate_providers = flatRate;
|
|
722
739
|
// tier_models.light / standard / heavy — optional model IDs
|
|
@@ -892,6 +909,135 @@ async function configureSkills(ctx, prefs) {
|
|
|
892
909
|
const staleness = await promptInteger(ctx, "Skill staleness days (0 to disable)", prefs.skill_staleness_days, "60");
|
|
893
910
|
applyNumber(prefs, "skill_staleness_days", staleness);
|
|
894
911
|
}
|
|
912
|
+
async function configureWorkspace(ctx, prefs) {
|
|
913
|
+
let workspace = (prefs.workspace ?? {});
|
|
914
|
+
// Mode
|
|
915
|
+
const mode = await promptEnum(ctx, "Workspace mode", workspace.mode, ["project", "parent"]);
|
|
916
|
+
if (mode !== undefined)
|
|
917
|
+
workspace = { ...workspace, mode: mode };
|
|
918
|
+
if (workspace.mode !== "parent") {
|
|
919
|
+
// Single-repo mode: drop any declared repositories and persist.
|
|
920
|
+
if (workspace.repositories && Object.keys(workspace.repositories).length > 0) {
|
|
921
|
+
const clear = await promptBoolean(ctx, "Clear declared repositories (switch to single-repo)?", false, false);
|
|
922
|
+
if (clear)
|
|
923
|
+
workspace = { mode: workspace.mode };
|
|
924
|
+
}
|
|
925
|
+
persistWorkspace(prefs, workspace);
|
|
926
|
+
return;
|
|
927
|
+
}
|
|
928
|
+
// Parent mode — edit child repositories via a sub-menu.
|
|
929
|
+
let repositories = { ...(workspace.repositories ?? {}) };
|
|
930
|
+
while (true) {
|
|
931
|
+
const ids = Object.keys(repositories).sort();
|
|
932
|
+
const summary = ids.length === 0 ? "(no repositories — parent mode requires at least one)" : `${ids.length} repo(s)`;
|
|
933
|
+
const listLabels = ids.map((id) => {
|
|
934
|
+
const r = repositories[id];
|
|
935
|
+
const roleStr = r.role ? ` — ${r.role}` : "";
|
|
936
|
+
const policyStr = r.commit_policy === "skip" ? " [skip]" : "";
|
|
937
|
+
return `${id} (${r.path})${roleStr}${policyStr}`;
|
|
938
|
+
});
|
|
939
|
+
const choice = await ctx.ui.select(`Declared repositories — ${summary}`, [...listLabels, "Add repository", "Done"]);
|
|
940
|
+
const pick = typeof choice === "string" ? choice : "";
|
|
941
|
+
if (!pick || pick === "Done")
|
|
942
|
+
break;
|
|
943
|
+
if (pick === "Add repository") {
|
|
944
|
+
const idInput = await ctx.ui.input("Repository id (letters, digits, . _ -; 'project' is reserved):", "");
|
|
945
|
+
const id = typeof idInput === "string" ? idInput.trim() : "";
|
|
946
|
+
if (!id || !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(id)) {
|
|
947
|
+
ctx.ui.notify("Invalid repository id — must match ^[A-Za-z0-9][A-Za-z0-9._-]*$ and cannot be 'project'.", "warning");
|
|
948
|
+
continue;
|
|
949
|
+
}
|
|
950
|
+
if (id === "project" || repositories[id]) {
|
|
951
|
+
ctx.ui.notify(`Repository id "${id}" is reserved or already declared.`, "warning");
|
|
952
|
+
continue;
|
|
953
|
+
}
|
|
954
|
+
const pathInput = await ctx.ui.input("Repository path (relative to project root, e.g. frontend):", "");
|
|
955
|
+
const path = typeof pathInput === "string" ? pathInput.trim() : "";
|
|
956
|
+
if (!path) {
|
|
957
|
+
ctx.ui.notify("Repository path is required.", "warning");
|
|
958
|
+
continue;
|
|
959
|
+
}
|
|
960
|
+
const repo = { path };
|
|
961
|
+
const roleInput = await ctx.ui.input("Role/label (optional):", "");
|
|
962
|
+
if (typeof roleInput === "string" && roleInput.trim())
|
|
963
|
+
repo.role = roleInput.trim();
|
|
964
|
+
const verifyInput = await ctx.ui.input("Verification commands (comma- or newline-separated, optional):", "");
|
|
965
|
+
if (typeof verifyInput === "string" && verifyInput.trim()) {
|
|
966
|
+
const cmds = parseStringList(verifyInput);
|
|
967
|
+
if (cmds.length > 0)
|
|
968
|
+
repo.verification = cmds;
|
|
969
|
+
}
|
|
970
|
+
const policy = await promptEnum(ctx, "Commit policy", undefined, ["auto", "skip"]);
|
|
971
|
+
if (policy === "skip")
|
|
972
|
+
repo.commit_policy = "skip";
|
|
973
|
+
repositories[id] = repo;
|
|
974
|
+
}
|
|
975
|
+
else {
|
|
976
|
+
// Edit/delete an existing repo (the first token is the id).
|
|
977
|
+
const id = pick.split(" ")[0];
|
|
978
|
+
if (!repositories[id])
|
|
979
|
+
continue;
|
|
980
|
+
const editChoice = await ctx.ui.select(`Repository ${id}`, ["Edit path", "Edit role", "Edit verification", "Edit commit policy", "Delete repository", "Cancel"]);
|
|
981
|
+
const ec = typeof editChoice === "string" ? editChoice : "";
|
|
982
|
+
if (!ec || ec === "Cancel")
|
|
983
|
+
continue;
|
|
984
|
+
if (ec === "Delete repository") {
|
|
985
|
+
delete repositories[id];
|
|
986
|
+
}
|
|
987
|
+
else if (ec === "Edit path") {
|
|
988
|
+
const v = await ctx.ui.input("Repository path:", repositories[id].path);
|
|
989
|
+
if (typeof v === "string" && v.trim())
|
|
990
|
+
repositories[id] = { ...repositories[id], path: v.trim() };
|
|
991
|
+
}
|
|
992
|
+
else if (ec === "Edit role") {
|
|
993
|
+
const v = await ctx.ui.input("Role/label (blank to clear):", repositories[id].role ?? "");
|
|
994
|
+
if (typeof v === "string" && v.trim())
|
|
995
|
+
repositories[id] = { ...repositories[id], role: v.trim() };
|
|
996
|
+
else if (typeof v === "string") {
|
|
997
|
+
const { role, ...rest } = repositories[id];
|
|
998
|
+
void role;
|
|
999
|
+
repositories[id] = rest;
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
else if (ec === "Edit verification") {
|
|
1003
|
+
const v = await ctx.ui.input("Verification commands (blank to clear):", (repositories[id].verification ?? []).join(", "));
|
|
1004
|
+
if (typeof v === "string" && v.trim()) {
|
|
1005
|
+
const cmds = parseStringList(v);
|
|
1006
|
+
if (cmds.length > 0)
|
|
1007
|
+
repositories[id] = { ...repositories[id], verification: cmds };
|
|
1008
|
+
}
|
|
1009
|
+
else if (typeof v === "string") {
|
|
1010
|
+
const { verification, ...rest } = repositories[id];
|
|
1011
|
+
void verification;
|
|
1012
|
+
repositories[id] = rest;
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
else if (ec === "Edit commit policy") {
|
|
1016
|
+
const policy = await promptEnum(ctx, "Commit policy", repositories[id].commit_policy, ["auto", "skip"]);
|
|
1017
|
+
if (policy === "skip")
|
|
1018
|
+
repositories[id] = { ...repositories[id], commit_policy: "skip" };
|
|
1019
|
+
else {
|
|
1020
|
+
const { commit_policy, ...rest } = repositories[id];
|
|
1021
|
+
void commit_policy;
|
|
1022
|
+
repositories[id] = rest;
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
if (Object.keys(repositories).length === 0) {
|
|
1028
|
+
ctx.ui.notify("Parent mode requires at least one repository — mode not saved.", "warning");
|
|
1029
|
+
return;
|
|
1030
|
+
}
|
|
1031
|
+
persistWorkspace(prefs, { mode: "parent", repositories });
|
|
1032
|
+
}
|
|
1033
|
+
/** Persist the workspace config onto prefs, dropping it entirely when empty. */
|
|
1034
|
+
function persistWorkspace(prefs, workspace) {
|
|
1035
|
+
if (!workspace.mode && (!workspace.repositories || Object.keys(workspace.repositories).length === 0)) {
|
|
1036
|
+
delete prefs.workspace;
|
|
1037
|
+
return;
|
|
1038
|
+
}
|
|
1039
|
+
prefs.workspace = workspace;
|
|
1040
|
+
}
|
|
895
1041
|
async function configureSkillRules(ctx, prefs) {
|
|
896
1042
|
let rules = Array.isArray(prefs.skill_rules) ? [...prefs.skill_rules] : [];
|
|
897
1043
|
while (true) {
|
|
@@ -1100,6 +1246,8 @@ async function configureVerification(ctx, prefs) {
|
|
|
1100
1246
|
prefs.verification_auto_fix = autoFix;
|
|
1101
1247
|
const maxRetries = await promptInteger(ctx, "Verification max retries", prefs.verification_max_retries, "2");
|
|
1102
1248
|
applyNumber(prefs, "verification_max_retries", maxRetries);
|
|
1249
|
+
const perUnitCap = await promptNumber(ctx, "Per-unit cost cap (USD; retry cost ceiling, blank = clear to default)", prefs.per_unit_cost_cap_usd, "5.0");
|
|
1250
|
+
applyNumber(prefs, "per_unit_cost_cap_usd", perUnitCap);
|
|
1103
1251
|
const ev = await promptBoolean(ctx, "Enhanced verification (master toggle)", prefs.enhanced_verification, true);
|
|
1104
1252
|
if (ev !== undefined)
|
|
1105
1253
|
prefs.enhanced_verification = ev;
|
|
@@ -1564,6 +1712,7 @@ export async function handlePrefsWizard(ctx, scope, prefill, opts) {
|
|
|
1564
1712
|
`Hooks ${summaries.hooks}`,
|
|
1565
1713
|
`UoK ${summaries.uok}`,
|
|
1566
1714
|
`Integrations ${summaries.integrations}`,
|
|
1715
|
+
`Workspace ${summaries.workspace}`,
|
|
1567
1716
|
`Advanced ${summaries.advanced}`,
|
|
1568
1717
|
`── Save & Exit ──`,
|
|
1569
1718
|
];
|
|
@@ -1601,6 +1750,8 @@ export async function handlePrefsWizard(ctx, scope, prefill, opts) {
|
|
|
1601
1750
|
await configureUoK(ctx, prefs);
|
|
1602
1751
|
else if (choice.startsWith("Integrations"))
|
|
1603
1752
|
await configureIntegrations(ctx, prefs);
|
|
1753
|
+
else if (choice.startsWith("Workspace"))
|
|
1754
|
+
await configureWorkspace(ctx, prefs);
|
|
1604
1755
|
else if (choice.startsWith("Advanced"))
|
|
1605
1756
|
await configureAdvanced(ctx, prefs);
|
|
1606
1757
|
}
|
|
@@ -1727,6 +1878,7 @@ export function serializePreferencesToFrontmatter(prefs) {
|
|
|
1727
1878
|
"reactive_execution", "gate_evaluation",
|
|
1728
1879
|
"auto_visualize", "auto_report",
|
|
1729
1880
|
"verification_commands", "verification_auto_fix", "verification_max_retries",
|
|
1881
|
+
"per_unit_cost_cap_usd",
|
|
1730
1882
|
"enhanced_verification", "enhanced_verification_pre",
|
|
1731
1883
|
"enhanced_verification_post", "enhanced_verification_strict",
|
|
1732
1884
|
"safety_harness",
|
|
@@ -5,7 +5,7 @@ import { join } from "node:path";
|
|
|
5
5
|
import { resolveByName, autoDetect, listTemplates, getTemplateInfo, loadWorkflowTemplate, loadRegistry, isLegacyWorkflowMode, } from "./workflow-templates.js";
|
|
6
6
|
import { loadPrompt } from "./prompt-loader.js";
|
|
7
7
|
import { gsdRoot } from "./paths.js";
|
|
8
|
-
import { createGitService, runGit } from "./git-service.js";
|
|
8
|
+
import { createGitService, runGit, taskBranchArgs } from "./git-service.js";
|
|
9
9
|
import { isAutoActive, isAutoPaused } from "./auto.js";
|
|
10
10
|
import { getErrorMessage } from "./error-utils.js";
|
|
11
11
|
import { resolvePlugin } from "./workflow-plugins.js";
|
|
@@ -349,7 +349,7 @@ export async function handleStart(args, ctx, pi) {
|
|
|
349
349
|
git.autoCommit("workflow-template", templateId, []);
|
|
350
350
|
}
|
|
351
351
|
catch { /* nothing to commit */ }
|
|
352
|
-
runGit(basePath,
|
|
352
|
+
runGit(basePath, taskBranchArgs(basePath, branchName, current, git.getMainBranch()));
|
|
353
353
|
branchCreated = true;
|
|
354
354
|
}
|
|
355
355
|
}
|
|
@@ -481,7 +481,7 @@ export function dispatchMarkdownPhasePlugin(plugin, description, ctx, pi) {
|
|
|
481
481
|
git.autoCommit("workflow-template", templateId, []);
|
|
482
482
|
}
|
|
483
483
|
catch { /* nothing to commit */ }
|
|
484
|
-
runGit(basePath,
|
|
484
|
+
runGit(basePath, taskBranchArgs(basePath, branchName, current, git.getMainBranch()));
|
|
485
485
|
branchCreated = true;
|
|
486
486
|
}
|
|
487
487
|
}
|
|
@@ -251,8 +251,17 @@ async function handleRemove(args, ctx) {
|
|
|
251
251
|
return;
|
|
252
252
|
}
|
|
253
253
|
try {
|
|
254
|
-
removeWorktree(basePath, name, { deleteBranch: true });
|
|
255
|
-
|
|
254
|
+
const removed = removeWorktree(basePath, name, { deleteBranch: true });
|
|
255
|
+
if (removed) {
|
|
256
|
+
ctx.ui.notify(`Removed worktree ${name}.`, "info");
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
ctx.ui.notify([
|
|
260
|
+
`Worktree removal aborted for "${name}" to preserve uncommitted changes.`,
|
|
261
|
+
"",
|
|
262
|
+
"Manual quarantine recovery may be needed before retrying removal.",
|
|
263
|
+
].join("\n"), "warning");
|
|
264
|
+
}
|
|
256
265
|
}
|
|
257
266
|
catch (err) {
|
|
258
267
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -218,7 +218,7 @@ export function getMilestone(id) {
|
|
|
218
218
|
export function getActiveMilestoneFromDb() {
|
|
219
219
|
if (!getDbOrNull())
|
|
220
220
|
return null;
|
|
221
|
-
const row = getDbOrNull().prepare(
|
|
221
|
+
const row = getDbOrNull().prepare(`SELECT * FROM milestones WHERE status NOT IN (${TERMINAL_STATUS_SQL}, 'parked') ORDER BY id LIMIT 1`).get();
|
|
222
222
|
if (!row)
|
|
223
223
|
return null;
|
|
224
224
|
return rowToMilestone(row);
|
|
@@ -230,11 +230,11 @@ export function getActiveSliceFromDb(milestoneId) {
|
|
|
230
230
|
// Uses json_each() to expand the JSON depends array and checks each dep is complete.
|
|
231
231
|
const row = getDbOrNull().prepare(`SELECT s.* FROM slices s
|
|
232
232
|
WHERE s.milestone_id = :mid
|
|
233
|
-
AND s.status NOT IN (
|
|
233
|
+
AND s.status NOT IN (${TERMINAL_STATUS_SQL})
|
|
234
234
|
AND NOT EXISTS (
|
|
235
235
|
SELECT 1 FROM json_each(s.depends) AS dep
|
|
236
236
|
WHERE dep.value NOT IN (
|
|
237
|
-
SELECT id FROM slices WHERE milestone_id = :mid AND status IN (
|
|
237
|
+
SELECT id FROM slices WHERE milestone_id = :mid AND status IN (${TERMINAL_STATUS_SQL})
|
|
238
238
|
)
|
|
239
239
|
)
|
|
240
240
|
ORDER BY s.sequence, s.id
|
|
@@ -246,7 +246,7 @@ export function getActiveSliceFromDb(milestoneId) {
|
|
|
246
246
|
export function getActiveTaskFromDb(milestoneId, sliceId) {
|
|
247
247
|
if (!getDbOrNull())
|
|
248
248
|
return null;
|
|
249
|
-
const row = getDbOrNull().prepare(
|
|
249
|
+
const row = getDbOrNull().prepare(`SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND status NOT IN (${TERMINAL_STATUS_SQL}) ORDER BY sequence, id LIMIT 1`).get({ ":mid": milestoneId, ":sid": sliceId });
|
|
250
250
|
if (!row)
|
|
251
251
|
return null;
|
|
252
252
|
return rowToTask(row);
|
|
@@ -265,7 +265,7 @@ export function getParallelMonitorSliceProgress(milestoneId) {
|
|
|
265
265
|
s.id AS id,
|
|
266
266
|
s.status AS status,
|
|
267
267
|
COUNT(t.id) AS total,
|
|
268
|
-
COALESCE(SUM(CASE WHEN t.status
|
|
268
|
+
COALESCE(SUM(CASE WHEN t.status IN (${TERMINAL_STATUS_SQL}) THEN 1 ELSE 0 END), 0) AS done
|
|
269
269
|
FROM slices s
|
|
270
270
|
LEFT JOIN tasks t ON s.milestone_id=t.milestone_id AND s.id=t.slice_id
|
|
271
271
|
WHERE s.milestone_id=:mid
|
|
@@ -327,6 +327,45 @@ export function getSlicesByMilestoneIds(milestoneIds) {
|
|
|
327
327
|
}
|
|
328
328
|
return byMilestone;
|
|
329
329
|
}
|
|
330
|
+
/**
|
|
331
|
+
* Load tasks for many (milestone, slice) pairs in batched queries. Returns a Map
|
|
332
|
+
* keyed by `${milestone_id}\0${slice_id}`, preserving `ORDER BY sequence, id`
|
|
333
|
+
* within each bucket. Mirrors getSlicesByMilestoneIds to avoid an N+1 over tasks
|
|
334
|
+
* during full projection rebuilds.
|
|
335
|
+
*/
|
|
336
|
+
export function getTasksBySliceIds(slices) {
|
|
337
|
+
const bySlice = new Map();
|
|
338
|
+
const db = getDbOrNull();
|
|
339
|
+
if (!db || slices.length === 0)
|
|
340
|
+
return bySlice;
|
|
341
|
+
// SQLite caps bound params (~999); 2 per pair, so chunk well under the limit.
|
|
342
|
+
const CHUNK = 400;
|
|
343
|
+
for (let start = 0; start < slices.length; start += CHUNK) {
|
|
344
|
+
const chunk = slices.slice(start, start + CHUNK);
|
|
345
|
+
const clauses = [];
|
|
346
|
+
const params = {};
|
|
347
|
+
chunk.forEach((s, i) => {
|
|
348
|
+
clauses.push(`(milestone_id = :m${i} AND slice_id = :s${i})`);
|
|
349
|
+
params[`:m${i}`] = s.milestoneId;
|
|
350
|
+
params[`:s${i}`] = s.sliceId;
|
|
351
|
+
});
|
|
352
|
+
const rows = db
|
|
353
|
+
.prepare(`SELECT * FROM tasks WHERE ${clauses.join(" OR ")} ORDER BY milestone_id, slice_id, sequence, id`)
|
|
354
|
+
.all(params);
|
|
355
|
+
for (const row of rows) {
|
|
356
|
+
const task = rowToTask(row);
|
|
357
|
+
const key = `${task.milestone_id}\0${task.slice_id}`;
|
|
358
|
+
const bucket = bySlice.get(key);
|
|
359
|
+
if (bucket) {
|
|
360
|
+
bucket.push(task);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
bySlice.set(key, [task]);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return bySlice;
|
|
368
|
+
}
|
|
330
369
|
/**
|
|
331
370
|
* Consolidated DB read for dispatch/gate/completion decisions (ADR-017).
|
|
332
371
|
* `done` uses the canonical closed-status predicate (`isClosedStatus`) — the
|
|
@@ -378,7 +417,7 @@ export function getSliceScopedArtifacts(milestoneId, sliceId) {
|
|
|
378
417
|
export function getActiveMilestoneIdFromDb() {
|
|
379
418
|
if (!getDbOrNull())
|
|
380
419
|
return null;
|
|
381
|
-
const row = getDbOrNull().prepare(
|
|
420
|
+
const row = getDbOrNull().prepare(`SELECT id, status FROM milestones WHERE status NOT IN (${TERMINAL_STATUS_SQL}, 'parked') ORDER BY id LIMIT 1`).get();
|
|
382
421
|
if (!row)
|
|
383
422
|
return null;
|
|
384
423
|
return rowToIdStatusSummary(row);
|
|
@@ -393,7 +432,7 @@ export function getSliceStatusSummary(milestoneId) {
|
|
|
393
432
|
export function getActiveTaskIdFromDb(milestoneId, sliceId) {
|
|
394
433
|
if (!getDbOrNull())
|
|
395
434
|
return null;
|
|
396
|
-
const row = getDbOrNull().prepare(
|
|
435
|
+
const row = getDbOrNull().prepare(`SELECT id, status, title FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND status NOT IN (${TERMINAL_STATUS_SQL}) ORDER BY sequence, id LIMIT 1`).get({ ":mid": milestoneId, ":sid": sliceId });
|
|
397
436
|
if (!row)
|
|
398
437
|
return null;
|
|
399
438
|
return rowToActiveTaskSummary(row);
|
|
@@ -404,8 +443,8 @@ export function getSliceTaskCounts(milestoneId, sliceId) {
|
|
|
404
443
|
return emptyTaskStatusCounts();
|
|
405
444
|
const row = getDbOrNull().prepare(`SELECT
|
|
406
445
|
COUNT(*) as total,
|
|
407
|
-
SUM(CASE WHEN status IN (
|
|
408
|
-
SUM(CASE WHEN status NOT IN (
|
|
446
|
+
SUM(CASE WHEN status IN (${TERMINAL_STATUS_SQL}) THEN 1 ELSE 0 END) as done,
|
|
447
|
+
SUM(CASE WHEN status NOT IN (${TERMINAL_STATUS_SQL}) THEN 1 ELSE 0 END) as pending
|
|
409
448
|
FROM tasks WHERE milestone_id = :mid AND slice_id = :sid`).get({ ":mid": milestoneId, ":sid": sliceId });
|
|
410
449
|
return rowToTaskStatusCounts(row);
|
|
411
450
|
}
|
|
@@ -24,6 +24,17 @@ function requireDb() {
|
|
|
24
24
|
* completion timestamps cleared, in one commit. Folds the hand-rolled
|
|
25
25
|
* transaction-plus-cascade previously in tools/reopen-slice.ts. Guards run
|
|
26
26
|
* inside the transaction (TOCTOU-safe).
|
|
27
|
+
*
|
|
28
|
+
* A closed slice is always reopenable. An open slice is only reopenable when it
|
|
29
|
+
* carries a completed-task state desync (#1205): a UAT→planning fallback can
|
|
30
|
+
* leave the slice "pending" while *all* its tasks stay "complete", which
|
|
31
|
+
* deadlocks every recovery path (plan-slice/replan-slice/complete-task all
|
|
32
|
+
* reject the still-closed tasks, and slice_reopen historically rejected the
|
|
33
|
+
* still-open slice). Resetting those tasks to pending gives the planner the
|
|
34
|
+
* clean slate it needs. An open slice that still has any unfinished
|
|
35
|
+
* (pending/in-progress) task is a normal in-flight slice, not the desync, and
|
|
36
|
+
* stays rejected as "slice-not-complete" so a full reset can't wipe its
|
|
37
|
+
* legitimate progress.
|
|
27
38
|
*/
|
|
28
39
|
export function reopenSliceCascade(milestoneId, sliceId) {
|
|
29
40
|
requireDb();
|
|
@@ -43,11 +54,18 @@ export function reopenSliceCascade(milestoneId, sliceId) {
|
|
|
43
54
|
outcome = { ok: false, reason: "slice-not-found" };
|
|
44
55
|
return;
|
|
45
56
|
}
|
|
46
|
-
|
|
57
|
+
const tasks = getSliceTasks(milestoneId, sliceId);
|
|
58
|
+
// A closed slice is always reopenable. An open slice is only the #1205
|
|
59
|
+
// desync when EVERY task is already closed (a UAT→planning fallback left the
|
|
60
|
+
// slice open with all tasks still "complete"). Requiring *all* tasks closed
|
|
61
|
+
// (not merely one) means a normal in-flight slice — which keeps at least one
|
|
62
|
+
// pending/in-progress task — is rejected, so a full reset can't wipe its
|
|
63
|
+
// legitimate progress.
|
|
64
|
+
const allTasksClosed = tasks.length > 0 && tasks.every((t) => isClosedStatus(t.status));
|
|
65
|
+
if (!isClosedStatus(slice.status) && !allTasksClosed) {
|
|
47
66
|
outcome = { ok: false, reason: "slice-not-complete", status: slice.status };
|
|
48
67
|
return;
|
|
49
68
|
}
|
|
50
|
-
const tasks = getSliceTasks(milestoneId, sliceId);
|
|
51
69
|
getDbOrNull().prepare(`UPDATE slices SET status = 'in_progress', completed_at = NULL WHERE milestone_id = :mid AND id = :sid`).run({ ":mid": milestoneId, ":sid": sliceId });
|
|
52
70
|
getDbOrNull().prepare(`UPDATE tasks SET status = 'pending', completed_at = NULL WHERE milestone_id = :mid AND slice_id = :sid`).run({ ":mid": milestoneId, ":sid": sliceId });
|
|
53
71
|
outcome = { ok: true, tasksReset: tasks.length };
|
|
@@ -53,8 +53,10 @@ function noteDbRowRecoveryMiss(entry) {
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
function ensureMilestoneRowForAcceptedHandoff(entry, contextFile) {
|
|
56
|
-
if (!isDbAvailable())
|
|
57
|
-
|
|
56
|
+
if (!isDbAvailable()) {
|
|
57
|
+
logWarning("guided", `R3b: milestone ${entry.milestoneId} DB-row recovery skipped because DB is unavailable`);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
58
60
|
const { basePath, milestoneId } = entry;
|
|
59
61
|
const milestoneRow = getMilestone(milestoneId);
|
|
60
62
|
if (milestoneRow)
|
|
@@ -77,12 +79,15 @@ function ensureMilestoneRowForAcceptedHandoff(entry, contextFile) {
|
|
|
77
79
|
}
|
|
78
80
|
logWarning("guided", `R3b: ${milestoneId} has CONTEXT.md but no DB row — inserting placeholder "queued" row ` +
|
|
79
81
|
`(attempt ${entry.r3bRecoveryCount + 1}/${MAX_DB_ROW_RECOVERIES})`);
|
|
82
|
+
let inserted = false;
|
|
80
83
|
try {
|
|
81
|
-
insertMilestone({ id: milestoneId, title: milestoneId, status: "queued" });
|
|
84
|
+
inserted = insertMilestone({ id: milestoneId, title: milestoneId, status: "queued" });
|
|
82
85
|
}
|
|
83
86
|
catch (e) {
|
|
84
87
|
logWarning("guided", `R3b: insertMilestone failed: ${e.message}`);
|
|
85
88
|
}
|
|
89
|
+
if (inserted)
|
|
90
|
+
return true;
|
|
86
91
|
if (getMilestone(milestoneId))
|
|
87
92
|
return true;
|
|
88
93
|
noteDbRowRecoveryMiss(entry);
|
|
@@ -163,7 +163,7 @@ Diagnostics record the file path, scope (global/project), severity (error/warnin
|
|
|
163
163
|
- **Deprecated:** `merge_to_main` — no longer valid; milestone-level merge is always used. Remove this setting.
|
|
164
164
|
|
|
165
165
|
- `workspace`: configures multi-repository parent workspaces. Keys:
|
|
166
|
-
- `mode`: `"project"` (default single-repo behavior) or `"parent"` (one `.gsd` controlling child repos).
|
|
166
|
+
- `mode`: `"project"` (default single-repo behavior) or `"parent"` (one `.gsd` controlling child repos). In `"parent"` mode at least one child repository must be declared under `repositories`, otherwise the setting is rejected at validation time.
|
|
167
167
|
- `repositories`: object map of repository IDs to config.
|
|
168
168
|
- Repository ID format: `^[A-Za-z0-9][A-Za-z0-9._-]*$`.
|
|
169
169
|
- Reserved ID: `project` is implicit and always maps to the project root; user-defined `workspace.repositories.project` is rejected.
|
|
@@ -171,6 +171,8 @@ Diagnostics record the file path, scope (global/project), severity (error/warnin
|
|
|
171
171
|
- `role`: optional short description of what the repo owns.
|
|
172
172
|
- `verification`: optional array of verification commands for that repo.
|
|
173
173
|
- `commit_policy`: optional `"auto"` or `"skip"` to include or skip commit actions per repo.
|
|
174
|
+
- Planning tools consume repository IDs through `targetRepositories`: `gsd_plan_slice.targetRepositories` sets a slice-wide default, and `gsd_plan_task.targetRepositories` records the repositories an individual task touches. Values must be declared IDs or the implicit `project`; omit these fields in single-repo projects.
|
|
175
|
+
- In parent mode with declared child repositories, `/gsd codebase generate` and automatic `.gsd/CODEBASE.md` refreshes enumerate `project` plus each child repository, render repo-labeled sections, and store repository IDs in map metadata.
|
|
174
176
|
|
|
175
177
|
## Workspace Example
|
|
176
178
|
|
|
@@ -198,6 +200,8 @@ workspace:
|
|
|
198
200
|
|
|
199
201
|
This config sets a parent workspace with two child repositories. The implicit `project` repository is always created for the project root and cannot be user-defined.
|
|
200
202
|
|
|
203
|
+
In `"parent"` mode, slice/task `targetRepositories` default to the declared child repositories (here `frontend` and `backend`) rather than the root `project` repo. In `"project"` mode (the default), `targetRepositories` defaults to `["project"]`.
|
|
204
|
+
|
|
201
205
|
- `unique_milestone_ids`: boolean — when `true`, generates milestone IDs in `M{seq}-{rand6}` format (e.g. `M001-eh88as`) instead of plain sequential `M001`. Prevents ID collisions in team workflows where multiple contributors create milestones concurrently. Both formats coexist — existing `M001`-style milestones remain valid. Default: `false`.
|
|
202
206
|
|
|
203
207
|
- `budget_ceiling`: number — maximum dollar amount to spend on auto-mode. When reached, behavior is controlled by `budget_enforcement`. Default: no limit.
|
|
@@ -303,7 +307,9 @@ This config sets a parent workspace with two child repositories. The implicit `p
|
|
|
303
307
|
- `verification`: string[] (optional) — repository-specific verification commands used when global `verification_commands` is not set.
|
|
304
308
|
- `commit_policy`: `"auto"` | `"skip"` (optional) — per-repository closeout commit behavior.
|
|
305
309
|
- `project` is always an implicit repository target mapped to the project root for backward compatibility.
|
|
306
|
-
-
|
|
310
|
+
- `targetRepositories` on `gsd_plan_slice` sets the slice-wide default. `targetRepositories` on `gsd_plan_task` records or overrides the repository IDs for an individual task.
|
|
311
|
+
- Values must match declared repository IDs or the implicit `project`; omitted plan/task `targetRepositories` defaults to `["project"]`.
|
|
312
|
+
- `/gsd codebase` is workspace-aware in parent mode with declared child repositories: generated `.gsd/CODEBASE.md` uses workspace-relative paths, groups files under `## [repo-id]` headings, and refreshes when repository registry metadata changes.
|
|
307
313
|
|
|
308
314
|
- `verification_commands`: string[] — shell commands to run as verification after task execution (e.g., `["npm test", "npm run lint"]`). Commands run in order; if any fails, the task is marked as needing fixes.
|
|
309
315
|
|