@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
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// execute-task only (refine-slice escalation is deferred per ADR-011).
|
|
8
8
|
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
9
9
|
import { join } from "node:path";
|
|
10
|
-
import { resolveSlicePath } from "./paths.js";
|
|
10
|
+
import { legacyMilestonesDir, resolveSlicePath, resolveTasksDir } from "./paths.js";
|
|
11
11
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
12
12
|
import { getTask, setTaskEscalationPending, setTaskEscalationAwaitingReview, clearTaskEscalationFlags, claimEscalationOverride, findUnappliedEscalationOverride, setTaskBlockerSource, listEscalationArtifacts, } from "./gsd-db.js";
|
|
13
13
|
import { emitUokAuditEvent, buildAuditEnvelope } from "./uok/audit.js";
|
|
@@ -18,10 +18,17 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
18
18
|
* .gsd/milestones/{M}/slices/{S}/tasks/{T}-ESCALATION.json
|
|
19
19
|
*/
|
|
20
20
|
export function escalationArtifactPath(basePath, milestoneId, sliceId, taskId) {
|
|
21
|
-
const
|
|
22
|
-
if (
|
|
21
|
+
const tDir = resolveTasksDir(basePath, milestoneId, sliceId);
|
|
22
|
+
if (tDir)
|
|
23
|
+
return join(tDir, `${taskId}-ESCALATION.json`);
|
|
24
|
+
// Flat-phase: tasks live in plan files; escalation artifacts sit in the phase dir.
|
|
25
|
+
// Legacy without tasks/: return null so writeEscalationArtifact throws (run doctor).
|
|
26
|
+
if (existsSync(legacyMilestonesDir(basePath)))
|
|
23
27
|
return null;
|
|
24
|
-
|
|
28
|
+
const phaseDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
29
|
+
if (!phaseDir)
|
|
30
|
+
return null;
|
|
31
|
+
return join(phaseDir, `${taskId}-ESCALATION.json`);
|
|
25
32
|
}
|
|
26
33
|
// ─── Artifact I/O ─────────────────────────────────────────────────────────
|
|
27
34
|
/** Build an EscalationArtifact from a gsd_complete_task escalation payload. */
|
|
@@ -760,10 +760,11 @@ function buildChangelogSection(data) {
|
|
|
760
760
|
// ─── Section: Knowledge ───────────────────────────────────────────────────────
|
|
761
761
|
function buildKnowledgeSection(data) {
|
|
762
762
|
const k = data.knowledge;
|
|
763
|
-
|
|
763
|
+
const memories = data.memories;
|
|
764
|
+
if (!k.exists && memories.entries.length === 0)
|
|
764
765
|
return section('knowledge', 'Knowledge', '<p class="empty">No KNOWLEDGE.md found.</p>');
|
|
765
766
|
const total = k.rules.length + k.patterns.length + k.lessons.length;
|
|
766
|
-
if (total === 0)
|
|
767
|
+
if (total === 0 && memories.entries.length === 0)
|
|
767
768
|
return section('knowledge', 'Knowledge', '<p class="empty">KNOWLEDGE.md exists but no entries parsed.</p>');
|
|
768
769
|
const rulesHtml = k.rules.length > 0 ? `
|
|
769
770
|
<h3>Rules <span class="count">${k.rules.length}</span></h3>
|
|
@@ -783,7 +784,13 @@ function buildKnowledgeSection(data) {
|
|
|
783
784
|
<thead><tr><th>ID</th><th>Lesson</th></tr></thead>
|
|
784
785
|
<tbody>${k.lessons.map(l => `<tr><td class="mono">${esc(l.id)}</td><td>${esc(l.content)}</td></tr>`).join('')}</tbody>
|
|
785
786
|
</table>` : '';
|
|
786
|
-
|
|
787
|
+
const memoriesHtml = memories.entries.length > 0 ? `
|
|
788
|
+
<h3>Memories <span class="count">${memories.entries.length}/${memories.totalCount}</span></h3>
|
|
789
|
+
<table class="tbl">
|
|
790
|
+
<thead><tr><th>ID</th><th>Category</th><th>Scope</th><th>Memory</th></tr></thead>
|
|
791
|
+
<tbody>${memories.entries.map(m => `<tr><td class="mono">${esc(m.id)}</td><td>${esc(m.category)}</td><td>${esc(m.scope)}</td><td>${esc(m.content)}</td></tr>`).join('')}</tbody>
|
|
792
|
+
</table>` : '';
|
|
793
|
+
return section('knowledge', `Knowledge <span class="count">${total + memories.totalCount}</span>`, `${rulesHtml}${patternsHtml}${lessonsHtml}${memoriesHtml}`);
|
|
787
794
|
}
|
|
788
795
|
// ─── Section: Captures ────────────────────────────────────────────────────────
|
|
789
796
|
function buildCapturesSection(data) {
|
|
@@ -7,6 +7,71 @@ import { getLedger, getProjectTotals, aggregateByPhase, aggregateBySlice, aggreg
|
|
|
7
7
|
import { gsdRoot } from "./paths.js";
|
|
8
8
|
import { formatDuration, fileLink } from "../shared/format-utils.js";
|
|
9
9
|
import { getErrorMessage } from "./error-utils.js";
|
|
10
|
+
import { isDbAvailable } from "./gsd-db.js";
|
|
11
|
+
import { openExistingWorkflowDatabase } from "./db-workspace.js";
|
|
12
|
+
import { getActiveMemories, getActiveMemoriesRanked } from "./memory-store.js";
|
|
13
|
+
const EXPORT_MEMORY_LIMIT = 20;
|
|
14
|
+
const EXPORT_MEMORY_CONTENT_LIMIT = 2000;
|
|
15
|
+
function ensureExportDb(basePath) {
|
|
16
|
+
if (isDbAvailable())
|
|
17
|
+
return;
|
|
18
|
+
openExistingWorkflowDatabase(basePath);
|
|
19
|
+
}
|
|
20
|
+
function loadExportMemories(basePath, visualizerData) {
|
|
21
|
+
if (visualizerData?.memories)
|
|
22
|
+
return limitMemoryInfo(visualizerData.memories);
|
|
23
|
+
ensureExportDb(basePath);
|
|
24
|
+
try {
|
|
25
|
+
const allActive = getActiveMemories();
|
|
26
|
+
const ranked = getActiveMemoriesRanked(EXPORT_MEMORY_LIMIT);
|
|
27
|
+
return {
|
|
28
|
+
totalCount: allActive.length,
|
|
29
|
+
entries: ranked.map((memory) => ({
|
|
30
|
+
id: memory.id,
|
|
31
|
+
category: memory.category,
|
|
32
|
+
content: limitMemoryContent(memory.content),
|
|
33
|
+
confidence: memory.confidence,
|
|
34
|
+
hitCount: memory.hit_count,
|
|
35
|
+
scope: memory.scope,
|
|
36
|
+
tags: memory.tags,
|
|
37
|
+
updatedAt: memory.updated_at,
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return { entries: [], totalCount: 0 };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function limitMemoryInfo(memories) {
|
|
46
|
+
return {
|
|
47
|
+
totalCount: memories.totalCount,
|
|
48
|
+
entries: memories.entries.map((memory) => ({
|
|
49
|
+
...memory,
|
|
50
|
+
content: limitMemoryContent(memory.content),
|
|
51
|
+
})),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function limitMemoryContent(content) {
|
|
55
|
+
if (content.length <= EXPORT_MEMORY_CONTENT_LIMIT)
|
|
56
|
+
return content;
|
|
57
|
+
return `${content.slice(0, EXPORT_MEMORY_CONTENT_LIMIT).trimEnd()}...`;
|
|
58
|
+
}
|
|
59
|
+
function formatMemoryLines(memories) {
|
|
60
|
+
if (memories.entries.length === 0)
|
|
61
|
+
return [];
|
|
62
|
+
return [
|
|
63
|
+
`## Memories`,
|
|
64
|
+
``,
|
|
65
|
+
`Active memories: ${memories.totalCount}`,
|
|
66
|
+
``,
|
|
67
|
+
...memories.entries.map((memory) => {
|
|
68
|
+
const scope = memory.scope ? `, scope ${memory.scope}` : "";
|
|
69
|
+
const tags = memory.tags.length > 0 ? `, tags ${memory.tags.join(", ")}` : "";
|
|
70
|
+
return `- **${memory.id}** (${memory.category}, confidence ${Math.round(memory.confidence * 100)}%, hits ${memory.hitCount}${scope}${tags}): ${memory.content}`;
|
|
71
|
+
}),
|
|
72
|
+
``,
|
|
73
|
+
];
|
|
74
|
+
}
|
|
10
75
|
/**
|
|
11
76
|
* Open a file in the user's default browser.
|
|
12
77
|
* Uses platform-specific commands: `open` (macOS), `xdg-open` (Linux), `start` (Windows).
|
|
@@ -47,6 +112,7 @@ export function writeExportFile(basePath, format, visualizerData) {
|
|
|
47
112
|
mkdirSync(exportDir, { recursive: true });
|
|
48
113
|
const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19);
|
|
49
114
|
if (format === "json") {
|
|
115
|
+
const memories = loadExportMemories(basePath, visualizerData);
|
|
50
116
|
const report = {
|
|
51
117
|
exportedAt: new Date().toISOString(),
|
|
52
118
|
project: projectName,
|
|
@@ -54,6 +120,7 @@ export function writeExportFile(basePath, format, visualizerData) {
|
|
|
54
120
|
byPhase: visualizerData?.byPhase ?? aggregateByPhase(units),
|
|
55
121
|
bySlice: visualizerData?.bySlice ?? aggregateBySlice(units),
|
|
56
122
|
byModel: visualizerData?.byModel ?? aggregateByModel(units),
|
|
123
|
+
memories,
|
|
57
124
|
units,
|
|
58
125
|
};
|
|
59
126
|
const outPath = join(exportDir, `export-${timestamp}.json`);
|
|
@@ -64,6 +131,7 @@ export function writeExportFile(basePath, format, visualizerData) {
|
|
|
64
131
|
const totals = visualizerData?.totals ?? getProjectTotals(units);
|
|
65
132
|
const phases = visualizerData?.byPhase ?? aggregateByPhase(units);
|
|
66
133
|
const slices = visualizerData?.bySlice ?? aggregateBySlice(units);
|
|
134
|
+
const memories = loadExportMemories(basePath, visualizerData);
|
|
67
135
|
const md = [
|
|
68
136
|
`# GSD Session Report — ${projectName}`,
|
|
69
137
|
``,
|
|
@@ -86,6 +154,7 @@ export function writeExportFile(basePath, format, visualizerData) {
|
|
|
86
154
|
`|-------|-------|------|--------|----------|`,
|
|
87
155
|
...slices.map((s) => `| ${s.sliceId} | ${s.units} | ${formatCost(s.cost)} | ${formatTokenCount(s.tokens.total)} | ${formatDuration(s.duration)} |`),
|
|
88
156
|
``,
|
|
157
|
+
...formatMemoryLines(memories),
|
|
89
158
|
].join("\n");
|
|
90
159
|
const outPath = join(exportDir, `export-${timestamp}.md`);
|
|
91
160
|
writeFileSync(outPath, md, "utf-8");
|
|
@@ -216,6 +285,7 @@ export async function handleExport(args, ctx, basePath) {
|
|
|
216
285
|
mkdirSync(exportDir, { recursive: true });
|
|
217
286
|
const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19);
|
|
218
287
|
if (format === "json") {
|
|
288
|
+
const memories = loadExportMemories(basePath);
|
|
219
289
|
const report = {
|
|
220
290
|
exportedAt: new Date().toISOString(),
|
|
221
291
|
project: projectName,
|
|
@@ -223,6 +293,7 @@ export async function handleExport(args, ctx, basePath) {
|
|
|
223
293
|
byPhase: aggregateByPhase(units),
|
|
224
294
|
bySlice: aggregateBySlice(units),
|
|
225
295
|
byModel: aggregateByModel(units),
|
|
296
|
+
memories,
|
|
226
297
|
units,
|
|
227
298
|
};
|
|
228
299
|
const outPath = join(exportDir, `export-${timestamp}.json`);
|
|
@@ -233,6 +304,7 @@ export async function handleExport(args, ctx, basePath) {
|
|
|
233
304
|
const totals = getProjectTotals(units);
|
|
234
305
|
const phases = aggregateByPhase(units);
|
|
235
306
|
const slices = aggregateBySlice(units);
|
|
307
|
+
const memories = loadExportMemories(basePath);
|
|
236
308
|
const md = [
|
|
237
309
|
`# GSD Session Report — ${projectName}`,
|
|
238
310
|
``,
|
|
@@ -255,6 +327,7 @@ export async function handleExport(args, ctx, basePath) {
|
|
|
255
327
|
`|-------|-------|------|--------|----------|`,
|
|
256
328
|
...slices.map(s => `| ${s.sliceId} | ${s.units} | ${formatCost(s.cost)} | ${formatTokenCount(s.tokens.total)} | ${formatDuration(s.duration)} |`),
|
|
257
329
|
``,
|
|
330
|
+
...formatMemoryLines(memories),
|
|
258
331
|
`## Unit History`,
|
|
259
332
|
``,
|
|
260
333
|
`| Type | ID | Model | Cost | Tokens | Duration |`,
|
|
@@ -30,9 +30,9 @@ function acquireLockSyncWithRetry(filePath, retries, stale) {
|
|
|
30
30
|
export function withFileLockSync(filePath, fn, opts = {}) {
|
|
31
31
|
if (!existsSync(filePath))
|
|
32
32
|
return fn();
|
|
33
|
-
const retries = opts.retries ?? DEFAULT_RETRIES;
|
|
34
33
|
const stale = opts.stale ?? DEFAULT_STALE_MS;
|
|
35
34
|
const onLocked = opts.onLocked ?? "fail";
|
|
35
|
+
const retries = onLocked === "skip" ? 0 : (opts.retries ?? DEFAULT_RETRIES);
|
|
36
36
|
try {
|
|
37
37
|
const release = acquireLockSyncWithRetry(filePath, retries, stale);
|
|
38
38
|
try {
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: One-time migration from legacy nested .gsd/milestones/ to
|
|
3
|
+
// flat-phase .gsd/phases/. Runs on startup when the legacy structure is detected.
|
|
4
|
+
import { cpSync, existsSync, mkdirSync, readdirSync, renameSync, rmSync, statSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { renderAllFromDb, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
7
|
+
import { getAllMilestones, getMilestoneSlices } from "./gsd-db.js";
|
|
8
|
+
import { migrateFromMarkdown } from "./md-importer.js";
|
|
9
|
+
import { countDbHierarchy } from "./migration-auto-check.js";
|
|
10
|
+
import { logWarning } from "./workflow-logger.js";
|
|
11
|
+
import { LAYOUT_SEGMENTS } from "./layout-policy.js";
|
|
12
|
+
import { canonicalPhaseDirName, milestonesDir, resolveMilestonePath } from "./paths.js";
|
|
13
|
+
const LEGACY_MIGRATING_SEGMENT = "milestones.migrating";
|
|
14
|
+
function legacyMigratingPath(basePath) {
|
|
15
|
+
return join(basePath, ".gsd", LEGACY_MIGRATING_SEGMENT);
|
|
16
|
+
}
|
|
17
|
+
function hasLegacyMilestoneSubdirs(dirPath) {
|
|
18
|
+
if (!existsSync(dirPath))
|
|
19
|
+
return false;
|
|
20
|
+
try {
|
|
21
|
+
return readdirSync(dirPath).some(e => statSync(join(dirPath, e)).isDirectory());
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function rollbackPartialMigration(basePath, backupDir, migratingPath) {
|
|
28
|
+
// Remove the partially-written phases/ dir.
|
|
29
|
+
rmSync(join(basePath, ".gsd", LAYOUT_SEGMENTS.level1), { recursive: true, force: true });
|
|
30
|
+
// Restore milestones/ — prefer renaming the preserved migrating copy back.
|
|
31
|
+
const milestonesPath = join(basePath, ".gsd", "milestones");
|
|
32
|
+
try {
|
|
33
|
+
if (migratingPath && existsSync(migratingPath) && !existsSync(milestonesPath)) {
|
|
34
|
+
renameSync(migratingPath, milestonesPath);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (existsSync(backupDir)) {
|
|
38
|
+
cpSync(backupDir, milestonesPath, { recursive: true });
|
|
39
|
+
}
|
|
40
|
+
if (migratingPath && existsSync(migratingPath)) {
|
|
41
|
+
rmSync(migratingPath, { recursive: true, force: true });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (restoreErr) {
|
|
45
|
+
logWarning("migration", `rollback: could not restore milestones/: ${restoreErr.message}`);
|
|
46
|
+
// Non-fatal: backup still exists at backupDir for manual recovery.
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Detect whether the project uses the legacy nested layout.
|
|
51
|
+
* True when .gsd/milestones/ exists AND contains at least one milestone
|
|
52
|
+
* subdirectory. An empty milestones/ dir (created by old bootstrap code
|
|
53
|
+
* before it was fixed) is not a real legacy layout and must not trigger
|
|
54
|
+
* a migration that would thrash the reconciler.
|
|
55
|
+
*/
|
|
56
|
+
export function needsFlatPhaseMigration(basePath) {
|
|
57
|
+
if (hasLegacyMilestoneSubdirs(join(basePath, ".gsd", "milestones")))
|
|
58
|
+
return true;
|
|
59
|
+
// Resume an interrupted migration where the legacy tree was renamed aside.
|
|
60
|
+
return hasLegacyMilestoneSubdirs(legacyMigratingPath(basePath));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Migrate from legacy nested .gsd/milestones/ to flat-phase .gsd/phases/.
|
|
64
|
+
*
|
|
65
|
+
* Steps:
|
|
66
|
+
* 1. Backup .gsd/milestones/ to .gsd-backups/migrate-<ts>/
|
|
67
|
+
* 2. Rename .gsd/milestones/ aside so path resolvers target phases/
|
|
68
|
+
* 3. Render flat-phase from the DB (which already has the data)
|
|
69
|
+
* 4. Verify counts match
|
|
70
|
+
* 5. Remove the renamed legacy tree
|
|
71
|
+
*
|
|
72
|
+
* Idempotent: if .gsd/milestones/ doesn't exist, returns immediately.
|
|
73
|
+
*/
|
|
74
|
+
export async function migrateToFlatPhase(basePath) {
|
|
75
|
+
if (!needsFlatPhaseMigration(basePath))
|
|
76
|
+
return;
|
|
77
|
+
const milestonesPath = join(basePath, ".gsd", "milestones");
|
|
78
|
+
const migratingPath = legacyMigratingPath(basePath);
|
|
79
|
+
const phasesPath = join(basePath, ".gsd", LAYOUT_SEGMENTS.level1);
|
|
80
|
+
const resumingInterrupted = !hasLegacyMilestoneSubdirs(milestonesPath) && hasLegacyMilestoneSubdirs(migratingPath);
|
|
81
|
+
// 1. Reconcile DB from legacy markdown before backup/removal so on-disk-only
|
|
82
|
+
// content is imported even when milestone rows already exist in SQLite.
|
|
83
|
+
// Check BEFORE creating the backup — avoids accumulating .gsd-backups/ entries
|
|
84
|
+
// on every session start when milestones/ exists but the DB has no rows.
|
|
85
|
+
migrateFromMarkdown(basePath);
|
|
86
|
+
const milestonesBefore = getAllMilestones().length;
|
|
87
|
+
if (milestonesBefore === 0) {
|
|
88
|
+
logWarning("migration", "flat-phase migration skipped: legacy milestones/ exists but DB has no milestone rows — will retry when DB is populated");
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
let backupDir = migratingPath;
|
|
92
|
+
if (!resumingInterrupted) {
|
|
93
|
+
// 2. Backup (only reached when the DB has rows and migration will proceed)
|
|
94
|
+
const ts = Date.now();
|
|
95
|
+
backupDir = join(basePath, ".gsd-backups", `migrate-${ts}`);
|
|
96
|
+
try {
|
|
97
|
+
mkdirSync(join(basePath, ".gsd-backups"), { recursive: true });
|
|
98
|
+
cpSync(milestonesPath, backupDir, { recursive: true });
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
logWarning("migration", `flat-phase migration backup failed: ${err.message}`);
|
|
102
|
+
throw err;
|
|
103
|
+
}
|
|
104
|
+
// 3. Rename legacy tree aside before rendering so path resolvers target
|
|
105
|
+
// phases/ instead of writing back into the nested milestones/ layout.
|
|
106
|
+
// Keep the full tree on disk until render+verify succeed (unlike rmSync).
|
|
107
|
+
try {
|
|
108
|
+
renameSync(milestonesPath, migratingPath);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
logWarning("migration", `failed to rename legacy milestones/ before render: ${err.message}`);
|
|
112
|
+
throw err;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Interrupted run: clear any partial phases/ projection before retrying.
|
|
117
|
+
rmSync(phasesPath, { recursive: true, force: true });
|
|
118
|
+
}
|
|
119
|
+
// 4. Render flat-phase from DB
|
|
120
|
+
let renderResult;
|
|
121
|
+
try {
|
|
122
|
+
renderResult = await renderAllFromDb(basePath);
|
|
123
|
+
// Slice-less milestones still need a phase directory for flat-phase layout.
|
|
124
|
+
for (const milestone of getAllMilestones()) {
|
|
125
|
+
if (getMilestoneSlices(milestone.id).length > 0)
|
|
126
|
+
continue;
|
|
127
|
+
const roadmapResult = await renderRoadmapFromDb(basePath, milestone.id);
|
|
128
|
+
if ("skipped" in roadmapResult) {
|
|
129
|
+
const phaseDir = resolveMilestonePath(basePath, milestone.id) ??
|
|
130
|
+
join(milestonesDir(basePath), canonicalPhaseDirName(milestone.id, milestone.title));
|
|
131
|
+
mkdirSync(phaseDir, { recursive: true });
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
renderResult.rendered++;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
logWarning("migration", `flat-phase render failed: ${err.message}`);
|
|
139
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
140
|
+
throw err;
|
|
141
|
+
}
|
|
142
|
+
// 5. Verify render succeeded and flat-phase projection was written
|
|
143
|
+
if (renderResult.errors.length > 0) {
|
|
144
|
+
logWarning("migration", `flat-phase render had ${renderResult.errors.length} error(s): ${renderResult.errors.join("; ")}`);
|
|
145
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
146
|
+
throw new Error(`flat-phase migration render failed: ${renderResult.errors.slice(0, 3).join("; ")}`);
|
|
147
|
+
}
|
|
148
|
+
const db = countDbHierarchy();
|
|
149
|
+
let renderedDirCount = 0;
|
|
150
|
+
try {
|
|
151
|
+
// /^\d+-/ matches any numeric prefix (01-, 10-, 100-) so M100+ milestones
|
|
152
|
+
// whose dirs start with "100-slug" are counted correctly.
|
|
153
|
+
renderedDirCount = readdirSync(phasesPath, { withFileTypes: true })
|
|
154
|
+
.filter((entry) => entry.isDirectory() && /^\d+-/.test(entry.name)).length;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// phases/ doesn't exist or is unreadable — same as zero dirs
|
|
158
|
+
}
|
|
159
|
+
if (db.milestones > 0 && renderedDirCount !== db.milestones) {
|
|
160
|
+
logWarning("migration", `phases/ dir count mismatch: expected ${db.milestones}, found ${renderedDirCount}`);
|
|
161
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
162
|
+
throw new Error("flat-phase migration verification failed: phases dir milestone count mismatch");
|
|
163
|
+
}
|
|
164
|
+
if (db.slices > 0 && renderResult.rendered === 0) {
|
|
165
|
+
logWarning("migration", "flat-phase migration verification failed: render produced no artifacts for populated DB");
|
|
166
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
167
|
+
throw new Error("flat-phase migration verification failed: no artifacts rendered");
|
|
168
|
+
}
|
|
169
|
+
// 6. Verified — remove the renamed legacy tree (backup already on disk).
|
|
170
|
+
try {
|
|
171
|
+
rmSync(migratingPath, { recursive: true, force: true });
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
logWarning("migration", `flat-phase migration succeeded but could not remove ${LEGACY_MIGRATING_SEGMENT}: ${err.message}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -26,7 +26,7 @@ import { isDbAvailable, getAllMilestones, getMilestoneSlices, getSliceTasks } fr
|
|
|
26
26
|
import { isClosedStatus } from "./status-guards.js";
|
|
27
27
|
import { formatDuration } from "../shared/format-utils.js";
|
|
28
28
|
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
29
|
-
import { loadEffectiveGSDPreferences, loadGlobalGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
|
|
29
|
+
import { clearGSDPreferencesCache, loadEffectiveGSDPreferences, loadGlobalGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
|
|
30
30
|
import { showNextAction } from "../shared/tui.js";
|
|
31
31
|
import { isInteractiveCommandContext, notifyForensicsNeedsInteractiveMenu, } from "./command-feedback.js";
|
|
32
32
|
import { ensurePreferencesFile, serializePreferencesToFrontmatter } from "./commands-prefs-wizard.js";
|
|
@@ -154,6 +154,7 @@ async function writeForensicsDedupPref(ctx, enabled) {
|
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
writeFileSync(prefsPath, `---\n${frontmatter}---${body}`, "utf-8");
|
|
157
|
+
clearGSDPreferencesCache();
|
|
157
158
|
}
|
|
158
159
|
// ─── Entry Point ──────────────────────────────────────────────────────────────
|
|
159
160
|
export async function handleForensics(args, ctx, pi) {
|
|
@@ -708,11 +708,14 @@ export class GitServiceImpl {
|
|
|
708
708
|
*
|
|
709
709
|
* Returns the commit message on success, or null if nothing to commit.
|
|
710
710
|
* @param extraExclusions Additional paths to exclude from staging (e.g. [".gsd/"] for pre-switch commits).
|
|
711
|
+
* @param knownDirty Fresh caller-provided dirty status; when omitted, autoCommit probes the tree.
|
|
711
712
|
*/
|
|
712
|
-
autoCommit(unitType, unitId, extraExclusions = [], taskContext) {
|
|
713
|
+
autoCommit(unitType, unitId, extraExclusions = [], taskContext, knownDirty) {
|
|
713
714
|
// Quick check: is there anything dirty at all?
|
|
714
715
|
// Native path uses libgit2 (single syscall), fallback spawns git.
|
|
715
|
-
if (
|
|
716
|
+
if (knownDirty === false)
|
|
717
|
+
return null;
|
|
718
|
+
if (knownDirty !== true && !nativeHasChanges(this.basePath))
|
|
716
719
|
return null;
|
|
717
720
|
const scoped = taskContext
|
|
718
721
|
? this.scopedStageTaskFiles(taskContext, extraExclusions)
|
|
@@ -1054,7 +1057,7 @@ function runPerRepositoryCommitAction(args) {
|
|
|
1054
1057
|
continue;
|
|
1055
1058
|
}
|
|
1056
1059
|
try {
|
|
1057
|
-
const message = new GitServiceImpl(repo.root, gitPrefs).autoCommit(args.unitType, args.unitId, [], args.taskContext) ?? "";
|
|
1060
|
+
const message = new GitServiceImpl(repo.root, gitPrefs).autoCommit(args.unitType, args.unitId, [], args.taskContext, args.dirtyRepositories?.[repo.id]) ?? "";
|
|
1058
1061
|
if (message) {
|
|
1059
1062
|
commitMessages[repo.id] = message;
|
|
1060
1063
|
}
|
|
@@ -1091,7 +1094,7 @@ export function runTurnGitAction(args) {
|
|
|
1091
1094
|
dirtyRepositories,
|
|
1092
1095
|
};
|
|
1093
1096
|
}
|
|
1094
|
-
const repoCommitResult = runPerRepositoryCommitAction(args);
|
|
1097
|
+
const repoCommitResult = runPerRepositoryCommitAction({ ...args, dirtyRepositories });
|
|
1095
1098
|
if (Object.keys(repoCommitResult.commitErrors).length > 0) {
|
|
1096
1099
|
return {
|
|
1097
1100
|
action: args.action,
|
|
@@ -201,10 +201,14 @@ export function ensureGitignore(basePath, options) {
|
|
|
201
201
|
.map((l) => l.trim())
|
|
202
202
|
.filter((l) => l && !l.startsWith("#")));
|
|
203
203
|
// Determine which patterns to apply. If .gsd/ has tracked files,
|
|
204
|
-
// exclude the ".gsd" pattern to prevent deleting tracked state
|
|
204
|
+
// exclude the ".gsd" pattern to prevent deleting tracked state, but
|
|
205
|
+
// substitute the granular GSD_RUNTIME_PATTERNS so transient artifacts
|
|
206
|
+
// (STATE.md, runtime/, gsd.db, event-log.jsonl, …) still get ignored.
|
|
207
|
+
// Without this fallback, the pre-completion commit gate sees those
|
|
208
|
+
// runtime paths as untracked and blocks milestone close-out forever.
|
|
205
209
|
const gsdIsTracked = hasGitTrackedGsdFiles(basePath);
|
|
206
210
|
const patternsToApply = gsdIsTracked
|
|
207
|
-
? BASELINE_PATTERNS.filter((p) => p !== ".gsd")
|
|
211
|
+
? Array.from(new Set([...BASELINE_PATTERNS.filter((p) => p !== ".gsd"), ...GSD_RUNTIME_PATTERNS]))
|
|
208
212
|
: BASELINE_PATTERNS;
|
|
209
213
|
// Find patterns not yet present
|
|
210
214
|
const missing = patternsToApply.filter((p) => !existingLines.has(p));
|
|
@@ -137,20 +137,20 @@ export function crashResumeHint(unitType, unitId) {
|
|
|
137
137
|
// guidance is authored — the gap is visible in one place.
|
|
138
138
|
const DOCTOR_FIX_HINTS = {
|
|
139
139
|
db_unavailable: "The workflow database could not be opened — state derivation is degraded. Restart the session; if it persists, run `/gsd doctor` from the project root.",
|
|
140
|
-
stale_crash_lock: "Run `/gsd doctor` to clear the stale lock, then `/gsd auto` to resume.",
|
|
141
|
-
stale_parallel_session: "Run `/gsd doctor` to clear the stale session registration.",
|
|
140
|
+
stale_crash_lock: "Run `/gsd doctor fix` to clear the stale lock, then `/gsd auto` to resume.",
|
|
141
|
+
stale_parallel_session: "Run `/gsd doctor fix` to clear the stale session registration.",
|
|
142
142
|
unresolved_git_conflicts: "Resolve the conflict markers, commit, then re-run `/gsd auto`.",
|
|
143
143
|
conflict_markers_in_tracked_files: "Search the listed files for `<<<<<<<` markers, resolve, and commit.",
|
|
144
144
|
worktree_dirty: "Commit or merge the worktree's changes (`gsd worktree merge <name>`) before removing it.",
|
|
145
145
|
worktree_branch_merged: "The branch is merged — remove the worktree to reclaim space.",
|
|
146
|
-
orphaned_auto_worktree: "Run `/gsd doctor` to fix, or merge salvageable work with `gsd worktree merge <name>`.",
|
|
147
|
-
gitignore_missing_patterns: "Run `/gsd doctor` to append the missing .gitignore patterns.",
|
|
146
|
+
orphaned_auto_worktree: "Run `/gsd doctor fix` to fix, or merge salvageable work with `gsd worktree merge <name>`.",
|
|
147
|
+
gitignore_missing_patterns: "Run `/gsd doctor fix` to append the missing .gitignore patterns.",
|
|
148
148
|
invalid_preferences: "Edit .gsd/PREFERENCES.md to fix the invalid field, then re-run the command.",
|
|
149
149
|
provider_key_missing: "Add the provider API key to your environment or provider config, then retry.",
|
|
150
150
|
provider_key_backedoff: "The key is cooling down after repeated failures — wait, or switch the phase model in .gsd/PREFERENCES.md.",
|
|
151
|
-
state_file_stale: "Run `/gsd doctor` to rebuild the projection from the database.",
|
|
152
|
-
state_file_missing: "Run `/gsd doctor` to rebuild the projection from the database.",
|
|
153
|
-
projection_drift: "Run `/gsd doctor` to rebuild markdown projections from the database (DB is the source of truth).",
|
|
151
|
+
state_file_stale: "Run `/gsd doctor fix` to rebuild the projection from the database.",
|
|
152
|
+
state_file_missing: "Run `/gsd doctor fix` to rebuild the projection from the database.",
|
|
153
|
+
projection_drift: "Run `/gsd doctor fix` to rebuild markdown projections from the database (DB is the source of truth).",
|
|
154
154
|
uat_retry_exhausted: "Review the failing UAT criteria via `/gsd status`, fix the issue, then re-run `/gsd auto`.",
|
|
155
155
|
};
|
|
156
156
|
export function doctorFixHint(code) {
|
|
@@ -20,7 +20,7 @@ import { assessInterruptedSession, formatInterruptedSessionRunningMessage, forma
|
|
|
20
20
|
import { listUnitRuntimeRecords, clearUnitRuntimeRecord, isInFlightRuntimePhase } from "./unit-runtime.js";
|
|
21
21
|
import { resolveExpectedArtifactPath } from "./auto.js";
|
|
22
22
|
import { gsdHome } from "./gsd-home.js";
|
|
23
|
-
import { gsdRoot, milestonesDir, resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile, relMilestoneFile, relSliceFile, } from "./paths.js";
|
|
23
|
+
import { gsdRoot, milestonesDir, legacyMilestonesDir, resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile, relMilestoneFile, relSliceFile, } from "./paths.js";
|
|
24
24
|
import { join } from "node:path";
|
|
25
25
|
import { readFileSync, existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
|
|
26
26
|
import { readSessionLockData, isSessionLockProcessAlive } from "./session-lock.js";
|
|
@@ -211,8 +211,11 @@ function hasNestedFileOrSymlink(dir) {
|
|
|
211
211
|
}
|
|
212
212
|
return false;
|
|
213
213
|
}
|
|
214
|
-
function clearEmptyLegacyDeepSetupPseudoMilestones(basePath, entries) {
|
|
215
|
-
|
|
214
|
+
function clearEmptyLegacyDeepSetupPseudoMilestones(basePath, entries, dir) {
|
|
215
|
+
// These are LEGACY pseudo-milestone dirs — prefer legacyMilestonesDir (milestones/)
|
|
216
|
+
// when it exists; caller may also supply the dir directly.
|
|
217
|
+
const legacyDir = legacyMilestonesDir(basePath);
|
|
218
|
+
const mDir = dir ?? (existsSync(legacyDir) ? legacyDir : milestonesDir(basePath));
|
|
216
219
|
const remaining = [];
|
|
217
220
|
for (const entry of entries) {
|
|
218
221
|
if (!LEGACY_DEEP_SETUP_PSEUDO_MILESTONE_DIRS.has(entry)) {
|
|
@@ -732,7 +735,6 @@ function bootstrapGsdProject(basePath) {
|
|
|
732
735
|
nativeInit(basePath, mainBranch);
|
|
733
736
|
}
|
|
734
737
|
const root = gsdRoot(basePath);
|
|
735
|
-
mkdirSync(join(root, "milestones"), { recursive: true });
|
|
736
738
|
mkdirSync(join(root, "runtime"), { recursive: true });
|
|
737
739
|
const gitPrefs = loadEffectiveGSDPreferences(basePath)?.preferences?.git;
|
|
738
740
|
const manageGitignore = gitPrefs?.manage_gitignore;
|
|
@@ -1643,9 +1645,12 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1643
1645
|
// cwd, etc). Warn instead of silently starting a new-project flow.
|
|
1644
1646
|
if (milestoneIds.length === 0) {
|
|
1645
1647
|
const mDir = milestonesDir(basePath);
|
|
1646
|
-
|
|
1648
|
+
const legDir = legacyMilestonesDir(basePath);
|
|
1649
|
+
// Check flat-phase dir first; fall back to legacy milestones/ dir
|
|
1650
|
+
const checkDir = existsSync(mDir) ? mDir : existsSync(legDir) ? legDir : null;
|
|
1651
|
+
if (checkDir) {
|
|
1647
1652
|
try {
|
|
1648
|
-
const entries = clearEmptyLegacyDeepSetupPseudoMilestones(basePath, readdirSync(
|
|
1653
|
+
const entries = clearEmptyLegacyDeepSetupPseudoMilestones(basePath, readdirSync(checkDir), checkDir);
|
|
1649
1654
|
if (entries.length > 0) {
|
|
1650
1655
|
ctx.ui.notify(`Milestone directory has ${entries.length} entries but none were recognized as milestones. ` +
|
|
1651
1656
|
`This may indicate a corrupted state or wrong working directory. Run \`/gsd doctor\` to diagnose.`, "warning");
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Single source of truth for the on-disk layout inside .gsd/.
|
|
3
|
+
// Adopted gsd-core's flat-phase structure so both tools read/write the same
|
|
4
|
+
// shape. The 17 path resolvers in paths.ts delegate here; the renderer and
|
|
5
|
+
// importer route through them.
|
|
6
|
+
//
|
|
7
|
+
// DB table/column names (milestones/slices/tasks, milestone_id, etc.) stay
|
|
8
|
+
// unchanged — those are internal identifiers. Only the on-disk segment names
|
|
9
|
+
// and file-naming change.
|
|
10
|
+
/** Root directory name. Both gsd-core (Stage 2) and gsd-pi standardize here. */
|
|
11
|
+
export const LAYOUT_ROOT = ".gsd";
|
|
12
|
+
/** Segment names inside the root. */
|
|
13
|
+
export const LAYOUT_SEGMENTS = {
|
|
14
|
+
/** Was "milestones". A phase = one unit of work (gsd-core vocabulary). */
|
|
15
|
+
level1: "phases",
|
|
16
|
+
};
|
|
17
|
+
function pad(n, width = 2) {
|
|
18
|
+
return String(n).padStart(width, "0");
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Phase directory name: `NN-slug` (e.g. "01-foundation").
|
|
22
|
+
* Matches gsd-core's `phases/NN-name/` convention.
|
|
23
|
+
*/
|
|
24
|
+
export function phaseDirName(phaseNum, slug) {
|
|
25
|
+
return `${pad(phaseNum)}-${slug}`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Plan file name: `NN-MM-SUFFIX.md` (e.g. "01-01-PLAN.md").
|
|
29
|
+
* Matches gsd-core's per-plan file convention.
|
|
30
|
+
*/
|
|
31
|
+
export function planFileName(phaseNum, planNum, suffix) {
|
|
32
|
+
return `${pad(phaseNum)}-${pad(planNum)}-${suffix}.md`;
|
|
33
|
+
}
|
|
34
|
+
/** DB path: `.gsd/gsd.db`. gsd-core ignores this file. */
|
|
35
|
+
export function dbPath(basePath) {
|
|
36
|
+
return `${basePath}/${LAYOUT_ROOT}/gsd.db`.replaceAll(/\/+/g, "/");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Extract the numeric portion of a milestone id (M001 → 1).
|
|
40
|
+
* Used by the renderer to derive the phase number from the DB's milestone_id.
|
|
41
|
+
*/
|
|
42
|
+
export function milestoneIdToPhaseNum(milestoneId) {
|
|
43
|
+
// No $ anchor: accepts bare (M012) and team-suffixed (M012-abc123) IDs.
|
|
44
|
+
const m = milestoneId.match(/^M0*(\d+)/i);
|
|
45
|
+
return m ? Number.parseInt(m[1], 10) : 1;
|
|
46
|
+
}
|
|
47
|
+
/** Team-mode suffix from milestone ids like M001-abc123. */
|
|
48
|
+
export function milestoneIdUniqueSuffix(milestoneId) {
|
|
49
|
+
const m = milestoneId.match(/^M(\d{3})(?:-([a-z0-9]{6}))?$/);
|
|
50
|
+
return m?.[2];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Extract the numeric portion of a slice id (S01 → 1).
|
|
54
|
+
* Used by the renderer to derive the plan number from the DB's slice_id.
|
|
55
|
+
*/
|
|
56
|
+
export function sliceIdToPlanNum(sliceId) {
|
|
57
|
+
const m = sliceId.match(/^S0*(\d+)$/i);
|
|
58
|
+
return m ? Number.parseInt(m[1], 10) : 1;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Derive a stable, deterministic, filesystem-safe slug from a milestone title.
|
|
62
|
+
* Used for the phase directory name so the layout is human-readable.
|
|
63
|
+
*
|
|
64
|
+
* Stability is load-bearing: the renderer must produce the same slug for the
|
|
65
|
+
* same title on every run, or the directory churns on every projection.
|
|
66
|
+
*/
|
|
67
|
+
export function derivePhaseSlug(title) {
|
|
68
|
+
const slug = title
|
|
69
|
+
.toLowerCase()
|
|
70
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
71
|
+
.replace(/^-+|-+$/g, "")
|
|
72
|
+
.slice(0, 40)
|
|
73
|
+
.replace(/-+$/g, "");
|
|
74
|
+
return slug || "phase";
|
|
75
|
+
}
|