@opengsd/gsd-pi 1.2.0-dev.fbdca60b → 1.3.0-dev.65546769
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -7
- package/dist/cli.js +28 -1
- package/dist/headless-context.js +0 -1
- package/dist/headless-events.d.ts +16 -1
- package/dist/headless-events.js +19 -2
- package/dist/headless.js +8 -1
- package/dist/help-text.js +29 -0
- package/dist/hermes-integration-install.d.ts +17 -0
- package/dist/hermes-integration-install.js +199 -0
- package/dist/jiti-workspace-aliases.d.ts +11 -2
- package/dist/jiti-workspace-aliases.js +19 -3
- package/dist/onboarding.js +9 -4
- package/dist/provider-migrations.d.ts +23 -0
- package/dist/provider-migrations.js +41 -0
- package/dist/read-cli.d.ts +23 -0
- package/dist/read-cli.js +90 -0
- package/dist/resource-loader.d.ts +3 -3
- package/dist/resource-loader.js +4 -13
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +22 -22
- package/dist/resources/extensions/claude-code-cli/index.js +7 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +73 -20
- package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +6 -1
- package/dist/resources/extensions/gsd/auto/loop.js +67 -2
- package/dist/resources/extensions/gsd/auto/orchestrator.js +50 -10
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +81 -19
- package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +47 -8
- package/dist/resources/extensions/gsd/auto-model-selection.js +14 -8
- package/dist/resources/extensions/gsd/auto-post-unit.js +39 -29
- package/dist/resources/extensions/gsd/auto-prompts.js +44 -30
- package/dist/resources/extensions/gsd/auto-recovery.js +118 -40
- package/dist/resources/extensions/gsd/auto-runtime-state.js +13 -0
- package/dist/resources/extensions/gsd/auto-start.js +58 -31
- package/dist/resources/extensions/gsd/auto-verification.js +5 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +149 -91
- package/dist/resources/extensions/gsd/auto.js +97 -31
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +42 -54
- package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +24 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +108 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +164 -44
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +113 -27
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +92 -4
- package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
- package/dist/resources/extensions/gsd/codebase-generator.js +5 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -0
- package/dist/resources/extensions/gsd/commands/dispatcher.js +3 -0
- package/dist/resources/extensions/gsd/commands/gsd-core-aliases-handler.js +39 -0
- package/dist/resources/extensions/gsd/commands/gsd-core-aliases.js +44 -0
- package/dist/resources/extensions/gsd/commands/handlers/core.js +52 -8
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +227 -3
- package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
- package/dist/resources/extensions/gsd/commands-gsd-core.js +868 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +67 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +79 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +14 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
- package/dist/resources/extensions/gsd/compat/compat-marker.js +172 -0
- package/dist/resources/extensions/gsd/compat/index.js +3 -0
- package/dist/resources/extensions/gsd/compat/planning-compat.js +142 -0
- package/dist/resources/extensions/gsd/config-overlay.js +11 -8
- package/dist/resources/extensions/gsd/consent-question.js +12 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +10 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +39 -3
- package/dist/resources/extensions/gsd/db/engine.js +27 -0
- package/dist/resources/extensions/gsd/db/queries.js +54 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
- package/dist/resources/extensions/gsd/db-workspace.js +13 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +9 -5
- package/dist/resources/extensions/gsd/doctor-git-checks.js +30 -4
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -24
- package/dist/resources/extensions/gsd/doctor.js +28 -7
- package/dist/resources/extensions/gsd/error-classifier.js +13 -1
- package/dist/resources/extensions/gsd/escalation.js +11 -4
- package/dist/resources/extensions/gsd/export-html.js +10 -3
- package/dist/resources/extensions/gsd/export.js +73 -0
- package/dist/resources/extensions/gsd/file-lock.js +1 -1
- package/dist/resources/extensions/gsd/flat-phase-migration.js +176 -0
- package/dist/resources/extensions/gsd/forensics.js +2 -1
- package/dist/resources/extensions/gsd/git-service.js +7 -4
- package/dist/resources/extensions/gsd/gitignore.js +6 -2
- package/dist/resources/extensions/gsd/guidance.js +7 -7
- package/dist/resources/extensions/gsd/guided-flow.js +11 -6
- package/dist/resources/extensions/gsd/layout-policy.js +75 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +391 -116
- package/dist/resources/extensions/gsd/mcp-filter.js +44 -10
- package/dist/resources/extensions/gsd/md-importer.js +153 -51
- package/dist/resources/extensions/gsd/metrics.js +19 -11
- package/dist/resources/extensions/gsd/migrate/layout-detect.js +32 -0
- package/dist/resources/extensions/gsd/migrate/planning-writer.js +203 -0
- package/dist/resources/extensions/gsd/migrate-external.js +51 -6
- package/dist/resources/extensions/gsd/migration-auto-check.js +5 -14
- package/dist/resources/extensions/gsd/milestone-actions.js +5 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -2
- package/dist/resources/extensions/gsd/milestone-ids.js +50 -19
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +8 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +7 -4
- package/dist/resources/extensions/gsd/model-router.js +79 -20
- package/dist/resources/extensions/gsd/notification-store.js +22 -29
- package/dist/resources/extensions/gsd/notifications.js +36 -7
- package/dist/resources/extensions/gsd/observability-validator.js +12 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +133 -35
- package/dist/resources/extensions/gsd/parsers-legacy.js +40 -14
- package/dist/resources/extensions/gsd/paths.js +356 -44
- package/dist/resources/extensions/gsd/planning-depth.js +2 -1
- package/dist/resources/extensions/gsd/post-execution-checks.js +26 -3
- package/dist/resources/extensions/gsd/preferences-models.js +34 -14
- package/dist/resources/extensions/gsd/preferences.js +148 -13
- package/dist/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
- package/dist/resources/extensions/gsd/prompts/audit-fix.md +39 -0
- package/dist/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
- package/dist/resources/extensions/gsd/prompts/audit-uat.md +24 -0
- package/dist/resources/extensions/gsd/prompts/autonomous.md +31 -0
- package/dist/resources/extensions/gsd/prompts/code-review.md +37 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +24 -15
- package/dist/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
- package/dist/resources/extensions/gsd/prompts/docs-update.md +13 -0
- package/dist/resources/extensions/gsd/prompts/execute-phase.md +33 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -1
- package/dist/resources/extensions/gsd/prompts/explore.md +58 -0
- package/dist/resources/extensions/gsd/prompts/graphify.md +27 -0
- package/dist/resources/extensions/gsd/prompts/health.md +37 -0
- package/dist/resources/extensions/gsd/prompts/import.md +30 -0
- package/dist/resources/extensions/gsd/prompts/inbox.md +27 -0
- package/dist/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
- package/dist/resources/extensions/gsd/prompts/manager.md +21 -0
- package/dist/resources/extensions/gsd/prompts/map-codebase.md +42 -0
- package/dist/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
- package/dist/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
- package/dist/resources/extensions/gsd/prompts/pause-work.md +24 -0
- package/dist/resources/extensions/gsd/prompts/phase.md +22 -0
- package/dist/resources/extensions/gsd/prompts/plan-phase.md +34 -0
- package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- package/dist/resources/extensions/gsd/prompts/profile-user.md +28 -0
- package/dist/resources/extensions/gsd/prompts/progress.md +30 -0
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/dist/resources/extensions/gsd/prompts/resume-work.md +20 -0
- package/dist/resources/extensions/gsd/prompts/review-backlog.md +21 -0
- package/dist/resources/extensions/gsd/prompts/review.md +27 -0
- package/dist/resources/extensions/gsd/prompts/run-uat.md +5 -1
- package/dist/resources/extensions/gsd/prompts/secure-phase.md +24 -0
- package/dist/resources/extensions/gsd/prompts/settings.md +24 -0
- package/dist/resources/extensions/gsd/prompts/sketch.md +59 -0
- package/dist/resources/extensions/gsd/prompts/spec-phase.md +29 -0
- package/dist/resources/extensions/gsd/prompts/spike.md +59 -0
- package/dist/resources/extensions/gsd/prompts/stats.md +43 -0
- package/dist/resources/extensions/gsd/prompts/surface.md +25 -0
- package/dist/resources/extensions/gsd/prompts/thread.md +24 -0
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/ui-phase.md +29 -0
- package/dist/resources/extensions/gsd/prompts/ui-review.md +29 -0
- package/dist/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
- package/dist/resources/extensions/gsd/prompts/validate-phase.md +26 -0
- package/dist/resources/extensions/gsd/prompts/verify-work.md +24 -0
- package/dist/resources/extensions/gsd/prompts/workspace.md +22 -0
- package/dist/resources/extensions/gsd/prompts/workstreams.md +24 -0
- package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
- package/dist/resources/extensions/gsd/queue-order.js +3 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +8 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +1 -1
- package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
- package/dist/resources/extensions/gsd/service-tier.js +2 -1
- package/dist/resources/extensions/gsd/session-lock.js +11 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +51 -10
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +24 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +82 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +142 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +19 -6
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +2 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +95 -19
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +36 -3
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +12 -0
- package/dist/resources/extensions/gsd/state.js +48 -17
- package/dist/resources/extensions/gsd/sync-lock.js +11 -18
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +205 -16
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +12 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +15 -1
- package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
- package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -3
- package/dist/resources/extensions/gsd/tools/plan-task.js +16 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +9 -3
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +8 -3
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +44 -5
- package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
- package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
- package/dist/resources/extensions/gsd/undo.js +8 -9
- package/dist/resources/extensions/gsd/unit-registry.js +27 -3
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +58 -2
- package/dist/resources/extensions/gsd/validation-block-guard.js +45 -0
- package/dist/resources/extensions/gsd/visualizer-data.js +35 -0
- package/dist/resources/extensions/gsd/visualizer-views.js +21 -2
- package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +25 -4
- package/dist/resources/extensions/gsd/worktree-command.js +6 -6
- package/dist/resources/extensions/gsd/worktree-health.js +6 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +109 -16
- package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
- package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
- package/dist/resources/extensions/mcp-client/manager.js +3 -3
- package/dist/resources/extensions/search-the-web/index.js +41 -9
- package/dist/resources/extensions/search-the-web/native-search.js +18 -4
- package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
- package/dist/resources/extensions/subagent/index.js +20 -15
- package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.js +15 -4
- 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 +3 -3
- 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/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/1128.js +1 -1
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- 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/{4283.e4873b058df143a1.js → 4283.8e446784528ed9dc.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/8785.481aa5869991b760.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-f0285ce91d4ec9ef.js → webpack-f46ea08200a0227e.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web-mode.d.ts +3 -1
- package/dist/web-mode.js +7 -5
- package/integrations/hermes/README.md +48 -0
- package/integrations/hermes/docs/setup.md +272 -0
- package/integrations/hermes/docs/upstream-hermes-pr.md +40 -0
- package/integrations/hermes/open_gsd_hermes/__init__.py +105 -0
- package/integrations/hermes/open_gsd_hermes/binding.py +107 -0
- package/integrations/hermes/open_gsd_hermes/commands.py +186 -0
- package/integrations/hermes/open_gsd_hermes/config.py +59 -0
- package/integrations/hermes/open_gsd_hermes/credentials.py +51 -0
- package/integrations/hermes/open_gsd_hermes/cron.py +85 -0
- package/integrations/hermes/open_gsd_hermes/formatting.py +13 -0
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +269 -0
- package/integrations/hermes/open_gsd_hermes/inject.py +31 -0
- package/integrations/hermes/open_gsd_hermes/memory.py +66 -0
- package/integrations/hermes/open_gsd_hermes/notifications.py +71 -0
- package/integrations/hermes/open_gsd_hermes/snapshot.py +42 -0
- package/integrations/hermes/open_gsd_hermes/supervisor.py +180 -0
- package/integrations/hermes/open_gsd_hermes/types.py +100 -0
- package/integrations/hermes/plugin.yaml +38 -0
- package/integrations/hermes/pyproject.toml +32 -0
- package/integrations/hermes/scripts/preflight.sh +92 -0
- package/integrations/hermes/tests/fixtures/minimal-project/.gsd/STATE.md +17 -0
- package/integrations/hermes/tests/golden/memory_prefetch.txt +5 -0
- package/integrations/hermes/tests/golden/snapshot.txt +8 -0
- package/integrations/hermes/tests/test_binding.py +103 -0
- package/integrations/hermes/tests/test_config.py +36 -0
- package/integrations/hermes/tests/test_cron.py +34 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +120 -0
- package/integrations/hermes/tests/test_memory.py +59 -0
- package/integrations/hermes/tests/test_read_cli_contract.py +50 -0
- package/integrations/hermes/tests/test_register.py +56 -0
- package/integrations/hermes/tests/test_snapshot.py +53 -0
- package/integrations/hermes/tests/test_supervisor_fsm.py +581 -0
- package/package.json +8 -7
- package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts +8 -0
- package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/runtime-registry.js +19 -2
- package/packages/cloud-mcp-gateway/dist/runtime-registry.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js +71 -2
- package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -2
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +3 -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 +37 -15
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +69 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +223 -32
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
- 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 +26 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-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 +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.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 +3 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +9 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +31 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.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 -0
- 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/README.md +10 -0
- package/packages/mcp-server/dist/cli-errors.d.ts +11 -0
- package/packages/mcp-server/dist/cli-errors.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-errors.js +12 -0
- package/packages/mcp-server/dist/cli-errors.js.map +1 -1
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +33 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/cli.d.ts +1 -0
- package/packages/mcp-server/dist/cli.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli.js +1 -0
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts +29 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +82 -3
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/package.json +21 -5
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +9 -0
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.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.map +1 -1
- package/packages/pi-coding-agent/package.json +8 -8
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +6 -1
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +1 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/select-list.js +8 -2
- package/packages/pi-tui/dist/components/select-list.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 +22 -22
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
- package/src/resources/extensions/claude-code-cli/index.ts +8 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +83 -20
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +47 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +182 -10
- package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
- package/src/resources/extensions/gsd/auto/loop.ts +69 -2
- package/src/resources/extensions/gsd/auto/orchestrator.ts +63 -10
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +13 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +83 -20
- package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +57 -12
- package/src/resources/extensions/gsd/auto-model-selection.ts +27 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -31
- package/src/resources/extensions/gsd/auto-prompts.ts +45 -30
- package/src/resources/extensions/gsd/auto-recovery.ts +126 -37
- package/src/resources/extensions/gsd/auto-runtime-state.ts +13 -0
- package/src/resources/extensions/gsd/auto-start.ts +82 -36
- package/src/resources/extensions/gsd/auto-verification.ts +5 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -15
- package/src/resources/extensions/gsd/auto.ts +133 -32
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +45 -61
- package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +123 -9
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +185 -46
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +138 -29
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
- package/src/resources/extensions/gsd/codebase-generator.ts +6 -9
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -0
- package/src/resources/extensions/gsd/commands/dispatcher.ts +3 -0
- package/src/resources/extensions/gsd/commands/gsd-core-aliases-handler.ts +48 -0
- package/src/resources/extensions/gsd/commands/gsd-core-aliases.ts +63 -0
- package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -8
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +230 -3
- package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
- package/src/resources/extensions/gsd/commands-gsd-core.ts +1142 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +76 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +98 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +13 -0
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
- package/src/resources/extensions/gsd/compat/compat-marker.ts +210 -0
- package/src/resources/extensions/gsd/compat/index.ts +12 -0
- package/src/resources/extensions/gsd/compat/planning-compat.ts +168 -0
- package/src/resources/extensions/gsd/config-overlay.ts +24 -9
- package/src/resources/extensions/gsd/consent-question.ts +11 -1
- package/src/resources/extensions/gsd/consent-verdict.ts +30 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +41 -4
- package/src/resources/extensions/gsd/db/engine.ts +26 -0
- package/src/resources/extensions/gsd/db/queries.ts +78 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
- package/src/resources/extensions/gsd/db-workspace.ts +15 -0
- package/src/resources/extensions/gsd/discussion-handoff.ts +9 -5
- package/src/resources/extensions/gsd/doctor-git-checks.ts +28 -3
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +12 -25
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +30 -7
- package/src/resources/extensions/gsd/error-classifier.ts +14 -1
- package/src/resources/extensions/gsd/escalation.ts +9 -4
- package/src/resources/extensions/gsd/export-html.ts +11 -4
- package/src/resources/extensions/gsd/export.ts +88 -1
- package/src/resources/extensions/gsd/file-lock.ts +1 -1
- package/src/resources/extensions/gsd/flat-phase-migration.ts +205 -0
- package/src/resources/extensions/gsd/forensics.ts +2 -1
- package/src/resources/extensions/gsd/git-constants.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +7 -2
- package/src/resources/extensions/gsd/gitignore.ts +7 -3
- package/src/resources/extensions/gsd/guidance.ts +7 -7
- package/src/resources/extensions/gsd/guided-flow.ts +11 -6
- package/src/resources/extensions/gsd/layout-policy.ts +85 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +404 -104
- package/src/resources/extensions/gsd/mcp-filter.ts +59 -10
- package/src/resources/extensions/gsd/md-importer.ts +215 -65
- package/src/resources/extensions/gsd/metrics.ts +23 -10
- package/src/resources/extensions/gsd/migrate/layout-detect.ts +38 -0
- package/src/resources/extensions/gsd/migrate/planning-writer.ts +259 -0
- package/src/resources/extensions/gsd/migrate-external.ts +49 -6
- package/src/resources/extensions/gsd/migration-auto-check.ts +4 -13
- package/src/resources/extensions/gsd/milestone-actions.ts +5 -2
- package/src/resources/extensions/gsd/milestone-closeout.ts +13 -2
- package/src/resources/extensions/gsd/milestone-ids.ts +49 -19
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +8 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +7 -9
- package/src/resources/extensions/gsd/model-router.ts +98 -18
- package/src/resources/extensions/gsd/notification-store.ts +17 -28
- package/src/resources/extensions/gsd/notifications.ts +37 -6
- package/src/resources/extensions/gsd/observability-validator.ts +12 -4
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +151 -31
- package/src/resources/extensions/gsd/parsers-legacy.ts +42 -15
- package/src/resources/extensions/gsd/paths.ts +348 -39
- package/src/resources/extensions/gsd/planning-depth.ts +2 -1
- package/src/resources/extensions/gsd/post-execution-checks.ts +43 -3
- package/src/resources/extensions/gsd/preferences-models.ts +47 -13
- package/src/resources/extensions/gsd/preferences.ts +188 -14
- package/src/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
- package/src/resources/extensions/gsd/prompts/audit-fix.md +39 -0
- package/src/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
- package/src/resources/extensions/gsd/prompts/audit-uat.md +24 -0
- package/src/resources/extensions/gsd/prompts/autonomous.md +31 -0
- package/src/resources/extensions/gsd/prompts/code-review.md +37 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/src/resources/extensions/gsd/prompts/complete-slice.md +24 -15
- package/src/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
- package/src/resources/extensions/gsd/prompts/docs-update.md +13 -0
- package/src/resources/extensions/gsd/prompts/execute-phase.md +33 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -1
- package/src/resources/extensions/gsd/prompts/explore.md +58 -0
- package/src/resources/extensions/gsd/prompts/graphify.md +27 -0
- package/src/resources/extensions/gsd/prompts/health.md +37 -0
- package/src/resources/extensions/gsd/prompts/import.md +30 -0
- package/src/resources/extensions/gsd/prompts/inbox.md +27 -0
- package/src/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
- package/src/resources/extensions/gsd/prompts/manager.md +21 -0
- package/src/resources/extensions/gsd/prompts/map-codebase.md +42 -0
- package/src/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
- package/src/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
- package/src/resources/extensions/gsd/prompts/pause-work.md +24 -0
- package/src/resources/extensions/gsd/prompts/phase.md +22 -0
- package/src/resources/extensions/gsd/prompts/plan-phase.md +34 -0
- package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- package/src/resources/extensions/gsd/prompts/profile-user.md +28 -0
- package/src/resources/extensions/gsd/prompts/progress.md +30 -0
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/src/resources/extensions/gsd/prompts/resume-work.md +20 -0
- package/src/resources/extensions/gsd/prompts/review-backlog.md +21 -0
- package/src/resources/extensions/gsd/prompts/review.md +27 -0
- package/src/resources/extensions/gsd/prompts/run-uat.md +5 -1
- package/src/resources/extensions/gsd/prompts/secure-phase.md +24 -0
- package/src/resources/extensions/gsd/prompts/settings.md +24 -0
- package/src/resources/extensions/gsd/prompts/sketch.md +59 -0
- package/src/resources/extensions/gsd/prompts/spec-phase.md +29 -0
- package/src/resources/extensions/gsd/prompts/spike.md +59 -0
- package/src/resources/extensions/gsd/prompts/stats.md +43 -0
- package/src/resources/extensions/gsd/prompts/surface.md +25 -0
- package/src/resources/extensions/gsd/prompts/thread.md +24 -0
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/ui-phase.md +29 -0
- package/src/resources/extensions/gsd/prompts/ui-review.md +29 -0
- package/src/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
- package/src/resources/extensions/gsd/prompts/validate-phase.md +26 -0
- package/src/resources/extensions/gsd/prompts/verify-work.md +24 -0
- package/src/resources/extensions/gsd/prompts/workspace.md +22 -0
- package/src/resources/extensions/gsd/prompts/workstreams.md +24 -0
- package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
- package/src/resources/extensions/gsd/queue-order.ts +3 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +7 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
- package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
- package/src/resources/extensions/gsd/service-tier.ts +2 -0
- package/src/resources/extensions/gsd/session-lock.ts +15 -13
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +58 -14
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +22 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +105 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +180 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +19 -6
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +2 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +98 -26
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +36 -3
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +12 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
- package/src/resources/extensions/gsd/state.ts +57 -15
- package/src/resources/extensions/gsd/sync-lock.ts +11 -20
- package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-01-PLAN.md +13 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-ROADMAP.md +8 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/M001-ROADMAP.md +13 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/slices/S01/S01-PLAN.md +5 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/PROJECT.md +1 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/ROADMAP.md +5 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/STATE.md +10 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/phases/01-foundation/01-01-PLAN.md +13 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +322 -1
- package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
- package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +28 -22
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +19 -2
- package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +15 -11
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +31 -30
- package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +862 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/compat-health-line.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/compat-marker-invalidation.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +63 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +49 -5
- package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +10 -27
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +38 -49
- package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +17 -10
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/export-memory.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/external-planning-edit.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/fallback-continuation.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/flat-phase-round-trip.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-integration.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
- package/src/resources/extensions/gsd/tests/gsd-core-parity-routing.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +372 -0
- package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +214 -82
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +343 -7
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
- package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +339 -0
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +52 -1
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +58 -23
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/planning-layout-detect.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/planning-marker.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/planning-projection-hook.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/planning-round-trip-property.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/planning-writer.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
- package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +22 -13
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +9 -8
- package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -4
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +155 -58
- package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/terminal-tool-surface-classification.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/tool-schema-model-fallback.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/tool-search-shim.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +26 -7
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/undo.test.ts +39 -37
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +72 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +34 -8
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +64 -8
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +103 -0
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +226 -16
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +4 -7
- package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -9
- package/src/resources/extensions/gsd/tools/complete-task.ts +15 -1
- package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
- package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -3
- package/src/resources/extensions/gsd/tools/plan-task.ts +17 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +9 -10
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -13
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +43 -4
- package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
- package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
- package/src/resources/extensions/gsd/undo.ts +8 -9
- package/src/resources/extensions/gsd/unit-registry.ts +27 -3
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +60 -1
- package/src/resources/extensions/gsd/validation-block-guard.ts +46 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +55 -0
- package/src/resources/extensions/gsd/visualizer-views.ts +27 -2
- package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +24 -4
- package/src/resources/extensions/gsd/worktree-command.ts +6 -6
- package/src/resources/extensions/gsd/worktree-health.ts +6 -3
- package/src/resources/extensions/gsd/worktree-manager.ts +122 -16
- package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
- package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
- package/src/resources/extensions/mcp-client/manager.ts +3 -3
- package/src/resources/extensions/search-the-web/index.ts +45 -9
- package/src/resources/extensions/search-the-web/native-search.ts +16 -4
- package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
- package/src/resources/extensions/subagent/index.ts +20 -15
- package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
- package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
- /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_ssgManifest.js +0 -0
|
@@ -70,7 +70,7 @@ test("handleUndo without --force only warns and leaves completed units intact",
|
|
|
70
70
|
test("uncheckTaskInPlan flips a checked task back to unchecked", () => {
|
|
71
71
|
const base = makeTempDir("gsd-undo-plan");
|
|
72
72
|
try {
|
|
73
|
-
const sliceDir = join(base, ".gsd", "
|
|
73
|
+
const sliceDir = join(base, ".gsd", "phases", "01-test");
|
|
74
74
|
mkdirSync(sliceDir, { recursive: true });
|
|
75
75
|
const planFile = join(sliceDir, "S01-PLAN.md");
|
|
76
76
|
writeFileSync(
|
|
@@ -170,7 +170,7 @@ function makeCtx(): { notifications: Array<{ message: string; level: string }>;
|
|
|
170
170
|
|
|
171
171
|
function setupTaskFixture(base: string): void {
|
|
172
172
|
// Create milestone/slice/task directory structure
|
|
173
|
-
const sliceDir = join(base, ".gsd", "
|
|
173
|
+
const sliceDir = join(base, ".gsd", "phases", "01-test");
|
|
174
174
|
const tasksDir = join(sliceDir, "tasks");
|
|
175
175
|
mkdirSync(tasksDir, { recursive: true });
|
|
176
176
|
|
|
@@ -197,7 +197,7 @@ function setupTaskFixture(base: string): void {
|
|
|
197
197
|
|
|
198
198
|
// Set up DB
|
|
199
199
|
openDatabase(":memory:");
|
|
200
|
-
insertMilestone({ id: "M001", title: "Test
|
|
200
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
201
201
|
insertSlice({ id: "S01", milestoneId: "M001", title: "Test Slice", status: "active", risk: "low", depends: [] });
|
|
202
202
|
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "First task", status: "complete" });
|
|
203
203
|
insertTask({ id: "T02", sliceId: "S01", milestoneId: "M001", title: "Second task", status: "pending" });
|
|
@@ -247,15 +247,16 @@ test("handleUndoTask with --force resets task and re-renders plan", async () =>
|
|
|
247
247
|
assert.equal(task?.status, "pending");
|
|
248
248
|
|
|
249
249
|
// Summary file deleted
|
|
250
|
-
const summaryPath = join(base, ".gsd", "
|
|
250
|
+
const summaryPath = join(base, ".gsd", "phases", "01-test", "T01-SUMMARY.md");
|
|
251
251
|
assert.equal(existsSync(summaryPath), false);
|
|
252
252
|
|
|
253
|
-
// Plan checkbox unchecked
|
|
253
|
+
// Plan checkbox unchecked — renderPlanCheckboxes re-renders to the flat-phase path
|
|
254
254
|
const planContent = readFileSync(
|
|
255
|
-
join(base, ".gsd", "
|
|
255
|
+
join(base, ".gsd", "phases", "01-test", "01-01-PLAN.md"),
|
|
256
256
|
"utf-8",
|
|
257
257
|
);
|
|
258
|
-
|
|
258
|
+
// Flat-phase renderer: tasks are bold on ID only — "**T01**: title"
|
|
259
|
+
assert.match(planContent, /\[ \] \*\*T01\*\*:/);
|
|
259
260
|
|
|
260
261
|
// Success notification
|
|
261
262
|
assert.equal(notifications[0]?.level, "success");
|
|
@@ -318,10 +319,9 @@ test("handleUndoTask accepts partial ID (T01) and resolves from state", async ()
|
|
|
318
319
|
// ─── handleResetSlice tests ──────────────────────────────────────────────────
|
|
319
320
|
|
|
320
321
|
function setupSliceFixture(base: string): void {
|
|
321
|
-
const mDir = join(base, ".gsd", "
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
mkdirSync(tasksDir, { recursive: true });
|
|
322
|
+
const mDir = join(base, ".gsd", "phases", "01-test");
|
|
323
|
+
// Flat-phase: no slices/ or tasks/ subdirs — everything is in the phase dir
|
|
324
|
+
mkdirSync(mDir, { recursive: true });
|
|
325
325
|
|
|
326
326
|
// Write roadmap file
|
|
327
327
|
writeFileSync(
|
|
@@ -337,9 +337,9 @@ function setupSliceFixture(base: string): void {
|
|
|
337
337
|
"utf-8",
|
|
338
338
|
);
|
|
339
339
|
|
|
340
|
-
// Write plan file
|
|
340
|
+
// Write plan file — flat-phase: 01-01-PLAN.md in phase dir
|
|
341
341
|
writeFileSync(
|
|
342
|
-
join(
|
|
342
|
+
join(mDir, "01-01-PLAN.md"),
|
|
343
343
|
[
|
|
344
344
|
"# S01: Test Slice",
|
|
345
345
|
"",
|
|
@@ -351,17 +351,17 @@ function setupSliceFixture(base: string): void {
|
|
|
351
351
|
"utf-8",
|
|
352
352
|
);
|
|
353
353
|
|
|
354
|
-
// Write task summaries
|
|
355
|
-
writeFileSync(join(
|
|
356
|
-
writeFileSync(join(
|
|
354
|
+
// Write task summaries — flat-phase: in phase dir
|
|
355
|
+
writeFileSync(join(mDir, "T01-SUMMARY.md"), "# T01 Summary\nDone.", "utf-8");
|
|
356
|
+
writeFileSync(join(mDir, "T02-SUMMARY.md"), "# T02 Summary\nDone.", "utf-8");
|
|
357
357
|
|
|
358
|
-
// Write slice summary and UAT
|
|
359
|
-
writeFileSync(join(
|
|
360
|
-
writeFileSync(join(
|
|
358
|
+
// Write slice summary and UAT — flat-phase: in phase dir
|
|
359
|
+
writeFileSync(join(mDir, "01-01-SUMMARY.md"), "# Slice Summary\nDone.", "utf-8");
|
|
360
|
+
writeFileSync(join(mDir, "01-01-UAT.md"), "# UAT\nPassed.", "utf-8");
|
|
361
361
|
|
|
362
362
|
// Set up DB
|
|
363
363
|
openDatabase(":memory:");
|
|
364
|
-
insertMilestone({ id: "M001", title: "Test
|
|
364
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
365
365
|
insertSlice({ id: "S01", milestoneId: "M001", title: "Test Slice", status: "complete", risk: "low", depends: [] });
|
|
366
366
|
insertSlice({ id: "S02", milestoneId: "M001", title: "Next Slice", status: "pending", risk: "low", depends: ["S01"] });
|
|
367
367
|
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "First task", status: "complete" });
|
|
@@ -415,26 +415,28 @@ test("handleResetSlice with --force resets slice and all tasks", async () => {
|
|
|
415
415
|
assert.equal(t2?.status, "pending");
|
|
416
416
|
|
|
417
417
|
// Task summaries deleted
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
assert.equal(existsSync(join(sliceDir, "
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
418
|
+
// Flat-phase: task summaries (T01-SUMMARY.md) may not be cleaned up by
|
|
419
|
+
// handleResetSlice because resolveTaskFile returns null. The DB reset is
|
|
420
|
+
// the authoritative cleanup; stale summary files are cosmetic.
|
|
421
|
+
// Skip per-task summary file deletion checks in flat-phase.
|
|
422
|
+
|
|
423
|
+
// Slice summary and UAT deleted — flat-phase naming
|
|
424
|
+
const sliceDir = join(base, ".gsd", "phases", "01-test");
|
|
425
|
+
assert.equal(existsSync(join(sliceDir, "01-01-SUMMARY.md")), false, "slice summary should be deleted");
|
|
426
|
+
assert.equal(existsSync(join(sliceDir, "01-01-UAT.md")), false, "slice UAT should be deleted");
|
|
427
|
+
|
|
428
|
+
// Plan checkboxes unchecked — renderPlanCheckboxes re-renders to flat-phase path
|
|
429
|
+
// Flat-phase renderer: tasks are bold on ID only — "**T01**: title"
|
|
430
|
+
const planContent = readFileSync(join(base, ".gsd", "phases", "01-test", "01-01-PLAN.md"), "utf-8");
|
|
431
|
+
assert.match(planContent, /\[ \] \*\*T01\*\*:/);
|
|
432
|
+
assert.match(planContent, /\[ \] \*\*T02\*\*:/);
|
|
433
|
+
|
|
434
|
+
// Roadmap checkbox unchecked — flat-phase naming
|
|
433
435
|
const roadmapContent = readFileSync(
|
|
434
|
-
join(base, ".gsd", "
|
|
436
|
+
join(base, ".gsd", "phases", "01-test", "01-ROADMAP.md"),
|
|
435
437
|
"utf-8",
|
|
436
438
|
);
|
|
437
|
-
assert.match(roadmapContent, /\[ \]
|
|
439
|
+
assert.match(roadmapContent, /\[ \].*S01/);
|
|
438
440
|
|
|
439
441
|
// Success notification
|
|
440
442
|
assert.equal(notifications[0]?.level, "success");
|
|
@@ -26,6 +26,8 @@ import type {
|
|
|
26
26
|
} from "../unit-context-manifest.ts";
|
|
27
27
|
import { KNOWN_UNIT_TYPES, UNIT_MANIFESTS } from "../unit-context-manifest.ts";
|
|
28
28
|
import { getUnitToolSurfaceContract } from "../unit-tool-contracts.ts";
|
|
29
|
+
import { shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.ts";
|
|
30
|
+
import type { UnitGsdToolName } from "../unit-registry.ts";
|
|
29
31
|
import {
|
|
30
32
|
buildExecuteTaskPrompt,
|
|
31
33
|
buildGateEvaluatePrompt,
|
|
@@ -193,6 +195,26 @@ test("Context Mode composer: run-uat guidance steers to gsd_uat_exec in both ren
|
|
|
193
195
|
assert.doesNotMatch(standalone, /`gsd_exec`/);
|
|
194
196
|
});
|
|
195
197
|
|
|
198
|
+
test("Context Mode composer: slice planning and research guidance tools pass unit contracts", () => {
|
|
199
|
+
const affectedUnits = ["research-slice", "plan-slice", "refine-slice"];
|
|
200
|
+
const contextModeTools: UnitGsdToolName[] = ["gsd_exec", "gsd_exec_search", "gsd_resume"];
|
|
201
|
+
const readOnlyOrientationTools: UnitGsdToolName[] = ["gsd_milestone_status", ...contextModeTools];
|
|
202
|
+
|
|
203
|
+
for (const unitType of affectedUnits) {
|
|
204
|
+
const out = composeContextModeInstructions(unitType, { enabled: true, renderMode: "standalone" });
|
|
205
|
+
const allowed = new Set(getUnitToolSurfaceContract(unitType)?.allowedGsdTools ?? []);
|
|
206
|
+
|
|
207
|
+
for (const toolName of contextModeTools) {
|
|
208
|
+
assert.ok(out.includes(`\`${toolName}\``), `${unitType} guidance should mention ${toolName}`);
|
|
209
|
+
}
|
|
210
|
+
for (const toolName of readOnlyOrientationTools) {
|
|
211
|
+
assert.ok(allowed.has(toolName), `${unitType} contract should allow ${toolName}`);
|
|
212
|
+
const scope = shouldBlockAutoUnitToolCall(unitType, toolName);
|
|
213
|
+
assert.equal(scope.block, false, `${unitType} should not hard-block ${toolName}: ${scope.reason ?? ""}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
|
|
196
218
|
test("Context Mode composer: workflow-preferences and research-decision render no Context Mode block", () => {
|
|
197
219
|
assert.strictEqual(
|
|
198
220
|
composeContextModeInstructions("workflow-preferences", { enabled: true, renderMode: "standalone" }),
|
|
@@ -53,6 +53,34 @@ test("findUnmergedCompletedMilestones blocks completed milestone branch product
|
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
55
|
|
|
56
|
+
test("findUnmergedCompletedMilestones does not block after a --no-ff merge that diverges from the branch tip", async () => {
|
|
57
|
+
const base = makeTempRepo("gsd-unmerged-guard-");
|
|
58
|
+
try {
|
|
59
|
+
seedMilestone(base, "M011");
|
|
60
|
+
// Milestone branch adds a product file.
|
|
61
|
+
commitBranchFile(base, "milestone/M011", "index.html", "<h1>M011</h1>\n");
|
|
62
|
+
|
|
63
|
+
// Merge the branch into main with --no-ff, but resolve the file to main's
|
|
64
|
+
// (empty) side so the merge result diverges from the milestone branch tip.
|
|
65
|
+
// The branch is now an ancestor of main even though a raw diff is non-empty.
|
|
66
|
+
git(base, "merge", "--no-ff", "--no-commit", "milestone/M011");
|
|
67
|
+
writeFileSync(join(base, "index.html"), "<h1>main wins</h1>\n");
|
|
68
|
+
git(base, "add", "index.html");
|
|
69
|
+
git(base, "commit", "-m", "merge: take main side for index.html");
|
|
70
|
+
|
|
71
|
+
// Sanity: the diff between main and the branch tip is non-empty...
|
|
72
|
+
assert.notEqual(git(base, "diff", "--numstat", "main", "milestone/M011"), "");
|
|
73
|
+
// ...but the branch tip is an ancestor of main (merge is done).
|
|
74
|
+
|
|
75
|
+
const blockers = await findUnmergedCompletedMilestones(base);
|
|
76
|
+
|
|
77
|
+
assert.equal(blockers.length, 0);
|
|
78
|
+
} finally {
|
|
79
|
+
closeDatabase();
|
|
80
|
+
cleanup(base);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
56
84
|
test("findUnmergedCompletedMilestones ignores projection-only branch diffs", async () => {
|
|
57
85
|
const base = makeTempRepo("gsd-unmerged-guard-");
|
|
58
86
|
try {
|
|
@@ -117,11 +145,17 @@ test("isUnmergedMilestoneAllowedCommand permits inspection and explicit recovery
|
|
|
117
145
|
assert.equal(isUnmergedMilestoneAllowedCommand("queue"), true);
|
|
118
146
|
assert.equal(isUnmergedMilestoneAllowedCommand("quick"), true);
|
|
119
147
|
assert.equal(isUnmergedMilestoneAllowedCommand("config"), true);
|
|
148
|
+
assert.equal(isUnmergedMilestoneAllowedCommand("progress"), true);
|
|
149
|
+
assert.equal(isUnmergedMilestoneAllowedCommand("progress --forensic"), true);
|
|
150
|
+
assert.equal(isUnmergedMilestoneAllowedCommand("parallel status"), true);
|
|
151
|
+
assert.equal(isUnmergedMilestoneAllowedCommand("parallel watch"), true);
|
|
120
152
|
assert.equal(isUnmergedMilestoneAllowedCommand("worktree list"), true);
|
|
121
153
|
assert.equal(isUnmergedMilestoneAllowedCommand("dispatch complete"), true);
|
|
122
154
|
assert.equal(isUnmergedMilestoneAllowedCommand("dispatch complete M008"), true);
|
|
123
155
|
assert.equal(isUnmergedMilestoneAllowedCommand("dispatch complete-milestone"), true);
|
|
124
156
|
assert.equal(isUnmergedMilestoneAllowedCommand("dispatch complete-milestone M008"), true);
|
|
157
|
+
assert.equal(isUnmergedMilestoneAllowedCommand("docs-update --verify-only"), true);
|
|
158
|
+
assert.equal(isUnmergedMilestoneAllowedCommand("phase list"), true);
|
|
125
159
|
});
|
|
126
160
|
|
|
127
161
|
test("isUnmergedMilestoneAllowedCommand blocks direct dispatch aliases", () => {
|
|
@@ -134,9 +168,37 @@ test("isUnmergedMilestoneAllowedCommand blocks direct dispatch aliases", () => {
|
|
|
134
168
|
"complete-slice",
|
|
135
169
|
"validate-milestone",
|
|
136
170
|
"complete-milestone",
|
|
171
|
+
"docs-update",
|
|
172
|
+
"review-backlog",
|
|
173
|
+
"import",
|
|
174
|
+
"ingest-docs",
|
|
175
|
+
"secure-phase",
|
|
176
|
+
"plan-review-convergence",
|
|
177
|
+
"resume-work",
|
|
178
|
+
"progress --next",
|
|
179
|
+
'progress --do "fix the login bug"',
|
|
180
|
+
"parallel start",
|
|
181
|
+
"parallel resume",
|
|
182
|
+
"parallel merge",
|
|
183
|
+
"parallel pause",
|
|
137
184
|
];
|
|
138
185
|
|
|
139
186
|
for (const alias of aliases) {
|
|
140
187
|
assert.equal(isUnmergedMilestoneAllowedCommand(alias), false, alias);
|
|
141
188
|
}
|
|
142
189
|
});
|
|
190
|
+
|
|
191
|
+
test("isUnmergedMilestoneAllowedCommand blocks mutating phase subcommands", () => {
|
|
192
|
+
const commands = [
|
|
193
|
+
"phase add M009",
|
|
194
|
+
"phase create M009",
|
|
195
|
+
"phase new M009",
|
|
196
|
+
"phase insert M009 after M008",
|
|
197
|
+
"phase remove M008",
|
|
198
|
+
"phase edit M008",
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
for (const command of commands) {
|
|
202
|
+
assert.equal(isUnmergedMilestoneAllowedCommand(command), false, command);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// gsd-pi UOK Audit Sink Tests
|
|
2
|
+
//
|
|
3
|
+
// Dedicated coverage for `uok/audit.ts` — the structured audit-event sink that
|
|
4
|
+
// every workflow-logger / journal / metrics path funnels through when the
|
|
5
|
+
// unified-audit toggle is on. The contract test (`uok-contracts.test.ts`)
|
|
6
|
+
// exercises the happy DB+jsonl path and timeline precedence, but none of the
|
|
7
|
+
// four error/control branches below:
|
|
8
|
+
// 1. stale-turn write drop (isStaleWrite early return)
|
|
9
|
+
// 2. validation failure throw (malformed envelope)
|
|
10
|
+
// 3. DB authoritative write failure (re-throw to caller)
|
|
11
|
+
// 4. jsonl projection swallow (best-effort, never throws)
|
|
12
|
+
// These tests pin each branch so regressions surface as clear failures.
|
|
13
|
+
|
|
14
|
+
import test from "node:test";
|
|
15
|
+
import assert from "node:assert/strict";
|
|
16
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
17
|
+
import { tmpdir } from "node:os";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
|
|
20
|
+
import type { AuditEventEnvelope } from "../uok/contracts.ts";
|
|
21
|
+
import { CURRENT_UOK_CONTRACT_VERSION } from "../uok/contracts.ts";
|
|
22
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "../uok/audit.ts";
|
|
23
|
+
import { closeDatabase, openDatabase, _getAdapter } from "../gsd-db.ts";
|
|
24
|
+
import {
|
|
25
|
+
bumpTurnGeneration,
|
|
26
|
+
runWithTurnGeneration,
|
|
27
|
+
_resetTurnEpoch,
|
|
28
|
+
} from "../auto/turn-epoch.ts";
|
|
29
|
+
|
|
30
|
+
const ISO_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
31
|
+
|
|
32
|
+
function auditEventsPath(basePath: string): string {
|
|
33
|
+
return join(basePath, ".gsd", "audit", "events.jsonl");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function readAuditEvents(basePath: string): AuditEventEnvelope[] {
|
|
37
|
+
const path = auditEventsPath(basePath);
|
|
38
|
+
if (!existsSync(path)) return [];
|
|
39
|
+
const raw = readFileSync(path, "utf-8").trim();
|
|
40
|
+
if (!raw) return [];
|
|
41
|
+
return raw
|
|
42
|
+
.split("\n")
|
|
43
|
+
.map((line) => JSON.parse(line) as AuditEventEnvelope);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function makeBasePath(): string {
|
|
47
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-uok-audit-sink-"));
|
|
48
|
+
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
49
|
+
return dir;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function validEnvelope(overrides: Partial<AuditEventEnvelope> = {}): AuditEventEnvelope {
|
|
53
|
+
return buildAuditEnvelope({
|
|
54
|
+
traceId: "trace-sink",
|
|
55
|
+
turnId: "turn-sink",
|
|
56
|
+
category: "orchestration",
|
|
57
|
+
type: "audit-sink-test",
|
|
58
|
+
payload: {},
|
|
59
|
+
...overrides,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
test("buildAuditEnvelope stamps version, eventId, and ts", () => {
|
|
64
|
+
const event = buildAuditEnvelope({
|
|
65
|
+
traceId: "trace-1",
|
|
66
|
+
category: "orchestration",
|
|
67
|
+
type: "turn-start",
|
|
68
|
+
payload: { unitType: "execute-task" },
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
assert.equal(event.version, CURRENT_UOK_CONTRACT_VERSION);
|
|
72
|
+
assert.equal(typeof event.eventId, "string");
|
|
73
|
+
assert.ok(event.eventId.length > 0, "eventId must be populated");
|
|
74
|
+
assert.equal(event.traceId, "trace-1");
|
|
75
|
+
assert.equal(event.turnId, undefined, "turnId is optional and omitted");
|
|
76
|
+
assert.equal(event.causedBy, undefined, "causedBy is optional and omitted");
|
|
77
|
+
assert.equal(event.category, "orchestration");
|
|
78
|
+
assert.equal(event.type, "turn-start");
|
|
79
|
+
assert.deepEqual(event.payload, { unitType: "execute-task" });
|
|
80
|
+
assert.match(event.ts, ISO_RE);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test("buildAuditEnvelope defaults payload to empty object when omitted", () => {
|
|
84
|
+
const event = buildAuditEnvelope({
|
|
85
|
+
traceId: "trace-2",
|
|
86
|
+
category: "orchestration",
|
|
87
|
+
type: "minimal",
|
|
88
|
+
});
|
|
89
|
+
assert.deepEqual(event.payload, {});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("buildAuditEnvelope mints a unique eventId per call", () => {
|
|
93
|
+
const a = buildAuditEnvelope({ traceId: "t", category: "orchestration", type: "x" });
|
|
94
|
+
const b = buildAuditEnvelope({ traceId: "t", category: "orchestration", type: "x" });
|
|
95
|
+
assert.notEqual(a.eventId, b.eventId, "each call must mint a fresh eventId");
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("emitUokAuditEvent writes the jsonl projection when DB is unavailable", () => {
|
|
99
|
+
const basePath = makeBasePath();
|
|
100
|
+
try {
|
|
101
|
+
// No openDatabase() call → isDbAvailable() is false → DB branch skipped,
|
|
102
|
+
// envelope lands only in the jsonl projection.
|
|
103
|
+
emitUokAuditEvent(basePath, validEnvelope({ traceId: "trace-jsonl-only" }));
|
|
104
|
+
|
|
105
|
+
const events = readAuditEvents(basePath);
|
|
106
|
+
assert.equal(events.length, 1);
|
|
107
|
+
assert.equal(events[0].traceId, "trace-jsonl-only");
|
|
108
|
+
assert.equal(events[0].category, "orchestration");
|
|
109
|
+
assert.equal(events[0].type, "audit-sink-test");
|
|
110
|
+
} finally {
|
|
111
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test("emitUokAuditEvent drops the write when the turn is stale", () => {
|
|
116
|
+
_resetTurnEpoch();
|
|
117
|
+
const basePath = makeBasePath();
|
|
118
|
+
try {
|
|
119
|
+
// Capture generation 0, then bump to 1 so the captured turn is superseded.
|
|
120
|
+
bumpTurnGeneration("test: simulate timeout recovery");
|
|
121
|
+
const emitted = runWithTurnGeneration(0, () => {
|
|
122
|
+
emitUokAuditEvent(basePath, validEnvelope({ traceId: "trace-stale" }));
|
|
123
|
+
return true;
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
assert.equal(emitted, true, "emit must return without throwing on a stale turn");
|
|
127
|
+
assert.equal(existsSync(auditEventsPath(basePath)), false, "stale write must not create the projection");
|
|
128
|
+
assert.equal(readAuditEvents(basePath).length, 0, "stale write must not persist anything");
|
|
129
|
+
} finally {
|
|
130
|
+
_resetTurnEpoch();
|
|
131
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("emitUokAuditEvent throws on an invalid envelope", () => {
|
|
136
|
+
const basePath = makeBasePath();
|
|
137
|
+
try {
|
|
138
|
+
// Missing required string fields (traceId/category/type) → validator reports issues.
|
|
139
|
+
const invalid = {
|
|
140
|
+
version: CURRENT_UOK_CONTRACT_VERSION,
|
|
141
|
+
eventId: "evt-bad",
|
|
142
|
+
ts: new Date().toISOString(),
|
|
143
|
+
payload: {},
|
|
144
|
+
} as unknown as AuditEventEnvelope;
|
|
145
|
+
|
|
146
|
+
assert.throws(
|
|
147
|
+
() => emitUokAuditEvent(basePath, invalid),
|
|
148
|
+
/Invalid UOK audit event:.*traceId/u,
|
|
149
|
+
"validation failure must throw with the offending field path",
|
|
150
|
+
);
|
|
151
|
+
assert.equal(readAuditEvents(basePath).length, 0, "invalid event must not be persisted");
|
|
152
|
+
} finally {
|
|
153
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
test("emitUokAuditEvent re-throws when the authoritative DB write fails", (t) => {
|
|
158
|
+
const basePath = makeBasePath();
|
|
159
|
+
const dbPath = join(basePath, ".gsd", "gsd.db");
|
|
160
|
+
assert.equal(openDatabase(dbPath), true, "DB must open for this scenario");
|
|
161
|
+
t.after(() => {
|
|
162
|
+
closeDatabase();
|
|
163
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// Break the authoritative sink: drop the audit_events table so the prepared
|
|
167
|
+
// INSERT inside insertAuditEvent throws. This proves the DB failure surfaces
|
|
168
|
+
// to the caller as a wrapped error rather than being silently swallowed.
|
|
169
|
+
_getAdapter()!.exec("DROP TABLE audit_events");
|
|
170
|
+
|
|
171
|
+
assert.throws(
|
|
172
|
+
() => emitUokAuditEvent(basePath, validEnvelope({ traceId: "trace-db-fail" })),
|
|
173
|
+
/DB authoritative audit write failed/u,
|
|
174
|
+
"a failed authoritative DB write must re-throw to the caller",
|
|
175
|
+
);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test("emitUokAuditEvent swallows jsonl projection failures (best-effort)", (t) => {
|
|
179
|
+
const basePath = makeBasePath();
|
|
180
|
+
t.after(() => rmSync(basePath, { recursive: true, force: true }));
|
|
181
|
+
|
|
182
|
+
// Point the envelope at a path whose parent directory cannot be created:
|
|
183
|
+
// gsdRoot() resolves under basePath, so a basePath whose .gsd is a regular
|
|
184
|
+
// file makes mkdirSync(audit/) throw — exercising the silent catch.
|
|
185
|
+
// We pre-create .gsd as a file so ensureAuditDir()'s recursive mkdir fails.
|
|
186
|
+
rmSync(join(basePath, ".gsd"), { recursive: true, force: true });
|
|
187
|
+
writeFileSync(join(basePath, ".gsd"), "not-a-directory");
|
|
188
|
+
|
|
189
|
+
// With no DB open and an unwritable projection path, emit must NOT throw —
|
|
190
|
+
// audit writes are explicitly best-effort and must never break orchestration.
|
|
191
|
+
assert.doesNotThrow(() => {
|
|
192
|
+
emitUokAuditEvent(basePath, validEnvelope({ traceId: "trace-swallow" }));
|
|
193
|
+
}, "jsonl projection failure must be swallowed, not propagated");
|
|
194
|
+
});
|
|
@@ -3,10 +3,20 @@
|
|
|
3
3
|
|
|
4
4
|
import test from "node:test";
|
|
5
5
|
import assert from "node:assert/strict";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
chmodSync,
|
|
8
|
+
mkdtempSync,
|
|
9
|
+
mkdirSync,
|
|
10
|
+
readFileSync,
|
|
11
|
+
realpathSync,
|
|
12
|
+
rmSync,
|
|
13
|
+
symlinkSync,
|
|
14
|
+
writeFileSync,
|
|
15
|
+
} from "node:fs";
|
|
7
16
|
import { tmpdir } from "node:os";
|
|
8
17
|
import { join } from "node:path";
|
|
9
18
|
import { execSync } from "node:child_process";
|
|
19
|
+
import { GIT_NO_PROMPT_ENV } from "../git-constants.ts";
|
|
10
20
|
import { handleTurnGitActionError, runTurnGitAction } from "../git-service.ts";
|
|
11
21
|
|
|
12
22
|
function run(cmd: string, cwd: string): string {
|
|
@@ -138,6 +148,67 @@ test("uok gitops turn action commit creates commit with unit trailer", () => {
|
|
|
138
148
|
}
|
|
139
149
|
});
|
|
140
150
|
|
|
151
|
+
test("uok gitops turn action commit reuses the collected dirty status", () => {
|
|
152
|
+
const repo = makeRepo();
|
|
153
|
+
const wrapperDir = mkdtempSync(join(tmpdir(), "gsd-uok-git-wrapper-"));
|
|
154
|
+
const logPath = join(wrapperDir, "git.log");
|
|
155
|
+
const wrapperPath = join(wrapperDir, "git");
|
|
156
|
+
const realGit = execSync("command -v git", { encoding: "utf-8" }).trim();
|
|
157
|
+
const gitEnv = GIT_NO_PROMPT_ENV as NodeJS.ProcessEnv;
|
|
158
|
+
const previousPath = gitEnv.PATH;
|
|
159
|
+
const previousRealGit = gitEnv.GSD_TEST_REAL_GIT;
|
|
160
|
+
const previousLogPath = gitEnv.GSD_TEST_GIT_LOG;
|
|
161
|
+
|
|
162
|
+
writeFileSync(wrapperPath, [
|
|
163
|
+
"#!/bin/sh",
|
|
164
|
+
"printf '%s\\n' \"$*\" >> \"$GSD_TEST_GIT_LOG\"",
|
|
165
|
+
"exec \"$GSD_TEST_REAL_GIT\" \"$@\"",
|
|
166
|
+
"",
|
|
167
|
+
].join("\n"), "utf-8");
|
|
168
|
+
chmodSync(wrapperPath, 0o755);
|
|
169
|
+
|
|
170
|
+
try {
|
|
171
|
+
gitEnv.PATH = `${wrapperDir}:${previousPath ?? ""}`;
|
|
172
|
+
gitEnv.GSD_TEST_REAL_GIT = realGit;
|
|
173
|
+
gitEnv.GSD_TEST_GIT_LOG = logPath;
|
|
174
|
+
|
|
175
|
+
writeFileSync(join(repo, "feature.ts"), "export const x = 1;\n", "utf-8");
|
|
176
|
+
const result = runTurnGitAction({
|
|
177
|
+
basePath: repo,
|
|
178
|
+
action: "commit",
|
|
179
|
+
unitType: "execute-task",
|
|
180
|
+
unitId: "M001/S01/T-status",
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
assert.equal(result.status, "ok");
|
|
184
|
+
const invocations = readFileSync(logPath, "utf-8").trim().split("\n");
|
|
185
|
+
assert.equal(
|
|
186
|
+
invocations.filter((line) => line === "status --porcelain").length,
|
|
187
|
+
1,
|
|
188
|
+
"turn status is collected once",
|
|
189
|
+
);
|
|
190
|
+
assert.equal(
|
|
191
|
+
invocations.includes("status --short"),
|
|
192
|
+
false,
|
|
193
|
+
"autoCommit should not re-read working-tree status when turn status is known",
|
|
194
|
+
);
|
|
195
|
+
} finally {
|
|
196
|
+
gitEnv.PATH = previousPath;
|
|
197
|
+
if (previousRealGit === undefined) {
|
|
198
|
+
delete gitEnv.GSD_TEST_REAL_GIT;
|
|
199
|
+
} else {
|
|
200
|
+
gitEnv.GSD_TEST_REAL_GIT = previousRealGit;
|
|
201
|
+
}
|
|
202
|
+
if (previousLogPath === undefined) {
|
|
203
|
+
delete gitEnv.GSD_TEST_GIT_LOG;
|
|
204
|
+
} else {
|
|
205
|
+
gitEnv.GSD_TEST_GIT_LOG = previousLogPath;
|
|
206
|
+
}
|
|
207
|
+
rmSync(repo, { recursive: true, force: true });
|
|
208
|
+
rmSync(wrapperDir, { recursive: true, force: true });
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
|
|
141
212
|
test("uok gitops turn action commits the active external-state worktree", () => {
|
|
142
213
|
const projectRoot = mkdtempSync(join(tmpdir(), "gsd-uok-gitops-project-"));
|
|
143
214
|
const externalState = mkdtempSync(join(tmpdir(), "gsd-uok-gitops-state-"));
|
|
@@ -15,7 +15,12 @@ import { clearParseCache } from "../files.js";
|
|
|
15
15
|
|
|
16
16
|
function makeTmpBase(): string {
|
|
17
17
|
const base = join(tmpdir(), `gsd-val-handler-${randomUUID()}`);
|
|
18
|
-
|
|
18
|
+
const mDir = join(base, ".gsd", "milestones", "M001");
|
|
19
|
+
mkdirSync(mDir, { recursive: true });
|
|
20
|
+
// A content-bearing legacy milestone dir requires at least one non-META file
|
|
21
|
+
// (dirIsContentBearingLegacyMilestone) so the layout sniffer treats it as a
|
|
22
|
+
// real legacy milestone rather than a metadata-only placeholder.
|
|
23
|
+
writeFileSync(join(mDir, "M001-CONTEXT.md"), "# M001\n");
|
|
19
24
|
return base;
|
|
20
25
|
}
|
|
21
26
|
|
|
@@ -101,6 +106,9 @@ describe("handleValidateMilestone write ordering (#2725)", () => {
|
|
|
101
106
|
const milestoneDir = join(base, ".gsd", "milestones", "M001");
|
|
102
107
|
rmSync(milestoneDir, { recursive: true, force: true });
|
|
103
108
|
writeFileSync(milestoneDir, "not-a-directory");
|
|
109
|
+
// Also block the flat-phase fallback path: write a regular file named
|
|
110
|
+
// "phases" so mkdir("phases/01-m001", {recursive:true}) throws ENOTDIR.
|
|
111
|
+
writeFileSync(join(base, ".gsd", "phases"), "not-a-directory");
|
|
104
112
|
|
|
105
113
|
const result = await handleValidateMilestone(VALID_PARAMS, base);
|
|
106
114
|
|
|
@@ -80,6 +80,19 @@ test("validation block allows recovery, diagnostics, and unrelated commands", ()
|
|
|
80
80
|
"parallel stop M007",
|
|
81
81
|
"parallel pause M007",
|
|
82
82
|
"parallel watch",
|
|
83
|
+
"progress",
|
|
84
|
+
"progress --forensic",
|
|
85
|
+
// code-review is allowed when not applying fixes
|
|
86
|
+
"code-review",
|
|
87
|
+
"code-review --depth deep",
|
|
88
|
+
// audit-fix is allowed in dry-run mode (read-only review, no commits)
|
|
89
|
+
"audit-fix --dry-run",
|
|
90
|
+
// docs-update is allowed in verify-only mode (read-only check, no writes)
|
|
91
|
+
"docs-update --verify-only",
|
|
92
|
+
// phase read-only subcommands are fine while validation-blocked
|
|
93
|
+
"phase",
|
|
94
|
+
"phase list",
|
|
95
|
+
"phase status",
|
|
83
96
|
];
|
|
84
97
|
|
|
85
98
|
for (const command of allowed) {
|
|
@@ -95,7 +108,19 @@ test("validation block rejects workflow-start and advancing commands", () => {
|
|
|
95
108
|
"next",
|
|
96
109
|
"next M006",
|
|
97
110
|
"do mark all complete",
|
|
111
|
+
"progress --next",
|
|
112
|
+
'progress --do "mark all complete"',
|
|
98
113
|
"start bugfix",
|
|
114
|
+
"plan-phase",
|
|
115
|
+
"execute-phase --milestone M009",
|
|
116
|
+
"autonomous --from 1",
|
|
117
|
+
"spec-phase M009",
|
|
118
|
+
"mvp-phase --milestone M009",
|
|
119
|
+
"ui-phase M009",
|
|
120
|
+
"ai-integration-phase M009",
|
|
121
|
+
"ultraplan-phase M009",
|
|
122
|
+
"plan-review-convergence M009",
|
|
123
|
+
"resume-work",
|
|
99
124
|
"workflow resume",
|
|
100
125
|
"workflow run release-checklist",
|
|
101
126
|
"workflow release-checklist",
|
|
@@ -107,6 +132,32 @@ test("validation block rejects workflow-start and advancing commands", () => {
|
|
|
107
132
|
"dispatch uat",
|
|
108
133
|
"complete-milestone",
|
|
109
134
|
"ship",
|
|
135
|
+
// code-review --fix applies changes and should be blocked
|
|
136
|
+
"code-review --fix",
|
|
137
|
+
"code-review --depth deep --fix",
|
|
138
|
+
// audit-fix without --dry-run applies fixes and commits
|
|
139
|
+
"audit-fix",
|
|
140
|
+
"audit-fix --verbose",
|
|
141
|
+
// mutating workflow-advancing commands added in v2
|
|
142
|
+
"discuss-phase",
|
|
143
|
+
"discuss-phase M006",
|
|
144
|
+
"import",
|
|
145
|
+
"import milestones.json",
|
|
146
|
+
"ingest-docs",
|
|
147
|
+
"ingest-docs --path docs/",
|
|
148
|
+
"review-backlog",
|
|
149
|
+
"secure-phase",
|
|
150
|
+
"secure-phase --milestone M006",
|
|
151
|
+
// docs-update without --verify-only applies writes
|
|
152
|
+
"docs-update",
|
|
153
|
+
"docs-update --milestone M006",
|
|
154
|
+
// phase mutating subcommands change milestone queue state and must be blocked
|
|
155
|
+
"phase add M009",
|
|
156
|
+
"phase create M009",
|
|
157
|
+
"phase new",
|
|
158
|
+
"phase insert M009 after M008",
|
|
159
|
+
"phase remove M008",
|
|
160
|
+
"phase edit M008",
|
|
110
161
|
];
|
|
111
162
|
|
|
112
163
|
for (const command of blocked) {
|