@guuey/create-agentic-app 0.8.1 → 0.10.0

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 (316) hide show
  1. package/README.md +22 -2
  2. package/dist/{chunk-JD4RAKEG.js → chunk-5V2IFXD4.js} +96 -21
  3. package/dist/cli.cjs +145 -17
  4. package/dist/cli.js +60 -5
  5. package/dist/index.cjs +97 -21
  6. package/dist/index.d.cts +33 -2
  7. package/dist/index.d.ts +33 -2
  8. package/dist/index.js +3 -1
  9. package/dist/templates/{openai-agents-sdk → agentic-app/claude-agent-sdk}/AGENTS.md +2 -2
  10. package/dist/templates/{openai-agents-sdk → agentic-app/claude-agent-sdk}/README.md +17 -3
  11. package/dist/templates/agentic-app/claude-agent-sdk/gitignore +5 -0
  12. package/dist/templates/agentic-app/claude-agent-sdk/guuey.app.json +28 -0
  13. package/dist/templates/agentic-app/claude-agent-sdk/guuey.app.schema.json +119 -0
  14. package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/package.json +6 -3
  15. package/dist/templates/agentic-app/claude-agent-sdk/scripts/bootstrap.mjs +376 -0
  16. package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/web/index.html +0 -1
  17. package/dist/templates/agentic-app/claude-agent-sdk/web/package.json +28 -0
  18. package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/AgentChat.tsx +53 -0
  19. package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/AppShell.tsx +65 -0
  20. package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/BootstrapGate.tsx +30 -0
  21. package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/Shell.tsx +50 -0
  22. package/dist/templates/agentic-app/claude-agent-sdk/web/src/config.ts +148 -0
  23. package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/identity.ts +67 -0
  24. package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/oidc.ts +79 -0
  25. package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/status.ts +45 -0
  26. package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/widget.ts +96 -0
  27. package/dist/templates/agentic-app/claude-agent-sdk/web/src/main.tsx +52 -0
  28. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/AgentCanvas.tsx +14 -0
  29. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Dashboard.tsx +36 -0
  30. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Home.tsx +133 -0
  31. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Landing.tsx +50 -0
  32. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Login.tsx +81 -0
  33. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Reports.tsx +9 -0
  34. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/TalkOnMobile.tsx +50 -0
  35. package/dist/templates/agentic-app/claude-agent-sdk/web/src/routes.ts +7 -0
  36. package/dist/templates/agentic-app/claude-agent-sdk/web/src/styles-app.css +132 -0
  37. package/dist/templates/agentic-app/claude-agent-sdk/web/src/styles.css +248 -0
  38. package/dist/templates/agentic-app/claude-agent-sdk/web/src/vite-env.d.ts +1 -0
  39. package/dist/templates/agentic-app/claude-agent-sdk/web/tsconfig.json +18 -0
  40. package/dist/templates/agentic-app/claude-agent-sdk/web/vite.config.ts +46 -0
  41. package/dist/templates/{google-adk → agentic-app/google-adk}/AGENTS.md +2 -2
  42. package/dist/templates/agentic-app/google-adk/gitignore +5 -0
  43. package/dist/templates/agentic-app/google-adk/guuey.app.json +28 -0
  44. package/dist/templates/agentic-app/google-adk/guuey.app.schema.json +119 -0
  45. package/dist/templates/{google-adk → agentic-app/google-adk}/package.json +6 -3
  46. package/dist/templates/agentic-app/google-adk/scripts/bootstrap.mjs +376 -0
  47. package/dist/templates/{google-adk → agentic-app/google-adk}/web/index.html +0 -1
  48. package/dist/templates/agentic-app/google-adk/web/package.json +28 -0
  49. package/dist/templates/agentic-app/google-adk/web/src/components/AgentChat.tsx +53 -0
  50. package/dist/templates/agentic-app/google-adk/web/src/components/AppShell.tsx +65 -0
  51. package/dist/templates/agentic-app/google-adk/web/src/components/BootstrapGate.tsx +30 -0
  52. package/dist/templates/agentic-app/google-adk/web/src/components/Shell.tsx +50 -0
  53. package/dist/templates/agentic-app/google-adk/web/src/config.ts +148 -0
  54. package/dist/templates/agentic-app/google-adk/web/src/lib/identity.ts +67 -0
  55. package/dist/templates/agentic-app/google-adk/web/src/lib/oidc.ts +79 -0
  56. package/dist/templates/agentic-app/google-adk/web/src/lib/status.ts +45 -0
  57. package/dist/templates/agentic-app/google-adk/web/src/lib/widget.ts +96 -0
  58. package/dist/templates/agentic-app/google-adk/web/src/main.tsx +52 -0
  59. package/dist/templates/agentic-app/google-adk/web/src/pages/AgentCanvas.tsx +14 -0
  60. package/dist/templates/agentic-app/google-adk/web/src/pages/Dashboard.tsx +36 -0
  61. package/dist/templates/agentic-app/google-adk/web/src/pages/Home.tsx +133 -0
  62. package/dist/templates/agentic-app/google-adk/web/src/pages/Landing.tsx +50 -0
  63. package/dist/templates/agentic-app/google-adk/web/src/pages/Login.tsx +81 -0
  64. package/dist/templates/agentic-app/google-adk/web/src/pages/Reports.tsx +9 -0
  65. package/dist/templates/agentic-app/google-adk/web/src/pages/TalkOnMobile.tsx +50 -0
  66. package/dist/templates/agentic-app/google-adk/web/src/routes.ts +7 -0
  67. package/dist/templates/agentic-app/google-adk/web/src/styles-app.css +132 -0
  68. package/dist/templates/agentic-app/google-adk/web/src/styles.css +248 -0
  69. package/dist/templates/agentic-app/google-adk/web/src/vite-env.d.ts +1 -0
  70. package/dist/templates/agentic-app/google-adk/web/tsconfig.json +18 -0
  71. package/dist/templates/agentic-app/google-adk/web/vite.config.ts +46 -0
  72. package/dist/templates/{claude-agent-sdk → agentic-app/openai-agents-sdk}/AGENTS.md +2 -2
  73. package/dist/templates/{claude-agent-sdk → agentic-app/openai-agents-sdk}/README.md +17 -3
  74. package/dist/templates/agentic-app/openai-agents-sdk/gitignore +5 -0
  75. package/dist/templates/agentic-app/openai-agents-sdk/guuey.app.json +28 -0
  76. package/dist/templates/agentic-app/openai-agents-sdk/guuey.app.schema.json +119 -0
  77. package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/package.json +6 -3
  78. package/dist/templates/agentic-app/openai-agents-sdk/scripts/bootstrap.mjs +376 -0
  79. package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/web/index.html +0 -1
  80. package/dist/templates/agentic-app/openai-agents-sdk/web/package.json +28 -0
  81. package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/AgentChat.tsx +53 -0
  82. package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/AppShell.tsx +65 -0
  83. package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/BootstrapGate.tsx +30 -0
  84. package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/Shell.tsx +50 -0
  85. package/dist/templates/agentic-app/openai-agents-sdk/web/src/config.ts +148 -0
  86. package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/identity.ts +67 -0
  87. package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/oidc.ts +79 -0
  88. package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/status.ts +45 -0
  89. package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/widget.ts +96 -0
  90. package/dist/templates/agentic-app/openai-agents-sdk/web/src/main.tsx +52 -0
  91. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/AgentCanvas.tsx +14 -0
  92. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Dashboard.tsx +36 -0
  93. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Home.tsx +133 -0
  94. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Landing.tsx +50 -0
  95. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Login.tsx +81 -0
  96. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Reports.tsx +9 -0
  97. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/TalkOnMobile.tsx +50 -0
  98. package/dist/templates/agentic-app/openai-agents-sdk/web/src/routes.ts +7 -0
  99. package/dist/templates/agentic-app/openai-agents-sdk/web/src/styles-app.css +132 -0
  100. package/dist/templates/agentic-app/openai-agents-sdk/web/src/styles.css +248 -0
  101. package/dist/templates/agentic-app/openai-agents-sdk/web/src/vite-env.d.ts +1 -0
  102. package/dist/templates/agentic-app/openai-agents-sdk/web/tsconfig.json +18 -0
  103. package/dist/templates/agentic-app/openai-agents-sdk/web/vite.config.ts +46 -0
  104. package/dist/templates/base/claude-agent-sdk/.env.example +4 -0
  105. package/dist/templates/base/claude-agent-sdk/.mcp.json +1 -0
  106. package/dist/templates/base/claude-agent-sdk/AGENTS.md +135 -0
  107. package/dist/templates/base/claude-agent-sdk/README.md +171 -0
  108. package/dist/templates/base/claude-agent-sdk/ggui/blueprints/.gitkeep +0 -0
  109. package/dist/templates/base/claude-agent-sdk/ggui/ggui.json +15 -0
  110. package/dist/templates/base/claude-agent-sdk/ggui/themes/.gitkeep +0 -0
  111. package/dist/templates/base/claude-agent-sdk/gitignore +5 -0
  112. package/dist/templates/base/claude-agent-sdk/guuey.app.json +28 -0
  113. package/dist/templates/base/claude-agent-sdk/guuey.app.schema.json +119 -0
  114. package/dist/templates/base/claude-agent-sdk/guuey.json +14 -0
  115. package/dist/templates/base/claude-agent-sdk/mcps/todo/Dockerfile +46 -0
  116. package/dist/templates/base/claude-agent-sdk/mcps/todo/package.json +22 -0
  117. package/dist/templates/base/claude-agent-sdk/mcps/todo/src/server.ts +173 -0
  118. package/dist/templates/base/claude-agent-sdk/mcps/todo/tsconfig.json +15 -0
  119. package/dist/templates/base/claude-agent-sdk/mcps/todo/tsup.config.ts +14 -0
  120. package/dist/templates/base/claude-agent-sdk/package.json +30 -0
  121. package/dist/templates/base/claude-agent-sdk/pnpm-workspace.yaml +24 -0
  122. package/dist/templates/base/claude-agent-sdk/prompts/system.md +4 -0
  123. package/dist/templates/base/claude-agent-sdk/scripts/bootstrap.mjs +376 -0
  124. package/dist/templates/base/claude-agent-sdk/scripts/dev.mjs +45 -0
  125. package/dist/templates/base/claude-agent-sdk/src/agent-config.ts +77 -0
  126. package/dist/templates/base/claude-agent-sdk/src/worker.ts +89 -0
  127. package/dist/templates/base/claude-agent-sdk/tsconfig.json +15 -0
  128. package/dist/templates/base/claude-agent-sdk/tsup.config.ts +9 -0
  129. package/dist/templates/base/claude-agent-sdk/web/index.html +12 -0
  130. package/dist/templates/{claude-agent-sdk → base/claude-agent-sdk}/web/package.json +9 -8
  131. package/dist/templates/base/claude-agent-sdk/web/src/components/AgentChat.tsx +53 -0
  132. package/dist/templates/base/claude-agent-sdk/web/src/components/BootstrapGate.tsx +30 -0
  133. package/dist/templates/base/claude-agent-sdk/web/src/components/Shell.tsx +50 -0
  134. package/dist/templates/base/claude-agent-sdk/web/src/config.ts +148 -0
  135. package/dist/templates/base/claude-agent-sdk/web/src/lib/identity.ts +67 -0
  136. package/dist/templates/base/claude-agent-sdk/web/src/lib/oidc.ts +79 -0
  137. package/dist/templates/base/claude-agent-sdk/web/src/lib/status.ts +45 -0
  138. package/dist/templates/base/claude-agent-sdk/web/src/lib/widget.ts +96 -0
  139. package/dist/templates/base/claude-agent-sdk/web/src/main.tsx +38 -0
  140. package/dist/templates/base/claude-agent-sdk/web/src/pages/Chat.tsx +15 -0
  141. package/dist/templates/base/claude-agent-sdk/web/src/pages/Home.tsx +133 -0
  142. package/dist/templates/base/claude-agent-sdk/web/src/pages/Landing.tsx +50 -0
  143. package/dist/templates/base/claude-agent-sdk/web/src/pages/Login.tsx +81 -0
  144. package/dist/templates/base/claude-agent-sdk/web/src/routes.ts +7 -0
  145. package/dist/templates/base/claude-agent-sdk/web/src/styles.css +248 -0
  146. package/dist/templates/base/claude-agent-sdk/web/src/vite-env.d.ts +1 -0
  147. package/dist/templates/base/claude-agent-sdk/web/tsconfig.json +18 -0
  148. package/dist/templates/base/claude-agent-sdk/web/vite.config.ts +46 -0
  149. package/dist/templates/base/google-adk/.env.example +4 -0
  150. package/dist/templates/base/google-adk/.mcp.json +1 -0
  151. package/dist/templates/base/google-adk/AGENTS.md +135 -0
  152. package/dist/templates/base/google-adk/README.md +90 -0
  153. package/dist/templates/base/google-adk/ggui/blueprints/.gitkeep +0 -0
  154. package/dist/templates/base/google-adk/ggui/ggui.json +15 -0
  155. package/dist/templates/base/google-adk/ggui/themes/.gitkeep +0 -0
  156. package/dist/templates/base/google-adk/gitignore +5 -0
  157. package/dist/templates/base/google-adk/guuey.app.json +28 -0
  158. package/dist/templates/base/google-adk/guuey.app.schema.json +119 -0
  159. package/dist/templates/base/google-adk/guuey.json +15 -0
  160. package/dist/templates/base/google-adk/mcps/todo/Dockerfile +46 -0
  161. package/dist/templates/base/google-adk/mcps/todo/package.json +22 -0
  162. package/dist/templates/base/google-adk/mcps/todo/src/server.ts +173 -0
  163. package/dist/templates/base/google-adk/mcps/todo/tsconfig.json +15 -0
  164. package/dist/templates/base/google-adk/mcps/todo/tsup.config.ts +14 -0
  165. package/dist/templates/base/google-adk/package.json +30 -0
  166. package/dist/templates/base/google-adk/pnpm-workspace.yaml +34 -0
  167. package/dist/templates/base/google-adk/prompts/system.md +4 -0
  168. package/dist/templates/base/google-adk/scripts/bootstrap.mjs +376 -0
  169. package/dist/templates/base/google-adk/scripts/dev.mjs +45 -0
  170. package/dist/templates/base/google-adk/src/agent.ts +43 -0
  171. package/dist/templates/base/google-adk/tsconfig.json +15 -0
  172. package/dist/templates/base/google-adk/tsup.config.ts +13 -0
  173. package/dist/templates/base/google-adk/web/index.html +12 -0
  174. package/dist/templates/{google-adk → base/google-adk}/web/package.json +9 -8
  175. package/dist/templates/base/google-adk/web/src/components/AgentChat.tsx +53 -0
  176. package/dist/templates/base/google-adk/web/src/components/BootstrapGate.tsx +30 -0
  177. package/dist/templates/base/google-adk/web/src/components/Shell.tsx +50 -0
  178. package/dist/templates/base/google-adk/web/src/config.ts +148 -0
  179. package/dist/templates/base/google-adk/web/src/lib/identity.ts +67 -0
  180. package/dist/templates/base/google-adk/web/src/lib/oidc.ts +79 -0
  181. package/dist/templates/base/google-adk/web/src/lib/status.ts +45 -0
  182. package/dist/templates/base/google-adk/web/src/lib/widget.ts +96 -0
  183. package/dist/templates/base/google-adk/web/src/main.tsx +38 -0
  184. package/dist/templates/base/google-adk/web/src/pages/Chat.tsx +15 -0
  185. package/dist/templates/base/google-adk/web/src/pages/Home.tsx +133 -0
  186. package/dist/templates/base/google-adk/web/src/pages/Landing.tsx +50 -0
  187. package/dist/templates/base/google-adk/web/src/pages/Login.tsx +81 -0
  188. package/dist/templates/base/google-adk/web/src/routes.ts +7 -0
  189. package/dist/templates/base/google-adk/web/src/styles.css +248 -0
  190. package/dist/templates/base/google-adk/web/src/vite-env.d.ts +1 -0
  191. package/dist/templates/base/google-adk/web/tsconfig.json +18 -0
  192. package/dist/templates/base/google-adk/web/vite.config.ts +46 -0
  193. package/dist/templates/base/openai-agents-sdk/.env.example +4 -0
  194. package/dist/templates/base/openai-agents-sdk/.mcp.json +1 -0
  195. package/dist/templates/base/openai-agents-sdk/AGENTS.md +135 -0
  196. package/dist/templates/base/openai-agents-sdk/README.md +171 -0
  197. package/dist/templates/base/openai-agents-sdk/ggui/blueprints/.gitkeep +0 -0
  198. package/dist/templates/base/openai-agents-sdk/ggui/ggui.json +15 -0
  199. package/dist/templates/base/openai-agents-sdk/ggui/themes/.gitkeep +0 -0
  200. package/dist/templates/base/openai-agents-sdk/gitignore +5 -0
  201. package/dist/templates/base/openai-agents-sdk/guuey.app.json +28 -0
  202. package/dist/templates/base/openai-agents-sdk/guuey.app.schema.json +119 -0
  203. package/dist/templates/base/openai-agents-sdk/guuey.json +27 -0
  204. package/dist/templates/base/openai-agents-sdk/mcps/todo/Dockerfile +46 -0
  205. package/dist/templates/base/openai-agents-sdk/mcps/todo/package.json +22 -0
  206. package/dist/templates/base/openai-agents-sdk/mcps/todo/src/server.ts +173 -0
  207. package/dist/templates/base/openai-agents-sdk/mcps/todo/tsconfig.json +15 -0
  208. package/dist/templates/base/openai-agents-sdk/mcps/todo/tsup.config.ts +14 -0
  209. package/dist/templates/base/openai-agents-sdk/package.json +30 -0
  210. package/dist/templates/base/openai-agents-sdk/pnpm-workspace.yaml +24 -0
  211. package/dist/templates/base/openai-agents-sdk/prompts/system.md +4 -0
  212. package/dist/templates/base/openai-agents-sdk/scripts/bootstrap.mjs +376 -0
  213. package/dist/templates/base/openai-agents-sdk/scripts/dev.mjs +45 -0
  214. package/dist/templates/base/openai-agents-sdk/src/agent-config.ts +77 -0
  215. package/dist/templates/base/openai-agents-sdk/src/worker.ts +75 -0
  216. package/dist/templates/base/openai-agents-sdk/tsconfig.json +15 -0
  217. package/dist/templates/base/openai-agents-sdk/tsup.config.ts +16 -0
  218. package/dist/templates/base/openai-agents-sdk/web/index.html +12 -0
  219. package/dist/templates/{openai-agents-sdk → base/openai-agents-sdk}/web/package.json +9 -8
  220. package/dist/templates/base/openai-agents-sdk/web/src/components/AgentChat.tsx +53 -0
  221. package/dist/templates/base/openai-agents-sdk/web/src/components/BootstrapGate.tsx +30 -0
  222. package/dist/templates/base/openai-agents-sdk/web/src/components/Shell.tsx +50 -0
  223. package/dist/templates/base/openai-agents-sdk/web/src/config.ts +148 -0
  224. package/dist/templates/base/openai-agents-sdk/web/src/lib/identity.ts +67 -0
  225. package/dist/templates/base/openai-agents-sdk/web/src/lib/oidc.ts +79 -0
  226. package/dist/templates/base/openai-agents-sdk/web/src/lib/status.ts +45 -0
  227. package/dist/templates/base/openai-agents-sdk/web/src/lib/widget.ts +96 -0
  228. package/dist/templates/base/openai-agents-sdk/web/src/main.tsx +38 -0
  229. package/dist/templates/base/openai-agents-sdk/web/src/pages/Chat.tsx +15 -0
  230. package/dist/templates/base/openai-agents-sdk/web/src/pages/Home.tsx +133 -0
  231. package/dist/templates/base/openai-agents-sdk/web/src/pages/Landing.tsx +50 -0
  232. package/dist/templates/base/openai-agents-sdk/web/src/pages/Login.tsx +81 -0
  233. package/dist/templates/base/openai-agents-sdk/web/src/routes.ts +7 -0
  234. package/dist/templates/base/openai-agents-sdk/web/src/styles.css +248 -0
  235. package/dist/templates/base/openai-agents-sdk/web/src/vite-env.d.ts +1 -0
  236. package/dist/templates/base/openai-agents-sdk/web/tsconfig.json +18 -0
  237. package/dist/templates/base/openai-agents-sdk/web/vite.config.ts +46 -0
  238. package/package.json +6 -3
  239. package/dist/templates/claude-agent-sdk/web/.env.example +0 -17
  240. package/dist/templates/claude-agent-sdk/web/sandbox-proxy.ts +0 -239
  241. package/dist/templates/claude-agent-sdk/web/src/App.tsx +0 -272
  242. package/dist/templates/claude-agent-sdk/web/src/main.tsx +0 -12
  243. package/dist/templates/claude-agent-sdk/web/src/useAgentChat.ts +0 -122
  244. package/dist/templates/claude-agent-sdk/web/src/vite-env.d.ts +0 -27
  245. package/dist/templates/claude-agent-sdk/web/tsconfig.json +0 -20
  246. package/dist/templates/claude-agent-sdk/web/vite.config.ts +0 -12
  247. package/dist/templates/google-adk/web/.env.example +0 -17
  248. package/dist/templates/google-adk/web/sandbox-proxy.ts +0 -239
  249. package/dist/templates/google-adk/web/src/App.tsx +0 -272
  250. package/dist/templates/google-adk/web/src/main.tsx +0 -12
  251. package/dist/templates/google-adk/web/src/useAgentChat.ts +0 -122
  252. package/dist/templates/google-adk/web/src/vite-env.d.ts +0 -27
  253. package/dist/templates/google-adk/web/tsconfig.json +0 -20
  254. package/dist/templates/google-adk/web/vite.config.ts +0 -12
  255. package/dist/templates/openai-agents-sdk/web/.env.example +0 -17
  256. package/dist/templates/openai-agents-sdk/web/sandbox-proxy.ts +0 -239
  257. package/dist/templates/openai-agents-sdk/web/src/App.tsx +0 -272
  258. package/dist/templates/openai-agents-sdk/web/src/main.tsx +0 -12
  259. package/dist/templates/openai-agents-sdk/web/src/useAgentChat.ts +0 -122
  260. package/dist/templates/openai-agents-sdk/web/src/vite-env.d.ts +0 -27
  261. package/dist/templates/openai-agents-sdk/web/tsconfig.json +0 -20
  262. package/dist/templates/openai-agents-sdk/web/vite.config.ts +0 -12
  263. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/.env.example +0 -0
  264. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/.mcp.json +0 -0
  265. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/blueprints/.gitkeep +0 -0
  266. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/ggui.json +0 -0
  267. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/themes/.gitkeep +0 -0
  268. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/guuey.json +0 -0
  269. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/Dockerfile +0 -0
  270. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/package.json +0 -0
  271. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/src/server.ts +0 -0
  272. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/tsconfig.json +0 -0
  273. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/tsup.config.ts +0 -0
  274. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/pnpm-workspace.yaml +0 -0
  275. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/prompts/system.md +0 -0
  276. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/scripts/dev.mjs +0 -0
  277. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/src/agent-config.ts +0 -0
  278. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/src/worker.ts +0 -0
  279. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/tsconfig.json +0 -0
  280. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/tsup.config.ts +0 -0
  281. /package/dist/templates/{google-adk → agentic-app/google-adk}/.env.example +0 -0
  282. /package/dist/templates/{google-adk → agentic-app/google-adk}/.mcp.json +0 -0
  283. /package/dist/templates/{google-adk → agentic-app/google-adk}/README.md +0 -0
  284. /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/blueprints/.gitkeep +0 -0
  285. /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/ggui.json +0 -0
  286. /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/themes/.gitkeep +0 -0
  287. /package/dist/templates/{google-adk → agentic-app/google-adk}/guuey.json +0 -0
  288. /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/Dockerfile +0 -0
  289. /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/package.json +0 -0
  290. /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/src/server.ts +0 -0
  291. /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/tsconfig.json +0 -0
  292. /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/tsup.config.ts +0 -0
  293. /package/dist/templates/{google-adk → agentic-app/google-adk}/pnpm-workspace.yaml +0 -0
  294. /package/dist/templates/{google-adk → agentic-app/google-adk}/prompts/system.md +0 -0
  295. /package/dist/templates/{google-adk → agentic-app/google-adk}/scripts/dev.mjs +0 -0
  296. /package/dist/templates/{google-adk → agentic-app/google-adk}/src/agent.ts +0 -0
  297. /package/dist/templates/{google-adk → agentic-app/google-adk}/tsconfig.json +0 -0
  298. /package/dist/templates/{google-adk → agentic-app/google-adk}/tsup.config.ts +0 -0
  299. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/.env.example +0 -0
  300. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/.mcp.json +0 -0
  301. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/blueprints/.gitkeep +0 -0
  302. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/ggui.json +0 -0
  303. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/themes/.gitkeep +0 -0
  304. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/guuey.json +0 -0
  305. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/Dockerfile +0 -0
  306. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/package.json +0 -0
  307. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/src/server.ts +0 -0
  308. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/tsconfig.json +0 -0
  309. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/tsup.config.ts +0 -0
  310. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/pnpm-workspace.yaml +0 -0
  311. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/prompts/system.md +0 -0
  312. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/scripts/dev.mjs +0 -0
  313. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/src/agent-config.ts +0 -0
  314. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/src/worker.ts +0 -0
  315. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/tsconfig.json +0 -0
  316. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/tsup.config.ts +0 -0
@@ -0,0 +1,171 @@
1
+ # agentic-app-template
2
+
3
+ A guuey agentic app: a code-mode agent, a custom MCP server you can copy to
4
+ add your own tools, and a `ggui` config for generative UI — all runnable
5
+ locally with one command, and deployable to guuey with one more.
6
+
7
+ ## What got scaffolded
8
+
9
+ ```
10
+ .
11
+ ├── guuey.json # the deploy contract: agent framework/model, system prompt,
12
+ │ # mcpServers (name → colocated source + devPort), ggui config
13
+ ├── package.json # agent deps + the pnpm workspace root (workspaces: mcps/*, web)
14
+ ├── src/worker.ts # your agent code (code-mode worker); build emits ./guuey.worker.js
15
+ ├── prompts/system.md # system prompt, referenced from guuey.json#agent.systemPrompt.file
16
+ ├── mcps/todo/ # the "copy-me" custom MCP server — @modelcontextprotocol/sdk,
17
+ │ # Streamable HTTP, in-memory todo list, port :6782
18
+ ├── ggui/ # ggui.json + blueprints/ + themes/ — generative-UI config.
19
+ │ # `ggui serve` runs against this locally; it's pushed to your
20
+ │ # deployed app's guuey-managed ggui instance on `guuey deploy`.
21
+ ├── web/ # the product frontend (Vite + React on @guuey/chat):
22
+ │ # landing (widget) · login (guest + BYO-OIDC seam) · home
23
+ │ # (status + distribution guide) · the chat surface
24
+ ├── guuey.app.json # frontend/brand config — written by `pnpm bootstrap`
25
+ │ # (schema: guuey.app.schema.json; public-safe by design)
26
+ ├── AGENTS.md # coding-agent steering; `pnpm bootstrap` maintains the
27
+ │ # managed block with this project's real facts
28
+ ├── scripts/dev.mjs # `pnpm dev` orchestrator — boots the whole local stack
29
+ ├── scripts/bootstrap.mjs # `pnpm bootstrap` — configure, then `-- --link` to bind
30
+ ├── .env.example # ANTHROPIC_API_KEY / OPENAI_API_KEY for local dev
31
+ └── .mcp.json # Claude Code convenience wiring (mcp.ggui.ai/dev)
32
+ ```
33
+
34
+ The project root **is** the agent package — `guuey deploy` packs this directory
35
+ directly as the deploy tarball, so `guuey.json` and `src/worker.ts` live at the top
36
+ level rather than nested under a `servers/` or `apps/` folder.
37
+
38
+ ## Quick start
39
+
40
+ ```bash
41
+ pnpm install
42
+ pnpm bootstrap # brand, theme, copy → guuey.app.json + AGENTS.md (no account needed;
43
+ # every web page is gated on this, and production builds fail without it)
44
+ cp .env.example .env.local # done automatically on scaffold if .env.local is absent
45
+ # set ANTHROPIC_API_KEY (or OPENAI_API_KEY, for the openai-agents-sdk template) in .env.local
46
+ pnpm dev
47
+ ```
48
+
49
+ When the agent is deployed (`guuey login && guuey deploy`), bind it into the
50
+ frontend: `pnpm bootstrap -- --link` — that records the app id, endpoint,
51
+ widget origin and portal link in `guuey.app.json` and pushes brand basics to
52
+ the platform. `pnpm status` shows the live app state; `pnpm bootstrap -- --check`
53
+ prints machine-readable configuration state.
54
+
55
+ `pnpm dev` (`scripts/dev.mjs`) boots four processes with prefixed, interleaved
56
+ logs. Ctrl-C tears all of them down together.
57
+
58
+ | process | port | what |
59
+ | ------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------ |
60
+ | `worker` | — | `tsup --watch` — rebuilds `guuey.worker.js` on every save |
61
+ | `guuey dev` | :6790 | local router: spawns your worker per turn, streams SSE; auto-spawns every `colocated` MCP entry — `mcps/todo` lands on its `devPort` :6782 |
62
+ | `ggui serve` | :6781 | local generative-UI server, over `ggui/` |
63
+ | `web` | :6890 | the product frontend (landing/login/home/chat on @guuey/chat) |
64
+
65
+ The todo MCP still answers on :6782 — it's just a supervised child of
66
+ `guuey dev` now (copy `mcps/todo/` to add your own server; new `colocated`
67
+ entries in `guuey.json` are auto-spawned the same way).
68
+
69
+ > **If a server's deps carry build scripts** (the classic: `tsx` → esbuild's
70
+ > platform-binary fetch), pnpm ≥11 refuses to run them on a fresh install —
71
+ > `ERR_PNPM_IGNORED_BUILDS` — and the server never boots. Approve the
72
+ > specific packages declaratively in the workspace-root `package.json` (or
73
+ > the server's own, for a standalone install):
74
+ > `"pnpm": { "onlyBuiltDependencies": ["esbuild"] }`. This scaffold ships
75
+ > the approval already; add to the list when a new dep needs its build step.
76
+ > Don't disable the gate wholesale — it's pnpm's supply-chain protection.
77
+
78
+ Open http://localhost:6890 to chat with your agent locally.
79
+
80
+ ## Local dev vs. deployed — what's different
81
+
82
+ `guuey dev` is the open, local equivalent of the pod router that runs your
83
+ worker in production. It mirrors the real spawn/stream contract closely — the
84
+ same normalizer, the same SSE shape — but it deliberately cuts three corners:
85
+ two that only matter once real users and real money are involved, and one
86
+ you should read twice:
87
+
88
+ - **No sandboxing — read this one twice.** Locally your worker runs as a
89
+ plain child process: no `bwrap`/gVisor isolation on any platform, it
90
+ inherits your **full shell environment** (every variable, including
91
+ credentials unrelated to this agent), and when filesystem layers are
92
+ bound the host grants the agent shell and file tools **without
93
+ prompting** (the production jail those tools assume does not exist
94
+ locally). Net: `guuey dev` runs an LLM-driven agent with unprompted
95
+ shell access as you, with your env. That's a deliberate dev-trust
96
+ posture, not an accident — treat the agent like any script you'd run
97
+ from the internet: run `guuey dev` in a throwaway shell/container with
98
+ a minimal environment if your agent (or any MCP server it talks to)
99
+ handles untrusted input. In production every invocation runs inside a
100
+ gVisor-isolated pod with only its declared environment.
101
+ - **Permissive auth.** `ggui serve --dev-allow-all` accepts any bearer
102
+ locally. The deployed ggui instance enforces real auth.
103
+ - **No metering or history.** Local runs aren't billed and aren't persisted.
104
+ Deployed conversations are metered and their history is written to
105
+ DynamoDB so users can resume a thread.
106
+
107
+ None of this changes your code — `guuey.json` is the same file in both
108
+ worlds; only how it's resolved differs. Locally, `guuey dev` auto-spawns each
109
+ `colocated` entry on its `devPort` and points the agent at
110
+ `localhost:<devPort>`; deployed, the same server code runs as a supervised
111
+ child inside your agent's pod, reached over the pod's loopback with a
112
+ per-request federated identity. (`hosted` entries deploy to the platform's
113
+ federated URLs; locally they need a `devPort` pointing at a server you run
114
+ yourself, or they're skipped with a warning.)
115
+
116
+ ## Deploying
117
+
118
+ ```bash
119
+ guuey login # device-flow auth; stores a token in ~/.guuey/auth.json
120
+ guuey deploy # ships everything
121
+ ```
122
+
123
+ `guuey deploy` runs four legs, in order, so a hard failure aborts before
124
+ anything user-visible changes:
125
+
126
+ 1. **MCP leg** — deploys each `hosted` entry under `guuey.json#agent.mcpServers`
127
+ as its own hosted MCP server (build → deploy → registry), then writes the
128
+ resulting server id back into `guuey.json`. This scaffold has none — the
129
+ todo MCP is `colocated`, so this leg is a no-op here.
130
+ 2. **ggui asset leg** — pushes `ggui/` (ggui.json, blueprints, themes) to your
131
+ app's guuey-managed ggui instance.
132
+ 3. **Agent leg** — builds `src/worker.ts` into `guuey.worker.js`, packs the
133
+ project root (including `mcps/`), and deploys it as a gVisor-isolated,
134
+ scale-to-zero pod. Each `colocated` entry (e.g. `mcps/todo`) is built into
135
+ the worker image and auto-spawned as a supervised, sandboxed child at pod
136
+ boot — no separate server, registry row, or write-back.
137
+ 4. **Output** — prints your agent's endpoint URL and a Portal deep link.
138
+
139
+ Re-running `guuey deploy` converges: unchanged pieces are skipped or reused,
140
+ nothing is duplicated.
141
+
142
+ ## Filesystem + memory
143
+
144
+ Every deployed invoke gets three bound directories — `$GUUEY_HOME_DIR`
145
+ (durable, per-user), `$GUUEY_APP_DIR` (read-only, shared), and cwd (session
146
+ scratch) — plain `node:fs`, no wrapper API required. Signed-in users get
147
+ durable cross-session memory for free (a platform-owned prompt tells the
148
+ model to read/write `$GUUEY_HOME_DIR/memories/MEMORY.md`); guests never get
149
+ durable storage, by design. **This recall is `claude-agent-sdk`-only today**
150
+ — openai-agents-sdk and google-adk agents get the three bound directories
151
+ but not the automatic memory-file recall; all-framework support arrives
152
+ with guuey's own memory MCP (a platform tool every framework can call over
153
+ its existing MCP channel). Framework-native memory backends (e.g. ADK's
154
+ Vertex MemoryBank) are unsupported on Guuey — they'd store user data
155
+ outside guuey's deletion boundary. Full contract, code examples, and
156
+ rollout status: the "Your agent's filesystem" section of the guuey
157
+ monorepo's `docs/quickstart.md`, or
158
+ [`@guuey/fs`](https://www.npmjs.com/package/@guuey/fs)'s own README — an
159
+ optional, three-helper sugar layer over the same paths.
160
+
161
+ ## How people talk to your agent
162
+
163
+ - **guuey Portal** — a Telegram-like agent App Store and universal chat
164
+ client. Once deployed, your agent is reachable from Portal with **zero
165
+ frontend code** — most builders never need to touch `web/` at all.
166
+ - **`web/`** — ships anyway, because the local dev loop needs a chat surface,
167
+ and it's a worked example of the bring-your-own-frontend path if you want
168
+ to embed your agent somewhere Portal doesn't reach.
169
+ - **Future: guuey widgets** — an embeddable web-chat widget for dropping
170
+ your agent into an existing site is planned as a separate feature; `web/`
171
+ is designed to make that graduation straightforward when it lands.
@@ -0,0 +1,15 @@
1
+ {
2
+ "schema": "1",
3
+ "protocol": "draft-2026-06-12",
4
+ "app": {
5
+ "slug": "agentic-app-template",
6
+ "name": "agentic-app-template"
7
+ },
8
+ "generation": {
9
+ "model": "anthropic:claude-haiku-4-5-20251001"
10
+ },
11
+ "theme": {
12
+ "preset": "indigo",
13
+ "mode": "dark"
14
+ }
15
+ }
@@ -0,0 +1,5 @@
1
+ node_modules/
2
+ dist/
3
+ .env.local
4
+ guuey.worker.js
5
+ .guuey-dev/
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "./guuey.app.schema.json",
3
+ "schema": 1,
4
+ "bootstrapped": false,
5
+ "brand": {
6
+ "name": "agentic-app-template",
7
+ "tagline": "An agentic app built on guuey",
8
+ "logoText": "AA"
9
+ },
10
+ "theme": {
11
+ "accent": "#6c5ce7",
12
+ "mode": "light"
13
+ },
14
+ "copy": {
15
+ "landing": {
16
+ "headline": "Ask anything.",
17
+ "sub": "This site has an agent. Open the chat, or use the launcher in the corner."
18
+ },
19
+ "login": {
20
+ "guestHint": "One click, no account — this browser gets its own private thread the agent remembers."
21
+ }
22
+ },
23
+ "auth": {
24
+ "oidc": null
25
+ },
26
+ "link": null,
27
+ "demoMode": false
28
+ }
@@ -0,0 +1,119 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "guuey.app.json",
4
+ "description": "App-level configuration for this guuey agentic app. Written by `pnpm bootstrap`; safe to hand-edit. Public-safe by construction: nothing in this file is a secret (the appId ships in page HTML by design).",
5
+ "type": "object",
6
+ "required": ["schema", "bootstrapped", "brand", "theme", "copy", "auth", "link", "demoMode"],
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "$schema": { "type": "string" },
10
+ "schema": { "const": 1 },
11
+ "bootstrapped": {
12
+ "type": "boolean",
13
+ "description": "Flipped true by `pnpm bootstrap`. Dev renders a setup screen until then; production builds fail."
14
+ },
15
+ "brand": {
16
+ "type": "object",
17
+ "required": ["name", "tagline", "logoText"],
18
+ "additionalProperties": false,
19
+ "properties": {
20
+ "name": { "type": "string", "minLength": 1 },
21
+ "tagline": { "type": "string" },
22
+ "logoText": {
23
+ "type": "string",
24
+ "maxLength": 4,
25
+ "description": "1-4 characters shown in the square brand mark."
26
+ }
27
+ }
28
+ },
29
+ "theme": {
30
+ "type": "object",
31
+ "required": ["accent", "mode"],
32
+ "additionalProperties": false,
33
+ "properties": {
34
+ "accent": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
35
+ "mode": { "enum": ["light", "dark"] }
36
+ }
37
+ },
38
+ "copy": {
39
+ "type": "object",
40
+ "required": ["landing", "login"],
41
+ "additionalProperties": false,
42
+ "properties": {
43
+ "landing": {
44
+ "type": "object",
45
+ "required": ["headline", "sub"],
46
+ "additionalProperties": false,
47
+ "properties": {
48
+ "headline": { "type": "string" },
49
+ "sub": { "type": "string" }
50
+ }
51
+ },
52
+ "login": {
53
+ "type": "object",
54
+ "required": ["guestHint"],
55
+ "additionalProperties": false,
56
+ "properties": {
57
+ "guestHint": { "type": "string" }
58
+ }
59
+ }
60
+ }
61
+ },
62
+ "auth": {
63
+ "type": "object",
64
+ "required": ["oidc"],
65
+ "additionalProperties": false,
66
+ "properties": {
67
+ "oidc": {
68
+ "description": "BYO-OIDC sign-in. null = guest-only. When set, the bound guuey app must be in BYO auth mode for the same issuer: `guuey apps update <appId> --auth-mode byo --issuer-url <issuer> --audience <clientId>`.",
69
+ "oneOf": [
70
+ { "type": "null" },
71
+ {
72
+ "type": "object",
73
+ "required": ["issuer", "clientId"],
74
+ "additionalProperties": false,
75
+ "properties": {
76
+ "issuer": { "type": "string", "format": "uri" },
77
+ "clientId": { "type": "string", "minLength": 1 }
78
+ }
79
+ }
80
+ ]
81
+ }
82
+ }
83
+ },
84
+ "link": {
85
+ "description": "The bound guuey app. null until `pnpm bootstrap -- --link`. Every value here is read back from the platform, never derived by hand.",
86
+ "oneOf": [
87
+ { "type": "null" },
88
+ {
89
+ "type": "object",
90
+ "required": [
91
+ "appId",
92
+ "env",
93
+ "apiBaseUrl",
94
+ "endpointUrl",
95
+ "widgetOrigin",
96
+ "portalUrl",
97
+ "slug",
98
+ "pageUrl"
99
+ ],
100
+ "additionalProperties": false,
101
+ "properties": {
102
+ "appId": { "type": "string", "minLength": 1 },
103
+ "env": { "enum": ["dev", "staging", "release"] },
104
+ "apiBaseUrl": { "type": "string", "format": "uri" },
105
+ "endpointUrl": { "type": "string", "format": "uri" },
106
+ "widgetOrigin": { "type": "string", "format": "uri" },
107
+ "portalUrl": { "type": "string", "format": "uri" },
108
+ "slug": { "oneOf": [{ "type": "string" }, { "type": "null" }] },
109
+ "pageUrl": { "oneOf": [{ "type": "string", "format": "uri" }, { "type": "null" }] }
110
+ }
111
+ }
112
+ ]
113
+ },
114
+ "demoMode": {
115
+ "type": "boolean",
116
+ "description": "Renders the demo chrome (banner + fictional-product honesty strip). Off in every customer clone."
117
+ }
118
+ }
119
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "schema": "1",
3
+ "worker": "worker.js",
4
+ "agent": {
5
+ "mode": "code",
6
+ "framework": "openai-agents-sdk",
7
+ "model": "gpt-5.6-terra",
8
+ "systemPrompt": {
9
+ "file": "prompts/system.md"
10
+ },
11
+ "mcpServers": {
12
+ "todo": {
13
+ "kind": "colocated",
14
+ "source": "./mcps/todo",
15
+ "devPort": 6782
16
+ },
17
+ "ggui": {
18
+ "kind": "external",
19
+ "url": "https://mcp.ggui.ai",
20
+ "transport": "http"
21
+ }
22
+ }
23
+ },
24
+ "ggui": {
25
+ "configFile": "./ggui/ggui.json"
26
+ }
27
+ }
@@ -0,0 +1,46 @@
1
+ # todo-mcp — guuey hosted MCP server image.
2
+ #
3
+ # Self-sufficient multi-stage build: `guuey mcp deploy` packs this directory
4
+ # into a tarball and hands it straight to the builder with no external
5
+ # pre-build step and no build args — this Dockerfile installs its own deps
6
+ # and builds itself. (Different from guuey's own first-party MCP servers,
7
+ # which use a "copy-prebuilt" pattern that expects `dist/` + `node_modules/`
8
+ # to already exist before `docker build` runs — that pattern does not apply
9
+ # to a standalone project like this one.)
10
+ #
11
+ # Build + run locally:
12
+ #
13
+ # docker build -t todo-mcp .
14
+ # docker run -p 8080:8080 todo-mcp
15
+ # curl http://localhost:8080/health
16
+ #
17
+ # Deploy to guuey:
18
+ #
19
+ # cd mcps/todo && guuey mcp deploy
20
+
21
+ FROM node:22-slim AS build
22
+ WORKDIR /app
23
+ COPY package.json ./
24
+ RUN npm install
25
+ COPY tsconfig.json ./
26
+ COPY src ./src
27
+ RUN npm run build
28
+
29
+ FROM node:22-slim
30
+ WORKDIR /app
31
+ ENV NODE_ENV=production
32
+ # guuey's hosted-MCP runtime injects PORT=8080 and probes GET /health at that
33
+ # port — this default matches so `docker run` alone also works.
34
+ ENV PORT=8080
35
+
36
+ COPY package.json ./
37
+ RUN npm install --omit=dev
38
+ COPY --from=build /app/dist ./dist
39
+
40
+ USER node
41
+ EXPOSE 8080
42
+
43
+ HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
44
+ CMD node -e "fetch('http://localhost:' + (process.env.PORT || 8080) + '/health').then(r => { if (!r.ok) throw 1 }).catch(() => process.exit(1))"
45
+
46
+ CMD ["node", "dist/server.js"]
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@agentic-app-template/todo-mcp",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "tsx src/server.ts",
8
+ "build": "tsup",
9
+ "start": "node dist/server.js",
10
+ "typecheck": "tsc --noEmit"
11
+ },
12
+ "dependencies": {
13
+ "@modelcontextprotocol/sdk": "^1.27.0",
14
+ "zod": "^4.0.0"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^22.0.0",
18
+ "tsx": "^4.19.0",
19
+ "tsup": "^8.5.0",
20
+ "typescript": "^5.8.0"
21
+ }
22
+ }
@@ -0,0 +1,173 @@
1
+ /**
2
+ * todo-mcp — the copy-me example MCP server for @agentic-app-template.
3
+ *
4
+ * A minimal, stateless Streamable HTTP MCP server: four tools over an
5
+ * in-memory todo list. Swap the `Map` for a real database when you outgrow
6
+ * a single replica; everything else (transport wiring, tool shape) stays
7
+ * the same.
8
+ *
9
+ * Transport pattern mirrors guuey's canonical hosted-MCP scaffold
10
+ * (`mcp-servers/_template` in the guuey monorepo): a fresh `McpServer` +
11
+ * `StreamableHTTPServerTransport` are created **per request** and torn down
12
+ * when the response closes. Stateless mode — the guuey proxy (and, locally,
13
+ * whatever MCP client you point at this server) handles sessions, so this
14
+ * server never keeps request state around between calls.
15
+ *
16
+ * Runtime contract when deployed via `guuey mcp deploy` (see mcps/todo's
17
+ * Dockerfile): the platform injects `PORT=8080` and probes `GET /health`
18
+ * for both liveness and readiness. Locally, `pnpm dev` runs this on
19
+ * `PORT=6782` (see ../../scripts/dev.mjs).
20
+ */
21
+ import { createServer, type IncomingMessage, type ServerResponse } from "node:http";
22
+ import { randomUUID } from "node:crypto";
23
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
24
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
25
+ import { z } from "zod";
26
+
27
+ interface Todo {
28
+ id: string;
29
+ title: string;
30
+ done: boolean;
31
+ }
32
+
33
+ const todos = new Map<string, Todo>();
34
+
35
+ const todoShape = {
36
+ id: z.string(),
37
+ title: z.string(),
38
+ done: z.boolean(),
39
+ };
40
+
41
+ /** Wrap a structured result as both `structuredContent` and a text block. */
42
+ function toolResult(data: Record<string, unknown>) {
43
+ return {
44
+ structuredContent: data,
45
+ content: [{ type: "text" as const, text: JSON.stringify(data) }],
46
+ };
47
+ }
48
+
49
+ function buildMcpServer(): McpServer {
50
+ const server = new McpServer({
51
+ name: "todo-mcp",
52
+ version: "0.0.0",
53
+ description: "Create, list, toggle, and delete todos.",
54
+ });
55
+
56
+ server.registerTool(
57
+ "todo_list",
58
+ {
59
+ title: "List todos",
60
+ description: "List every todo, in creation order.",
61
+ inputSchema: {},
62
+ outputSchema: { todos: z.array(z.object(todoShape)) },
63
+ },
64
+ async () => toolResult({ todos: [...todos.values()] }),
65
+ );
66
+
67
+ server.registerTool(
68
+ "todo_create",
69
+ {
70
+ title: "Create todo",
71
+ description: "Create a new todo item.",
72
+ inputSchema: { title: z.string().min(1).describe("Todo title.") },
73
+ outputSchema: todoShape,
74
+ },
75
+ async ({ title }) => {
76
+ const todo: Todo = { id: randomUUID(), title, done: false };
77
+ todos.set(todo.id, todo);
78
+ // Spread into a fresh object literal — `toolResult` takes
79
+ // `Record<string, unknown>`, and a named interface like `Todo` isn't
80
+ // structurally assignable to that without an (unwanted) index
81
+ // signature of its own; a fresh literal is.
82
+ return toolResult({ ...todo });
83
+ },
84
+ );
85
+
86
+ server.registerTool(
87
+ "todo_toggle",
88
+ {
89
+ title: "Toggle todo",
90
+ description: "Flip a todo's done state.",
91
+ inputSchema: { id: z.string().describe("Todo id.") },
92
+ outputSchema: todoShape,
93
+ },
94
+ async ({ id }) => {
95
+ const todo = todos.get(id);
96
+ if (!todo) throw new Error(`todo not found: ${id}`);
97
+ todo.done = !todo.done;
98
+ return toolResult({ ...todo }); // fresh literal — see the create() comment above
99
+ },
100
+ );
101
+
102
+ server.registerTool(
103
+ "todo_delete",
104
+ {
105
+ title: "Delete todo",
106
+ description: "Delete a todo by id.",
107
+ inputSchema: { id: z.string().describe("Todo id.") },
108
+ outputSchema: { id: z.string(), deleted: z.boolean() },
109
+ },
110
+ async ({ id }) => {
111
+ const deleted = todos.delete(id);
112
+ return toolResult({ id, deleted });
113
+ },
114
+ );
115
+
116
+ return server;
117
+ }
118
+
119
+ const PORT = Number(process.env.PORT ?? 6782);
120
+
121
+ const httpServer = createServer(async (req: IncomingMessage, res: ServerResponse) => {
122
+ if (req.method === "GET" && req.url === "/health") {
123
+ res.writeHead(200, { "content-type": "application/json" });
124
+ res.end(JSON.stringify({ status: "ok", server: "todo-mcp", version: "0.0.0" }));
125
+ return;
126
+ }
127
+
128
+ if (req.url !== "/mcp") {
129
+ res.writeHead(404, { "content-type": "application/json" }).end(
130
+ JSON.stringify({ error: "not found" }),
131
+ );
132
+ return;
133
+ }
134
+
135
+ // Fresh server + transport per request (stateless mode) — see module doc.
136
+ const mcp = buildMcpServer();
137
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
138
+
139
+ res.on("close", () => {
140
+ transport.close().catch(() => undefined);
141
+ mcp.close().catch(() => undefined);
142
+ });
143
+
144
+ try {
145
+ await mcp.connect(transport);
146
+ await transport.handleRequest(req, res);
147
+ } catch (err) {
148
+ console.error("mcp_handle_failed", err);
149
+ if (!res.headersSent) {
150
+ res.writeHead(500, { "content-type": "application/json" });
151
+ res.end(
152
+ JSON.stringify({
153
+ jsonrpc: "2.0",
154
+ error: { code: -32603, message: "Internal server error" },
155
+ id: null,
156
+ }),
157
+ );
158
+ }
159
+ }
160
+ });
161
+
162
+ httpServer.listen(PORT, () => {
163
+ console.log(`todo-mcp listening on :${PORT}`);
164
+ });
165
+
166
+ function shutdown(signal: string): void {
167
+ console.log(`${signal} received — shutting down`);
168
+ httpServer.close(() => process.exit(0));
169
+ // Force-exit if connections don't drain in time.
170
+ setTimeout(() => process.exit(1), 10_000).unref();
171
+ }
172
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
173
+ process.on("SIGINT", () => shutdown("SIGINT"));
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2023",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "strict": true,
7
+ "esModuleInterop": true,
8
+ "skipLibCheck": true,
9
+ "outDir": "dist",
10
+ "rootDir": "src",
11
+ "resolveJsonModule": true
12
+ },
13
+ "include": ["src/**/*"],
14
+ "exclude": ["node_modules", "dist"]
15
+ }
@@ -0,0 +1,14 @@
1
+ import { defineConfig } from 'tsup';
2
+
3
+ // Self-contained ON PURPOSE — do not delete this file. Without a local
4
+ // config, tsup's upward config discovery finds the scaffold ROOT
5
+ // tsup.config.ts; its bundled form imports 'tsup' from the scaffold root,
6
+ // which the platform image build deliberately leaves un-installed when the
7
+ // bundled guuey.worker.js skips the root install — every colocated build
8
+ // then dies with ERR_MODULE_NOT_FOUND (guuey#19). A config here stops the
9
+ // walk; `defineConfig` resolves from this package's own devDependencies.
10
+ export default defineConfig({
11
+ entry: ['src/server.ts'],
12
+ format: 'esm',
13
+ outDir: 'dist',
14
+ });