@guuey/create-agentic-app 0.9.0 → 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.
- package/README.md +22 -2
- package/dist/{chunk-JD4RAKEG.js → chunk-5V2IFXD4.js} +96 -21
- package/dist/cli.cjs +145 -17
- package/dist/cli.js +60 -5
- package/dist/index.cjs +97 -21
- package/dist/index.d.cts +33 -2
- package/dist/index.d.ts +33 -2
- package/dist/index.js +3 -1
- package/dist/templates/{openai-agents-sdk → agentic-app/claude-agent-sdk}/AGENTS.md +2 -2
- package/dist/templates/{openai-agents-sdk → agentic-app/claude-agent-sdk}/README.md +17 -3
- package/dist/templates/agentic-app/claude-agent-sdk/gitignore +5 -0
- package/dist/templates/agentic-app/claude-agent-sdk/guuey.app.json +28 -0
- package/dist/templates/agentic-app/claude-agent-sdk/guuey.app.schema.json +119 -0
- package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/package.json +6 -3
- package/dist/templates/agentic-app/claude-agent-sdk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/web/index.html +0 -1
- package/dist/templates/agentic-app/claude-agent-sdk/web/package.json +28 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/AppShell.tsx +65 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/config.ts +148 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/identity.ts +67 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/status.ts +45 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/widget.ts +96 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/main.tsx +52 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/AgentCanvas.tsx +14 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Dashboard.tsx +36 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Reports.tsx +9 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/TalkOnMobile.tsx +50 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/routes.ts +7 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/styles-app.css +132 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/styles.css +248 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/tsconfig.json +18 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/vite.config.ts +46 -0
- package/dist/templates/{google-adk → agentic-app/google-adk}/AGENTS.md +2 -2
- package/dist/templates/agentic-app/google-adk/gitignore +5 -0
- package/dist/templates/agentic-app/google-adk/guuey.app.json +28 -0
- package/dist/templates/agentic-app/google-adk/guuey.app.schema.json +119 -0
- package/dist/templates/{google-adk → agentic-app/google-adk}/package.json +6 -3
- package/dist/templates/agentic-app/google-adk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/{google-adk → agentic-app/google-adk}/web/index.html +0 -1
- package/dist/templates/agentic-app/google-adk/web/package.json +28 -0
- package/dist/templates/agentic-app/google-adk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/agentic-app/google-adk/web/src/components/AppShell.tsx +65 -0
- package/dist/templates/agentic-app/google-adk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/agentic-app/google-adk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/agentic-app/google-adk/web/src/config.ts +148 -0
- package/dist/templates/agentic-app/google-adk/web/src/lib/identity.ts +67 -0
- package/dist/templates/agentic-app/google-adk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/agentic-app/google-adk/web/src/lib/status.ts +45 -0
- package/dist/templates/agentic-app/google-adk/web/src/lib/widget.ts +96 -0
- package/dist/templates/agentic-app/google-adk/web/src/main.tsx +52 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/AgentCanvas.tsx +14 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/Dashboard.tsx +36 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/Reports.tsx +9 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/TalkOnMobile.tsx +50 -0
- package/dist/templates/agentic-app/google-adk/web/src/routes.ts +7 -0
- package/dist/templates/agentic-app/google-adk/web/src/styles-app.css +132 -0
- package/dist/templates/agentic-app/google-adk/web/src/styles.css +248 -0
- package/dist/templates/agentic-app/google-adk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/agentic-app/google-adk/web/tsconfig.json +18 -0
- package/dist/templates/agentic-app/google-adk/web/vite.config.ts +46 -0
- package/dist/templates/{claude-agent-sdk → agentic-app/openai-agents-sdk}/AGENTS.md +2 -2
- package/dist/templates/{claude-agent-sdk → agentic-app/openai-agents-sdk}/README.md +17 -3
- package/dist/templates/agentic-app/openai-agents-sdk/gitignore +5 -0
- package/dist/templates/agentic-app/openai-agents-sdk/guuey.app.json +28 -0
- package/dist/templates/agentic-app/openai-agents-sdk/guuey.app.schema.json +119 -0
- package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/package.json +6 -3
- package/dist/templates/agentic-app/openai-agents-sdk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/web/index.html +0 -1
- package/dist/templates/agentic-app/openai-agents-sdk/web/package.json +28 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/AppShell.tsx +65 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/config.ts +148 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/identity.ts +67 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/status.ts +45 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/widget.ts +96 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/main.tsx +52 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/AgentCanvas.tsx +14 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Dashboard.tsx +36 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Reports.tsx +9 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/TalkOnMobile.tsx +50 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/routes.ts +7 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/styles-app.css +132 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/styles.css +248 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/tsconfig.json +18 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/vite.config.ts +46 -0
- package/dist/templates/base/claude-agent-sdk/.env.example +4 -0
- package/dist/templates/base/claude-agent-sdk/.mcp.json +1 -0
- package/dist/templates/base/claude-agent-sdk/AGENTS.md +135 -0
- package/dist/templates/base/claude-agent-sdk/README.md +171 -0
- package/dist/templates/base/claude-agent-sdk/ggui/blueprints/.gitkeep +0 -0
- package/dist/templates/base/claude-agent-sdk/ggui/ggui.json +15 -0
- package/dist/templates/base/claude-agent-sdk/ggui/themes/.gitkeep +0 -0
- package/dist/templates/base/claude-agent-sdk/gitignore +5 -0
- package/dist/templates/base/claude-agent-sdk/guuey.app.json +28 -0
- package/dist/templates/base/claude-agent-sdk/guuey.app.schema.json +119 -0
- package/dist/templates/base/claude-agent-sdk/guuey.json +14 -0
- package/dist/templates/base/claude-agent-sdk/mcps/todo/Dockerfile +46 -0
- package/dist/templates/base/claude-agent-sdk/mcps/todo/package.json +22 -0
- package/dist/templates/base/claude-agent-sdk/mcps/todo/src/server.ts +173 -0
- package/dist/templates/base/claude-agent-sdk/mcps/todo/tsconfig.json +15 -0
- package/dist/templates/base/claude-agent-sdk/mcps/todo/tsup.config.ts +14 -0
- package/dist/templates/base/claude-agent-sdk/package.json +30 -0
- package/dist/templates/base/claude-agent-sdk/pnpm-workspace.yaml +24 -0
- package/dist/templates/base/claude-agent-sdk/prompts/system.md +4 -0
- package/dist/templates/base/claude-agent-sdk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/base/claude-agent-sdk/scripts/dev.mjs +45 -0
- package/dist/templates/base/claude-agent-sdk/src/agent-config.ts +77 -0
- package/dist/templates/base/claude-agent-sdk/src/worker.ts +89 -0
- package/dist/templates/base/claude-agent-sdk/tsconfig.json +15 -0
- package/dist/templates/base/claude-agent-sdk/tsup.config.ts +9 -0
- package/dist/templates/base/claude-agent-sdk/web/index.html +12 -0
- package/dist/templates/{claude-agent-sdk → base/claude-agent-sdk}/web/package.json +9 -8
- package/dist/templates/base/claude-agent-sdk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/base/claude-agent-sdk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/base/claude-agent-sdk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/base/claude-agent-sdk/web/src/config.ts +148 -0
- package/dist/templates/base/claude-agent-sdk/web/src/lib/identity.ts +67 -0
- package/dist/templates/base/claude-agent-sdk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/base/claude-agent-sdk/web/src/lib/status.ts +45 -0
- package/dist/templates/base/claude-agent-sdk/web/src/lib/widget.ts +96 -0
- package/dist/templates/base/claude-agent-sdk/web/src/main.tsx +38 -0
- package/dist/templates/base/claude-agent-sdk/web/src/pages/Chat.tsx +15 -0
- package/dist/templates/base/claude-agent-sdk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/base/claude-agent-sdk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/base/claude-agent-sdk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/base/claude-agent-sdk/web/src/routes.ts +7 -0
- package/dist/templates/base/claude-agent-sdk/web/src/styles.css +248 -0
- package/dist/templates/base/claude-agent-sdk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/base/claude-agent-sdk/web/tsconfig.json +18 -0
- package/dist/templates/base/claude-agent-sdk/web/vite.config.ts +46 -0
- package/dist/templates/base/google-adk/.env.example +4 -0
- package/dist/templates/base/google-adk/.mcp.json +1 -0
- package/dist/templates/base/google-adk/AGENTS.md +135 -0
- package/dist/templates/base/google-adk/README.md +90 -0
- package/dist/templates/base/google-adk/ggui/blueprints/.gitkeep +0 -0
- package/dist/templates/base/google-adk/ggui/ggui.json +15 -0
- package/dist/templates/base/google-adk/ggui/themes/.gitkeep +0 -0
- package/dist/templates/base/google-adk/gitignore +5 -0
- package/dist/templates/base/google-adk/guuey.app.json +28 -0
- package/dist/templates/base/google-adk/guuey.app.schema.json +119 -0
- package/dist/templates/base/google-adk/guuey.json +15 -0
- package/dist/templates/base/google-adk/mcps/todo/Dockerfile +46 -0
- package/dist/templates/base/google-adk/mcps/todo/package.json +22 -0
- package/dist/templates/base/google-adk/mcps/todo/src/server.ts +173 -0
- package/dist/templates/base/google-adk/mcps/todo/tsconfig.json +15 -0
- package/dist/templates/base/google-adk/mcps/todo/tsup.config.ts +14 -0
- package/dist/templates/base/google-adk/package.json +30 -0
- package/dist/templates/base/google-adk/pnpm-workspace.yaml +34 -0
- package/dist/templates/base/google-adk/prompts/system.md +4 -0
- package/dist/templates/base/google-adk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/base/google-adk/scripts/dev.mjs +45 -0
- package/dist/templates/base/google-adk/src/agent.ts +43 -0
- package/dist/templates/base/google-adk/tsconfig.json +15 -0
- package/dist/templates/base/google-adk/tsup.config.ts +13 -0
- package/dist/templates/base/google-adk/web/index.html +12 -0
- package/dist/templates/{google-adk → base/google-adk}/web/package.json +9 -8
- package/dist/templates/base/google-adk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/base/google-adk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/base/google-adk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/base/google-adk/web/src/config.ts +148 -0
- package/dist/templates/base/google-adk/web/src/lib/identity.ts +67 -0
- package/dist/templates/base/google-adk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/base/google-adk/web/src/lib/status.ts +45 -0
- package/dist/templates/base/google-adk/web/src/lib/widget.ts +96 -0
- package/dist/templates/base/google-adk/web/src/main.tsx +38 -0
- package/dist/templates/base/google-adk/web/src/pages/Chat.tsx +15 -0
- package/dist/templates/base/google-adk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/base/google-adk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/base/google-adk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/base/google-adk/web/src/routes.ts +7 -0
- package/dist/templates/base/google-adk/web/src/styles.css +248 -0
- package/dist/templates/base/google-adk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/base/google-adk/web/tsconfig.json +18 -0
- package/dist/templates/base/google-adk/web/vite.config.ts +46 -0
- package/dist/templates/base/openai-agents-sdk/.env.example +4 -0
- package/dist/templates/base/openai-agents-sdk/.mcp.json +1 -0
- package/dist/templates/base/openai-agents-sdk/AGENTS.md +135 -0
- package/dist/templates/base/openai-agents-sdk/README.md +171 -0
- package/dist/templates/base/openai-agents-sdk/ggui/blueprints/.gitkeep +0 -0
- package/dist/templates/base/openai-agents-sdk/ggui/ggui.json +15 -0
- package/dist/templates/base/openai-agents-sdk/ggui/themes/.gitkeep +0 -0
- package/dist/templates/base/openai-agents-sdk/gitignore +5 -0
- package/dist/templates/base/openai-agents-sdk/guuey.app.json +28 -0
- package/dist/templates/base/openai-agents-sdk/guuey.app.schema.json +119 -0
- package/dist/templates/base/openai-agents-sdk/guuey.json +27 -0
- package/dist/templates/base/openai-agents-sdk/mcps/todo/Dockerfile +46 -0
- package/dist/templates/base/openai-agents-sdk/mcps/todo/package.json +22 -0
- package/dist/templates/base/openai-agents-sdk/mcps/todo/src/server.ts +173 -0
- package/dist/templates/base/openai-agents-sdk/mcps/todo/tsconfig.json +15 -0
- package/dist/templates/base/openai-agents-sdk/mcps/todo/tsup.config.ts +14 -0
- package/dist/templates/base/openai-agents-sdk/package.json +30 -0
- package/dist/templates/base/openai-agents-sdk/pnpm-workspace.yaml +24 -0
- package/dist/templates/base/openai-agents-sdk/prompts/system.md +4 -0
- package/dist/templates/base/openai-agents-sdk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/base/openai-agents-sdk/scripts/dev.mjs +45 -0
- package/dist/templates/base/openai-agents-sdk/src/agent-config.ts +77 -0
- package/dist/templates/base/openai-agents-sdk/src/worker.ts +75 -0
- package/dist/templates/base/openai-agents-sdk/tsconfig.json +15 -0
- package/dist/templates/base/openai-agents-sdk/tsup.config.ts +16 -0
- package/dist/templates/base/openai-agents-sdk/web/index.html +12 -0
- package/dist/templates/{openai-agents-sdk → base/openai-agents-sdk}/web/package.json +9 -8
- package/dist/templates/base/openai-agents-sdk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/base/openai-agents-sdk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/base/openai-agents-sdk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/base/openai-agents-sdk/web/src/config.ts +148 -0
- package/dist/templates/base/openai-agents-sdk/web/src/lib/identity.ts +67 -0
- package/dist/templates/base/openai-agents-sdk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/base/openai-agents-sdk/web/src/lib/status.ts +45 -0
- package/dist/templates/base/openai-agents-sdk/web/src/lib/widget.ts +96 -0
- package/dist/templates/base/openai-agents-sdk/web/src/main.tsx +38 -0
- package/dist/templates/base/openai-agents-sdk/web/src/pages/Chat.tsx +15 -0
- package/dist/templates/base/openai-agents-sdk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/base/openai-agents-sdk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/base/openai-agents-sdk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/base/openai-agents-sdk/web/src/routes.ts +7 -0
- package/dist/templates/base/openai-agents-sdk/web/src/styles.css +248 -0
- package/dist/templates/base/openai-agents-sdk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/base/openai-agents-sdk/web/tsconfig.json +18 -0
- package/dist/templates/base/openai-agents-sdk/web/vite.config.ts +46 -0
- package/package.json +6 -3
- package/dist/templates/claude-agent-sdk/web/.env.example +0 -17
- package/dist/templates/claude-agent-sdk/web/sandbox-proxy.ts +0 -239
- package/dist/templates/claude-agent-sdk/web/src/App.tsx +0 -272
- package/dist/templates/claude-agent-sdk/web/src/main.tsx +0 -12
- package/dist/templates/claude-agent-sdk/web/src/useAgentChat.ts +0 -122
- package/dist/templates/claude-agent-sdk/web/src/vite-env.d.ts +0 -27
- package/dist/templates/claude-agent-sdk/web/tsconfig.json +0 -20
- package/dist/templates/claude-agent-sdk/web/vite.config.ts +0 -12
- package/dist/templates/google-adk/web/.env.example +0 -17
- package/dist/templates/google-adk/web/sandbox-proxy.ts +0 -239
- package/dist/templates/google-adk/web/src/App.tsx +0 -272
- package/dist/templates/google-adk/web/src/main.tsx +0 -12
- package/dist/templates/google-adk/web/src/useAgentChat.ts +0 -122
- package/dist/templates/google-adk/web/src/vite-env.d.ts +0 -27
- package/dist/templates/google-adk/web/tsconfig.json +0 -20
- package/dist/templates/google-adk/web/vite.config.ts +0 -12
- package/dist/templates/openai-agents-sdk/web/.env.example +0 -17
- package/dist/templates/openai-agents-sdk/web/sandbox-proxy.ts +0 -239
- package/dist/templates/openai-agents-sdk/web/src/App.tsx +0 -272
- package/dist/templates/openai-agents-sdk/web/src/main.tsx +0 -12
- package/dist/templates/openai-agents-sdk/web/src/useAgentChat.ts +0 -122
- package/dist/templates/openai-agents-sdk/web/src/vite-env.d.ts +0 -27
- package/dist/templates/openai-agents-sdk/web/tsconfig.json +0 -20
- package/dist/templates/openai-agents-sdk/web/vite.config.ts +0 -12
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/.env.example +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/.mcp.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/blueprints/.gitkeep +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/ggui.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/themes/.gitkeep +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/guuey.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/Dockerfile +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/package.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/src/server.ts +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/tsconfig.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/tsup.config.ts +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/pnpm-workspace.yaml +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/prompts/system.md +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/scripts/dev.mjs +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/src/agent-config.ts +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/src/worker.ts +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/tsconfig.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/tsup.config.ts +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/.env.example +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/.mcp.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/README.md +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/blueprints/.gitkeep +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/ggui.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/themes/.gitkeep +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/guuey.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/Dockerfile +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/package.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/src/server.ts +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/tsconfig.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/tsup.config.ts +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/pnpm-workspace.yaml +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/prompts/system.md +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/scripts/dev.mjs +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/src/agent.ts +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/tsconfig.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/tsup.config.ts +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/.env.example +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/.mcp.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/blueprints/.gitkeep +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/ggui.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/themes/.gitkeep +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/guuey.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/Dockerfile +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/package.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/src/server.ts +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/tsconfig.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/tsup.config.ts +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/pnpm-workspace.yaml +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/prompts/system.md +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/scripts/dev.mjs +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/src/agent-config.ts +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/src/worker.ts +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/tsconfig.json +0 -0
- /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
|
|
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] [--
|
|
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
|
|
60
|
+
async function listDirs(root) {
|
|
61
61
|
try {
|
|
62
|
-
const entries = await fs2.readdir(
|
|
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
|
|
73
|
-
|
|
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
|
|
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
|
|
158
|
-
import { join as
|
|
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 =
|
|
162
|
-
var defaultTemplatesDir2 =
|
|
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
|
|
168
|
-
const entries = await
|
|
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 =
|
|
172
|
-
const destPath =
|
|
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
|
|
250
|
+
const buf = await fs4.readFile(srcPath);
|
|
177
251
|
if (isProbablyText(buf)) {
|
|
178
|
-
await
|
|
252
|
+
await fs4.writeFile(destPath, renameMcpTokens(buf.toString("utf8"), name, scope), "utf8");
|
|
179
253
|
} else {
|
|
180
|
-
await
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
68
|
+
async function listDirs(root) {
|
|
69
69
|
try {
|
|
70
|
-
const entries = await import_node_fs2.promises.readdir(
|
|
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
|
|
81
|
-
|
|
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
|
|
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-
|
|
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,
|
|
170
|
-
var packageRoot2 = (0,
|
|
171
|
-
var defaultTemplatesDir2 = (0,
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|