@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
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
getArtifact,
|
|
13
13
|
getAssessment,
|
|
14
14
|
insertAssessment,
|
|
15
|
+
insertGateRow,
|
|
15
16
|
insertMilestone,
|
|
16
17
|
upsertRequirement,
|
|
17
18
|
getAllMilestones,
|
|
@@ -21,6 +22,7 @@ import { claimMilestoneLease, getMilestoneLease } from "../db/milestone-leases.t
|
|
|
21
22
|
import { deriveState, invalidateStateCache } from "../state.ts";
|
|
22
23
|
import { autoSession } from "../auto-runtime-state.ts";
|
|
23
24
|
import { normalizeRealPath } from "../paths.ts";
|
|
25
|
+
import { recordUnitHarnessAbort } from "../unit-runtime.ts";
|
|
24
26
|
import { markApprovalGateVerified, markDepthVerified, clearDiscussionFlowState, loadWriteGateSnapshot, setPendingGate } from "../bootstrap/write-gate.ts";
|
|
25
27
|
import {
|
|
26
28
|
executeCompleteMilestone,
|
|
@@ -37,6 +39,11 @@ import {
|
|
|
37
39
|
executeValidateMilestone,
|
|
38
40
|
executeUatResultSave,
|
|
39
41
|
} from "../tools/workflow-tool-executors.ts";
|
|
42
|
+
import {
|
|
43
|
+
initNotificationStore,
|
|
44
|
+
readNotifications,
|
|
45
|
+
_resetNotificationStore,
|
|
46
|
+
} from "../notification-store.ts";
|
|
40
47
|
|
|
41
48
|
function makeTmpBase(): string {
|
|
42
49
|
const base = join(tmpdir(), `gsd-workflow-executors-${randomUUID()}`);
|
|
@@ -910,6 +917,104 @@ test("executeUatResultSave accepts gsd_uat_exec evidence written in a milestone
|
|
|
910
917
|
}
|
|
911
918
|
});
|
|
912
919
|
|
|
920
|
+
test("executeUatResultSave leaves UAT pending after a harness-aborted turn", async () => {
|
|
921
|
+
const base = makeTmpBase();
|
|
922
|
+
const worktree = join(base, ".gsd", "worktrees", "M001");
|
|
923
|
+
const worktreeExecDir = join(worktree, ".gsd", "exec");
|
|
924
|
+
const evidenceId = "harness-aborted-uat-evidence";
|
|
925
|
+
const startedAt = Date.now();
|
|
926
|
+
try {
|
|
927
|
+
openTestDb(base);
|
|
928
|
+
seedMilestone("M001", "Milestone One");
|
|
929
|
+
seedSlice("M001", "S04", "complete");
|
|
930
|
+
mkdirSync(worktreeExecDir, { recursive: true });
|
|
931
|
+
writeFileSync(
|
|
932
|
+
join(worktreeExecDir, `${evidenceId}.meta.json`),
|
|
933
|
+
JSON.stringify({
|
|
934
|
+
id: evidenceId,
|
|
935
|
+
metadata: {
|
|
936
|
+
kind: "uat_exec",
|
|
937
|
+
milestoneId: "M001",
|
|
938
|
+
sliceId: "S04",
|
|
939
|
+
checkId: "UAT-01",
|
|
940
|
+
intent: "uat-runtime-check",
|
|
941
|
+
},
|
|
942
|
+
}),
|
|
943
|
+
"utf-8",
|
|
944
|
+
);
|
|
945
|
+
_getAdapter()!.prepare(
|
|
946
|
+
`INSERT INTO quality_gates (milestone_id, slice_id, gate_id, scope, task_id, status)
|
|
947
|
+
VALUES (?, ?, ?, ?, ?, ?)`,
|
|
948
|
+
).run("M001", "S04", "UAT", "slice", "", "pending");
|
|
949
|
+
autoSession.reset();
|
|
950
|
+
autoSession.active = true;
|
|
951
|
+
autoSession.basePath = base;
|
|
952
|
+
autoSession.currentUnit = { type: "run-uat", id: "M001/S04", startedAt, workspaceRoot: worktree };
|
|
953
|
+
recordUnitHarnessAbort(base, "run-uat", "M001/S04", startedAt, {
|
|
954
|
+
kind: "tool-loop-guard",
|
|
955
|
+
reason: "Tool loop detected (repeated tool): browser_click called 7 times this turn.",
|
|
956
|
+
toolName: "browser_click",
|
|
957
|
+
count: 7,
|
|
958
|
+
});
|
|
959
|
+
|
|
960
|
+
const result = await inProjectDir(worktree, () => executeUatResultSave({
|
|
961
|
+
milestoneId: "M001",
|
|
962
|
+
sliceId: "S04",
|
|
963
|
+
uatType: "runtime-executable",
|
|
964
|
+
verdict: "FAIL",
|
|
965
|
+
checks: [{
|
|
966
|
+
id: "UAT-01",
|
|
967
|
+
description: "Runtime behavior could not be fully evaluated before harness abort",
|
|
968
|
+
mode: "runtime",
|
|
969
|
+
result: "FAIL",
|
|
970
|
+
evidence: [{ kind: "gsd_uat_exec", ref: evidenceId }],
|
|
971
|
+
notes: "Partial failure should be retried because the harness aborted the turn.",
|
|
972
|
+
}],
|
|
973
|
+
presentation: {
|
|
974
|
+
surface: "mcp",
|
|
975
|
+
presentedTools: [
|
|
976
|
+
"gsd_uat_exec",
|
|
977
|
+
"gsd_uat_result_save",
|
|
978
|
+
"gsd_resume",
|
|
979
|
+
"gsd_milestone_status",
|
|
980
|
+
"gsd_journal_query",
|
|
981
|
+
],
|
|
982
|
+
blockedTools: [
|
|
983
|
+
{ name: "gsd_exec", reason: "forbidden during run-uat" },
|
|
984
|
+
{ name: "gsd_summary_save", reason: "forbidden during run-uat" },
|
|
985
|
+
{ name: "gsd_save_gate_result", reason: "forbidden during run-uat" },
|
|
986
|
+
],
|
|
987
|
+
},
|
|
988
|
+
notes: "Partial UAT result after harness abort.",
|
|
989
|
+
}, worktree));
|
|
990
|
+
|
|
991
|
+
assert.equal(result.isError, true);
|
|
992
|
+
assert.equal(result.details.operation, "save_uat_result");
|
|
993
|
+
assert.equal(result.details.error, "harness_aborted_needs_retry");
|
|
994
|
+
assert.equal(result.details.retryable, true);
|
|
995
|
+
assert.equal(result.details.harnessAbortKind, "tool-loop-guard");
|
|
996
|
+
assert.equal(
|
|
997
|
+
existsSync(join(base, ".gsd", "uat", "M001", "S04", "attempt-1.json")),
|
|
998
|
+
false,
|
|
999
|
+
"harness-aborted UAT should not persist an attempt artifact",
|
|
1000
|
+
);
|
|
1001
|
+
assert.equal(
|
|
1002
|
+
existsSync(join(base, ".gsd", "phases", "01-m001", "01-04-ASSESSMENT.md")),
|
|
1003
|
+
false,
|
|
1004
|
+
"harness-aborted UAT should not write an ASSESSMENT verdict",
|
|
1005
|
+
);
|
|
1006
|
+
const row = _getAdapter()!.prepare(
|
|
1007
|
+
"SELECT status, verdict FROM quality_gates WHERE milestone_id = ? AND slice_id = ? AND gate_id = ?",
|
|
1008
|
+
).get("M001", "S04", "UAT") as Record<string, unknown>;
|
|
1009
|
+
assert.equal(row.status, "pending");
|
|
1010
|
+
assert.equal(row.verdict, "");
|
|
1011
|
+
} finally {
|
|
1012
|
+
autoSession.reset();
|
|
1013
|
+
closeDatabase();
|
|
1014
|
+
cleanup(base);
|
|
1015
|
+
}
|
|
1016
|
+
});
|
|
1017
|
+
|
|
913
1018
|
test("executeUatResultSave supplies canonical presentation and normalizes verdict casing", async () => {
|
|
914
1019
|
const base = makeTmpBase();
|
|
915
1020
|
const worktree = join(base, ".gsd", "worktrees", "M001");
|
|
@@ -1100,13 +1205,14 @@ test("executeUatResultSave merges canonical plan ID and read-only tools when pre
|
|
|
1100
1205
|
}
|
|
1101
1206
|
});
|
|
1102
1207
|
|
|
1103
|
-
test("executeUatResultSave surfaces the worktree validation path for NEEDS-HUMAN checks", async () => {
|
|
1208
|
+
test("executeUatResultSave surfaces the worktree validation path and notification for NEEDS-HUMAN checks", async () => {
|
|
1104
1209
|
const base = makeTmpBase();
|
|
1105
1210
|
const worktree = join(base, ".gsd", "worktrees", "M001");
|
|
1106
1211
|
const worktreeExecDir = join(worktree, ".gsd", "exec");
|
|
1107
1212
|
const evidenceId = "uat-human-validation-evidence";
|
|
1108
1213
|
try {
|
|
1109
1214
|
openTestDb(base);
|
|
1215
|
+
initNotificationStore(base);
|
|
1110
1216
|
seedMilestone("M001", "Milestone One");
|
|
1111
1217
|
seedSlice("M001", "S07", "complete");
|
|
1112
1218
|
mkdirSync(worktreeExecDir, { recursive: true });
|
|
@@ -1166,7 +1272,17 @@ test("executeUatResultSave surfaces the worktree validation path for NEEDS-HUMAN
|
|
|
1166
1272
|
assert.match(assessment, /## Manual Validation/);
|
|
1167
1273
|
assert.ok(assessment.includes(worktree), "assessment should include the worktree checkout path");
|
|
1168
1274
|
assert.match(assessment, /git worktree/);
|
|
1275
|
+
|
|
1276
|
+
const notifications = readNotifications(base, { kind: "uat-needs-human", scope: "M001/S07" });
|
|
1277
|
+
assert.equal(notifications.length, 1);
|
|
1278
|
+
assert.equal(notifications[0].severity, "warning");
|
|
1279
|
+
assert.equal(notifications[0].source, "notify");
|
|
1280
|
+
assert.equal(
|
|
1281
|
+
notifications[0].message,
|
|
1282
|
+
"UAT for M001/S07 has NEEDS-HUMAN checks awaiting human validation",
|
|
1283
|
+
);
|
|
1169
1284
|
} finally {
|
|
1285
|
+
_resetNotificationStore();
|
|
1170
1286
|
closeDatabase();
|
|
1171
1287
|
cleanup(base);
|
|
1172
1288
|
}
|
|
@@ -1757,6 +1873,97 @@ test("executeSaveGateResult validates inputs and persists verdicts", async () =>
|
|
|
1757
1873
|
}
|
|
1758
1874
|
});
|
|
1759
1875
|
|
|
1876
|
+
test("executeSaveGateResult leaves quality gates pending after a retryable tool error", async () => {
|
|
1877
|
+
const base = makeTmpBase();
|
|
1878
|
+
const startedAt = Date.now();
|
|
1879
|
+
try {
|
|
1880
|
+
openTestDb(base);
|
|
1881
|
+
seedMilestone("M005", "Milestone Five");
|
|
1882
|
+
seedSlice("M005", "S05", "pending");
|
|
1883
|
+
insertGateRow({ milestoneId: "M005", sliceId: "S05", gateId: "Q3", scope: "slice" });
|
|
1884
|
+
autoSession.reset();
|
|
1885
|
+
autoSession.active = true;
|
|
1886
|
+
autoSession.basePath = base;
|
|
1887
|
+
autoSession.currentUnit = { type: "plan-slice", id: "M005/S05", startedAt };
|
|
1888
|
+
recordUnitHarnessAbort(base, "plan-slice", "M005/S05", startedAt, {
|
|
1889
|
+
kind: "tool-error",
|
|
1890
|
+
reason: "Input validation error: selector is required",
|
|
1891
|
+
toolName: "browser_click",
|
|
1892
|
+
});
|
|
1893
|
+
|
|
1894
|
+
const result = await inProjectDir(base, () => executeSaveGateResult({
|
|
1895
|
+
milestoneId: "M005",
|
|
1896
|
+
sliceId: "S05",
|
|
1897
|
+
gateId: "Q3",
|
|
1898
|
+
verdict: "flag",
|
|
1899
|
+
rationale: "Partial gate failure after harness abort.",
|
|
1900
|
+
findings: "This should not be persisted as a product-quality finding.",
|
|
1901
|
+
}, base));
|
|
1902
|
+
|
|
1903
|
+
assert.equal(result.isError, true);
|
|
1904
|
+
assert.equal(result.details.operation, "save_gate_result");
|
|
1905
|
+
assert.equal(result.details.error, "harness_aborted_needs_retry");
|
|
1906
|
+
assert.equal(result.details.retryable, true);
|
|
1907
|
+
assert.equal(result.details.harnessAbortKind, "tool-error");
|
|
1908
|
+
const row = _getAdapter()!.prepare(
|
|
1909
|
+
"SELECT status, verdict, rationale, findings FROM quality_gates WHERE milestone_id = ? AND slice_id = ? AND gate_id = ? AND task_id = ''",
|
|
1910
|
+
).get("M005", "S05", "Q3") as Record<string, unknown>;
|
|
1911
|
+
assert.equal(row.status, "pending");
|
|
1912
|
+
assert.equal(row.verdict, "");
|
|
1913
|
+
assert.equal(row.rationale, "");
|
|
1914
|
+
assert.equal(row.findings, "");
|
|
1915
|
+
} finally {
|
|
1916
|
+
autoSession.reset();
|
|
1917
|
+
closeDatabase();
|
|
1918
|
+
cleanup(base);
|
|
1919
|
+
}
|
|
1920
|
+
});
|
|
1921
|
+
|
|
1922
|
+
test("executeSaveGateResult leaves quality gates pending after a turn abort", async () => {
|
|
1923
|
+
const base = makeTmpBase();
|
|
1924
|
+
const startedAt = Date.now();
|
|
1925
|
+
try {
|
|
1926
|
+
openTestDb(base);
|
|
1927
|
+
seedMilestone("M005", "Milestone Five");
|
|
1928
|
+
seedSlice("M005", "S05", "pending");
|
|
1929
|
+
insertGateRow({ milestoneId: "M005", sliceId: "S05", gateId: "Q3", scope: "slice" });
|
|
1930
|
+
autoSession.reset();
|
|
1931
|
+
autoSession.active = true;
|
|
1932
|
+
autoSession.basePath = base;
|
|
1933
|
+
autoSession.currentUnit = { type: "plan-slice", id: "M005/S05", startedAt };
|
|
1934
|
+
recordUnitHarnessAbort(base, "plan-slice", "M005/S05", startedAt, {
|
|
1935
|
+
kind: "turn-abort",
|
|
1936
|
+
reason: "Agent turn aborted before the gate evaluation completed. origin=timeout stopReason=aborted",
|
|
1937
|
+
});
|
|
1938
|
+
|
|
1939
|
+
const result = await inProjectDir(base, () => executeSaveGateResult({
|
|
1940
|
+
milestoneId: "M005",
|
|
1941
|
+
sliceId: "S05",
|
|
1942
|
+
gateId: "Q3",
|
|
1943
|
+
verdict: "flag",
|
|
1944
|
+
rationale: "Partial gate failure after a turn abort.",
|
|
1945
|
+
findings: "This should not be persisted as a product-quality finding.",
|
|
1946
|
+
}, base));
|
|
1947
|
+
|
|
1948
|
+
assert.equal(result.isError, true);
|
|
1949
|
+
assert.equal(result.details.operation, "save_gate_result");
|
|
1950
|
+
assert.equal(result.details.error, "harness_aborted_needs_retry");
|
|
1951
|
+
assert.equal(result.details.retryable, true);
|
|
1952
|
+
assert.equal(result.details.harnessAbortKind, "turn-abort");
|
|
1953
|
+
const row = _getAdapter()!.prepare(
|
|
1954
|
+
"SELECT status, verdict, rationale, findings FROM quality_gates WHERE milestone_id = ? AND slice_id = ? AND gate_id = ? AND task_id = ''",
|
|
1955
|
+
).get("M005", "S05", "Q3") as Record<string, unknown>;
|
|
1956
|
+
assert.equal(row.status, "pending");
|
|
1957
|
+
assert.equal(row.verdict, "");
|
|
1958
|
+
assert.equal(row.rationale, "");
|
|
1959
|
+
assert.equal(row.findings, "");
|
|
1960
|
+
} finally {
|
|
1961
|
+
autoSession.reset();
|
|
1962
|
+
closeDatabase();
|
|
1963
|
+
cleanup(base);
|
|
1964
|
+
}
|
|
1965
|
+
});
|
|
1966
|
+
|
|
1760
1967
|
test("executeSaveGateResult fails when no canonical gate row is updated", async () => {
|
|
1761
1968
|
const base = makeTmpBase();
|
|
1762
1969
|
try {
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
rmSync,
|
|
9
9
|
realpathSync,
|
|
10
10
|
symlinkSync,
|
|
11
|
+
writeFileSync,
|
|
11
12
|
} from "node:fs";
|
|
12
13
|
import { tmpdir } from "node:os";
|
|
13
14
|
import { join } from "node:path";
|
|
@@ -118,17 +119,17 @@ describe("scopeMilestone path methods", () => {
|
|
|
118
119
|
rmSync(projectDir, { recursive: true, force: true });
|
|
119
120
|
});
|
|
120
121
|
|
|
121
|
-
test("produces
|
|
122
|
+
test("produces flat-phase paths for a known milestone ID", () => {
|
|
122
123
|
const ws = createWorkspace(projectDir);
|
|
123
124
|
const scope = scopeMilestone(ws, MID);
|
|
124
125
|
const gsd = ws.contract.projectGsd;
|
|
125
126
|
|
|
126
127
|
assert.equal(scope.milestoneId, MID);
|
|
127
|
-
assert.equal(scope.contextFile(), join(gsd, "
|
|
128
|
-
assert.equal(scope.roadmapFile(), join(gsd, "
|
|
128
|
+
assert.equal(scope.contextFile(), join(gsd, "phases", "01-m001", "01-CONTEXT.md"));
|
|
129
|
+
assert.equal(scope.roadmapFile(), join(gsd, "phases", "01-m001", "01-ROADMAP.md"));
|
|
129
130
|
assert.equal(scope.stateFile(), join(gsd, "STATE.md"));
|
|
130
131
|
assert.equal(scope.dbPath(), ws.contract.projectDb);
|
|
131
|
-
assert.equal(scope.milestoneDir(), join(gsd, "
|
|
132
|
+
assert.equal(scope.milestoneDir(), join(gsd, "phases", "01-m001"));
|
|
132
133
|
assert.equal(scope.metaJson(), join(gsd, `${MID}-META.json`));
|
|
133
134
|
});
|
|
134
135
|
|
|
@@ -144,6 +145,19 @@ describe("scopeMilestone path methods", () => {
|
|
|
144
145
|
assert.equal(scope1.milestoneDir(), scope2.milestoneDir());
|
|
145
146
|
assert.equal(scope1.metaJson(), scope2.metaJson());
|
|
146
147
|
});
|
|
148
|
+
|
|
149
|
+
test("uses legacy milestone paths when legacy content exists", () => {
|
|
150
|
+
const legacyDir = join(projectDir, ".gsd", "milestones", MID);
|
|
151
|
+
mkdirSync(legacyDir, { recursive: true });
|
|
152
|
+
writeFileSync(join(legacyDir, `${MID}-CONTEXT.md`), "# Legacy context\n");
|
|
153
|
+
|
|
154
|
+
const ws = createWorkspace(projectDir);
|
|
155
|
+
const scope = scopeMilestone(ws, MID);
|
|
156
|
+
|
|
157
|
+
assert.equal(scope.contextFile(), join(legacyDir, `${MID}-CONTEXT.md`));
|
|
158
|
+
assert.equal(scope.roadmapFile(), join(legacyDir, `${MID}-ROADMAP.md`));
|
|
159
|
+
assert.equal(scope.milestoneDir(), legacyDir);
|
|
160
|
+
});
|
|
147
161
|
});
|
|
148
162
|
|
|
149
163
|
describe("createWorkspace: contract.projectGsd is realpath-canonicalized when basePath is a symlink", () => {
|
|
@@ -17,7 +17,7 @@ import { join } from "node:path";
|
|
|
17
17
|
import { tmpdir } from "node:os";
|
|
18
18
|
import { execSync } from "node:child_process";
|
|
19
19
|
|
|
20
|
-
import { createAutoWorktree } from "../auto-worktree.ts";
|
|
20
|
+
import { createAutoWorktree } from "../auto-worktree-creation.ts";
|
|
21
21
|
import { worktreePath } from "../worktree-manager.ts";
|
|
22
22
|
import {
|
|
23
23
|
copyWorktreeDb,
|
|
@@ -17,7 +17,7 @@ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync
|
|
|
17
17
|
import { join } from 'node:path';
|
|
18
18
|
import { tmpdir } from 'node:os';
|
|
19
19
|
|
|
20
|
-
import { syncProjectRootToWorktree } from '../auto-worktree.ts';
|
|
20
|
+
import { syncProjectRootToWorktree } from '../auto-worktree-sync.ts';
|
|
21
21
|
import { describe, test } from 'node:test';
|
|
22
22
|
import assert from 'node:assert/strict';
|
|
23
23
|
|
|
@@ -18,9 +18,7 @@ import {
|
|
|
18
18
|
reconcileWorktreeDb,
|
|
19
19
|
insertDecision,
|
|
20
20
|
} from "../gsd-db.ts";
|
|
21
|
-
import {
|
|
22
|
-
_shouldReconcileWorktreeDb,
|
|
23
|
-
} from "../auto-worktree.ts";
|
|
21
|
+
import { _shouldReconcileWorktreeDb } from "../auto-worktree-sync.ts";
|
|
24
22
|
import { isInfrastructureError } from "../auto/infra-errors.ts";
|
|
25
23
|
|
|
26
24
|
describe("#2823: reconcileWorktreeDb same-file guard", () => {
|
|
@@ -6,7 +6,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
|
6
6
|
import { join, resolve } from "node:path";
|
|
7
7
|
import { tmpdir } from "node:os";
|
|
8
8
|
|
|
9
|
-
import { _isExpectedWorktreeUnlinkError } from "../auto-worktree.ts";
|
|
9
|
+
import { _isExpectedWorktreeUnlinkError } from "../auto-worktree-path-utils.ts";
|
|
10
10
|
import { resolveGitDir } from "../worktree-manager.ts";
|
|
11
11
|
|
|
12
12
|
describe("worktree expected-condition warning suppression (#3665)", () => {
|
|
@@ -5,7 +5,7 @@ import { join } from "node:path";
|
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { execFileSync } from "node:child_process";
|
|
7
7
|
|
|
8
|
-
import { _gitPathspecForWorktreePath } from "../auto-worktree.ts";
|
|
8
|
+
import { _gitPathspecForWorktreePath } from "../auto-worktree-path-utils.ts";
|
|
9
9
|
|
|
10
10
|
function run(cmd: string, args: string[], cwd: string): string {
|
|
11
11
|
return execFileSync(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
@@ -107,7 +107,7 @@ function makeDeps(
|
|
|
107
107
|
// real `getAutoWorktreePath` / `createAutoWorktree` / etc. and the
|
|
108
108
|
// success/existing/failure branches won't fire as expected.
|
|
109
109
|
const deps: LegacyTestDeps = {
|
|
110
|
-
|
|
110
|
+
mergeMilestone: () => ({ pushed: false, codeFilesChanged: true }),
|
|
111
111
|
worktreeProjection: new WorktreeStateProjection(),
|
|
112
112
|
// ADR-016 phase 2 / C4 (#5627): GitServiceImpl constructor → factory.
|
|
113
113
|
gitServiceFactory: () => ({}) as unknown as ReturnType<
|
|
@@ -283,7 +283,7 @@ describe("worktree journal events", () => {
|
|
|
283
283
|
|
|
284
284
|
const s = makeSession({ basePath: wt, originalBasePath: tmp });
|
|
285
285
|
const deps = makeDeps({
|
|
286
|
-
|
|
286
|
+
mergeMilestone: () => ({ pushed: false, codeFilesChanged: true }),
|
|
287
287
|
});
|
|
288
288
|
process.chdir(wt);
|
|
289
289
|
|
|
@@ -304,7 +304,7 @@ describe("worktree journal events", () => {
|
|
|
304
304
|
const wt = setupMergeWorktree(tmp, "M001");
|
|
305
305
|
const s = makeSession({ basePath: wt, originalBasePath: tmp });
|
|
306
306
|
const deps = makeDeps({
|
|
307
|
-
|
|
307
|
+
mergeMilestone: () => { throw new Error("conflict in main"); },
|
|
308
308
|
});
|
|
309
309
|
// Since #4380, mergeAndExit re-throws all errors after emitting the journal
|
|
310
310
|
// event and restoring state. Lifecycle now wraps that throw in a typed
|
|
@@ -347,7 +347,7 @@ describe("worktree journal events", () => {
|
|
|
347
347
|
const s = makeSession({ basePath: wt, originalBasePath: tmp });
|
|
348
348
|
let attempt = 0;
|
|
349
349
|
const deps = makeDeps({
|
|
350
|
-
|
|
350
|
+
mergeMilestone: () => {
|
|
351
351
|
attempt += 1;
|
|
352
352
|
throw new MergeConflictError(
|
|
353
353
|
attempt === 1 ? ["src/a.ts"] : ["src/b.ts", "src/c.ts"],
|
|
@@ -46,7 +46,7 @@ function makeDeps(
|
|
|
46
46
|
): LegacyTestDeps & { calls: CallLog[] } {
|
|
47
47
|
const calls: CallLog[] = [];
|
|
48
48
|
// ADR-016 phase 2 / C-track close-out: WorktreeLifecycleDeps is now a
|
|
49
|
-
// 3-field bag (gitServiceFactory, worktreeProjection,
|
|
49
|
+
// 3-field bag (gitServiceFactory, worktreeProjection, mergeMilestone).
|
|
50
50
|
// Tests still pass legacy override hooks via `LegacyTestDeps` — Lifecycle
|
|
51
51
|
// ignores the extras structurally and reads them through the C1-healing
|
|
52
52
|
// primitive-override pattern when stubs are needed.
|
|
@@ -73,7 +73,7 @@ function makeDeps(
|
|
|
73
73
|
},
|
|
74
74
|
autoWorktreeBranch: (mid: string) => `milestone/${mid}`,
|
|
75
75
|
teardownAutoWorktree: () => {},
|
|
76
|
-
|
|
76
|
+
mergeMilestone: () => ({ pushed: false, codeFilesChanged: true }),
|
|
77
77
|
...overrides,
|
|
78
78
|
};
|
|
79
79
|
return deps;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { test } from "node:test";
|
|
4
4
|
import assert from "node:assert/strict";
|
|
5
5
|
|
|
6
|
-
import { _resolveAutoWorktreeStartPoint } from "../auto-worktree.ts";
|
|
6
|
+
import { _resolveAutoWorktreeStartPoint } from "../auto-worktree-branch-lifecycle.ts";
|
|
7
7
|
|
|
8
8
|
test("auto-worktree start point prefers milestone integration branch", () => {
|
|
9
9
|
const startPoint = _resolveAutoWorktreeStartPoint(
|
|
@@ -13,7 +13,8 @@ import { join } from "node:path";
|
|
|
13
13
|
import { tmpdir } from "node:os";
|
|
14
14
|
import { execFileSync } from "node:child_process";
|
|
15
15
|
|
|
16
|
-
import { createAutoWorktree
|
|
16
|
+
import { createAutoWorktree } from "../auto-worktree-creation.ts";
|
|
17
|
+
import { _resetAutoWorktreeOriginalBaseForTests } from "../auto-worktree-session-registry.ts";
|
|
17
18
|
import { reenterActiveWorktreeIfNeeded } from "../worktree-reentry.ts";
|
|
18
19
|
|
|
19
20
|
// Safe: all inputs below are hardcoded test strings, not user input.
|
|
@@ -23,12 +23,15 @@
|
|
|
23
23
|
* - syncWorktreeStateBack skips non-standard milestone projection dir names
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync } from 'node:fs';
|
|
26
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync, statSync } from 'node:fs';
|
|
27
27
|
import { join } from 'node:path';
|
|
28
28
|
import { tmpdir } from 'node:os';
|
|
29
29
|
|
|
30
|
-
import {
|
|
31
|
-
|
|
30
|
+
import {
|
|
31
|
+
syncGsdStateToWorktree,
|
|
32
|
+
syncProjectRootToWorktree,
|
|
33
|
+
syncWorktreeStateBack,
|
|
34
|
+
} from '../auto-worktree-sync.ts';
|
|
32
35
|
import { describe, test } from 'node:test';
|
|
33
36
|
import assert from 'node:assert/strict';
|
|
34
37
|
|
|
@@ -148,6 +151,36 @@ describe('worktree-sync-milestones', async () => {
|
|
|
148
151
|
}
|
|
149
152
|
}
|
|
150
153
|
|
|
154
|
+
// ─── 3c. artifact file/dir collisions preserve existing worktree files ─
|
|
155
|
+
console.log('\n=== 3c. artifact file/dir collisions preserve existing worktree files (#1157) ===');
|
|
156
|
+
{
|
|
157
|
+
const mainBase = createBase('main');
|
|
158
|
+
const wtBase = createBase('wt');
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
const mainSliceDir = join(mainBase, '.gsd', 'milestones', 'M001', 'slices', 'S01');
|
|
162
|
+
mkdirSync(join(mainSliceDir, 'S01-SUMMARY.md'), { recursive: true });
|
|
163
|
+
mkdirSync(join(mainSliceDir, 'S01-ASSESSMENT.md'), { recursive: true });
|
|
164
|
+
|
|
165
|
+
const wtSliceDir = join(wtBase, '.gsd', 'milestones', 'M001', 'slices', 'S01');
|
|
166
|
+
mkdirSync(wtSliceDir, { recursive: true });
|
|
167
|
+
writeFileSync(join(wtSliceDir, 'S01-SUMMARY.md'), '# Valid summary\n');
|
|
168
|
+
writeFileSync(join(wtSliceDir, 'S01-ASSESSMENT.md'), '---\nverdict: pass\n---\n# Valid assessment\n');
|
|
169
|
+
|
|
170
|
+
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
171
|
+
|
|
172
|
+
const summaryPath = join(wtSliceDir, 'S01-SUMMARY.md');
|
|
173
|
+
const assessmentPath = join(wtSliceDir, 'S01-ASSESSMENT.md');
|
|
174
|
+
assert.ok(statSync(summaryPath).isFile(), 'existing SUMMARY.md stays a file');
|
|
175
|
+
assert.ok(statSync(assessmentPath).isFile(), 'existing ASSESSMENT.md stays a file');
|
|
176
|
+
assert.equal(readFileSync(summaryPath, 'utf-8'), '# Valid summary\n');
|
|
177
|
+
assert.equal(readFileSync(assessmentPath, 'utf-8'), '---\nverdict: pass\n---\n# Valid assessment\n');
|
|
178
|
+
} finally {
|
|
179
|
+
cleanup(mainBase);
|
|
180
|
+
cleanup(wtBase);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
151
184
|
// ─── 4. No-op when paths are equal ────────────────────────────────────
|
|
152
185
|
console.log('\n=== 4. no-op when paths are equal ===');
|
|
153
186
|
{
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
import { join } from "node:path";
|
|
26
26
|
import { tmpdir } from "node:os";
|
|
27
27
|
|
|
28
|
-
import { syncProjectRootToWorktree } from "../auto-worktree.ts";
|
|
28
|
+
import { syncProjectRootToWorktree } from "../auto-worktree-sync.ts";
|
|
29
29
|
|
|
30
30
|
function createBase(name: string): string {
|
|
31
31
|
const base = mkdtempSync(join(tmpdir(), `gsd-wt-1886-${name}-`));
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
import { join } from "node:path";
|
|
19
19
|
import { tmpdir } from "node:os";
|
|
20
20
|
|
|
21
|
-
import { syncWorktreeStateBack } from "../auto-worktree.ts";
|
|
21
|
+
import { syncWorktreeStateBack } from "../auto-worktree-sync.ts";
|
|
22
22
|
|
|
23
23
|
function makeTempDir(prefix: string): string {
|
|
24
24
|
return mkdtempSync(join(tmpdir(), `gsd-sync-test-${prefix}-`));
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
existsSync,
|
|
21
21
|
realpathSync,
|
|
22
22
|
readFileSync,
|
|
23
|
+
readdirSync,
|
|
23
24
|
} from "node:fs";
|
|
24
25
|
import { join } from "node:path";
|
|
25
26
|
import { tmpdir } from "node:os";
|
|
@@ -132,6 +133,37 @@ describe("worktree-teardown-safety", () => {
|
|
|
132
133
|
);
|
|
133
134
|
});
|
|
134
135
|
|
|
136
|
+
it("removeWorktree quarantines dirty worktree contents before forced cleanup", () => {
|
|
137
|
+
const tempDir = createTempRepo();
|
|
138
|
+
dirs.push(tempDir);
|
|
139
|
+
|
|
140
|
+
const wt = createWorktree(tempDir, "dirty-wt");
|
|
141
|
+
writeFileSync(join(wt.path, "generated-feature.ts"), "export const answer = 42;\n");
|
|
142
|
+
writeFileSync(join(wt.path, "README.md"), "# changed in worktree\n");
|
|
143
|
+
|
|
144
|
+
removeWorktree(tempDir, "dirty-wt", { deleteBranch: false });
|
|
145
|
+
|
|
146
|
+
assertTrue(!existsSync(wt.path), "original dirty worktree path removed after quarantine");
|
|
147
|
+
const quarantineRoot = join(tempDir, ".gsd", "quarantine", "worktrees");
|
|
148
|
+
const entries = readdirSync(quarantineRoot).filter((entry) => entry.startsWith("dirty-wt-"));
|
|
149
|
+
assertEq(entries.length, 1, "dirty worktree snapshot quarantined");
|
|
150
|
+
const quarantineDir = join(quarantineRoot, entries[0]!);
|
|
151
|
+
assertEq(
|
|
152
|
+
readFileSync(join(quarantineDir, "generated-feature.ts"), "utf-8"),
|
|
153
|
+
"export const answer = 42;\n",
|
|
154
|
+
"untracked source file survives in quarantine",
|
|
155
|
+
);
|
|
156
|
+
assertEq(
|
|
157
|
+
readFileSync(join(quarantineDir, "README.md"), "utf-8"),
|
|
158
|
+
"# changed in worktree\n",
|
|
159
|
+
"modified tracked file survives in quarantine",
|
|
160
|
+
);
|
|
161
|
+
assertTrue(
|
|
162
|
+
existsSync(join(quarantineDir, ".gsd-quarantine.json")),
|
|
163
|
+
"quarantine metadata written",
|
|
164
|
+
);
|
|
165
|
+
});
|
|
166
|
+
|
|
135
167
|
it("worktreePath always returns paths under .gsd/worktrees/", () => {
|
|
136
168
|
const tempDir = createTempRepo();
|
|
137
169
|
dirs.push(tempDir);
|
|
@@ -85,6 +85,18 @@ export interface UnitWorkflowDispatchReadinessInput {
|
|
|
85
85
|
activeTools?: string[];
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
export interface WorkflowDispatchModelContext {
|
|
89
|
+
provider?: string;
|
|
90
|
+
baseUrl?: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface UnitWorkflowDispatchReadinessForModelInput
|
|
94
|
+
extends Omit<UnitWorkflowDispatchReadinessInput, "provider" | "authMode" | "baseUrl"> {
|
|
95
|
+
model?: WorkflowDispatchModelContext | null;
|
|
96
|
+
fallbackModel?: WorkflowDispatchModelContext | null;
|
|
97
|
+
getProviderAuthMode?: (provider: string) => WorkflowCapabilityOptions["authMode"] | undefined;
|
|
98
|
+
}
|
|
99
|
+
|
|
88
100
|
export function compileUnitContextContract(unitType: string): UnitContextContractResult {
|
|
89
101
|
const manifest = resolveManifest(unitType);
|
|
90
102
|
if (!manifest) {
|
|
@@ -115,6 +127,23 @@ export function getUnitWorkflowDispatchReadinessError(
|
|
|
115
127
|
);
|
|
116
128
|
}
|
|
117
129
|
|
|
130
|
+
export function getUnitWorkflowDispatchReadinessErrorForModel(
|
|
131
|
+
input: UnitWorkflowDispatchReadinessForModelInput,
|
|
132
|
+
): string | null {
|
|
133
|
+
const provider = input.model?.provider ?? input.fallbackModel?.provider;
|
|
134
|
+
const baseUrl = input.model?.baseUrl ?? input.fallbackModel?.baseUrl;
|
|
135
|
+
return getUnitWorkflowDispatchReadinessError({
|
|
136
|
+
provider,
|
|
137
|
+
unitType: input.unitType,
|
|
138
|
+
projectRoot: input.projectRoot,
|
|
139
|
+
env: input.env,
|
|
140
|
+
surface: input.surface,
|
|
141
|
+
authMode: provider ? input.getProviderAuthMode?.(provider) : undefined,
|
|
142
|
+
baseUrl,
|
|
143
|
+
activeTools: input.activeTools,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
118
147
|
export function compileUnitToolContract(unitType: string): ToolContractResult {
|
|
119
148
|
const manifest = resolveManifest(unitType);
|
|
120
149
|
const surfaceContract = getUnitToolSurfaceContract(unitType);
|