gsd-pi 2.41.0-dev.97349b1 → 2.41.0-dev.b832948

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 (39) hide show
  1. package/dist/web/standalone/.next/BUILD_ID +1 -1
  2. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  3. package/dist/web/standalone/.next/build-manifest.json +2 -2
  4. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  5. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  6. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  7. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  9. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  10. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  14. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/index.html +1 -1
  22. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  29. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  30. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  31. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  32. package/package.json +1 -1
  33. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +118 -100
  34. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -2
  35. package/src/resources/extensions/gsd/tests/captures.test.ts +1 -12
  36. package/src/resources/extensions/gsd/tests/continue-here.test.ts +20 -20
  37. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +105 -195
  38. /package/dist/web/standalone/.next/static/{ZrI3HOoXD7Fh84fAHZVxb → 43Aw72Fdw8k1aAHQOYOXr}/_buildManifest.js +0 -0
  39. /package/dist/web/standalone/.next/static/{ZrI3HOoXD7Fh84fAHZVxb → 43Aw72Fdw8k1aAHQOYOXr}/_ssgManifest.js +0 -0
@@ -3,4 +3,4 @@
3
3
  3:I[90484,[],"MetadataBoundary"]
4
4
  4:"$Sreact.suspense"
5
5
  5:I[86869,[],"IconMark"]
6
- 0:{"buildId":"ZrI3HOoXD7Fh84fAHZVxb","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","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"}],["$","$L5","6",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"loading":null,"isPartial":false}
6
+ 0:{"buildId":"43Aw72Fdw8k1aAHQOYOXr","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","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"}],["$","$L5","6",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"loading":null,"isPartial":false}
@@ -5,4 +5,4 @@
5
5
  5:I[61549,["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"Toaster"]
6
6
  :HL["/_next/static/css/de70bee13400563f.css","style"]
7
7
  :HL["/_next/static/css/123c0bb039697968.css","style"]
8
- 0:{"buildId":"ZrI3HOoXD7Fh84fAHZVxb","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/de70bee13400563f.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/123c0bb039697968.css","precedence":"next"}]],["$","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","template":["$","$L4",null,{}],"notFound":[[["$","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."}]}]]}]}]],[]]}],["$","$L5",null,{"position":"bottom-right"}]]}]}]}]]}],"loading":null,"isPartial":false}
8
+ 0:{"buildId":"43Aw72Fdw8k1aAHQOYOXr","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/de70bee13400563f.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/123c0bb039697968.css","precedence":"next"}]],["$","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","template":["$","$L4",null,{}],"notFound":[[["$","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."}]}]]}]}]],[]]}],["$","$L5",null,{"position":"bottom-right"}]]}]}]}]]}],"loading":null,"isPartial":false}
@@ -2,4 +2,4 @@
2
2
  :HL["/_next/static/media/93f479601ee12b01-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
3
3
  :HL["/_next/static/css/de70bee13400563f.css","style"]
4
4
  :HL["/_next/static/css/123c0bb039697968.css","style"]
5
- 0:{"buildId":"ZrI3HOoXD7Fh84fAHZVxb","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":true},"staleTime":300}
5
+ 0:{"buildId":"43Aw72Fdw8k1aAHQOYOXr","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":true},"staleTime":300}
@@ -1,14 +1,14 @@
1
1
  {
2
- "/_not-found/page": "app/_not-found/page.js",
3
2
  "/_global-error/page": "app/_global-error/page.js",
3
+ "/_not-found/page": "app/_not-found/page.js",
4
4
  "/api/bridge-terminal/resize/route": "app/api/bridge-terminal/resize/route.js",
5
5
  "/api/boot/route": "app/api/boot/route.js",
6
- "/api/bridge-terminal/stream/route": "app/api/bridge-terminal/stream/route.js",
7
- "/api/cleanup/route": "app/api/cleanup/route.js",
8
6
  "/api/browse-directories/route": "app/api/browse-directories/route.js",
7
+ "/api/bridge-terminal/input/route": "app/api/bridge-terminal/input/route.js",
8
+ "/api/dev-mode/route": "app/api/dev-mode/route.js",
9
+ "/api/cleanup/route": "app/api/cleanup/route.js",
9
10
  "/api/captures/route": "app/api/captures/route.js",
10
11
  "/api/export-data/route": "app/api/export-data/route.js",
11
- "/api/dev-mode/route": "app/api/dev-mode/route.js",
12
12
  "/api/git/route": "app/api/git/route.js",
13
13
  "/api/doctor/route": "app/api/doctor/route.js",
14
14
  "/api/forensics/route": "app/api/forensics/route.js",
@@ -19,26 +19,26 @@
19
19
  "/api/live-state/route": "app/api/live-state/route.js",
20
20
  "/api/preferences/route": "app/api/preferences/route.js",
21
21
  "/api/onboarding/route": "app/api/onboarding/route.js",
22
- "/api/recovery/route": "app/api/recovery/route.js",
23
- "/api/bridge-terminal/input/route": "app/api/bridge-terminal/input/route.js",
24
22
  "/api/projects/route": "app/api/projects/route.js",
23
+ "/api/files/route": "app/api/files/route.js",
25
24
  "/api/session/browser/route": "app/api/session/browser/route.js",
26
25
  "/api/session/command/route": "app/api/session/command/route.js",
27
26
  "/api/session/events/route": "app/api/session/events/route.js",
28
27
  "/api/settings-data/route": "app/api/settings-data/route.js",
29
- "/api/session/manage/route": "app/api/session/manage/route.js",
30
28
  "/api/shutdown/route": "app/api/shutdown/route.js",
31
29
  "/api/skill-health/route": "app/api/skill-health/route.js",
30
+ "/api/session/manage/route": "app/api/session/manage/route.js",
32
31
  "/api/steer/route": "app/api/steer/route.js",
33
- "/api/terminal/resize/route": "app/api/terminal/resize/route.js",
34
32
  "/api/terminal/input/route": "app/api/terminal/input/route.js",
33
+ "/api/terminal/resize/route": "app/api/terminal/resize/route.js",
35
34
  "/api/terminal/sessions/route": "app/api/terminal/sessions/route.js",
36
35
  "/api/terminal/stream/route": "app/api/terminal/stream/route.js",
37
- "/api/undo/route": "app/api/undo/route.js",
38
36
  "/api/terminal/upload/route": "app/api/terminal/upload/route.js",
37
+ "/api/undo/route": "app/api/undo/route.js",
39
38
  "/api/update/route": "app/api/update/route.js",
40
- "/api/visualizer/route": "app/api/visualizer/route.js",
41
39
  "/api/remote-questions/route": "app/api/remote-questions/route.js",
42
- "/api/files/route": "app/api/files/route.js",
40
+ "/api/visualizer/route": "app/api/visualizer/route.js",
41
+ "/api/recovery/route": "app/api/recovery/route.js",
42
+ "/api/bridge-terminal/stream/route": "app/api/bridge-terminal/stream/route.js",
43
43
  "/page": "app/page.js"
44
44
  }
@@ -1 +1 @@
1
- <!DOCTYPE html><!--ZrI3HOoXD7Fh84fAHZVxb--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><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/123c0bb039697968.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-fa307370fcf9fb2c.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-fa307370fcf9fb2c.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/123c0bb039697968.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"ZrI3HOoXD7Fh84fAHZVxb\",\"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/123c0bb039697968.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\"}]]\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><!--43Aw72Fdw8k1aAHQOYOXr--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><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/123c0bb039697968.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-fa307370fcf9fb2c.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-fa307370fcf9fb2c.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/123c0bb039697968.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"43Aw72Fdw8k1aAHQOYOXr\",\"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/123c0bb039697968.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\"}]]\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><!--ZrI3HOoXD7Fh84fAHZVxb--><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-fa307370fcf9fb2c.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-fa307370fcf9fb2c.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\":\"ZrI3HOoXD7Fh84fAHZVxb\",\"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><!--43Aw72Fdw8k1aAHQOYOXr--><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-fa307370fcf9fb2c.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-fa307370fcf9fb2c.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\":\"43Aw72Fdw8k1aAHQOYOXr\",\"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":"zDxVLvgbfrCtgZAsQQ/BX0opbkrxiD/R6b6b5U1Pkqk="}
1
+ {"node":{},"edge":{},"encryptionKey":"qpFI5GSqmvfaIfepN/zFKRjrzM/zqzsnO6ftf8xTRHI="}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd-pi",
3
- "version": "2.41.0-dev.97349b1",
3
+ "version": "2.41.0-dev.b832948",
4
4
  "description": "GSD — Get Shit Done coding agent",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -595,6 +595,7 @@ test("autoLoop calls deriveState → resolveDispatch → runUnit in sequence", a
595
595
  ctx.sessionManager = { getSessionFile: () => "/tmp/session.json" };
596
596
  const pi = makeMockPi();
597
597
 
598
+ let loopCount = 0;
598
599
  const s = makeLoopSession();
599
600
 
600
601
  const deps = makeMockDeps({
@@ -620,8 +621,11 @@ test("autoLoop calls deriveState → resolveDispatch → runUnit in sequence", a
620
621
  },
621
622
  postUnitPostVerification: async () => {
622
623
  deps.callLog.push("postUnitPostVerification");
623
- // Deactivate after first iteration to exit the loop
624
- s.active = false;
624
+ loopCount++;
625
+ // After first iteration, deactivate to exit the loop
626
+ if (loopCount >= 1) {
627
+ s.active = false;
628
+ }
625
629
  return "continue" as const;
626
630
  },
627
631
  });
@@ -679,6 +683,7 @@ test("crash lock records session file from AFTER newSession, not before (#1710)"
679
683
  };
680
684
  const pi = makeMockPi();
681
685
 
686
+ let loopCount = 0;
682
687
  const s = makeLoopSession({
683
688
  cmdCtx: {
684
689
  newSession: () => {
@@ -726,8 +731,10 @@ test("crash lock records session file from AFTER newSession, not before (#1710)"
726
731
  },
727
732
  postUnitPostVerification: async () => {
728
733
  deps.callLog.push("postUnitPostVerification");
729
- // Deactivate after first iteration to exit the loop
730
- s.active = false;
734
+ loopCount++;
735
+ if (loopCount >= 1) {
736
+ s.active = false;
737
+ }
731
738
  return "continue" as const;
732
739
  },
733
740
  });
@@ -784,23 +791,6 @@ test("autoLoop handles verification retry by continuing loop", async (t) => {
784
791
  let deriveCallCount = 0;
785
792
  const s = makeLoopSession();
786
793
 
787
- // Pre-queued verification actions: each entry provides a side-effect + return value
788
- type VerifyAction = { sideEffect?: () => void; response: "retry" | "continue" };
789
- const verificationActions: VerifyAction[] = [
790
- {
791
- sideEffect: () => {
792
- // Simulate retry — set pendingVerificationRetry on session
793
- s.pendingVerificationRetry = {
794
- unitId: "M001/S01/T01",
795
- failureContext: "test failed: expected X got Y",
796
- attempt: 1,
797
- };
798
- },
799
- response: "retry",
800
- },
801
- { response: "continue" },
802
- ];
803
-
804
794
  const deps = makeMockDeps({
805
795
  deriveState: async () => {
806
796
  deriveCallCount++;
@@ -815,11 +805,19 @@ test("autoLoop handles verification retry by continuing loop", async (t) => {
815
805
  } as any;
816
806
  },
817
807
  runPostUnitVerification: async () => {
818
- const action = verificationActions[verifyCallCount] ?? { response: "continue" as const };
819
808
  verifyCallCount++;
820
809
  deps.callLog.push("runPostUnitVerification");
821
- action.sideEffect?.();
822
- return action.response;
810
+ if (verifyCallCount === 1) {
811
+ // First call: simulate retry — set pendingVerificationRetry on session
812
+ s.pendingVerificationRetry = {
813
+ unitId: "M001/S01/T01",
814
+ failureContext: "test failed: expected X got Y",
815
+ attempt: 1,
816
+ };
817
+ return "retry" as const;
818
+ }
819
+ // Second call: pass
820
+ return "continue" as const;
823
821
  },
824
822
  postUnitPostVerification: async () => {
825
823
  deps.callLog.push("postUnitPostVerification");
@@ -896,17 +894,19 @@ test("autoLoop handles dispatch skip action by continuing", async (t) => {
896
894
  const s = makeLoopSession();
897
895
 
898
896
  let dispatchCallCount = 0;
899
- // Pre-queued dispatch responses: first call returns "skip", second returns "stop"
900
- const dispatchResponses = [
901
- { action: "skip" as const },
902
- { action: "stop" as const, reason: "done", level: "info" as const },
903
- ];
904
897
  const deps = makeMockDeps({
905
898
  resolveDispatch: async () => {
906
- const response = dispatchResponses[dispatchCallCount] ?? dispatchResponses[dispatchResponses.length - 1];
907
899
  dispatchCallCount++;
908
900
  deps.callLog.push("resolveDispatch");
909
- return response;
901
+ if (dispatchCallCount === 1) {
902
+ return { action: "skip" as const };
903
+ }
904
+ // Second time: stop to exit the loop
905
+ return {
906
+ action: "stop" as const,
907
+ reason: "done",
908
+ level: "info" as const,
909
+ };
910
910
  },
911
911
  });
912
912
 
@@ -936,26 +936,22 @@ test("autoLoop drains sidecar queue after postUnitPostVerification enqueues item
936
936
  const s = makeLoopSession();
937
937
 
938
938
  let postVerCallCount = 0;
939
- const postVerActions: Array<() => void> = [
940
- () => {
941
- // First call (main unit): enqueue a sidecar item
942
- s.sidecarQueue.push({
943
- kind: "hook" as const,
944
- unitType: "hook/review",
945
- unitId: "M001/S01/T01/review",
946
- prompt: "review the code",
947
- });
948
- },
949
- () => {
950
- // Second call (sidecar unit completed): deactivate
951
- s.active = false;
952
- },
953
- ];
954
939
  const deps = makeMockDeps({
955
940
  postUnitPostVerification: async () => {
956
- postVerActions[postVerCallCount]?.();
957
941
  postVerCallCount++;
958
942
  deps.callLog.push("postUnitPostVerification");
943
+ if (postVerCallCount === 1) {
944
+ // First call (main unit): enqueue a sidecar item
945
+ s.sidecarQueue.push({
946
+ kind: "hook" as const,
947
+ unitType: "hook/review",
948
+ unitId: "M001/S01/T01/review",
949
+ prompt: "review the code",
950
+ });
951
+ return "continue" as const;
952
+ }
953
+ // Second call (sidecar unit completed): done
954
+ s.active = false;
959
955
  return "continue" as const;
960
956
  },
961
957
  });
@@ -1123,13 +1119,13 @@ test("startAuto calls selfHealRuntimeRecords before autoLoop (#1727)", () => {
1123
1119
  assert.ok(healIdx > -1, "startAuto must call selfHealRuntimeRecords");
1124
1120
  assert.ok(healIdx < loopIdx, "selfHealRuntimeRecords must be called before autoLoop");
1125
1121
 
1126
- // Verify the second autoLoop call site also has selfHeal before it (if present)
1122
+ // Verify the second autoLoop call site also has selfHeal before it
1127
1123
  const secondLoopIdx = fnBlock.indexOf("autoLoop(", loopIdx + 1);
1128
- const secondHealIdx = fnBlock.indexOf("selfHealRuntimeRecords", healIdx + 1);
1129
- assert.ok(
1130
- secondLoopIdx === -1 || (secondHealIdx > -1 && secondHealIdx < secondLoopIdx),
1131
- "if a second autoLoop call exists, it must also be preceded by selfHealRuntimeRecords",
1132
- );
1124
+ if (secondLoopIdx > -1) {
1125
+ const secondHealIdx = fnBlock.indexOf("selfHealRuntimeRecords", healIdx + 1);
1126
+ assert.ok(secondHealIdx > -1, "second autoLoop call must also have selfHealRuntimeRecords");
1127
+ assert.ok(secondHealIdx < secondLoopIdx, "second selfHealRuntimeRecords must precede second autoLoop");
1128
+ }
1133
1129
  });
1134
1130
 
1135
1131
  test("agent_end handler calls resolveAgentEnd (not handleAgentEnd)", () => {
@@ -1291,29 +1287,25 @@ test("stuck detection: window resets recovery when deriveState returns a differe
1291
1287
  const s = makeLoopSession();
1292
1288
 
1293
1289
  let deriveCallCount = 0;
1294
- let postVerCallCount = 0;
1295
1290
  let stopCalled = false;
1296
1291
 
1297
- // First 3 derives return T01, 4th returns T02; dispatch follows the derived task
1298
- const derivedTaskIds = ["T01", "T01", "T01", "T02"];
1299
-
1300
1292
  const deps = makeMockDeps({
1301
1293
  deriveState: async () => {
1302
- const taskId = derivedTaskIds[Math.min(deriveCallCount, derivedTaskIds.length - 1)];
1303
1294
  deriveCallCount++;
1304
1295
  deps.callLog.push("deriveState");
1305
1296
  return {
1306
1297
  phase: "executing",
1307
1298
  activeMilestone: { id: "M001", title: "Test", status: "active" },
1308
1299
  activeSlice: { id: "S01", title: "Slice 1" },
1309
- activeTask: { id: taskId },
1300
+ activeTask: { id: deriveCallCount <= 3 ? "T01" : "T02" },
1310
1301
  registry: [{ id: "M001", status: "active" }],
1311
1302
  blockers: [],
1312
1303
  } as any;
1313
1304
  },
1314
1305
  resolveDispatch: async () => {
1315
- const taskId = derivedTaskIds[Math.min(deriveCallCount - 1, derivedTaskIds.length - 1)];
1316
1306
  deps.callLog.push("resolveDispatch");
1307
+ // Return dispatch matching the task from deriveState
1308
+ const taskId = deriveCallCount <= 3 ? "T01" : "T02";
1317
1309
  return {
1318
1310
  action: "dispatch" as const,
1319
1311
  unitType: "execute-task",
@@ -1327,11 +1319,11 @@ test("stuck detection: window resets recovery when deriveState returns a differe
1327
1319
  s.active = false;
1328
1320
  },
1329
1321
  postUnitPostVerification: async () => {
1330
- postVerCallCount++;
1331
1322
  deps.callLog.push("postUnitPostVerification");
1332
- // Exit on the 4th call (after T02 unit completes)
1333
- const shouldExit = postVerCallCount >= 4;
1334
- s.active = !shouldExit;
1323
+ // After 4th iteration (unit changed on iter 4), exit
1324
+ if (deriveCallCount >= 4) {
1325
+ s.active = false;
1326
+ }
1335
1327
  return "continue" as const;
1336
1328
  },
1337
1329
  });
@@ -1370,14 +1362,6 @@ test("stuck detection: does not push to window during verification retry", async
1370
1362
  let verifyCallCount = 0;
1371
1363
  let stopReason = "";
1372
1364
 
1373
- // Pre-queued responses: 3 retries then a continue (exit)
1374
- const verifyActions: Array<() => "retry" | "continue"> = [
1375
- () => { s.pendingVerificationRetry = { unitId: "M001/S01/T01", failureContext: "test failed", attempt: 1 }; return "retry"; },
1376
- () => { s.pendingVerificationRetry = { unitId: "M001/S01/T01", failureContext: "test failed", attempt: 2 }; return "retry"; },
1377
- () => { s.pendingVerificationRetry = { unitId: "M001/S01/T01", failureContext: "test failed", attempt: 3 }; return "retry"; },
1378
- () => { s.active = false; return "continue"; },
1379
- ];
1380
-
1381
1365
  const deps = makeMockDeps({
1382
1366
  deriveState: async () =>
1383
1367
  ({
@@ -1395,10 +1379,20 @@ test("stuck detection: does not push to window during verification retry", async
1395
1379
  prompt: "do the thing",
1396
1380
  }),
1397
1381
  runPostUnitVerification: async () => {
1398
- const action = verifyActions[verifyCallCount] ?? (() => { s.active = false; return "continue" as const; });
1399
1382
  verifyCallCount++;
1400
1383
  deps.callLog.push("runPostUnitVerification");
1401
- return action();
1384
+ if (verifyCallCount <= 3) {
1385
+ // Set pendingVerificationRetry — should prevent stuck counter increment
1386
+ s.pendingVerificationRetry = {
1387
+ unitId: "M001/S01/T01",
1388
+ failureContext: "test failed",
1389
+ attempt: verifyCallCount,
1390
+ };
1391
+ return "retry" as const;
1392
+ }
1393
+ // After 3 retries, exit gracefully
1394
+ s.active = false;
1395
+ return "continue" as const;
1402
1396
  },
1403
1397
  stopAuto: async (_ctx?: any, _pi?: any, reason?: string) => {
1404
1398
  deps.callLog.push("stopAuto");
@@ -1550,7 +1544,7 @@ test("autoLoop lifecycle: advances through research → plan → execute → ver
1550
1544
  const dispatchedUnitTypes: string[] = [];
1551
1545
 
1552
1546
  // Phase sequence: each deriveState call returns a different phase.
1553
- // The 6th entry (index 5) is the terminal "complete" phase that stops the loop.
1547
+ // On the 6th call (start of iteration 6), we deactivate to exit.
1554
1548
  const phases = [
1555
1549
  // Call 1: researching → dispatches research-slice
1556
1550
  {
@@ -1582,12 +1576,6 @@ test("autoLoop lifecycle: advances through research → plan → execute → ver
1582
1576
  activeSlice: { id: "S01", title: "Complete Slice" },
1583
1577
  activeTask: null,
1584
1578
  },
1585
- // Call 6: terminal — deactivate to exit the loop
1586
- {
1587
- phase: "complete",
1588
- activeSlice: null,
1589
- activeTask: null,
1590
- },
1591
1579
  ];
1592
1580
 
1593
1581
  const dispatches = [
@@ -1600,26 +1588,46 @@ test("autoLoop lifecycle: advances through research → plan → execute → ver
1600
1588
 
1601
1589
  const deps = makeMockDeps({
1602
1590
  deriveState: async () => {
1603
- const p = phases[Math.min(deriveCallCount, phases.length - 1)];
1604
1591
  deriveCallCount++;
1605
1592
  deps.callLog.push("deriveState");
1606
1593
 
1607
- const terminalPhases: Record<string, string> = { complete: "complete" };
1608
- s.active = p.phase !== "complete";
1609
- const milestoneStatus = terminalPhases[p.phase] ?? "active";
1594
+ if (deriveCallCount > phases.length) {
1595
+ // 6th+ call: deactivate to exit the loop
1596
+ s.active = false;
1597
+ return {
1598
+ phase: "complete",
1599
+ activeMilestone: { id: "M001", title: "Test", status: "complete" },
1600
+ activeSlice: null,
1601
+ activeTask: null,
1602
+ registry: [{ id: "M001", status: "complete" }],
1603
+ blockers: [],
1604
+ } as any;
1605
+ }
1606
+
1607
+ const p = phases[deriveCallCount - 1];
1610
1608
  return {
1611
1609
  phase: p.phase,
1612
- activeMilestone: { id: "M001", title: "Test", status: milestoneStatus },
1613
- activeSlice: p.activeSlice ?? null,
1614
- activeTask: p.activeTask ?? null,
1615
- registry: [{ id: "M001", status: milestoneStatus }],
1610
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
1611
+ activeSlice: p.activeSlice,
1612
+ activeTask: p.activeTask,
1613
+ registry: [{ id: "M001", status: "active" }],
1616
1614
  blockers: [],
1617
1615
  } as any;
1618
1616
  },
1619
1617
  resolveDispatch: async () => {
1620
- const d = dispatches[Math.min(dispatchCallCount, dispatches.length - 1)];
1621
1618
  dispatchCallCount++;
1622
1619
  deps.callLog.push("resolveDispatch");
1620
+
1621
+ if (dispatchCallCount > dispatches.length) {
1622
+ // Safety: shouldn't reach here, but stop if it does
1623
+ return {
1624
+ action: "stop" as const,
1625
+ reason: "done",
1626
+ level: "info" as const,
1627
+ };
1628
+ }
1629
+
1630
+ const d = dispatches[dispatchCallCount - 1];
1623
1631
  dispatchedUnitTypes.push(d.unitType);
1624
1632
  return {
1625
1633
  action: "dispatch" as const,
@@ -1684,11 +1692,18 @@ test("autoLoop lifecycle: advances through research → plan → execute → ver
1684
1692
  `callLog should have at least 5 resolveDispatch entries (got ${dispatchEntries.length})`,
1685
1693
  );
1686
1694
 
1687
- // Verify interleaving: a deriveState must follow a resolveDispatch (confirms loop advanced)
1688
- const firstDispatchIdx = deps.callLog.indexOf("resolveDispatch");
1689
- const firstDeriveAfterDispatch = deps.callLog.indexOf("deriveState", firstDispatchIdx + 1);
1690
- assert.ok(firstDispatchIdx >= 0, "resolveDispatch should appear in callLog");
1691
- assert.ok(firstDeriveAfterDispatch > firstDispatchIdx, "deriveState should follow resolveDispatch to confirm loop advanced");
1695
+ // Verify interleaving: each resolveDispatch should follow a deriveState
1696
+ let dispatchSeen = 0;
1697
+ for (const entry of deps.callLog) {
1698
+ if (entry === "resolveDispatch") {
1699
+ dispatchSeen++;
1700
+ }
1701
+ if (entry === "deriveState" && dispatchSeen > 0) {
1702
+ // A deriveState after a resolveDispatch confirms the loop advanced
1703
+ break;
1704
+ }
1705
+ }
1706
+ assert.ok(dispatchSeen > 0, "resolveDispatch should appear in callLog");
1692
1707
 
1693
1708
  // Assert the exact sequence of dispatched unit types
1694
1709
  assert.deepEqual(
@@ -1761,8 +1776,6 @@ test("autoLoop re-iterates when postUnitPreVerification returns retry (#1571)",
1761
1776
  const s = makeLoopSession();
1762
1777
 
1763
1778
  let preVerifyCallCount = 0;
1764
- // Pre-queued responses: first call returns "retry", second returns "continue"
1765
- const preVerifyResponses = ["retry", "continue"] as const;
1766
1779
 
1767
1780
  const deps = makeMockDeps({
1768
1781
  deriveState: async () => {
@@ -1778,7 +1791,11 @@ test("autoLoop re-iterates when postUnitPreVerification returns retry (#1571)",
1778
1791
  },
1779
1792
  postUnitPreVerification: async () => {
1780
1793
  deps.callLog.push("postUnitPreVerification");
1781
- return preVerifyResponses[preVerifyCallCount++] ?? "continue";
1794
+ preVerifyCallCount++;
1795
+ if (preVerifyCallCount === 1) {
1796
+ return "retry" as const;
1797
+ }
1798
+ return "continue" as const;
1782
1799
  },
1783
1800
  postUnitPostVerification: async () => {
1784
1801
  deps.callLog.push("postUnitPostVerification");
@@ -1891,8 +1908,9 @@ test("autoLoop rejects execute-task with 0 tool calls as hallucinated (#1833)",
1891
1908
  postUnitPostVerification: async () => {
1892
1909
  deps.callLog.push("postUnitPostVerification");
1893
1910
  iterationCount++;
1894
- // Deactivate after 2nd iteration
1895
- s.active = iterationCount < 2;
1911
+ if (iterationCount >= 2) {
1912
+ s.active = false;
1913
+ }
1896
1914
  return "continue" as const;
1897
1915
  },
1898
1916
  });
@@ -101,8 +101,8 @@ test('secrets gate: pending keys exist — gate triggers collection, manifest up
101
101
  const status = await getManifestStatus(tmp, 'M001');
102
102
  assert.notStrictEqual(status, null, 'manifest should exist');
103
103
  assert.ok(status!.pending.length > 0, 'should have pending keys');
104
- assert.deepStrictEqual(status!.pending, ['GSD_GATE_TEST_PEND_A', 'GSD_GATE_TEST_PEND_B'], 'pending keys');
105
- assert.deepStrictEqual(status!.existing, ['GSD_GATE_TEST_EXISTING'], 'existing keys');
104
+ assert.deepStrictEqual(status!.pending, ['GSD_GATE_TEST_PEND_A', 'GSD_GATE_TEST_PEND_B']);
105
+ assert.deepStrictEqual(status!.existing, ['GSD_GATE_TEST_EXISTING']);
106
106
 
107
107
  // (b) Call collectSecretsFromManifest with no-UI context
108
108
  // With hasUI: false, collectOneSecret returns null → pending keys become "skipped"