Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Multi-step deployment agent for full-stack apps. Build → Test → GitHub → Cloudflare Pages with human approval at each step.
.claude/skills/sundial-org-deploy-agent/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 72% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 95% | 0% |
Deploy full-stack applications via a multi-step workflow with human approval at each stage.
bash# Install via ClawdHub clawdhub install deploy-agent # Initialize a new deployment deploy-agent init my-app # Check status deploy-agent status my-app # Continue through steps deploy-agent continue my-app
| Step | Command | Description | Requires Approval | |------|---------|-------------|-------------------| | 1 | deploy-agent init <name> | Start deployment | ✅ Design phase | | 2 | deploy-agent build <name> | Build app | ✅ Before testing | | 3 | deploy-agent test <name> | Test locally | ✅ Before GitHub | | 4 | deploy-agent push <name> | Push to GitHub | ✅ Before Cloudflare | | 5 | deploy-agent deploy <name> | Deploy to Cloudflare | ✅ Final |
bashdeploy-agent init my-app
Creates a new deployment state and waits for design input.
bashdeploy-agent status my-app
Shows current step, approvals, and deployment info.
bashdeploy-agent continue my-app
Get guidance on what to do next in the current step.
bashdeploy-agent build my-app
After designing with C.R.A.B, run this to build the app.
bashdeploy-agent test my-app
Verify the app is running locally before pushing.
bashdeploy-agent push my-app [repo-name]
Creates GitHub repo and pushes code. Default repo name = app name.
bashdeploy-agent deploy my-app [custom-domain]
Deploys to Cloudflare Pages. Default domain: {name}.sheraj.org
bashdeploy-agent cancel my-app
Aborts and cleans up the deployment.
bashdeploy-agent list
Shows all active deployments.
bash# Start new deployment $ deploy-agent init my-blog 🚀 Deployment initialized: my-blog Step 1: Design your app with C.R.A.B # ... design phase with C.R.A.B ... $ deploy-agent build my-blog 🚀 Build complete! Step 2: Local Testing Start dev server: cd my-blog && npm run dev # ... test locally ... $ deploy-agent push my-blog 🚀 GitHub repository ready! Say 'deploy-agent deploy my-blog' to deploy to Cloudflare $ deploy-agent deploy my-blog my-blog.sheraj.org 🎉 Deployment complete! App live at: https://my-blog.sheraj.org
State stored in: ~/.clawdbot/skills/deploy-agent/state/{deployment-name}.json
json{ "name": "my-blog", "step": 5, "status": "deployed", "created_at": "2026-01-18T08:00:00Z", "repo_url": "https://github.com/user/my-blog", "domain": "https://my-blog.sheraj.org" }
| Tool | Purpose | |------|---------| | gh | GitHub repo creation and management | | wrangler | Cloudflare Pages deployment | | git | Version control | | jq | JSON parsing (for state management) |
Cloudflare token should be configured in ~/.wrangler.toml:
toml[account] api_token = "your-cloudflare-token"
This section covers common pitfalls and fixes for deploying Next.js apps with D1 on Cloudflare Pages.
| Check | Command | Fix if Failed | |-------|---------|---------------| | Next.js version | npm list next | npm install next@15.5.2 | | Package lock sync | rm -rf node_modules package-lock.json && npm install | Commit lock file | | Cloudflare adapter | npm list @cloudflare/next-on-pages | npm install -D @cloudflare/next-on-pages | | wrangler installed | npm list wrangler | npm install -D wrangler |
1. package.json
json{ "dependencies": { "next": "15.5.2", "react": "^18.3.1", "react-dom": "^18.3.1" }, "devDependencies": { "@cloudflare/next-on-pages": "^1.13.16", "wrangler": "^4.x" } }
2. wrangler.toml
tomlname = "my-app" compatibility_date = "2026-01-18" compatibility_flags = ["nodejs_compat"] [[d1_databases]] binding = "DB" database_name = "my-db" database_id = "your-db-id"
3. API Routes (each file)
typescriptimport { getRequestContext } from '@cloudflare/next-on-pages'; export const runtime = 'edge'; export async function GET() { const { env } = getRequestContext(); const { results } = await env.DB.prepare("SELECT * FROM tasks").all(); return Response.json({ data: results }); }
| Setting | Value | |---------|-------| | Build command | npx @cloudflare/next-on-pages | | Output directory | .vercel/output/static | | Functions | Enable (for D1 API routes) |
| Issue | Error | Fix | |-------|-------|-----| | Lock file mismatch | npm ci can only install packages when your package.json and package-lock.json are in sync | rm -rf node_modules package-lock.json && npm install && git add package-lock.json | | Next.js version | peer next@">=14.3.0 && <=15.5.2" from @cloudflare/next-on-pages | Downgrade to next: "15.5.2" | | API routes not edge | The following routes were not configured to run with the Edge Runtime | Add export const runtime = 'edge'; | | D1 access pattern | Using context.env.DB | Use getRequestContext().env.DB | | Missing types | TypeScript errors for D1 bindings | Create env.d.ts with CloudflareEnv interface |
csshtml { overflow-x: hidden; scrollbar-gutter: stable; } body { overflow-x: hidden; }
DB → Select your databasedocs/issues/nextjs-cloudflare-d1-deployment.mdOther measured skills in the registry, with their headline benchmark lift.