gsd-pi 2.41.0 → 2.42.0-dev.1df898f
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 +92 -29
- package/dist/cli-web-branch.d.ts +6 -0
- package/dist/cli-web-branch.js +17 -0
- package/dist/cli.js +18 -3
- package/dist/loader.js +3 -1
- package/dist/onboarding.js +2 -1
- package/dist/resource-loader.js +39 -6
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +52 -4
- package/dist/resources/extensions/async-jobs/await-tool.js +5 -0
- package/dist/resources/extensions/async-jobs/index.js +2 -0
- package/dist/resources/extensions/gsd/auto/loop.js +89 -1
- package/dist/resources/extensions/gsd/auto/phases.js +29 -13
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +8 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +19 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +7 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +3 -16
- package/dist/resources/extensions/gsd/auto-recovery.js +12 -4
- package/dist/resources/extensions/gsd/auto-start.js +16 -14
- package/dist/resources/extensions/gsd/auto-worktree.js +147 -13
- package/dist/resources/extensions/gsd/auto.js +64 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +199 -164
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +62 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +25 -3
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +7 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +40 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +146 -0
- package/dist/resources/extensions/gsd/context-injector.js +74 -0
- package/dist/resources/extensions/gsd/context-store.js +4 -3
- package/dist/resources/extensions/gsd/custom-execution-policy.js +47 -0
- package/dist/resources/extensions/gsd/custom-verification.js +145 -0
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +164 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -0
- package/dist/resources/extensions/gsd/db-writer.js +5 -2
- package/dist/resources/extensions/gsd/definition-loader.js +352 -0
- package/dist/resources/extensions/gsd/detection.js +20 -1
- package/dist/resources/extensions/gsd/dev-execution-policy.js +24 -0
- package/dist/resources/extensions/gsd/dev-workflow-engine.js +82 -0
- package/dist/resources/extensions/gsd/doctor-checks.js +31 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +10 -0
- package/dist/resources/extensions/gsd/doctor.js +11 -1
- package/dist/resources/extensions/gsd/engine-resolver.js +40 -0
- package/dist/resources/extensions/gsd/engine-types.js +8 -0
- package/dist/resources/extensions/gsd/execution-policy.js +8 -0
- package/dist/resources/extensions/gsd/exit-command.js +12 -2
- package/dist/resources/extensions/gsd/export.js +9 -13
- package/dist/resources/extensions/gsd/extension-manifest.json +2 -2
- package/dist/resources/extensions/gsd/files.js +28 -11
- package/dist/resources/extensions/gsd/forensics.js +94 -3
- package/dist/resources/extensions/gsd/git-constants.js +1 -0
- package/dist/resources/extensions/gsd/git-service.js +6 -2
- package/dist/resources/extensions/gsd/graph.js +225 -0
- package/dist/resources/extensions/gsd/gsd-db.js +25 -8
- package/dist/resources/extensions/gsd/guided-flow-queue.js +1 -1
- package/dist/resources/extensions/gsd/guided-flow.js +7 -3
- package/dist/resources/extensions/gsd/journal.js +85 -0
- package/dist/resources/extensions/gsd/md-importer.js +5 -0
- package/dist/resources/extensions/gsd/milestone-ids.js +1 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +3 -2
- package/dist/resources/extensions/gsd/post-unit-hooks.js +24 -412
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences.js +60 -8
- package/dist/resources/extensions/gsd/prompt-loader.js +34 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +11 -10
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +2 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/dist/resources/extensions/gsd/prompts/forensics.md +12 -5
- package/dist/resources/extensions/gsd/prompts/queue.md +1 -1
- package/dist/resources/extensions/gsd/repo-identity.js +92 -7
- package/dist/resources/extensions/gsd/rule-registry.js +489 -0
- package/dist/resources/extensions/gsd/rule-types.js +6 -0
- package/dist/resources/extensions/gsd/run-manager.js +134 -0
- package/dist/resources/extensions/gsd/service-tier.js +147 -0
- package/dist/resources/extensions/gsd/session-lock.js +2 -2
- package/dist/resources/extensions/gsd/structured-data-formatter.js +2 -1
- package/dist/resources/extensions/gsd/templates/decisions.md +2 -2
- package/dist/resources/extensions/gsd/workflow-engine.js +7 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +13 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +20 -6
- package/dist/resources/extensions/gsd/worktree-resolver.js +21 -4
- package/dist/resources/extensions/gsd/worktree.js +2 -2
- package/dist/resources/extensions/mcp-client/index.js +2 -1
- package/dist/resources/extensions/search-the-web/tool-search.js +3 -3
- package/dist/resources/extensions/subagent/index.js +7 -3
- package/dist/resources/extensions/voice/index.js +4 -4
- package/dist/resources/skills/create-workflow/SKILL.md +103 -0
- package/dist/resources/skills/create-workflow/references/feature-patterns.md +128 -0
- package/dist/resources/skills/create-workflow/references/verification-policies.md +76 -0
- package/dist/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
- package/dist/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
- package/dist/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
- package/dist/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
- package/dist/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
- package/dist/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
- package/dist/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
- 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 +1 -1
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
- 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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- 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_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_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_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_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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +9 -9
- package/dist/web/standalone/.next/server/chunks/229.js +3 -3
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/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 +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/4024.c195dc1fdd2adbea.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
- 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-9afaaebf6042a1d7.js → webpack-fa307370fcf9fb2c.js} +1 -1
- 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/web-mode.d.ts +4 -0
- package/dist/web-mode.js +69 -11
- package/package.json +1 -1
- package/packages/native/src/__tests__/text.test.mjs +33 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +6 -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/src/agent.test.ts +53 -0
- package/packages/pi-agent-core/src/agent.ts +3 -0
- package/packages/pi-agent-core/src/types.ts +6 -0
- package/packages/pi-agent-core/tsconfig.json +1 -1
- package/packages/pi-ai/dist/models.d.ts +5 -3
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +801 -1468
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +1135 -1588
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +60 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +1543 -0
- package/packages/pi-ai/src/models.generated.ts +1140 -1593
- package/packages/pi-ai/src/models.ts +7 -4
- package/packages/pi-ai/src/utils/oauth/github-copilot.ts +74 -2
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +8 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +7 -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 +29 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +60 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +3 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.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 +18 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +23 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +63 -11
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +20 -6
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +6 -5
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.js +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.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 +9 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +10 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +34 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +7 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +68 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +30 -2
- package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +4 -2
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +18 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +29 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +3 -0
- package/packages/pi-coding-agent/src/core/package-manager.ts +99 -58
- package/packages/pi-coding-agent/src/core/resource-loader.ts +24 -6
- package/packages/pi-coding-agent/src/core/system-prompt.ts +6 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-editor.ts +3 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +10 -6
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +11 -7
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +36 -11
- package/pkg/package.json +1 -1
- package/src/resources/extensions/async-jobs/async-bash-timeout.test.ts +122 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +40 -4
- package/src/resources/extensions/async-jobs/await-tool.test.ts +47 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +5 -0
- package/src/resources/extensions/async-jobs/index.ts +1 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +5 -2
- package/src/resources/extensions/gsd/auto/loop.ts +101 -1
- package/src/resources/extensions/gsd/auto/phases.ts +31 -13
- package/src/resources/extensions/gsd/auto/session.ts +6 -0
- package/src/resources/extensions/gsd/auto/types.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +9 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +25 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +8 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +2 -18
- package/src/resources/extensions/gsd/auto-recovery.ts +12 -4
- package/src/resources/extensions/gsd/auto-start.ts +15 -13
- package/src/resources/extensions/gsd/auto-worktree.ts +162 -18
- package/src/resources/extensions/gsd/auto.ts +71 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +209 -162
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +62 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +25 -4
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +9 -2
- package/src/resources/extensions/gsd/commands/catalog.ts +40 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +164 -0
- package/src/resources/extensions/gsd/context-injector.ts +100 -0
- package/src/resources/extensions/gsd/context-store.ts +4 -3
- package/src/resources/extensions/gsd/custom-execution-policy.ts +73 -0
- package/src/resources/extensions/gsd/custom-verification.ts +180 -0
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +216 -0
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -0
- package/src/resources/extensions/gsd/db-writer.ts +6 -2
- package/src/resources/extensions/gsd/definition-loader.ts +462 -0
- package/src/resources/extensions/gsd/detection.ts +20 -1
- package/src/resources/extensions/gsd/dev-execution-policy.ts +51 -0
- package/src/resources/extensions/gsd/dev-workflow-engine.ts +110 -0
- package/src/resources/extensions/gsd/doctor-checks.ts +32 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +13 -0
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +12 -1
- package/src/resources/extensions/gsd/engine-resolver.ts +57 -0
- package/src/resources/extensions/gsd/engine-types.ts +71 -0
- package/src/resources/extensions/gsd/execution-policy.ts +43 -0
- package/src/resources/extensions/gsd/exit-command.ts +14 -2
- package/src/resources/extensions/gsd/export.ts +8 -15
- package/src/resources/extensions/gsd/extension-manifest.json +2 -2
- package/src/resources/extensions/gsd/files.ts +29 -12
- package/src/resources/extensions/gsd/forensics.ts +101 -3
- package/src/resources/extensions/gsd/git-constants.ts +1 -0
- package/src/resources/extensions/gsd/git-service.ts +5 -5
- package/src/resources/extensions/gsd/gitignore.ts +1 -1
- package/src/resources/extensions/gsd/graph.ts +312 -0
- package/src/resources/extensions/gsd/gsd-db.ts +37 -8
- package/src/resources/extensions/gsd/guided-flow-queue.ts +1 -1
- package/src/resources/extensions/gsd/guided-flow.ts +7 -3
- package/src/resources/extensions/gsd/journal.ts +134 -0
- package/src/resources/extensions/gsd/md-importer.ts +6 -0
- package/src/resources/extensions/gsd/milestone-ids.ts +1 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +3 -2
- package/src/resources/extensions/gsd/post-unit-hooks.ts +24 -462
- package/src/resources/extensions/gsd/preferences-types.ts +6 -0
- package/src/resources/extensions/gsd/preferences.ts +63 -6
- package/src/resources/extensions/gsd/prompt-loader.ts +35 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +11 -10
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +2 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/src/resources/extensions/gsd/prompts/forensics.md +12 -5
- package/src/resources/extensions/gsd/prompts/queue.md +1 -1
- package/src/resources/extensions/gsd/repo-identity.ts +95 -7
- package/src/resources/extensions/gsd/rule-registry.ts +599 -0
- package/src/resources/extensions/gsd/rule-types.ts +68 -0
- package/src/resources/extensions/gsd/run-manager.ts +180 -0
- package/src/resources/extensions/gsd/service-tier.ts +184 -0
- package/src/resources/extensions/gsd/session-lock.ts +2 -2
- package/src/resources/extensions/gsd/structured-data-formatter.ts +3 -1
- package/src/resources/extensions/gsd/templates/decisions.md +2 -2
- package/src/resources/extensions/gsd/tests/activity-log.test.ts +31 -69
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +103 -120
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +202 -0
- package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/captures.test.ts +12 -1
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +283 -0
- package/src/resources/extensions/gsd/tests/context-injector.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +10 -5
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +20 -20
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +540 -0
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +382 -0
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +339 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +778 -0
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +318 -0
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +15 -10
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +5 -4
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/e2e-workflow-pipeline-integration.test.ts +476 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +271 -0
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +599 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +429 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +513 -0
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/journal.test.ts +341 -0
- package/src/resources/extensions/gsd/tests/manifest-status.test.ts +73 -82
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parsers.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -25
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/routing-history.test.ts +11 -22
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +413 -0
- package/src/resources/extensions/gsd/tests/run-manager.test.ts +229 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +56 -3
- package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +156 -263
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +203 -106
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +79 -5
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +74 -0
- package/src/resources/extensions/gsd/types.ts +3 -0
- package/src/resources/extensions/gsd/workflow-engine.ts +38 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +12 -1
- package/src/resources/extensions/gsd/worktree-manager.ts +21 -6
- package/src/resources/extensions/gsd/worktree-resolver.ts +32 -12
- package/src/resources/extensions/gsd/worktree.ts +2 -2
- package/src/resources/extensions/mcp-client/index.ts +5 -1
- package/src/resources/extensions/search-the-web/tool-search.ts +3 -3
- package/src/resources/extensions/subagent/index.ts +7 -3
- package/src/resources/extensions/voice/index.ts +4 -4
- package/src/resources/skills/create-workflow/SKILL.md +103 -0
- package/src/resources/skills/create-workflow/references/feature-patterns.md +128 -0
- package/src/resources/skills/create-workflow/references/verification-policies.md +76 -0
- package/src/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
- package/src/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
- package/src/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
- package/src/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
- package/src/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
- package/src/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
- package/src/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
- package/dist/web/standalone/.next/static/chunks/4024.279c423e4661ece1.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
- /package/dist/web/standalone/.next/static/{Ute3pMouVczQyT15qrBBO → qw8qDHXOTLUXBq1vEknSz}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Ute3pMouVczQyT15qrBBO → qw8qDHXOTLUXBq1vEknSz}/_ssgManifest.js +0 -0
|
@@ -26,6 +26,7 @@ import { runUnit } from "./run-unit.js";
|
|
|
26
26
|
import { debugLog } from "../debug-logger.js";
|
|
27
27
|
import { gsdRoot } from "../paths.js";
|
|
28
28
|
import { atomicWriteSync } from "../atomic-write.js";
|
|
29
|
+
import { PROJECT_FILES } from "../detection.js";
|
|
29
30
|
import { join } from "node:path";
|
|
30
31
|
|
|
31
32
|
// ─── generateMilestoneReport ──────────────────────────────────────────────────
|
|
@@ -192,6 +193,7 @@ export async function runPreDispatch(
|
|
|
192
193
|
|
|
193
194
|
// ── Milestone transition ────────────────────────────────────────────
|
|
194
195
|
if (mid && s.currentMilestoneId && mid !== s.currentMilestoneId) {
|
|
196
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "milestone-transition", data: { from: s.currentMilestoneId, to: mid } });
|
|
195
197
|
ctx.ui.notify(
|
|
196
198
|
`Milestone ${s.currentMilestoneId} complete. Advancing to ${mid}: ${midTitle}.`,
|
|
197
199
|
"info",
|
|
@@ -259,9 +261,7 @@ export async function runPreDispatch(
|
|
|
259
261
|
|
|
260
262
|
if (mid) {
|
|
261
263
|
if (deps.getIsolationMode() !== "none") {
|
|
262
|
-
deps.captureIntegrationBranch(s.basePath, mid
|
|
263
|
-
commitDocs: prefs?.git?.commit_docs,
|
|
264
|
-
});
|
|
264
|
+
deps.captureIntegrationBranch(s.basePath, mid);
|
|
265
265
|
}
|
|
266
266
|
deps.resolver.enterMilestone(mid, ctx.ui);
|
|
267
267
|
} else {
|
|
@@ -386,6 +386,7 @@ export async function runPreDispatch(
|
|
|
386
386
|
);
|
|
387
387
|
}
|
|
388
388
|
debugLog("autoLoop", { phase: "exit", reason: "no-active-milestone" });
|
|
389
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "no-active-milestone" } });
|
|
389
390
|
return { action: "break", reason: "no-active-milestone" };
|
|
390
391
|
}
|
|
391
392
|
|
|
@@ -454,6 +455,7 @@ export async function runPreDispatch(
|
|
|
454
455
|
);
|
|
455
456
|
await closeoutAndStop(ctx, pi, s, deps, `Milestone ${mid} complete`);
|
|
456
457
|
debugLog("autoLoop", { phase: "exit", reason: "milestone-complete" });
|
|
458
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "milestone-complete", milestoneId: mid } });
|
|
457
459
|
return { action: "break", reason: "milestone-complete" };
|
|
458
460
|
}
|
|
459
461
|
|
|
@@ -465,6 +467,7 @@ export async function runPreDispatch(
|
|
|
465
467
|
deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention");
|
|
466
468
|
deps.logCmuxEvent(prefs, blockerMsg, "error");
|
|
467
469
|
debugLog("autoLoop", { phase: "exit", reason: "blocked" });
|
|
470
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "blocked", blockers: state.blockers } });
|
|
468
471
|
return { action: "break", reason: "blocked" };
|
|
469
472
|
}
|
|
470
473
|
|
|
@@ -497,6 +500,7 @@ export async function runDispatch(
|
|
|
497
500
|
});
|
|
498
501
|
|
|
499
502
|
if (dispatchResult.action === "stop") {
|
|
503
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "dispatch-stop", rule: dispatchResult.matchedRule, data: { reason: dispatchResult.reason } });
|
|
500
504
|
await closeoutAndStop(ctx, pi, s, deps, dispatchResult.reason);
|
|
501
505
|
debugLog("autoLoop", { phase: "exit", reason: "dispatch-stop" });
|
|
502
506
|
return { action: "break", reason: "dispatch-stop" };
|
|
@@ -508,6 +512,8 @@ export async function runDispatch(
|
|
|
508
512
|
return { action: "continue" };
|
|
509
513
|
}
|
|
510
514
|
|
|
515
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "dispatch-match", rule: dispatchResult.matchedRule, data: { unitType: dispatchResult.unitType, unitId: dispatchResult.unitId } });
|
|
516
|
+
|
|
511
517
|
let unitType = dispatchResult.unitType;
|
|
512
518
|
let unitId = dispatchResult.unitId;
|
|
513
519
|
let prompt = dispatchResult.prompt;
|
|
@@ -600,6 +606,7 @@ export async function runDispatch(
|
|
|
600
606
|
`Pre-dispatch hook${preDispatchResult.firedHooks.length > 1 ? "s" : ""}: ${preDispatchResult.firedHooks.join(", ")}`,
|
|
601
607
|
"info",
|
|
602
608
|
);
|
|
609
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "pre-dispatch-hook", data: { firedHooks: preDispatchResult.firedHooks, action: preDispatchResult.action } });
|
|
603
610
|
}
|
|
604
611
|
if (preDispatchResult.action === "skip") {
|
|
605
612
|
ctx.ui.notify(
|
|
@@ -809,25 +816,27 @@ export async function runUnitPhase(
|
|
|
809
816
|
unitId,
|
|
810
817
|
});
|
|
811
818
|
|
|
812
|
-
// ── Worktree health check (#1833)
|
|
819
|
+
// ── Worktree health check (#1833, #1843) ────────────────────────────
|
|
813
820
|
// Verify the working directory is a valid git checkout with project
|
|
814
821
|
// files before dispatching work. A broken worktree causes agents to
|
|
815
822
|
// hallucinate summaries since they cannot read or write any files.
|
|
823
|
+
// Uses the shared PROJECT_FILES list from detection.ts to support all
|
|
824
|
+
// ecosystems (Rust, Go, Python, Java, etc.), not just JS.
|
|
816
825
|
if (s.basePath && unitType === "execute-task") {
|
|
817
826
|
const gitMarker = join(s.basePath, ".git");
|
|
818
827
|
const hasGit = deps.existsSync(gitMarker);
|
|
819
|
-
const hasPackageJson = deps.existsSync(join(s.basePath, "package.json"));
|
|
820
|
-
const hasSrcDir = deps.existsSync(join(s.basePath, "src"));
|
|
821
828
|
if (!hasGit) {
|
|
822
829
|
const msg = `Worktree health check failed: ${s.basePath} has no .git — refusing to dispatch ${unitType} ${unitId}`;
|
|
823
|
-
debugLog("runUnitPhase", { phase: "worktree-health-fail", basePath: s.basePath, hasGit
|
|
830
|
+
debugLog("runUnitPhase", { phase: "worktree-health-fail", basePath: s.basePath, hasGit });
|
|
824
831
|
ctx.ui.notify(msg, "error");
|
|
825
832
|
await deps.stopAuto(ctx, pi, msg);
|
|
826
833
|
return { action: "break", reason: "worktree-invalid" };
|
|
827
834
|
}
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
835
|
+
const hasProjectFile = PROJECT_FILES.some((f) => deps.existsSync(join(s.basePath, f)));
|
|
836
|
+
const hasSrcDir = deps.existsSync(join(s.basePath, "src"));
|
|
837
|
+
if (!hasProjectFile && !hasSrcDir) {
|
|
838
|
+
const msg = `Worktree health check failed: ${s.basePath} has no recognized project files — refusing to dispatch ${unitType} ${unitId}`;
|
|
839
|
+
debugLog("runUnitPhase", { phase: "worktree-health-fail", basePath: s.basePath, hasProjectFile, hasSrcDir });
|
|
831
840
|
ctx.ui.notify(msg, "error");
|
|
832
841
|
await deps.stopAuto(ctx, pi, msg);
|
|
833
842
|
return { action: "break", reason: "worktree-invalid" };
|
|
@@ -843,6 +852,8 @@ export async function runUnitPhase(
|
|
|
843
852
|
const previousTier = s.currentUnitRouting?.tier;
|
|
844
853
|
|
|
845
854
|
s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
|
|
855
|
+
const unitStartSeq = ic.nextSeq();
|
|
856
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
|
|
846
857
|
deps.captureAvailableSkills();
|
|
847
858
|
deps.writeUnitRuntimeRecord(
|
|
848
859
|
s.basePath,
|
|
@@ -988,7 +999,12 @@ export async function runUnitPhase(
|
|
|
988
999
|
unitId,
|
|
989
1000
|
prefs,
|
|
990
1001
|
buildSnapshotOpts: () => deps.buildSnapshotOpts(unitType, unitId),
|
|
991
|
-
buildRecoveryContext: () => ({
|
|
1002
|
+
buildRecoveryContext: () => ({
|
|
1003
|
+
basePath: s.basePath,
|
|
1004
|
+
verbose: s.verbose,
|
|
1005
|
+
currentUnitStartedAt: s.currentUnit?.startedAt ?? Date.now(),
|
|
1006
|
+
unitRecoveryCount: s.unitRecoveryCount,
|
|
1007
|
+
}),
|
|
992
1008
|
pauseAuto: deps.pauseAuto,
|
|
993
1009
|
});
|
|
994
1010
|
|
|
@@ -1115,9 +1131,9 @@ export async function runUnitPhase(
|
|
|
1115
1131
|
);
|
|
1116
1132
|
}
|
|
1117
1133
|
|
|
1118
|
-
const
|
|
1134
|
+
const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
|
|
1119
1135
|
const artifactVerified =
|
|
1120
|
-
|
|
1136
|
+
skipArtifactVerification ||
|
|
1121
1137
|
deps.verifyExpectedArtifact(unitType, unitId, s.basePath);
|
|
1122
1138
|
if (artifactVerified) {
|
|
1123
1139
|
s.completedUnits.push({
|
|
@@ -1141,6 +1157,8 @@ export async function runUnitPhase(
|
|
|
1141
1157
|
s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
|
|
1142
1158
|
}
|
|
1143
1159
|
|
|
1160
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitResult.status, artifactVerified }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
|
|
1161
|
+
|
|
1144
1162
|
return { action: "next", data: { unitStartedAt: s.currentUnit.startedAt } };
|
|
1145
1163
|
}
|
|
1146
1164
|
|
|
@@ -83,6 +83,8 @@ export class AutoSession {
|
|
|
83
83
|
paused = false;
|
|
84
84
|
stepMode = false;
|
|
85
85
|
verbose = false;
|
|
86
|
+
activeEngineId: string | null = null;
|
|
87
|
+
activeRunDir: string | null = null;
|
|
86
88
|
cmdCtx: ExtensionCommandContext | null = null;
|
|
87
89
|
|
|
88
90
|
// ── Paths ────────────────────────────────────────────────────────────────
|
|
@@ -174,6 +176,8 @@ export class AutoSession {
|
|
|
174
176
|
this.paused = false;
|
|
175
177
|
this.stepMode = false;
|
|
176
178
|
this.verbose = false;
|
|
179
|
+
this.activeEngineId = null;
|
|
180
|
+
this.activeRunDir = null;
|
|
177
181
|
this.cmdCtx = null;
|
|
178
182
|
|
|
179
183
|
// Paths
|
|
@@ -226,6 +230,8 @@ export class AutoSession {
|
|
|
226
230
|
paused: this.paused,
|
|
227
231
|
stepMode: this.stepMode,
|
|
228
232
|
basePath: this.basePath,
|
|
233
|
+
activeEngineId: this.activeEngineId,
|
|
234
|
+
activeRunDir: this.activeRunDir,
|
|
229
235
|
currentMilestoneId: this.currentMilestoneId,
|
|
230
236
|
currentUnit: this.currentUnit,
|
|
231
237
|
completedUnits: this.completedUnits.length,
|
|
@@ -69,6 +69,10 @@ export interface IterationContext {
|
|
|
69
69
|
deps: LoopDeps;
|
|
70
70
|
prefs: GSDPreferences | undefined;
|
|
71
71
|
iteration: number;
|
|
72
|
+
/** UUID grouping all journal events for this iteration. */
|
|
73
|
+
flowId: string;
|
|
74
|
+
/** Returns the next monotonically increasing sequence number (1-based, reset per iteration). */
|
|
75
|
+
nextSeq: () => number;
|
|
72
76
|
}
|
|
73
77
|
|
|
74
78
|
export interface LoopState {
|
|
@@ -24,6 +24,7 @@ import { GLYPH, INDENT } from "../shared/mod.js";
|
|
|
24
24
|
import { computeProgressScore } from "./progress-score.js";
|
|
25
25
|
import { getActiveWorktreeName } from "./worktree-command.js";
|
|
26
26
|
import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
|
|
27
|
+
import { resolveServiceTierIcon, getEffectiveServiceTier } from "./service-tier.js";
|
|
27
28
|
|
|
28
29
|
// ─── UAT Slice Extraction ─────────────────────────────────────────────────────
|
|
29
30
|
|
|
@@ -78,6 +79,7 @@ export function unitVerb(unitType: string): string {
|
|
|
78
79
|
case "rewrite-docs": return "rewriting";
|
|
79
80
|
case "reassess-roadmap": return "reassessing";
|
|
80
81
|
case "run-uat": return "running UAT";
|
|
82
|
+
case "custom-step": return "executing workflow step";
|
|
81
83
|
default: return unitType;
|
|
82
84
|
}
|
|
83
85
|
}
|
|
@@ -96,6 +98,7 @@ export function unitPhaseLabel(unitType: string): string {
|
|
|
96
98
|
case "rewrite-docs": return "REWRITE";
|
|
97
99
|
case "reassess-roadmap": return "REASSESS";
|
|
98
100
|
case "run-uat": return "UAT";
|
|
101
|
+
case "custom-step": return "WORKFLOW";
|
|
99
102
|
default: return unitType.toUpperCase();
|
|
100
103
|
}
|
|
101
104
|
}
|
|
@@ -460,6 +463,9 @@ export function updateProgressWidget(
|
|
|
460
463
|
// Pre-fetch last commit for display
|
|
461
464
|
refreshLastCommit(accessors.getBasePath());
|
|
462
465
|
|
|
466
|
+
// Cache the effective service tier at widget creation time (reads preferences)
|
|
467
|
+
const effectiveServiceTier = getEffectiveServiceTier();
|
|
468
|
+
|
|
463
469
|
ctx.ui.setWidget("gsd-progress", (tui, theme) => {
|
|
464
470
|
let pulseBright = true;
|
|
465
471
|
let cachedLines: string[] | undefined;
|
|
@@ -572,9 +578,10 @@ export function updateProgressWidget(
|
|
|
572
578
|
// Model display — shown in context section, not stats
|
|
573
579
|
const modelId = cmdCtx?.model?.id ?? "";
|
|
574
580
|
const modelProvider = cmdCtx?.model?.provider ?? "";
|
|
575
|
-
const
|
|
581
|
+
const tierIcon = resolveServiceTierIcon(effectiveServiceTier, modelId);
|
|
582
|
+
const modelDisplay = (modelProvider && modelId
|
|
576
583
|
? `${modelProvider}/${modelId}`
|
|
577
|
-
: modelId;
|
|
584
|
+
: modelId) + (tierIcon ? ` ${tierIcon}` : "");
|
|
578
585
|
|
|
579
586
|
// ── Mode: off — return empty ──────────────────────────────────
|
|
580
587
|
if (widgetMode === "off") {
|
|
@@ -54,9 +54,11 @@ export type DispatchAction =
|
|
|
54
54
|
unitId: string;
|
|
55
55
|
prompt: string;
|
|
56
56
|
pauseAfterDispatch?: boolean;
|
|
57
|
+
/** Name of the matched dispatch rule from the unified registry (journal provenance). */
|
|
58
|
+
matchedRule?: string;
|
|
57
59
|
}
|
|
58
|
-
| { action: "stop"; reason: string; level: "info" | "warning" | "error" }
|
|
59
|
-
| { action: "skip" };
|
|
60
|
+
| { action: "stop"; reason: string; level: "info" | "warning" | "error"; matchedRule?: string }
|
|
61
|
+
| { action: "skip"; matchedRule?: string };
|
|
60
62
|
|
|
61
63
|
export interface DispatchContext {
|
|
62
64
|
basePath: string;
|
|
@@ -67,7 +69,7 @@ export interface DispatchContext {
|
|
|
67
69
|
session?: import("./auto/session.js").AutoSession;
|
|
68
70
|
}
|
|
69
71
|
|
|
70
|
-
interface DispatchRule {
|
|
72
|
+
export interface DispatchRule {
|
|
71
73
|
/** Human-readable name for debugging and test identification */
|
|
72
74
|
name: string;
|
|
73
75
|
/** Return a DispatchAction if this rule matches, null to fall through */
|
|
@@ -88,7 +90,7 @@ const MAX_REWRITE_ATTEMPTS = 3;
|
|
|
88
90
|
|
|
89
91
|
// ─── Rules ────────────────────────────────────────────────────────────────
|
|
90
92
|
|
|
91
|
-
const DISPATCH_RULES: DispatchRule[] = [
|
|
93
|
+
export const DISPATCH_RULES: DispatchRule[] = [
|
|
92
94
|
{
|
|
93
95
|
name: "rewrite-docs (override gate)",
|
|
94
96
|
match: async ({ mid, midTitle, state, basePath, session }) => {
|
|
@@ -608,18 +610,35 @@ const DISPATCH_RULES: DispatchRule[] = [
|
|
|
608
610
|
},
|
|
609
611
|
];
|
|
610
612
|
|
|
613
|
+
import { getRegistry } from "./rule-registry.js";
|
|
614
|
+
|
|
611
615
|
// ─── Resolver ─────────────────────────────────────────────────────────────
|
|
612
616
|
|
|
613
617
|
/**
|
|
614
618
|
* Evaluate dispatch rules in order. Returns the first matching action,
|
|
615
619
|
* or a "stop" action if no rule matches (unhandled phase).
|
|
620
|
+
*
|
|
621
|
+
* Delegates to the RuleRegistry when initialized; falls back to inline
|
|
622
|
+
* loop over DISPATCH_RULES for backward compatibility (tests that import
|
|
623
|
+
* resolveDispatch directly without registry initialization).
|
|
616
624
|
*/
|
|
617
625
|
export async function resolveDispatch(
|
|
618
626
|
ctx: DispatchContext,
|
|
619
627
|
): Promise<DispatchAction> {
|
|
628
|
+
// Delegate to registry when available
|
|
629
|
+
try {
|
|
630
|
+
const registry = getRegistry();
|
|
631
|
+
return await registry.evaluateDispatch(ctx);
|
|
632
|
+
} catch {
|
|
633
|
+
// Registry not initialized — fall back to inline loop
|
|
634
|
+
}
|
|
635
|
+
|
|
620
636
|
for (const rule of DISPATCH_RULES) {
|
|
621
637
|
const result = await rule.match(ctx);
|
|
622
|
-
if (result)
|
|
638
|
+
if (result) {
|
|
639
|
+
if (result.action !== "skip") result.matchedRule = rule.name;
|
|
640
|
+
return result;
|
|
641
|
+
}
|
|
623
642
|
}
|
|
624
643
|
|
|
625
644
|
// No rule matched — unhandled phase
|
|
@@ -627,6 +646,7 @@ export async function resolveDispatch(
|
|
|
627
646
|
action: "stop",
|
|
628
647
|
reason: `Unhandled phase "${ctx.state.phase}" — run /gsd doctor to diagnose.`,
|
|
629
648
|
level: "info",
|
|
649
|
+
matchedRule: "<no-match>",
|
|
630
650
|
};
|
|
631
651
|
}
|
|
632
652
|
|
|
@@ -59,6 +59,7 @@ import { existsSync, unlinkSync } from "node:fs";
|
|
|
59
59
|
import { join } from "node:path";
|
|
60
60
|
import { uncheckTaskInPlan } from "./undo.js";
|
|
61
61
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
62
|
+
import { _resetHasChangesCache } from "./native-git-bridge.js";
|
|
62
63
|
|
|
63
64
|
/** Throttle STATE.md rebuilds — at most once per 30 seconds */
|
|
64
65
|
const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
@@ -156,6 +157,13 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
156
157
|
}
|
|
157
158
|
}
|
|
158
159
|
|
|
160
|
+
// Invalidate the nativeHasChanges cache before auto-commit (#1853).
|
|
161
|
+
// The cache has a 10-second TTL and is keyed by basePath. A stale
|
|
162
|
+
// `false` result causes autoCommit to skip staging entirely, leaving
|
|
163
|
+
// code files only in the working tree where they are destroyed by
|
|
164
|
+
// `git worktree remove --force` during teardown.
|
|
165
|
+
_resetHasChangesCache();
|
|
166
|
+
|
|
159
167
|
const commitMsg = autoCommitCurrentBranch(s.basePath, s.currentUnit.type, s.currentUnit.id, taskContext);
|
|
160
168
|
if (commitMsg) {
|
|
161
169
|
ctx.ui.notify(`Committed: ${commitMsg.split("\n")[0]}`, "info");
|
|
@@ -420,8 +420,6 @@ export function buildSkillActivationBlock(params: {
|
|
|
420
420
|
params.sliceTitle,
|
|
421
421
|
params.taskId,
|
|
422
422
|
params.taskTitle,
|
|
423
|
-
...(params.extraContext ?? []),
|
|
424
|
-
params.taskPlanContent ?? undefined,
|
|
425
423
|
);
|
|
426
424
|
|
|
427
425
|
const visibleSkills = (typeof getLoadedSkills === 'function' ? getLoadedSkills() : []).filter(skill => !skill.disableModelInvocation);
|
|
@@ -452,12 +450,6 @@ export function buildSkillActivationBlock(params: {
|
|
|
452
450
|
}
|
|
453
451
|
}
|
|
454
452
|
|
|
455
|
-
for (const skill of visibleSkills) {
|
|
456
|
-
if (skillMatchesContext(skill, contextTokens)) {
|
|
457
|
-
matched.add(normalizeSkillReference(skill.name));
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
453
|
const ordered = [...matched]
|
|
462
454
|
.filter(name => installedNames.has(name) && !avoided.has(name))
|
|
463
455
|
.sort();
|
|
@@ -983,11 +975,7 @@ export async function buildPlanSlicePrompt(
|
|
|
983
975
|
const executorContextConstraints = formatExecutorConstraints();
|
|
984
976
|
|
|
985
977
|
const outputRelPath = relSliceFile(base, mid, sid, "PLAN");
|
|
986
|
-
const
|
|
987
|
-
const commitDocsEnabled = prefs?.preferences?.git?.commit_docs !== false;
|
|
988
|
-
const commitInstruction = commitDocsEnabled
|
|
989
|
-
? `Commit the plan files only: \`git add ${relSlicePath(base, mid, sid)}/ .gsd/DECISIONS.md .gitignore && git commit -m "docs(${sid}): add slice plan"\`. Do not stage .gsd/STATE.md or other runtime files — the system manages those.`
|
|
990
|
-
: "Do not commit — planning docs are not tracked in git for this project.";
|
|
978
|
+
const commitInstruction = "Do not commit — .gsd/ planning docs are managed externally and not tracked in git.";
|
|
991
979
|
return loadPrompt("plan-slice", {
|
|
992
980
|
workingDirectory: base,
|
|
993
981
|
milestoneId: mid, sliceId: sid, sliceTitle: sTitle,
|
|
@@ -1485,11 +1473,7 @@ export async function buildReassessRoadmapPrompt(
|
|
|
1485
1473
|
// Non-fatal — captures module may not be available
|
|
1486
1474
|
}
|
|
1487
1475
|
|
|
1488
|
-
const
|
|
1489
|
-
const reassessCommitDocsEnabled = reassessPrefs?.preferences?.git?.commit_docs !== false;
|
|
1490
|
-
const reassessCommitInstruction = reassessCommitDocsEnabled
|
|
1491
|
-
? `Commit: \`docs(${mid}): reassess roadmap after ${completedSliceId}\`. Stage only the .gsd/milestones/ files you changed — do not stage .gsd/STATE.md or other runtime files.`
|
|
1492
|
-
: "Do not commit — planning docs are not tracked in git for this project.";
|
|
1476
|
+
const reassessCommitInstruction = "Do not commit — .gsd/ planning docs are managed externally and not tracked in git.";
|
|
1493
1477
|
|
|
1494
1478
|
return loadPrompt("reassess-roadmap", {
|
|
1495
1479
|
workingDirectory: base,
|
|
@@ -319,10 +319,15 @@ export function verifyExpectedArtifact(
|
|
|
319
319
|
// plan has no tasks, creating an infinite skip loop (#699).
|
|
320
320
|
if (unitType === "plan-slice") {
|
|
321
321
|
const planContent = readFileSync(absPath, "utf-8");
|
|
322
|
-
|
|
322
|
+
// Accept checkbox-style (- [x] **T01: ...) or heading-style (### T01 -- / ### T01: / ### T01 —)
|
|
323
|
+
const hasCheckboxTask = /^- \[[xX ]\] \*\*T\d+:/m.test(planContent);
|
|
324
|
+
const hasHeadingTask = /^#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(planContent);
|
|
325
|
+
if (!hasCheckboxTask && !hasHeadingTask) return false;
|
|
323
326
|
}
|
|
324
327
|
|
|
325
|
-
// execute-task must also have its checkbox marked [x] in the slice plan
|
|
328
|
+
// execute-task must also have its checkbox marked [x] in the slice plan.
|
|
329
|
+
// Heading-style plans (### T01 -- Title) have no checkbox — the task summary
|
|
330
|
+
// file existence (checked above via resolveExpectedArtifactPath) is sufficient.
|
|
326
331
|
if (unitType === "execute-task") {
|
|
327
332
|
const parts = unitId.split("/");
|
|
328
333
|
const mid = parts[0];
|
|
@@ -333,8 +338,11 @@ export function verifyExpectedArtifact(
|
|
|
333
338
|
if (planAbs && existsSync(planAbs)) {
|
|
334
339
|
const planContent = readFileSync(planAbs, "utf-8");
|
|
335
340
|
const escapedTid = tid.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
336
|
-
const
|
|
337
|
-
|
|
341
|
+
const cbRe = new RegExp(`^- \\[[xX]\\] \\*\\*${escapedTid}:`, "m");
|
|
342
|
+
const hdRe = new RegExp(`^#{2,4}\\s+${escapedTid}\\s*(?:--|—|:)`, "m");
|
|
343
|
+
// Heading-style entries count as verified (no checkbox to toggle);
|
|
344
|
+
// checkbox-style entries require [x].
|
|
345
|
+
if (!cbRe.test(planContent) && !hdRe.test(planContent)) return false;
|
|
338
346
|
}
|
|
339
347
|
}
|
|
340
348
|
}
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
resolveSkillDiscoveryMode,
|
|
21
21
|
getIsolationMode,
|
|
22
22
|
} from "./preferences.js";
|
|
23
|
-
import { ensureGsdSymlink, validateProjectId } from "./repo-identity.js";
|
|
23
|
+
import { ensureGsdSymlink, isInheritedRepo, validateProjectId } from "./repo-identity.js";
|
|
24
24
|
import { migrateToExternalState, recoverFailedMigration } from "./migrate-external.js";
|
|
25
25
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
26
26
|
import { gsdRoot, resolveMilestoneFile, milestonesDir } from "./paths.js";
|
|
@@ -140,8 +140,13 @@ export async function bootstrapAutoSession(
|
|
|
140
140
|
return releaseLockAndReturn();
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
// Ensure git repo exists
|
|
144
|
-
if
|
|
143
|
+
// Ensure git repo exists.
|
|
144
|
+
// Guard against inherited repos: if `base` is a subdirectory of another
|
|
145
|
+
// git repo that has no .gsd (i.e. the parent project was never initialised
|
|
146
|
+
// with GSD), create a fresh git repo at `base` so it gets its own identity
|
|
147
|
+
// hash. Without this, repoIdentity() resolves to the parent repo's hash
|
|
148
|
+
// and loads milestones from an unrelated project (#1639).
|
|
149
|
+
if (!nativeIsRepo(base) || isInheritedRepo(base)) {
|
|
145
150
|
const mainBranch =
|
|
146
151
|
loadEffectiveGSDPreferences()?.preferences?.git?.main_branch || "main";
|
|
147
152
|
nativeInit(base, mainBranch);
|
|
@@ -162,22 +167,19 @@ export async function bootstrapAutoSession(
|
|
|
162
167
|
// ensureGitignore checks for git-tracked .gsd/ files and skips the
|
|
163
168
|
// ".gsd" pattern if the project intentionally tracks .gsd/ in git.
|
|
164
169
|
const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
165
|
-
const commitDocs = gitPrefs?.commit_docs;
|
|
166
170
|
const manageGitignore = gitPrefs?.manage_gitignore;
|
|
167
|
-
ensureGitignore(base, {
|
|
171
|
+
ensureGitignore(base, { manageGitignore });
|
|
168
172
|
if (manageGitignore !== false) untrackRuntimeFiles(base);
|
|
169
173
|
|
|
170
174
|
// Bootstrap .gsd/ if it doesn't exist
|
|
171
175
|
const gsdDir = join(base, ".gsd");
|
|
172
176
|
if (!existsSync(gsdDir)) {
|
|
173
177
|
mkdirSync(join(gsdDir, "milestones"), { recursive: true });
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
/* nothing to commit */
|
|
180
|
-
}
|
|
178
|
+
try {
|
|
179
|
+
nativeAddAll(base);
|
|
180
|
+
nativeCommit(base, "chore: init gsd");
|
|
181
|
+
} catch {
|
|
182
|
+
/* nothing to commit */
|
|
181
183
|
}
|
|
182
184
|
}
|
|
183
185
|
|
|
@@ -482,7 +484,7 @@ export async function bootstrapAutoSession(
|
|
|
482
484
|
// Capture integration branch
|
|
483
485
|
if (s.currentMilestoneId) {
|
|
484
486
|
if (getIsolationMode() !== "none") {
|
|
485
|
-
captureIntegrationBranch(base, s.currentMilestoneId
|
|
487
|
+
captureIntegrationBranch(base, s.currentMilestoneId);
|
|
486
488
|
}
|
|
487
489
|
setActiveMilestoneId(base, s.currentMilestoneId);
|
|
488
490
|
}
|