@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.d6c5343c
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/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- 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/bg-shell/utilities.js +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
- 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 +94 -48
- package/dist/resources/extensions/gsd/auto/phases.js +8 -3
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
- package/dist/resources/extensions/gsd/auto-model-selection.js +25 -6
- package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +24 -26
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +9 -28
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
- package/dist/resources/extensions/gsd/auto.js +8 -20
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/consent-question.js +337 -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 +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +398 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -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/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-db.js +171 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +51 -5
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +13 -23
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +14 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.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/run-uat.md +6 -4
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +6 -20
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +96 -5
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- 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/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +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/api/visualizer/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 +8 -8
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- 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/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +1 -1
- 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/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.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 +8 -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 +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +46 -21
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- 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/models.generated.d.ts +192 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +166 -0
- package/packages/pi-ai/dist/models.generated.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/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.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/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- 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/bg-shell/utilities.ts +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +29 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
- 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-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +109 -51
- package/src/resources/extensions/gsd/auto/phases.ts +12 -3
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
- package/src/resources/extensions/gsd/auto-model-selection.ts +25 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +24 -29
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +8 -26
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
- package/src/resources/extensions/gsd/auto.ts +20 -24
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/consent-question.ts +416 -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 +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +490 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -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/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-db.ts +173 -2373
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +50 -5
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- package/src/resources/extensions/gsd/milestone-closeout.ts +13 -23
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences.ts +18 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.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/run-uat.md +6 -4
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +9 -21
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +101 -26
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +336 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- 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/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- 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/evidence-xref-gsd-exec.test.ts +157 -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/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- 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/migration-auto-check.test.ts +85 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- 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 +139 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +119 -5
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- 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/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → jmTLg6xZmAuq_LIqKOxrH}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → jmTLg6xZmAuq_LIqKOxrH}/_ssgManifest.js +0 -0
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Central UAT mode policy for dispatch, tool presentation, and result validation.
|
|
3
|
-
import {
|
|
3
|
+
import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
|
|
4
|
+
import { extractUatType, UAT_TYPE_KEYWORDS } from "./files.js";
|
|
4
5
|
import { hasBrowserRequiredText } from "./browser-evidence.js";
|
|
5
6
|
import { parseMcpToolName } from "./mcp-tool-name.js";
|
|
6
|
-
export const UAT_TYPES =
|
|
7
|
-
"artifact-driven",
|
|
8
|
-
"browser-executable",
|
|
9
|
-
"runtime-executable",
|
|
10
|
-
"live-runtime",
|
|
11
|
-
"mixed",
|
|
12
|
-
"human-experience",
|
|
13
|
-
];
|
|
7
|
+
export const UAT_TYPES = UAT_TYPE_KEYWORDS;
|
|
14
8
|
export const UAT_MODE_POLICIES = {
|
|
15
9
|
"artifact-driven": {
|
|
16
10
|
browserTools: false,
|
|
@@ -55,23 +49,55 @@ export function isUatType(value) {
|
|
|
55
49
|
export function getDeclaredUatType(content) {
|
|
56
50
|
return extractUatType(content) ?? "artifact-driven";
|
|
57
51
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
/** Self-contained browser UAT harnesses that manage server lifecycle internally. */
|
|
53
|
+
const SELF_CONTAINED_RUNTIME_UAT_COMMAND_RE = /\b(?:npm run test:uat|node\s+(?:--check\s+\S+\s+&&\s+)*tests\/browser\/search-uat\.mjs|npx playwright test(?:\s+\S+)?)\b/i;
|
|
54
|
+
export function hasSelfContainedRuntimeUatCommand(content) {
|
|
55
|
+
return SELF_CONTAINED_RUNTIME_UAT_COMMAND_RE.test(content);
|
|
56
|
+
}
|
|
57
|
+
function resolveEffectiveUatTypeFromPolicy(declaredType, browserRequired, content) {
|
|
58
|
+
let effectiveType = declaredType === "artifact-driven" && browserRequired
|
|
62
59
|
? "browser-executable"
|
|
63
60
|
: declaredType;
|
|
61
|
+
// M006/S01 regression: specs often declare browser-executable with localhost
|
|
62
|
+
// preconditions while the Evidence section names a runtime harness such as
|
|
63
|
+
// `npm run test:uat`. Interactive browser_* checks then race a fixed port
|
|
64
|
+
// against the script's own ephemeral server — run the harness instead.
|
|
65
|
+
if (effectiveType === "browser-executable" &&
|
|
66
|
+
hasSelfContainedRuntimeUatCommand(content)) {
|
|
67
|
+
effectiveType = "runtime-executable";
|
|
68
|
+
}
|
|
69
|
+
return effectiveType;
|
|
70
|
+
}
|
|
71
|
+
export function classifyUatContent(content) {
|
|
72
|
+
return classifyUatContentForRun(content);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Classify UAT mode for run-uat dispatch. Supplemental context (slice summary,
|
|
76
|
+
* verification excerpts) can name a self-contained harness even when the UAT
|
|
77
|
+
* file only documents a separate server command such as `npm run test:server`.
|
|
78
|
+
*/
|
|
79
|
+
export function classifyUatContentForRun(content, supplementalContext = "") {
|
|
80
|
+
const parsedType = extractUatType(content);
|
|
81
|
+
const declaredType = parsedType ?? "artifact-driven";
|
|
82
|
+
const browserRequired = hasBrowserRequiredText(content);
|
|
83
|
+
const combinedForHarness = supplementalContext.trim()
|
|
84
|
+
? `${content}\n\n${supplementalContext}`
|
|
85
|
+
: content;
|
|
86
|
+
const effectiveType = resolveEffectiveUatTypeFromPolicy(declaredType, browserRequired, combinedForHarness);
|
|
64
87
|
return {
|
|
65
88
|
declaredType,
|
|
89
|
+
modeDeclared: parsedType !== undefined,
|
|
66
90
|
effectiveType,
|
|
67
91
|
browserRequired,
|
|
68
92
|
shouldDispatchByDefault: effectiveType !== "artifact-driven" || browserRequired,
|
|
69
93
|
};
|
|
70
94
|
}
|
|
71
|
-
export function
|
|
72
|
-
const policy = classifyUatContent(content);
|
|
95
|
+
export function escalatesArtifactUatToBrowser(policy) {
|
|
73
96
|
return policy.declaredType === "artifact-driven" && policy.browserRequired;
|
|
74
97
|
}
|
|
98
|
+
export function shouldEscalateArtifactUatToBrowser(content) {
|
|
99
|
+
return escalatesArtifactUatToBrowser(classifyUatContent(content));
|
|
100
|
+
}
|
|
75
101
|
export function resolveEffectiveUatType(content) {
|
|
76
102
|
return classifyUatContent(content).effectiveType;
|
|
77
103
|
}
|
|
@@ -84,7 +110,7 @@ export function uatTypeIncludesBrowser(uatType) {
|
|
|
84
110
|
export function isUatBrowserToolName(toolName) {
|
|
85
111
|
const parsed = parseMcpToolName(toolName);
|
|
86
112
|
const canonicalName = parsed?.toolName ?? toolName;
|
|
87
|
-
if (canonicalName
|
|
113
|
+
if (hasBrowserContractPrefix(canonicalName))
|
|
88
114
|
return true;
|
|
89
115
|
return parsed?.toolName === "*" && parsed.serverName.toLowerCase().includes("browser");
|
|
90
116
|
}
|
|
@@ -11,7 +11,7 @@ import { deriveState } from "./state.js";
|
|
|
11
11
|
import { invalidateAllCaches } from "./cache.js";
|
|
12
12
|
import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
|
|
13
13
|
import { sendDesktopNotification } from "./notifications.js";
|
|
14
|
-
import { getTask, getSlice, getSliceTasks, updateTaskStatus,
|
|
14
|
+
import { getTask, getSlice, getSliceTasks, updateTaskStatus, resetSliceCascade } from "./gsd-db.js";
|
|
15
15
|
import { renderPlanCheckboxes, renderRoadmapCheckboxes } from "./markdown-renderer.js";
|
|
16
16
|
/**
|
|
17
17
|
* Undo the last completed unit: revert git commits,
|
|
@@ -275,20 +275,21 @@ export async function handleResetSlice(args, ctx, _pi, basePath) {
|
|
|
275
275
|
`Run /gsd reset-slice ${rawId} --force to confirm.`, "warning");
|
|
276
276
|
return;
|
|
277
277
|
}
|
|
278
|
-
// Reset all
|
|
279
|
-
|
|
278
|
+
// Reset all task statuses to "pending" and the slice to "active" in one
|
|
279
|
+
// atomic commit (DB is source of truth). Previously a per-task updateTaskStatus
|
|
280
|
+
// loop + a separate updateSliceStatus, which could leave a partial reset if
|
|
281
|
+
// interrupted mid-loop.
|
|
282
|
+
resetSliceCascade(mid, sid);
|
|
283
|
+
// Delete task summary files — projection cleanup, separate from the DB reset.
|
|
284
|
+
const tasksReset = tasks.length;
|
|
280
285
|
let summariesDeleted = 0;
|
|
281
286
|
for (const t of tasks) {
|
|
282
|
-
updateTaskStatus(mid, sid, t.id, "pending");
|
|
283
|
-
tasksReset++;
|
|
284
287
|
const summaryPath = resolveTaskFile(basePath, mid, sid, t.id, "SUMMARY");
|
|
285
288
|
if (summaryPath && existsSync(summaryPath)) {
|
|
286
289
|
unlinkSync(summaryPath);
|
|
287
290
|
summariesDeleted++;
|
|
288
291
|
}
|
|
289
292
|
}
|
|
290
|
-
// Reset slice status
|
|
291
|
-
updateSliceStatus(mid, sid, "active");
|
|
292
293
|
// Delete slice summary and UAT files
|
|
293
294
|
let sliceFilesDeleted = 0;
|
|
294
295
|
const slicePath = resolveSlicePath(basePath, mid, sid);
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Unit Closeout module — durable completion pipeline behind one seam (ADR-032).
|
|
3
|
+
//
|
|
4
|
+
// `closeUnit` owns what makes a Unit's completion durable. This pass ships the
|
|
5
|
+
// **Interactive Closeout adapter** path: commit the work and compute the
|
|
6
|
+
// Closeout Git Verdict, failing closed (loudly) instead of silently when a
|
|
7
|
+
// non-`none` `git.isolation` preference was never honoured by the session.
|
|
8
|
+
// Motivating failure (2026-06-10): an interactive session under
|
|
9
|
+
// `git.isolation: worktree` completed a milestone with every source file
|
|
10
|
+
// untracked on the integration branch — no commit, no merge, no warning.
|
|
11
|
+
//
|
|
12
|
+
// The interactive adapter only fires on milestone boundaries — the durability
|
|
13
|
+
// gap is the milestone close, and committing at every task/slice would sweep a
|
|
14
|
+
// developer's unrelated working-tree changes. `closeUnit` itself stays general
|
|
15
|
+
// over all boundaries for the pending Auto Closeout adapter re-seat.
|
|
16
|
+
//
|
|
17
|
+
// The auto loop keeps its existing closeout pipeline for now (the Auto
|
|
18
|
+
// Closeout adapter re-seat is the documented next step in ADR-032); the
|
|
19
|
+
// interactive trigger in bootstrap/register-hooks.ts is a no-op while
|
|
20
|
+
// `isAutoActive()`, so auto-mode behaviour is untouched.
|
|
21
|
+
//
|
|
22
|
+
// Re-entrancy is naturally safe: a re-fired completion commits an already-clean
|
|
23
|
+
// tree, which yields `nothing-to-commit`, and `appendNotification` carries its
|
|
24
|
+
// own dedup window — so `closeUnit` keeps no result cache of its own.
|
|
25
|
+
import { appendNotification } from "./notification-store.js";
|
|
26
|
+
import { readStringField } from "./auto-unit-tool-scope.js";
|
|
27
|
+
import { MILESTONE_BRANCH_PREFIX } from "./branch-patterns.js";
|
|
28
|
+
import { nativeGetCurrentBranch } from "./native-git-bridge.js";
|
|
29
|
+
import { getIsolationMode } from "./preferences.js";
|
|
30
|
+
import { autoCommitCurrentBranch } from "./worktree.js";
|
|
31
|
+
import { logWarning } from "./workflow-logger.js";
|
|
32
|
+
const defaultDeps = {
|
|
33
|
+
isolationMode: (basePath) => getIsolationMode(basePath),
|
|
34
|
+
currentBranch: (basePath) => {
|
|
35
|
+
try {
|
|
36
|
+
return nativeGetCurrentBranch(basePath);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
commit: (basePath, unitType, unitId) => autoCommitCurrentBranch(basePath, unitType, unitId),
|
|
43
|
+
notify: (message, severity) => appendNotification(message, severity),
|
|
44
|
+
};
|
|
45
|
+
export function closeUnit(request, deps = defaultDeps) {
|
|
46
|
+
let commitMessage = null;
|
|
47
|
+
let gitVerdict;
|
|
48
|
+
let notice;
|
|
49
|
+
try {
|
|
50
|
+
commitMessage = deps.commit(request.basePath, request.unitType, request.unitId);
|
|
51
|
+
gitVerdict = commitMessage === null ? "nothing-to-commit" : "committed";
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
gitVerdict = "commit-failed";
|
|
55
|
+
notice = `Unit closeout commit failed for ${request.unitId}: ${err instanceof Error ? err.message : String(err)}`;
|
|
56
|
+
logWarning("engine", notice);
|
|
57
|
+
deps.notify(notice, "error");
|
|
58
|
+
}
|
|
59
|
+
if (request.boundary === "milestone" && gitVerdict !== "commit-failed") {
|
|
60
|
+
const isolation = deps.isolationMode(request.basePath);
|
|
61
|
+
if (isolation !== "none") {
|
|
62
|
+
const branch = deps.currentBranch(request.basePath);
|
|
63
|
+
if (branch?.startsWith(MILESTONE_BRANCH_PREFIX)) {
|
|
64
|
+
gitVerdict = "milestone-branch";
|
|
65
|
+
notice =
|
|
66
|
+
`Milestone ${request.unitId} completed on ${branch}. ` +
|
|
67
|
+
`Merge it to the integration branch with the worktree tooling (/gsd worktree merge).`;
|
|
68
|
+
deps.notify(notice, "info");
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
gitVerdict = "isolation-bypassed";
|
|
72
|
+
notice =
|
|
73
|
+
`Needs attention: milestone ${request.unitId} completed outside a milestone worktree/branch ` +
|
|
74
|
+
`while git.isolation is "${isolation}" — the isolation preference was not honoured this session. ` +
|
|
75
|
+
(commitMessage
|
|
76
|
+
? `Work was committed directly on "${branch ?? "the current branch"}".`
|
|
77
|
+
: `The working tree had nothing left to commit on "${branch ?? "the current branch"}".`);
|
|
78
|
+
logWarning("engine", notice);
|
|
79
|
+
deps.notify(notice, "warning");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { gitVerdict, commitMessage, notice };
|
|
84
|
+
}
|
|
85
|
+
// ─── Interactive Closeout adapter (tool-observation trigger) ─────────────
|
|
86
|
+
// Canonical closeout tool → boundary. Aliases are canonicalized by the hook.
|
|
87
|
+
// Only the milestone boundary is wired interactively: it is the durability gap
|
|
88
|
+
// that motivated ADR-032, and committing at every task/slice would sweep a
|
|
89
|
+
// developer's unrelated working-tree changes. `closeUnit` still handles every
|
|
90
|
+
// boundary for the pending Auto Closeout adapter re-seat.
|
|
91
|
+
const CLOSEOUT_TOOL_BOUNDARIES = {
|
|
92
|
+
gsd_complete_milestone: "milestone",
|
|
93
|
+
};
|
|
94
|
+
// Commit attribution uses the canonical unit types so interactive closeout
|
|
95
|
+
// commits carry the same GSD-Unit evidence trailers the verification prompts
|
|
96
|
+
// look for.
|
|
97
|
+
const BOUNDARY_UNIT_TYPES = {
|
|
98
|
+
task: "execute-task",
|
|
99
|
+
slice: "complete-slice",
|
|
100
|
+
milestone: "complete-milestone",
|
|
101
|
+
};
|
|
102
|
+
export function isUnitCloseoutTool(canonicalToolName) {
|
|
103
|
+
return canonicalToolName in CLOSEOUT_TOOL_BOUNDARIES;
|
|
104
|
+
}
|
|
105
|
+
function readId(input, camel, snake) {
|
|
106
|
+
const value = readStringField(input, camel, snake);
|
|
107
|
+
return value && value.length > 0 ? value : undefined;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Interactive Closeout adapter entry, called from the host's tool-observation
|
|
111
|
+
* hook for successful closeout tool calls when auto-mode is NOT active.
|
|
112
|
+
* Returns null when the tool input doesn't identify a unit.
|
|
113
|
+
*/
|
|
114
|
+
export function runInteractiveUnitCloseout(args, deps = defaultDeps) {
|
|
115
|
+
const boundary = CLOSEOUT_TOOL_BOUNDARIES[args.canonicalToolName];
|
|
116
|
+
if (!boundary)
|
|
117
|
+
return null;
|
|
118
|
+
const milestoneId = readId(args.input, "milestoneId", "milestone_id");
|
|
119
|
+
if (!milestoneId)
|
|
120
|
+
return null;
|
|
121
|
+
const sliceId = readId(args.input, "sliceId", "slice_id");
|
|
122
|
+
const taskId = readId(args.input, "taskId", "task_id");
|
|
123
|
+
let unitId = milestoneId;
|
|
124
|
+
if (boundary !== "milestone") {
|
|
125
|
+
if (!sliceId)
|
|
126
|
+
return null;
|
|
127
|
+
unitId = boundary === "slice" ? `${milestoneId}/${sliceId}` : `${milestoneId}/${sliceId}/${taskId ?? ""}`;
|
|
128
|
+
if (boundary === "task" && !taskId)
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
return closeUnit({
|
|
132
|
+
basePath: args.basePath,
|
|
133
|
+
unitType: BOUNDARY_UNIT_TYPES[boundary],
|
|
134
|
+
unitId,
|
|
135
|
+
boundary,
|
|
136
|
+
outcome: "complete",
|
|
137
|
+
}, deps);
|
|
138
|
+
}
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
// owned by the unit, not in the composer. Reviews must enforce this — it
|
|
37
37
|
// is the difference between an orchestrator and a runaway DSL.
|
|
38
38
|
import { resolveManifest, } from "./unit-context-manifest.js";
|
|
39
|
+
import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
|
|
39
40
|
/**
|
|
40
41
|
* Produce the inlined-context portion of a unit's system prompt by
|
|
41
42
|
* walking the manifest's `artifacts.inline` list in order and calling
|
|
@@ -91,6 +92,14 @@ const CONTEXT_MODE_GUIDANCE_BY_LANE = {
|
|
|
91
92
|
orchestration: "Use `gsd_resume` before resuming orchestration, `gsd_exec_search` to reuse prior runs, and `gsd_exec` for noisy coordination checks.",
|
|
92
93
|
docs: "Use `gsd_resume` for prior context, `gsd_exec_search` for saved evidence, and `gsd_exec` for noisy doc validation commands.",
|
|
93
94
|
};
|
|
95
|
+
// Per-unit overrides win over the lane default. run-uat's tool contract
|
|
96
|
+
// forbids `gsd_exec`/`gsd_exec_search` (acceptance evidence must flow through
|
|
97
|
+
// `gsd_uat_exec`) and Claude Code dispatch strips the tools entirely, so the
|
|
98
|
+
// shared verification-lane guidance would steer the agent into calling an
|
|
99
|
+
// unavailable tool.
|
|
100
|
+
const CONTEXT_MODE_GUIDANCE_BY_UNIT = {
|
|
101
|
+
"run-uat": "Use `gsd_uat_exec` for acceptance checks so evidence is typed as UAT-owned, and `gsd_resume` after compaction or resume.",
|
|
102
|
+
};
|
|
94
103
|
/**
|
|
95
104
|
* Render the Context Mode instruction lane for a unit type. Unknown unit
|
|
96
105
|
* types, disabled config, and explicit `contextMode: "none"` all omit the
|
|
@@ -103,7 +112,7 @@ export function composeContextModeInstructions(unitType, opts) {
|
|
|
103
112
|
if (!manifest || manifest.contextMode === "none")
|
|
104
113
|
return "";
|
|
105
114
|
const lane = CONTEXT_MODE_LANE_LABELS[manifest.contextMode];
|
|
106
|
-
const guidance = CONTEXT_MODE_GUIDANCE_BY_LANE[manifest.contextMode];
|
|
115
|
+
const guidance = CONTEXT_MODE_GUIDANCE_BY_UNIT[unitType] ?? CONTEXT_MODE_GUIDANCE_BY_LANE[manifest.contextMode];
|
|
107
116
|
if (opts.renderMode === "nested") {
|
|
108
117
|
return `Context Mode (${lane} lane): ${guidance}`;
|
|
109
118
|
}
|
|
@@ -114,6 +123,70 @@ export function composeContextModeInstructions(unitType, opts) {
|
|
|
114
123
|
guidance,
|
|
115
124
|
].join("\n");
|
|
116
125
|
}
|
|
126
|
+
const TOOL_SURFACE_GUIDANCE_BY_UNIT = {
|
|
127
|
+
"run-uat": "Do not call `gsd_exec`, `Bash`, `Write`, or `Edit` — they are unavailable in this unit. Run every automated check through `gsd_uat_exec` with the appropriate `intent`. For browser UAT modes, use `browser_*` tools when presented; if browser automation fails, record the failure honestly and use `gsd_uat_exec` for the best objective substitute.",
|
|
128
|
+
"complete-slice": "Run slice-level verification through `gsd_exec` (or MCP-scoped `mcp__…__gsd_exec`), not direct `bash`. Do not call `gsd_uat_result_save` — run-uat owns persisted UAT assessment. On verification failure, do not edit user source files in this unit.",
|
|
129
|
+
"gate-evaluate": "Dispatch only **tester** subagents via `subagent`. Persist each gate with `gsd_save_gate_result`. Do not use `ToolSearch` — it is not available.",
|
|
130
|
+
"reactive-execute": "Dispatch only **worker** subagents via `subagent`. Do not call `gsd_task_complete` from this parent batch — each worker owns its task completion. If a failed task left no summary, call `gsd_summary_save` with `blocker_discovered: true`.",
|
|
131
|
+
"execute-task": "Complete only this task via `gsd_task_complete`. Do not call `gsd_slice_complete`, `gsd_validate_milestone`, or `gsd_complete_milestone` — the orchestrator owns phase transitions.",
|
|
132
|
+
"validate-milestone": "Dispatch reviewer subagents in parallel, then persist the verdict via `gsd_validate_milestone`. Do not query `.gsd/gsd.db` directly — use `gsd_milestone_status` and inlined context.",
|
|
133
|
+
"complete-milestone": "Persist completion only through `gsd_complete_milestone` after verification passes. Do not query `.gsd/gsd.db` directly. Do not write `.gsd/PROJECT.md` or `.gsd/REQUIREMENTS.md` by hand — use `gsd_summary_save` and `gsd_requirement_update`.",
|
|
134
|
+
"replan-slice": "Persist replans through `gsd_replan_slice` only. Do not edit `PLAN.md` or task plans directly.",
|
|
135
|
+
"plan-slice": "Persist planning through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner** for reconnaissance — not implementation agents. Do not edit user source files outside `.gsd/**`.",
|
|
136
|
+
"refine-slice": "Persist refinements through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner**. Do not edit user source files outside `.gsd/**`.",
|
|
137
|
+
"plan-milestone": "Persist milestone planning through `gsd_plan_milestone` / `gsd_plan_slice`. Do not edit user source files outside `.gsd/**`.",
|
|
138
|
+
"research-slice": "Dispatch subagents only to **scout** or **planner** for reconnaissance. Do not edit user source files outside `.gsd/**`.",
|
|
139
|
+
};
|
|
140
|
+
function guidanceForToolsPolicy(policy) {
|
|
141
|
+
switch (policy.mode) {
|
|
142
|
+
case "planning":
|
|
143
|
+
return "Writes are restricted to `.gsd/**` under the working directory — do not edit user source files. `bash` is limited to read-only investigation commands. Do not dispatch subagents. For human elicitation, use workflow MCP `ask_user_questions` when available — not native `AskUserQuestion`.";
|
|
144
|
+
case "planning-dispatch": {
|
|
145
|
+
const agents = policy.allowedSubagents.map((agent) => `**${agent}**`).join(", ");
|
|
146
|
+
return `Writes are restricted to \`.gsd/**\`. Dispatch subagents only to: ${agents}. Do not edit user source files.`;
|
|
147
|
+
}
|
|
148
|
+
case "docs":
|
|
149
|
+
return "Writes are restricted to `.gsd/**` and project documentation paths (`docs/`, `README*`, `CHANGELOG.md`, root `*.md`). Do not edit application source.";
|
|
150
|
+
case "verification": {
|
|
151
|
+
const subagentLine = policy.allowedSubagents?.length
|
|
152
|
+
? ` Dispatch subagents only to: ${policy.allowedSubagents.map((agent) => `**${agent}**`).join(", ")}.`
|
|
153
|
+
: " Do not dispatch subagents.";
|
|
154
|
+
return `\`bash\` is limited to build/test verification commands. Writes restricted to \`.gsd/**\`.${subagentLine}`;
|
|
155
|
+
}
|
|
156
|
+
default:
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function formatForbiddenWorkflowToolsLine(unitType, unitGuidance) {
|
|
161
|
+
const forbidden = getUnitToolSurfaceContract(unitType)?.forbiddenGsdTools;
|
|
162
|
+
if (!forbidden)
|
|
163
|
+
return null;
|
|
164
|
+
const names = Object.keys(forbidden).filter((name) => !unitGuidance?.includes(`\`${name}\``));
|
|
165
|
+
if (names.length === 0)
|
|
166
|
+
return null;
|
|
167
|
+
return `Do not call ${names.map((name) => `\`${name}\``).join(", ")} in this unit.`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Render upfront tool-surface guidance for a unit type. Unknown units and
|
|
171
|
+
* unrestricted (`tools.mode: "all"`) units omit the block unless they have
|
|
172
|
+
* unit-specific closeout guidance registered above.
|
|
173
|
+
*/
|
|
174
|
+
export function composeToolSurfaceInstructions(unitType, opts) {
|
|
175
|
+
const manifest = resolveManifest(unitType);
|
|
176
|
+
if (!manifest)
|
|
177
|
+
return "";
|
|
178
|
+
const unitGuidance = TOOL_SURFACE_GUIDANCE_BY_UNIT[unitType];
|
|
179
|
+
const policyGuidance = unitGuidance ? null : guidanceForToolsPolicy(manifest.tools);
|
|
180
|
+
const forbiddenLine = formatForbiddenWorkflowToolsLine(unitType, unitGuidance);
|
|
181
|
+
const parts = [unitGuidance, policyGuidance, forbiddenLine].filter((part) => typeof part === "string" && part.length > 0);
|
|
182
|
+
if (parts.length === 0)
|
|
183
|
+
return "";
|
|
184
|
+
const body = parts.join(" ");
|
|
185
|
+
if (opts.renderMode === "nested") {
|
|
186
|
+
return `Tool surface: ${body}`;
|
|
187
|
+
}
|
|
188
|
+
return ["## Tool Surface", "", body].join("\n");
|
|
189
|
+
}
|
|
117
190
|
const SECTION_SEPARATOR = "\n\n---\n\n";
|
|
118
191
|
/**
|
|
119
192
|
* Compose all manifest-declared context for a unit type using the v2
|
|
@@ -118,33 +118,10 @@ const TOOLS_DOCS = {
|
|
|
118
118
|
* enumerates these against `UNIT_MANIFESTS` to catch manifest drift when
|
|
119
119
|
* a new unit type lands.
|
|
120
120
|
*/
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
"validate-milestone",
|
|
126
|
-
"complete-milestone",
|
|
127
|
-
"research-slice",
|
|
128
|
-
"plan-slice",
|
|
129
|
-
"refine-slice",
|
|
130
|
-
"replan-slice",
|
|
131
|
-
"complete-slice",
|
|
132
|
-
"reassess-roadmap",
|
|
133
|
-
"execute-task",
|
|
134
|
-
"reactive-execute",
|
|
135
|
-
"run-uat",
|
|
136
|
-
"gate-evaluate",
|
|
137
|
-
"rewrite-docs",
|
|
138
|
-
// Sidecar units (triage, quick-task)
|
|
139
|
-
"triage-captures",
|
|
140
|
-
"quick-task",
|
|
141
|
-
// Deep planning mode (project-level) units
|
|
142
|
-
"workflow-preferences",
|
|
143
|
-
"discuss-project",
|
|
144
|
-
"discuss-requirements",
|
|
145
|
-
"research-decision",
|
|
146
|
-
"research-project",
|
|
147
|
-
];
|
|
121
|
+
// Unit-type vocabulary is owned by the Unit Registry (ADR-033); re-exported
|
|
122
|
+
// here so established import paths keep working.
|
|
123
|
+
import { KNOWN_UNIT_TYPES } from "./unit-registry.js";
|
|
124
|
+
export { KNOWN_UNIT_TYPES };
|
|
148
125
|
export const UNIT_MANIFESTS = {
|
|
149
126
|
// ─── Milestone-scoped ────────────────────────────────────────────────
|
|
150
127
|
"research-milestone": {
|