@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
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { execFileSync } from "node:child_process";
|
|
10
10
|
import { existsSync, lstatSync, mkdirSync, readdirSync, realpathSync, renameSync, cpSync, rmSync, statSync, symlinkSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
|
-
import { externalGsdRoot, isInsideWorktree } from "./repo-identity.js";
|
|
12
|
+
import { externalGsdRoot, externalStateAlreadyExistsForProject, isInsideWorktree } from "./repo-identity.js";
|
|
13
13
|
import { getErrorMessage } from "./error-utils.js";
|
|
14
14
|
import { hasGitTrackedGsdFiles } from "./gitignore.js";
|
|
15
15
|
import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
@@ -85,6 +85,16 @@ export function migrateToExternalState(basePath: string): MigrationResult {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
// If external state already contains project data, this is not a legacy
|
|
89
|
+
// migration source. It is likely an already-migrated project whose symlink
|
|
90
|
+
// was replaced by a real directory, so copying would risk data loss.
|
|
91
|
+
if (externalStateAlreadyExistsForProject(basePath)) {
|
|
92
|
+
return {
|
|
93
|
+
migrated: false,
|
|
94
|
+
error: "External state already exists for this project; leaving local .gsd directory untouched to avoid overwriting authoritative state",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
88
98
|
const externalPath = externalGsdRoot(basePath);
|
|
89
99
|
const migratingPath = join(basePath, ".gsd.migrating");
|
|
90
100
|
|
|
@@ -94,12 +104,12 @@ export function migrateToExternalState(basePath: string): MigrationResult {
|
|
|
94
104
|
|
|
95
105
|
// Rename .gsd -> .gsd.migrating (atomic lock).
|
|
96
106
|
// On Windows, NTFS may reject rename with EPERM if file descriptors are
|
|
97
|
-
// open (VS Code watchers, antivirus on-access scan).
|
|
98
|
-
// copy+delete (#1292).
|
|
107
|
+
// open (VS Code watchers, antivirus on-access scan). WSL/DrvFs can report
|
|
108
|
+
// the same transient lock as EACCES. Fall back to copy+delete (#1292).
|
|
99
109
|
try {
|
|
100
110
|
renameSync(localGsd, migratingPath);
|
|
101
111
|
} catch (renameErr: any) {
|
|
102
|
-
if (renameErr?.code === "EPERM" || renameErr?.code === "EBUSY") {
|
|
112
|
+
if (renameErr?.code === "EPERM" || renameErr?.code === "EBUSY" || renameErr?.code === "EACCES") {
|
|
103
113
|
try {
|
|
104
114
|
cpSync(localGsd, migratingPath, { recursive: true, force: true });
|
|
105
115
|
rmSync(localGsd, { recursive: true, force: true });
|
|
@@ -237,7 +247,7 @@ function isLocalGsdExternalStateJunction(basePath: string, localGsd: string): bo
|
|
|
237
247
|
* Recover from a failed migration (`.gsd.migrating` exists).
|
|
238
248
|
* Moves `.gsd.migrating` back to `.gsd` if `.gsd` doesn't exist, or removes an
|
|
239
249
|
* orphaned staging directory when `.gsd` is already a verified external state
|
|
240
|
-
* junction with intact current state.
|
|
250
|
+
* junction, or an intact real directory, with intact current state.
|
|
241
251
|
*/
|
|
242
252
|
export function recoverFailedMigration(basePath: string): boolean {
|
|
243
253
|
const localGsd = join(basePath, ".gsd");
|
|
@@ -245,8 +255,15 @@ export function recoverFailedMigration(basePath: string): boolean {
|
|
|
245
255
|
|
|
246
256
|
if (!existsSync(migratingPath)) return false;
|
|
247
257
|
if (existsSync(localGsd)) {
|
|
248
|
-
if (!isLocalGsdExternalStateJunction(basePath, localGsd)) return false;
|
|
249
258
|
if (!isCurrentGsdStateIntactForMigratingCleanup(basePath)) return false;
|
|
259
|
+
if (!isLocalGsdExternalStateJunction(basePath, localGsd)) {
|
|
260
|
+
try {
|
|
261
|
+
const stat = lstatSync(localGsd);
|
|
262
|
+
if (!stat.isDirectory()) return false;
|
|
263
|
+
} catch {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
250
267
|
try {
|
|
251
268
|
rmSync(migratingPath, { recursive: true, force: true });
|
|
252
269
|
return true;
|
|
@@ -102,13 +102,41 @@ function replaceSetPrefix(values: Set<string>, from: string, to: string): void {
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
+
/**
|
|
106
|
+
* Rewrite one milestone identity across EVERY markdown identity set. The
|
|
107
|
+
* roadmapless subset is a view of `milestones`, so it must speak the same
|
|
108
|
+
* aligned vocabulary; otherwise the discussion-phase exclusion below keys off
|
|
109
|
+
* the stale bare id, fails its `dbScan.milestones.has(...)` membership check,
|
|
110
|
+
* and decrements the milestone count even though the aligned identity remains
|
|
111
|
+
* in the set, reporting false drift for a milestone that is actually in sync.
|
|
112
|
+
* Centralising the set list here keeps every alignment path from silently
|
|
113
|
+
* missing a set (the defect that regressed the suffixed roadmapless case).
|
|
114
|
+
*/
|
|
115
|
+
function realignMilestonePrefix(markdownScan: HierarchyScan, from: string, to: string): void {
|
|
116
|
+
replaceSetPrefix(markdownScan.milestones, from, to);
|
|
117
|
+
replaceSetPrefix(markdownScan.slices, from, to);
|
|
118
|
+
replaceSetPrefix(markdownScan.tasks, from, to);
|
|
119
|
+
replaceSetPrefix(markdownScan.milestonesWithoutRoadmap, from, to);
|
|
120
|
+
}
|
|
121
|
+
|
|
105
122
|
function alignNumericMarkdownIdsWithDb(markdownScan: HierarchyScan, dbScan: HierarchyScan): void {
|
|
106
123
|
for (const dbId of dbScan.milestones) {
|
|
107
124
|
const paddedId = paddedMilestoneId(dbId);
|
|
108
125
|
if (!paddedId || dbScan.milestones.has(paddedId) || !markdownScan.milestones.has(paddedId)) continue;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
126
|
+
realignMilestonePrefix(markdownScan, paddedId, dbId);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function bareMilestoneId(id: string): string | null {
|
|
131
|
+
const match = id.match(/^(M\d{3})-[a-z0-9]{6}$/);
|
|
132
|
+
return match?.[1] ?? null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function alignBareMarkdownIdsWithSuffixedDb(markdownScan: HierarchyScan, dbScan: HierarchyScan): void {
|
|
136
|
+
for (const dbId of dbScan.milestones) {
|
|
137
|
+
const bareId = bareMilestoneId(dbId);
|
|
138
|
+
if (!bareId || dbScan.milestones.has(bareId) || !markdownScan.milestones.has(bareId)) continue;
|
|
139
|
+
realignMilestonePrefix(markdownScan, bareId, dbId);
|
|
112
140
|
}
|
|
113
141
|
}
|
|
114
142
|
|
|
@@ -208,6 +236,7 @@ export async function checkMarkdownHierarchyAgainstDb(
|
|
|
208
236
|
const dbScan = scanDbHierarchy();
|
|
209
237
|
const beforeDb = dbScan.counts;
|
|
210
238
|
alignNumericMarkdownIdsWithDb(markdownScan, dbScan);
|
|
239
|
+
alignBareMarkdownIdsWithSuffixedDb(markdownScan, dbScan);
|
|
211
240
|
|
|
212
241
|
// Discussion-phase scratch: a milestone dir with no ROADMAP and no DB row is
|
|
213
242
|
// a pre-registration discussion artifact (CONTEXT/CONTEXT-DRAFT only — the
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Process-level transaction wrapper for milestone merge closeout.
|
|
3
3
|
|
|
4
|
+
import { mergeMilestoneToMain } from "./auto-worktree-merge.js";
|
|
5
|
+
|
|
4
6
|
export interface MilestoneMergeTransactionResult {
|
|
5
7
|
pushed: boolean;
|
|
6
8
|
codeFilesChanged: boolean;
|
|
@@ -21,14 +23,14 @@ export type MilestoneMergeTransactionRunner = (
|
|
|
21
23
|
) => MilestoneMergeTransactionResult;
|
|
22
24
|
|
|
23
25
|
export interface MilestoneMergeTransactionDeps {
|
|
24
|
-
|
|
26
|
+
mergeMilestone: MilestoneMergeTransactionRunner;
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
export function runMilestoneMergeTransaction(
|
|
28
30
|
deps: MilestoneMergeTransactionDeps,
|
|
29
31
|
input: MilestoneMergeTransactionInput,
|
|
30
32
|
): MilestoneMergeTransactionResult {
|
|
31
|
-
return deps.
|
|
33
|
+
return deps.mergeMilestone(
|
|
32
34
|
input.basePath,
|
|
33
35
|
input.milestoneId,
|
|
34
36
|
input.roadmapContent,
|
|
@@ -36,12 +38,25 @@ export function runMilestoneMergeTransaction(
|
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
export function createMilestoneMergeTransaction(
|
|
39
|
-
|
|
41
|
+
mergeMilestone: MilestoneMergeTransactionRunner,
|
|
40
42
|
): MilestoneMergeTransactionRunner {
|
|
41
43
|
return function mergeMilestoneTransaction(basePath, milestoneId, roadmapContent) {
|
|
42
44
|
return runMilestoneMergeTransaction(
|
|
43
|
-
{
|
|
45
|
+
{ mergeMilestone },
|
|
44
46
|
{ basePath, milestoneId, roadmapContent },
|
|
45
47
|
);
|
|
46
48
|
};
|
|
47
49
|
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Production merge transaction adapter.
|
|
53
|
+
*
|
|
54
|
+
* This is the only production construction point that knows the legacy
|
|
55
|
+
* `auto-worktree.ts` merge primitive. Lifecycle callers depend on the
|
|
56
|
+
* transaction runner interface, not the legacy implementation module.
|
|
57
|
+
*/
|
|
58
|
+
export function createDefaultMilestoneMergeTransaction(
|
|
59
|
+
mergeMilestone: MilestoneMergeTransactionRunner = mergeMilestoneToMain,
|
|
60
|
+
): MilestoneMergeTransactionRunner {
|
|
61
|
+
return createMilestoneMergeTransaction(mergeMilestone);
|
|
62
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Milestone closeout settlement state across DB proof, artifacts, merge, and cleanup.
|
|
3
3
|
|
|
4
|
-
import { isInAutoWorktree } from "./auto-worktree.js";
|
|
4
|
+
import { isInAutoWorktree } from "./auto-worktree-entry.js";
|
|
5
5
|
import {
|
|
6
6
|
formatCloseoutProofBlock,
|
|
7
7
|
proveMilestoneCloseout,
|
|
@@ -24,11 +24,10 @@ export interface DynamicRoutingConfig {
|
|
|
24
24
|
cross_provider?: boolean; // default: true
|
|
25
25
|
hooks?: boolean; // default: true
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
28
|
-
* GitHub Copilot).
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* subscription (e.g. haiku for research, opus for architecture). (#4386)
|
|
27
|
+
* Override dynamic routing for flat-rate providers (e.g. claude-code,
|
|
28
|
+
* GitHub Copilot). Omit or set true to honor `dynamic_routing.enabled`;
|
|
29
|
+
* set false to preserve one-model dispatch when the subscription makes
|
|
30
|
+
* per-request cost identical.
|
|
32
31
|
*/
|
|
33
32
|
allow_flat_rate_providers?: boolean;
|
|
34
33
|
}
|
|
@@ -10,7 +10,7 @@ import { join } from "node:path";
|
|
|
10
10
|
import { spawnSync } from "node:child_process";
|
|
11
11
|
import { resolveGsdPathContract } from "./paths.js";
|
|
12
12
|
import { worktreePathFor, worktreesDirs } from "./worktree-placement.js";
|
|
13
|
-
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
13
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
14
14
|
import { buildWorktreeLifecycleDeps } from "./auto.js";
|
|
15
15
|
import {
|
|
16
16
|
mergeMilestoneStandalone,
|
|
@@ -21,7 +21,9 @@ import { join, dirname } from "node:path";
|
|
|
21
21
|
import { fileURLToPath } from "node:url";
|
|
22
22
|
import { gsdRoot } from "./paths.js";
|
|
23
23
|
import { createWorktree, worktreePath } from "./worktree-manager.js";
|
|
24
|
-
import { autoWorktreeBranch, fastForwardReusedMilestoneBranchIfSafe
|
|
24
|
+
import { autoWorktreeBranch, fastForwardReusedMilestoneBranchIfSafe } from "./auto-worktree-branch-lifecycle.js";
|
|
25
|
+
import { syncGsdStateToWorktreeByScope } from "./auto-worktree-sync.js";
|
|
26
|
+
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
25
27
|
import { nativeBranchExists } from "./native-git-bridge.js";
|
|
26
28
|
import { readIntegrationBranch } from "./git-service.js";
|
|
27
29
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
@@ -696,7 +696,16 @@ function pickPreferredPhaseDir(phasesDir: string, matches: string[]): string {
|
|
|
696
696
|
return best;
|
|
697
697
|
}
|
|
698
698
|
|
|
699
|
-
function
|
|
699
|
+
function slugLooksLikeTeamSuffixProjection(slugPart: string): boolean {
|
|
700
|
+
return /^[a-z0-9]{6}(-|$)/.test(slugPart);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
function phaseDirMatchesMilestoneId(
|
|
704
|
+
dirName: string,
|
|
705
|
+
milestoneId: string,
|
|
706
|
+
phaseNum: number,
|
|
707
|
+
allowTeamSuffixSlugs = false,
|
|
708
|
+
): boolean {
|
|
700
709
|
const numMatch = dirName.match(/^(\d+)-(.*)$/);
|
|
701
710
|
if (!numMatch || parseInt(numMatch[1]!, 10) !== phaseNum) return false;
|
|
702
711
|
const slugPart = numMatch[2]!;
|
|
@@ -704,8 +713,8 @@ function phaseDirMatchesMilestoneId(dirName: string, milestoneId: string, phaseN
|
|
|
704
713
|
if (suffix) {
|
|
705
714
|
return slugPart === suffix || slugPart.startsWith(`${suffix}-`);
|
|
706
715
|
}
|
|
707
|
-
|
|
708
|
-
return
|
|
716
|
+
if (slugLooksLikeTeamSuffixProjection(slugPart) && !allowTeamSuffixSlugs) return false;
|
|
717
|
+
return true;
|
|
709
718
|
}
|
|
710
719
|
|
|
711
720
|
function resolvePhaseDir(basePath: string, milestoneId: string): string | null {
|
|
@@ -726,6 +735,15 @@ function resolvePhaseDir(basePath: string, milestoneId: string): string | null {
|
|
|
726
735
|
matches.push(entry.name);
|
|
727
736
|
}
|
|
728
737
|
}
|
|
738
|
+
// Bare milestone ids may only have a suffixed team-mode projection on disk.
|
|
739
|
+
if (matches.length === 0 && !milestoneIdUniqueSuffix(milestoneId)) {
|
|
740
|
+
for (const entry of readdirSync(phasesDir, { withFileTypes: true })) {
|
|
741
|
+
if (!entry.isDirectory()) continue;
|
|
742
|
+
if (phaseDirMatchesMilestoneId(entry.name, milestoneId, phaseNum, true)) {
|
|
743
|
+
matches.push(entry.name);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
}
|
|
729
747
|
} catch {
|
|
730
748
|
// unreadable — fall through
|
|
731
749
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { PreferenceDiagnostic } from "./preferences-types.js";
|
|
2
2
|
import {
|
|
3
|
+
loadEffectiveGSDPreferences,
|
|
3
4
|
loadGlobalGSDPreferences,
|
|
4
5
|
loadProjectGSDPreferences,
|
|
5
6
|
} from "./preferences.js";
|
|
7
|
+
import { crossAxisPreferenceWarnings } from "./preferences-validation.js";
|
|
6
8
|
|
|
7
9
|
interface PreferenceNotificationContext {
|
|
8
10
|
ui: {
|
|
@@ -30,6 +32,28 @@ export function collectPreferenceDiagnostics(basePath?: string): PreferenceDiagn
|
|
|
30
32
|
seen.add(signature);
|
|
31
33
|
unique.push(diagnostic);
|
|
32
34
|
}
|
|
35
|
+
|
|
36
|
+
const effective = loadEffectiveGSDPreferences(basePath);
|
|
37
|
+
if (effective) {
|
|
38
|
+
const existingMessages = new Set(unique.map((diagnostic) => diagnostic.message));
|
|
39
|
+
for (const message of crossAxisPreferenceWarnings(effective.preferences)) {
|
|
40
|
+
if (existingMessages.has(message)) continue;
|
|
41
|
+
const diagnostic: PreferenceDiagnostic = {
|
|
42
|
+
path: effective.path,
|
|
43
|
+
scope: effective.scope,
|
|
44
|
+
severity: "warning",
|
|
45
|
+
kind: "validation",
|
|
46
|
+
message,
|
|
47
|
+
sanitized: true,
|
|
48
|
+
};
|
|
49
|
+
const signature = preferenceDiagnosticSignature(diagnostic);
|
|
50
|
+
if (seen.has(signature)) continue;
|
|
51
|
+
seen.add(signature);
|
|
52
|
+
existingMessages.add(message);
|
|
53
|
+
unique.push(diagnostic);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
33
57
|
return unique;
|
|
34
58
|
}
|
|
35
59
|
|
|
@@ -99,10 +99,13 @@ export function resolveModelWithFallbacksForUnit(
|
|
|
99
99
|
basePath?: string,
|
|
100
100
|
availableModelIds?: string[],
|
|
101
101
|
preferredModelId?: string,
|
|
102
|
+
skipProfileDefaults = false,
|
|
102
103
|
): ResolvedModelConfig | undefined {
|
|
103
|
-
const loadOpts =
|
|
104
|
-
? { availableModelIds
|
|
105
|
-
:
|
|
104
|
+
const loadOpts = {
|
|
105
|
+
...(availableModelIds !== undefined ? { availableModelIds } : {}),
|
|
106
|
+
...(preferredModelId !== undefined ? { preferredModelId } : {}),
|
|
107
|
+
...(skipProfileDefaults ? { skipProfileDefaults: true } : {}),
|
|
108
|
+
};
|
|
106
109
|
const prefs = loadEffectiveGSDPreferences(basePath, loadOpts);
|
|
107
110
|
const chain = phaseChainForUnit(unitType);
|
|
108
111
|
if (!chain) return undefined;
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
* to absolute filesystem paths, plus skill discovery and staleness config.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
8
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
9
9
|
import { homedir } from "node:os";
|
|
10
10
|
import { isAbsolute, join } from "node:path";
|
|
11
|
+
import { getSkillDirectories } from "@gsd/pi-coding-agent";
|
|
11
12
|
import { gsdHome } from "./gsd-home.js";
|
|
12
|
-
import { statSync } from "node:fs";
|
|
13
13
|
|
|
14
14
|
import type {
|
|
15
15
|
GSDPreferences,
|
|
@@ -25,26 +25,20 @@ export type { GSDSkillRule, SkillDiscoveryMode, SkillResolution, SkillResolution
|
|
|
25
25
|
/**
|
|
26
26
|
* Known skill directories for **preference reference resolution** (bare skill names).
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* 4. ~/.claude/skills/ and .claude/skills/ (Claude Code compatibility)
|
|
28
|
+
* Sourced from the shared taxonomy (`@gsd/pi-coding-agent` `getSkillDirectories`)
|
|
29
|
+
* so preference resolution, mid-session discovery, and the PackageManager
|
|
30
|
+
* catalog all agree on which directories exist. The `method` is derived from
|
|
31
|
+
* each entry's scope.
|
|
33
32
|
*
|
|
34
33
|
* Note: the ResourceLoader catalog uses PackageManager precedence instead —
|
|
35
34
|
* project `.gsd/skills` and `.agents/skills` can override bundled GSD skills
|
|
36
35
|
* on name collision. See docs/dev/what-is-pi/09-the-customization-stack.md.
|
|
37
36
|
*/
|
|
38
37
|
export function getSkillSearchDirs(cwd: string): Array<{ dir: string; method: SkillResolution["method"] }> {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
// Claude Code official skill directories
|
|
44
|
-
{ dir: join(homedir(), ".claude", "skills"), method: "user-skill" },
|
|
45
|
-
{ dir: join(cwd, ".claude", "skills"), method: "project-skill" },
|
|
46
|
-
];
|
|
47
|
-
return dirs;
|
|
38
|
+
return getSkillDirectories({ cwd, gsdHome: gsdHome() }).map((entry) => ({
|
|
39
|
+
dir: entry.path,
|
|
40
|
+
method: entry.scope === "project" ? "project-skill" : "user-skill",
|
|
41
|
+
}));
|
|
48
42
|
}
|
|
49
43
|
|
|
50
44
|
/**
|
|
@@ -29,6 +29,33 @@ export interface ContextManagementConfig {
|
|
|
29
29
|
tool_result_max_chars?: number; // default: 800, range: 200-10000
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
/**
|
|
33
|
+
* User-tunable thresholds for the tool-call loop guard (#1198). Keeps the two
|
|
34
|
+
* guards separately configurable: the identical-args guard (catches real
|
|
35
|
+
* infinite loops) and the repeated-tool-name cap (catches improvisation loops,
|
|
36
|
+
* more likely to false-positive on legitimate automation). All fields are
|
|
37
|
+
* optional; omitted fields fall back to the built-in defaults so existing
|
|
38
|
+
* installs keep their current behavior. Also overridable via GSD_TOOL_LOOP_*
|
|
39
|
+
* environment variables.
|
|
40
|
+
*/
|
|
41
|
+
export interface ToolCallLoopGuardConfig {
|
|
42
|
+
/** Master switch for both guards. Default: true. */
|
|
43
|
+
enabled?: boolean;
|
|
44
|
+
/** Identical-args sliding-window guard. */
|
|
45
|
+
identical_args?: {
|
|
46
|
+
enabled?: boolean; // default: true
|
|
47
|
+
max_consecutive_calls?: number; // default: 4, min: 1
|
|
48
|
+
};
|
|
49
|
+
/** Per-tool-name cap, independent of args. */
|
|
50
|
+
repeated_tool?: {
|
|
51
|
+
enabled?: boolean; // default: true
|
|
52
|
+
default_cap?: number; // default: 6, min: 1
|
|
53
|
+
repeatable_cap?: number; // default: 15, min: 1
|
|
54
|
+
/** Additional tool names exempt from the per-tool cap (merged with built-in defaults). */
|
|
55
|
+
exempt_tools?: string[];
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
32
59
|
/**
|
|
33
60
|
* Opt-in tool-output sandboxing for sub-sessions. When enabled, the gsd_exec
|
|
34
61
|
* MCP tool runs scripts in an isolated subprocess and returns only a short
|
|
@@ -139,6 +166,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
|
|
|
139
166
|
"min_request_interval_ms",
|
|
140
167
|
"stale_commit_threshold_minutes",
|
|
141
168
|
"context_management",
|
|
169
|
+
"tool_call_loop_guard",
|
|
142
170
|
"experimental",
|
|
143
171
|
"codebase",
|
|
144
172
|
"slice_parallel",
|
|
@@ -440,6 +468,8 @@ export interface GSDPreferences {
|
|
|
440
468
|
*/
|
|
441
469
|
context_window_override?: number;
|
|
442
470
|
context_management?: ContextManagementConfig;
|
|
471
|
+
/** User-tunable tool-call loop guard thresholds (#1198). */
|
|
472
|
+
tool_call_loop_guard?: ToolCallLoopGuardConfig;
|
|
443
473
|
/**
|
|
444
474
|
* Tool-output sandboxing via gsd_exec. Keeps sub-session context windows
|
|
445
475
|
* clean by running scripts in a subprocess and only surfacing a short
|
|
@@ -51,6 +51,16 @@ const VALID_POST_UNIT_HOOK_ON_BLOCK_ACTIONS = new Set([
|
|
|
51
51
|
]);
|
|
52
52
|
const VALID_GATE_EVALUATE_SLICE_GATES = new Set<string>(getGateIdsForTurn("gate-evaluate"));
|
|
53
53
|
|
|
54
|
+
/** Cross-axis warnings that only apply to the effective (merged) preference shape. */
|
|
55
|
+
export function crossAxisPreferenceWarnings(preferences: GSDPreferences): string[] {
|
|
56
|
+
if (preferences.mode === "team" && preferences.workspace?.mode === "parent") {
|
|
57
|
+
return [
|
|
58
|
+
"mode:team + workspace.mode:parent: team branch-push/PR resolves at the project root and will not push child repositories — see docs/dev/ADR-044",
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
|
|
54
64
|
export function validatePreferences(preferences: GSDPreferences): {
|
|
55
65
|
preferences: GSDPreferences;
|
|
56
66
|
errors: string[];
|
|
@@ -509,8 +519,11 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
509
519
|
|
|
510
520
|
// ─── Remote Questions ───────────────────────────────────────────────
|
|
511
521
|
if (preferences.remote_questions !== undefined) {
|
|
512
|
-
|
|
513
|
-
|
|
522
|
+
const remoteQuestions = preferences.remote_questions as unknown;
|
|
523
|
+
if (typeof remoteQuestions === "object" && remoteQuestions !== null) {
|
|
524
|
+
validated.remote_questions = remoteQuestions as GSDPreferences["remote_questions"];
|
|
525
|
+
} else if (remoteQuestions === false) {
|
|
526
|
+
// Explicit disable for a globally-configured remote questions channel.
|
|
514
527
|
} else {
|
|
515
528
|
errors.push("remote_questions must be an object");
|
|
516
529
|
}
|
|
@@ -781,6 +794,75 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
781
794
|
}
|
|
782
795
|
}
|
|
783
796
|
|
|
797
|
+
// ─── Tool-call loop guard (#1198) ────────────────────────────────────────
|
|
798
|
+
if (preferences.tool_call_loop_guard !== undefined) {
|
|
799
|
+
if (typeof preferences.tool_call_loop_guard === "object" && preferences.tool_call_loop_guard !== null) {
|
|
800
|
+
const g = preferences.tool_call_loop_guard as unknown as Record<string, unknown>;
|
|
801
|
+
const validGuard: Record<string, unknown> = {};
|
|
802
|
+
|
|
803
|
+
if (g.enabled !== undefined) {
|
|
804
|
+
if (typeof g.enabled === "boolean") validGuard.enabled = g.enabled;
|
|
805
|
+
else errors.push("tool_call_loop_guard.enabled must be a boolean");
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
if (g.identical_args !== undefined) {
|
|
809
|
+
if (typeof g.identical_args === "object" && g.identical_args !== null) {
|
|
810
|
+
const ia = g.identical_args as Record<string, unknown>;
|
|
811
|
+
const validIa: Record<string, unknown> = {};
|
|
812
|
+
if (ia.enabled !== undefined) {
|
|
813
|
+
if (typeof ia.enabled === "boolean") validIa.enabled = ia.enabled;
|
|
814
|
+
else errors.push("tool_call_loop_guard.identical_args.enabled must be a boolean");
|
|
815
|
+
}
|
|
816
|
+
if (ia.max_consecutive_calls !== undefined) {
|
|
817
|
+
const n = ia.max_consecutive_calls;
|
|
818
|
+
if (typeof n === "number" && Number.isInteger(n) && n >= 1) validIa.max_consecutive_calls = n;
|
|
819
|
+
else errors.push("tool_call_loop_guard.identical_args.max_consecutive_calls must be an integer >= 1");
|
|
820
|
+
}
|
|
821
|
+
if (Object.keys(validIa).length > 0) validGuard.identical_args = validIa;
|
|
822
|
+
} else {
|
|
823
|
+
errors.push("tool_call_loop_guard.identical_args must be an object");
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
if (g.repeated_tool !== undefined) {
|
|
828
|
+
if (typeof g.repeated_tool === "object" && g.repeated_tool !== null) {
|
|
829
|
+
const rt = g.repeated_tool as Record<string, unknown>;
|
|
830
|
+
const validRt: Record<string, unknown> = {};
|
|
831
|
+
if (rt.enabled !== undefined) {
|
|
832
|
+
if (typeof rt.enabled === "boolean") validRt.enabled = rt.enabled;
|
|
833
|
+
else errors.push("tool_call_loop_guard.repeated_tool.enabled must be a boolean");
|
|
834
|
+
}
|
|
835
|
+
if (rt.default_cap !== undefined) {
|
|
836
|
+
const n = rt.default_cap;
|
|
837
|
+
if (typeof n === "number" && Number.isInteger(n) && n >= 1) validRt.default_cap = n;
|
|
838
|
+
else errors.push("tool_call_loop_guard.repeated_tool.default_cap must be an integer >= 1");
|
|
839
|
+
}
|
|
840
|
+
if (rt.repeatable_cap !== undefined) {
|
|
841
|
+
const n = rt.repeatable_cap;
|
|
842
|
+
if (typeof n === "number" && Number.isInteger(n) && n >= 1) validRt.repeatable_cap = n;
|
|
843
|
+
else errors.push("tool_call_loop_guard.repeated_tool.repeatable_cap must be an integer >= 1");
|
|
844
|
+
}
|
|
845
|
+
if (rt.exempt_tools !== undefined) {
|
|
846
|
+
if (Array.isArray(rt.exempt_tools) && rt.exempt_tools.every((t) => typeof t === "string")) {
|
|
847
|
+
validRt.exempt_tools = rt.exempt_tools;
|
|
848
|
+
} else {
|
|
849
|
+
errors.push("tool_call_loop_guard.repeated_tool.exempt_tools must be an array of strings");
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
if (Object.keys(validRt).length > 0) validGuard.repeated_tool = validRt;
|
|
853
|
+
} else {
|
|
854
|
+
errors.push("tool_call_loop_guard.repeated_tool must be an object");
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
if (Object.keys(validGuard).length > 0) {
|
|
859
|
+
validated.tool_call_loop_guard = validGuard as any;
|
|
860
|
+
}
|
|
861
|
+
} else {
|
|
862
|
+
errors.push("tool_call_loop_guard must be an object");
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
|
|
784
866
|
// ─── Context Mode (gsd_exec sandbox) ────────────────────────────────────
|
|
785
867
|
if (preferences.context_mode !== undefined) {
|
|
786
868
|
if (typeof preferences.context_mode === "object" && preferences.context_mode !== null) {
|
|
@@ -1495,6 +1577,17 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
1495
1577
|
} else {
|
|
1496
1578
|
errors.push("workspace must be an object");
|
|
1497
1579
|
}
|
|
1580
|
+
|
|
1581
|
+
// parent mode is behavioral: it must coordinate at least one declared
|
|
1582
|
+
// child repository. Without one it is indistinguishable from project
|
|
1583
|
+
// mode, so reject it explicitly rather than silently degrading.
|
|
1584
|
+
if (validated.workspace?.mode === "parent") {
|
|
1585
|
+
const childRepoCount = validated.workspace.repositories ? Object.keys(validated.workspace.repositories).length : 0;
|
|
1586
|
+
if (childRepoCount === 0) {
|
|
1587
|
+
errors.push('workspace.mode "parent" requires at least one repository under workspace.repositories');
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1498
1591
|
}
|
|
1499
1592
|
|
|
1500
1593
|
// ─── Enhanced Verification ──────────────────────────────────────────────────
|
|
@@ -1568,5 +1661,7 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
1568
1661
|
}
|
|
1569
1662
|
}
|
|
1570
1663
|
|
|
1664
|
+
warnings.push(...crossAxisPreferenceWarnings(validated));
|
|
1665
|
+
|
|
1571
1666
|
return { preferences: validated, errors, warnings };
|
|
1572
1667
|
}
|