skills/adynato-cloudflare/SKILL.md
Cloudflare Workers and Pages deployment for Adynato projects. Covers wrangler CLI, reading logs for debugging, KV/D1/R2 storage, environment variables, and common errors. Use when deploying to Cloudflare, debugging workers, or configuring edge functions.
npx skillsauth add adynato/skills adynato-cloudflareInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when deploying Adynato projects to Cloudflare Workers or Pages.
npm install -g wrangler
# Or use npx
npx wrangler <command>
# Interactive login (opens browser)
wrangler login
# Check auth status
wrangler whoami
# Use API token (CI/CD)
export CLOUDFLARE_API_TOKEN="your-token"
# Stream logs from production
wrangler tail
# Stream logs from specific environment
wrangler tail --env staging
# Filter by status
wrangler tail --status error
# Filter by search term
wrangler tail --search "user-123"
# Filter by IP
wrangler tail --ip 192.168.1.1
# JSON output for parsing
wrangler tail --format json
GET https://example.com/api/users - Ok @ 1/17/2026, 10:30:00 AM
(log) Processing request for user-123
(error) Database connection failed
// Workers log to wrangler tail
export default {
async fetch(request: Request, env: Env): Promise<Response> {
console.log('Request received:', request.url)
console.log('Headers:', Object.fromEntries(request.headers))
try {
const result = await doSomething()
console.log('Result:', JSON.stringify(result))
return Response.json(result)
} catch (error) {
console.error('Error:', error.message, error.stack)
return Response.json({ error: 'Internal error' }, { status: 500 })
}
}
}
Always log request context first
console.log(`[${request.method}] ${new URL(request.url).pathname}`)
Log before and after async operations
console.log('Fetching from KV...')
const value = await env.MY_KV.get(key)
console.log('KV result:', value ? 'found' : 'not found')
Use structured logging
console.log(JSON.stringify({
type: 'request',
path: url.pathname,
method: request.method,
timestamp: Date.now()
}))
# Deploy to production
wrangler deploy
# Deploy to specific environment
wrangler deploy --env staging
# Dry run (see what would be deployed)
wrangler deploy --dry-run
# Deploy specific script
wrangler deploy src/worker.ts
# Deploy to Pages
wrangler pages deploy ./dist
# Deploy with specific project
wrangler pages deploy ./dist --project-name=my-site
# Deploy to specific branch
wrangler pages deploy ./dist --branch=preview
name = "my-worker"
main = "src/index.ts"
compatibility_date = "2026-01-17"
# Environment variables (non-secret)
[vars]
API_URL = "https://api.example.com"
NODE_ENV = "production"
# KV Namespaces
[[kv_namespaces]]
binding = "MY_KV"
id = "abc123"
# D1 Databases
[[d1_databases]]
binding = "DB"
database_name = "my-database"
database_id = "def456"
# R2 Buckets
[[r2_buckets]]
binding = "BUCKET"
bucket_name = "my-bucket"
# Durable Objects
[[durable_objects.bindings]]
name = "MY_DO"
class_name = "MyDurableObject"
# Staging environment
[env.staging]
name = "my-worker-staging"
vars = { API_URL = "https://staging-api.example.com" }
[[env.staging.kv_namespaces]]
binding = "MY_KV"
id = "staging-kv-id"
# Add secret (interactive)
wrangler secret put MY_SECRET
# Add secret from stdin
echo "secret-value" | wrangler secret put MY_SECRET
# Add to specific environment
wrangler secret put MY_SECRET --env staging
# List secrets
wrangler secret list
# Delete secret
wrangler secret delete MY_SECRET
Error: No account id found, quitting...
Fix: Add account_id to wrangler.toml or login:
wrangler login
# or
wrangler whoami # to verify auth
# wrangler.toml
account_id = "your-account-id"
Error: worker not found
Fix: Check worker name matches wrangler.toml:
# List all workers
wrangler deployments list
# Check wrangler.toml name field
Error: namespace not found
Fix: Create the namespace first:
# Create KV namespace
wrangler kv:namespace create MY_KV
# Use the returned id in wrangler.toml
Error: Script startup exceeded CPU time limit
Fix:
# Check bundle size
wrangler deploy --dry-run --outdir=./dist
ls -la ./dist
Error: Cannot find binding "MY_KV"
Fix: Ensure binding is in wrangler.toml and matches code:
// Code expects env.MY_KV
interface Env {
MY_KV: KVNamespace // Must match wrangler.toml binding
}
# Create namespace
wrangler kv:namespace create MY_KV
# List namespaces
wrangler kv:namespace list
# Put value
wrangler kv:key put --binding=MY_KV "my-key" "my-value"
# Get value
wrangler kv:key get --binding=MY_KV "my-key"
# List keys
wrangler kv:key list --binding=MY_KV
# Delete key
wrangler kv:key delete --binding=MY_KV "my-key"
# Bulk upload
wrangler kv:bulk put --binding=MY_KV data.json
# Create database
wrangler d1 create my-database
# Execute SQL
wrangler d1 execute my-database --command="SELECT * FROM users"
# Execute SQL file
wrangler d1 execute my-database --file=./schema.sql
# Export database
wrangler d1 export my-database --output=backup.sql
# List databases
wrangler d1 list
# Create bucket
wrangler r2 bucket create my-bucket
# List buckets
wrangler r2 bucket list
# Upload file
wrangler r2 object put my-bucket/path/file.txt --file=./local-file.txt
# Download file
wrangler r2 object get my-bucket/path/file.txt
# Delete file
wrangler r2 object delete my-bucket/path/file.txt
# Start local dev server
wrangler dev
# Dev with specific port
wrangler dev --port 8787
# Dev with local mode (no network to Cloudflare)
wrangler dev --local
# Dev with specific environment
wrangler dev --env staging
# Dev with live reload
wrangler dev --live-reload
name: Deploy to Cloudflare
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Deploy Worker
run: npx wrangler deploy
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
| Secret | Description |
|--------|-------------|
| CLOUDFLARE_API_TOKEN | API token with Workers edit permission |
| CLOUDFLARE_ACCOUNT_ID | Optional, can be in wrangler.toml |
When a worker fails:
Check live logs
wrangler tail --status error
Check recent deployments
wrangler deployments list
Rollback if needed
wrangler rollback
Test locally
wrangler dev
Check bindings
wrangler kv:namespace list
wrangler d1 list
wrangler r2 bucket list
Verify secrets
wrangler secret list
tools
Work with Jira, Confluence, and Atlassian Cloud links via Atlassian MCP instead of browser automation. Covers reading `atlassian.net` URLs, preferring MCP over Puppeteer for tickets and pages, summarizing issue state and comments, and falling back only when visual inspection is explicitly needed or MCP is unavailable. Use when a prompt includes Jira tickets, Confluence pages, or Atlassian links.
development
General coding conventions for any repository. Covers writing for the human who owns the code, clear naming, clean structure, comments that explain why, and following existing linting and formatting rules. Use when writing or modifying code in any language, especially for refactors, utilities, tests, and business logic. Prefer this as baseline guidance unless a more specific skill applies.
development
Web development conventions for Adynato projects. Covers image optimization with img4web, asset management, component patterns, styling, and performance best practices. Use when building or modifying web applications, adding images/assets, or creating UI components.
development
Web API development conventions for Adynato projects. Covers API routes, middleware, authentication, error handling, validation, and response formats for Next.js and Node.js backends. Use when building or modifying API endpoints, server actions, or backend logic.