@opengsd/gsd-pi 1.8.1 β 1.9.0-dev.97ef11e3
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 +10 -8
- package/dist/cli.js +5 -1
- package/dist/headless-events.d.ts +2 -1
- package/dist/headless-events.js +11 -3
- package/dist/headless-milestone-readiness.d.ts +29 -0
- package/dist/headless-milestone-readiness.js +161 -0
- package/dist/headless.js +27 -3
- package/dist/print-mode-exit.d.ts +12 -0
- package/dist/print-mode-exit.js +14 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +18 -49
- package/dist/resources/extensions/browser-tools/capture.js +2 -77
- package/dist/resources/extensions/browser-tools/screenshot-constraints.js +83 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +17 -2
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +30 -2
- package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
- package/dist/resources/extensions/gsd/auto/loop.js +24 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
- package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +16 -10
- package/dist/resources/extensions/gsd/auto-dispatch.js +76 -19
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +137 -22
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
- package/dist/resources/extensions/gsd/auto-start.js +29 -9
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +20 -6
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -50
- package/dist/resources/extensions/gsd/command-feedback.js +16 -12
- package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
- package/dist/resources/extensions/gsd/compat/compat-marker.js +98 -6
- package/dist/resources/extensions/gsd/constants.js +12 -13
- package/dist/resources/extensions/gsd/context-masker.js +97 -21
- package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
- package/dist/resources/extensions/gsd/db/engine.js +56 -18
- package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
- package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
- package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
- package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +26 -4
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +24 -8
- package/dist/resources/extensions/gsd/error-classifier.js +12 -2
- package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
- package/dist/resources/extensions/gsd/flat-phase-migration.js +168 -21
- package/dist/resources/extensions/gsd/git-service.js +19 -7
- package/dist/resources/extensions/gsd/gsd-db.js +262 -76
- package/dist/resources/extensions/gsd/guided-flow.js +40 -15
- package/dist/resources/extensions/gsd/markdown-renderer.js +20 -22
- package/dist/resources/extensions/gsd/md-importer.js +107 -20
- package/dist/resources/extensions/gsd/migrate/command.js +19 -162
- package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
- package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
- package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
- package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +2 -0
- package/dist/resources/extensions/gsd/model-router.js +11 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
- package/dist/resources/extensions/gsd/paths.js +70 -16
- package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
- package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
- package/dist/resources/extensions/gsd/planning-subagent-registry.js +25 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
- package/dist/resources/extensions/gsd/preferences-types.js +5 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +48 -1
- package/dist/resources/extensions/gsd/preferences.js +17 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
- package/dist/resources/extensions/gsd/skill-activation.js +17 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +125 -15
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +17 -4
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
- package/dist/resources/extensions/gsd/stop-notice.js +24 -1
- package/dist/resources/extensions/gsd/sync-lock.js +13 -7
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +94 -6
- package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
- package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
- package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
- package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
- package/dist/resources/extensions/gsd/unit-registry.js +4 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
- package/dist/resources/extensions/gsd/workspace.js +2 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +26 -18
- package/dist/resources/extensions/mac-tools/index.js +31 -9
- package/dist/resources/extensions/shared/interview-ui.js +43 -6
- 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 +7 -7
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_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 +5 -5
- 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 +5 -5
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- 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 +7 -7
- package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- 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/.next/static/css/3b1ceb7abfb9a230.css +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/package.json +0 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +31 -3
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
- package/integrations/hermes/pyproject.toml +1 -1
- package/package.json +13 -10
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +14 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-config.d.ts +1 -1
- package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-config.js +5 -1
- package/packages/daemon/dist/cloud-config.js.map +1 -1
- package/packages/daemon/dist/cloud-config.test.js +51 -1
- package/packages/daemon/dist/cloud-config.test.js.map +1 -1
- package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
- package/packages/daemon/dist/local-tool-executor.js +2 -0
- package/packages/daemon/dist/local-tool-executor.js.map +1 -1
- package/packages/daemon/package.json +6 -6
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +1 -0
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/gsd-cloud/README.md +9 -3
- package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/background-cli.test.js +248 -0
- package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cli.d.ts +5 -0
- package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cli.js +266 -0
- package/packages/gsd-cloud/dist/cli.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
- package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.js +237 -0
- package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
- package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts +33 -0
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.js +260 -0
- package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
- package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-token.js +37 -0
- package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
- package/packages/gsd-cloud/dist/config.d.ts +17 -0
- package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/config.js +146 -0
- package/packages/gsd-cloud/dist/config.js.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
- package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.js +128 -0
- package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
- package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
- package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/executor.js +11 -0
- package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
- package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/index.js +29 -0
- package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
- package/packages/gsd-cloud/dist/index.d.ts +7 -0
- package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/index.js +8 -0
- package/packages/gsd-cloud/dist/index.js.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
- package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
- package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
- package/packages/gsd-cloud/dist/logger.d.ts +25 -0
- package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/logger.js +72 -0
- package/packages/gsd-cloud/dist/logger.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts +27 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.js +272 -0
- package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js +97 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
- package/packages/gsd-cloud/dist/types.d.ts +51 -0
- package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/types.js +9 -0
- package/packages/gsd-cloud/dist/types.js.map +1 -0
- package/packages/gsd-cloud/package.json +3 -3
- package/packages/mcp-server/README.md +15 -2
- package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +119 -33
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +5 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +64 -2
- package/packages/mcp-server/dist/workflow-tools.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.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +136 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +124 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +25 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +11 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.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/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +18 -49
- package/src/resources/extensions/browser-tools/capture.ts +2 -86
- package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
- package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
- package/src/resources/extensions/gsd/auto/loop.ts +48 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
- package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +16 -9
- package/src/resources/extensions/gsd/auto-dispatch.ts +87 -19
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +156 -20
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
- package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
- package/src/resources/extensions/gsd/auto-start.ts +31 -8
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +25 -8
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +87 -53
- package/src/resources/extensions/gsd/command-feedback.ts +19 -12
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
- package/src/resources/extensions/gsd/compat/compat-marker.ts +119 -8
- package/src/resources/extensions/gsd/constants.ts +14 -13
- package/src/resources/extensions/gsd/context-masker.ts +98 -2
- package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
- package/src/resources/extensions/gsd/db/engine.ts +58 -19
- package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
- package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
- package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +26 -4
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +30 -7
- package/src/resources/extensions/gsd/error-classifier.ts +13 -2
- package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
- package/src/resources/extensions/gsd/flat-phase-migration.ts +174 -19
- package/src/resources/extensions/gsd/git-service.ts +19 -6
- package/src/resources/extensions/gsd/gsd-db.ts +340 -85
- package/src/resources/extensions/gsd/guided-flow.ts +50 -14
- package/src/resources/extensions/gsd/markdown-renderer.ts +28 -30
- package/src/resources/extensions/gsd/md-importer.ts +114 -16
- package/src/resources/extensions/gsd/migrate/command.ts +21 -227
- package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
- package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
- package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
- package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +2 -0
- package/src/resources/extensions/gsd/model-router.ts +12 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
- package/src/resources/extensions/gsd/paths.ts +77 -16
- package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
- package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
- package/src/resources/extensions/gsd/planning-subagent-registry.ts +31 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +62 -0
- package/src/resources/extensions/gsd/preferences.ts +25 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
- package/src/resources/extensions/gsd/skill-activation.ts +17 -3
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +162 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +20 -4
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
- package/src/resources/extensions/gsd/stop-notice.ts +29 -1
- package/src/resources/extensions/gsd/sync-lock.ts +14 -6
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
- package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +129 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +362 -1
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
- package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
- package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
- package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
- package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +140 -5
- package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
- package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
- package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
- package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
- package/src/resources/extensions/gsd/types.ts +11 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
- package/src/resources/extensions/gsd/unit-registry.ts +4 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
- package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
- package/src/resources/extensions/gsd/workspace.ts +2 -1
- package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -24
- package/src/resources/extensions/mac-tools/index.ts +52 -9
- package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
- package/src/resources/extensions/shared/interview-ui.ts +47 -8
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -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/css/18c2fdf261bfc1b7.css +0 -1
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg β DXD9fZPnqtjZSlT5xdC3v}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg β DXD9fZPnqtjZSlT5xdC3v}/_ssgManifest.js +0 -0
|
@@ -290,6 +290,8 @@ export const UNIT_REGISTRY = {
|
|
|
290
290
|
"gsd_slice_complete",
|
|
291
291
|
"gsd_task_reopen",
|
|
292
292
|
"gsd_replan_slice",
|
|
293
|
+
"gsd_replan_task",
|
|
294
|
+
"gsd_rework_brief_save",
|
|
293
295
|
"gsd_decision_save",
|
|
294
296
|
"gsd_capture_thought",
|
|
295
297
|
"gsd_requirement_update",
|
|
@@ -303,6 +305,8 @@ export const UNIT_REGISTRY = {
|
|
|
303
305
|
"gsd_slice_complete",
|
|
304
306
|
"gsd_task_reopen",
|
|
305
307
|
"gsd_replan_slice",
|
|
308
|
+
"gsd_replan_task",
|
|
309
|
+
"gsd_rework_brief_save",
|
|
306
310
|
"gsd_requirement_update",
|
|
307
311
|
"gsd_summary_save",
|
|
308
312
|
],
|
|
@@ -6,7 +6,7 @@ import { join } from "node:path";
|
|
|
6
6
|
|
|
7
7
|
import type { GSDState, Phase } from "../types.js";
|
|
8
8
|
import { gsdRoot, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
|
|
9
|
-
import { isDbAvailable, getMilestoneSlices,
|
|
9
|
+
import { isDbAvailable, getMilestoneSlices, getTasksBySliceIds } from "../gsd-db.js";
|
|
10
10
|
import type { SliceRow } from "../db-task-slice-rows.js";
|
|
11
11
|
import type { UokGraphNode } from "./contracts.js";
|
|
12
12
|
|
|
@@ -39,6 +39,19 @@ function graphOutputPath(basePath: string): string {
|
|
|
39
39
|
return join(gsdRoot(basePath), "runtime", "uok-plan-v2-graph.json");
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
// True when the on-disk graph matches `output` ignoring the volatile `compiledAt`
|
|
43
|
+
// stamp, so redundant recompiles on the dispatch hot path skip the disk write.
|
|
44
|
+
function graphBodyUnchanged(outPath: string, output: Record<string, unknown>): boolean {
|
|
45
|
+
try {
|
|
46
|
+
const existing = JSON.parse(readFileSync(outPath, "utf-8")) as Record<string, unknown>;
|
|
47
|
+
const { compiledAt: _existingStamp, ...existingBody } = existing;
|
|
48
|
+
const { compiledAt: _outputStamp, ...outputBody } = output;
|
|
49
|
+
return JSON.stringify(existingBody) === JSON.stringify(outputBody);
|
|
50
|
+
} catch {
|
|
51
|
+
return false; // Missing, unreadable, or corrupt β write.
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
42
55
|
function hasFileContent(path: string | null): boolean {
|
|
43
56
|
if (!path || !existsSync(path)) return false;
|
|
44
57
|
try {
|
|
@@ -120,9 +133,11 @@ export function compileUnitGraphFromState(basePath: string, state: GSDState): Pl
|
|
|
120
133
|
};
|
|
121
134
|
}
|
|
122
135
|
|
|
136
|
+
const tasksBySlice = getTasksBySliceIds(slices.map((slice) => ({ milestoneId: mid, sliceId: slice.id })));
|
|
137
|
+
|
|
123
138
|
for (const slice of slices) {
|
|
124
139
|
const sid = slice.id;
|
|
125
|
-
const tasks =
|
|
140
|
+
const tasks = (tasksBySlice.get(`${mid}\0${sid}`) ?? [])
|
|
126
141
|
.sort((a, b) => Number(a.sequence ?? 0) - Number(b.sequence ?? 0));
|
|
127
142
|
|
|
128
143
|
let previousTaskNodeId: string | null = null;
|
|
@@ -174,7 +189,9 @@ export function compileUnitGraphFromState(basePath: string, state: GSDState): Pl
|
|
|
174
189
|
|
|
175
190
|
const outPath = graphOutputPath(basePath);
|
|
176
191
|
mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
|
|
177
|
-
|
|
192
|
+
if (!graphBodyUnchanged(outPath, output)) {
|
|
193
|
+
writeFileSync(outPath, JSON.stringify(output, null, 2) + "\n", "utf-8");
|
|
194
|
+
}
|
|
178
195
|
|
|
179
196
|
return {
|
|
180
197
|
ok: true,
|
|
@@ -26,7 +26,7 @@ import { deriveState } from "./state.js";
|
|
|
26
26
|
import type { GSDState } from "./types.js";
|
|
27
27
|
import { renderPlanFromDb, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
28
28
|
import { readManifest } from "./workflow-manifest.js";
|
|
29
|
-
import { gsdRoot, resolveMilestoneFile, resolveSliceFile, resolveTaskFile,
|
|
29
|
+
import { gsdRoot, resolveMilestoneFile, resolveSliceFile, resolveTaskFile, targetTaskFile } from "./paths.js";
|
|
30
30
|
|
|
31
31
|
// βββ Helpers βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
32
32
|
|
|
@@ -329,8 +329,7 @@ export function renderSummaryProjection(basePath: string, milestoneId: string, s
|
|
|
329
329
|
const evidenceRows = getVerificationEvidence(milestoneId, sliceId, taskId);
|
|
330
330
|
const content = renderSummaryContent(taskRow, sliceId, milestoneId, evidenceRows);
|
|
331
331
|
|
|
332
|
-
const summaryPath =
|
|
333
|
-
?? join(basePath, relTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY", getMilestone(milestoneId)?.title));
|
|
332
|
+
const summaryPath = targetTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY", getMilestone(milestoneId)?.title);
|
|
334
333
|
mkdirSync(dirname(summaryPath), { recursive: true });
|
|
335
334
|
atomicWriteSync(summaryPath, content);
|
|
336
335
|
}
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
normalizeRealPath,
|
|
11
11
|
} from "./paths.js";
|
|
12
12
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
13
|
+
import { milestoneMetaPath } from "./git-service.js";
|
|
13
14
|
|
|
14
15
|
export type GsdWorkspaceMode = "project" | "worktree";
|
|
15
16
|
|
|
@@ -107,7 +108,7 @@ export function scopeMilestone(workspace: GsdWorkspace, milestoneId: string): Mi
|
|
|
107
108
|
stateFile: () => join(gsd, "STATE.md"),
|
|
108
109
|
dbPath: () => contract.projectDb,
|
|
109
110
|
milestoneDir: () => scopeMilestoneDir(basePath, milestoneId),
|
|
110
|
-
metaJson: () =>
|
|
111
|
+
metaJson: () => milestoneMetaPath(basePath, milestoneId),
|
|
111
112
|
});
|
|
112
113
|
|
|
113
114
|
return scope;
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
import { join } from "node:path";
|
|
33
33
|
|
|
34
34
|
import { reconcileWorktreeDb } from "./gsd-db.js";
|
|
35
|
-
import { resolveGsdPathContract } from "./paths.js";
|
|
35
|
+
import { dirIsContentBearingLegacyMilestone, resolveGsdPathContract } from "./paths.js";
|
|
36
36
|
import { safeCopy, safeCopyRecursive } from "./safe-fs.js";
|
|
37
37
|
import type { MilestoneScope } from "./workspace.js";
|
|
38
38
|
import { logError, logWarning } from "./workflow-logger.js";
|
|
@@ -161,6 +161,7 @@ function syncOtherMilestoneArtifacts(
|
|
|
161
161
|
// additive safeCopyRecursive; skip it here to avoid redundant work.
|
|
162
162
|
if (milestoneEntry.name === currentMilestoneId) continue;
|
|
163
163
|
const srcMilestoneDir = join(srcMilestonesDir, milestoneEntry.name);
|
|
164
|
+
if (!dirIsContentBearingLegacyMilestone(srcMilestoneDir)) continue;
|
|
164
165
|
const dstMilestoneDir = join(dstMilestonesDir, milestoneEntry.name);
|
|
165
166
|
|
|
166
167
|
// Additively project the entire milestone subtree (force:false), not just
|
|
@@ -179,6 +180,14 @@ function syncOtherMilestoneArtifacts(
|
|
|
179
180
|
}
|
|
180
181
|
}
|
|
181
182
|
|
|
183
|
+
function syncFlatPhaseArtifacts(prGsd: string, wtGsd: string): void {
|
|
184
|
+
safeCopyRecursive(
|
|
185
|
+
join(prGsd, "phases"),
|
|
186
|
+
join(wtGsd, "phases"),
|
|
187
|
+
{ force: false },
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
182
191
|
/**
|
|
183
192
|
* Root-level .gsd/ files copied from worktree back to project root for
|
|
184
193
|
* post-merge diagnostics. Markdown projections are NOT in this list β DB
|
|
@@ -254,41 +263,41 @@ export function _projectRootToWorktreeImpl(
|
|
|
254
263
|
// worktree-bound unit; the project root remains authoritative.
|
|
255
264
|
syncRootProjectionFilesToWorktree(prGsd, wtGsd);
|
|
256
265
|
|
|
266
|
+
// Flat-phase artifacts (phases/NN-slug/NN-CONTEXT.md, NN-DISCUSSION.md,
|
|
267
|
+
// ROADMAP, etc.) must be available before the first worktree dispatch.
|
|
268
|
+
syncFlatPhaseArtifacts(prGsd, wtGsd);
|
|
269
|
+
|
|
257
270
|
// Copy milestone directory from project root to worktree β additive only.
|
|
258
271
|
// force:false prevents cpSync from overwriting existing worktree files.
|
|
259
272
|
// Without this, worktree-local files (e.g. VALIDATION.md written
|
|
260
273
|
// by validate-milestone) get clobbered by stale project root copies,
|
|
261
274
|
// causing an infinite re-validation loop (#1886).
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
{ force: false }
|
|
266
|
-
|
|
275
|
+
const prMilestoneDir = join(prGsd, "milestones", milestoneId);
|
|
276
|
+
const wtMilestoneDir = join(wtGsd, "milestones", milestoneId);
|
|
277
|
+
if (dirIsContentBearingLegacyMilestone(prMilestoneDir)) {
|
|
278
|
+
safeCopyRecursive(prMilestoneDir, wtMilestoneDir, { force: false });
|
|
279
|
+
|
|
280
|
+
// Force-sync ASSESSMENT files that have a verdict from project root (#2821).
|
|
281
|
+
// The additive-only copy above preserves worktree-local files, but
|
|
282
|
+
// ASSESSMENT files are special: after run-uat writes a verdict and post-unit
|
|
283
|
+
// syncs it to the project root, the worktree may retain a stale copy (e.g.
|
|
284
|
+
// verdict:fail while the project root has verdict:pass from a retry). On
|
|
285
|
+
// session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
|
|
286
|
+
// persists, checkNeedsRunUat finds no passing verdict β re-dispatches
|
|
287
|
+
// run-uat indefinitely (stuck-loop Γ9).
|
|
288
|
+
forceOverwriteValidationWithVerdict(prMilestoneDir, wtMilestoneDir, milestoneId);
|
|
289
|
+
forceOverwriteAssessmentsWithVerdict(prMilestoneDir, wtMilestoneDir);
|
|
290
|
+
}
|
|
267
291
|
|
|
268
|
-
// Additively project the full subtree of every OTHER
|
|
269
|
-
// worktree-bound units can read prior-milestone context artifacts
|
|
270
|
-
//
|
|
271
|
-
// UAT.md on the worktree filesystem (otherwise the stale-render detector
|
|
272
|
-
// flags them as "complete in DB but missing on disk").
|
|
292
|
+
// Additively project the full subtree of every OTHER content-bearing legacy
|
|
293
|
+
// milestone so worktree-bound units can read prior-milestone context artifacts
|
|
294
|
+
// without recreating empty/meta-only milestones/ scaffolds in flat-phase projects.
|
|
273
295
|
syncOtherMilestoneArtifacts(
|
|
274
296
|
join(prGsd, "milestones"),
|
|
275
297
|
join(wtGsd, "milestones"),
|
|
276
298
|
milestoneId,
|
|
277
299
|
);
|
|
278
300
|
|
|
279
|
-
// Force-sync ASSESSMENT files that have a verdict from project root (#2821).
|
|
280
|
-
// The additive-only copy above preserves worktree-local files, but
|
|
281
|
-
// ASSESSMENT files are special: after run-uat writes a verdict and post-unit
|
|
282
|
-
// syncs it to the project root, the worktree may retain a stale copy (e.g.
|
|
283
|
-
// verdict:fail while the project root has verdict:pass from a retry). On
|
|
284
|
-
// session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
|
|
285
|
-
// persists, checkNeedsRunUat finds no passing verdict β re-dispatches
|
|
286
|
-
// run-uat indefinitely (stuck-loop Γ9).
|
|
287
|
-
const prMilestoneDir = join(prGsd, "milestones", milestoneId);
|
|
288
|
-
const wtMilestoneDir = join(wtGsd, "milestones", milestoneId);
|
|
289
|
-
forceOverwriteValidationWithVerdict(prMilestoneDir, wtMilestoneDir, milestoneId);
|
|
290
|
-
forceOverwriteAssessmentsWithVerdict(prMilestoneDir, wtMilestoneDir);
|
|
291
|
-
|
|
292
301
|
// Forward-sync completed-units.json from project root to worktree.
|
|
293
302
|
// Project root is authoritative for completion state after crash recovery;
|
|
294
303
|
// without this, the worktree re-dispatches already-completed units (#1886).
|
|
@@ -17,6 +17,10 @@ import { StringEnum, Type } from "@gsd/pi-ai";
|
|
|
17
17
|
import { execFileSync } from "node:child_process";
|
|
18
18
|
import { statSync, readdirSync } from "node:fs";
|
|
19
19
|
import path from "node:path";
|
|
20
|
+
import {
|
|
21
|
+
constrainScreenshot,
|
|
22
|
+
getScreenshotBufferDimensions,
|
|
23
|
+
} from "../browser-tools/screenshot-constraints.js";
|
|
20
24
|
|
|
21
25
|
// ---------------------------------------------------------------------------
|
|
22
26
|
// Paths
|
|
@@ -96,6 +100,45 @@ interface MacAgentResponse {
|
|
|
96
100
|
error?: string;
|
|
97
101
|
}
|
|
98
102
|
|
|
103
|
+
interface MacScreenshotPayload {
|
|
104
|
+
imageData: string;
|
|
105
|
+
width: number;
|
|
106
|
+
height: number;
|
|
107
|
+
format: string;
|
|
108
|
+
mimeType: string;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function macScreenshotQualityToPercent(quality: number | undefined): number {
|
|
112
|
+
if (quality === undefined || !Number.isFinite(quality)) return 80;
|
|
113
|
+
return Math.min(100, Math.max(1, Math.round(quality * 100)));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export async function prepareMacScreenshotPayload(
|
|
117
|
+
data: Record<string, any>,
|
|
118
|
+
quality: number | undefined,
|
|
119
|
+
): Promise<MacScreenshotPayload> {
|
|
120
|
+
const format = data.format as string;
|
|
121
|
+
const mimeType = format === "png" ? "image/png" : "image/jpeg";
|
|
122
|
+
const rawBuffer = Buffer.from(data.imageData as string, "base64");
|
|
123
|
+
const constrainedBuffer = await constrainScreenshot(
|
|
124
|
+
null as any,
|
|
125
|
+
rawBuffer,
|
|
126
|
+
mimeType,
|
|
127
|
+
macScreenshotQualityToPercent(quality),
|
|
128
|
+
);
|
|
129
|
+
const dimensions = constrainedBuffer === rawBuffer
|
|
130
|
+
? null
|
|
131
|
+
: await getScreenshotBufferDimensions(constrainedBuffer);
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
imageData: constrainedBuffer.toString("base64"),
|
|
135
|
+
width: dimensions?.width ?? (data.width as number),
|
|
136
|
+
height: dimensions?.height ?? (data.height as number),
|
|
137
|
+
format,
|
|
138
|
+
mimeType,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
99
142
|
/**
|
|
100
143
|
* Invoke the mac-agent CLI with a command and optional params.
|
|
101
144
|
* Handles compilation caching, stdin/stdout JSON protocol, and error surfacing.
|
|
@@ -718,19 +761,19 @@ export default function (pi: ExtensionAPI) {
|
|
|
718
761
|
throw new Error("mac_screenshot: " + result.error);
|
|
719
762
|
}
|
|
720
763
|
|
|
721
|
-
const
|
|
722
|
-
const imageData = data.imageData as string;
|
|
723
|
-
const format = data.format as string;
|
|
724
|
-
const width = data.width as number;
|
|
725
|
-
const height = data.height as number;
|
|
726
|
-
const mimeType = format === "png" ? "image/png" : "image/jpeg";
|
|
764
|
+
const screenshot = await prepareMacScreenshotPayload(result.data!, args.quality);
|
|
727
765
|
|
|
728
766
|
return {
|
|
729
767
|
content: [
|
|
730
|
-
{ type: "text" as const, text: `Screenshot: ${width}x${height} ${format}` },
|
|
731
|
-
{ type: "image" as const, data: imageData, mimeType },
|
|
768
|
+
{ type: "text" as const, text: `Screenshot: ${screenshot.width}x${screenshot.height} ${screenshot.format}` },
|
|
769
|
+
{ type: "image" as const, data: screenshot.imageData, mimeType: screenshot.mimeType },
|
|
732
770
|
],
|
|
733
|
-
details: {
|
|
771
|
+
details: {
|
|
772
|
+
width: screenshot.width,
|
|
773
|
+
height: screenshot.height,
|
|
774
|
+
format: screenshot.format,
|
|
775
|
+
mimeType: screenshot.mimeType,
|
|
776
|
+
},
|
|
734
777
|
};
|
|
735
778
|
},
|
|
736
779
|
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const { describe, it, afterEach } = require("node:test");
|
|
2
|
+
const assert = require("node:assert/strict");
|
|
3
|
+
const jiti = require("jiti")(__filename, { interopDefault: true, debug: false });
|
|
4
|
+
|
|
5
|
+
const { prepareMacScreenshotPayload } = jiti("../index.ts");
|
|
6
|
+
const { __setSharpForTesting } = jiti("../../browser-tools/screenshot-constraints.ts");
|
|
7
|
+
|
|
8
|
+
async function createTestJpeg(width, height) {
|
|
9
|
+
const sharp = require("sharp");
|
|
10
|
+
return sharp({
|
|
11
|
+
create: {
|
|
12
|
+
width,
|
|
13
|
+
height,
|
|
14
|
+
channels: 3,
|
|
15
|
+
background: { r: 128, g: 128, b: 128 },
|
|
16
|
+
},
|
|
17
|
+
})
|
|
18
|
+
.jpeg({ quality: 80 })
|
|
19
|
+
.toBuffer();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
describe("prepareMacScreenshotPayload", () => {
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
__setSharpForTesting(undefined);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it("resizes oversized mac screenshots before returning base64 image data", async () => {
|
|
28
|
+
const sharp = require("sharp");
|
|
29
|
+
const input = await createTestJpeg(3000, 2000);
|
|
30
|
+
|
|
31
|
+
const result = await prepareMacScreenshotPayload(
|
|
32
|
+
{
|
|
33
|
+
imageData: input.toString("base64"),
|
|
34
|
+
format: "jpeg",
|
|
35
|
+
width: 3000,
|
|
36
|
+
height: 2000,
|
|
37
|
+
},
|
|
38
|
+
0.8,
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const output = Buffer.from(result.imageData, "base64");
|
|
42
|
+
const meta = await sharp(output).metadata();
|
|
43
|
+
assert.equal(result.mimeType, "image/jpeg");
|
|
44
|
+
assert.equal(result.width, 1568);
|
|
45
|
+
assert.ok(result.height > 1000 && result.height < 1100);
|
|
46
|
+
assert.equal(meta.width, result.width);
|
|
47
|
+
assert.equal(meta.height, result.height);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("falls back to raw screenshot data and original dimensions when sharp is unavailable", async () => {
|
|
51
|
+
__setSharpForTesting(null);
|
|
52
|
+
const input = await createTestJpeg(3000, 2000);
|
|
53
|
+
const inputBase64 = input.toString("base64");
|
|
54
|
+
|
|
55
|
+
const result = await prepareMacScreenshotPayload(
|
|
56
|
+
{
|
|
57
|
+
imageData: inputBase64,
|
|
58
|
+
format: "jpeg",
|
|
59
|
+
width: 3000,
|
|
60
|
+
height: 2000,
|
|
61
|
+
},
|
|
62
|
+
0.8,
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
assert.equal(result.imageData, inputBase64);
|
|
66
|
+
assert.equal(result.width, 3000);
|
|
67
|
+
assert.equal(result.height, 2000);
|
|
68
|
+
assert.equal(result.mimeType, "image/jpeg");
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -252,6 +252,11 @@ export async function showInterviewRound(
|
|
|
252
252
|
let previewTotal = 0;
|
|
253
253
|
function resetPreviewScroll() { previewScroll = 0; }
|
|
254
254
|
|
|
255
|
+
let optionsScroll = 0;
|
|
256
|
+
let optionsViewport = 0;
|
|
257
|
+
let optionsTotal = 0;
|
|
258
|
+
function resetOptionsScroll() { optionsScroll = 0; }
|
|
259
|
+
|
|
255
260
|
function finish(result: RoundResult) {
|
|
256
261
|
if (completed) return;
|
|
257
262
|
completed = true;
|
|
@@ -318,6 +323,7 @@ export async function showInterviewRound(
|
|
|
318
323
|
saveEditorToState();
|
|
319
324
|
currentIdx = newIdx;
|
|
320
325
|
resetPreviewScroll();
|
|
326
|
+
resetOptionsScroll();
|
|
321
327
|
loadStateToEditor();
|
|
322
328
|
focusNotes = states[currentIdx].notesVisible && states[currentIdx].notes.length > 0;
|
|
323
329
|
refresh();
|
|
@@ -464,20 +470,39 @@ export async function showInterviewRound(
|
|
|
464
470
|
if (matchesKey(data, Key.right)) { switchQuestion((currentIdx + 1) % questions.length); return; }
|
|
465
471
|
}
|
|
466
472
|
|
|
467
|
-
// ββ
|
|
473
|
+
// ββ Side-by-side panel scrolling βββββββββββββββββββββββββββββ
|
|
468
474
|
if (matchesKey(data, Key.pageUp)) {
|
|
469
|
-
|
|
475
|
+
let didScroll = false;
|
|
476
|
+
if (optionsScroll > 0) {
|
|
477
|
+
optionsScroll = Math.max(0, optionsScroll - optionsViewport);
|
|
478
|
+
didScroll = true;
|
|
479
|
+
}
|
|
480
|
+
if (previewScroll > 0) {
|
|
481
|
+
previewScroll = Math.max(0, previewScroll - previewViewport);
|
|
482
|
+
didScroll = true;
|
|
483
|
+
}
|
|
484
|
+
if (didScroll) refresh();
|
|
470
485
|
return;
|
|
471
486
|
}
|
|
472
487
|
if (matchesKey(data, Key.pageDown)) {
|
|
488
|
+
let didScroll = false;
|
|
489
|
+
const maxOptionsScroll = Math.max(0, optionsTotal - optionsViewport);
|
|
490
|
+
if (optionsScroll < maxOptionsScroll) {
|
|
491
|
+
optionsScroll = Math.min(maxOptionsScroll, optionsScroll + optionsViewport);
|
|
492
|
+
didScroll = true;
|
|
493
|
+
}
|
|
473
494
|
const maxScroll = Math.max(0, previewTotal - previewViewport);
|
|
474
|
-
if (previewScroll < maxScroll) {
|
|
495
|
+
if (previewScroll < maxScroll) {
|
|
496
|
+
previewScroll = Math.min(maxScroll, previewScroll + previewViewport);
|
|
497
|
+
didScroll = true;
|
|
498
|
+
}
|
|
499
|
+
if (didScroll) refresh();
|
|
475
500
|
return;
|
|
476
501
|
}
|
|
477
502
|
|
|
478
503
|
// ββ Cursor navigation ββββββββββββββββββββββββββββββββββββββββ
|
|
479
|
-
if (matchesKey(data, Key.up)) { st.cursorIndex = (st.cursorIndex - 1 + optCount) % optCount; resetPreviewScroll(); refresh(); return; }
|
|
480
|
-
if (matchesKey(data, Key.down)) { st.cursorIndex = (st.cursorIndex + 1) % optCount; resetPreviewScroll(); refresh(); return; }
|
|
504
|
+
if (matchesKey(data, Key.up)) { st.cursorIndex = (st.cursorIndex - 1 + optCount) % optCount; resetPreviewScroll(); resetOptionsScroll(); refresh(); return; }
|
|
505
|
+
if (matchesKey(data, Key.down)) { st.cursorIndex = (st.cursorIndex + 1) % optCount; resetPreviewScroll(); resetOptionsScroll(); refresh(); return; }
|
|
481
506
|
|
|
482
507
|
if (multiSel) {
|
|
483
508
|
const doneI = noneOrDoneIdx(currentIdx);
|
|
@@ -695,6 +720,8 @@ export async function showInterviewRound(
|
|
|
695
720
|
// No scrollable preview unless the side-by-side path sets these below.
|
|
696
721
|
previewTotal = 0;
|
|
697
722
|
previewViewport = 0;
|
|
723
|
+
optionsTotal = 0;
|
|
724
|
+
optionsViewport = 0;
|
|
698
725
|
|
|
699
726
|
if (useSideBySide) {
|
|
700
727
|
// ββ Preview path ββββββββββββββββββββββββββββββββββββββ
|
|
@@ -734,10 +761,21 @@ export async function showInterviewRound(
|
|
|
734
761
|
const leftWidth = Math.max(MIN_OPTIONS_WIDTH, contentWidth - previewWidth - DIVIDER_WIDTH);
|
|
735
762
|
|
|
736
763
|
const fullLeft = renderOptionsColumn(leftWidth);
|
|
737
|
-
|
|
764
|
+
optionsTotal = fullLeft.length;
|
|
765
|
+
optionsViewport = maxBody;
|
|
766
|
+
const maxOptionsScroll = Math.max(0, fullLeft.length - maxBody);
|
|
767
|
+
if (optionsScroll > maxOptionsScroll) optionsScroll = maxOptionsScroll;
|
|
768
|
+
|
|
769
|
+
const leftLines = fullLeft.slice(optionsScroll, optionsScroll + maxBody);
|
|
738
770
|
if (fullLeft.length > maxBody) {
|
|
739
|
-
const
|
|
740
|
-
|
|
771
|
+
const hiddenAbove = optionsScroll;
|
|
772
|
+
const hiddenBelow = fullLeft.length - (optionsScroll + maxBody);
|
|
773
|
+
if (hiddenAbove > 0) {
|
|
774
|
+
leftLines[0] = scrollIndicator(`β² ${hiddenAbove} more`, leftWidth);
|
|
775
|
+
}
|
|
776
|
+
if (hiddenBelow > 0) {
|
|
777
|
+
leftLines[leftLines.length - 1] = scrollIndicator(`βΌ ${hiddenBelow} more Β· PgUp/PgDn`, leftWidth);
|
|
778
|
+
}
|
|
741
779
|
}
|
|
742
780
|
|
|
743
781
|
const preview = getCurrentPreview();
|
|
@@ -791,6 +829,7 @@ export async function showInterviewRound(
|
|
|
791
829
|
hints.push(isLast && allAnswered() ? "enter to review" : "enter to next");
|
|
792
830
|
}
|
|
793
831
|
if (previewTotal > previewViewport) hints.push("pgup/pgdn scroll preview");
|
|
832
|
+
if (optionsTotal > optionsViewport) hints.push("pgup/pgdn scroll options");
|
|
794
833
|
hints.push("esc to exit");
|
|
795
834
|
const footer = ui.hints(hints)[0] ?? "";
|
|
796
835
|
|
|
@@ -192,4 +192,33 @@ describe("interview-ui dialog borders", () => {
|
|
|
192
192
|
const back = stripAnsi(widget.render(100).join("\n"));
|
|
193
193
|
assert.doesNotMatch(back, /β² \d+ more/, "top indicator should disappear after scrolling back to top");
|
|
194
194
|
});
|
|
195
|
+
|
|
196
|
+
it("makes overflowing side-by-side options scrollable with PgUp/PgDn", async () => {
|
|
197
|
+
const overflowOptions = Array.from({ length: 8 }, (_, i) => ({
|
|
198
|
+
label: `Overflow Option ${i + 1}`,
|
|
199
|
+
description: `Detailed explanation for option ${i + 1} that is intentionally long enough to wrap in the options column and force vertical overflow.`,
|
|
200
|
+
...(i === 0 ? { preview: "Short preview" } : {}),
|
|
201
|
+
}));
|
|
202
|
+
const widget = await captureInterviewWidget([{
|
|
203
|
+
...questions[0],
|
|
204
|
+
options: overflowOptions,
|
|
205
|
+
}]);
|
|
206
|
+
|
|
207
|
+
const initial = stripAnsi(widget.render(100).join("\n"));
|
|
208
|
+
assertFullOuterBorder(widget.render(100), 100);
|
|
209
|
+
assert.match(initial, /βΌ \d+ more/, "bottom scroll indicator should appear when options overflow");
|
|
210
|
+
assert.match(initial, /pgup\/pgdn scroll options/, "footer should hint at options scrolling");
|
|
211
|
+
assert.doesNotMatch(initial, /\+\d+ lines hidden/, "options overflow should not be a dead-end hidden-lines marker");
|
|
212
|
+
assert.doesNotMatch(initial, /β² \d+ more/, "top indicator should be absent before scrolling");
|
|
213
|
+
|
|
214
|
+
widget.handleInput(PAGE_DOWN);
|
|
215
|
+
const scrolled = stripAnsi(widget.render(100).join("\n"));
|
|
216
|
+
assertFullOuterBorder(widget.render(100), 100);
|
|
217
|
+
assert.match(scrolled, /β² \d+ more/, "top scroll indicator should appear after scrolling down");
|
|
218
|
+
assert.ok(scrolled !== initial, "scrolling should change the rendered options");
|
|
219
|
+
|
|
220
|
+
widget.handleInput(PAGE_UP);
|
|
221
|
+
const back = stripAnsi(widget.render(100).join("\n"));
|
|
222
|
+
assert.doesNotMatch(back, /β² \d+ more/, "top indicator should disappear after scrolling back to top");
|
|
223
|
+
});
|
|
195
224
|
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9492],{29999:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"styles",{enumerable:!0,get:function(){return l}});let l={error:{fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},desc:{display:"inline-block"},h1:{display:"inline-block",margin:"0 20px 0 0",padding:"0 23px 0 0",fontSize:24,fontWeight:500,verticalAlign:"top",lineHeight:"49px"},h2:{fontSize:14,fontWeight:400,lineHeight:"49px",margin:0}};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},32910:(e,t,l)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return o}});let r=l(18870),n=l(48664),o=function(){return(0,r.jsx)("html",{children:(0,r.jsx)("body",{children:(0,r.jsx)(n.HTTPAccessErrorFallback,{status:404,message:"This page could not be found."})})})};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},33433:(e,t,l)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/_not-found/page",function(){return l(32910)}])},48664:(e,t,l)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HTTPAccessErrorFallback",{enumerable:!0,get:function(){return o}});let r=l(18870),n=l(29999);function o({status:e,message:t}){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("title",{children:`${e}: ${t}`}),(0,r.jsx)("div",{style:n.styles.error,children:(0,r.jsxs)("div",{children:[(0,r.jsx)("style",{dangerouslySetInnerHTML:{__html:"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}),(0,r.jsx)("h1",{className:"next-error-h1",style:n.styles.h1,children:e}),(0,r.jsx)("div",{style:n.styles.desc,children:(0,r.jsx)("h2",{style:n.styles.h2,children:t})})]})})]})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)}},e=>{e.O(0,[9990,686,7358],()=>e(e.s=33433)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8974],{13914:(e,t,n)=>{Promise.resolve().then(n.bind(n,92703))},19013:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"workAsyncStorage",{enumerable:!0,get:function(){return r.workAsyncStorageInstance}});let r=n(34969)},23711:(e,t,n)=>{"use strict";n.d(t,{default:()=>u.a});var r=n(60276),u=n.n(r)},30039:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={bindSnapshot:function(){return s},createAsyncLocalStorage:function(){return a},createSnapshot:function(){return i}};for(var r in n)Object.defineProperty(t,r,{enumerable:!0,get:n[r]});let u=Object.defineProperty(Error("Invariant: AsyncLocalStorage accessed in runtime where it is not available"),"__NEXT_ERROR_CODE",{value:"E504",enumerable:!1,configurable:!0});class l{disable(){throw u}getStore(){}run(){throw u}exit(){throw u}enterWith(){throw u}static bind(e){return e}}let o="u">typeof globalThis&&globalThis.AsyncLocalStorage;function a(){return o?new o:new l}function s(e){return o?o.bind(e):l.bind(e)}function i(){return o?o.snapshot():function(e,...t){return e(...t)}}},34969:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"workAsyncStorageInstance",{enumerable:!0,get:function(){return r}});let r=(0,n(30039).createAsyncLocalStorage)()},47811:(e,t,n)=>{"use strict";function r({reason:e,children:t}){return t}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"BailoutToCSR",{enumerable:!0,get:function(){return r}}),n(71495)},60276:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return u}});let r=n(51481)._(n(80260));function u(e,t){let n={};"function"==typeof e&&(n.loader=e);let u={...n,...t};return(0,r.default)({...u,modules:u.loadableGenerated?.modules})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},76670:(e,t,n)=>{"use strict";function r({moduleIds:e}){return null}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"PreloadChunks",{enumerable:!0,get:function(){return r}}),n(18870),n(29411),n(19013),n(19132),n(63632)},80260:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return s}});let r=n(18870),u=n(45110),l=n(47811);function o(e){return{default:e&&"default"in e?e.default:e}}n(76670);let a={loader:()=>Promise.resolve(o(()=>null)),loading:null,ssr:!0},s=function(e){let t={...a,...e},n=(0,u.lazy)(()=>t.loader().then(o)),s=t.loading;function i(e){let o=s?(0,r.jsx)(s,{isLoading:!0,pastDelay:!0,error:null}):null,a=!t.ssr||!!t.loading,i=a?u.Suspense:u.Fragment,c=t.ssr?(0,r.jsxs)(r.Fragment,{children:[null,(0,r.jsx)(n,{...e})]}):(0,r.jsx)(l.BailoutToCSR,{reason:"next/dynamic",children:(0,r.jsx)(n,{...e})});return(0,r.jsx)(i,{...a?{fallback:o}:{},children:c})}return i.displayName="LoadableComponent",i}},92703:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>l});var r=n(18870);let u=(0,n(23711).default)(()=>Promise.all([n.e(4825),n.e(5395),n.e(7882),n.e(8937)]).then(n.bind(n,38937)).then(e=>e.GSDAppShell),{loadableGenerated:{webpack:()=>[38937]},ssr:!1,loading:()=>(0,r.jsx)("div",{className:"flex h-screen items-center justify-center bg-background text-sm text-muted-foreground",children:"Loading workspaceβ¦"})});function l(){return(0,r.jsx)(u,{})}}},e=>{e.O(0,[9990,686,7358],()=>e(e.s=13914)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9337],{29454:(e,s,_)=>{Promise.resolve().then(_.t.bind(_,45336,23))}},e=>{e.O(0,[9990,686,7358],()=>e(e.s=29454)),_N_E=e.O()}]);
|