@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
package/README.md CHANGED
@@ -7,9 +7,11 @@ MCP servers, and generative UI, in one workspace.
7
7
  npx @guuey/create-agentic-app my-agent
8
8
  cd my-agent
9
9
  pnpm install
10
- pnpm dev # local: your agent + your MCP servers, hot reload
10
+ pnpm bootstrap # brand, theme, copy → guuey.app.json + AGENTS.md (local, no account)
11
+ pnpm dev # local: your agent + MCP servers + the web app, hot reload
11
12
  guuey login
12
13
  guuey deploy # hosted: agent + MCP servers live on guuey
14
+ pnpm bootstrap -- --link # bind the deployed app into the frontend
13
15
  ```
14
16
 
15
17
  ## What you get
@@ -27,9 +29,27 @@ guuey deploy # hosted: agent + MCP servers live on guuey
27
29
  ## Options
28
30
 
29
31
  ```
30
- npx @guuey/create-agentic-app <dir> [--framework claude-agent-sdk|openai-agents-sdk] [--skip-install]
32
+ npx @guuey/create-agentic-app <dir> [--template base|agentic-app] [--framework claude-agent-sdk|openai-agents-sdk|google-adk] [--install]
31
33
  ```
32
34
 
35
+ - `--template base` (default) — a three-page app: landing (with the guuey
36
+ widget), login (guest + BYO-OIDC seam), home (live status + the
37
+ three-ways distribution guide), plus an embedded-chat page on
38
+ [`@guuey/chat`](https://www.npmjs.com/package/@guuey/chat).
39
+ - `--template agentic-app` — everything in base, plus a split-sidebar
40
+ product shell: upper sidebar = your menus, lower sidebar = the agent
41
+ dock; activating the dock swaps the main canvas to a fullscreen agent
42
+ (generative-UI cards get the whole width), and "Talk on mobile" shows a
43
+ QR to the same agent in the guuey portal.
44
+ - `--install` — run `pnpm install` after scaffolding (off by default).
45
+ - `--example <vertical>` — instead of a blank template, extract one of the
46
+ open-source demo apps from
47
+ [`withguuey/demos`](https://github.com/withguuey/demos) (e.g.
48
+ `--example trimly`) — the exact app behind the live demo, already wired
49
+ end to end. Re-brand it with `pnpm bootstrap` (which also turns the demo
50
+ chrome off). Mutually exclusive with `--template`/`--framework`. Manual
51
+ alternative: `npx degit withguuey/demos/<vertical>`.
52
+
33
53
  ## Binding to an existing app
34
54
 
35
55
  `guuey deploy` (above) creates a new app on first run. To bind this
@@ -57,27 +57,33 @@ var execFileAsync = promisify(execFile);
57
57
  var here = dirname(fileURLToPath(import.meta.url));
58
58
  var packageRoot = join(here, "..");
59
59
  var defaultTemplatesDir = join(packageRoot, "dist", "templates");
60
- async function listAvailableFrameworks(templatesDir) {
60
+ async function listDirs(root) {
61
61
  try {
62
- const entries = await fs2.readdir(templatesDir, { withFileTypes: true });
62
+ const entries = await fs2.readdir(root, { withFileTypes: true });
63
63
  return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
64
64
  } catch (err) {
65
65
  if (isErrnoException(err) && err.code === "ENOENT") return [];
66
66
  throw err;
67
67
  }
68
68
  }
69
- async function resolveTemplateDir(templatesDir, framework) {
70
- const dir = join(templatesDir, framework);
69
+ async function resolveTemplateDir(templatesDir, template, framework) {
70
+ const dir = join(templatesDir, template, framework);
71
71
  if (await pathExists(dir)) return dir;
72
- const available = await listAvailableFrameworks(templatesDir);
73
- const list = available.length > 0 ? available.join(", ") : `(none found under ${templatesDir})`;
72
+ const templates = (await listDirs(templatesDir)).filter((name) => name !== "mcp-base");
73
+ if (!templates.includes(template)) {
74
+ const list2 = templates.length > 0 ? templates.join(", ") : `(none found under ${templatesDir})`;
75
+ throw new Error(`No template "${template}". Available templates: ${list2}`);
76
+ }
77
+ const frameworks = await listDirs(join(templatesDir, template));
78
+ const list = frameworks.length > 0 ? frameworks.join(", ") : `(none found under ${join(templatesDir, template)})`;
74
79
  throw new Error(`No template for framework "${framework}". Available frameworks: ${list}`);
75
80
  }
76
81
  async function copyTree(src, dest, name, scope) {
77
82
  await fs2.mkdir(dest, { recursive: true });
78
83
  const entries = await fs2.readdir(src, { withFileTypes: true });
79
84
  for (const entry of entries) {
80
- const destName = renameContent(entry.name, name, scope);
85
+ const rawName = entry.name === "gitignore" ? ".gitignore" : entry.name;
86
+ const destName = renameContent(rawName, name, scope);
81
87
  const srcPath = join(src, entry.name);
82
88
  const destPath = join(dest, destName);
83
89
  if (entry.isDirectory()) {
@@ -139,7 +145,7 @@ async function scaffold(opts) {
139
145
  assertNpmSafeName(opts.name, "project");
140
146
  const scope = opts.scope ?? opts.name;
141
147
  const templatesDir = opts.templatesDir ?? defaultTemplatesDir;
142
- const templateDir = await resolveTemplateDir(templatesDir, opts.framework);
148
+ const templateDir = await resolveTemplateDir(templatesDir, opts.template ?? "base", opts.framework);
143
149
  const projectDir = resolve(opts.targetDir);
144
150
  await ensureTargetDir(projectDir, opts.force);
145
151
  await copyTree(templateDir, projectDir, opts.name, scope);
@@ -153,31 +159,99 @@ async function scaffold(opts) {
153
159
  return { projectDir };
154
160
  }
155
161
 
162
+ // src/scaffold-example.ts
163
+ import { promises as fs3, createWriteStream } from "fs";
164
+ import { join as join2, resolve as resolve2 } from "path";
165
+ import { pipeline } from "stream/promises";
166
+ import { Readable } from "stream";
167
+ import { tmpdir } from "os";
168
+ import { x, t } from "tar";
169
+ var EXAMPLES_REPO = "withguuey/demos";
170
+ var EXAMPLES_REF = "main";
171
+ var TARBALL_URL = `https://codeload.github.com/${EXAMPLES_REPO}/tar.gz/${EXAMPLES_REF}`;
172
+ async function defaultFetchTarball() {
173
+ const res = await fetch(TARBALL_URL);
174
+ if (!res.ok) {
175
+ throw new Error(
176
+ `Could not download ${EXAMPLES_REPO} (${res.status} from codeload.github.com). Check your network; the manual alternative is: npx degit ${EXAMPLES_REPO}/<example>`
177
+ );
178
+ }
179
+ return Readable.from(Buffer.from(await res.arrayBuffer()));
180
+ }
181
+ async function saveTarball(fetchTarball) {
182
+ const file = join2(await fs3.mkdtemp(join2(tmpdir(), "guuey-example-")), "demos.tar.gz");
183
+ await pipeline(await fetchTarball(), createWriteStream(file));
184
+ return file;
185
+ }
186
+ async function listTarball(file) {
187
+ let root = null;
188
+ const examples = /* @__PURE__ */ new Set();
189
+ await t({
190
+ file,
191
+ onReadEntry: (entry) => {
192
+ const segments = entry.path.split("/").filter(Boolean);
193
+ const first = segments[0];
194
+ if (first === void 0) return;
195
+ root ??= first;
196
+ const second = segments[1];
197
+ if (second !== void 0 && segments[2] === "guuey.json") examples.add(second);
198
+ }
199
+ });
200
+ if (root === null) throw new Error(`The ${EXAMPLES_REPO} tarball was empty.`);
201
+ return { root, examples: [...examples].sort() };
202
+ }
203
+ async function scaffoldExample(opts) {
204
+ const tarball = await saveTarball(opts.fetchTarball ?? defaultFetchTarball);
205
+ const { root, examples } = await listTarball(tarball);
206
+ if (!examples.includes(opts.example)) {
207
+ const list = examples.length > 0 ? examples.join(", ") : "(none published yet)";
208
+ throw new Error(`No example "${opts.example}" in ${EXAMPLES_REPO}. Available: ${list}`);
209
+ }
210
+ const projectDir = resolve2(opts.targetDir);
211
+ await ensureTargetDir(projectDir, opts.force);
212
+ const prefix = `${root}/${opts.example}/`;
213
+ await x({
214
+ file: tarball,
215
+ cwd: projectDir,
216
+ strip: 2,
217
+ filter: (path) => path.startsWith(prefix)
218
+ });
219
+ if (!await pathExists(join2(projectDir, "guuey.json"))) {
220
+ throw new Error(
221
+ `Extraction produced no guuey.json in ${projectDir} \u2014 the "${opts.example}" example looks malformed; please report this.`
222
+ );
223
+ }
224
+ await seedEnvLocal(projectDir);
225
+ if (opts.git !== false) await initGit(projectDir);
226
+ if (opts.install) await runInstall(projectDir);
227
+ return { projectDir };
228
+ }
229
+
156
230
  // src/scaffold-mcp.ts
157
- import { promises as fs3 } from "fs";
158
- import { join as join2, dirname as dirname2, resolve as resolve2 } from "path";
231
+ import { promises as fs4 } from "fs";
232
+ import { join as join3, dirname as dirname2, resolve as resolve3 } from "path";
159
233
  import { fileURLToPath as fileURLToPath2 } from "url";
160
234
  var here2 = dirname2(fileURLToPath2(import.meta.url));
161
- var packageRoot2 = join2(here2, "..");
162
- var defaultTemplatesDir2 = join2(packageRoot2, "dist", "templates");
235
+ var packageRoot2 = join3(here2, "..");
236
+ var defaultTemplatesDir2 = join3(packageRoot2, "dist", "templates");
163
237
  function renameMcpTokens(content, name, scope) {
164
238
  return renameContent(content.replaceAll("NAME_PLACEHOLDER", name), scope, scope);
165
239
  }
166
240
  async function copyMcpTree(src, dest, name, scope) {
167
- await fs3.mkdir(dest, { recursive: true });
168
- const entries = await fs3.readdir(src, { withFileTypes: true });
241
+ await fs4.mkdir(dest, { recursive: true });
242
+ const entries = await fs4.readdir(src, { withFileTypes: true });
169
243
  for (const entry of entries) {
170
244
  const destName = renameMcpTokens(entry.name, name, scope);
171
- const srcPath = join2(src, entry.name);
172
- const destPath = join2(dest, destName);
245
+ const srcPath = join3(src, entry.name);
246
+ const destPath = join3(dest, destName);
173
247
  if (entry.isDirectory()) {
174
248
  await copyMcpTree(srcPath, destPath, name, scope);
175
249
  } else {
176
- const buf = await fs3.readFile(srcPath);
250
+ const buf = await fs4.readFile(srcPath);
177
251
  if (isProbablyText(buf)) {
178
- await fs3.writeFile(destPath, renameMcpTokens(buf.toString("utf8"), name, scope), "utf8");
252
+ await fs4.writeFile(destPath, renameMcpTokens(buf.toString("utf8"), name, scope), "utf8");
179
253
  } else {
180
- await fs3.writeFile(destPath, buf);
254
+ await fs4.writeFile(destPath, buf);
181
255
  }
182
256
  }
183
257
  }
@@ -186,11 +260,11 @@ async function scaffoldMcp(opts) {
186
260
  assertNpmSafeName(opts.name, "MCP");
187
261
  const scope = opts.scope ?? opts.name;
188
262
  const templatesDir = opts.templatesDir ?? defaultTemplatesDir2;
189
- const templateDir = join2(templatesDir, "mcp-base");
263
+ const templateDir = join3(templatesDir, "mcp-base");
190
264
  if (!await pathExists(templateDir)) {
191
265
  throw new Error(`No mcp-base template found at ${templateDir}.`);
192
266
  }
193
- const mcpDir = resolve2(opts.targetDir);
267
+ const mcpDir = resolve3(opts.targetDir);
194
268
  await ensureTargetDir(mcpDir, void 0);
195
269
  await copyMcpTree(templateDir, mcpDir, opts.name, scope);
196
270
  return { mcpDir };
@@ -199,5 +273,6 @@ async function scaffoldMcp(opts) {
199
273
  export {
200
274
  isNpmSafeName,
201
275
  scaffold,
276
+ scaffoldExample,
202
277
  scaffoldMcp
203
278
  };
package/dist/cli.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  // src/cli.ts
5
- var import_promises = require("readline/promises");
5
+ var import_promises2 = require("readline/promises");
6
6
  var import_node_process = require("process");
7
7
 
8
8
  // src/scaffold.ts
@@ -65,27 +65,33 @@ var execFileAsync = (0, import_node_util.promisify)(import_node_child_process.ex
65
65
  var here = (0, import_node_path.dirname)((0, import_node_url.fileURLToPath)(import_meta.url));
66
66
  var packageRoot = (0, import_node_path.join)(here, "..");
67
67
  var defaultTemplatesDir = (0, import_node_path.join)(packageRoot, "dist", "templates");
68
- async function listAvailableFrameworks(templatesDir) {
68
+ async function listDirs(root) {
69
69
  try {
70
- const entries = await import_node_fs2.promises.readdir(templatesDir, { withFileTypes: true });
70
+ const entries = await import_node_fs2.promises.readdir(root, { withFileTypes: true });
71
71
  return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
72
72
  } catch (err) {
73
73
  if (isErrnoException(err) && err.code === "ENOENT") return [];
74
74
  throw err;
75
75
  }
76
76
  }
77
- async function resolveTemplateDir(templatesDir, framework) {
78
- const dir = (0, import_node_path.join)(templatesDir, framework);
77
+ async function resolveTemplateDir(templatesDir, template, framework) {
78
+ const dir = (0, import_node_path.join)(templatesDir, template, framework);
79
79
  if (await pathExists(dir)) return dir;
80
- const available = await listAvailableFrameworks(templatesDir);
81
- const list = available.length > 0 ? available.join(", ") : `(none found under ${templatesDir})`;
80
+ const templates = (await listDirs(templatesDir)).filter((name) => name !== "mcp-base");
81
+ if (!templates.includes(template)) {
82
+ const list2 = templates.length > 0 ? templates.join(", ") : `(none found under ${templatesDir})`;
83
+ throw new Error(`No template "${template}". Available templates: ${list2}`);
84
+ }
85
+ const frameworks = await listDirs((0, import_node_path.join)(templatesDir, template));
86
+ const list = frameworks.length > 0 ? frameworks.join(", ") : `(none found under ${(0, import_node_path.join)(templatesDir, template)})`;
82
87
  throw new Error(`No template for framework "${framework}". Available frameworks: ${list}`);
83
88
  }
84
89
  async function copyTree(src, dest, name, scope) {
85
90
  await import_node_fs2.promises.mkdir(dest, { recursive: true });
86
91
  const entries = await import_node_fs2.promises.readdir(src, { withFileTypes: true });
87
92
  for (const entry of entries) {
88
- const destName = renameContent(entry.name, name, scope);
93
+ const rawName = entry.name === "gitignore" ? ".gitignore" : entry.name;
94
+ const destName = renameContent(rawName, name, scope);
89
95
  const srcPath = (0, import_node_path.join)(src, entry.name);
90
96
  const destPath = (0, import_node_path.join)(dest, destName);
91
97
  if (entry.isDirectory()) {
@@ -147,7 +153,7 @@ async function scaffold(opts) {
147
153
  assertNpmSafeName(opts.name, "project");
148
154
  const scope = opts.scope ?? opts.name;
149
155
  const templatesDir = opts.templatesDir ?? defaultTemplatesDir;
150
- const templateDir = await resolveTemplateDir(templatesDir, opts.framework);
156
+ const templateDir = await resolveTemplateDir(templatesDir, opts.template ?? "base", opts.framework);
151
157
  const projectDir = (0, import_node_path.resolve)(opts.targetDir);
152
158
  await ensureTargetDir(projectDir, opts.force);
153
159
  await copyTree(templateDir, projectDir, opts.name, scope);
@@ -161,20 +167,92 @@ async function scaffold(opts) {
161
167
  return { projectDir };
162
168
  }
163
169
 
164
- // src/scaffold-mcp.ts
170
+ // src/scaffold-example.ts
165
171
  var import_node_fs3 = require("fs");
166
172
  var import_node_path2 = require("path");
173
+ var import_promises = require("stream/promises");
174
+ var import_node_stream = require("stream");
175
+ var import_node_os = require("os");
176
+ var import_tar = require("tar");
177
+ var EXAMPLES_REPO = "withguuey/demos";
178
+ var EXAMPLES_REF = "main";
179
+ var TARBALL_URL = `https://codeload.github.com/${EXAMPLES_REPO}/tar.gz/${EXAMPLES_REF}`;
180
+ async function defaultFetchTarball() {
181
+ const res = await fetch(TARBALL_URL);
182
+ if (!res.ok) {
183
+ throw new Error(
184
+ `Could not download ${EXAMPLES_REPO} (${res.status} from codeload.github.com). Check your network; the manual alternative is: npx degit ${EXAMPLES_REPO}/<example>`
185
+ );
186
+ }
187
+ return import_node_stream.Readable.from(Buffer.from(await res.arrayBuffer()));
188
+ }
189
+ async function saveTarball(fetchTarball) {
190
+ const file = (0, import_node_path2.join)(await import_node_fs3.promises.mkdtemp((0, import_node_path2.join)((0, import_node_os.tmpdir)(), "guuey-example-")), "demos.tar.gz");
191
+ await (0, import_promises.pipeline)(await fetchTarball(), (0, import_node_fs3.createWriteStream)(file));
192
+ return file;
193
+ }
194
+ async function listTarball(file) {
195
+ let root = null;
196
+ const examples = /* @__PURE__ */ new Set();
197
+ await (0, import_tar.t)({
198
+ file,
199
+ onReadEntry: (entry) => {
200
+ const segments = entry.path.split("/").filter(Boolean);
201
+ const first = segments[0];
202
+ if (first === void 0) return;
203
+ root ??= first;
204
+ const second = segments[1];
205
+ if (second !== void 0 && segments[2] === "guuey.json") examples.add(second);
206
+ }
207
+ });
208
+ if (root === null) throw new Error(`The ${EXAMPLES_REPO} tarball was empty.`);
209
+ return { root, examples: [...examples].sort() };
210
+ }
211
+ async function scaffoldExample(opts) {
212
+ const tarball = await saveTarball(opts.fetchTarball ?? defaultFetchTarball);
213
+ const { root, examples } = await listTarball(tarball);
214
+ if (!examples.includes(opts.example)) {
215
+ const list = examples.length > 0 ? examples.join(", ") : "(none published yet)";
216
+ throw new Error(`No example "${opts.example}" in ${EXAMPLES_REPO}. Available: ${list}`);
217
+ }
218
+ const projectDir = (0, import_node_path2.resolve)(opts.targetDir);
219
+ await ensureTargetDir(projectDir, opts.force);
220
+ const prefix = `${root}/${opts.example}/`;
221
+ await (0, import_tar.x)({
222
+ file: tarball,
223
+ cwd: projectDir,
224
+ strip: 2,
225
+ filter: (path) => path.startsWith(prefix)
226
+ });
227
+ if (!await pathExists((0, import_node_path2.join)(projectDir, "guuey.json"))) {
228
+ throw new Error(
229
+ `Extraction produced no guuey.json in ${projectDir} \u2014 the "${opts.example}" example looks malformed; please report this.`
230
+ );
231
+ }
232
+ await seedEnvLocal(projectDir);
233
+ if (opts.git !== false) await initGit(projectDir);
234
+ if (opts.install) await runInstall(projectDir);
235
+ return { projectDir };
236
+ }
237
+
238
+ // src/scaffold-mcp.ts
239
+ var import_node_fs4 = require("fs");
240
+ var import_node_path3 = require("path");
167
241
  var import_node_url2 = require("url");
168
242
  var import_meta2 = {};
169
- var here2 = (0, import_node_path2.dirname)((0, import_node_url2.fileURLToPath)(import_meta2.url));
170
- var packageRoot2 = (0, import_node_path2.join)(here2, "..");
171
- var defaultTemplatesDir2 = (0, import_node_path2.join)(packageRoot2, "dist", "templates");
243
+ var here2 = (0, import_node_path3.dirname)((0, import_node_url2.fileURLToPath)(import_meta2.url));
244
+ var packageRoot2 = (0, import_node_path3.join)(here2, "..");
245
+ var defaultTemplatesDir2 = (0, import_node_path3.join)(packageRoot2, "dist", "templates");
172
246
 
173
247
  // src/cli.ts
174
248
  var FRAMEWORKS = ["claude-agent-sdk", "openai-agents-sdk", "google-adk"];
249
+ var TEMPLATES = ["base", "agentic-app"];
175
250
  function isFramework(value) {
176
251
  return FRAMEWORKS.includes(value);
177
252
  }
253
+ function isTemplate(value) {
254
+ return TEMPLATES.includes(value);
255
+ }
178
256
  function parseArgs(argv) {
179
257
  const positional = [];
180
258
  const flags = {};
@@ -206,8 +284,15 @@ Arguments:
206
284
  Options:
207
285
  --name <name> Project name (default: derived from target)
208
286
  --scope <scope> npm scope for @<scope>/* packages (default: name)
287
+ --template <t> App template: ${TEMPLATES.join(" | ")} (default: base)
288
+ base = landing + login + home + chat;
289
+ agentic-app = base + split-sidebar product shell with
290
+ a fullscreen agent canvas and "talk on mobile" QR
209
291
  --framework <f> Framework: ${FRAMEWORKS.join(" | ")}
210
292
  --agent <f> Alias for --framework
293
+ --example <vertical> Extract a demo app from github.com/withguuey/demos
294
+ instead of a blank template (mutually exclusive with
295
+ --template/--framework; re-brand via pnpm bootstrap)
211
296
  --install Run "pnpm install" after scaffolding
212
297
  --no-git Skip "git init" + initial commit
213
298
  --force Scaffold into a non-empty target directory
@@ -224,8 +309,12 @@ function deriveName(target) {
224
309
  const slug = base.toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+/, "");
225
310
  return slug || "agentic-app";
226
311
  }
227
- async function promptFor(question) {
228
- const rl = (0, import_promises.createInterface)({ input: import_node_process.stdin, output: import_node_process.stdout });
312
+ async function promptFor(question, missingFlagHint) {
313
+ if (import_node_process.stdin.isTTY !== true) {
314
+ console.error(`Non-interactive run: pass ${missingFlagHint} explicitly.`);
315
+ process.exit(1);
316
+ }
317
+ const rl = (0, import_promises2.createInterface)({ input: import_node_process.stdin, output: import_node_process.stdout });
229
318
  try {
230
319
  return (await rl.question(question)).trim();
231
320
  } finally {
@@ -244,17 +333,53 @@ async function main() {
244
333
  }
245
334
  let target = positional[0];
246
335
  if (!target) {
247
- target = await promptFor("Project directory: ");
336
+ target = await promptFor("Project directory: ", "the target directory as the first argument");
248
337
  }
249
338
  if (!target) {
250
339
  console.error("A target directory is required.");
251
340
  process.exit(1);
252
341
  return;
253
342
  }
343
+ if (flags.example !== void 0) {
344
+ if (flags.template !== void 0 || flags.framework !== void 0 || flags.agent !== void 0) {
345
+ console.error("--example is mutually exclusive with --template/--framework (an example is already a complete app).");
346
+ process.exit(1);
347
+ return;
348
+ }
349
+ if (typeof flags.example !== "string") {
350
+ console.error("--example needs a value, e.g. --example trimly");
351
+ process.exit(1);
352
+ return;
353
+ }
354
+ const { projectDir: projectDir2 } = await scaffoldExample({
355
+ targetDir: target,
356
+ example: flags.example,
357
+ install: flags.install === true,
358
+ git: flags["no-git"] !== true,
359
+ force: flags.force === true
360
+ });
361
+ console.log(`
362
+ Extracted the "${flags.example}" example into ${projectDir2}
363
+ `);
364
+ console.log("Next steps:");
365
+ console.log(` cd ${projectDir2}`);
366
+ if (flags.install !== true) console.log(" pnpm install");
367
+ console.log(" pnpm bootstrap # re-brand it as yours (also turns the demo chrome off)");
368
+ console.log(" pnpm dev");
369
+ return;
370
+ }
371
+ const templateFlag = flags.template;
372
+ const templateInput = typeof templateFlag === "string" ? templateFlag : "base";
373
+ if (!isTemplate(templateInput)) {
374
+ console.error(`Unknown template "${templateInput}". Available: ${TEMPLATES.join(", ")}`);
375
+ process.exit(1);
376
+ return;
377
+ }
378
+ const template = templateInput;
254
379
  const frameworkFlag = flags.framework ?? flags.agent;
255
380
  let frameworkInput = typeof frameworkFlag === "string" ? frameworkFlag : void 0;
256
381
  if (!frameworkInput) {
257
- frameworkInput = await promptFor(`Framework (${FRAMEWORKS.join(" | ")}): `);
382
+ frameworkInput = await promptFor(`Framework (${FRAMEWORKS.join(" | ")}): `, "--framework <f>");
258
383
  }
259
384
  if (!isFramework(frameworkInput)) {
260
385
  console.error(`Unknown framework "${frameworkInput}". Available: ${FRAMEWORKS.join(", ")}`);
@@ -269,6 +394,7 @@ async function main() {
269
394
  targetDir: target,
270
395
  name,
271
396
  framework,
397
+ template,
272
398
  scope,
273
399
  install,
274
400
  git: flags["no-git"] !== true,
@@ -280,8 +406,10 @@ Scaffolded "${name}" in ${projectDir}
280
406
  console.log("Next steps:");
281
407
  console.log(` cd ${projectDir}`);
282
408
  if (!install) console.log(" pnpm install");
409
+ console.log(" pnpm bootstrap # brand, theme, copy \u2014 the web app is gated on this");
283
410
  console.log(" pnpm dev");
284
411
  console.log(" guuey login && guuey deploy");
412
+ console.log(" pnpm bootstrap -- --link # bind the deployed app into the frontend");
285
413
  }
286
414
  main().catch((err) => {
287
415
  if (err instanceof Error) {
package/dist/cli.js CHANGED
@@ -1,15 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- scaffold
4
- } from "./chunk-JD4RAKEG.js";
3
+ scaffold,
4
+ scaffoldExample
5
+ } from "./chunk-5V2IFXD4.js";
5
6
 
6
7
  // src/cli.ts
7
8
  import { createInterface } from "readline/promises";
8
9
  import { stdin, stdout } from "process";
9
10
  var FRAMEWORKS = ["claude-agent-sdk", "openai-agents-sdk", "google-adk"];
11
+ var TEMPLATES = ["base", "agentic-app"];
10
12
  function isFramework(value) {
11
13
  return FRAMEWORKS.includes(value);
12
14
  }
15
+ function isTemplate(value) {
16
+ return TEMPLATES.includes(value);
17
+ }
13
18
  function parseArgs(argv) {
14
19
  const positional = [];
15
20
  const flags = {};
@@ -41,8 +46,15 @@ Arguments:
41
46
  Options:
42
47
  --name <name> Project name (default: derived from target)
43
48
  --scope <scope> npm scope for @<scope>/* packages (default: name)
49
+ --template <t> App template: ${TEMPLATES.join(" | ")} (default: base)
50
+ base = landing + login + home + chat;
51
+ agentic-app = base + split-sidebar product shell with
52
+ a fullscreen agent canvas and "talk on mobile" QR
44
53
  --framework <f> Framework: ${FRAMEWORKS.join(" | ")}
45
54
  --agent <f> Alias for --framework
55
+ --example <vertical> Extract a demo app from github.com/withguuey/demos
56
+ instead of a blank template (mutually exclusive with
57
+ --template/--framework; re-brand via pnpm bootstrap)
46
58
  --install Run "pnpm install" after scaffolding
47
59
  --no-git Skip "git init" + initial commit
48
60
  --force Scaffold into a non-empty target directory
@@ -59,7 +71,11 @@ function deriveName(target) {
59
71
  const slug = base.toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+/, "");
60
72
  return slug || "agentic-app";
61
73
  }
62
- async function promptFor(question) {
74
+ async function promptFor(question, missingFlagHint) {
75
+ if (stdin.isTTY !== true) {
76
+ console.error(`Non-interactive run: pass ${missingFlagHint} explicitly.`);
77
+ process.exit(1);
78
+ }
63
79
  const rl = createInterface({ input: stdin, output: stdout });
64
80
  try {
65
81
  return (await rl.question(question)).trim();
@@ -79,17 +95,53 @@ async function main() {
79
95
  }
80
96
  let target = positional[0];
81
97
  if (!target) {
82
- target = await promptFor("Project directory: ");
98
+ target = await promptFor("Project directory: ", "the target directory as the first argument");
83
99
  }
84
100
  if (!target) {
85
101
  console.error("A target directory is required.");
86
102
  process.exit(1);
87
103
  return;
88
104
  }
105
+ if (flags.example !== void 0) {
106
+ if (flags.template !== void 0 || flags.framework !== void 0 || flags.agent !== void 0) {
107
+ console.error("--example is mutually exclusive with --template/--framework (an example is already a complete app).");
108
+ process.exit(1);
109
+ return;
110
+ }
111
+ if (typeof flags.example !== "string") {
112
+ console.error("--example needs a value, e.g. --example trimly");
113
+ process.exit(1);
114
+ return;
115
+ }
116
+ const { projectDir: projectDir2 } = await scaffoldExample({
117
+ targetDir: target,
118
+ example: flags.example,
119
+ install: flags.install === true,
120
+ git: flags["no-git"] !== true,
121
+ force: flags.force === true
122
+ });
123
+ console.log(`
124
+ Extracted the "${flags.example}" example into ${projectDir2}
125
+ `);
126
+ console.log("Next steps:");
127
+ console.log(` cd ${projectDir2}`);
128
+ if (flags.install !== true) console.log(" pnpm install");
129
+ console.log(" pnpm bootstrap # re-brand it as yours (also turns the demo chrome off)");
130
+ console.log(" pnpm dev");
131
+ return;
132
+ }
133
+ const templateFlag = flags.template;
134
+ const templateInput = typeof templateFlag === "string" ? templateFlag : "base";
135
+ if (!isTemplate(templateInput)) {
136
+ console.error(`Unknown template "${templateInput}". Available: ${TEMPLATES.join(", ")}`);
137
+ process.exit(1);
138
+ return;
139
+ }
140
+ const template = templateInput;
89
141
  const frameworkFlag = flags.framework ?? flags.agent;
90
142
  let frameworkInput = typeof frameworkFlag === "string" ? frameworkFlag : void 0;
91
143
  if (!frameworkInput) {
92
- frameworkInput = await promptFor(`Framework (${FRAMEWORKS.join(" | ")}): `);
144
+ frameworkInput = await promptFor(`Framework (${FRAMEWORKS.join(" | ")}): `, "--framework <f>");
93
145
  }
94
146
  if (!isFramework(frameworkInput)) {
95
147
  console.error(`Unknown framework "${frameworkInput}". Available: ${FRAMEWORKS.join(", ")}`);
@@ -104,6 +156,7 @@ async function main() {
104
156
  targetDir: target,
105
157
  name,
106
158
  framework,
159
+ template,
107
160
  scope,
108
161
  install,
109
162
  git: flags["no-git"] !== true,
@@ -115,8 +168,10 @@ Scaffolded "${name}" in ${projectDir}
115
168
  console.log("Next steps:");
116
169
  console.log(` cd ${projectDir}`);
117
170
  if (!install) console.log(" pnpm install");
171
+ console.log(" pnpm bootstrap # brand, theme, copy \u2014 the web app is gated on this");
118
172
  console.log(" pnpm dev");
119
173
  console.log(" guuey login && guuey deploy");
174
+ console.log(" pnpm bootstrap -- --link # bind the deployed app into the frontend");
120
175
  }
121
176
  main().catch((err) => {
122
177
  if (err instanceof Error) {