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.
- package/dist/resources/extensions/gsd/auto-dispatch.js +17 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +17 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +5 -2
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +43 -3
- package/dist/resources/extensions/gsd/git-service.js +11 -10
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +223 -56
- package/dist/resources/extensions/gsd/prompts/run-uat.md +4 -4
- package/dist/resources/extensions/gsd/worktree-command.js +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- 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/worktree-cli.js +1 -1
- package/package.json +1 -1
- package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +8 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +18 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +18 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +4 -2
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +46 -3
- package/src/resources/extensions/gsd/git-service.ts +12 -11
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +223 -56
- package/src/resources/extensions/gsd/prompts/run-uat.md +4 -4
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +14 -12
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/git-service.test.ts +19 -9
- package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +68 -0
- package/src/resources/extensions/gsd/worktree-command.ts +1 -1
- /package/dist/web/standalone/.next/static/{uTZ196cPUij3KcIDCweR6 → PTL5V00OW8q4-092tUQKx}/_buildManifest.js +0 -0
- /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/
|
|
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/
|
|
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><!--
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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><!--
|
|
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\":\"
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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":"
|
|
1
|
+
{"node":{},"edge":{},"encryptionKey":"MrUD6+DKxAtQuQvJmHgbOusoct8+zNzwhiqYL4y/faQ="}
|
package/dist/worktree-cli.js
CHANGED
|
@@ -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}
|
|
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
|
@@ -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
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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
|
|
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
|
|
25
|
-
const
|
|
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
|
-
|
|
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}
|
|
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 =
|
|
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}
|
|
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
|
-
|
|
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
|
|
542
|
+
: `chore: auto-commit after ${unitType}\n\nGSD-Unit: ${unitId}`;
|
|
542
543
|
nativeCommit(this.basePath, message, { allowEmpty: false });
|
|
543
544
|
return message;
|
|
544
545
|
}
|