@opengsd/gsd-pi 1.2.0-dev.84c56d87 → 1.2.0-dev.9ad8ae33
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/dist/headless-events.js +7 -5
- package/dist/mcp-server.js +2 -1
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
- package/dist/resources/extensions/gsd/auto/phases.js +49 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
- package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
- package/dist/resources/extensions/gsd/auto-start.js +35 -15
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +14 -1
- package/dist/resources/extensions/gsd/auto.js +37 -1
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +145 -50
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/queries.js +26 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +60 -0
- package/dist/resources/extensions/gsd/guided-flow.js +6 -3
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/preferences-models.js +2 -2
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/state.js +5 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +40 -15
- package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +45 -3
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
- 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-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/package.json +2 -2
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- 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 +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +10 -5
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +99 -38
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +419 -221
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +460 -261
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.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 +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.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 +5 -4
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
- package/src/resources/extensions/gsd/auto/phases.ts +65 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
- package/src/resources/extensions/gsd/auto-start.ts +36 -18
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +14 -1
- package/src/resources/extensions/gsd/auto.ts +44 -1
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +163 -55
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/queries.ts +37 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +78 -0
- package/src/resources/extensions/gsd/guided-flow.ts +21 -26
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/preferences-models.ts +2 -1
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/state.ts +5 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +60 -15
- package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/shared/gsd-browser-cli.ts +54 -3
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Host-owned verification verdict policy for auto-mode units.
|
|
3
|
+
export const NO_HOST_CHECKS_FAILURE_CONTEXT = "No runnable host-owned verification command was discovered. Add project verification_commands in .gsd/PREFERENCES.md or a runnable task-plan Verify command, then resume with /gsd next.";
|
|
3
4
|
export function decideVerificationVerdict(unitType, result) {
|
|
4
5
|
if (unitType === "execute-task" && result.discoverySource === "task-plan-prose" && result.checks.length === 0) {
|
|
5
6
|
return {
|
|
@@ -14,7 +15,7 @@ export function decideVerificationVerdict(unitType, result) {
|
|
|
14
15
|
passed: false,
|
|
15
16
|
reason: "no-host-checks",
|
|
16
17
|
retryable: false,
|
|
17
|
-
failureContext:
|
|
18
|
+
failureContext: NO_HOST_CHECKS_FAILURE_CONTEXT,
|
|
18
19
|
};
|
|
19
20
|
}
|
|
20
21
|
if (!result.passed) {
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { appendFileSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
5
|
+
import { resolveGsdPathContract } from "./paths.js";
|
|
6
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
7
|
+
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
8
|
+
import { normalizeWorkflowEventCommand } from "./workflow-event-vocabulary.js";
|
|
9
|
+
export const WORKFLOW_EVENT_LOG_FILENAME = "event-log.jsonl";
|
|
10
|
+
export function resolveWorkflowEventLedgerLocation(basePath, originalProjectRoot) {
|
|
11
|
+
const contract = resolveGsdPathContract(basePath, originalProjectRoot);
|
|
12
|
+
return {
|
|
13
|
+
projectRoot: contract.projectRoot,
|
|
14
|
+
workRoot: contract.workRoot,
|
|
15
|
+
projectGsd: contract.projectGsd,
|
|
16
|
+
worktreeGsd: contract.worktreeGsd,
|
|
17
|
+
projectLogPath: join(contract.projectGsd, WORKFLOW_EVENT_LOG_FILENAME),
|
|
18
|
+
worktreeLogPath: contract.worktreeGsd
|
|
19
|
+
? join(contract.worktreeGsd, WORKFLOW_EVENT_LOG_FILENAME)
|
|
20
|
+
: null,
|
|
21
|
+
isWorktree: contract.isWorktree,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function workflowEventLogPath(basePath) {
|
|
25
|
+
return resolveWorkflowEventLedgerLocation(basePath).projectLogPath;
|
|
26
|
+
}
|
|
27
|
+
export function workflowEventArchivePath(basePath, milestoneId) {
|
|
28
|
+
const location = resolveWorkflowEventLedgerLocation(basePath);
|
|
29
|
+
return join(location.projectGsd, `event-log-${milestoneId}.jsonl.archived`);
|
|
30
|
+
}
|
|
31
|
+
export function readWorktreeEventLogPath(worktreeBasePath) {
|
|
32
|
+
const location = resolveWorkflowEventLedgerLocation(worktreeBasePath);
|
|
33
|
+
return location.worktreeLogPath ?? location.projectLogPath;
|
|
34
|
+
}
|
|
35
|
+
export function buildWorkflowEvent(event, sessionId) {
|
|
36
|
+
const hash = createHash("sha256")
|
|
37
|
+
.update(JSON.stringify({ cmd: event.cmd, params: event.params }))
|
|
38
|
+
.digest("hex")
|
|
39
|
+
.slice(0, 16);
|
|
40
|
+
return {
|
|
41
|
+
v: 2,
|
|
42
|
+
...event,
|
|
43
|
+
hash,
|
|
44
|
+
session_id: sessionId,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function appendWorkflowEvent(basePath, event, sessionId) {
|
|
48
|
+
const fullEvent = buildWorkflowEvent(event, sessionId);
|
|
49
|
+
const location = resolveWorkflowEventLedgerLocation(basePath);
|
|
50
|
+
mkdirSync(location.projectGsd, { recursive: true });
|
|
51
|
+
appendFileSync(location.projectLogPath, `${JSON.stringify(fullEvent)}\n`, "utf-8");
|
|
52
|
+
emitWorkflowEventAudit(location.projectRoot, fullEvent);
|
|
53
|
+
return fullEvent;
|
|
54
|
+
}
|
|
55
|
+
export function writeWorkflowEventLog(basePath, events) {
|
|
56
|
+
const location = resolveWorkflowEventLedgerLocation(basePath);
|
|
57
|
+
mkdirSync(location.projectGsd, { recursive: true });
|
|
58
|
+
const content = events.map((event) => JSON.stringify(event)).join("\n") + (events.length > 0 ? "\n" : "");
|
|
59
|
+
atomicWriteSync(location.projectLogPath, content);
|
|
60
|
+
}
|
|
61
|
+
export function writeWorktreeEventLog(worktreeBasePath, events) {
|
|
62
|
+
const location = resolveWorkflowEventLedgerLocation(worktreeBasePath);
|
|
63
|
+
const logPath = location.worktreeLogPath ?? location.projectLogPath;
|
|
64
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
65
|
+
const content = events.map((event) => JSON.stringify(event)).join("\n") + (events.length > 0 ? "\n" : "");
|
|
66
|
+
atomicWriteSync(logPath, content);
|
|
67
|
+
}
|
|
68
|
+
function emitWorkflowEventAudit(basePath, event) {
|
|
69
|
+
if (!isUnifiedAuditEnabled())
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
const normalized = normalizeWorkflowEventCommand(event.cmd) ?? "unknown";
|
|
73
|
+
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
74
|
+
traceId: event.session_id,
|
|
75
|
+
category: "orchestration",
|
|
76
|
+
type: `workflow-event-${normalized}`,
|
|
77
|
+
payload: {
|
|
78
|
+
cmd: event.cmd,
|
|
79
|
+
params: event.params,
|
|
80
|
+
actor: event.actor,
|
|
81
|
+
actorName: event.actor_name,
|
|
82
|
+
triggerReason: event.trigger_reason,
|
|
83
|
+
eventTs: event.ts,
|
|
84
|
+
hash: event.hash,
|
|
85
|
+
},
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Best-effort: audit projection must never block the workflow event ledger.
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function normalizeWorkflowEventCommand(cmd) {
|
|
2
|
+
return typeof cmd === "string" ? cmd.replace(/-/g, "_") : null;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Workflow progress events are keyed by the domain entity they mutate.
|
|
6
|
+
* Keep command aliases and conflict identity in this module so replay,
|
|
7
|
+
* conflict detection, and tests do not each grow their own vocabulary.
|
|
8
|
+
*/
|
|
9
|
+
export function workflowEventEntityKey(event) {
|
|
10
|
+
const p = event.params;
|
|
11
|
+
const cmd = normalizeWorkflowEventCommand(event.cmd);
|
|
12
|
+
if (!cmd)
|
|
13
|
+
return null;
|
|
14
|
+
switch (cmd) {
|
|
15
|
+
case "complete_task":
|
|
16
|
+
case "start_task":
|
|
17
|
+
case "skip_task":
|
|
18
|
+
case "report_blocker":
|
|
19
|
+
case "record_verification":
|
|
20
|
+
case "plan_task":
|
|
21
|
+
return typeof p["taskId"] === "string"
|
|
22
|
+
? { type: "task", id: p["taskId"] }
|
|
23
|
+
: null;
|
|
24
|
+
case "complete_slice":
|
|
25
|
+
case "replan_slice":
|
|
26
|
+
return typeof p["sliceId"] === "string"
|
|
27
|
+
? { type: "slice", id: p["sliceId"] }
|
|
28
|
+
: null;
|
|
29
|
+
case "plan_slice":
|
|
30
|
+
return typeof p["sliceId"] === "string"
|
|
31
|
+
? { type: "slice_plan", id: p["sliceId"] }
|
|
32
|
+
: null;
|
|
33
|
+
case "complete_milestone":
|
|
34
|
+
case "plan_milestone":
|
|
35
|
+
return typeof p["milestoneId"] === "string"
|
|
36
|
+
? { type: "milestone", id: p["milestoneId"] }
|
|
37
|
+
: null;
|
|
38
|
+
case "save_decision":
|
|
39
|
+
if (typeof p["scope"] === "string" && typeof p["decision"] === "string") {
|
|
40
|
+
return { type: "decision", id: `${p["scope"]}:${p["decision"]}` };
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
default:
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { join } from "node:path";
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
4
3
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
5
4
|
import { withFileLockSync } from "./file-lock.js";
|
|
5
|
+
import { appendWorkflowEvent, workflowEventArchivePath, workflowEventLogPath, } from "./workflow-event-ledger.js";
|
|
6
6
|
import { logWarning } from "./workflow-logger.js";
|
|
7
7
|
// ─── Session ID ───────────────────────────────────────────────────────────
|
|
8
8
|
/**
|
|
@@ -20,19 +20,7 @@ export function getSessionId() {
|
|
|
20
20
|
* Creates .gsd directory if needed.
|
|
21
21
|
*/
|
|
22
22
|
export function appendEvent(basePath, event) {
|
|
23
|
-
|
|
24
|
-
.update(JSON.stringify({ cmd: event.cmd, params: event.params }))
|
|
25
|
-
.digest("hex")
|
|
26
|
-
.slice(0, 16);
|
|
27
|
-
const fullEvent = {
|
|
28
|
-
v: 2,
|
|
29
|
-
...event,
|
|
30
|
-
hash,
|
|
31
|
-
session_id: ENGINE_SESSION_ID,
|
|
32
|
-
};
|
|
33
|
-
const dir = join(basePath, ".gsd");
|
|
34
|
-
mkdirSync(dir, { recursive: true });
|
|
35
|
-
appendFileSync(join(dir, "event-log.jsonl"), JSON.stringify(fullEvent) + "\n", "utf-8");
|
|
23
|
+
appendWorkflowEvent(basePath, event, ENGINE_SESSION_ID);
|
|
36
24
|
}
|
|
37
25
|
// ─── readEvents ──────────────────────────────────────────────────────────
|
|
38
26
|
/**
|
|
@@ -87,8 +75,8 @@ export function findForkPoint(logA, logB) {
|
|
|
87
75
|
* @returns { archived: number } — count of events moved to archive
|
|
88
76
|
*/
|
|
89
77
|
export function compactMilestoneEvents(basePath, milestoneId) {
|
|
90
|
-
const logPath =
|
|
91
|
-
const archivePath =
|
|
78
|
+
const logPath = workflowEventLogPath(basePath);
|
|
79
|
+
const archivePath = workflowEventArchivePath(basePath, milestoneId);
|
|
92
80
|
return withFileLockSync(logPath, () => {
|
|
93
81
|
const allEvents = readEvents(logPath);
|
|
94
82
|
// Single-pass partition to halve the work (per reviewer agent)
|
|
@@ -2,6 +2,8 @@ import { join } from "node:path";
|
|
|
2
2
|
import { mkdirSync, existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
3
3
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
4
4
|
import { readEvents, findForkPoint, getSessionId } from "./workflow-events.js";
|
|
5
|
+
import { normalizeWorkflowEventCommand, workflowEventEntityKey, } from "./workflow-event-vocabulary.js";
|
|
6
|
+
import { readWorktreeEventLogPath, workflowEventLogPath, writeWorkflowEventLog, writeWorktreeEventLog, } from "./workflow-event-ledger.js";
|
|
5
7
|
import { transaction, updateTaskStatus, updateSliceStatus, updateMilestoneStatus, getSliceTasks, insertMilestone, getMilestoneSlices, insertVerificationEvidence, upsertDecision, setTaskBlockerDiscovered, insertOrIgnoreSlice, insertOrIgnoreTask, } from "./gsd-db.js";
|
|
6
8
|
import { openWorkflowDatabasePath } from "./db-workspace.js";
|
|
7
9
|
import { isClosedStatus } from "./status-guards.js";
|
|
@@ -48,14 +50,11 @@ function replayEvents(events) {
|
|
|
48
50
|
transaction(() => {
|
|
49
51
|
for (const event of events) {
|
|
50
52
|
const p = event.params;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
// Type guard: malformed event lines with non-string cmd are skipped.
|
|
54
|
-
if (typeof event.cmd !== "string") {
|
|
53
|
+
const cmd = normalizeWorkflowEventCommand(event.cmd);
|
|
54
|
+
if (!cmd) {
|
|
55
55
|
logWarning("reconcile", `Event with non-string cmd skipped: ${JSON.stringify(event.cmd)}`);
|
|
56
56
|
continue;
|
|
57
57
|
}
|
|
58
|
-
const cmd = event.cmd.replace(/-/g, "_");
|
|
59
58
|
switch (cmd) {
|
|
60
59
|
case "complete_task": {
|
|
61
60
|
const milestoneId = p["milestoneId"];
|
|
@@ -199,43 +198,7 @@ function replayEvents(events) {
|
|
|
199
198
|
* (e.g. unknown or future cmds).
|
|
200
199
|
*/
|
|
201
200
|
export function extractEntityKey(event) {
|
|
202
|
-
|
|
203
|
-
// Normalize cmd format: accept both hyphens and underscores
|
|
204
|
-
if (typeof event.cmd !== "string")
|
|
205
|
-
return null;
|
|
206
|
-
const cmd = event.cmd.replace(/-/g, "_");
|
|
207
|
-
switch (cmd) {
|
|
208
|
-
case "complete_task":
|
|
209
|
-
case "start_task":
|
|
210
|
-
case "skip_task":
|
|
211
|
-
case "report_blocker":
|
|
212
|
-
case "record_verification":
|
|
213
|
-
case "plan_task":
|
|
214
|
-
return typeof p["taskId"] === "string"
|
|
215
|
-
? { type: "task", id: p["taskId"] }
|
|
216
|
-
: null;
|
|
217
|
-
case "complete_slice":
|
|
218
|
-
case "replan_slice":
|
|
219
|
-
return typeof p["sliceId"] === "string"
|
|
220
|
-
? { type: "slice", id: p["sliceId"] }
|
|
221
|
-
: null;
|
|
222
|
-
case "plan_slice":
|
|
223
|
-
return typeof p["sliceId"] === "string"
|
|
224
|
-
? { type: "slice_plan", id: p["sliceId"] }
|
|
225
|
-
: null;
|
|
226
|
-
case "complete_milestone":
|
|
227
|
-
case "plan_milestone":
|
|
228
|
-
return typeof p["milestoneId"] === "string"
|
|
229
|
-
? { type: "milestone", id: p["milestoneId"] }
|
|
230
|
-
: null;
|
|
231
|
-
case "save_decision":
|
|
232
|
-
if (typeof p["scope"] === "string" && typeof p["decision"] === "string") {
|
|
233
|
-
return { type: "decision", id: `${p["scope"]}:${p["decision"]}` };
|
|
234
|
-
}
|
|
235
|
-
return null;
|
|
236
|
-
default:
|
|
237
|
-
return null;
|
|
238
|
-
}
|
|
201
|
+
return workflowEventEntityKey(event);
|
|
239
202
|
}
|
|
240
203
|
// ─── detectConflicts ──────────────────────────────────────────────────────────
|
|
241
204
|
/**
|
|
@@ -302,12 +265,6 @@ function rewriteDivergedEventsForEntity(divergedEvents, entityType, entityId, re
|
|
|
302
265
|
}
|
|
303
266
|
return rewritten;
|
|
304
267
|
}
|
|
305
|
-
function writeEventLog(basePath, events) {
|
|
306
|
-
const dir = join(basePath, ".gsd");
|
|
307
|
-
mkdirSync(dir, { recursive: true });
|
|
308
|
-
const content = events.map((e) => JSON.stringify(e)).join("\n") + (events.length > 0 ? "\n" : "");
|
|
309
|
-
atomicWriteSync(join(dir, "event-log.jsonl"), content);
|
|
310
|
-
}
|
|
311
268
|
// ─── writeConflictsFile ───────────────────────────────────────────────────────
|
|
312
269
|
/**
|
|
313
270
|
* Write a human-readable CONFLICTS.md to basePath/.gsd/CONFLICTS.md.
|
|
@@ -375,10 +332,15 @@ export function reconcileWorktreeLogs(mainBasePath, worktreeBasePath) {
|
|
|
375
332
|
}
|
|
376
333
|
function _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath) {
|
|
377
334
|
// Step 1: Read both logs
|
|
378
|
-
const mainLogPath =
|
|
379
|
-
const wtLogPath =
|
|
335
|
+
const mainLogPath = workflowEventLogPath(mainBasePath);
|
|
336
|
+
const wtLogPath = readWorktreeEventLogPath(worktreeBasePath);
|
|
380
337
|
const mainEvents = readEvents(mainLogPath);
|
|
381
338
|
const wtEvents = readEvents(wtLogPath);
|
|
339
|
+
// Canonical worktree appends are already durable in the project ledger.
|
|
340
|
+
// Empty/missing worktree shards are legacy-only absence, not divergence.
|
|
341
|
+
if (wtEvents.length === 0) {
|
|
342
|
+
return { autoMerged: 0, conflicts: [] };
|
|
343
|
+
}
|
|
382
344
|
// Step 2: Find fork point
|
|
383
345
|
const forkPoint = findForkPoint(mainEvents, wtEvents);
|
|
384
346
|
// Step 3: Slice diverged sets
|
|
@@ -412,9 +374,7 @@ function _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath) {
|
|
|
412
374
|
}
|
|
413
375
|
const baseEvents = mainEvents.slice(0, forkPoint + 1);
|
|
414
376
|
const mergedLog = baseEvents.concat(merged);
|
|
415
|
-
|
|
416
|
-
mkdirSync(join(mainBasePath, ".gsd"), { recursive: true });
|
|
417
|
-
atomicWriteSync(join(mainBasePath, ".gsd", "event-log.jsonl"), logContent);
|
|
377
|
+
writeWorkflowEventLog(mainBasePath, mergedLog);
|
|
418
378
|
// Step 8: Replay into DB (wrapped in a transaction by replayEvents)
|
|
419
379
|
openWorkflowDatabasePath(resolveGsdPathContract(mainBasePath).projectDb);
|
|
420
380
|
replayEvents(merged);
|
|
@@ -533,8 +493,8 @@ pick) {
|
|
|
533
493
|
throw new Error(`No conflict found for entity ${entityKey}`);
|
|
534
494
|
const conflict = conflicts[idx];
|
|
535
495
|
const eventsToReplay = pick === "main" ? conflict.mainSideEvents : conflict.worktreeSideEvents;
|
|
536
|
-
const mainLogPath =
|
|
537
|
-
const wtLogPath =
|
|
496
|
+
const mainLogPath = workflowEventLogPath(basePath);
|
|
497
|
+
const wtLogPath = readWorktreeEventLogPath(worktreeBasePath);
|
|
538
498
|
const mainEvents = readEvents(mainLogPath);
|
|
539
499
|
const wtEvents = readEvents(wtLogPath);
|
|
540
500
|
const forkPoint = findForkPoint(mainEvents, wtEvents);
|
|
@@ -547,7 +507,12 @@ pick) {
|
|
|
547
507
|
: rewriteDivergedEventsForEntity(mainDiverged, entityType, entityId, eventsToReplay);
|
|
548
508
|
const targetBasePath = pick === "main" ? worktreeBasePath : basePath;
|
|
549
509
|
const targetBaseEvents = pick === "main" ? wtBaseEvents : mainBaseEvents;
|
|
550
|
-
|
|
510
|
+
if (pick === "main") {
|
|
511
|
+
writeWorktreeEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
writeWorkflowEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
|
|
515
|
+
}
|
|
551
516
|
// Replay resolved events through the DB (updates DB state)
|
|
552
517
|
openWorkflowDatabasePath(resolveGsdPathContract(basePath).projectDb);
|
|
553
518
|
replayEvents(eventsToReplay);
|
|
@@ -32,6 +32,7 @@ import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain, } fr
|
|
|
32
32
|
// callers — production wiring previously injected them via deps; the seam
|
|
33
33
|
// added type churn without enabling test variation.
|
|
34
34
|
import { loadEffectiveGSDPreferences, getIsolationMode } from "./preferences.js";
|
|
35
|
+
import { isolationDegradedFallbackGuidance, worktreeCreationFailedGuidance } from "./guidance.js";
|
|
35
36
|
import { invalidateAllCaches } from "./cache.js";
|
|
36
37
|
import { resolveMilestoneFile } from "./paths.js";
|
|
37
38
|
import { getMilestone, insertMilestone, isDbAvailable, updateMilestoneStatus } from "./gsd-db.js";
|
|
@@ -343,7 +344,7 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
|
|
|
343
344
|
s.basePath = basePath;
|
|
344
345
|
rebuildGitService(s, deps);
|
|
345
346
|
invalidateAllCaches();
|
|
346
|
-
ctx.notify(
|
|
347
|
+
ctx.notify(isolationDegradedFallbackGuidance(milestoneId), "warning");
|
|
347
348
|
return { ok: true, mode: "branch", path: basePath };
|
|
348
349
|
}
|
|
349
350
|
catch (err) {
|
|
@@ -517,7 +518,7 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
|
|
|
517
518
|
eventType: "worktree-create-failed",
|
|
518
519
|
data: { milestoneId, error: msg, fallback: "project-root" },
|
|
519
520
|
});
|
|
520
|
-
ctx.notify(
|
|
521
|
+
ctx.notify(worktreeCreationFailedGuidance(milestoneId, msg), "warning");
|
|
521
522
|
// Degrade isolation for the rest of this session so mergeAndExit
|
|
522
523
|
// doesn't try to merge a nonexistent worktree branch (#2483)
|
|
523
524
|
s.isolationDegraded = true;
|
|
@@ -528,7 +528,13 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
528
528
|
// inside .gsd/worktrees/ — a symlink inside the directory could point out.
|
|
529
529
|
const resolvedPathSafe = isInsideWorktreesDir(basePath, resolvedWtPath);
|
|
530
530
|
// If we're inside the worktree, move out first — git can't remove an in-use directory
|
|
531
|
-
|
|
531
|
+
let cwd;
|
|
532
|
+
try {
|
|
533
|
+
cwd = process.cwd();
|
|
534
|
+
}
|
|
535
|
+
catch {
|
|
536
|
+
cwd = basePath;
|
|
537
|
+
}
|
|
532
538
|
const resolvedCwd = existsSync(cwd) ? realpathSync(cwd) : cwd;
|
|
533
539
|
if (resolvedCwd === resolvedWtPath || resolvedCwd.startsWith(resolvedWtPath + sep)) {
|
|
534
540
|
process.chdir(basePath);
|
|
@@ -195,7 +195,14 @@ export function resolveGitHeadPath(dir) {
|
|
|
195
195
|
*/
|
|
196
196
|
export function nudgeGitBranchCache(previousCwd) {
|
|
197
197
|
const now = new Date();
|
|
198
|
-
|
|
198
|
+
let currentCwd = null;
|
|
199
|
+
try {
|
|
200
|
+
currentCwd = process.cwd();
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
currentCwd = null;
|
|
204
|
+
}
|
|
205
|
+
for (const dir of [previousCwd, currentCwd].filter((dir) => Boolean(dir))) {
|
|
199
206
|
try {
|
|
200
207
|
const headPath = resolveGitHeadPath(dir);
|
|
201
208
|
if (headPath)
|
|
@@ -38,6 +38,22 @@ function compareSemverLocal(a, b) {
|
|
|
38
38
|
function parseGsdBrowserVersion(output) {
|
|
39
39
|
return output.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
|
|
40
40
|
}
|
|
41
|
+
function splitCommandLine(commandLine) {
|
|
42
|
+
const parts = commandLine.match(/(?:"[^"]*"|'[^']*'|[^\s"']+)/g) ?? [];
|
|
43
|
+
return parts.map((part) => {
|
|
44
|
+
const quote = part[0];
|
|
45
|
+
if ((quote === '"' || quote === "'") && part.endsWith(quote)) {
|
|
46
|
+
return part.slice(1, -1);
|
|
47
|
+
}
|
|
48
|
+
return part;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function buildPathGsdBrowserVersionInvocation(platform) {
|
|
52
|
+
if (platform === "win32") {
|
|
53
|
+
return { command: "cmd", args: ["/d", "/s", "/c", "gsd-browser", "--version"] };
|
|
54
|
+
}
|
|
55
|
+
return { command: "gsd-browser", args: ["--version"] };
|
|
56
|
+
}
|
|
41
57
|
function isRecord(value) {
|
|
42
58
|
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
43
59
|
}
|
|
@@ -67,7 +83,8 @@ function resolvePathGsdBrowserVersion(env) {
|
|
|
67
83
|
if (cachedPathProbeVersion !== undefined)
|
|
68
84
|
return cachedPathProbeVersion;
|
|
69
85
|
try {
|
|
70
|
-
|
|
86
|
+
const invocation = buildPathGsdBrowserVersionInvocation(process.platform);
|
|
87
|
+
cachedPathProbeVersion = parseGsdBrowserVersion(execFileSync(invocation.command, invocation.args, {
|
|
71
88
|
encoding: "utf-8",
|
|
72
89
|
env,
|
|
73
90
|
stdio: ["ignore", "pipe", "ignore"],
|
|
@@ -176,7 +193,8 @@ export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env,
|
|
|
176
193
|
const serverName = env.GSD_BROWSER_MCP_NAME?.trim() || GSD_BROWSER_MCP_SERVER_NAME;
|
|
177
194
|
const explicitArgs = parseJsonEnv(env, "GSD_BROWSER_MCP_ARGS");
|
|
178
195
|
const explicitEnv = parseJsonEnv(env, "GSD_BROWSER_MCP_ENV");
|
|
179
|
-
const
|
|
196
|
+
const explicitCommandLine = env.GSD_BROWSER_MCP_COMMAND?.trim();
|
|
197
|
+
const [explicitCommand, ...explicitCommandArgs] = explicitCommandLine ? splitCommandLine(explicitCommandLine) : [];
|
|
180
198
|
const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
|
|
181
199
|
const preferPathCli = !explicitCommand && !explicitCliPath && shouldPreferPathGsdBrowser(env);
|
|
182
200
|
const bundledCliPath = !explicitCommand && !explicitCliPath && !preferPathCli
|
|
@@ -187,6 +205,9 @@ export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env,
|
|
|
187
205
|
// profile/cookies persist across pi sessions for the same project. gsd-browser
|
|
188
206
|
// rejects --identity-scope unless --identity-key is also supplied.
|
|
189
207
|
const identityKey = env.GSD_BROWSER_IDENTITY_KEY?.trim() || buildGsdBrowserSessionName(resolvedProjectRoot);
|
|
208
|
+
// identity-project must be a safe identifier (no path separators); full paths
|
|
209
|
+
// cause daemon startup to fail with "invalid name".
|
|
210
|
+
const identityProject = env.GSD_BROWSER_IDENTITY_PROJECT?.trim() || buildGsdBrowserSessionName(resolvedProjectRoot);
|
|
190
211
|
const command = explicitCommand
|
|
191
212
|
|| explicitCliPath
|
|
192
213
|
|| (preferPathCli ? "gsd-browser" : undefined)
|
|
@@ -195,6 +216,7 @@ export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env,
|
|
|
195
216
|
const args = Array.isArray(explicitArgs) && explicitArgs.length > 0
|
|
196
217
|
? explicitArgs.map(String)
|
|
197
218
|
: [
|
|
219
|
+
...explicitCommandArgs,
|
|
198
220
|
...(bundledCliPath ? [bundledCliPath] : []),
|
|
199
221
|
"mcp",
|
|
200
222
|
"--session",
|
|
@@ -204,7 +226,7 @@ export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env,
|
|
|
204
226
|
"--identity-key",
|
|
205
227
|
identityKey,
|
|
206
228
|
"--identity-project",
|
|
207
|
-
|
|
229
|
+
identityProject,
|
|
208
230
|
];
|
|
209
231
|
const cwd = env.GSD_BROWSER_MCP_CWD?.trim() || resolvedProjectRoot;
|
|
210
232
|
return {
|
|
@@ -217,3 +239,23 @@ export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env,
|
|
|
217
239
|
sessionName,
|
|
218
240
|
};
|
|
219
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* CLI invocation that starts the gsd-browser session daemon with the same
|
|
244
|
+
* session and identity flags as {@link resolveGsdBrowserMcpLaunchConfig}, so
|
|
245
|
+
* browser UAT can warm Chrome/CDP before the first MCP navigation.
|
|
246
|
+
*/
|
|
247
|
+
export function resolveGsdBrowserDaemonStartInvocation(projectRoot, env = process.env, options = {}) {
|
|
248
|
+
const launch = resolveGsdBrowserMcpLaunchConfig(projectRoot, env, options);
|
|
249
|
+
const mcpIndex = launch.args.indexOf("mcp");
|
|
250
|
+
if (mcpIndex < 0) {
|
|
251
|
+
throw new Error("gsd-browser launch config is missing mcp subcommand");
|
|
252
|
+
}
|
|
253
|
+
const prefix = launch.args.slice(0, mcpIndex);
|
|
254
|
+
const sessionFlags = launch.args.slice(mcpIndex + 1);
|
|
255
|
+
return {
|
|
256
|
+
command: launch.command,
|
|
257
|
+
args: [...prefix, "daemon", "start", ...sessionFlags],
|
|
258
|
+
cwd: launch.cwd,
|
|
259
|
+
...(launch.env ? { env: launch.env } : {}),
|
|
260
|
+
};
|
|
261
|
+
}
|