gsd-pi 2.75.0 → 2.76.0-dev.b072ebb73
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/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 +118 -53
- 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 +5 -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 +27 -6
- 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 +5 -3
- 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 +57 -25
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -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/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 +6 -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 +517 -32
- 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 +86 -45
- 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/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/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 +4 -1
- package/dist/resources/extensions/search-the-web/native-search.js +13 -2
- 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 +13 -13
- 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 +4 -4
- 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 +13 -13
- 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/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/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-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/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.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
- 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/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-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/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 +19 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
- 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/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 +2 -9
- package/src/resources/extensions/gsd/auto/loop.ts +109 -3
- package/src/resources/extensions/gsd/auto/phases.ts +146 -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 +7 -0
- 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 +37 -6
- 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 +8 -6
- 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 +61 -28
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -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/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 +6 -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 +617 -32
- 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 +87 -54
- 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/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/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 +95 -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-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/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/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/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 +44 -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/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/prompts-no-gitignored-test-refs.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +45 -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 +4 -1
- package/src/resources/extensions/search-the-web/native-search.ts +13 -3
- 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 → pBwmOoye64ZrRp-_rf0v1}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → pBwmOoye64ZrRp-_rf0v1}/_ssgManifest.js +0 -0
|
@@ -180,7 +180,7 @@ function openRawDb(path: string): unknown {
|
|
|
180
180
|
return new Database(path);
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
const SCHEMA_VERSION =
|
|
183
|
+
const SCHEMA_VERSION = 21;
|
|
184
184
|
|
|
185
185
|
function indexExists(db: DbAdapter, name: string): boolean {
|
|
186
186
|
return !!db.prepare(
|
|
@@ -235,6 +235,7 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
|
235
235
|
rationale TEXT NOT NULL DEFAULT '',
|
|
236
236
|
revisable TEXT NOT NULL DEFAULT '',
|
|
237
237
|
made_by TEXT NOT NULL DEFAULT 'agent',
|
|
238
|
+
source TEXT NOT NULL DEFAULT 'discussion', -- ADR-011 P2: 'discussion' | 'planning' | 'escalation'
|
|
238
239
|
superseded_by TEXT DEFAULT NULL
|
|
239
240
|
)
|
|
240
241
|
`);
|
|
@@ -280,7 +281,10 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
|
280
281
|
created_at TEXT NOT NULL,
|
|
281
282
|
updated_at TEXT NOT NULL,
|
|
282
283
|
superseded_by TEXT DEFAULT NULL,
|
|
283
|
-
hit_count INTEGER NOT NULL DEFAULT 0
|
|
284
|
+
hit_count INTEGER NOT NULL DEFAULT 0,
|
|
285
|
+
scope TEXT NOT NULL DEFAULT 'project',
|
|
286
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
287
|
+
structured_fields TEXT DEFAULT NULL
|
|
284
288
|
)
|
|
285
289
|
`);
|
|
286
290
|
|
|
@@ -292,6 +296,45 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
|
292
296
|
)
|
|
293
297
|
`);
|
|
294
298
|
|
|
299
|
+
db.exec(`
|
|
300
|
+
CREATE TABLE IF NOT EXISTS memory_sources (
|
|
301
|
+
id TEXT PRIMARY KEY,
|
|
302
|
+
kind TEXT NOT NULL,
|
|
303
|
+
uri TEXT,
|
|
304
|
+
title TEXT,
|
|
305
|
+
content TEXT NOT NULL,
|
|
306
|
+
content_hash TEXT NOT NULL UNIQUE,
|
|
307
|
+
imported_at TEXT NOT NULL,
|
|
308
|
+
scope TEXT NOT NULL DEFAULT 'project',
|
|
309
|
+
tags TEXT NOT NULL DEFAULT '[]'
|
|
310
|
+
)
|
|
311
|
+
`);
|
|
312
|
+
|
|
313
|
+
db.exec(`
|
|
314
|
+
CREATE TABLE IF NOT EXISTS memory_embeddings (
|
|
315
|
+
memory_id TEXT PRIMARY KEY,
|
|
316
|
+
model TEXT NOT NULL,
|
|
317
|
+
dim INTEGER NOT NULL,
|
|
318
|
+
vector BLOB NOT NULL,
|
|
319
|
+
updated_at TEXT NOT NULL
|
|
320
|
+
)
|
|
321
|
+
`);
|
|
322
|
+
|
|
323
|
+
db.exec(`
|
|
324
|
+
CREATE TABLE IF NOT EXISTS memory_relations (
|
|
325
|
+
from_id TEXT NOT NULL,
|
|
326
|
+
to_id TEXT NOT NULL,
|
|
327
|
+
rel TEXT NOT NULL,
|
|
328
|
+
confidence REAL NOT NULL DEFAULT 0.8,
|
|
329
|
+
created_at TEXT NOT NULL,
|
|
330
|
+
PRIMARY KEY (from_id, to_id, rel)
|
|
331
|
+
)
|
|
332
|
+
`);
|
|
333
|
+
|
|
334
|
+
// FTS5 virtual table mirroring memories.content for fast keyword search.
|
|
335
|
+
// Optional — if the SQLite build lacks FTS5, we fall back to LIKE scans.
|
|
336
|
+
tryCreateMemoriesFts(db);
|
|
337
|
+
|
|
295
338
|
db.exec(`
|
|
296
339
|
CREATE TABLE IF NOT EXISTS milestones (
|
|
297
340
|
id TEXT PRIMARY KEY,
|
|
@@ -334,6 +377,8 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
|
334
377
|
observability_impact TEXT NOT NULL DEFAULT '',
|
|
335
378
|
sequence INTEGER DEFAULT 0, -- Ordering hint: tools may set this to control execution order
|
|
336
379
|
replan_triggered_at TEXT DEFAULT NULL,
|
|
380
|
+
is_sketch INTEGER NOT NULL DEFAULT 0, -- ADR-011: 1 = slice is a sketch awaiting refinement
|
|
381
|
+
sketch_scope TEXT NOT NULL DEFAULT '', -- ADR-011: 2-3 sentence rough scope from plan-milestone
|
|
337
382
|
PRIMARY KEY (milestone_id, id),
|
|
338
383
|
FOREIGN KEY (milestone_id) REFERENCES milestones(id)
|
|
339
384
|
)
|
|
@@ -352,6 +397,11 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
|
352
397
|
duration TEXT NOT NULL DEFAULT '',
|
|
353
398
|
completed_at TEXT DEFAULT NULL,
|
|
354
399
|
blocker_discovered INTEGER DEFAULT 0,
|
|
400
|
+
blocker_source TEXT NOT NULL DEFAULT '', -- ADR-011 P2: provenance for blocker_discovered (e.g. 'reject-escalation')
|
|
401
|
+
escalation_pending INTEGER NOT NULL DEFAULT 0, -- ADR-011 P2: pause-on-escalation flag
|
|
402
|
+
escalation_awaiting_review INTEGER NOT NULL DEFAULT 0, -- ADR-011 P2: artifact exists but continueWithDefault=true (no pause)
|
|
403
|
+
escalation_artifact_path TEXT DEFAULT NULL, -- ADR-011 P2: path to T##-ESCALATION.json
|
|
404
|
+
escalation_override_applied_at TEXT DEFAULT NULL, -- ADR-011 P2: DB claim lock for idempotent override injection
|
|
355
405
|
deviations TEXT NOT NULL DEFAULT '',
|
|
356
406
|
known_issues TEXT NOT NULL DEFAULT '',
|
|
357
407
|
key_files TEXT NOT NULL DEFAULT '[]',
|
|
@@ -508,6 +558,17 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
|
508
558
|
`);
|
|
509
559
|
|
|
510
560
|
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active ON memories(superseded_by)");
|
|
561
|
+
|
|
562
|
+
// Existing DBs may arrive here before migrateSchema() has added columns
|
|
563
|
+
// that fresh installs already have. Add only columns needed by bootstrap
|
|
564
|
+
// indexes so old DBs can open far enough for the normal migration chain.
|
|
565
|
+
ensureBootstrapIndexColumns(db);
|
|
566
|
+
|
|
567
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope)");
|
|
568
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_kind ON memory_sources(kind)");
|
|
569
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_scope ON memory_sources(scope)");
|
|
570
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_from ON memory_relations(from_id)");
|
|
571
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_to ON memory_relations(to_id)");
|
|
511
572
|
db.exec("CREATE INDEX IF NOT EXISTS idx_replan_history_milestone ON replan_history(milestone_id, created_at)");
|
|
512
573
|
|
|
513
574
|
// v13 indexes — hot-path dispatch queries
|
|
@@ -525,6 +586,9 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
|
525
586
|
db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
|
|
526
587
|
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
|
|
527
588
|
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
|
|
589
|
+
// ADR-011 Phase 2 — also created by the v17 migration; fresh installs
|
|
590
|
+
// skip migrations so the index must be created here too.
|
|
591
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_escalation_pending ON tasks(milestone_id, slice_id, escalation_pending)");
|
|
528
592
|
|
|
529
593
|
db.exec(`CREATE VIEW IF NOT EXISTS active_decisions AS SELECT * FROM decisions WHERE superseded_by IS NULL`);
|
|
530
594
|
db.exec(`CREATE VIEW IF NOT EXISTS active_requirements AS SELECT * FROM requirements WHERE superseded_by IS NULL`);
|
|
@@ -554,10 +618,68 @@ function columnExists(db: DbAdapter, table: string, column: string): boolean {
|
|
|
554
618
|
return rows.some((row) => row["name"] === column);
|
|
555
619
|
}
|
|
556
620
|
|
|
621
|
+
/**
|
|
622
|
+
* Create the FTS5 virtual table for memories plus the triggers that keep it
|
|
623
|
+
* in sync with the base table. FTS5 may be unavailable on stripped-down
|
|
624
|
+
* SQLite builds — callers should treat failure as non-fatal and fall back
|
|
625
|
+
* to LIKE-based scans in `memory-store.queryMemoriesRanked`.
|
|
626
|
+
*/
|
|
627
|
+
export function tryCreateMemoriesFts(db: DbAdapter): boolean {
|
|
628
|
+
try {
|
|
629
|
+
db.exec(`
|
|
630
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts
|
|
631
|
+
USING fts5(content, content='memories', content_rowid='seq', tokenize='porter unicode61')
|
|
632
|
+
`);
|
|
633
|
+
// Triggers mirror inserts / updates / deletes on the base memories table.
|
|
634
|
+
db.exec(`
|
|
635
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai
|
|
636
|
+
AFTER INSERT ON memories BEGIN
|
|
637
|
+
INSERT INTO memories_fts(rowid, content) VALUES (new.seq, new.content);
|
|
638
|
+
END
|
|
639
|
+
`);
|
|
640
|
+
db.exec(`
|
|
641
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad
|
|
642
|
+
AFTER DELETE ON memories BEGIN
|
|
643
|
+
INSERT INTO memories_fts(memories_fts, rowid, content) VALUES ('delete', old.seq, old.content);
|
|
644
|
+
END
|
|
645
|
+
`);
|
|
646
|
+
db.exec(`
|
|
647
|
+
CREATE TRIGGER IF NOT EXISTS memories_au
|
|
648
|
+
AFTER UPDATE OF content ON memories BEGIN
|
|
649
|
+
INSERT INTO memories_fts(memories_fts, rowid, content) VALUES ('delete', old.seq, old.content);
|
|
650
|
+
INSERT INTO memories_fts(rowid, content) VALUES (new.seq, new.content);
|
|
651
|
+
END
|
|
652
|
+
`);
|
|
653
|
+
return true;
|
|
654
|
+
} catch (err) {
|
|
655
|
+
logWarning("db", `FTS5 unavailable — memory queries will use LIKE fallback: ${(err as Error).message}`);
|
|
656
|
+
return false;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
export function isMemoriesFtsAvailable(db: DbAdapter): boolean {
|
|
661
|
+
try {
|
|
662
|
+
const row = db
|
|
663
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories_fts'")
|
|
664
|
+
.get();
|
|
665
|
+
return !!row;
|
|
666
|
+
} catch {
|
|
667
|
+
return false;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
557
671
|
function ensureColumn(db: DbAdapter, table: string, column: string, ddl: string): void {
|
|
558
672
|
if (!columnExists(db, table, column)) db.exec(ddl);
|
|
559
673
|
}
|
|
560
674
|
|
|
675
|
+
function ensureBootstrapIndexColumns(db: DbAdapter): void {
|
|
676
|
+
ensureColumn(db, "memories", "scope", `ALTER TABLE memories ADD COLUMN scope TEXT NOT NULL DEFAULT 'project'`);
|
|
677
|
+
ensureColumn(db, "memories", "tags", `ALTER TABLE memories ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'`);
|
|
678
|
+
ensureColumn(db, "memory_sources", "scope", `ALTER TABLE memory_sources ADD COLUMN scope TEXT NOT NULL DEFAULT 'project'`);
|
|
679
|
+
ensureColumn(db, "memory_sources", "tags", `ALTER TABLE memory_sources ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'`);
|
|
680
|
+
ensureColumn(db, "tasks", "escalation_pending", `ALTER TABLE tasks ADD COLUMN escalation_pending INTEGER NOT NULL DEFAULT 0`);
|
|
681
|
+
}
|
|
682
|
+
|
|
561
683
|
function migrateSchema(db: DbAdapter): void {
|
|
562
684
|
const row = db.prepare("SELECT MAX(version) as v FROM schema_version").get();
|
|
563
685
|
const currentVersion = row ? (row["v"] as number) : 0;
|
|
@@ -951,6 +1073,120 @@ function migrateSchema(db: DbAdapter): void {
|
|
|
951
1073
|
});
|
|
952
1074
|
}
|
|
953
1075
|
|
|
1076
|
+
if (currentVersion < 16) {
|
|
1077
|
+
// ADR-011 Phase 1: sketch-then-refine progressive planning — sketch columns on slices.
|
|
1078
|
+
ensureColumn(db, "slices", "is_sketch", `ALTER TABLE slices ADD COLUMN is_sketch INTEGER NOT NULL DEFAULT 0`);
|
|
1079
|
+
ensureColumn(db, "slices", "sketch_scope", `ALTER TABLE slices ADD COLUMN sketch_scope TEXT NOT NULL DEFAULT ''`);
|
|
1080
|
+
// ADR-011 Phase 2: decisions can now be sourced from escalation resolutions.
|
|
1081
|
+
ensureColumn(db, "decisions", "source", `ALTER TABLE decisions ADD COLUMN source TEXT NOT NULL DEFAULT 'discussion'`);
|
|
1082
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
1083
|
+
":version": 16,
|
|
1084
|
+
":applied_at": new Date().toISOString(),
|
|
1085
|
+
});
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
if (currentVersion < 17) {
|
|
1089
|
+
// ADR-011 Phase 2: mid-execution escalation — columns on the tasks table.
|
|
1090
|
+
ensureColumn(db, "tasks", "blocker_source", `ALTER TABLE tasks ADD COLUMN blocker_source TEXT NOT NULL DEFAULT ''`);
|
|
1091
|
+
ensureColumn(db, "tasks", "escalation_pending", `ALTER TABLE tasks ADD COLUMN escalation_pending INTEGER NOT NULL DEFAULT 0`);
|
|
1092
|
+
ensureColumn(db, "tasks", "escalation_awaiting_review", `ALTER TABLE tasks ADD COLUMN escalation_awaiting_review INTEGER NOT NULL DEFAULT 0`);
|
|
1093
|
+
ensureColumn(db, "tasks", "escalation_artifact_path", `ALTER TABLE tasks ADD COLUMN escalation_artifact_path TEXT DEFAULT NULL`);
|
|
1094
|
+
ensureColumn(db, "tasks", "escalation_override_applied_at", `ALTER TABLE tasks ADD COLUMN escalation_override_applied_at TEXT DEFAULT NULL`);
|
|
1095
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_escalation_pending ON tasks(milestone_id, slice_id, escalation_pending)");
|
|
1096
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
1097
|
+
":version": 17,
|
|
1098
|
+
":applied_at": new Date().toISOString(),
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
if (currentVersion < 18) {
|
|
1103
|
+
// Memory system Phase 2: scope + tags on memories, plus memory_sources
|
|
1104
|
+
// table for raw ingested content (notes, files, URLs, artifacts).
|
|
1105
|
+
ensureColumn(db, "memories", "scope", `ALTER TABLE memories ADD COLUMN scope TEXT NOT NULL DEFAULT 'project'`);
|
|
1106
|
+
ensureColumn(db, "memories", "tags", `ALTER TABLE memories ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'`);
|
|
1107
|
+
db.exec(`
|
|
1108
|
+
CREATE TABLE IF NOT EXISTS memory_sources (
|
|
1109
|
+
id TEXT PRIMARY KEY,
|
|
1110
|
+
kind TEXT NOT NULL,
|
|
1111
|
+
uri TEXT,
|
|
1112
|
+
title TEXT,
|
|
1113
|
+
content TEXT NOT NULL,
|
|
1114
|
+
content_hash TEXT NOT NULL UNIQUE,
|
|
1115
|
+
imported_at TEXT NOT NULL,
|
|
1116
|
+
scope TEXT NOT NULL DEFAULT 'project',
|
|
1117
|
+
tags TEXT NOT NULL DEFAULT '[]'
|
|
1118
|
+
)
|
|
1119
|
+
`);
|
|
1120
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope)");
|
|
1121
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_kind ON memory_sources(kind)");
|
|
1122
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_scope ON memory_sources(scope)");
|
|
1123
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
1124
|
+
":version": 18,
|
|
1125
|
+
":applied_at": new Date().toISOString(),
|
|
1126
|
+
});
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
if (currentVersion < 19) {
|
|
1130
|
+
// Memory system Phase 3: embeddings + FTS5 for hybrid retrieval.
|
|
1131
|
+
db.exec(`
|
|
1132
|
+
CREATE TABLE IF NOT EXISTS memory_embeddings (
|
|
1133
|
+
memory_id TEXT PRIMARY KEY,
|
|
1134
|
+
model TEXT NOT NULL,
|
|
1135
|
+
dim INTEGER NOT NULL,
|
|
1136
|
+
vector BLOB NOT NULL,
|
|
1137
|
+
updated_at TEXT NOT NULL
|
|
1138
|
+
)
|
|
1139
|
+
`);
|
|
1140
|
+
tryCreateMemoriesFts(db);
|
|
1141
|
+
// Backfill FTS5 with any existing memories (triggers only cover future writes).
|
|
1142
|
+
if (isMemoriesFtsAvailable(db)) {
|
|
1143
|
+
try {
|
|
1144
|
+
db.exec(`INSERT INTO memories_fts(rowid, content) SELECT seq, content FROM memories`);
|
|
1145
|
+
} catch (err) {
|
|
1146
|
+
logWarning("db", `FTS5 backfill failed: ${(err as Error).message}`);
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
1150
|
+
":version": 19,
|
|
1151
|
+
":applied_at": new Date().toISOString(),
|
|
1152
|
+
});
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
if (currentVersion < 20) {
|
|
1156
|
+
// Memory system Phase 4: knowledge-graph relations between memories.
|
|
1157
|
+
db.exec(`
|
|
1158
|
+
CREATE TABLE IF NOT EXISTS memory_relations (
|
|
1159
|
+
from_id TEXT NOT NULL,
|
|
1160
|
+
to_id TEXT NOT NULL,
|
|
1161
|
+
rel TEXT NOT NULL,
|
|
1162
|
+
confidence REAL NOT NULL DEFAULT 0.8,
|
|
1163
|
+
created_at TEXT NOT NULL,
|
|
1164
|
+
PRIMARY KEY (from_id, to_id, rel)
|
|
1165
|
+
)
|
|
1166
|
+
`);
|
|
1167
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_from ON memory_relations(from_id)");
|
|
1168
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_to ON memory_relations(to_id)");
|
|
1169
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
1170
|
+
":version": 20,
|
|
1171
|
+
":applied_at": new Date().toISOString(),
|
|
1172
|
+
});
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
if (currentVersion < 21) {
|
|
1176
|
+
// ADR-013 Step 2: preserve structured fields (gsd_save_decision's
|
|
1177
|
+
// scope/decision/choice/rationale/made_by/revisable) on memories rows so
|
|
1178
|
+
// the eventual decisions->memories cutover does not lose schema fidelity.
|
|
1179
|
+
// Nullable JSON column — existing rows stay NULL until backfilled in Step 5.
|
|
1180
|
+
// Use ensureColumn for race-safety (matches v15-v18 pattern; bare ALTER
|
|
1181
|
+
// throws "duplicate column" on the loser of a concurrent open race even
|
|
1182
|
+
// though the transaction wrapper protects the schema_version row).
|
|
1183
|
+
ensureColumn(db, "memories", "structured_fields", "ALTER TABLE memories ADD COLUMN structured_fields TEXT DEFAULT NULL");
|
|
1184
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
1185
|
+
":version": 21,
|
|
1186
|
+
":applied_at": new Date().toISOString(),
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1189
|
+
|
|
954
1190
|
db.exec("COMMIT");
|
|
955
1191
|
} catch (err) {
|
|
956
1192
|
db.exec("ROLLBACK");
|
|
@@ -1052,6 +1288,14 @@ export function vacuumDatabase(): void {
|
|
|
1052
1288
|
} catch (e) { logWarning("db", `VACUUM failed: ${(e as Error).message}`); }
|
|
1053
1289
|
}
|
|
1054
1290
|
|
|
1291
|
+
/** Flush WAL into gsd.db so `git add .gsd/gsd.db` stages current state — safe while DB is open. */
|
|
1292
|
+
export function checkpointDatabase(): void {
|
|
1293
|
+
if (!currentDb) return;
|
|
1294
|
+
try {
|
|
1295
|
+
currentDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
1296
|
+
} catch (e) { logWarning("db", `WAL checkpoint failed: ${(e as Error).message}`); }
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1055
1299
|
let _txDepth = 0;
|
|
1056
1300
|
|
|
1057
1301
|
export function transaction<T>(fn: () => T): T {
|
|
@@ -1127,8 +1371,8 @@ export function readTransaction<T>(fn: () => T): T {
|
|
|
1127
1371
|
export function insertDecision(d: Omit<Decision, "seq">): void {
|
|
1128
1372
|
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1129
1373
|
currentDb.prepare(
|
|
1130
|
-
`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
|
|
1131
|
-
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :superseded_by)`,
|
|
1374
|
+
`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
|
|
1375
|
+
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :source, :superseded_by)`,
|
|
1132
1376
|
).run({
|
|
1133
1377
|
":id": d.id,
|
|
1134
1378
|
":when_context": d.when_context,
|
|
@@ -1138,6 +1382,7 @@ export function insertDecision(d: Omit<Decision, "seq">): void {
|
|
|
1138
1382
|
":rationale": d.rationale,
|
|
1139
1383
|
":revisable": d.revisable,
|
|
1140
1384
|
":made_by": d.made_by ?? "agent",
|
|
1385
|
+
":source": d.source ?? "discussion",
|
|
1141
1386
|
":superseded_by": d.superseded_by,
|
|
1142
1387
|
});
|
|
1143
1388
|
}
|
|
@@ -1156,6 +1401,7 @@ export function getDecisionById(id: string): Decision | null {
|
|
|
1156
1401
|
rationale: row["rationale"] as string,
|
|
1157
1402
|
revisable: row["revisable"] as string,
|
|
1158
1403
|
made_by: (row["made_by"] as string as import("./types.js").DecisionMadeBy) ?? "agent",
|
|
1404
|
+
source: (row["source"] as string) ?? "discussion",
|
|
1159
1405
|
superseded_by: (row["superseded_by"] as string) ?? null,
|
|
1160
1406
|
};
|
|
1161
1407
|
}
|
|
@@ -1173,6 +1419,7 @@ export function getActiveDecisions(): Decision[] {
|
|
|
1173
1419
|
rationale: row["rationale"] as string,
|
|
1174
1420
|
revisable: row["revisable"] as string,
|
|
1175
1421
|
made_by: (row["made_by"] as string as import("./types.js").DecisionMadeBy) ?? "agent",
|
|
1422
|
+
source: (row["source"] as string) ?? "discussion",
|
|
1176
1423
|
superseded_by: null,
|
|
1177
1424
|
}));
|
|
1178
1425
|
}
|
|
@@ -1261,8 +1508,8 @@ export function upsertDecision(d: Omit<Decision, "seq">): void {
|
|
|
1261
1508
|
// seq column. INSERT OR REPLACE deletes then reinserts, resetting seq and
|
|
1262
1509
|
// corrupting decision ordering in DECISIONS.md after reconcile replay.
|
|
1263
1510
|
currentDb.prepare(
|
|
1264
|
-
`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
|
|
1265
|
-
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :superseded_by)
|
|
1511
|
+
`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
|
|
1512
|
+
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :source, :superseded_by)
|
|
1266
1513
|
ON CONFLICT(id) DO UPDATE SET
|
|
1267
1514
|
when_context = excluded.when_context,
|
|
1268
1515
|
scope = excluded.scope,
|
|
@@ -1271,6 +1518,7 @@ export function upsertDecision(d: Omit<Decision, "seq">): void {
|
|
|
1271
1518
|
rationale = excluded.rationale,
|
|
1272
1519
|
revisable = excluded.revisable,
|
|
1273
1520
|
made_by = excluded.made_by,
|
|
1521
|
+
source = excluded.source,
|
|
1274
1522
|
superseded_by = excluded.superseded_by`,
|
|
1275
1523
|
).run({
|
|
1276
1524
|
":id": d.id,
|
|
@@ -1281,6 +1529,7 @@ export function upsertDecision(d: Omit<Decision, "seq">): void {
|
|
|
1281
1529
|
":rationale": d.rationale,
|
|
1282
1530
|
":revisable": d.revisable,
|
|
1283
1531
|
":made_by": d.made_by ?? "agent",
|
|
1532
|
+
":source": d.source ?? "discussion",
|
|
1284
1533
|
":superseded_by": d.superseded_by ?? null,
|
|
1285
1534
|
});
|
|
1286
1535
|
}
|
|
@@ -1455,16 +1704,20 @@ export function insertSlice(s: {
|
|
|
1455
1704
|
depends?: string[];
|
|
1456
1705
|
demo?: string;
|
|
1457
1706
|
sequence?: number;
|
|
1707
|
+
isSketch?: boolean;
|
|
1708
|
+
sketchScope?: string;
|
|
1458
1709
|
planning?: Partial<SlicePlanningRecord>;
|
|
1459
1710
|
}): void {
|
|
1460
1711
|
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1461
1712
|
currentDb.prepare(
|
|
1462
1713
|
`INSERT INTO slices (
|
|
1463
1714
|
milestone_id, id, title, status, risk, depends, demo, created_at,
|
|
1464
|
-
goal, success_criteria, proof_level, integration_closure, observability_impact, sequence
|
|
1715
|
+
goal, success_criteria, proof_level, integration_closure, observability_impact, sequence,
|
|
1716
|
+
is_sketch, sketch_scope
|
|
1465
1717
|
) VALUES (
|
|
1466
1718
|
:milestone_id, :id, :title, :status, :risk, :depends, :demo, :created_at,
|
|
1467
|
-
:goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :sequence
|
|
1719
|
+
:goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :sequence,
|
|
1720
|
+
:is_sketch, :sketch_scope
|
|
1468
1721
|
)
|
|
1469
1722
|
ON CONFLICT (milestone_id, id) DO UPDATE SET
|
|
1470
1723
|
title = CASE WHEN :raw_title IS NOT NULL THEN excluded.title ELSE slices.title END,
|
|
@@ -1477,7 +1730,9 @@ export function insertSlice(s: {
|
|
|
1477
1730
|
proof_level = CASE WHEN :raw_proof_level IS NOT NULL THEN excluded.proof_level ELSE slices.proof_level END,
|
|
1478
1731
|
integration_closure = CASE WHEN :raw_integration_closure IS NOT NULL THEN excluded.integration_closure ELSE slices.integration_closure END,
|
|
1479
1732
|
observability_impact = CASE WHEN :raw_observability_impact IS NOT NULL THEN excluded.observability_impact ELSE slices.observability_impact END,
|
|
1480
|
-
sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END
|
|
1733
|
+
sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END,
|
|
1734
|
+
is_sketch = CASE WHEN :raw_is_sketch IS NOT NULL THEN excluded.is_sketch ELSE slices.is_sketch END,
|
|
1735
|
+
sketch_scope = CASE WHEN :raw_sketch_scope IS NOT NULL THEN excluded.sketch_scope ELSE slices.sketch_scope END`,
|
|
1481
1736
|
).run({
|
|
1482
1737
|
":milestone_id": s.milestoneId,
|
|
1483
1738
|
":id": s.id,
|
|
@@ -1493,6 +1748,8 @@ export function insertSlice(s: {
|
|
|
1493
1748
|
":integration_closure": s.planning?.integrationClosure ?? "",
|
|
1494
1749
|
":observability_impact": s.planning?.observabilityImpact ?? "",
|
|
1495
1750
|
":sequence": s.sequence ?? 0,
|
|
1751
|
+
":is_sketch": s.isSketch ? 1 : 0,
|
|
1752
|
+
":sketch_scope": s.sketchScope ?? "",
|
|
1496
1753
|
// Raw sentinel params: NULL when caller omitted the field, used in ON CONFLICT guards
|
|
1497
1754
|
":raw_title": s.title ?? null,
|
|
1498
1755
|
":raw_risk": s.risk ?? null,
|
|
@@ -1503,9 +1760,52 @@ export function insertSlice(s: {
|
|
|
1503
1760
|
":raw_integration_closure": s.planning?.integrationClosure ?? null,
|
|
1504
1761
|
":raw_observability_impact": s.planning?.observabilityImpact ?? null,
|
|
1505
1762
|
":raw_sequence": s.sequence ?? null,
|
|
1763
|
+
":raw_is_sketch": s.isSketch === undefined ? null : (s.isSketch ? 1 : 0),
|
|
1764
|
+
// NOTE: use !== undefined (not ??) so an explicit empty string "" is treated
|
|
1765
|
+
// as a present value and correctly clears the existing sketch_scope on
|
|
1766
|
+
// CONFLICT. ?? would incorrectly preserve the stale value.
|
|
1767
|
+
":raw_sketch_scope": s.sketchScope !== undefined ? s.sketchScope : null,
|
|
1506
1768
|
});
|
|
1507
1769
|
}
|
|
1508
1770
|
|
|
1771
|
+
// ADR-011: sketch-then-refine helpers
|
|
1772
|
+
export function setSliceSketchFlag(milestoneId: string, sliceId: string, isSketch: boolean): void {
|
|
1773
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1774
|
+
currentDb.prepare(
|
|
1775
|
+
`UPDATE slices SET is_sketch = :is_sketch WHERE milestone_id = :mid AND id = :sid`,
|
|
1776
|
+
).run({ ":is_sketch": isSketch ? 1 : 0, ":mid": milestoneId, ":sid": sliceId });
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
/**
|
|
1780
|
+
* ADR-011 auto-heal: reconcile stale is_sketch=1 rows whose PLAN already exists.
|
|
1781
|
+
*
|
|
1782
|
+
* Callers pass a predicate that resolves whether a plan file exists for a slice.
|
|
1783
|
+
* The predicate MUST use the canonical path resolver (`resolveSliceFile`, etc.)
|
|
1784
|
+
* to keep path logic in one place — do not hand-roll the path inside the callback.
|
|
1785
|
+
*
|
|
1786
|
+
* Recovers from two scenarios:
|
|
1787
|
+
* 1. Crash between `gsd_plan_slice` write and the sketch flag flip.
|
|
1788
|
+
* 2. Flag-OFF downgrade path: when `progressive_planning` is off, the dispatch
|
|
1789
|
+
* rule routes sketch slices to plan-slice, which writes PLAN.md but leaves
|
|
1790
|
+
* `is_sketch=1` — the next state derivation auto-heals it to 0 here.
|
|
1791
|
+
*
|
|
1792
|
+
* Not aggressive in practice: PLAN.md is only written via the DB-backed
|
|
1793
|
+
* `gsd_plan_slice` tool (which also inserts tasks), so a "stale PLAN.md with
|
|
1794
|
+
* is_sketch=1" is extremely unlikely to indicate anything other than the two
|
|
1795
|
+
* recovery scenarios above.
|
|
1796
|
+
*/
|
|
1797
|
+
export function autoHealSketchFlags(milestoneId: string, hasPlanFile: (sliceId: string) => boolean): void {
|
|
1798
|
+
if (!currentDb) return;
|
|
1799
|
+
const rows = currentDb.prepare(
|
|
1800
|
+
`SELECT id FROM slices WHERE milestone_id = :mid AND is_sketch = 1`,
|
|
1801
|
+
).all({ ":mid": milestoneId }) as Array<{ id: string }>;
|
|
1802
|
+
for (const row of rows) {
|
|
1803
|
+
if (hasPlanFile(row.id)) {
|
|
1804
|
+
setSliceSketchFlag(milestoneId, row.id, false);
|
|
1805
|
+
}
|
|
1806
|
+
}
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1509
1809
|
export function upsertSlicePlanning(milestoneId: string, sliceId: string, planning: Partial<SlicePlanningRecord>): void {
|
|
1510
1810
|
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1511
1811
|
currentDb.prepare(
|
|
@@ -1679,6 +1979,8 @@ export interface SliceRow {
|
|
|
1679
1979
|
observability_impact: string;
|
|
1680
1980
|
sequence: number;
|
|
1681
1981
|
replan_triggered_at: string | null;
|
|
1982
|
+
is_sketch: number;
|
|
1983
|
+
sketch_scope: string;
|
|
1682
1984
|
}
|
|
1683
1985
|
|
|
1684
1986
|
function rowToSlice(row: Record<string, unknown>): SliceRow {
|
|
@@ -1701,6 +2003,8 @@ function rowToSlice(row: Record<string, unknown>): SliceRow {
|
|
|
1701
2003
|
observability_impact: (row["observability_impact"] as string) ?? "",
|
|
1702
2004
|
sequence: (row["sequence"] as number) ?? 0,
|
|
1703
2005
|
replan_triggered_at: (row["replan_triggered_at"] as string) ?? null,
|
|
2006
|
+
is_sketch: (row["is_sketch"] as number) ?? 0,
|
|
2007
|
+
sketch_scope: (row["sketch_scope"] as string) ?? "",
|
|
1704
2008
|
};
|
|
1705
2009
|
}
|
|
1706
2010
|
|
|
@@ -1764,6 +2068,12 @@ export interface TaskRow {
|
|
|
1764
2068
|
observability_impact: string;
|
|
1765
2069
|
full_plan_md: string;
|
|
1766
2070
|
sequence: number;
|
|
2071
|
+
// ADR-011 Phase 2 escalation fields
|
|
2072
|
+
blocker_source: string;
|
|
2073
|
+
escalation_pending: number;
|
|
2074
|
+
escalation_awaiting_review: number;
|
|
2075
|
+
escalation_artifact_path: string | null;
|
|
2076
|
+
escalation_override_applied_at: string | null;
|
|
1767
2077
|
}
|
|
1768
2078
|
|
|
1769
2079
|
function parseTaskArrayColumn(raw: unknown): string[] {
|
|
@@ -1834,6 +2144,11 @@ function rowToTask(row: Record<string, unknown>): TaskRow {
|
|
|
1834
2144
|
observability_impact: (row["observability_impact"] as string) ?? "",
|
|
1835
2145
|
full_plan_md: (row["full_plan_md"] as string) ?? "",
|
|
1836
2146
|
sequence: (row["sequence"] as number) ?? 0,
|
|
2147
|
+
blocker_source: (row["blocker_source"] as string) ?? "",
|
|
2148
|
+
escalation_pending: (row["escalation_pending"] as number) ?? 0,
|
|
2149
|
+
escalation_awaiting_review: (row["escalation_awaiting_review"] as number) ?? 0,
|
|
2150
|
+
escalation_artifact_path: (row["escalation_artifact_path"] as string) ?? null,
|
|
2151
|
+
escalation_override_applied_at: (row["escalation_override_applied_at"] as string) ?? null,
|
|
1837
2152
|
};
|
|
1838
2153
|
}
|
|
1839
2154
|
|
|
@@ -1854,6 +2169,125 @@ export function getSliceTasks(milestoneId: string, sliceId: string): TaskRow[] {
|
|
|
1854
2169
|
return rows.map(rowToTask);
|
|
1855
2170
|
}
|
|
1856
2171
|
|
|
2172
|
+
// ─── ADR-011 Phase 2 escalation helpers ──────────────────────────────────
|
|
2173
|
+
|
|
2174
|
+
/** Set pause-on-escalation state on a completed task. Mutually exclusive with awaiting_review. */
|
|
2175
|
+
export function setTaskEscalationPending(
|
|
2176
|
+
milestoneId: string, sliceId: string, taskId: string,
|
|
2177
|
+
artifactPath: string,
|
|
2178
|
+
): void {
|
|
2179
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2180
|
+
currentDb.prepare(
|
|
2181
|
+
`UPDATE tasks
|
|
2182
|
+
SET escalation_pending = 1,
|
|
2183
|
+
escalation_awaiting_review = 0,
|
|
2184
|
+
escalation_artifact_path = :path
|
|
2185
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
|
|
2186
|
+
).run({ ":path": artifactPath, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
/** Set awaiting-review state (artifact exists but continueWithDefault=true, no pause). Mutually exclusive with pending. */
|
|
2190
|
+
export function setTaskEscalationAwaitingReview(
|
|
2191
|
+
milestoneId: string, sliceId: string, taskId: string,
|
|
2192
|
+
artifactPath: string,
|
|
2193
|
+
): void {
|
|
2194
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2195
|
+
currentDb.prepare(
|
|
2196
|
+
`UPDATE tasks
|
|
2197
|
+
SET escalation_awaiting_review = 1,
|
|
2198
|
+
escalation_pending = 0,
|
|
2199
|
+
escalation_artifact_path = :path
|
|
2200
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
|
|
2201
|
+
).run({ ":path": artifactPath, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
2202
|
+
}
|
|
2203
|
+
|
|
2204
|
+
/** Clear escalation-pending and awaiting-review flags once the user has resolved it. */
|
|
2205
|
+
export function clearTaskEscalationFlags(
|
|
2206
|
+
milestoneId: string, sliceId: string, taskId: string,
|
|
2207
|
+
): void {
|
|
2208
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2209
|
+
currentDb.prepare(
|
|
2210
|
+
`UPDATE tasks
|
|
2211
|
+
SET escalation_pending = 0,
|
|
2212
|
+
escalation_awaiting_review = 0
|
|
2213
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
|
|
2214
|
+
).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
2215
|
+
}
|
|
2216
|
+
|
|
2217
|
+
/**
|
|
2218
|
+
* Atomically claim a resolved escalation override for injection into a downstream
|
|
2219
|
+
* task's prompt. Returns true if this caller claimed it (must inject), false if
|
|
2220
|
+
* another caller already claimed it (must skip).
|
|
2221
|
+
*/
|
|
2222
|
+
export function claimEscalationOverride(
|
|
2223
|
+
milestoneId: string, sliceId: string, sourceTaskId: string,
|
|
2224
|
+
): boolean {
|
|
2225
|
+
if (!currentDb) return false;
|
|
2226
|
+
const now = new Date().toISOString();
|
|
2227
|
+
const result = currentDb.prepare(
|
|
2228
|
+
`UPDATE tasks
|
|
2229
|
+
SET escalation_override_applied_at = :now
|
|
2230
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid
|
|
2231
|
+
AND escalation_override_applied_at IS NULL
|
|
2232
|
+
AND escalation_artifact_path IS NOT NULL`,
|
|
2233
|
+
).run({ ":now": now, ":mid": milestoneId, ":sid": sliceId, ":tid": sourceTaskId });
|
|
2234
|
+
// node:sqlite + better-sqlite3 both surface `changes` on the run result.
|
|
2235
|
+
const changes = (result as { changes?: number }).changes ?? 0;
|
|
2236
|
+
return changes > 0;
|
|
2237
|
+
}
|
|
2238
|
+
|
|
2239
|
+
/** Find the most recent resolved-but-unapplied escalation override in a slice. */
|
|
2240
|
+
export function findUnappliedEscalationOverride(
|
|
2241
|
+
milestoneId: string, sliceId: string,
|
|
2242
|
+
): { taskId: string; artifactPath: string } | null {
|
|
2243
|
+
if (!currentDb) return null;
|
|
2244
|
+
// Filter BOTH flags: escalation_pending=0 AND escalation_awaiting_review=0
|
|
2245
|
+
// ensures we only claim overrides the user has explicitly resolved.
|
|
2246
|
+
// Without the awaiting_review filter, continueWithDefault=true artifacts
|
|
2247
|
+
// (not yet responded to) would be prematurely claimed, causing the override
|
|
2248
|
+
// to be lost when the user later resolves (#ADR-011 Phase 2 peer-review Bug 2).
|
|
2249
|
+
const row = currentDb.prepare(
|
|
2250
|
+
`SELECT id, escalation_artifact_path AS path
|
|
2251
|
+
FROM tasks
|
|
2252
|
+
WHERE milestone_id = :mid AND slice_id = :sid
|
|
2253
|
+
AND escalation_artifact_path IS NOT NULL
|
|
2254
|
+
AND escalation_override_applied_at IS NULL
|
|
2255
|
+
AND escalation_pending = 0
|
|
2256
|
+
AND escalation_awaiting_review = 0
|
|
2257
|
+
ORDER BY sequence DESC, id DESC
|
|
2258
|
+
LIMIT 1`,
|
|
2259
|
+
).get({ ":mid": milestoneId, ":sid": sliceId }) as
|
|
2260
|
+
| { id: string; path: string | null }
|
|
2261
|
+
| undefined;
|
|
2262
|
+
if (!row || !row.path) return null;
|
|
2263
|
+
return { taskId: row.id, artifactPath: row.path };
|
|
2264
|
+
}
|
|
2265
|
+
|
|
2266
|
+
/** Set the blocker_source provenance field (used when rejecting an escalation). */
|
|
2267
|
+
export function setTaskBlockerSource(
|
|
2268
|
+
milestoneId: string, sliceId: string, taskId: string, source: string,
|
|
2269
|
+
): void {
|
|
2270
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2271
|
+
currentDb.prepare(
|
|
2272
|
+
`UPDATE tasks
|
|
2273
|
+
SET blocker_discovered = 1,
|
|
2274
|
+
blocker_source = :src
|
|
2275
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
|
|
2276
|
+
).run({ ":src": source, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
2277
|
+
}
|
|
2278
|
+
|
|
2279
|
+
/** List tasks with active escalation artifacts across a milestone (for /gsd escalate list). */
|
|
2280
|
+
export function listEscalationArtifacts(milestoneId: string, includeResolved: boolean = false): TaskRow[] {
|
|
2281
|
+
if (!currentDb) return [];
|
|
2282
|
+
const filter = includeResolved
|
|
2283
|
+
? "escalation_artifact_path IS NOT NULL"
|
|
2284
|
+
: "(escalation_pending = 1 OR escalation_awaiting_review = 1) AND escalation_artifact_path IS NOT NULL";
|
|
2285
|
+
const rows = currentDb.prepare(
|
|
2286
|
+
`SELECT * FROM tasks WHERE milestone_id = :mid AND ${filter} ORDER BY slice_id, sequence, id`,
|
|
2287
|
+
).all({ ":mid": milestoneId });
|
|
2288
|
+
return rows.map(rowToTask);
|
|
2289
|
+
}
|
|
2290
|
+
|
|
1857
2291
|
export function insertVerificationEvidence(e: {
|
|
1858
2292
|
taskId: string;
|
|
1859
2293
|
sliceId: string;
|
|
@@ -2167,6 +2601,19 @@ export function reconcileWorktreeDb(
|
|
|
2167
2601
|
try {
|
|
2168
2602
|
const wtInfo = adapter.prepare("PRAGMA wt.table_info('decisions')").all();
|
|
2169
2603
|
const hasMadeBy = wtInfo.some((col) => col["name"] === "made_by");
|
|
2604
|
+
// ADR-011: worktree may predate schema v16/v17. For missing columns we
|
|
2605
|
+
// fall through to the main DB's existing value (not a literal default)
|
|
2606
|
+
// so reconcile never silently clears state the main tree has recorded.
|
|
2607
|
+
const hasDecisionSource = wtInfo.some((col) => col["name"] === "source");
|
|
2608
|
+
const wtSliceInfo = adapter.prepare("PRAGMA wt.table_info('slices')").all();
|
|
2609
|
+
const hasIsSketch = wtSliceInfo.some((col) => col["name"] === "is_sketch");
|
|
2610
|
+
const hasSketchScope = wtSliceInfo.some((col) => col["name"] === "sketch_scope");
|
|
2611
|
+
const wtTaskInfo = adapter.prepare("PRAGMA wt.table_info('tasks')").all();
|
|
2612
|
+
const hasBlockerSource = wtTaskInfo.some((col) => col["name"] === "blocker_source");
|
|
2613
|
+
const hasEscalationPending = wtTaskInfo.some((col) => col["name"] === "escalation_pending");
|
|
2614
|
+
const hasEscalationAwaiting = wtTaskInfo.some((col) => col["name"] === "escalation_awaiting_review");
|
|
2615
|
+
const hasEscalationArtifact = wtTaskInfo.some((col) => col["name"] === "escalation_artifact_path");
|
|
2616
|
+
const hasEscalationOverride = wtTaskInfo.some((col) => col["name"] === "escalation_override_applied_at");
|
|
2170
2617
|
|
|
2171
2618
|
const decConf = adapter.prepare(
|
|
2172
2619
|
`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 ${
|
|
@@ -2188,13 +2635,20 @@ export function reconcileWorktreeDb(
|
|
|
2188
2635
|
|
|
2189
2636
|
adapter.exec("BEGIN");
|
|
2190
2637
|
try {
|
|
2638
|
+
// Join the target decisions so we can prefer an existing main.source
|
|
2639
|
+
// when the worktree predates v16 — otherwise a write-through reconcile
|
|
2640
|
+
// would clobber 'escalation'-sourced decisions with the literal default.
|
|
2191
2641
|
merged.decisions = countChanges(adapter.prepare(`
|
|
2192
2642
|
INSERT OR REPLACE INTO decisions (
|
|
2193
|
-
id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by
|
|
2643
|
+
id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by
|
|
2194
2644
|
)
|
|
2195
|
-
SELECT id, when_context, scope, decision, choice, rationale, revisable, ${
|
|
2196
|
-
hasMadeBy ? "made_by" : "'agent'"
|
|
2197
|
-
},
|
|
2645
|
+
SELECT w.id, w.when_context, w.scope, w.decision, w.choice, w.rationale, w.revisable, ${
|
|
2646
|
+
hasMadeBy ? "w.made_by" : "COALESCE(m.made_by, 'agent')"
|
|
2647
|
+
}, ${
|
|
2648
|
+
hasDecisionSource ? "w.source" : "COALESCE(m.source, 'discussion')"
|
|
2649
|
+
}, w.superseded_by
|
|
2650
|
+
FROM wt.decisions w
|
|
2651
|
+
LEFT JOIN decisions m ON m.id = w.id
|
|
2198
2652
|
`).run());
|
|
2199
2653
|
|
|
2200
2654
|
merged.requirements = countChanges(adapter.prepare(`
|
|
@@ -2231,13 +2685,15 @@ export function reconcileWorktreeDb(
|
|
|
2231
2685
|
`).run());
|
|
2232
2686
|
|
|
2233
2687
|
// Merge slices — preserve worktree progress but never downgrade completed status (#2558).
|
|
2234
|
-
//
|
|
2235
|
-
//
|
|
2688
|
+
// ADR-011 Phase 1: carry is_sketch + sketch_scope so reconcile doesn't
|
|
2689
|
+
// silently clear sketch metadata. When the worktree predates v16,
|
|
2690
|
+
// fall back to the main DB's existing value rather than a literal 0/''.
|
|
2236
2691
|
merged.slices = countChanges(adapter.prepare(`
|
|
2237
2692
|
INSERT OR REPLACE INTO slices (
|
|
2238
2693
|
milestone_id, id, title, status, risk, depends, demo, created_at, completed_at,
|
|
2239
2694
|
full_summary_md, full_uat_md, goal, success_criteria, proof_level,
|
|
2240
|
-
integration_closure, observability_impact, sequence, replan_triggered_at
|
|
2695
|
+
integration_closure, observability_impact, sequence, replan_triggered_at,
|
|
2696
|
+
is_sketch, sketch_scope
|
|
2241
2697
|
)
|
|
2242
2698
|
SELECT w.milestone_id, w.id, w.title,
|
|
2243
2699
|
CASE
|
|
@@ -2250,19 +2706,25 @@ export function reconcileWorktreeDb(
|
|
|
2250
2706
|
THEN m.completed_at ELSE w.completed_at
|
|
2251
2707
|
END,
|
|
2252
2708
|
w.full_summary_md, w.full_uat_md, w.goal, w.success_criteria, w.proof_level,
|
|
2253
|
-
w.integration_closure, w.observability_impact, w.sequence, w.replan_triggered_at
|
|
2709
|
+
w.integration_closure, w.observability_impact, w.sequence, w.replan_triggered_at,
|
|
2710
|
+
${hasIsSketch ? "w.is_sketch" : "COALESCE(m.is_sketch, 0)"},
|
|
2711
|
+
${hasSketchScope ? "w.sketch_scope" : "COALESCE(m.sketch_scope, '')"}
|
|
2254
2712
|
FROM wt.slices w
|
|
2255
2713
|
LEFT JOIN slices m ON m.milestone_id = w.milestone_id AND m.id = w.id
|
|
2256
2714
|
`).run());
|
|
2257
2715
|
|
|
2258
|
-
// Merge tasks — preserve execution results, never downgrade completed status (#2558)
|
|
2716
|
+
// Merge tasks — preserve execution results, never downgrade completed status (#2558).
|
|
2717
|
+
// ADR-011 P2: carry blocker_source + escalation_* columns so worktree reconcile
|
|
2718
|
+
// doesn't silently clear escalation state back to defaults.
|
|
2259
2719
|
merged.tasks = countChanges(adapter.prepare(`
|
|
2260
2720
|
INSERT OR REPLACE INTO tasks (
|
|
2261
2721
|
milestone_id, slice_id, id, title, status, one_liner, narrative,
|
|
2262
2722
|
verification_result, duration, completed_at, blocker_discovered,
|
|
2263
2723
|
deviations, known_issues, key_files, key_decisions, full_summary_md,
|
|
2264
2724
|
description, estimate, files, verify, inputs, expected_output,
|
|
2265
|
-
observability_impact, full_plan_md, sequence
|
|
2725
|
+
observability_impact, full_plan_md, sequence,
|
|
2726
|
+
blocker_source, escalation_pending, escalation_awaiting_review,
|
|
2727
|
+
escalation_artifact_path, escalation_override_applied_at
|
|
2266
2728
|
)
|
|
2267
2729
|
SELECT w.milestone_id, w.slice_id, w.id, w.title,
|
|
2268
2730
|
CASE
|
|
@@ -2278,7 +2740,12 @@ export function reconcileWorktreeDb(
|
|
|
2278
2740
|
w.blocker_discovered,
|
|
2279
2741
|
w.deviations, w.known_issues, w.key_files, w.key_decisions, w.full_summary_md,
|
|
2280
2742
|
w.description, w.estimate, w.files, w.verify, w.inputs, w.expected_output,
|
|
2281
|
-
w.observability_impact, w.full_plan_md, w.sequence
|
|
2743
|
+
w.observability_impact, w.full_plan_md, w.sequence,
|
|
2744
|
+
${hasBlockerSource ? "w.blocker_source" : "COALESCE(m.blocker_source, '')"},
|
|
2745
|
+
${hasEscalationPending ? "w.escalation_pending" : "COALESCE(m.escalation_pending, 0)"},
|
|
2746
|
+
${hasEscalationAwaiting ? "w.escalation_awaiting_review" : "COALESCE(m.escalation_awaiting_review, 0)"},
|
|
2747
|
+
${hasEscalationArtifact ? "w.escalation_artifact_path" : "m.escalation_artifact_path"},
|
|
2748
|
+
${hasEscalationOverride ? "w.escalation_override_applied_at" : "m.escalation_override_applied_at"}
|
|
2282
2749
|
FROM wt.tasks w
|
|
2283
2750
|
LEFT JOIN tasks m ON m.milestone_id = w.milestone_id AND m.slice_id = w.slice_id AND m.id = w.id
|
|
2284
2751
|
`).run());
|
|
@@ -3000,13 +3467,13 @@ export function restoreManifest(manifest: StateManifest): void {
|
|
|
3000
3467
|
);
|
|
3001
3468
|
}
|
|
3002
3469
|
|
|
3003
|
-
// Restore slices
|
|
3470
|
+
// Restore slices (ADR-011 Phase 1: includes is_sketch + sketch_scope)
|
|
3004
3471
|
const slStmt = db.prepare(
|
|
3005
3472
|
`INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
|
|
3006
3473
|
created_at, completed_at, full_summary_md, full_uat_md,
|
|
3007
3474
|
goal, success_criteria, proof_level, integration_closure, observability_impact,
|
|
3008
|
-
sequence, replan_triggered_at)
|
|
3009
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
3475
|
+
sequence, replan_triggered_at, is_sketch, sketch_scope)
|
|
3476
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
3010
3477
|
);
|
|
3011
3478
|
for (const s of manifest.slices) {
|
|
3012
3479
|
slStmt.run(
|
|
@@ -3015,17 +3482,21 @@ export function restoreManifest(manifest: StateManifest): void {
|
|
|
3015
3482
|
s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md,
|
|
3016
3483
|
s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact,
|
|
3017
3484
|
s.sequence, s.replan_triggered_at,
|
|
3485
|
+
s.is_sketch ?? 0,
|
|
3486
|
+
s.sketch_scope ?? "",
|
|
3018
3487
|
);
|
|
3019
3488
|
}
|
|
3020
3489
|
|
|
3021
|
-
// Restore tasks
|
|
3490
|
+
// Restore tasks (ADR-011 P2: includes blocker_source + escalation_* columns)
|
|
3022
3491
|
const tkStmt = db.prepare(
|
|
3023
3492
|
`INSERT INTO tasks (milestone_id, slice_id, id, title, status,
|
|
3024
3493
|
one_liner, narrative, verification_result, duration, completed_at,
|
|
3025
3494
|
blocker_discovered, deviations, known_issues, key_files, key_decisions,
|
|
3026
3495
|
full_summary_md, description, estimate, files, verify,
|
|
3027
|
-
inputs, expected_output, observability_impact, sequence
|
|
3028
|
-
|
|
3496
|
+
inputs, expected_output, observability_impact, sequence,
|
|
3497
|
+
blocker_source, escalation_pending, escalation_awaiting_review,
|
|
3498
|
+
escalation_artifact_path, escalation_override_applied_at)
|
|
3499
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
3029
3500
|
);
|
|
3030
3501
|
for (const t of manifest.tasks) {
|
|
3031
3502
|
tkStmt.run(
|
|
@@ -3036,16 +3507,21 @@ export function restoreManifest(manifest: StateManifest): void {
|
|
|
3036
3507
|
t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify,
|
|
3037
3508
|
JSON.stringify(t.inputs), JSON.stringify(t.expected_output),
|
|
3038
3509
|
t.observability_impact, t.sequence,
|
|
3510
|
+
t.blocker_source ?? "",
|
|
3511
|
+
t.escalation_pending ?? 0,
|
|
3512
|
+
t.escalation_awaiting_review ?? 0,
|
|
3513
|
+
t.escalation_artifact_path ?? null,
|
|
3514
|
+
t.escalation_override_applied_at ?? null,
|
|
3039
3515
|
);
|
|
3040
3516
|
}
|
|
3041
3517
|
|
|
3042
|
-
// Restore decisions
|
|
3518
|
+
// Restore decisions (ADR-011 P2: include source so escalation decisions survive)
|
|
3043
3519
|
const dcStmt = db.prepare(
|
|
3044
|
-
`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
|
|
3045
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
3520
|
+
`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
|
|
3521
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
3046
3522
|
);
|
|
3047
3523
|
for (const d of manifest.decisions) {
|
|
3048
|
-
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);
|
|
3524
|
+
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);
|
|
3049
3525
|
}
|
|
3050
3526
|
|
|
3051
3527
|
// Restore verification evidence
|
|
@@ -3146,11 +3622,21 @@ export function insertMemoryRow(args: {
|
|
|
3146
3622
|
sourceUnitId: string | null;
|
|
3147
3623
|
createdAt: string;
|
|
3148
3624
|
updatedAt: string;
|
|
3625
|
+
scope?: string;
|
|
3626
|
+
tags?: string[];
|
|
3627
|
+
/**
|
|
3628
|
+
* ADR-013 Step 2: optional structured payload preserved alongside the flat
|
|
3629
|
+
* `content` field. Used to retain gsd_save_decision-style fields (scope,
|
|
3630
|
+
* decision, choice, rationale, made_by, revisable) on architecture-category
|
|
3631
|
+
* memories so the cutover in Step 6 is lossless. Schema is intentionally
|
|
3632
|
+
* open inside the JSON; documented per category in ADR-013.
|
|
3633
|
+
*/
|
|
3634
|
+
structuredFields?: Record<string, unknown> | null;
|
|
3149
3635
|
}): void {
|
|
3150
3636
|
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3151
3637
|
currentDb.prepare(
|
|
3152
|
-
`INSERT INTO memories (id, category, content, confidence, source_unit_type, source_unit_id, created_at, updated_at)
|
|
3153
|
-
VALUES (:id, :category, :content, :confidence, :source_unit_type, :source_unit_id, :created_at, :updated_at)`,
|
|
3638
|
+
`INSERT INTO memories (id, category, content, confidence, source_unit_type, source_unit_id, created_at, updated_at, scope, tags, structured_fields)
|
|
3639
|
+
VALUES (:id, :category, :content, :confidence, :source_unit_type, :source_unit_id, :created_at, :updated_at, :scope, :tags, :structured_fields)`,
|
|
3154
3640
|
).run({
|
|
3155
3641
|
":id": args.id,
|
|
3156
3642
|
":category": args.category,
|
|
@@ -3160,9 +3646,108 @@ export function insertMemoryRow(args: {
|
|
|
3160
3646
|
":source_unit_id": args.sourceUnitId,
|
|
3161
3647
|
":created_at": args.createdAt,
|
|
3162
3648
|
":updated_at": args.updatedAt,
|
|
3649
|
+
":scope": args.scope ?? "project",
|
|
3650
|
+
":tags": JSON.stringify(args.tags ?? []),
|
|
3651
|
+
":structured_fields": args.structuredFields == null ? null : JSON.stringify(args.structuredFields),
|
|
3652
|
+
});
|
|
3653
|
+
}
|
|
3654
|
+
|
|
3655
|
+
export function insertMemorySourceRow(args: {
|
|
3656
|
+
id: string;
|
|
3657
|
+
kind: string;
|
|
3658
|
+
uri: string | null;
|
|
3659
|
+
title: string | null;
|
|
3660
|
+
content: string;
|
|
3661
|
+
contentHash: string;
|
|
3662
|
+
importedAt: string;
|
|
3663
|
+
scope?: string;
|
|
3664
|
+
tags?: string[];
|
|
3665
|
+
}): void {
|
|
3666
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3667
|
+
currentDb.prepare(
|
|
3668
|
+
`INSERT OR IGNORE INTO memory_sources (id, kind, uri, title, content, content_hash, imported_at, scope, tags)
|
|
3669
|
+
VALUES (:id, :kind, :uri, :title, :content, :content_hash, :imported_at, :scope, :tags)`,
|
|
3670
|
+
).run({
|
|
3671
|
+
":id": args.id,
|
|
3672
|
+
":kind": args.kind,
|
|
3673
|
+
":uri": args.uri,
|
|
3674
|
+
":title": args.title,
|
|
3675
|
+
":content": args.content,
|
|
3676
|
+
":content_hash": args.contentHash,
|
|
3677
|
+
":imported_at": args.importedAt,
|
|
3678
|
+
":scope": args.scope ?? "project",
|
|
3679
|
+
":tags": JSON.stringify(args.tags ?? []),
|
|
3680
|
+
});
|
|
3681
|
+
}
|
|
3682
|
+
|
|
3683
|
+
export function deleteMemorySourceRow(id: string): boolean {
|
|
3684
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3685
|
+
const res = currentDb
|
|
3686
|
+
.prepare("DELETE FROM memory_sources WHERE id = :id")
|
|
3687
|
+
.run({ ":id": id }) as { changes?: number };
|
|
3688
|
+
return (res?.changes ?? 0) > 0;
|
|
3689
|
+
}
|
|
3690
|
+
|
|
3691
|
+
export function upsertMemoryEmbedding(args: {
|
|
3692
|
+
memoryId: string;
|
|
3693
|
+
model: string;
|
|
3694
|
+
dim: number;
|
|
3695
|
+
vector: Uint8Array;
|
|
3696
|
+
updatedAt: string;
|
|
3697
|
+
}): void {
|
|
3698
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3699
|
+
currentDb.prepare(
|
|
3700
|
+
`INSERT INTO memory_embeddings (memory_id, model, dim, vector, updated_at)
|
|
3701
|
+
VALUES (:memory_id, :model, :dim, :vector, :updated_at)
|
|
3702
|
+
ON CONFLICT(memory_id) DO UPDATE SET
|
|
3703
|
+
model = excluded.model,
|
|
3704
|
+
dim = excluded.dim,
|
|
3705
|
+
vector = excluded.vector,
|
|
3706
|
+
updated_at = excluded.updated_at`,
|
|
3707
|
+
).run({
|
|
3708
|
+
":memory_id": args.memoryId,
|
|
3709
|
+
":model": args.model,
|
|
3710
|
+
":dim": args.dim,
|
|
3711
|
+
":vector": args.vector,
|
|
3712
|
+
":updated_at": args.updatedAt,
|
|
3713
|
+
});
|
|
3714
|
+
}
|
|
3715
|
+
|
|
3716
|
+
export function deleteMemoryEmbedding(memoryId: string): boolean {
|
|
3717
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3718
|
+
const res = currentDb
|
|
3719
|
+
.prepare("DELETE FROM memory_embeddings WHERE memory_id = :id")
|
|
3720
|
+
.run({ ":id": memoryId }) as { changes?: number };
|
|
3721
|
+
return (res?.changes ?? 0) > 0;
|
|
3722
|
+
}
|
|
3723
|
+
|
|
3724
|
+
export function insertMemoryRelationRow(args: {
|
|
3725
|
+
fromId: string;
|
|
3726
|
+
toId: string;
|
|
3727
|
+
rel: string;
|
|
3728
|
+
confidence: number;
|
|
3729
|
+
createdAt: string;
|
|
3730
|
+
}): void {
|
|
3731
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3732
|
+
currentDb.prepare(
|
|
3733
|
+
`INSERT OR REPLACE INTO memory_relations (from_id, to_id, rel, confidence, created_at)
|
|
3734
|
+
VALUES (:from_id, :to_id, :rel, :confidence, :created_at)`,
|
|
3735
|
+
).run({
|
|
3736
|
+
":from_id": args.fromId,
|
|
3737
|
+
":to_id": args.toId,
|
|
3738
|
+
":rel": args.rel,
|
|
3739
|
+
":confidence": args.confidence,
|
|
3740
|
+
":created_at": args.createdAt,
|
|
3163
3741
|
});
|
|
3164
3742
|
}
|
|
3165
3743
|
|
|
3744
|
+
export function deleteMemoryRelationsFor(memoryId: string): void {
|
|
3745
|
+
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3746
|
+
currentDb
|
|
3747
|
+
.prepare("DELETE FROM memory_relations WHERE from_id = :id OR to_id = :id")
|
|
3748
|
+
.run({ ":id": memoryId });
|
|
3749
|
+
}
|
|
3750
|
+
|
|
3166
3751
|
export function rewriteMemoryId(placeholderId: string, realId: string): void {
|
|
3167
3752
|
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
3168
3753
|
currentDb.prepare("UPDATE memories SET id = :real_id WHERE id = :placeholder").run({
|