gsd-pi 2.75.0 → 2.76.0-dev.4c866b677
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 +208 -151
- package/dist/claude-cli-check.d.ts +10 -0
- package/dist/claude-cli-check.js +13 -3
- package/dist/headless-events.d.ts +1 -1
- package/dist/headless-events.js +5 -2
- package/dist/headless.js +5 -6
- package/dist/loader.js +0 -0
- package/dist/onboarding.d.ts +20 -1
- package/dist/onboarding.js +99 -39
- package/dist/resource-loader.d.ts +1 -1
- package/dist/resource-loader.js +2 -8
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +17 -5
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +34 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
- package/dist/resources/extensions/gsd/auto/loop.js +67 -4
- package/dist/resources/extensions/gsd/auto/phases.js +122 -54
- package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
- package/dist/resources/extensions/gsd/auto/session.js +9 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +37 -8
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +120 -14
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +66 -19
- package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +190 -46
- package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
- package/dist/resources/extensions/gsd/auto-start.js +33 -13
- package/dist/resources/extensions/gsd/auto-verification.js +36 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +71 -2
- package/dist/resources/extensions/gsd/auto.js +61 -26
- package/dist/resources/extensions/gsd/blocked-models.js +68 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +84 -21
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +131 -0
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +12 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +84 -10
- package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
- package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
- package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
- package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +21 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
- package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
- package/dist/resources/extensions/gsd/commands-config.js +5 -0
- package/dist/resources/extensions/gsd/commands-debug.js +388 -0
- package/dist/resources/extensions/gsd/commands-do.js +1 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +200 -77
- package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
- package/dist/resources/extensions/gsd/commands-memory.js +462 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
- package/dist/resources/extensions/gsd/commands-scan.js +94 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
- package/dist/resources/extensions/gsd/complexity-classifier.js +5 -3
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
- package/dist/resources/extensions/gsd/db-writer.js +89 -16
- package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
- package/dist/resources/extensions/gsd/definition-loader.js +7 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +50 -32
- package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +96 -22
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
- package/dist/resources/extensions/gsd/doctor.js +7 -1
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -0
- package/dist/resources/extensions/gsd/error-classifier.js +27 -3
- package/dist/resources/extensions/gsd/escalation.js +321 -0
- package/dist/resources/extensions/gsd/forensics.js +26 -29
- package/dist/resources/extensions/gsd/git-service.js +0 -1
- package/dist/resources/extensions/gsd/graph.js +26 -2
- package/dist/resources/extensions/gsd/gsd-db.js +576 -35
- package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
- package/dist/resources/extensions/gsd/health-widget.js +7 -4
- package/dist/resources/extensions/gsd/hook-emitter.js +108 -0
- package/dist/resources/extensions/gsd/init-wizard.js +101 -46
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
- package/dist/resources/extensions/gsd/memory-backfill.js +126 -0
- package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
- package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
- package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
- package/dist/resources/extensions/gsd/memory-relations.js +189 -0
- package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
- package/dist/resources/extensions/gsd/memory-store.js +318 -6
- package/dist/resources/extensions/gsd/metrics.js +1 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
- package/dist/resources/extensions/gsd/model-router.js +16 -6
- package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
- package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
- package/dist/resources/extensions/gsd/notification-widget.js +24 -39
- package/dist/resources/extensions/gsd/notifications.js +4 -0
- package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
- package/dist/resources/extensions/gsd/pre-execution-checks.js +105 -8
- package/dist/resources/extensions/gsd/preferences-models.js +1 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
- package/dist/resources/extensions/gsd/preferences.js +10 -10
- package/dist/resources/extensions/gsd/prompt-loader.js +22 -7
- package/dist/resources/extensions/gsd/prompts/add-tests.md +1 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +27 -0
- package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -3
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
- package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/dist/resources/extensions/gsd/python-resolver.js +70 -0
- package/dist/resources/extensions/gsd/run-manager.js +37 -17
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +1 -1
- package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
- package/dist/resources/extensions/gsd/state.js +90 -7
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +331 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +14 -0
- package/dist/resources/extensions/gsd/uok/flags.js +7 -7
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/verification-gate.js +2 -1
- package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
- package/dist/resources/extensions/gsd/workflow-install.js +327 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
- package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
- package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +7 -0
- package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
- package/dist/resources/extensions/remote-questions/commands.js +380 -0
- package/dist/resources/extensions/remote-questions/manager.js +39 -5
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
- package/dist/resources/extensions/search-the-web/command-search-provider.js +5 -1
- package/dist/resources/extensions/search-the-web/native-search.js +46 -3
- package/dist/resources/extensions/shared/interview-ui.js +189 -1
- package/dist/resources/extensions/shared/layout-utils.js +17 -0
- package/dist/resources/extensions/shared/rtk-shared.js +47 -0
- package/dist/resources/extensions/shared/rtk.js +3 -46
- package/dist/resources/skills/api-design/SKILL.md +190 -0
- package/dist/resources/skills/create-mcp-server/SKILL.md +121 -0
- package/dist/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/resources/skills/decompose-into-slices/SKILL.md +139 -0
- package/dist/resources/skills/dependency-upgrade/SKILL.md +158 -0
- package/dist/resources/skills/design-an-interface/SKILL.md +102 -0
- package/dist/resources/skills/forensics/SKILL.md +153 -0
- package/dist/resources/skills/grill-me/SKILL.md +93 -0
- package/dist/resources/skills/handoff/SKILL.md +121 -0
- package/dist/resources/skills/observability/SKILL.md +174 -0
- package/dist/resources/skills/security-review/SKILL.md +181 -0
- package/dist/resources/skills/spike-wrap-up/SKILL.md +138 -0
- package/dist/resources/skills/tdd/SKILL.md +112 -0
- package/dist/resources/skills/verify-before-complete/SKILL.md +97 -0
- package/dist/resources/skills/write-docs/SKILL.md +81 -0
- package/dist/resources/skills/write-milestone-brief/SKILL.md +135 -0
- package/dist/rtk-shared.d.ts +10 -0
- package/dist/rtk-shared.js +47 -0
- package/dist/rtk.d.ts +2 -6
- package/dist/rtk.js +3 -48
- package/dist/shared/workspace-types.d.ts +52 -0
- package/dist/shared/workspace-types.js +1 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +10 -0
- package/dist/update-check.js +24 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -18
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +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/2826.e59e8578e2e28639.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-5b113fd32bc2a1c3.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
- package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +48 -24
- package/dist/wizard.js +2 -2
- package/dist/worktree-cli.d.ts +6 -5
- package/dist/worktree-cli.js +23 -7
- package/package.json +3 -3
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +12 -10
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +8 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +2 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +306 -71
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/mcp-server.test.ts +40 -4
- package/packages/mcp-server/src/server.ts +12 -10
- package/packages/mcp-server/src/session-manager.ts +10 -3
- package/packages/mcp-server/src/workflow-tools.test.ts +346 -1
- package/packages/mcp-server/src/workflow-tools.ts +359 -75
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +12 -0
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +30 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +14 -0
- package/packages/pi-agent-core/src/types.ts +34 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +3 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/groq.js +0 -153
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +17 -0
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +13 -0
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +23 -2
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/api-family.d.ts +27 -0
- package/packages/pi-ai/dist/providers/api-family.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.js +47 -0
- package/packages/pi-ai/dist/providers/api-family.js.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/api-family.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.test.js +101 -0
- package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +60 -15
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/providers/think-tag-parser.d.ts +17 -0
- package/packages/pi-ai/dist/providers/think-tag-parser.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/think-tag-parser.js +75 -0
- package/packages/pi-ai/dist/providers/think-tag-parser.js.map +1 -0
- package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/think-tag-parser.test.js +41 -0
- package/packages/pi-ai/dist/providers/think-tag-parser.test.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +12 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +164 -14
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +15 -3
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +67 -0
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +16 -3
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +67 -0
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +289 -0
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
- package/packages/pi-ai/package.json +2 -2
- package/packages/pi-ai/scripts/generate-models.ts +50 -0
- package/packages/pi-ai/src/index.ts +1 -0
- package/packages/pi-ai/src/models/capability-patches.ts +5 -2
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
- package/packages/pi-ai/src/models/generated/groq.ts +0 -153
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +17 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -0
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
- package/packages/pi-ai/src/providers/anthropic.ts +25 -2
- package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
- package/packages/pi-ai/src/providers/api-family.ts +57 -0
- package/packages/pi-ai/src/providers/openai-completions.ts +57 -16
- package/packages/pi-ai/src/providers/think-tag-parser.test.ts +44 -0
- package/packages/pi-ai/src/providers/think-tag-parser.ts +94 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +200 -23
- package/packages/pi-ai/src/utils/oauth/github-copilot.ts +12 -2
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +84 -0
- package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +15 -5
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +84 -0
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +16 -5
- package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +363 -0
- package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/cli/args.d.ts +6 -0
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js +14 -4
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/cli/args.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/cli/args.test.js +38 -0
- package/packages/pi-coding-agent/dist/cli/args.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +25 -2
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.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/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +4 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +34 -2
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +233 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +200 -3
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts +53 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.js +337 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +234 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-discovery.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-discovery.js +92 -12
- package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-discovery.test.js +16 -1
- package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js +40 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js +61 -1
- package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +76 -10
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +4 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +39 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +55 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
- package/packages/pi-coding-agent/dist/core/skill-tool.test.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/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +3 -0
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +21 -10
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +13 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts +7 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +29 -21
- package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
- package/packages/pi-coding-agent/src/cli/args.ts +21 -6
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +27 -2
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
- package/packages/pi-coding-agent/src/core/extensions/index.ts +16 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +353 -1
- package/packages/pi-coding-agent/src/core/extensions/types.ts +253 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +269 -0
- package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
- package/packages/pi-coding-agent/src/core/index.ts +10 -0
- package/packages/pi-coding-agent/src/core/model-discovery.test.ts +19 -0
- package/packages/pi-coding-agent/src/core/model-discovery.ts +99 -12
- package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
- package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +75 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +86 -10
- package/packages/pi-coding-agent/src/core/retry-handler.ts +4 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +58 -1
- package/packages/pi-coding-agent/src/core/settings-manager.ts +57 -0
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
- package/packages/pi-coding-agent/src/index.ts +16 -0
- package/packages/pi-coding-agent/src/main.ts +4 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +24 -12
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
- package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +16 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +36 -22
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +1 -75
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +192 -24
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/link-workspace-packages.cjs +1 -0
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +24 -6
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/readiness.ts +36 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -9
- package/src/resources/extensions/gsd/auto/loop.ts +109 -3
- package/src/resources/extensions/gsd/auto/phases.ts +150 -66
- package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
- package/src/resources/extensions/gsd/auto/session.ts +14 -1
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +46 -5
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +141 -9
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +87 -18
- package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +232 -47
- package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
- package/src/resources/extensions/gsd/auto-start.ts +36 -16
- package/src/resources/extensions/gsd/auto-verification.ts +36 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +81 -1
- package/src/resources/extensions/gsd/auto.ts +65 -29
- package/src/resources/extensions/gsd/blocked-models.ts +98 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +105 -21
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +163 -0
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +89 -10
- package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
- package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
- package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
- package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
- package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
- package/src/resources/extensions/gsd/commands-config.ts +10 -0
- package/src/resources/extensions/gsd/commands-debug.ts +484 -0
- package/src/resources/extensions/gsd/commands-do.ts +1 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +262 -78
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/commands-memory.ts +551 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
- package/src/resources/extensions/gsd/commands-scan.ts +125 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
- package/src/resources/extensions/gsd/complexity-classifier.ts +5 -3
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
- package/src/resources/extensions/gsd/db-writer.ts +91 -17
- package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
- package/src/resources/extensions/gsd/definition-loader.ts +7 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +51 -30
- package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +109 -26
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +2 -0
- package/src/resources/extensions/gsd/error-classifier.ts +32 -3
- package/src/resources/extensions/gsd/escalation.ts +367 -0
- package/src/resources/extensions/gsd/forensics.ts +25 -29
- package/src/resources/extensions/gsd/git-service.ts +0 -1
- package/src/resources/extensions/gsd/graph.ts +33 -3
- package/src/resources/extensions/gsd/gsd-db.ts +682 -35
- package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
- package/src/resources/extensions/gsd/health-widget.ts +7 -3
- package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
- package/src/resources/extensions/gsd/init-wizard.ts +102 -55
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
- package/src/resources/extensions/gsd/memory-backfill.ts +140 -0
- package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
- package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
- package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
- package/src/resources/extensions/gsd/memory-relations.ts +240 -0
- package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
- package/src/resources/extensions/gsd/memory-store.ts +377 -7
- package/src/resources/extensions/gsd/metrics.ts +1 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
- package/src/resources/extensions/gsd/model-router.ts +25 -6
- package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
- package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
- package/src/resources/extensions/gsd/notification-widget.ts +25 -43
- package/src/resources/extensions/gsd/notifications.ts +6 -0
- package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
- package/src/resources/extensions/gsd/pre-execution-checks.ts +106 -12
- package/src/resources/extensions/gsd/preferences-models.ts +1 -0
- package/src/resources/extensions/gsd/preferences-types.ts +10 -2
- package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
- package/src/resources/extensions/gsd/preferences.ts +10 -10
- package/src/resources/extensions/gsd/prompt-loader.ts +30 -7
- package/src/resources/extensions/gsd/prompts/add-tests.md +1 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/debug-diagnose.md +27 -0
- package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +16 -3
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/scan.md +79 -0
- package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/src/resources/extensions/gsd/python-resolver.ts +76 -0
- package/src/resources/extensions/gsd/run-manager.ts +53 -19
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +1 -1
- package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
- package/src/resources/extensions/gsd/state.ts +95 -6
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +107 -1
- package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +33 -3
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +335 -21
- package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
- package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
- package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +175 -17
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +306 -1
- package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +145 -8
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +131 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +206 -1
- package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
- package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +341 -6
- package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +159 -8
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +88 -4
- package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -3
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- package/src/resources/extensions/gsd/tools/memory-tools.ts +410 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
- package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +14 -0
- package/src/resources/extensions/gsd/types.ts +62 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
- package/src/resources/extensions/gsd/uok/flags.ts +7 -7
- package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
- package/src/resources/extensions/gsd/verification-gate.ts +2 -1
- package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
- package/src/resources/extensions/gsd/workflow-install.ts +423 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +4 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
- package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
- package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +7 -0
- package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
- package/src/resources/extensions/gsd/workspace-index.ts +9 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
- package/src/resources/extensions/remote-questions/commands.ts +480 -0
- package/src/resources/extensions/remote-questions/manager.ts +49 -4
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
- package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
- package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
- package/src/resources/extensions/search-the-web/command-search-provider.ts +5 -1
- package/src/resources/extensions/search-the-web/native-search.ts +50 -4
- package/src/resources/extensions/shared/interview-ui.ts +195 -1
- package/src/resources/extensions/shared/layout-utils.ts +26 -0
- package/src/resources/extensions/shared/rtk-shared.ts +58 -0
- package/src/resources/extensions/shared/rtk.ts +12 -52
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
- package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
- package/src/resources/skills/api-design/SKILL.md +190 -0
- package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
- package/src/resources/skills/create-workflow/SKILL.md +33 -6
- package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
- package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
- package/src/resources/skills/design-an-interface/SKILL.md +102 -0
- package/src/resources/skills/forensics/SKILL.md +153 -0
- package/src/resources/skills/grill-me/SKILL.md +93 -0
- package/src/resources/skills/handoff/SKILL.md +121 -0
- package/src/resources/skills/observability/SKILL.md +174 -0
- package/src/resources/skills/security-review/SKILL.md +181 -0
- package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
- package/src/resources/skills/tdd/SKILL.md +112 -0
- package/src/resources/skills/verify-before-complete/SKILL.md +97 -0
- package/src/resources/skills/write-docs/SKILL.md +81 -0
- package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
- package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/dist/ps/types.d.ts +0 -5
- package/packages/native/dist/ps/types.js +0 -2
- package/packages/native/src/ps/types.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
- package/packages/pi-ai/oauth.d.ts +0 -1
- package/packages/pi-ai/oauth.js +0 -1
- /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → jDqWYbuP_CG6Kjc-uKwkN}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → jDqWYbuP_CG6Kjc-uKwkN}/_ssgManifest.js +0 -0
|
@@ -135,7 +135,7 @@ function openRawDb(path) {
|
|
|
135
135
|
const Database = providerModule;
|
|
136
136
|
return new Database(path);
|
|
137
137
|
}
|
|
138
|
-
const SCHEMA_VERSION =
|
|
138
|
+
const SCHEMA_VERSION = 21;
|
|
139
139
|
function indexExists(db, name) {
|
|
140
140
|
return !!db.prepare("SELECT 1 as present FROM sqlite_master WHERE type = 'index' AND name = ?").get(name);
|
|
141
141
|
}
|
|
@@ -189,6 +189,7 @@ function initSchema(db, fileBacked) {
|
|
|
189
189
|
rationale TEXT NOT NULL DEFAULT '',
|
|
190
190
|
revisable TEXT NOT NULL DEFAULT '',
|
|
191
191
|
made_by TEXT NOT NULL DEFAULT 'agent',
|
|
192
|
+
source TEXT NOT NULL DEFAULT 'discussion', -- ADR-011 P2: 'discussion' | 'planning' | 'escalation'
|
|
192
193
|
superseded_by TEXT DEFAULT NULL
|
|
193
194
|
)
|
|
194
195
|
`);
|
|
@@ -231,7 +232,10 @@ function initSchema(db, fileBacked) {
|
|
|
231
232
|
created_at TEXT NOT NULL,
|
|
232
233
|
updated_at TEXT NOT NULL,
|
|
233
234
|
superseded_by TEXT DEFAULT NULL,
|
|
234
|
-
hit_count INTEGER NOT NULL DEFAULT 0
|
|
235
|
+
hit_count INTEGER NOT NULL DEFAULT 0,
|
|
236
|
+
scope TEXT NOT NULL DEFAULT 'project',
|
|
237
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
238
|
+
structured_fields TEXT DEFAULT NULL
|
|
235
239
|
)
|
|
236
240
|
`);
|
|
237
241
|
db.exec(`
|
|
@@ -242,6 +246,41 @@ function initSchema(db, fileBacked) {
|
|
|
242
246
|
)
|
|
243
247
|
`);
|
|
244
248
|
db.exec(`
|
|
249
|
+
CREATE TABLE IF NOT EXISTS memory_sources (
|
|
250
|
+
id TEXT PRIMARY KEY,
|
|
251
|
+
kind TEXT NOT NULL,
|
|
252
|
+
uri TEXT,
|
|
253
|
+
title TEXT,
|
|
254
|
+
content TEXT NOT NULL,
|
|
255
|
+
content_hash TEXT NOT NULL UNIQUE,
|
|
256
|
+
imported_at TEXT NOT NULL,
|
|
257
|
+
scope TEXT NOT NULL DEFAULT 'project',
|
|
258
|
+
tags TEXT NOT NULL DEFAULT '[]'
|
|
259
|
+
)
|
|
260
|
+
`);
|
|
261
|
+
db.exec(`
|
|
262
|
+
CREATE TABLE IF NOT EXISTS memory_embeddings (
|
|
263
|
+
memory_id TEXT PRIMARY KEY,
|
|
264
|
+
model TEXT NOT NULL,
|
|
265
|
+
dim INTEGER NOT NULL,
|
|
266
|
+
vector BLOB NOT NULL,
|
|
267
|
+
updated_at TEXT NOT NULL
|
|
268
|
+
)
|
|
269
|
+
`);
|
|
270
|
+
db.exec(`
|
|
271
|
+
CREATE TABLE IF NOT EXISTS memory_relations (
|
|
272
|
+
from_id TEXT NOT NULL,
|
|
273
|
+
to_id TEXT NOT NULL,
|
|
274
|
+
rel TEXT NOT NULL,
|
|
275
|
+
confidence REAL NOT NULL DEFAULT 0.8,
|
|
276
|
+
created_at TEXT NOT NULL,
|
|
277
|
+
PRIMARY KEY (from_id, to_id, rel)
|
|
278
|
+
)
|
|
279
|
+
`);
|
|
280
|
+
// FTS5 virtual table mirroring memories.content for fast keyword search.
|
|
281
|
+
// Optional — if the SQLite build lacks FTS5, we fall back to LIKE scans.
|
|
282
|
+
tryCreateMemoriesFts(db);
|
|
283
|
+
db.exec(`
|
|
245
284
|
CREATE TABLE IF NOT EXISTS milestones (
|
|
246
285
|
id TEXT PRIMARY KEY,
|
|
247
286
|
title TEXT NOT NULL DEFAULT '',
|
|
@@ -282,6 +321,8 @@ function initSchema(db, fileBacked) {
|
|
|
282
321
|
observability_impact TEXT NOT NULL DEFAULT '',
|
|
283
322
|
sequence INTEGER DEFAULT 0, -- Ordering hint: tools may set this to control execution order
|
|
284
323
|
replan_triggered_at TEXT DEFAULT NULL,
|
|
324
|
+
is_sketch INTEGER NOT NULL DEFAULT 0, -- ADR-011: 1 = slice is a sketch awaiting refinement
|
|
325
|
+
sketch_scope TEXT NOT NULL DEFAULT '', -- ADR-011: 2-3 sentence rough scope from plan-milestone
|
|
285
326
|
PRIMARY KEY (milestone_id, id),
|
|
286
327
|
FOREIGN KEY (milestone_id) REFERENCES milestones(id)
|
|
287
328
|
)
|
|
@@ -299,6 +340,11 @@ function initSchema(db, fileBacked) {
|
|
|
299
340
|
duration TEXT NOT NULL DEFAULT '',
|
|
300
341
|
completed_at TEXT DEFAULT NULL,
|
|
301
342
|
blocker_discovered INTEGER DEFAULT 0,
|
|
343
|
+
blocker_source TEXT NOT NULL DEFAULT '', -- ADR-011 P2: provenance for blocker_discovered (e.g. 'reject-escalation')
|
|
344
|
+
escalation_pending INTEGER NOT NULL DEFAULT 0, -- ADR-011 P2: pause-on-escalation flag
|
|
345
|
+
escalation_awaiting_review INTEGER NOT NULL DEFAULT 0, -- ADR-011 P2: artifact exists but continueWithDefault=true (no pause)
|
|
346
|
+
escalation_artifact_path TEXT DEFAULT NULL, -- ADR-011 P2: path to T##-ESCALATION.json
|
|
347
|
+
escalation_override_applied_at TEXT DEFAULT NULL, -- ADR-011 P2: DB claim lock for idempotent override injection
|
|
302
348
|
deviations TEXT NOT NULL DEFAULT '',
|
|
303
349
|
known_issues TEXT NOT NULL DEFAULT '',
|
|
304
350
|
key_files TEXT NOT NULL DEFAULT '[]',
|
|
@@ -445,6 +491,15 @@ function initSchema(db, fileBacked) {
|
|
|
445
491
|
)
|
|
446
492
|
`);
|
|
447
493
|
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active ON memories(superseded_by)");
|
|
494
|
+
// Existing DBs may arrive here before migrateSchema() has added columns
|
|
495
|
+
// that fresh installs already have. Add only columns needed by bootstrap
|
|
496
|
+
// indexes so old DBs can open far enough for the normal migration chain.
|
|
497
|
+
ensureBootstrapIndexColumns(db);
|
|
498
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope)");
|
|
499
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_kind ON memory_sources(kind)");
|
|
500
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_scope ON memory_sources(scope)");
|
|
501
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_from ON memory_relations(from_id)");
|
|
502
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_to ON memory_relations(to_id)");
|
|
448
503
|
db.exec("CREATE INDEX IF NOT EXISTS idx_replan_history_milestone ON replan_history(milestone_id, created_at)");
|
|
449
504
|
// v13 indexes — hot-path dispatch queries
|
|
450
505
|
db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_active ON tasks(milestone_id, slice_id, status)");
|
|
@@ -460,6 +515,9 @@ function initSchema(db, fileBacked) {
|
|
|
460
515
|
db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
|
|
461
516
|
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
|
|
462
517
|
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
|
|
518
|
+
// ADR-011 Phase 2 — also created by the v17 migration; fresh installs
|
|
519
|
+
// skip migrations so the index must be created here too.
|
|
520
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_escalation_pending ON tasks(milestone_id, slice_id, escalation_pending)");
|
|
463
521
|
db.exec(`CREATE VIEW IF NOT EXISTS active_decisions AS SELECT * FROM decisions WHERE superseded_by IS NULL`);
|
|
464
522
|
db.exec(`CREATE VIEW IF NOT EXISTS active_requirements AS SELECT * FROM requirements WHERE superseded_by IS NULL`);
|
|
465
523
|
db.exec(`CREATE VIEW IF NOT EXISTS active_memories AS SELECT * FROM memories WHERE superseded_by IS NULL`);
|
|
@@ -482,10 +540,67 @@ function columnExists(db, table, column) {
|
|
|
482
540
|
const rows = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
483
541
|
return rows.some((row) => row["name"] === column);
|
|
484
542
|
}
|
|
543
|
+
/**
|
|
544
|
+
* Create the FTS5 virtual table for memories plus the triggers that keep it
|
|
545
|
+
* in sync with the base table. FTS5 may be unavailable on stripped-down
|
|
546
|
+
* SQLite builds — callers should treat failure as non-fatal and fall back
|
|
547
|
+
* to LIKE-based scans in `memory-store.queryMemoriesRanked`.
|
|
548
|
+
*/
|
|
549
|
+
export function tryCreateMemoriesFts(db) {
|
|
550
|
+
try {
|
|
551
|
+
db.exec(`
|
|
552
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts
|
|
553
|
+
USING fts5(content, content='memories', content_rowid='seq', tokenize='porter unicode61')
|
|
554
|
+
`);
|
|
555
|
+
// Triggers mirror inserts / updates / deletes on the base memories table.
|
|
556
|
+
db.exec(`
|
|
557
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai
|
|
558
|
+
AFTER INSERT ON memories BEGIN
|
|
559
|
+
INSERT INTO memories_fts(rowid, content) VALUES (new.seq, new.content);
|
|
560
|
+
END
|
|
561
|
+
`);
|
|
562
|
+
db.exec(`
|
|
563
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad
|
|
564
|
+
AFTER DELETE ON memories BEGIN
|
|
565
|
+
INSERT INTO memories_fts(memories_fts, rowid, content) VALUES ('delete', old.seq, old.content);
|
|
566
|
+
END
|
|
567
|
+
`);
|
|
568
|
+
db.exec(`
|
|
569
|
+
CREATE TRIGGER IF NOT EXISTS memories_au
|
|
570
|
+
AFTER UPDATE OF content ON memories BEGIN
|
|
571
|
+
INSERT INTO memories_fts(memories_fts, rowid, content) VALUES ('delete', old.seq, old.content);
|
|
572
|
+
INSERT INTO memories_fts(rowid, content) VALUES (new.seq, new.content);
|
|
573
|
+
END
|
|
574
|
+
`);
|
|
575
|
+
return true;
|
|
576
|
+
}
|
|
577
|
+
catch (err) {
|
|
578
|
+
logWarning("db", `FTS5 unavailable — memory queries will use LIKE fallback: ${err.message}`);
|
|
579
|
+
return false;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
export function isMemoriesFtsAvailable(db) {
|
|
583
|
+
try {
|
|
584
|
+
const row = db
|
|
585
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories_fts'")
|
|
586
|
+
.get();
|
|
587
|
+
return !!row;
|
|
588
|
+
}
|
|
589
|
+
catch {
|
|
590
|
+
return false;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
485
593
|
function ensureColumn(db, table, column, ddl) {
|
|
486
594
|
if (!columnExists(db, table, column))
|
|
487
595
|
db.exec(ddl);
|
|
488
596
|
}
|
|
597
|
+
function ensureBootstrapIndexColumns(db) {
|
|
598
|
+
ensureColumn(db, "memories", "scope", `ALTER TABLE memories ADD COLUMN scope TEXT NOT NULL DEFAULT 'project'`);
|
|
599
|
+
ensureColumn(db, "memories", "tags", `ALTER TABLE memories ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'`);
|
|
600
|
+
ensureColumn(db, "memory_sources", "scope", `ALTER TABLE memory_sources ADD COLUMN scope TEXT NOT NULL DEFAULT 'project'`);
|
|
601
|
+
ensureColumn(db, "memory_sources", "tags", `ALTER TABLE memory_sources ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'`);
|
|
602
|
+
ensureColumn(db, "tasks", "escalation_pending", `ALTER TABLE tasks ADD COLUMN escalation_pending INTEGER NOT NULL DEFAULT 0`);
|
|
603
|
+
}
|
|
489
604
|
function migrateSchema(db) {
|
|
490
605
|
const row = db.prepare("SELECT MAX(version) as v FROM schema_version").get();
|
|
491
606
|
const currentVersion = row ? row["v"] : 0;
|
|
@@ -861,6 +976,115 @@ function migrateSchema(db) {
|
|
|
861
976
|
":applied_at": new Date().toISOString(),
|
|
862
977
|
});
|
|
863
978
|
}
|
|
979
|
+
if (currentVersion < 16) {
|
|
980
|
+
// ADR-011 Phase 1: sketch-then-refine progressive planning — sketch columns on slices.
|
|
981
|
+
ensureColumn(db, "slices", "is_sketch", `ALTER TABLE slices ADD COLUMN is_sketch INTEGER NOT NULL DEFAULT 0`);
|
|
982
|
+
ensureColumn(db, "slices", "sketch_scope", `ALTER TABLE slices ADD COLUMN sketch_scope TEXT NOT NULL DEFAULT ''`);
|
|
983
|
+
// ADR-011 Phase 2: decisions can now be sourced from escalation resolutions.
|
|
984
|
+
ensureColumn(db, "decisions", "source", `ALTER TABLE decisions ADD COLUMN source TEXT NOT NULL DEFAULT 'discussion'`);
|
|
985
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
986
|
+
":version": 16,
|
|
987
|
+
":applied_at": new Date().toISOString(),
|
|
988
|
+
});
|
|
989
|
+
}
|
|
990
|
+
if (currentVersion < 17) {
|
|
991
|
+
// ADR-011 Phase 2: mid-execution escalation — columns on the tasks table.
|
|
992
|
+
ensureColumn(db, "tasks", "blocker_source", `ALTER TABLE tasks ADD COLUMN blocker_source TEXT NOT NULL DEFAULT ''`);
|
|
993
|
+
ensureColumn(db, "tasks", "escalation_pending", `ALTER TABLE tasks ADD COLUMN escalation_pending INTEGER NOT NULL DEFAULT 0`);
|
|
994
|
+
ensureColumn(db, "tasks", "escalation_awaiting_review", `ALTER TABLE tasks ADD COLUMN escalation_awaiting_review INTEGER NOT NULL DEFAULT 0`);
|
|
995
|
+
ensureColumn(db, "tasks", "escalation_artifact_path", `ALTER TABLE tasks ADD COLUMN escalation_artifact_path TEXT DEFAULT NULL`);
|
|
996
|
+
ensureColumn(db, "tasks", "escalation_override_applied_at", `ALTER TABLE tasks ADD COLUMN escalation_override_applied_at TEXT DEFAULT NULL`);
|
|
997
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_escalation_pending ON tasks(milestone_id, slice_id, escalation_pending)");
|
|
998
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
999
|
+
":version": 17,
|
|
1000
|
+
":applied_at": new Date().toISOString(),
|
|
1001
|
+
});
|
|
1002
|
+
}
|
|
1003
|
+
if (currentVersion < 18) {
|
|
1004
|
+
// Memory system Phase 2: scope + tags on memories, plus memory_sources
|
|
1005
|
+
// table for raw ingested content (notes, files, URLs, artifacts).
|
|
1006
|
+
ensureColumn(db, "memories", "scope", `ALTER TABLE memories ADD COLUMN scope TEXT NOT NULL DEFAULT 'project'`);
|
|
1007
|
+
ensureColumn(db, "memories", "tags", `ALTER TABLE memories ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'`);
|
|
1008
|
+
db.exec(`
|
|
1009
|
+
CREATE TABLE IF NOT EXISTS memory_sources (
|
|
1010
|
+
id TEXT PRIMARY KEY,
|
|
1011
|
+
kind TEXT NOT NULL,
|
|
1012
|
+
uri TEXT,
|
|
1013
|
+
title TEXT,
|
|
1014
|
+
content TEXT NOT NULL,
|
|
1015
|
+
content_hash TEXT NOT NULL UNIQUE,
|
|
1016
|
+
imported_at TEXT NOT NULL,
|
|
1017
|
+
scope TEXT NOT NULL DEFAULT 'project',
|
|
1018
|
+
tags TEXT NOT NULL DEFAULT '[]'
|
|
1019
|
+
)
|
|
1020
|
+
`);
|
|
1021
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope)");
|
|
1022
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_kind ON memory_sources(kind)");
|
|
1023
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_scope ON memory_sources(scope)");
|
|
1024
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
1025
|
+
":version": 18,
|
|
1026
|
+
":applied_at": new Date().toISOString(),
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
if (currentVersion < 19) {
|
|
1030
|
+
// Memory system Phase 3: embeddings + FTS5 for hybrid retrieval.
|
|
1031
|
+
db.exec(`
|
|
1032
|
+
CREATE TABLE IF NOT EXISTS memory_embeddings (
|
|
1033
|
+
memory_id TEXT PRIMARY KEY,
|
|
1034
|
+
model TEXT NOT NULL,
|
|
1035
|
+
dim INTEGER NOT NULL,
|
|
1036
|
+
vector BLOB NOT NULL,
|
|
1037
|
+
updated_at TEXT NOT NULL
|
|
1038
|
+
)
|
|
1039
|
+
`);
|
|
1040
|
+
tryCreateMemoriesFts(db);
|
|
1041
|
+
// Backfill FTS5 with any existing memories (triggers only cover future writes).
|
|
1042
|
+
if (isMemoriesFtsAvailable(db)) {
|
|
1043
|
+
try {
|
|
1044
|
+
db.exec(`INSERT INTO memories_fts(rowid, content) SELECT seq, content FROM memories`);
|
|
1045
|
+
}
|
|
1046
|
+
catch (err) {
|
|
1047
|
+
logWarning("db", `FTS5 backfill failed: ${err.message}`);
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
1051
|
+
":version": 19,
|
|
1052
|
+
":applied_at": new Date().toISOString(),
|
|
1053
|
+
});
|
|
1054
|
+
}
|
|
1055
|
+
if (currentVersion < 20) {
|
|
1056
|
+
// Memory system Phase 4: knowledge-graph relations between memories.
|
|
1057
|
+
db.exec(`
|
|
1058
|
+
CREATE TABLE IF NOT EXISTS memory_relations (
|
|
1059
|
+
from_id TEXT NOT NULL,
|
|
1060
|
+
to_id TEXT NOT NULL,
|
|
1061
|
+
rel TEXT NOT NULL,
|
|
1062
|
+
confidence REAL NOT NULL DEFAULT 0.8,
|
|
1063
|
+
created_at TEXT NOT NULL,
|
|
1064
|
+
PRIMARY KEY (from_id, to_id, rel)
|
|
1065
|
+
)
|
|
1066
|
+
`);
|
|
1067
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_from ON memory_relations(from_id)");
|
|
1068
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_to ON memory_relations(to_id)");
|
|
1069
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
1070
|
+
":version": 20,
|
|
1071
|
+
":applied_at": new Date().toISOString(),
|
|
1072
|
+
});
|
|
1073
|
+
}
|
|
1074
|
+
if (currentVersion < 21) {
|
|
1075
|
+
// ADR-013 Step 2: preserve structured fields (gsd_save_decision's
|
|
1076
|
+
// scope/decision/choice/rationale/made_by/revisable) on memories rows so
|
|
1077
|
+
// the eventual decisions->memories cutover does not lose schema fidelity.
|
|
1078
|
+
// Nullable JSON column — existing rows stay NULL until backfilled in Step 5.
|
|
1079
|
+
// Use ensureColumn for race-safety (matches v15-v18 pattern; bare ALTER
|
|
1080
|
+
// throws "duplicate column" on the loser of a concurrent open race even
|
|
1081
|
+
// though the transaction wrapper protects the schema_version row).
|
|
1082
|
+
ensureColumn(db, "memories", "structured_fields", "ALTER TABLE memories ADD COLUMN structured_fields TEXT DEFAULT NULL");
|
|
1083
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
1084
|
+
":version": 21,
|
|
1085
|
+
":applied_at": new Date().toISOString(),
|
|
1086
|
+
});
|
|
1087
|
+
}
|
|
864
1088
|
db.exec("COMMIT");
|
|
865
1089
|
}
|
|
866
1090
|
catch (err) {
|
|
@@ -873,6 +1097,8 @@ let currentPath = null;
|
|
|
873
1097
|
let currentPid = 0;
|
|
874
1098
|
let _exitHandlerRegistered = false;
|
|
875
1099
|
let _dbOpenAttempted = false;
|
|
1100
|
+
let _lastDbError = null;
|
|
1101
|
+
let _lastDbPhase = null;
|
|
876
1102
|
export function getDbProvider() {
|
|
877
1103
|
loadProvider();
|
|
878
1104
|
return providerName;
|
|
@@ -889,13 +1115,54 @@ export function isDbAvailable() {
|
|
|
889
1115
|
export function wasDbOpenAttempted() {
|
|
890
1116
|
return _dbOpenAttempted;
|
|
891
1117
|
}
|
|
1118
|
+
export function getDbStatus() {
|
|
1119
|
+
loadProvider();
|
|
1120
|
+
return {
|
|
1121
|
+
available: currentDb !== null,
|
|
1122
|
+
provider: providerName,
|
|
1123
|
+
attempted: _dbOpenAttempted,
|
|
1124
|
+
lastError: _lastDbError,
|
|
1125
|
+
lastPhase: _lastDbPhase,
|
|
1126
|
+
};
|
|
1127
|
+
}
|
|
892
1128
|
export function openDatabase(path) {
|
|
893
1129
|
_dbOpenAttempted = true;
|
|
894
1130
|
if (currentDb && currentPath !== path)
|
|
895
1131
|
closeDatabase();
|
|
896
1132
|
if (currentDb && currentPath === path)
|
|
897
1133
|
return true;
|
|
898
|
-
|
|
1134
|
+
// Reset error state only when a new open attempt is actually going to run.
|
|
1135
|
+
_lastDbError = null;
|
|
1136
|
+
_lastDbPhase = null;
|
|
1137
|
+
let rawDb;
|
|
1138
|
+
let fallbackProvider = null;
|
|
1139
|
+
let fallbackModule = null;
|
|
1140
|
+
try {
|
|
1141
|
+
rawDb = openRawDb(path);
|
|
1142
|
+
}
|
|
1143
|
+
catch (primaryErr) {
|
|
1144
|
+
_lastDbPhase = "open";
|
|
1145
|
+
_lastDbError = primaryErr instanceof Error ? primaryErr : new Error(String(primaryErr));
|
|
1146
|
+
// node:sqlite loaded but failed to open this file — try better-sqlite3 as fallback.
|
|
1147
|
+
if (providerName === "node:sqlite") {
|
|
1148
|
+
try {
|
|
1149
|
+
const mod = _require("better-sqlite3");
|
|
1150
|
+
const Db = (mod && mod.default) ? mod.default : mod;
|
|
1151
|
+
if (typeof Db === "function") {
|
|
1152
|
+
rawDb = new Db(path);
|
|
1153
|
+
fallbackProvider = "better-sqlite3";
|
|
1154
|
+
fallbackModule = Db;
|
|
1155
|
+
_lastDbError = null;
|
|
1156
|
+
_lastDbPhase = null;
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
catch {
|
|
1160
|
+
// fallback unavailable; surface original error
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
if (!rawDb)
|
|
1164
|
+
throw primaryErr;
|
|
1165
|
+
}
|
|
899
1166
|
if (!rawDb)
|
|
900
1167
|
return false;
|
|
901
1168
|
const adapter = createAdapter(rawDb);
|
|
@@ -913,6 +1180,8 @@ export function openDatabase(path) {
|
|
|
913
1180
|
process.stderr.write("gsd-db: recovered corrupt database via VACUUM\n");
|
|
914
1181
|
}
|
|
915
1182
|
catch (retryErr) {
|
|
1183
|
+
_lastDbPhase = "vacuum-recovery";
|
|
1184
|
+
_lastDbError = retryErr instanceof Error ? retryErr : new Error(String(retryErr));
|
|
916
1185
|
try {
|
|
917
1186
|
adapter.close();
|
|
918
1187
|
}
|
|
@@ -923,15 +1192,22 @@ export function openDatabase(path) {
|
|
|
923
1192
|
}
|
|
924
1193
|
}
|
|
925
1194
|
else {
|
|
1195
|
+
_lastDbPhase = "initSchema";
|
|
1196
|
+
_lastDbError = err instanceof Error ? err : new Error(String(err));
|
|
926
1197
|
try {
|
|
927
1198
|
adapter.close();
|
|
928
1199
|
}
|
|
929
1200
|
catch (e) {
|
|
930
|
-
logWarning("db", `close after
|
|
1201
|
+
logWarning("db", `close after initSchema failed: ${e.message}`);
|
|
931
1202
|
}
|
|
932
1203
|
throw err;
|
|
933
1204
|
}
|
|
934
1205
|
}
|
|
1206
|
+
// Commit fallback provider switch only after open + schema both succeeded.
|
|
1207
|
+
if (fallbackProvider) {
|
|
1208
|
+
providerName = fallbackProvider;
|
|
1209
|
+
providerModule = fallbackModule;
|
|
1210
|
+
}
|
|
935
1211
|
currentDb = adapter;
|
|
936
1212
|
currentPath = path;
|
|
937
1213
|
currentPid = process.pid;
|
|
@@ -970,8 +1246,12 @@ export function closeDatabase() {
|
|
|
970
1246
|
currentDb = null;
|
|
971
1247
|
currentPath = null;
|
|
972
1248
|
currentPid = 0;
|
|
973
|
-
_dbOpenAttempted = false;
|
|
974
1249
|
}
|
|
1250
|
+
// Reset session-scoped state unconditionally so stale error info from a
|
|
1251
|
+
// failed open doesn't persist into the next open attempt or status check.
|
|
1252
|
+
_dbOpenAttempted = false;
|
|
1253
|
+
_lastDbError = null;
|
|
1254
|
+
_lastDbPhase = null;
|
|
975
1255
|
}
|
|
976
1256
|
/** Run a full VACUUM — call sparingly (e.g. after milestone completion). */
|
|
977
1257
|
export function vacuumDatabase() {
|
|
@@ -984,6 +1264,17 @@ export function vacuumDatabase() {
|
|
|
984
1264
|
logWarning("db", `VACUUM failed: ${e.message}`);
|
|
985
1265
|
}
|
|
986
1266
|
}
|
|
1267
|
+
/** Flush WAL into gsd.db so `git add .gsd/gsd.db` stages current state — safe while DB is open. */
|
|
1268
|
+
export function checkpointDatabase() {
|
|
1269
|
+
if (!currentDb)
|
|
1270
|
+
return;
|
|
1271
|
+
try {
|
|
1272
|
+
currentDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
1273
|
+
}
|
|
1274
|
+
catch (e) {
|
|
1275
|
+
logWarning("db", `WAL checkpoint failed: ${e.message}`);
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
987
1278
|
let _txDepth = 0;
|
|
988
1279
|
export function transaction(fn) {
|
|
989
1280
|
if (!currentDb)
|
|
@@ -1061,8 +1352,8 @@ export function readTransaction(fn) {
|
|
|
1061
1352
|
export function insertDecision(d) {
|
|
1062
1353
|
if (!currentDb)
|
|
1063
1354
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1064
|
-
currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
|
|
1065
|
-
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :superseded_by)`).run({
|
|
1355
|
+
currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
|
|
1356
|
+
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :source, :superseded_by)`).run({
|
|
1066
1357
|
":id": d.id,
|
|
1067
1358
|
":when_context": d.when_context,
|
|
1068
1359
|
":scope": d.scope,
|
|
@@ -1071,6 +1362,7 @@ export function insertDecision(d) {
|
|
|
1071
1362
|
":rationale": d.rationale,
|
|
1072
1363
|
":revisable": d.revisable,
|
|
1073
1364
|
":made_by": d.made_by ?? "agent",
|
|
1365
|
+
":source": d.source ?? "discussion",
|
|
1074
1366
|
":superseded_by": d.superseded_by,
|
|
1075
1367
|
});
|
|
1076
1368
|
}
|
|
@@ -1090,6 +1382,7 @@ export function getDecisionById(id) {
|
|
|
1090
1382
|
rationale: row["rationale"],
|
|
1091
1383
|
revisable: row["revisable"],
|
|
1092
1384
|
made_by: row["made_by"] ?? "agent",
|
|
1385
|
+
source: row["source"] ?? "discussion",
|
|
1093
1386
|
superseded_by: row["superseded_by"] ?? null,
|
|
1094
1387
|
};
|
|
1095
1388
|
}
|
|
@@ -1107,6 +1400,7 @@ export function getActiveDecisions() {
|
|
|
1107
1400
|
rationale: row["rationale"],
|
|
1108
1401
|
revisable: row["revisable"],
|
|
1109
1402
|
made_by: row["made_by"] ?? "agent",
|
|
1403
|
+
source: row["source"] ?? "discussion",
|
|
1110
1404
|
superseded_by: null,
|
|
1111
1405
|
}));
|
|
1112
1406
|
}
|
|
@@ -1189,8 +1483,8 @@ export function upsertDecision(d) {
|
|
|
1189
1483
|
// Use ON CONFLICT DO UPDATE instead of INSERT OR REPLACE to preserve the
|
|
1190
1484
|
// seq column. INSERT OR REPLACE deletes then reinserts, resetting seq and
|
|
1191
1485
|
// corrupting decision ordering in DECISIONS.md after reconcile replay.
|
|
1192
|
-
currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
|
|
1193
|
-
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :superseded_by)
|
|
1486
|
+
currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
|
|
1487
|
+
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :source, :superseded_by)
|
|
1194
1488
|
ON CONFLICT(id) DO UPDATE SET
|
|
1195
1489
|
when_context = excluded.when_context,
|
|
1196
1490
|
scope = excluded.scope,
|
|
@@ -1199,6 +1493,7 @@ export function upsertDecision(d) {
|
|
|
1199
1493
|
rationale = excluded.rationale,
|
|
1200
1494
|
revisable = excluded.revisable,
|
|
1201
1495
|
made_by = excluded.made_by,
|
|
1496
|
+
source = excluded.source,
|
|
1202
1497
|
superseded_by = excluded.superseded_by`).run({
|
|
1203
1498
|
":id": d.id,
|
|
1204
1499
|
":when_context": d.when_context,
|
|
@@ -1208,6 +1503,7 @@ export function upsertDecision(d) {
|
|
|
1208
1503
|
":rationale": d.rationale,
|
|
1209
1504
|
":revisable": d.revisable,
|
|
1210
1505
|
":made_by": d.made_by ?? "agent",
|
|
1506
|
+
":source": d.source ?? "discussion",
|
|
1211
1507
|
":superseded_by": d.superseded_by ?? null,
|
|
1212
1508
|
});
|
|
1213
1509
|
}
|
|
@@ -1327,10 +1623,12 @@ export function insertSlice(s) {
|
|
|
1327
1623
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1328
1624
|
currentDb.prepare(`INSERT INTO slices (
|
|
1329
1625
|
milestone_id, id, title, status, risk, depends, demo, created_at,
|
|
1330
|
-
goal, success_criteria, proof_level, integration_closure, observability_impact, sequence
|
|
1626
|
+
goal, success_criteria, proof_level, integration_closure, observability_impact, sequence,
|
|
1627
|
+
is_sketch, sketch_scope
|
|
1331
1628
|
) VALUES (
|
|
1332
1629
|
:milestone_id, :id, :title, :status, :risk, :depends, :demo, :created_at,
|
|
1333
|
-
:goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :sequence
|
|
1630
|
+
:goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :sequence,
|
|
1631
|
+
:is_sketch, :sketch_scope
|
|
1334
1632
|
)
|
|
1335
1633
|
ON CONFLICT (milestone_id, id) DO UPDATE SET
|
|
1336
1634
|
title = CASE WHEN :raw_title IS NOT NULL THEN excluded.title ELSE slices.title END,
|
|
@@ -1343,7 +1641,9 @@ export function insertSlice(s) {
|
|
|
1343
1641
|
proof_level = CASE WHEN :raw_proof_level IS NOT NULL THEN excluded.proof_level ELSE slices.proof_level END,
|
|
1344
1642
|
integration_closure = CASE WHEN :raw_integration_closure IS NOT NULL THEN excluded.integration_closure ELSE slices.integration_closure END,
|
|
1345
1643
|
observability_impact = CASE WHEN :raw_observability_impact IS NOT NULL THEN excluded.observability_impact ELSE slices.observability_impact END,
|
|
1346
|
-
sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END
|
|
1644
|
+
sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END,
|
|
1645
|
+
is_sketch = CASE WHEN :raw_is_sketch IS NOT NULL THEN excluded.is_sketch ELSE slices.is_sketch END,
|
|
1646
|
+
sketch_scope = CASE WHEN :raw_sketch_scope IS NOT NULL THEN excluded.sketch_scope ELSE slices.sketch_scope END`).run({
|
|
1347
1647
|
":milestone_id": s.milestoneId,
|
|
1348
1648
|
":id": s.id,
|
|
1349
1649
|
":title": s.title ?? "",
|
|
@@ -1358,6 +1658,8 @@ export function insertSlice(s) {
|
|
|
1358
1658
|
":integration_closure": s.planning?.integrationClosure ?? "",
|
|
1359
1659
|
":observability_impact": s.planning?.observabilityImpact ?? "",
|
|
1360
1660
|
":sequence": s.sequence ?? 0,
|
|
1661
|
+
":is_sketch": s.isSketch ? 1 : 0,
|
|
1662
|
+
":sketch_scope": s.sketchScope ?? "",
|
|
1361
1663
|
// Raw sentinel params: NULL when caller omitted the field, used in ON CONFLICT guards
|
|
1362
1664
|
":raw_title": s.title ?? null,
|
|
1363
1665
|
":raw_risk": s.risk ?? null,
|
|
@@ -1368,8 +1670,47 @@ export function insertSlice(s) {
|
|
|
1368
1670
|
":raw_integration_closure": s.planning?.integrationClosure ?? null,
|
|
1369
1671
|
":raw_observability_impact": s.planning?.observabilityImpact ?? null,
|
|
1370
1672
|
":raw_sequence": s.sequence ?? null,
|
|
1673
|
+
":raw_is_sketch": s.isSketch === undefined ? null : (s.isSketch ? 1 : 0),
|
|
1674
|
+
// NOTE: use !== undefined (not ??) so an explicit empty string "" is treated
|
|
1675
|
+
// as a present value and correctly clears the existing sketch_scope on
|
|
1676
|
+
// CONFLICT. ?? would incorrectly preserve the stale value.
|
|
1677
|
+
":raw_sketch_scope": s.sketchScope !== undefined ? s.sketchScope : null,
|
|
1371
1678
|
});
|
|
1372
1679
|
}
|
|
1680
|
+
// ADR-011: sketch-then-refine helpers
|
|
1681
|
+
export function setSliceSketchFlag(milestoneId, sliceId, isSketch) {
|
|
1682
|
+
if (!currentDb)
|
|
1683
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1684
|
+
currentDb.prepare(`UPDATE slices SET is_sketch = :is_sketch WHERE milestone_id = :mid AND id = :sid`).run({ ":is_sketch": isSketch ? 1 : 0, ":mid": milestoneId, ":sid": sliceId });
|
|
1685
|
+
}
|
|
1686
|
+
/**
|
|
1687
|
+
* ADR-011 auto-heal: reconcile stale is_sketch=1 rows whose PLAN already exists.
|
|
1688
|
+
*
|
|
1689
|
+
* Callers pass a predicate that resolves whether a plan file exists for a slice.
|
|
1690
|
+
* The predicate MUST use the canonical path resolver (`resolveSliceFile`, etc.)
|
|
1691
|
+
* to keep path logic in one place — do not hand-roll the path inside the callback.
|
|
1692
|
+
*
|
|
1693
|
+
* Recovers from two scenarios:
|
|
1694
|
+
* 1. Crash between `gsd_plan_slice` write and the sketch flag flip.
|
|
1695
|
+
* 2. Flag-OFF downgrade path: when `progressive_planning` is off, the dispatch
|
|
1696
|
+
* rule routes sketch slices to plan-slice, which writes PLAN.md but leaves
|
|
1697
|
+
* `is_sketch=1` — the next state derivation auto-heals it to 0 here.
|
|
1698
|
+
*
|
|
1699
|
+
* Not aggressive in practice: PLAN.md is only written via the DB-backed
|
|
1700
|
+
* `gsd_plan_slice` tool (which also inserts tasks), so a "stale PLAN.md with
|
|
1701
|
+
* is_sketch=1" is extremely unlikely to indicate anything other than the two
|
|
1702
|
+
* recovery scenarios above.
|
|
1703
|
+
*/
|
|
1704
|
+
export function autoHealSketchFlags(milestoneId, hasPlanFile) {
|
|
1705
|
+
if (!currentDb)
|
|
1706
|
+
return;
|
|
1707
|
+
const rows = currentDb.prepare(`SELECT id FROM slices WHERE milestone_id = :mid AND is_sketch = 1`).all({ ":mid": milestoneId });
|
|
1708
|
+
for (const row of rows) {
|
|
1709
|
+
if (hasPlanFile(row.id)) {
|
|
1710
|
+
setSliceSketchFlag(milestoneId, row.id, false);
|
|
1711
|
+
}
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1373
1714
|
export function upsertSlicePlanning(milestoneId, sliceId, planning) {
|
|
1374
1715
|
if (!currentDb)
|
|
1375
1716
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
@@ -1516,6 +1857,8 @@ function rowToSlice(row) {
|
|
|
1516
1857
|
observability_impact: row["observability_impact"] ?? "",
|
|
1517
1858
|
sequence: row["sequence"] ?? 0,
|
|
1518
1859
|
replan_triggered_at: row["replan_triggered_at"] ?? null,
|
|
1860
|
+
is_sketch: row["is_sketch"] ?? 0,
|
|
1861
|
+
sketch_scope: row["sketch_scope"] ?? "",
|
|
1519
1862
|
};
|
|
1520
1863
|
}
|
|
1521
1864
|
export function getSlice(milestoneId, sliceId) {
|
|
@@ -1616,6 +1959,11 @@ function rowToTask(row) {
|
|
|
1616
1959
|
observability_impact: row["observability_impact"] ?? "",
|
|
1617
1960
|
full_plan_md: row["full_plan_md"] ?? "",
|
|
1618
1961
|
sequence: row["sequence"] ?? 0,
|
|
1962
|
+
blocker_source: row["blocker_source"] ?? "",
|
|
1963
|
+
escalation_pending: row["escalation_pending"] ?? 0,
|
|
1964
|
+
escalation_awaiting_review: row["escalation_awaiting_review"] ?? 0,
|
|
1965
|
+
escalation_artifact_path: row["escalation_artifact_path"] ?? null,
|
|
1966
|
+
escalation_override_applied_at: row["escalation_override_applied_at"] ?? null,
|
|
1619
1967
|
};
|
|
1620
1968
|
}
|
|
1621
1969
|
export function getTask(milestoneId, sliceId, taskId) {
|
|
@@ -1632,6 +1980,95 @@ export function getSliceTasks(milestoneId, sliceId) {
|
|
|
1632
1980
|
const rows = currentDb.prepare("SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid ORDER BY sequence, id").all({ ":mid": milestoneId, ":sid": sliceId });
|
|
1633
1981
|
return rows.map(rowToTask);
|
|
1634
1982
|
}
|
|
1983
|
+
// ─── ADR-011 Phase 2 escalation helpers ──────────────────────────────────
|
|
1984
|
+
/** Set pause-on-escalation state on a completed task. Mutually exclusive with awaiting_review. */
|
|
1985
|
+
export function setTaskEscalationPending(milestoneId, sliceId, taskId, artifactPath) {
|
|
1986
|
+
if (!currentDb)
|
|
1987
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1988
|
+
currentDb.prepare(`UPDATE tasks
|
|
1989
|
+
SET escalation_pending = 1,
|
|
1990
|
+
escalation_awaiting_review = 0,
|
|
1991
|
+
escalation_artifact_path = :path
|
|
1992
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":path": artifactPath, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
1993
|
+
}
|
|
1994
|
+
/** Set awaiting-review state (artifact exists but continueWithDefault=true, no pause). Mutually exclusive with pending. */
|
|
1995
|
+
export function setTaskEscalationAwaitingReview(milestoneId, sliceId, taskId, artifactPath) {
|
|
1996
|
+
if (!currentDb)
|
|
1997
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1998
|
+
currentDb.prepare(`UPDATE tasks
|
|
1999
|
+
SET escalation_awaiting_review = 1,
|
|
2000
|
+
escalation_pending = 0,
|
|
2001
|
+
escalation_artifact_path = :path
|
|
2002
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":path": artifactPath, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
2003
|
+
}
|
|
2004
|
+
/** Clear escalation-pending and awaiting-review flags once the user has resolved it. */
|
|
2005
|
+
export function clearTaskEscalationFlags(milestoneId, sliceId, taskId) {
|
|
2006
|
+
if (!currentDb)
|
|
2007
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2008
|
+
currentDb.prepare(`UPDATE tasks
|
|
2009
|
+
SET escalation_pending = 0,
|
|
2010
|
+
escalation_awaiting_review = 0
|
|
2011
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
2012
|
+
}
|
|
2013
|
+
/**
|
|
2014
|
+
* Atomically claim a resolved escalation override for injection into a downstream
|
|
2015
|
+
* task's prompt. Returns true if this caller claimed it (must inject), false if
|
|
2016
|
+
* another caller already claimed it (must skip).
|
|
2017
|
+
*/
|
|
2018
|
+
export function claimEscalationOverride(milestoneId, sliceId, sourceTaskId) {
|
|
2019
|
+
if (!currentDb)
|
|
2020
|
+
return false;
|
|
2021
|
+
const now = new Date().toISOString();
|
|
2022
|
+
const result = currentDb.prepare(`UPDATE tasks
|
|
2023
|
+
SET escalation_override_applied_at = :now
|
|
2024
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid
|
|
2025
|
+
AND escalation_override_applied_at IS NULL
|
|
2026
|
+
AND escalation_artifact_path IS NOT NULL`).run({ ":now": now, ":mid": milestoneId, ":sid": sliceId, ":tid": sourceTaskId });
|
|
2027
|
+
// node:sqlite + better-sqlite3 both surface `changes` on the run result.
|
|
2028
|
+
const changes = result.changes ?? 0;
|
|
2029
|
+
return changes > 0;
|
|
2030
|
+
}
|
|
2031
|
+
/** Find the most recent resolved-but-unapplied escalation override in a slice. */
|
|
2032
|
+
export function findUnappliedEscalationOverride(milestoneId, sliceId) {
|
|
2033
|
+
if (!currentDb)
|
|
2034
|
+
return null;
|
|
2035
|
+
// Filter BOTH flags: escalation_pending=0 AND escalation_awaiting_review=0
|
|
2036
|
+
// ensures we only claim overrides the user has explicitly resolved.
|
|
2037
|
+
// Without the awaiting_review filter, continueWithDefault=true artifacts
|
|
2038
|
+
// (not yet responded to) would be prematurely claimed, causing the override
|
|
2039
|
+
// to be lost when the user later resolves (#ADR-011 Phase 2 peer-review Bug 2).
|
|
2040
|
+
const row = currentDb.prepare(`SELECT id, escalation_artifact_path AS path
|
|
2041
|
+
FROM tasks
|
|
2042
|
+
WHERE milestone_id = :mid AND slice_id = :sid
|
|
2043
|
+
AND escalation_artifact_path IS NOT NULL
|
|
2044
|
+
AND escalation_override_applied_at IS NULL
|
|
2045
|
+
AND escalation_pending = 0
|
|
2046
|
+
AND escalation_awaiting_review = 0
|
|
2047
|
+
ORDER BY sequence DESC, id DESC
|
|
2048
|
+
LIMIT 1`).get({ ":mid": milestoneId, ":sid": sliceId });
|
|
2049
|
+
if (!row || !row.path)
|
|
2050
|
+
return null;
|
|
2051
|
+
return { taskId: row.id, artifactPath: row.path };
|
|
2052
|
+
}
|
|
2053
|
+
/** Set the blocker_source provenance field (used when rejecting an escalation). */
|
|
2054
|
+
export function setTaskBlockerSource(milestoneId, sliceId, taskId, source) {
|
|
2055
|
+
if (!currentDb)
|
|
2056
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2057
|
+
currentDb.prepare(`UPDATE tasks
|
|
2058
|
+
SET blocker_discovered = 1,
|
|
2059
|
+
blocker_source = :src
|
|
2060
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":src": source, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
2061
|
+
}
|
|
2062
|
+
/** List tasks with active escalation artifacts across a milestone (for /gsd escalate list). */
|
|
2063
|
+
export function listEscalationArtifacts(milestoneId, includeResolved = false) {
|
|
2064
|
+
if (!currentDb)
|
|
2065
|
+
return [];
|
|
2066
|
+
const filter = includeResolved
|
|
2067
|
+
? "escalation_artifact_path IS NOT NULL"
|
|
2068
|
+
: "(escalation_pending = 1 OR escalation_awaiting_review = 1) AND escalation_artifact_path IS NOT NULL";
|
|
2069
|
+
const rows = currentDb.prepare(`SELECT * FROM tasks WHERE milestone_id = :mid AND ${filter} ORDER BY slice_id, sequence, id`).all({ ":mid": milestoneId });
|
|
2070
|
+
return rows.map(rowToTask);
|
|
2071
|
+
}
|
|
1635
2072
|
export function insertVerificationEvidence(e) {
|
|
1636
2073
|
if (!currentDb)
|
|
1637
2074
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
@@ -1862,6 +2299,19 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1862
2299
|
try {
|
|
1863
2300
|
const wtInfo = adapter.prepare("PRAGMA wt.table_info('decisions')").all();
|
|
1864
2301
|
const hasMadeBy = wtInfo.some((col) => col["name"] === "made_by");
|
|
2302
|
+
// ADR-011: worktree may predate schema v16/v17. For missing columns we
|
|
2303
|
+
// fall through to the main DB's existing value (not a literal default)
|
|
2304
|
+
// so reconcile never silently clears state the main tree has recorded.
|
|
2305
|
+
const hasDecisionSource = wtInfo.some((col) => col["name"] === "source");
|
|
2306
|
+
const wtSliceInfo = adapter.prepare("PRAGMA wt.table_info('slices')").all();
|
|
2307
|
+
const hasIsSketch = wtSliceInfo.some((col) => col["name"] === "is_sketch");
|
|
2308
|
+
const hasSketchScope = wtSliceInfo.some((col) => col["name"] === "sketch_scope");
|
|
2309
|
+
const wtTaskInfo = adapter.prepare("PRAGMA wt.table_info('tasks')").all();
|
|
2310
|
+
const hasBlockerSource = wtTaskInfo.some((col) => col["name"] === "blocker_source");
|
|
2311
|
+
const hasEscalationPending = wtTaskInfo.some((col) => col["name"] === "escalation_pending");
|
|
2312
|
+
const hasEscalationAwaiting = wtTaskInfo.some((col) => col["name"] === "escalation_awaiting_review");
|
|
2313
|
+
const hasEscalationArtifact = wtTaskInfo.some((col) => col["name"] === "escalation_artifact_path");
|
|
2314
|
+
const hasEscalationOverride = wtTaskInfo.some((col) => col["name"] === "escalation_override_applied_at");
|
|
1865
2315
|
const decConf = adapter.prepare(`SELECT m.id FROM decisions m INNER JOIN wt.decisions w ON m.id = w.id WHERE m.decision != w.decision OR m.choice != w.choice OR m.rationale != w.rationale OR ${hasMadeBy ? "m.made_by != w.made_by" : "'agent' != 'agent'"} OR m.superseded_by IS NOT w.superseded_by`).all();
|
|
1866
2316
|
for (const row of decConf)
|
|
1867
2317
|
conflicts.push(`decision ${row["id"]}: modified in both`);
|
|
@@ -1874,11 +2324,16 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1874
2324
|
}
|
|
1875
2325
|
adapter.exec("BEGIN");
|
|
1876
2326
|
try {
|
|
2327
|
+
// Join the target decisions so we can prefer an existing main.source
|
|
2328
|
+
// when the worktree predates v16 — otherwise a write-through reconcile
|
|
2329
|
+
// would clobber 'escalation'-sourced decisions with the literal default.
|
|
1877
2330
|
merged.decisions = countChanges(adapter.prepare(`
|
|
1878
2331
|
INSERT OR REPLACE INTO decisions (
|
|
1879
|
-
id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by
|
|
2332
|
+
id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by
|
|
1880
2333
|
)
|
|
1881
|
-
SELECT id, when_context, scope, decision, choice, rationale, revisable, ${hasMadeBy ? "made_by" : "'agent'"},
|
|
2334
|
+
SELECT w.id, w.when_context, w.scope, w.decision, w.choice, w.rationale, w.revisable, ${hasMadeBy ? "w.made_by" : "COALESCE(m.made_by, 'agent')"}, ${hasDecisionSource ? "w.source" : "COALESCE(m.source, 'discussion')"}, w.superseded_by
|
|
2335
|
+
FROM wt.decisions w
|
|
2336
|
+
LEFT JOIN decisions m ON m.id = w.id
|
|
1882
2337
|
`).run());
|
|
1883
2338
|
merged.requirements = countChanges(adapter.prepare(`
|
|
1884
2339
|
INSERT OR REPLACE INTO requirements (
|
|
@@ -1911,13 +2366,15 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1911
2366
|
FROM wt.milestones
|
|
1912
2367
|
`).run());
|
|
1913
2368
|
// Merge slices — preserve worktree progress but never downgrade completed status (#2558).
|
|
1914
|
-
//
|
|
1915
|
-
//
|
|
2369
|
+
// ADR-011 Phase 1: carry is_sketch + sketch_scope so reconcile doesn't
|
|
2370
|
+
// silently clear sketch metadata. When the worktree predates v16,
|
|
2371
|
+
// fall back to the main DB's existing value rather than a literal 0/''.
|
|
1916
2372
|
merged.slices = countChanges(adapter.prepare(`
|
|
1917
2373
|
INSERT OR REPLACE INTO slices (
|
|
1918
2374
|
milestone_id, id, title, status, risk, depends, demo, created_at, completed_at,
|
|
1919
2375
|
full_summary_md, full_uat_md, goal, success_criteria, proof_level,
|
|
1920
|
-
integration_closure, observability_impact, sequence, replan_triggered_at
|
|
2376
|
+
integration_closure, observability_impact, sequence, replan_triggered_at,
|
|
2377
|
+
is_sketch, sketch_scope
|
|
1921
2378
|
)
|
|
1922
2379
|
SELECT w.milestone_id, w.id, w.title,
|
|
1923
2380
|
CASE
|
|
@@ -1930,18 +2387,24 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1930
2387
|
THEN m.completed_at ELSE w.completed_at
|
|
1931
2388
|
END,
|
|
1932
2389
|
w.full_summary_md, w.full_uat_md, w.goal, w.success_criteria, w.proof_level,
|
|
1933
|
-
w.integration_closure, w.observability_impact, w.sequence, w.replan_triggered_at
|
|
2390
|
+
w.integration_closure, w.observability_impact, w.sequence, w.replan_triggered_at,
|
|
2391
|
+
${hasIsSketch ? "w.is_sketch" : "COALESCE(m.is_sketch, 0)"},
|
|
2392
|
+
${hasSketchScope ? "w.sketch_scope" : "COALESCE(m.sketch_scope, '')"}
|
|
1934
2393
|
FROM wt.slices w
|
|
1935
2394
|
LEFT JOIN slices m ON m.milestone_id = w.milestone_id AND m.id = w.id
|
|
1936
2395
|
`).run());
|
|
1937
|
-
// Merge tasks — preserve execution results, never downgrade completed status (#2558)
|
|
2396
|
+
// Merge tasks — preserve execution results, never downgrade completed status (#2558).
|
|
2397
|
+
// ADR-011 P2: carry blocker_source + escalation_* columns so worktree reconcile
|
|
2398
|
+
// doesn't silently clear escalation state back to defaults.
|
|
1938
2399
|
merged.tasks = countChanges(adapter.prepare(`
|
|
1939
2400
|
INSERT OR REPLACE INTO tasks (
|
|
1940
2401
|
milestone_id, slice_id, id, title, status, one_liner, narrative,
|
|
1941
2402
|
verification_result, duration, completed_at, blocker_discovered,
|
|
1942
2403
|
deviations, known_issues, key_files, key_decisions, full_summary_md,
|
|
1943
2404
|
description, estimate, files, verify, inputs, expected_output,
|
|
1944
|
-
observability_impact, full_plan_md, sequence
|
|
2405
|
+
observability_impact, full_plan_md, sequence,
|
|
2406
|
+
blocker_source, escalation_pending, escalation_awaiting_review,
|
|
2407
|
+
escalation_artifact_path, escalation_override_applied_at
|
|
1945
2408
|
)
|
|
1946
2409
|
SELECT w.milestone_id, w.slice_id, w.id, w.title,
|
|
1947
2410
|
CASE
|
|
@@ -1957,7 +2420,12 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1957
2420
|
w.blocker_discovered,
|
|
1958
2421
|
w.deviations, w.known_issues, w.key_files, w.key_decisions, w.full_summary_md,
|
|
1959
2422
|
w.description, w.estimate, w.files, w.verify, w.inputs, w.expected_output,
|
|
1960
|
-
w.observability_impact, w.full_plan_md, w.sequence
|
|
2423
|
+
w.observability_impact, w.full_plan_md, w.sequence,
|
|
2424
|
+
${hasBlockerSource ? "w.blocker_source" : "COALESCE(m.blocker_source, '')"},
|
|
2425
|
+
${hasEscalationPending ? "w.escalation_pending" : "COALESCE(m.escalation_pending, 0)"},
|
|
2426
|
+
${hasEscalationAwaiting ? "w.escalation_awaiting_review" : "COALESCE(m.escalation_awaiting_review, 0)"},
|
|
2427
|
+
${hasEscalationArtifact ? "w.escalation_artifact_path" : "m.escalation_artifact_path"},
|
|
2428
|
+
${hasEscalationOverride ? "w.escalation_override_applied_at" : "m.escalation_override_applied_at"}
|
|
1961
2429
|
FROM wt.tasks w
|
|
1962
2430
|
LEFT JOIN tasks m ON m.milestone_id = w.milestone_id AND m.slice_id = w.slice_id AND m.id = w.id
|
|
1963
2431
|
`).run());
|
|
@@ -2489,30 +2957,32 @@ export function restoreManifest(manifest) {
|
|
|
2489
2957
|
for (const m of manifest.milestones) {
|
|
2490
2958
|
msStmt.run(m.id, m.title, m.status, JSON.stringify(m.depends_on), m.created_at, m.completed_at, m.vision, JSON.stringify(m.success_criteria), JSON.stringify(m.key_risks), JSON.stringify(m.proof_strategy), m.verification_contract, m.verification_integration, m.verification_operational, m.verification_uat, JSON.stringify(m.definition_of_done), m.requirement_coverage, m.boundary_map_markdown);
|
|
2491
2959
|
}
|
|
2492
|
-
// Restore slices
|
|
2960
|
+
// Restore slices (ADR-011 Phase 1: includes is_sketch + sketch_scope)
|
|
2493
2961
|
const slStmt = db.prepare(`INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
|
|
2494
2962
|
created_at, completed_at, full_summary_md, full_uat_md,
|
|
2495
2963
|
goal, success_criteria, proof_level, integration_closure, observability_impact,
|
|
2496
|
-
sequence, replan_triggered_at)
|
|
2497
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
2964
|
+
sequence, replan_triggered_at, is_sketch, sketch_scope)
|
|
2965
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
2498
2966
|
for (const s of manifest.slices) {
|
|
2499
|
-
slStmt.run(s.milestone_id, s.id, s.title, s.status, s.risk, JSON.stringify(s.depends), s.demo, s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md, s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact, s.sequence, s.replan_triggered_at);
|
|
2967
|
+
slStmt.run(s.milestone_id, s.id, s.title, s.status, s.risk, JSON.stringify(s.depends), s.demo, s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md, s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact, s.sequence, s.replan_triggered_at, s.is_sketch ?? 0, s.sketch_scope ?? "");
|
|
2500
2968
|
}
|
|
2501
|
-
// Restore tasks
|
|
2969
|
+
// Restore tasks (ADR-011 P2: includes blocker_source + escalation_* columns)
|
|
2502
2970
|
const tkStmt = db.prepare(`INSERT INTO tasks (milestone_id, slice_id, id, title, status,
|
|
2503
2971
|
one_liner, narrative, verification_result, duration, completed_at,
|
|
2504
2972
|
blocker_discovered, deviations, known_issues, key_files, key_decisions,
|
|
2505
2973
|
full_summary_md, description, estimate, files, verify,
|
|
2506
|
-
inputs, expected_output, observability_impact, sequence
|
|
2507
|
-
|
|
2974
|
+
inputs, expected_output, observability_impact, sequence,
|
|
2975
|
+
blocker_source, escalation_pending, escalation_awaiting_review,
|
|
2976
|
+
escalation_artifact_path, escalation_override_applied_at)
|
|
2977
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
2508
2978
|
for (const t of manifest.tasks) {
|
|
2509
|
-
tkStmt.run(t.milestone_id, t.slice_id, t.id, t.title, t.status, t.one_liner, t.narrative, t.verification_result, t.duration, t.completed_at, t.blocker_discovered ? 1 : 0, t.deviations, t.known_issues, JSON.stringify(t.key_files), JSON.stringify(t.key_decisions), t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify, JSON.stringify(t.inputs), JSON.stringify(t.expected_output), t.observability_impact, t.sequence);
|
|
2979
|
+
tkStmt.run(t.milestone_id, t.slice_id, t.id, t.title, t.status, t.one_liner, t.narrative, t.verification_result, t.duration, t.completed_at, t.blocker_discovered ? 1 : 0, t.deviations, t.known_issues, JSON.stringify(t.key_files), JSON.stringify(t.key_decisions), t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify, JSON.stringify(t.inputs), JSON.stringify(t.expected_output), t.observability_impact, t.sequence, t.blocker_source ?? "", t.escalation_pending ?? 0, t.escalation_awaiting_review ?? 0, t.escalation_artifact_path ?? null, t.escalation_override_applied_at ?? null);
|
|
2510
2980
|
}
|
|
2511
|
-
// Restore decisions
|
|
2512
|
-
const dcStmt = db.prepare(`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
|
|
2513
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
2981
|
+
// Restore decisions (ADR-011 P2: include source so escalation decisions survive)
|
|
2982
|
+
const dcStmt = db.prepare(`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
|
|
2983
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
2514
2984
|
for (const d of manifest.decisions) {
|
|
2515
|
-
dcStmt.run(d.seq, d.id, d.when_context, d.scope, d.decision, d.choice, d.rationale, d.revisable, d.made_by, d.superseded_by);
|
|
2985
|
+
dcStmt.run(d.seq, d.id, d.when_context, d.scope, d.decision, d.choice, d.rationale, d.revisable, d.made_by, d.source ?? "discussion", d.superseded_by);
|
|
2516
2986
|
}
|
|
2517
2987
|
// Restore verification evidence
|
|
2518
2988
|
const evStmt = db.prepare(`INSERT INTO verification_evidence (task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at)
|
|
@@ -2560,8 +3030,8 @@ export function bulkInsertLegacyHierarchy(payload) {
|
|
|
2560
3030
|
export function insertMemoryRow(args) {
|
|
2561
3031
|
if (!currentDb)
|
|
2562
3032
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2563
|
-
currentDb.prepare(`INSERT INTO memories (id, category, content, confidence, source_unit_type, source_unit_id, created_at, updated_at)
|
|
2564
|
-
VALUES (:id, :category, :content, :confidence, :source_unit_type, :source_unit_id, :created_at, :updated_at)`).run({
|
|
3033
|
+
currentDb.prepare(`INSERT INTO memories (id, category, content, confidence, source_unit_type, source_unit_id, created_at, updated_at, scope, tags, structured_fields)
|
|
3034
|
+
VALUES (:id, :category, :content, :confidence, :source_unit_type, :source_unit_id, :created_at, :updated_at, :scope, :tags, :structured_fields)`).run({
|
|
2565
3035
|
":id": args.id,
|
|
2566
3036
|
":category": args.category,
|
|
2567
3037
|
":content": args.content,
|
|
@@ -2570,8 +3040,79 @@ export function insertMemoryRow(args) {
|
|
|
2570
3040
|
":source_unit_id": args.sourceUnitId,
|
|
2571
3041
|
":created_at": args.createdAt,
|
|
2572
3042
|
":updated_at": args.updatedAt,
|
|
3043
|
+
":scope": args.scope ?? "project",
|
|
3044
|
+
":tags": JSON.stringify(args.tags ?? []),
|
|
3045
|
+
":structured_fields": args.structuredFields == null ? null : JSON.stringify(args.structuredFields),
|
|
3046
|
+
});
|
|
3047
|
+
}
|
|
3048
|
+
export function insertMemorySourceRow(args) {
|
|
3049
|
+
if (!currentDb)
|
|
3050
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3051
|
+
currentDb.prepare(`INSERT OR IGNORE INTO memory_sources (id, kind, uri, title, content, content_hash, imported_at, scope, tags)
|
|
3052
|
+
VALUES (:id, :kind, :uri, :title, :content, :content_hash, :imported_at, :scope, :tags)`).run({
|
|
3053
|
+
":id": args.id,
|
|
3054
|
+
":kind": args.kind,
|
|
3055
|
+
":uri": args.uri,
|
|
3056
|
+
":title": args.title,
|
|
3057
|
+
":content": args.content,
|
|
3058
|
+
":content_hash": args.contentHash,
|
|
3059
|
+
":imported_at": args.importedAt,
|
|
3060
|
+
":scope": args.scope ?? "project",
|
|
3061
|
+
":tags": JSON.stringify(args.tags ?? []),
|
|
3062
|
+
});
|
|
3063
|
+
}
|
|
3064
|
+
export function deleteMemorySourceRow(id) {
|
|
3065
|
+
if (!currentDb)
|
|
3066
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3067
|
+
const res = currentDb
|
|
3068
|
+
.prepare("DELETE FROM memory_sources WHERE id = :id")
|
|
3069
|
+
.run({ ":id": id });
|
|
3070
|
+
return (res?.changes ?? 0) > 0;
|
|
3071
|
+
}
|
|
3072
|
+
export function upsertMemoryEmbedding(args) {
|
|
3073
|
+
if (!currentDb)
|
|
3074
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3075
|
+
currentDb.prepare(`INSERT INTO memory_embeddings (memory_id, model, dim, vector, updated_at)
|
|
3076
|
+
VALUES (:memory_id, :model, :dim, :vector, :updated_at)
|
|
3077
|
+
ON CONFLICT(memory_id) DO UPDATE SET
|
|
3078
|
+
model = excluded.model,
|
|
3079
|
+
dim = excluded.dim,
|
|
3080
|
+
vector = excluded.vector,
|
|
3081
|
+
updated_at = excluded.updated_at`).run({
|
|
3082
|
+
":memory_id": args.memoryId,
|
|
3083
|
+
":model": args.model,
|
|
3084
|
+
":dim": args.dim,
|
|
3085
|
+
":vector": args.vector,
|
|
3086
|
+
":updated_at": args.updatedAt,
|
|
3087
|
+
});
|
|
3088
|
+
}
|
|
3089
|
+
export function deleteMemoryEmbedding(memoryId) {
|
|
3090
|
+
if (!currentDb)
|
|
3091
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3092
|
+
const res = currentDb
|
|
3093
|
+
.prepare("DELETE FROM memory_embeddings WHERE memory_id = :id")
|
|
3094
|
+
.run({ ":id": memoryId });
|
|
3095
|
+
return (res?.changes ?? 0) > 0;
|
|
3096
|
+
}
|
|
3097
|
+
export function insertMemoryRelationRow(args) {
|
|
3098
|
+
if (!currentDb)
|
|
3099
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3100
|
+
currentDb.prepare(`INSERT OR REPLACE INTO memory_relations (from_id, to_id, rel, confidence, created_at)
|
|
3101
|
+
VALUES (:from_id, :to_id, :rel, :confidence, :created_at)`).run({
|
|
3102
|
+
":from_id": args.fromId,
|
|
3103
|
+
":to_id": args.toId,
|
|
3104
|
+
":rel": args.rel,
|
|
3105
|
+
":confidence": args.confidence,
|
|
3106
|
+
":created_at": args.createdAt,
|
|
2573
3107
|
});
|
|
2574
3108
|
}
|
|
3109
|
+
export function deleteMemoryRelationsFor(memoryId) {
|
|
3110
|
+
if (!currentDb)
|
|
3111
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3112
|
+
currentDb
|
|
3113
|
+
.prepare("DELETE FROM memory_relations WHERE from_id = :id OR to_id = :id")
|
|
3114
|
+
.run({ ":id": memoryId });
|
|
3115
|
+
}
|
|
2575
3116
|
export function rewriteMemoryId(placeholderId, realId) {
|
|
2576
3117
|
if (!currentDb)
|
|
2577
3118
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|