gsd-pi 2.41.0 → 2.42.0-dev.97e9e30

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.
Files changed (383) hide show
  1. package/README.md +69 -29
  2. package/dist/cli-web-branch.d.ts +6 -0
  3. package/dist/cli-web-branch.js +17 -0
  4. package/dist/onboarding.js +2 -1
  5. package/dist/resources/extensions/gsd/auto/loop.js +89 -1
  6. package/dist/resources/extensions/gsd/auto/phases.js +28 -10
  7. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  8. package/dist/resources/extensions/gsd/auto-dashboard.js +8 -2
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +19 -2
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -0
  11. package/dist/resources/extensions/gsd/auto-recovery.js +12 -4
  12. package/dist/resources/extensions/gsd/auto-start.js +8 -3
  13. package/dist/resources/extensions/gsd/auto-worktree.js +147 -13
  14. package/dist/resources/extensions/gsd/auto.js +64 -2
  15. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +199 -164
  16. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +62 -0
  17. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  18. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +16 -0
  19. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +7 -2
  20. package/dist/resources/extensions/gsd/commands/catalog.js +40 -1
  21. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
  22. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  23. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +146 -0
  24. package/dist/resources/extensions/gsd/context-injector.js +74 -0
  25. package/dist/resources/extensions/gsd/context-store.js +4 -3
  26. package/dist/resources/extensions/gsd/custom-execution-policy.js +47 -0
  27. package/dist/resources/extensions/gsd/custom-verification.js +145 -0
  28. package/dist/resources/extensions/gsd/custom-workflow-engine.js +164 -0
  29. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -0
  30. package/dist/resources/extensions/gsd/db-writer.js +5 -2
  31. package/dist/resources/extensions/gsd/definition-loader.js +352 -0
  32. package/dist/resources/extensions/gsd/detection.js +1 -1
  33. package/dist/resources/extensions/gsd/dev-execution-policy.js +24 -0
  34. package/dist/resources/extensions/gsd/dev-workflow-engine.js +82 -0
  35. package/dist/resources/extensions/gsd/doctor.js +11 -1
  36. package/dist/resources/extensions/gsd/engine-resolver.js +40 -0
  37. package/dist/resources/extensions/gsd/engine-types.js +8 -0
  38. package/dist/resources/extensions/gsd/execution-policy.js +8 -0
  39. package/dist/resources/extensions/gsd/exit-command.js +12 -2
  40. package/dist/resources/extensions/gsd/export.js +9 -13
  41. package/dist/resources/extensions/gsd/extension-manifest.json +2 -2
  42. package/dist/resources/extensions/gsd/files.js +28 -11
  43. package/dist/resources/extensions/gsd/forensics.js +10 -3
  44. package/dist/resources/extensions/gsd/git-service.js +5 -1
  45. package/dist/resources/extensions/gsd/graph.js +225 -0
  46. package/dist/resources/extensions/gsd/gsd-db.js +25 -8
  47. package/dist/resources/extensions/gsd/guided-flow-queue.js +1 -1
  48. package/dist/resources/extensions/gsd/guided-flow.js +7 -3
  49. package/dist/resources/extensions/gsd/journal.js +85 -0
  50. package/dist/resources/extensions/gsd/md-importer.js +5 -0
  51. package/dist/resources/extensions/gsd/milestone-ids.js +1 -1
  52. package/dist/resources/extensions/gsd/native-git-bridge.js +2 -2
  53. package/dist/resources/extensions/gsd/post-unit-hooks.js +24 -412
  54. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  55. package/dist/resources/extensions/gsd/preferences.js +1 -0
  56. package/dist/resources/extensions/gsd/prompt-loader.js +34 -4
  57. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +11 -10
  58. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +2 -2
  59. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  60. package/dist/resources/extensions/gsd/prompts/queue.md +1 -1
  61. package/dist/resources/extensions/gsd/repo-identity.js +46 -2
  62. package/dist/resources/extensions/gsd/rule-registry.js +489 -0
  63. package/dist/resources/extensions/gsd/rule-types.js +6 -0
  64. package/dist/resources/extensions/gsd/run-manager.js +134 -0
  65. package/dist/resources/extensions/gsd/service-tier.js +138 -0
  66. package/dist/resources/extensions/gsd/structured-data-formatter.js +2 -1
  67. package/dist/resources/extensions/gsd/templates/decisions.md +2 -2
  68. package/dist/resources/extensions/gsd/workflow-engine.js +7 -0
  69. package/dist/resources/extensions/gsd/workflow-templates.js +13 -1
  70. package/dist/resources/extensions/gsd/worktree-manager.js +20 -6
  71. package/dist/resources/extensions/gsd/worktree-resolver.js +19 -2
  72. package/dist/resources/extensions/subagent/index.js +7 -3
  73. package/dist/resources/extensions/voice/index.js +4 -4
  74. package/dist/resources/skills/create-workflow/SKILL.md +103 -0
  75. package/dist/resources/skills/create-workflow/references/feature-patterns.md +128 -0
  76. package/dist/resources/skills/create-workflow/references/verification-policies.md +76 -0
  77. package/dist/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
  78. package/dist/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
  79. package/dist/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
  80. package/dist/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
  81. package/dist/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
  82. package/dist/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
  83. package/dist/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
  84. package/dist/web/standalone/.next/BUILD_ID +1 -1
  85. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
  86. package/dist/web/standalone/.next/build-manifest.json +4 -4
  87. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  88. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  89. package/dist/web/standalone/.next/required-server-files.json +3 -3
  90. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  91. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  93. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  101. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  117. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  155. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  161. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  175. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  177. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  179. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/index.html +1 -1
  189. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  190. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  191. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  192. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  193. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  194. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/page.js +2 -2
  196. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
  198. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  199. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  200. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/middleware.js +2 -2
  203. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  205. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  206. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  207. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  208. package/dist/web/standalone/.next/static/chunks/4024.c195dc1fdd2adbea.js +9 -0
  209. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  210. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  211. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  212. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  213. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/{webpack-9afaaebf6042a1d7.js → webpack-fa307370fcf9fb2c.js} +1 -1
  215. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  216. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  217. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  218. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  219. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  220. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  221. package/dist/web/standalone/server.js +1 -1
  222. package/dist/web-mode.d.ts +2 -0
  223. package/dist/web-mode.js +29 -7
  224. package/package.json +1 -1
  225. package/packages/native/src/__tests__/text.test.mjs +33 -0
  226. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +3 -1
  227. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  229. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +10 -7
  230. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  232. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -0
  233. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  234. package/packages/pi-coding-agent/package.json +1 -1
  235. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +4 -2
  236. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +11 -7
  237. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +5 -0
  238. package/pkg/package.json +1 -1
  239. package/src/resources/extensions/gsd/auto/loop-deps.ts +5 -1
  240. package/src/resources/extensions/gsd/auto/loop.ts +101 -1
  241. package/src/resources/extensions/gsd/auto/phases.ts +30 -10
  242. package/src/resources/extensions/gsd/auto/session.ts +6 -0
  243. package/src/resources/extensions/gsd/auto/types.ts +4 -0
  244. package/src/resources/extensions/gsd/auto-dashboard.ts +9 -2
  245. package/src/resources/extensions/gsd/auto-dispatch.ts +25 -5
  246. package/src/resources/extensions/gsd/auto-post-unit.ts +8 -0
  247. package/src/resources/extensions/gsd/auto-recovery.ts +12 -4
  248. package/src/resources/extensions/gsd/auto-start.ts +8 -3
  249. package/src/resources/extensions/gsd/auto-worktree.ts +162 -18
  250. package/src/resources/extensions/gsd/auto.ts +71 -2
  251. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +209 -162
  252. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +62 -0
  253. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  254. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -0
  255. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +9 -2
  256. package/src/resources/extensions/gsd/commands/catalog.ts +40 -1
  257. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
  258. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  259. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +164 -0
  260. package/src/resources/extensions/gsd/context-injector.ts +100 -0
  261. package/src/resources/extensions/gsd/context-store.ts +4 -3
  262. package/src/resources/extensions/gsd/custom-execution-policy.ts +73 -0
  263. package/src/resources/extensions/gsd/custom-verification.ts +180 -0
  264. package/src/resources/extensions/gsd/custom-workflow-engine.ts +216 -0
  265. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -0
  266. package/src/resources/extensions/gsd/db-writer.ts +6 -2
  267. package/src/resources/extensions/gsd/definition-loader.ts +462 -0
  268. package/src/resources/extensions/gsd/detection.ts +1 -1
  269. package/src/resources/extensions/gsd/dev-execution-policy.ts +51 -0
  270. package/src/resources/extensions/gsd/dev-workflow-engine.ts +110 -0
  271. package/src/resources/extensions/gsd/doctor.ts +12 -1
  272. package/src/resources/extensions/gsd/engine-resolver.ts +57 -0
  273. package/src/resources/extensions/gsd/engine-types.ts +71 -0
  274. package/src/resources/extensions/gsd/execution-policy.ts +43 -0
  275. package/src/resources/extensions/gsd/exit-command.ts +14 -2
  276. package/src/resources/extensions/gsd/export.ts +8 -15
  277. package/src/resources/extensions/gsd/extension-manifest.json +2 -2
  278. package/src/resources/extensions/gsd/files.ts +29 -12
  279. package/src/resources/extensions/gsd/forensics.ts +9 -3
  280. package/src/resources/extensions/gsd/git-service.ts +5 -4
  281. package/src/resources/extensions/gsd/graph.ts +312 -0
  282. package/src/resources/extensions/gsd/gsd-db.ts +37 -8
  283. package/src/resources/extensions/gsd/guided-flow-queue.ts +1 -1
  284. package/src/resources/extensions/gsd/guided-flow.ts +7 -3
  285. package/src/resources/extensions/gsd/journal.ts +134 -0
  286. package/src/resources/extensions/gsd/md-importer.ts +6 -0
  287. package/src/resources/extensions/gsd/milestone-ids.ts +1 -1
  288. package/src/resources/extensions/gsd/native-git-bridge.ts +2 -2
  289. package/src/resources/extensions/gsd/post-unit-hooks.ts +24 -462
  290. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  291. package/src/resources/extensions/gsd/preferences.ts +1 -0
  292. package/src/resources/extensions/gsd/prompt-loader.ts +35 -4
  293. package/src/resources/extensions/gsd/prompts/complete-milestone.md +11 -10
  294. package/src/resources/extensions/gsd/prompts/discuss-headless.md +2 -2
  295. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  296. package/src/resources/extensions/gsd/prompts/queue.md +1 -1
  297. package/src/resources/extensions/gsd/repo-identity.ts +47 -2
  298. package/src/resources/extensions/gsd/rule-registry.ts +599 -0
  299. package/src/resources/extensions/gsd/rule-types.ts +68 -0
  300. package/src/resources/extensions/gsd/run-manager.ts +180 -0
  301. package/src/resources/extensions/gsd/service-tier.ts +171 -0
  302. package/src/resources/extensions/gsd/structured-data-formatter.ts +3 -1
  303. package/src/resources/extensions/gsd/templates/decisions.md +2 -2
  304. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +103 -120
  305. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +85 -0
  306. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -2
  307. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +202 -0
  308. package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +180 -0
  309. package/src/resources/extensions/gsd/tests/captures.test.ts +12 -1
  310. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +283 -0
  311. package/src/resources/extensions/gsd/tests/context-injector.test.ts +313 -0
  312. package/src/resources/extensions/gsd/tests/context-store.test.ts +10 -5
  313. package/src/resources/extensions/gsd/tests/continue-here.test.ts +20 -20
  314. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +540 -0
  315. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +382 -0
  316. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +339 -0
  317. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +87 -0
  318. package/src/resources/extensions/gsd/tests/db-writer.test.ts +10 -0
  319. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +778 -0
  320. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +318 -0
  321. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +15 -10
  322. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +5 -4
  323. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +167 -0
  324. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +174 -0
  325. package/src/resources/extensions/gsd/tests/e2e-workflow-pipeline-integration.test.ts +476 -0
  326. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +271 -0
  327. package/src/resources/extensions/gsd/tests/exit-command.test.ts +55 -0
  328. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +599 -0
  329. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +8 -1
  330. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +7 -7
  331. package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +429 -0
  332. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +513 -0
  333. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +147 -0
  334. package/src/resources/extensions/gsd/tests/journal.test.ts +386 -0
  335. package/src/resources/extensions/gsd/tests/md-importer.test.ts +31 -1
  336. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  337. package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +1 -1
  338. package/src/resources/extensions/gsd/tests/parsers.test.ts +110 -0
  339. package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -25
  340. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +3 -1
  341. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +61 -1
  342. package/src/resources/extensions/gsd/tests/routing-history.test.ts +11 -22
  343. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +413 -0
  344. package/src/resources/extensions/gsd/tests/run-manager.test.ts +229 -0
  345. package/src/resources/extensions/gsd/tests/service-tier.test.ts +98 -0
  346. package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +2 -2
  347. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +102 -0
  348. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +4 -3
  349. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +45 -0
  350. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +117 -0
  351. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -1
  352. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +99 -0
  353. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -0
  354. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +4 -0
  355. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +178 -0
  356. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +195 -105
  357. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -3
  358. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +140 -0
  359. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +74 -0
  360. package/src/resources/extensions/gsd/types.ts +3 -0
  361. package/src/resources/extensions/gsd/workflow-engine.ts +38 -0
  362. package/src/resources/extensions/gsd/workflow-templates.ts +12 -1
  363. package/src/resources/extensions/gsd/worktree-manager.ts +21 -6
  364. package/src/resources/extensions/gsd/worktree-resolver.ts +30 -9
  365. package/src/resources/extensions/subagent/index.ts +7 -3
  366. package/src/resources/extensions/voice/index.ts +4 -4
  367. package/src/resources/skills/create-workflow/SKILL.md +103 -0
  368. package/src/resources/skills/create-workflow/references/feature-patterns.md +128 -0
  369. package/src/resources/skills/create-workflow/references/verification-policies.md +76 -0
  370. package/src/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
  371. package/src/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
  372. package/src/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
  373. package/src/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
  374. package/src/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
  375. package/src/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
  376. package/src/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
  377. package/dist/web/standalone/.next/static/chunks/4024.279c423e4661ece1.js +0 -9
  378. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  379. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  380. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  381. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  382. /package/dist/web/standalone/.next/static/{Ute3pMouVczQyT15qrBBO → PXrI5DoWsm7rwAVnEU2rD}/_buildManifest.js +0 -0
  383. /package/dist/web/standalone/.next/static/{Ute3pMouVczQyT15qrBBO → PXrI5DoWsm7rwAVnEU2rD}/_ssgManifest.js +0 -0
@@ -0,0 +1,216 @@
1
+ /**
2
+ * custom-workflow-engine.ts — WorkflowEngine implementation for custom workflows.
3
+ *
4
+ * Drives the auto-loop using GRAPH.yaml step state from a run directory.
5
+ * Each iteration: deriveState reads the graph, resolveDispatch picks the
6
+ * next eligible step, reconcile marks it complete and persists.
7
+ *
8
+ * Observability:
9
+ * - All state reads/writes go through graph.ts YAML I/O — inspectable on disk.
10
+ * - `resolveDispatch` returns unitType "custom-step" with unitId "<name>/<stepId>".
11
+ * - `getDisplayMetadata` provides step N/M progress for dashboard rendering.
12
+ * - Phase transitions are derivable from GRAPH.yaml step statuses.
13
+ */
14
+
15
+ import type { WorkflowEngine } from "./workflow-engine.js";
16
+ import type {
17
+ EngineState,
18
+ EngineDispatchAction,
19
+ CompletedStep,
20
+ ReconcileResult,
21
+ DisplayMetadata,
22
+ } from "./engine-types.js";
23
+ import { readFileSync } from "node:fs";
24
+ import { join } from "node:path";
25
+ import { parse } from "yaml";
26
+ import {
27
+ readGraph,
28
+ writeGraph,
29
+ getNextPendingStep,
30
+ markStepComplete,
31
+ expandIteration,
32
+ type WorkflowGraph,
33
+ } from "./graph.js";
34
+ import { injectContext } from "./context-injector.js";
35
+ import type { WorkflowDefinition, StepDefinition } from "./definition-loader.js";
36
+
37
+ /** Read and parse the frozen DEFINITION.yaml from a run directory. */
38
+ export function readFrozenDefinition(runDir: string): WorkflowDefinition {
39
+ const defPath = join(runDir, "DEFINITION.yaml");
40
+ const raw = readFileSync(defPath, "utf-8");
41
+ return parse(raw, { schema: "core" }) as WorkflowDefinition;
42
+ }
43
+
44
+ export class CustomWorkflowEngine implements WorkflowEngine {
45
+ readonly engineId = "custom";
46
+ private readonly runDir: string;
47
+
48
+ constructor(runDir: string) {
49
+ this.runDir = runDir;
50
+ }
51
+
52
+ /**
53
+ * Derive engine state from GRAPH.yaml on disk.
54
+ *
55
+ * Phase is "complete" when all steps are complete or expanded,
56
+ * "running" otherwise (any pending or active steps remain).
57
+ */
58
+ async deriveState(_basePath: string): Promise<EngineState> {
59
+ const graph = readGraph(this.runDir);
60
+ const allDone = graph.steps.every(
61
+ (s) => s.status === "complete" || s.status === "expanded",
62
+ );
63
+ const phase = allDone ? "complete" : "running";
64
+
65
+ return {
66
+ phase,
67
+ currentMilestoneId: null,
68
+ activeSliceId: null,
69
+ activeTaskId: null,
70
+ isComplete: allDone,
71
+ raw: graph,
72
+ };
73
+ }
74
+
75
+ /**
76
+ * Resolve the next dispatch action from graph state.
77
+ *
78
+ * Uses getNextPendingStep to find the first step whose dependencies
79
+ * are all satisfied. If the step has an `iterate` config in the frozen
80
+ * DEFINITION.yaml, expands it into instance steps before dispatching.
81
+ *
82
+ * Returns a dispatch with unitType "custom-step" and unitId in
83
+ * "<workflowName>/<stepId>" format.
84
+ *
85
+ * Observability:
86
+ * - Iterate expansion is logged to stderr with item count and parent step ID.
87
+ * - Missing source artifacts throw with the full resolved path for diagnosis.
88
+ * - Zero-match expansions return a stop action with level "info".
89
+ * - Expanded GRAPH.yaml is written to disk before dispatch — inspectable on disk.
90
+ */
91
+ async resolveDispatch(
92
+ state: EngineState,
93
+ _context: { basePath: string },
94
+ ): Promise<EngineDispatchAction> {
95
+ let graph = state.raw as WorkflowGraph;
96
+ let next = getNextPendingStep(graph);
97
+
98
+ if (!next) {
99
+ return {
100
+ action: "stop",
101
+ reason: "All steps complete",
102
+ level: "info",
103
+ };
104
+ }
105
+
106
+ // Check frozen DEFINITION.yaml for iterate config on this step
107
+ const def = readFrozenDefinition(this.runDir);
108
+ const stepDef = def.steps.find((s: StepDefinition) => s.id === next!.id);
109
+
110
+ if (stepDef?.iterate) {
111
+ const iterate = stepDef.iterate;
112
+
113
+ // Read source artifact
114
+ const sourcePath = join(this.runDir, iterate.source);
115
+ let sourceContent: string;
116
+ try {
117
+ sourceContent = readFileSync(sourcePath, "utf-8");
118
+ } catch {
119
+ throw new Error(
120
+ `Iterate source artifact not found: ${sourcePath} (step "${next.id}", source: "${iterate.source}")`,
121
+ );
122
+ }
123
+
124
+ // Extract items via regex with global+multiline flags.
125
+ // Guard against ReDoS: if matching takes too long on large inputs, bail.
126
+ const regex = new RegExp(iterate.pattern, "gm");
127
+ const items: string[] = [];
128
+ const matchStart = Date.now();
129
+ let match: RegExpExecArray | null;
130
+ while ((match = regex.exec(sourceContent)) !== null) {
131
+ if (match[1] !== undefined) items.push(match[1]);
132
+ if (Date.now() - matchStart > 5_000) {
133
+ throw new Error(
134
+ `Iterate pattern "${iterate.pattern}" exceeded 5s timeout on step "${next.id}" — possible ReDoS`,
135
+ );
136
+ }
137
+ }
138
+
139
+ // Expand the graph
140
+ const expandedGraph = expandIteration(graph, next.id, items, next.prompt);
141
+ writeGraph(this.runDir, expandedGraph);
142
+ graph = expandedGraph;
143
+
144
+ // Re-query for first instance step
145
+ next = getNextPendingStep(expandedGraph);
146
+
147
+ if (!next) {
148
+ return {
149
+ action: "stop",
150
+ reason: "Iterate expansion produced no instances",
151
+ level: "info",
152
+ };
153
+ }
154
+ }
155
+
156
+ // Enrich prompt with context from prior step artifacts
157
+ const enrichedPrompt = injectContext(this.runDir, next.id, next.prompt);
158
+
159
+ return {
160
+ action: "dispatch",
161
+ step: {
162
+ unitType: "custom-step",
163
+ unitId: `${graph.metadata.name}/${next.id}`,
164
+ prompt: enrichedPrompt,
165
+ },
166
+ };
167
+ }
168
+
169
+ /**
170
+ * Reconcile state after a step completes.
171
+ *
172
+ * Extracts the stepId from the completedStep's unitId (last segment after `/`),
173
+ * marks it complete in the graph, and writes the updated GRAPH.yaml to disk.
174
+ *
175
+ * Returns "milestone-complete" when all steps are now done, "continue" otherwise.
176
+ */
177
+ async reconcile(
178
+ state: EngineState,
179
+ completedStep: CompletedStep,
180
+ ): Promise<ReconcileResult> {
181
+ const graph = state.raw as WorkflowGraph;
182
+
183
+ // Extract stepId from "<workflowName>/<stepId>"
184
+ const parts = completedStep.unitId.split("/");
185
+ const stepId = parts[parts.length - 1];
186
+
187
+ const updatedGraph = markStepComplete(graph, stepId);
188
+ writeGraph(this.runDir, updatedGraph);
189
+
190
+ const allDone = updatedGraph.steps.every(
191
+ (s) => s.status === "complete" || s.status === "expanded",
192
+ );
193
+
194
+ return {
195
+ outcome: allDone ? "milestone-complete" : "continue",
196
+ };
197
+ }
198
+
199
+ /**
200
+ * Return UI-facing metadata for progress display.
201
+ *
202
+ * Shows "Step N/M" progress where N = completed count and M = total.
203
+ */
204
+ getDisplayMetadata(state: EngineState): DisplayMetadata {
205
+ const graph = state.raw as WorkflowGraph;
206
+ const total = graph.steps.length;
207
+ const completed = graph.steps.filter((s) => s.status === "complete").length;
208
+
209
+ return {
210
+ engineLabel: "WORKFLOW",
211
+ currentPhase: state.phase,
212
+ progressSummary: `Step ${completed}/${total}`,
213
+ stepCount: { completed, total },
214
+ };
215
+ }
216
+ }
@@ -38,6 +38,7 @@ function unitLabel(type: string): string {
38
38
  case "triage-captures": return "Triage";
39
39
  case "quick-task": return "Quick Task";
40
40
  case "replan-slice": return "Replan";
41
+ case "custom-step": return "Workflow Step";
41
42
  default: return type;
42
43
  }
43
44
  }
@@ -35,8 +35,8 @@ export function generateDecisionsMd(decisions: Decision[]): string {
35
35
  lines.push(' To reverse a decision, add a new row that supersedes it.');
36
36
  lines.push(' Read this file at the start of any planning or research phase. -->');
37
37
  lines.push('');
38
- lines.push('| # | When | Scope | Decision | Choice | Rationale | Revisable? |');
39
- lines.push('|---|------|-------|----------|--------|-----------|------------|');
38
+ lines.push('| # | When | Scope | Decision | Choice | Rationale | Revisable? | Made By |');
39
+ lines.push('|---|------|-------|----------|--------|-----------|------------|---------|');
40
40
 
41
41
  for (const d of decisions) {
42
42
  // Escape pipe characters within cell values to preserve table structure
@@ -48,6 +48,7 @@ export function generateDecisionsMd(decisions: Decision[]): string {
48
48
  d.choice,
49
49
  d.rationale,
50
50
  d.revisable,
51
+ d.made_by ?? 'agent',
51
52
  ].map(cell => (cell ?? '').replace(/\|/g, '\\|'));
52
53
 
53
54
  lines.push(`| ${cells.join(' | ')} |`);
@@ -181,6 +182,7 @@ export interface SaveDecisionFields {
181
182
  rationale: string;
182
183
  revisable?: string;
183
184
  when_context?: string;
185
+ made_by?: import('./types.js').DecisionMadeBy;
184
186
  }
185
187
 
186
188
  /**
@@ -205,6 +207,7 @@ export async function saveDecisionToDb(
205
207
  choice: fields.choice,
206
208
  rationale: fields.rationale,
207
209
  revisable: fields.revisable ?? 'Yes',
210
+ made_by: fields.made_by ?? 'agent',
208
211
  superseded_by: null,
209
212
  });
210
213
 
@@ -222,6 +225,7 @@ export async function saveDecisionToDb(
222
225
  choice: row['choice'] as string,
223
226
  rationale: row['rationale'] as string,
224
227
  revisable: row['revisable'] as string,
228
+ made_by: (row['made_by'] as string as import('./types.js').DecisionMadeBy) ?? 'agent',
225
229
  superseded_by: (row['superseded_by'] as string) ?? null,
226
230
  }));
227
231
  }