gsd-pi 2.48.0-dev.2e7390c → 2.48.0-dev.ced2eca

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 (60) hide show
  1. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -2
  2. package/dist/resources/extensions/gsd/auto-post-unit.js +17 -3
  3. package/dist/resources/extensions/gsd/auto-worktree.js +5 -2
  4. package/dist/resources/extensions/gsd/commands/handlers/auto.js +43 -3
  5. package/dist/resources/extensions/gsd/git-service.js +11 -10
  6. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +223 -56
  7. package/dist/resources/extensions/gsd/prompts/run-uat.md +4 -4
  8. package/dist/resources/extensions/gsd/worktree-command.js +1 -1
  9. package/dist/web/standalone/.next/BUILD_ID +1 -1
  10. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  11. package/dist/web/standalone/.next/build-manifest.json +2 -2
  12. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  13. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  14. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/index.html +1 -1
  30. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  37. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  38. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  39. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  40. package/dist/worktree-cli.js +1 -1
  41. package/package.json +1 -1
  42. package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +8 -4
  43. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -1
  44. package/src/resources/extensions/gsd/auto-post-unit.ts +18 -3
  45. package/src/resources/extensions/gsd/auto-worktree.ts +4 -2
  46. package/src/resources/extensions/gsd/commands/handlers/auto.ts +46 -3
  47. package/src/resources/extensions/gsd/git-service.ts +12 -11
  48. package/src/resources/extensions/gsd/prompts/discuss-headless.md +223 -56
  49. package/src/resources/extensions/gsd/prompts/run-uat.md +4 -4
  50. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +2 -2
  51. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +1 -1
  52. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +14 -12
  53. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +1 -1
  54. package/src/resources/extensions/gsd/tests/git-service.test.ts +19 -9
  55. package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +2 -2
  56. package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +6 -6
  57. package/src/resources/extensions/gsd/tests/run-uat.test.ts +68 -0
  58. package/src/resources/extensions/gsd/worktree-command.ts +1 -1
  59. /package/dist/web/standalone/.next/static/{uTZ196cPUij3KcIDCweR6 → PTL5V00OW8q4-092tUQKx}/_buildManifest.js +0 -0
  60. /package/dist/web/standalone/.next/static/{uTZ196cPUij3KcIDCweR6 → PTL5V00OW8q4-092tUQKx}/_ssgManifest.js +0 -0
@@ -1,43 +1,43 @@
1
1
  {
2
2
  "/_not-found/page": "app/_not-found/page.js",
3
3
  "/_global-error/page": "app/_global-error/page.js",
4
- "/api/bridge-terminal/resize/route": "app/api/bridge-terminal/resize/route.js",
5
4
  "/api/bridge-terminal/input/route": "app/api/bridge-terminal/input/route.js",
5
+ "/api/bridge-terminal/resize/route": "app/api/bridge-terminal/resize/route.js",
6
6
  "/api/boot/route": "app/api/boot/route.js",
7
7
  "/api/dev-mode/route": "app/api/dev-mode/route.js",
8
- "/api/cleanup/route": "app/api/cleanup/route.js",
9
- "/api/bridge-terminal/stream/route": "app/api/bridge-terminal/stream/route.js",
10
- "/api/doctor/route": "app/api/doctor/route.js",
11
- "/api/export-data/route": "app/api/export-data/route.js",
12
8
  "/api/browse-directories/route": "app/api/browse-directories/route.js",
9
+ "/api/export-data/route": "app/api/export-data/route.js",
10
+ "/api/forensics/route": "app/api/forensics/route.js",
13
11
  "/api/history/route": "app/api/history/route.js",
12
+ "/api/doctor/route": "app/api/doctor/route.js",
14
13
  "/api/git/route": "app/api/git/route.js",
15
14
  "/api/hooks/route": "app/api/hooks/route.js",
15
+ "/api/bridge-terminal/stream/route": "app/api/bridge-terminal/stream/route.js",
16
16
  "/api/inspect/route": "app/api/inspect/route.js",
17
- "/api/captures/route": "app/api/captures/route.js",
18
17
  "/api/knowledge/route": "app/api/knowledge/route.js",
19
18
  "/api/live-state/route": "app/api/live-state/route.js",
19
+ "/api/captures/route": "app/api/captures/route.js",
20
20
  "/api/preferences/route": "app/api/preferences/route.js",
21
- "/api/recovery/route": "app/api/recovery/route.js",
22
21
  "/api/onboarding/route": "app/api/onboarding/route.js",
23
- "/api/projects/route": "app/api/projects/route.js",
24
22
  "/api/session/browser/route": "app/api/session/browser/route.js",
23
+ "/api/projects/route": "app/api/projects/route.js",
24
+ "/api/recovery/route": "app/api/recovery/route.js",
25
25
  "/api/session/command/route": "app/api/session/command/route.js",
26
26
  "/api/session/events/route": "app/api/session/events/route.js",
27
- "/api/forensics/route": "app/api/forensics/route.js",
27
+ "/api/shutdown/route": "app/api/shutdown/route.js",
28
28
  "/api/settings-data/route": "app/api/settings-data/route.js",
29
29
  "/api/session/manage/route": "app/api/session/manage/route.js",
30
- "/api/shutdown/route": "app/api/shutdown/route.js",
31
30
  "/api/skill-health/route": "app/api/skill-health/route.js",
32
31
  "/api/steer/route": "app/api/steer/route.js",
33
32
  "/api/terminal/input/route": "app/api/terminal/input/route.js",
33
+ "/api/files/route": "app/api/files/route.js",
34
34
  "/api/terminal/resize/route": "app/api/terminal/resize/route.js",
35
35
  "/api/switch-root/route": "app/api/switch-root/route.js",
36
- "/api/files/route": "app/api/files/route.js",
36
+ "/api/cleanup/route": "app/api/cleanup/route.js",
37
37
  "/api/terminal/sessions/route": "app/api/terminal/sessions/route.js",
38
- "/api/terminal/stream/route": "app/api/terminal/stream/route.js",
39
38
  "/api/undo/route": "app/api/undo/route.js",
40
39
  "/api/terminal/upload/route": "app/api/terminal/upload/route.js",
40
+ "/api/terminal/stream/route": "app/api/terminal/stream/route.js",
41
41
  "/api/update/route": "app/api/update/route.js",
42
42
  "/api/remote-questions/route": "app/api/remote-questions/route.js",
43
43
  "/api/visualizer/route": "app/api/visualizer/route.js",
@@ -1 +1 @@
1
- <!DOCTYPE html><!--uTZ196cPUij3KcIDCweR6--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><link rel="preload" href="/_next/static/media/4cf2300e9c8272f7-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/93f479601ee12b01-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/de70bee13400563f.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/dd4ae3f58ac9b600.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-0a4cd455ec4197d2.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><script src="/_next/static/chunks/4986-c2fc8845ce785303.js" async=""></script><script src="/_next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>GSD</title><meta name="description" content="The evolution of Get Shit Done — now a real coding agent. One command. Walk away. Come back to a built project."/><meta name="application-name" content="GSD"/><link rel="icon" href="/icon-light-32x32.png" media="(prefers-color-scheme: light)"/><link rel="icon" href="/icon-dark-32x32.png" media="(prefers-color-scheme: dark)"/><link rel="icon" href="/icon.svg" type="image/svg+xml"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_188709 __variable_9a8899 font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,true,true)</script><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section><script src="/_next/static/chunks/webpack-0a4cd455ec4197d2.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[21942,[\"4986\",\"static/chunks/4986-c2fc8845ce785303.js\",\"7177\",\"static/chunks/app/layout-a16c7a7ecdf0c2cf.js\"],\"ThemeProvider\"]\n3:I[57121,[],\"\"]\n4:I[74581,[],\"\"]\n5:I[61549,[\"4986\",\"static/chunks/4986-c2fc8845ce785303.js\",\"7177\",\"static/chunks/app/layout-a16c7a7ecdf0c2cf.js\"],\"Toaster\"]\n6:I[90484,[],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\n9:I[90484,[],\"ViewportBoundary\"]\nb:I[90484,[],\"MetadataBoundary\"]\nd:I[27123,[],\"\"]\n:HL[\"/_next/static/media/4cf2300e9c8272f7-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/93f479601ee12b01-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/de70bee13400563f.css\",\"style\"]\n:HL[\"/_next/static/css/dd4ae3f58ac9b600.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"uTZ196cPUij3KcIDCweR6\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/de70bee13400563f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/dd4ae3f58ac9b600.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"__variable_188709 __variable_9a8899 font-sans antialiased\",\"children\":[\"$\",\"$L2\",null,{\"attribute\":\"class\",\"defaultTheme\":\"dark\",\"children\":[[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L5\",null,{\"position\":\"bottom-right\"}]]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[86869,[],\"IconMark\"]\n8:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"GSD\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"The evolution of Get Shit Done — now a real coding agent. One command. Walk away. Come back to a built project.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"application-name\",\"content\":\"GSD\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/icon-light-32x32.png\",\"media\":\"(prefers-color-scheme: light)\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/icon-dark-32x32.png\",\"media\":\"(prefers-color-scheme: dark)\"}],[\"$\",\"link\",\"5\",{\"rel\":\"icon\",\"href\":\"/icon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"$Le\",\"6\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--PTL5V00OW8q4_092tUQKx--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><link rel="preload" href="/_next/static/media/4cf2300e9c8272f7-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/93f479601ee12b01-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/de70bee13400563f.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/dd4ae3f58ac9b600.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-0a4cd455ec4197d2.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><script src="/_next/static/chunks/4986-c2fc8845ce785303.js" async=""></script><script src="/_next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>GSD</title><meta name="description" content="The evolution of Get Shit Done — now a real coding agent. One command. Walk away. Come back to a built project."/><meta name="application-name" content="GSD"/><link rel="icon" href="/icon-light-32x32.png" media="(prefers-color-scheme: light)"/><link rel="icon" href="/icon-dark-32x32.png" media="(prefers-color-scheme: dark)"/><link rel="icon" href="/icon.svg" type="image/svg+xml"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_188709 __variable_9a8899 font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,true,true)</script><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section><script src="/_next/static/chunks/webpack-0a4cd455ec4197d2.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[21942,[\"4986\",\"static/chunks/4986-c2fc8845ce785303.js\",\"7177\",\"static/chunks/app/layout-a16c7a7ecdf0c2cf.js\"],\"ThemeProvider\"]\n3:I[57121,[],\"\"]\n4:I[74581,[],\"\"]\n5:I[61549,[\"4986\",\"static/chunks/4986-c2fc8845ce785303.js\",\"7177\",\"static/chunks/app/layout-a16c7a7ecdf0c2cf.js\"],\"Toaster\"]\n6:I[90484,[],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\n9:I[90484,[],\"ViewportBoundary\"]\nb:I[90484,[],\"MetadataBoundary\"]\nd:I[27123,[],\"\"]\n:HL[\"/_next/static/media/4cf2300e9c8272f7-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/93f479601ee12b01-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/de70bee13400563f.css\",\"style\"]\n:HL[\"/_next/static/css/dd4ae3f58ac9b600.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"PTL5V00OW8q4-092tUQKx\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/de70bee13400563f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/dd4ae3f58ac9b600.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"__variable_188709 __variable_9a8899 font-sans antialiased\",\"children\":[\"$\",\"$L2\",null,{\"attribute\":\"class\",\"defaultTheme\":\"dark\",\"children\":[[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L5\",null,{\"position\":\"bottom-right\"}]]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[86869,[],\"IconMark\"]\n8:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"GSD\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"The evolution of Get Shit Done — now a real coding agent. One command. Walk away. Come back to a built project.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"application-name\",\"content\":\"GSD\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/icon-light-32x32.png\",\"media\":\"(prefers-color-scheme: light)\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/icon-dark-32x32.png\",\"media\":\"(prefers-color-scheme: dark)\"}],[\"$\",\"link\",\"5\",{\"rel\":\"icon\",\"href\":\"/icon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"$Le\",\"6\",{}]]\n"])</script></body></html>
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--uTZ196cPUij3KcIDCweR6--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-0a4cd455ec4197d2.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
- @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-0a4cd455ec4197d2.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"uTZ196cPUij3KcIDCweR6\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--PTL5V00OW8q4_092tUQKx--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-0a4cd455ec4197d2.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
+ @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-0a4cd455ec4197d2.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"PTL5V00OW8q4-092tUQKx\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
@@ -1 +1 @@
1
- {"node":{},"edge":{},"encryptionKey":"WyiAhE6yKlZgQUe69yhzaqBDk8K2UCCF3uLbT2oiVwo="}
1
+ {"node":{},"edge":{},"encryptionKey":"MrUD6+DKxAtQuQvJmHgbOusoct8+zNzwhiqYL4y/faQ="}
@@ -160,7 +160,7 @@ async function doMerge(ext, basePath, name) {
160
160
  catch { /* best-effort */ }
161
161
  }
162
162
  const commitType = ext.inferCommitType(name);
163
- const commitMessage = `${commitType}(${name}): merge worktree ${name}`;
163
+ const commitMessage = `${commitType}: merge worktree ${name}\n\nGSD-Worktree: ${name}`;
164
164
  process.stderr.write(`\nMerging ${chalk.bold.cyan(name)} → ${chalk.magenta(ext.nativeDetectMainBranch(basePath))}\n`);
165
165
  process.stderr.write(chalk.dim(` ${status.filesChanged} files, ${chalk.green(`+${status.linesAdded}`)} ${chalk.red(`-${status.linesRemoved}`)}\n\n`));
166
166
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd-pi",
3
- "version": "2.48.0-dev.2e7390c",
3
+ "version": "2.48.0-dev.ced2eca",
4
4
  "description": "GSD — Get Shit Done coding agent",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,7 +10,8 @@ describe("commit linking", () => {
10
10
  issueNumber: 43,
11
11
  });
12
12
  assert.ok(msg.includes("Resolves #43"), "should include Resolves trailer");
13
- assert.ok(msg.startsWith("feat(S01/T02):"), "subject line unchanged");
13
+ assert.ok(msg.startsWith("feat:"), "subject line has no scope");
14
+ assert.ok(msg.includes("GSD-Task: S01/T02"), "GSD-Task trailer present");
14
15
  });
15
16
 
16
17
  it("includes both key files and Resolves #N", () => {
@@ -22,10 +23,13 @@ describe("commit linking", () => {
22
23
  });
23
24
  assert.ok(msg.includes("- src/auth.ts"), "key files present");
24
25
  assert.ok(msg.includes("Resolves #43"), "Resolves trailer present");
25
- // Resolves should come after key files
26
+ assert.ok(msg.includes("GSD-Task: S01/T02"), "GSD-Task trailer present");
27
+ // GSD-Task should come after key files but before Resolves
26
28
  const keyFilesIdx = msg.indexOf("- src/auth.ts");
29
+ const taskIdx = msg.indexOf("GSD-Task: S01/T02");
27
30
  const resolvesIdx = msg.indexOf("Resolves #43");
28
- assert.ok(resolvesIdx > keyFilesIdx, "Resolves after key files");
31
+ assert.ok(taskIdx > keyFilesIdx, "GSD-Task after key files");
32
+ assert.ok(resolvesIdx > taskIdx, "Resolves after GSD-Task");
29
33
  });
30
34
 
31
35
  it("no Resolves trailer when issueNumber is not set", () => {
@@ -34,6 +38,6 @@ describe("commit linking", () => {
34
38
  taskTitle: "implement auth",
35
39
  });
36
40
  assert.ok(!msg.includes("Resolves"), "no Resolves when no issueNumber");
37
- assert.ok(!msg.includes("\n"), "no body when no issueNumber or keyFiles");
41
+ assert.ok(msg.includes("GSD-Task: S01/T02"), "GSD-Task trailer still present");
38
42
  });
39
43
  });
@@ -190,7 +190,24 @@ export const DISPATCH_RULES: DispatchRule[] = [
190
190
  if (!content) continue;
191
191
  const verdictMatch = content.match(/verdict:\s*([\w-]+)/i);
192
192
  const verdict = verdictMatch?.[1]?.toLowerCase();
193
- if (verdict && verdict !== "pass" && verdict !== "passed") {
193
+
194
+ // Determine acceptable verdicts based on UAT type.
195
+ // mixed / human-experience / live-runtime modes may legitimately
196
+ // produce PARTIAL when all automatable checks pass but human-only
197
+ // checks remain — this should not block progression.
198
+ const acceptableVerdicts: string[] = ["pass", "passed"];
199
+ const uatFile = resolveSliceFile(basePath, mid, sliceId, "UAT");
200
+ if (uatFile) {
201
+ const uatContent = await loadFile(uatFile);
202
+ if (uatContent) {
203
+ const uatType = extractUatType(uatContent);
204
+ if (uatType === "mixed" || uatType === "human-experience" || uatType === "live-runtime") {
205
+ acceptableVerdicts.push("partial");
206
+ }
207
+ }
208
+ }
209
+
210
+ if (verdict && !acceptableVerdicts.includes(verdict)) {
194
211
  return {
195
212
  action: "stop" as const,
196
213
  reason: `UAT verdict for ${sliceId} is "${verdict}" — blocking progression until resolved.\nReview the UAT result and update the verdict to PASS, or re-run /gsd auto after fixing.`,
@@ -47,6 +47,16 @@ import {
47
47
  import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
48
48
  import { debugLog } from "./debug-logger.js";
49
49
  import type { AutoSession } from "./auto/session.js";
50
+
51
+ /** Unit types that only touch `.gsd/` internal state files (no code changes).
52
+ * Auto-commit is skipped for these — their state files are picked up by the
53
+ * next actual task commit via `smartStage()`. */
54
+ const LIFECYCLE_ONLY_UNITS = new Set([
55
+ "research-milestone", "discuss-milestone", "plan-milestone",
56
+ "validate-milestone", "research-slice", "plan-slice",
57
+ "replan-slice", "complete-slice", "run-uat",
58
+ "reassess-roadmap", "rewrite-docs",
59
+ ]);
50
60
  import {
51
61
  updateProgressWidget as _updateProgressWidget,
52
62
  updateSliceProgressCache,
@@ -279,9 +289,14 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
279
289
  // `git worktree remove --force` during teardown.
280
290
  _resetHasChangesCache();
281
291
 
282
- const commitMsg = autoCommitCurrentBranch(s.basePath, s.currentUnit.type, s.currentUnit.id, taskContext);
283
- if (commitMsg) {
284
- ctx.ui.notify(`Committed: ${commitMsg.split("\n")[0]}`, "info");
292
+ // Skip auto-commit for lifecycle-only units (#2553) they only touch
293
+ // `.gsd/` internal state files. Those files are picked up by the next
294
+ // actual task commit via smartStage().
295
+ if (!LIFECYCLE_ONLY_UNITS.has(s.currentUnit.type)) {
296
+ const commitMsg = autoCommitCurrentBranch(s.basePath, s.currentUnit.type, s.currentUnit.id, taskContext);
297
+ if (commitMsg) {
298
+ ctx.ui.notify(`Committed: ${commitMsg.split("\n")[0]}`, "info");
299
+ }
285
300
  }
286
301
  } catch (e) {
287
302
  debugLog("postUnit", { phase: "auto-commit", error: String(e) });
@@ -1058,13 +1058,15 @@ export function mergeMilestoneToMain(
1058
1058
  if (titleMatch) milestoneTitle = titleMatch[1].trim();
1059
1059
  }
1060
1060
  milestoneTitle = milestoneTitle || milestoneId;
1061
- const subject = `feat(${milestoneId}): ${milestoneTitle}`;
1061
+ const subject = `feat: ${milestoneTitle}`;
1062
1062
  let body = "";
1063
1063
  if (completedSlices.length > 0) {
1064
1064
  const sliceLines = completedSlices
1065
1065
  .map((s) => `- ${s.id}: ${s.title}`)
1066
1066
  .join("\n");
1067
- body = `\n\nCompleted slices:\n${sliceLines}\n\nBranch: ${milestoneBranch}`;
1067
+ body = `\n\nCompleted slices:\n${sliceLines}\n\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1068
+ } else {
1069
+ body = `\n\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1068
1070
  }
1069
1071
  const commitMessage = subject + body;
1070
1072
 
@@ -1,10 +1,33 @@
1
1
  import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
2
2
 
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+
3
6
  import { enableDebug } from "../../debug-logger.js";
4
7
  import { getAutoDashboardData, isAutoActive, isAutoPaused, pauseAuto, startAuto, stopAuto, stopAutoRemote } from "../../auto.js";
5
8
  import { handleRate } from "../../commands-rate.js";
6
9
  import { guardRemoteSession, projectRoot } from "../context.js";
7
10
 
11
+ /**
12
+ * Parse --yolo flag and optional file path from the auto command string.
13
+ * Supports: `/gsd auto --yolo path/to/file.md` or `/gsd auto -y path/to/file.md`
14
+ */
15
+ function parseYoloFlag(trimmed: string): { yoloSeedFile: string | null; rest: string } {
16
+ const yoloRe = /(?:--yolo|-y)\s+("(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\S+)/;
17
+ const match = trimmed.match(yoloRe);
18
+ if (!match) return { yoloSeedFile: null, rest: trimmed };
19
+
20
+ // Strip quotes if present
21
+ let filePath = match[1];
22
+ if ((filePath.startsWith('"') && filePath.endsWith('"')) ||
23
+ (filePath.startsWith("'") && filePath.endsWith("'"))) {
24
+ filePath = filePath.slice(1, -1);
25
+ }
26
+
27
+ const rest = trimmed.replace(match[0], "").replace(/\s+/g, " ").trim();
28
+ return { yoloSeedFile: filePath, rest };
29
+ }
30
+
8
31
  export async function handleAutoCommand(trimmed: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<boolean> {
9
32
  if (trimmed === "next" || trimmed.startsWith("next ")) {
10
33
  if (trimmed.includes("--dry-run")) {
@@ -21,11 +44,31 @@ export async function handleAutoCommand(trimmed: string, ctx: ExtensionCommandCo
21
44
  }
22
45
 
23
46
  if (trimmed === "auto" || trimmed.startsWith("auto ")) {
24
- const verboseMode = trimmed.includes("--verbose");
25
- const debugMode = trimmed.includes("--debug");
47
+ const { yoloSeedFile, rest } = parseYoloFlag(trimmed);
48
+ const verboseMode = rest.includes("--verbose");
49
+ const debugMode = rest.includes("--debug");
26
50
  if (debugMode) enableDebug(projectRoot());
27
51
  if (!(await guardRemoteSession(ctx, pi))) return true;
28
- await startAuto(ctx, pi, projectRoot(), verboseMode);
52
+
53
+ if (yoloSeedFile) {
54
+ const resolved = resolve(projectRoot(), yoloSeedFile);
55
+ if (!existsSync(resolved)) {
56
+ ctx.ui.notify(`Yolo seed file not found: ${resolved}`, "error");
57
+ return true;
58
+ }
59
+ const seedContent = readFileSync(resolved, "utf-8").trim();
60
+ if (!seedContent) {
61
+ ctx.ui.notify(`Yolo seed file is empty: ${resolved}`, "error");
62
+ return true;
63
+ }
64
+ // Headless path: bootstrap project, dispatch non-interactive discuss,
65
+ // then auto-mode starts automatically via checkAutoStartAfterDiscuss
66
+ // when the LLM says "Milestone X ready."
67
+ const { showHeadlessMilestoneCreation } = await import("../../guided-flow.js");
68
+ await showHeadlessMilestoneCreation(ctx, pi, projectRoot(), seedContent);
69
+ } else {
70
+ await startAuto(ctx, pi, projectRoot(), verboseMode);
71
+ }
29
72
  return true;
30
73
  }
31
74
 
@@ -102,23 +102,25 @@ export interface TaskCommitContext {
102
102
 
103
103
  /**
104
104
  * Build a meaningful conventional commit message from task execution context.
105
- * Format: `{type}({sliceId}/{taskId}): {description}`
105
+ * Format: `{type}: {description}` (clean conventional commit — no GSD IDs in subject).
106
+ *
107
+ * GSD metadata is placed in a `GSD-Task:` git trailer at the end of the body,
108
+ * following the same convention as `Signed-off-by:` or `Co-Authored-By:`.
106
109
  *
107
110
  * The description is the task summary one-liner if available (it describes
108
111
  * what was actually built), falling back to the task title (what was planned).
109
112
  */
110
113
  export function buildTaskCommitMessage(ctx: TaskCommitContext): string {
111
- const scope = ctx.taskId; // e.g. "S01/T02" or just "T02"
112
114
  const description = ctx.oneLiner || ctx.taskTitle;
113
115
  const type = inferCommitType(ctx.taskTitle, ctx.oneLiner);
114
116
 
115
- // Truncate description to ~72 chars for subject line
116
- const maxDescLen = 68 - type.length - scope.length;
117
+ // Truncate description to ~72 chars for subject line (full budget without scope)
118
+ const maxDescLen = 70 - type.length;
117
119
  const truncated = description.length > maxDescLen
118
120
  ? description.slice(0, maxDescLen - 1).trimEnd() + "…"
119
121
  : description;
120
122
 
121
- const subject = `${type}(${scope}): ${truncated}`;
123
+ const subject = `${type}: ${truncated}`;
122
124
 
123
125
  // Build body with key files if available
124
126
  const bodyParts: string[] = [];
@@ -131,15 +133,14 @@ export function buildTaskCommitMessage(ctx: TaskCommitContext): string {
131
133
  bodyParts.push(fileLines);
132
134
  }
133
135
 
136
+ // Trailers: GSD-Task first, then Resolves
137
+ bodyParts.push(`GSD-Task: ${ctx.taskId}`);
138
+
134
139
  if (ctx.issueNumber) {
135
140
  bodyParts.push(`Resolves #${ctx.issueNumber}`);
136
141
  }
137
142
 
138
- if (bodyParts.length > 0) {
139
- return `${subject}\n\n${bodyParts.join("\n\n")}`;
140
- }
141
-
142
- return subject;
143
+ return `${subject}\n\n${bodyParts.join("\n\n")}`;
143
144
  }
144
145
 
145
146
  /**
@@ -538,7 +539,7 @@ export class GitServiceImpl {
538
539
 
539
540
  const message = taskContext
540
541
  ? buildTaskCommitMessage(taskContext)
541
- : `chore(${unitId}): auto-commit after ${unitType}`;
542
+ : `chore: auto-commit after ${unitType}\n\nGSD-Unit: ${unitId}`;
542
543
  nativeCommit(this.basePath, message, { allowEmpty: false });
543
544
  return message;
544
545
  }