[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FGC7KAP41P2TCV6YRX3TA4":3,"skill-same:01M6FGC7KAP41P2TCV6YRX3TA4":127},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":29,"linkOnly":30,"markdownContent":31,"markdownBody":32,"frontMatter":33,"refName":34,"commitSha":35,"skillDirectory":36,"forksCount":37,"repositoryHtmlUrl":38,"repositoryHomepageUrl":39,"ownerHtmlUrl":40,"ownerBlogUrl":6,"ownerDescription":41,"updatedAt":42,"install":43,"resources":56},"01M6FGC7KAP41P2TCV6YRX3TA4","cloudflare-sandbox",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[26,27,28],"sandbox","cloudflare","cloudflare sandbox","2026-11-10 10:12:30",false,"---\nname: cloudflare-sandbox\ndescription: Cloudflare Sandboxes SDK for secure code execution in Linux containers at edge. Use for untrusted code, Python\u002FNode.js scripts, AI code interpreters, git operations.\n\n  Keywords: cloudflare sandbox, container execution, code execution, isolated environment, durable objects, linux container, python execution, node execution, git operations, code interpreter, AI agents, session management, ephemeral container, workspace, sandbox SDK, @cloudflare\u002Fsandbox, exec(), getSandbox(), runCode(), gitCheckout(), ubuntu container\nlicense: MIT\n---\n\n# Cloudflare Sandboxes SDK\n\n**Status**: Production Ready (Open Beta)\n**Last Updated**: 2025-12-10\n**Dependencies**: `cloudflare-worker-base`, `cloudflare-durable-objects` (recommended for understanding)\n**Latest Versions**: `@cloudflare\u002Fsandbox@0.6.3`, Docker image: `cloudflare\u002Fsandbox:0.6.3-python`\n\n**⚠️ BREAKING CHANGE (v0.6.0):** Python is no longer included in the default image. Use `cloudflare\u002Fsandbox:\u003Cversion>-python` for Python support (~1.3GB with data science packages). The lean variant (~600-800MB) excludes Python.\n\n---\n\n## Quick Start (15 Minutes)\n\n### 1. Install SDK and Setup Wrangler\n\n```bash\nbun add @cloudflare\u002Fsandbox@latest  # preferred\n# or: bun add @cloudflare\u002Fsandbox@latest\n```\n\n**wrangler.jsonc:**\n```jsonc\n{\n  \"name\": \"my-sandbox-worker\",\n  \"main\": \"src\u002Findex.ts\",\n  \"compatibility_flags\": [\"nodejs_compat\"],\n  \"containers\": [{\n    \"class_name\": \"Sandbox\",\n    \"image\": \"cloudflare\u002Fsandbox:0.6.3-python\",\n    \"instance_type\": \"lite\"\n  }],\n  \"durable_objects\": {\n    \"bindings\": [{\n      \"class_name\": \"Sandbox\",\n      \"name\": \"Sandbox\"\n    }]\n  },\n  \"migrations\": [{\n    \"tag\": \"v1\",\n    \"new_sqlite_classes\": [\"Sandbox\"]\n  }]\n}\n```\n\n**Why this matters:**\n- `nodejs_compat` enables Node.js APIs required by SDK\n- `containers` defines the Ubuntu container image\n- `durable_objects` binding enables persistent routing\n- `migrations` registers the Sandbox class\n\n### 2. Create Your First Sandbox Worker\n\n```typescript\nimport { getSandbox, type Sandbox } from '@cloudflare\u002Fsandbox';\nexport { Sandbox } from '@cloudflare\u002Fsandbox';\n\ntype Env = {\n  Sandbox: DurableObjectNamespace\u003CSandbox>;\n};\n\nexport default {\n  async fetch(request: Request, env: Env): Promise\u003CResponse> {\n    \u002F\u002F Get sandbox instance (creates if doesn't exist)\n    const sandbox = getSandbox(env.Sandbox, 'my-first-sandbox');\n\n    \u002F\u002F Execute Python code\n    const result = await sandbox.exec('python3 -c \"print(2 + 2)\"');\n\n    return Response.json({\n      output: result.stdout,\n      success: result.success,\n      exitCode: result.exitCode\n    });\n  }\n};\n```\n\n**CRITICAL:**\n- **MUST export** `{ Sandbox }` from `@cloudflare\u002Fsandbox` in your Worker\n- Sandbox ID determines routing (same ID = same container)\n- First request creates container (~2-3 min cold start)\n- Subsequent requests are fast (\u003C1s)\n\n### 3. Deploy and Test\n\n```bash\nnpm run deploy\ncurl https:\u002F\u002Fyour-worker.workers.dev\n```\n\nExpected output:\n```json\n{\n  \"output\": \"4\\n\",\n  \"success\": true,\n  \"exitCode\": 0\n}\n```\n\n---\n\n## Architecture (Understanding the 3-Layer Model)\n\n### How Sandboxes Work\n\n```\n┌─────────────────────────────────────────┐\n│  Your Worker (Layer 1)                  │\n│  - Handles HTTP requests                │\n│  - Calls getSandbox()                   │\n│  - Uses sandbox.exec(), writeFile(), etc│\n└──────────────┬──────────────────────────┘\n               │ RPC via Durable Object\n┌──────────────▼──────────────────────────┐\n│  Durable Object (Layer 2)               │\n│  - Routes by sandbox ID                 │\n│  - Maintains persistent identity        │\n│  - Geographic stickiness                │\n└──────────────┬──────────────────────────┘\n               │ Container API\n┌──────────────▼──────────────────────────┐\n│  Ubuntu Container (Layer 3)             │\n│  - Full Linux environment               │\n│  - Python 3.11, Node 20, Git, etc.      │\n│  - Filesystem: \u002Fworkspace, \u002Ftmp, \u002Fhome  │\n│  - Process isolation (VM-based)         │\n└─────────────────────────────────────────┘\n```\n\n**Key Insight**: Workers handle API logic (fast), Durable Objects route requests (persistent identity), Containers execute code (full capabilities).\n\n---\n\n## Critical Container Lifecycle (Most Important Section!)\n\n### Container States\n\n```\n┌─────────┐  First request  ┌────────┐  ~10 min idle  ┌──────┐\n│ Not     │ ───────────────>│ Active │ ─────────────> │ Idle │\n│ Created │                 │        │                │      │\n└─────────┘                 └───┬────┘                └──┬───┘\n                                │ ^                      │\n                                │ │ New request          │\n                                │ └──────────────────────┘\n                                │                         │\n                                ▼                         ▼\n                            Files persist          ALL FILES DELETED\n                            Processes run          ALL PROCESSES KILLED\n                            State maintained       ALL STATE RESET\n```\n\n### The #1 Gotcha: Ephemeral by Default\n\n**While Container is Active** (~10 min after last request):\n- ✅ Files in `\u002Fworkspace`, `\u002Ftmp`, `\u002Fhome` persist\n- ✅ Background processes keep running\n- ✅ Shell environment variables remain\n- ✅ Session working directories preserved\n\n**When Container Goes Idle** (after inactivity):\n- ❌ **ALL files deleted** (entire filesystem reset)\n- ❌ **ALL processes terminated**\n- ❌ **ALL shell state lost**\n- ⚠️  Next request creates **fresh container from scratch**\n\n**This is NOT like a traditional server**. Sandboxes are ephemeral by design.\n\n### Handling Persistence\n\n**For Important Data**: Use external storage\n```typescript\n\u002F\u002F Save to R2 before container goes idle\nawait sandbox.writeFile('\u002Fworkspace\u002Fdata.txt', content);\nconst fileData = await sandbox.readFile('\u002Fworkspace\u002Fdata.txt');\nawait env.R2.put('backup\u002Fdata.txt', fileData);\n\n\u002F\u002F Restore on next request\nconst restored = await env.R2.get('backup\u002Fdata.txt');\nif (restored) {\n  await sandbox.writeFile('\u002Fworkspace\u002Fdata.txt', await restored.text());\n}\n```\n\n**For Build Artifacts**: Accept ephemerality or use caching\n```typescript\n\u002F\u002F Check if setup needed (handles cold starts)\nconst exists = await sandbox.readdir('\u002Fworkspace\u002Fproject').catch(() => null);\nif (!exists) {\n  await sandbox.gitCheckout(repoUrl, '\u002Fworkspace\u002Fproject');\n  await sandbox.exec('npm install', { cwd: '\u002Fworkspace\u002Fproject' });\n}\n\u002F\u002F Now safe to run build\nawait sandbox.exec('npm run build', { cwd: '\u002Fworkspace\u002Fproject' });\n```\n\n---\n\n## Session Management (Game-Changer for Chat Agents)\n\n### What Are Sessions?\n\nSessions are **bash shell contexts** within one sandbox. Think terminal tabs.\n\n**Key Properties**:\n- Each session has separate working directory\n- Sessions share same filesystem\n- Working directory persists across commands in same session\n- Perfect for multi-step workflows\n\n### Pattern: Chat-Based Coding Agent\n\n```typescript\ntype ConversationState = {\n  sandboxId: string;\n  sessionId: string;\n};\n\n\u002F\u002F First message: Create sandbox and session\nconst sandboxId = `user-${userId}`;\nconst sandbox = getSandbox(env.Sandbox, sandboxId);\nconst sessionId = await sandbox.createSession();\n\n\u002F\u002F Store in conversation state (database, KV, etc.)\nawait env.KV.put(`conversation:${conversationId}`, JSON.stringify({\n  sandboxId,\n  sessionId\n}));\n\n\u002F\u002F Later messages: Reuse same session\nconst state = await env.KV.get(`conversation:${conversationId}`);\nconst { sandboxId, sessionId } = JSON.parse(state);\nconst sandbox = getSandbox(env.Sandbox, sandboxId);\n\n\u002F\u002F Commands run in same context\nawait sandbox.exec('cd \u002Fworkspace\u002Fproject', { session: sessionId });\nawait sandbox.exec('ls -la', { session: sessionId }); \u002F\u002F Still in \u002Fworkspace\u002Fproject\nawait sandbox.exec('git status', { session: sessionId }); \u002F\u002F Still in \u002Fworkspace\u002Fproject\n```\n\n### Without Sessions (Common Mistake)\n\n```typescript\n\u002F\u002F ❌ WRONG: Each command runs in separate session\nawait sandbox.exec('cd \u002Fworkspace\u002Fproject');\nawait sandbox.exec('ls'); \u002F\u002F NOT in \u002Fworkspace\u002Fproject (different session)\n```\n\n### Pattern: Parallel Execution\n\n```typescript\nconst session1 = await sandbox.createSession();\nconst session2 = await sandbox.createSession();\n\n\u002F\u002F Run different tasks simultaneously\nawait Promise.all([\n  sandbox.exec('python train_model.py', { session: session1 }),\n  sandbox.exec('node generate_reports.js', { session: session2 })\n]);\n```\n\n---\n\n## Sandbox Naming Strategies\n\n### Per-User Sandboxes (Persistent Workspace)\n\n```typescript\nconst sandbox = getSandbox(env.Sandbox, `user-${userId}`);\n```\n\n**Pros**: User's work persists while actively using (10 min idle time)\n**Cons**: Geographic lock-in (first request determines location)\n**Use Cases**: Interactive notebooks, IDEs, persistent workspaces\n\n### Per-Session Sandboxes (Fresh Each Time)\n\n```typescript\nconst sandboxId = `session-${Date.now()}-${crypto.randomUUID()}`;\nconst sandbox = getSandbox(env.Sandbox, sandboxId);\n\u002F\u002F Always destroy after use\nawait sandbox.destroy();\n```\n\n**Pros**: Clean environment, no state pollution\n**Cons**: No persistence between requests\n**Use Cases**: One-shot code execution, CI\u002FCD, testing\n\n### Per-Task Sandboxes (Idempotent & Traceable)\n\n```typescript\nconst sandbox = getSandbox(env.Sandbox, `build-${repoName}-${commitSha}`);\n```\n\n**Pros**: Reproducible, debuggable, cacheable\n**Cons**: Need explicit cleanup strategy\n**Use Cases**: Build systems, data pipelines, automated workflows\n\n---\n\n## Core API Reference\n\nThe Sandbox SDK provides methods for command execution, file operations, Git operations, code interpretation (Jupyter-like), background processes, and cleanup.\n\n**? Load `references\u002Fapi-reference.md`** when you need detailed API method signatures, parameter options, or implementation examples for:\n- Executing commands with options (cwd, timeout, env vars, sessions)\n- File operations (read\u002Fwrite\u002Fmkdir\u002Frm\u002Freaddir)\n- Git operations (gitCheckout, git commands)\n- Code interpreter (createCodeContext, runCode)\n- Background processes (spawn, isProcessRunning, killProcess)\n- Sandbox cleanup (destroy)\n\n---\n\n## Critical Rules\n\n### Always Do\n\n✅ **Check exit codes** - `if (!result.success) { handle error }`\n✅ **Use sessions for multi-step workflows** - Preserve working directory\n✅ **Handle cold starts** - Check if files exist before assuming they're there\n✅ **Set timeouts** - Prevent hanging on long operations\n✅ **Destroy ephemeral sandboxes** - Cleanup temp\u002Fsession-based sandboxes\n✅ **Use external storage for persistence** - R2\u002FKV\u002FD1 for important data\n✅ **Validate user input** - Sanitize before exec() to prevent command injection\n✅ **Export Sandbox class** - `export { Sandbox } from '@cloudflare\u002Fsandbox'`\n\n### Never Do\n\n❌ **Assume files persist after idle** - Container resets after ~10 min\n❌ **Ignore exit codes** - Always check `result.success` or `result.exitCode`\n❌ **Chain commands without sessions** - `cd \u002Fdir` then `ls` won't work\n❌ **Execute unsanitized user input** - Use code interpreter or validate thoroughly\n❌ **Forget nodejs_compat flag** - Required in wrangler.jsonc\n❌ **Skip migrations** - Durable Objects need migration entries\n❌ **Use .workers.dev for preview URLs** - Need custom domain\n❌ **Create unlimited sandboxes** - Destroy ephemeral ones to avoid leaks\n\n---\n\n## Known Issues Prevention\n\nThis skill prevents **10** documented issues:\n\n### Issue #1: Missing nodejs_compat Flag\n**Error**: `ReferenceError: fetch is not defined` or `Buffer is not defined`\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fget-started\u002F\n**Why It Happens**: SDK requires Node.js APIs not available in standard Workers\n**Prevention**: Add `\"compatibility_flags\": [\"nodejs_compat\"]` to wrangler.jsonc\n\n### Issue #2: Missing Migrations\n**Error**: `Error: Class 'Sandbox' not found`\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fdurable-objects\u002F\n**Why It Happens**: Durable Objects must be registered via migrations\n**Prevention**: Include migrations array in wrangler.jsonc\n\n### Issue #3: Assuming File Persistence\n**Error**: Files disappear after inactivity\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fconcepts\u002Fsandboxes\u002F\n**Why It Happens**: Containers go idle after ~10 min, all state reset\n**Prevention**: Use external storage (R2\u002FKV) or check existence on each request\n\n### Issue #4: Session Directory Confusion\n**Error**: Commands execute in wrong directory\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fconcepts\u002Fsessions\u002F\n**Why It Happens**: Each exec() uses new session unless explicitly specified\n**Prevention**: Create session with `createSession()`, pass to all related commands\n\n### Issue #5: Ignoring Exit Codes\n**Error**: Assuming command succeeded when it failed\n**Source**: Shell best practices\n**Why It Happens**: Not checking `result.success` or `result.exitCode`\n**Prevention**: Always check: `if (!result.success) throw new Error(result.stderr)`\n\n### Issue #6: Not Handling Cold Starts\n**Error**: Commands fail because dependencies aren't installed\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fconcepts\u002Fsandboxes\u002F\n**Why It Happens**: Container resets after idle period\n**Prevention**: Check if setup needed before running commands\n\n### Issue #7: Docker Not Running (Local Dev)\n**Error**: `Failed to build container` during local development\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fget-started\u002F\n**Why It Happens**: Local dev requires Docker daemon\n**Prevention**: Ensure Docker Desktop is running before `npm run dev`\n\n### Issue #8: Version Mismatch (Package vs Docker Image)\n**Error**: API methods not available or behaving unexpectedly\n**Source**: GitHub issues\n**Why It Happens**: npm package version doesn't match Docker image version\n**Prevention**: Keep `@cloudflare\u002Fsandbox` package and `cloudflare\u002Fsandbox` image in sync\n\n### Issue #9: Not Cleaning Up Ephemeral Sandboxes\n**Error**: Resource exhaustion, unexpected costs\n**Source**: Resource management best practices\n**Why It Happens**: Creating sandboxes without destroying them\n**Prevention**: `await sandbox.destroy()` in finally block for temp sandboxes\n\n### Issue #10: Command Injection Vulnerability\n**Error**: Security breach from unsanitized user input\n**Source**: Security best practices\n**Why It Happens**: Passing user input directly to `exec()`\n**Prevention**: Use code interpreter API or validate\u002Fsanitize input thoroughly\n\n---\n\n## wrangler.jsonc Example\n\n```jsonc\n{\n  \"name\": \"my-sandbox-app\",\n  \"main\": \"src\u002Findex.ts\",\n  \"compatibility_date\": \"2025-10-29\",\n  \"compatibility_flags\": [\"nodejs_compat\"], \u002F\u002F ← REQUIRED\n\n  \"containers\": [{\n    \"class_name\": \"Sandbox\",\n    \"image\": \"cloudflare\u002Fsandbox:0.6.3-python\", \u002F\u002F ← Use -python for Python support\n    \"instance_type\": \"lite\"\n  }],\n\n  \"durable_objects\": {\n    \"bindings\": [{\"class_name\": \"Sandbox\", \"name\": \"Sandbox\"}]\n  },\n\n  \"migrations\": [{\n    \"tag\": \"v1\",\n    \"new_sqlite_classes\": [\"Sandbox\"]\n  }]\n}\n```\n\n---\n\n## Common Patterns\n\nFour production-ready patterns for building with Cloudflare Sandboxes: one-shot code execution, persistent user workspaces, CI\u002FCD pipelines, and AI agent integration.\n\n**? Load `references\u002Fpatterns.md`** when you need complete implementation examples for:\n1. **One-Shot Code Execution** - API endpoints, code playgrounds, learning platforms\n2. **Persistent User Workspace** - Interactive environments, notebooks, IDEs\n3. **CI\u002FCD Build Pipeline** - Build systems, testing pipelines, deployment automation\n4. **AI Agent with Claude Code** - Automated refactoring, code generation, AI development\n\n---\n\n## Using Bundled Resources\n\n### Scripts (scripts\u002F)\n\n- `setup-sandbox-binding.sh` - Interactive wrangler.jsonc configuration\n- `test-sandbox.ts` - Validation script to test sandbox setup\n\n**Example Usage:**\n```bash\n# Setup wrangler config\n.\u002Fscripts\u002Fsetup-sandbox-binding.sh\n\n# Test sandbox\nbunx tsx scripts\u002Ftest-sandbox.ts\n```\n\n### References (references\u002F)\n\n- `references\u002Fpersistence-guide.md` - Deep dive on container lifecycle and persistence\n- `references\u002Fsession-management.md` - Advanced session patterns and best practices\n- `references\u002Fcommon-errors.md` - Complete list of errors with solutions\n- `references\u002Fnaming-strategies.md` - Choosing sandbox IDs for different use cases\n\n**When Claude should load these**:\n- Load `persistence-guide.md` when debugging state issues or cold starts\n- Load `session-management.md` when building multi-step workflows or chat agents\n- Load `common-errors.md` when encountering specific errors\n- Load `naming-strategies.md` when designing sandbox architecture\n\n---\n\n## Advanced Topics\n\n**? Load `references\u002Fadvanced.md`** for production patterns:\n- Geographic distribution strategies for global apps\n- Error handling wrapper functions\n- Security hardening and input validation\n\n---\n\n## Official Resources\n\n**Package**: `@cloudflare\u002Fsandbox@0.6.3` | **Docker**: `cloudflare\u002Fsandbox:0.6.3-python`\n\n**Docs**: [Cloudflare Sandboxes](https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002F) | [API Reference](https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fapi-reference\u002F) | [GitHub SDK](https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fsandbox-sdk)\n\n","# Cloudflare Sandboxes SDK\n\n**Status**: Production Ready (Open Beta)\n**Last Updated**: 2025-12-10\n**Dependencies**: `cloudflare-worker-base`, `cloudflare-durable-objects` (recommended for understanding)\n**Latest Versions**: `@cloudflare\u002Fsandbox@0.6.3`, Docker image: `cloudflare\u002Fsandbox:0.6.3-python`\n\n**⚠️ BREAKING CHANGE (v0.6.0):** Python is no longer included in the default image. Use `cloudflare\u002Fsandbox:\u003Cversion>-python` for Python support (~1.3GB with data science packages). The lean variant (~600-800MB) excludes Python.\n\n---\n\n## Quick Start (15 Minutes)\n\n### 1. Install SDK and Setup Wrangler\n\n```bash\nbun add @cloudflare\u002Fsandbox@latest  # preferred\n# or: bun add @cloudflare\u002Fsandbox@latest\n```\n\n**wrangler.jsonc:**\n```jsonc\n{\n  \"name\": \"my-sandbox-worker\",\n  \"main\": \"src\u002Findex.ts\",\n  \"compatibility_flags\": [\"nodejs_compat\"],\n  \"containers\": [{\n    \"class_name\": \"Sandbox\",\n    \"image\": \"cloudflare\u002Fsandbox:0.6.3-python\",\n    \"instance_type\": \"lite\"\n  }],\n  \"durable_objects\": {\n    \"bindings\": [{\n      \"class_name\": \"Sandbox\",\n      \"name\": \"Sandbox\"\n    }]\n  },\n  \"migrations\": [{\n    \"tag\": \"v1\",\n    \"new_sqlite_classes\": [\"Sandbox\"]\n  }]\n}\n```\n\n**Why this matters:**\n- `nodejs_compat` enables Node.js APIs required by SDK\n- `containers` defines the Ubuntu container image\n- `durable_objects` binding enables persistent routing\n- `migrations` registers the Sandbox class\n\n### 2. Create Your First Sandbox Worker\n\n```typescript\nimport { getSandbox, type Sandbox } from '@cloudflare\u002Fsandbox';\nexport { Sandbox } from '@cloudflare\u002Fsandbox';\n\ntype Env = {\n  Sandbox: DurableObjectNamespace\u003CSandbox>;\n};\n\nexport default {\n  async fetch(request: Request, env: Env): Promise\u003CResponse> {\n    \u002F\u002F Get sandbox instance (creates if doesn't exist)\n    const sandbox = getSandbox(env.Sandbox, 'my-first-sandbox');\n\n    \u002F\u002F Execute Python code\n    const result = await sandbox.exec('python3 -c \"print(2 + 2)\"');\n\n    return Response.json({\n      output: result.stdout,\n      success: result.success,\n      exitCode: result.exitCode\n    });\n  }\n};\n```\n\n**CRITICAL:**\n- **MUST export** `{ Sandbox }` from `@cloudflare\u002Fsandbox` in your Worker\n- Sandbox ID determines routing (same ID = same container)\n- First request creates container (~2-3 min cold start)\n- Subsequent requests are fast (\u003C1s)\n\n### 3. Deploy and Test\n\n```bash\nnpm run deploy\ncurl https:\u002F\u002Fyour-worker.workers.dev\n```\n\nExpected output:\n```json\n{\n  \"output\": \"4\\n\",\n  \"success\": true,\n  \"exitCode\": 0\n}\n```\n\n---\n\n## Architecture (Understanding the 3-Layer Model)\n\n### How Sandboxes Work\n\n```\n┌─────────────────────────────────────────┐\n│  Your Worker (Layer 1)                  │\n│  - Handles HTTP requests                │\n│  - Calls getSandbox()                   │\n│  - Uses sandbox.exec(), writeFile(), etc│\n└──────────────┬──────────────────────────┘\n               │ RPC via Durable Object\n┌──────────────▼──────────────────────────┐\n│  Durable Object (Layer 2)               │\n│  - Routes by sandbox ID                 │\n│  - Maintains persistent identity        │\n│  - Geographic stickiness                │\n└──────────────┬──────────────────────────┘\n               │ Container API\n┌──────────────▼──────────────────────────┐\n│  Ubuntu Container (Layer 3)             │\n│  - Full Linux environment               │\n│  - Python 3.11, Node 20, Git, etc.      │\n│  - Filesystem: \u002Fworkspace, \u002Ftmp, \u002Fhome  │\n│  - Process isolation (VM-based)         │\n└─────────────────────────────────────────┘\n```\n\n**Key Insight**: Workers handle API logic (fast), Durable Objects route requests (persistent identity), Containers execute code (full capabilities).\n\n---\n\n## Critical Container Lifecycle (Most Important Section!)\n\n### Container States\n\n```\n┌─────────┐  First request  ┌────────┐  ~10 min idle  ┌──────┐\n│ Not     │ ───────────────>│ Active │ ─────────────> │ Idle │\n│ Created │                 │        │                │      │\n└─────────┘                 └───┬────┘                └──┬───┘\n                                │ ^                      │\n                                │ │ New request          │\n                                │ └──────────────────────┘\n                                │                         │\n                                ▼                         ▼\n                            Files persist          ALL FILES DELETED\n                            Processes run          ALL PROCESSES KILLED\n                            State maintained       ALL STATE RESET\n```\n\n### The #1 Gotcha: Ephemeral by Default\n\n**While Container is Active** (~10 min after last request):\n- ✅ Files in `\u002Fworkspace`, `\u002Ftmp`, `\u002Fhome` persist\n- ✅ Background processes keep running\n- ✅ Shell environment variables remain\n- ✅ Session working directories preserved\n\n**When Container Goes Idle** (after inactivity):\n- ❌ **ALL files deleted** (entire filesystem reset)\n- ❌ **ALL processes terminated**\n- ❌ **ALL shell state lost**\n- ⚠️  Next request creates **fresh container from scratch**\n\n**This is NOT like a traditional server**. Sandboxes are ephemeral by design.\n\n### Handling Persistence\n\n**For Important Data**: Use external storage\n```typescript\n\u002F\u002F Save to R2 before container goes idle\nawait sandbox.writeFile('\u002Fworkspace\u002Fdata.txt', content);\nconst fileData = await sandbox.readFile('\u002Fworkspace\u002Fdata.txt');\nawait env.R2.put('backup\u002Fdata.txt', fileData);\n\n\u002F\u002F Restore on next request\nconst restored = await env.R2.get('backup\u002Fdata.txt');\nif (restored) {\n  await sandbox.writeFile('\u002Fworkspace\u002Fdata.txt', await restored.text());\n}\n```\n\n**For Build Artifacts**: Accept ephemerality or use caching\n```typescript\n\u002F\u002F Check if setup needed (handles cold starts)\nconst exists = await sandbox.readdir('\u002Fworkspace\u002Fproject').catch(() => null);\nif (!exists) {\n  await sandbox.gitCheckout(repoUrl, '\u002Fworkspace\u002Fproject');\n  await sandbox.exec('npm install', { cwd: '\u002Fworkspace\u002Fproject' });\n}\n\u002F\u002F Now safe to run build\nawait sandbox.exec('npm run build', { cwd: '\u002Fworkspace\u002Fproject' });\n```\n\n---\n\n## Session Management (Game-Changer for Chat Agents)\n\n### What Are Sessions?\n\nSessions are **bash shell contexts** within one sandbox. Think terminal tabs.\n\n**Key Properties**:\n- Each session has separate working directory\n- Sessions share same filesystem\n- Working directory persists across commands in same session\n- Perfect for multi-step workflows\n\n### Pattern: Chat-Based Coding Agent\n\n```typescript\ntype ConversationState = {\n  sandboxId: string;\n  sessionId: string;\n};\n\n\u002F\u002F First message: Create sandbox and session\nconst sandboxId = `user-${userId}`;\nconst sandbox = getSandbox(env.Sandbox, sandboxId);\nconst sessionId = await sandbox.createSession();\n\n\u002F\u002F Store in conversation state (database, KV, etc.)\nawait env.KV.put(`conversation:${conversationId}`, JSON.stringify({\n  sandboxId,\n  sessionId\n}));\n\n\u002F\u002F Later messages: Reuse same session\nconst state = await env.KV.get(`conversation:${conversationId}`);\nconst { sandboxId, sessionId } = JSON.parse(state);\nconst sandbox = getSandbox(env.Sandbox, sandboxId);\n\n\u002F\u002F Commands run in same context\nawait sandbox.exec('cd \u002Fworkspace\u002Fproject', { session: sessionId });\nawait sandbox.exec('ls -la', { session: sessionId }); \u002F\u002F Still in \u002Fworkspace\u002Fproject\nawait sandbox.exec('git status', { session: sessionId }); \u002F\u002F Still in \u002Fworkspace\u002Fproject\n```\n\n### Without Sessions (Common Mistake)\n\n```typescript\n\u002F\u002F ❌ WRONG: Each command runs in separate session\nawait sandbox.exec('cd \u002Fworkspace\u002Fproject');\nawait sandbox.exec('ls'); \u002F\u002F NOT in \u002Fworkspace\u002Fproject (different session)\n```\n\n### Pattern: Parallel Execution\n\n```typescript\nconst session1 = await sandbox.createSession();\nconst session2 = await sandbox.createSession();\n\n\u002F\u002F Run different tasks simultaneously\nawait Promise.all([\n  sandbox.exec('python train_model.py', { session: session1 }),\n  sandbox.exec('node generate_reports.js', { session: session2 })\n]);\n```\n\n---\n\n## Sandbox Naming Strategies\n\n### Per-User Sandboxes (Persistent Workspace)\n\n```typescript\nconst sandbox = getSandbox(env.Sandbox, `user-${userId}`);\n```\n\n**Pros**: User's work persists while actively using (10 min idle time)\n**Cons**: Geographic lock-in (first request determines location)\n**Use Cases**: Interactive notebooks, IDEs, persistent workspaces\n\n### Per-Session Sandboxes (Fresh Each Time)\n\n```typescript\nconst sandboxId = `session-${Date.now()}-${crypto.randomUUID()}`;\nconst sandbox = getSandbox(env.Sandbox, sandboxId);\n\u002F\u002F Always destroy after use\nawait sandbox.destroy();\n```\n\n**Pros**: Clean environment, no state pollution\n**Cons**: No persistence between requests\n**Use Cases**: One-shot code execution, CI\u002FCD, testing\n\n### Per-Task Sandboxes (Idempotent & Traceable)\n\n```typescript\nconst sandbox = getSandbox(env.Sandbox, `build-${repoName}-${commitSha}`);\n```\n\n**Pros**: Reproducible, debuggable, cacheable\n**Cons**: Need explicit cleanup strategy\n**Use Cases**: Build systems, data pipelines, automated workflows\n\n---\n\n## Core API Reference\n\nThe Sandbox SDK provides methods for command execution, file operations, Git operations, code interpretation (Jupyter-like), background processes, and cleanup.\n\n**? Load `references\u002Fapi-reference.md`** when you need detailed API method signatures, parameter options, or implementation examples for:\n- Executing commands with options (cwd, timeout, env vars, sessions)\n- File operations (read\u002Fwrite\u002Fmkdir\u002Frm\u002Freaddir)\n- Git operations (gitCheckout, git commands)\n- Code interpreter (createCodeContext, runCode)\n- Background processes (spawn, isProcessRunning, killProcess)\n- Sandbox cleanup (destroy)\n\n---\n\n## Critical Rules\n\n### Always Do\n\n✅ **Check exit codes** - `if (!result.success) { handle error }`\n✅ **Use sessions for multi-step workflows** - Preserve working directory\n✅ **Handle cold starts** - Check if files exist before assuming they're there\n✅ **Set timeouts** - Prevent hanging on long operations\n✅ **Destroy ephemeral sandboxes** - Cleanup temp\u002Fsession-based sandboxes\n✅ **Use external storage for persistence** - R2\u002FKV\u002FD1 for important data\n✅ **Validate user input** - Sanitize before exec() to prevent command injection\n✅ **Export Sandbox class** - `export { Sandbox } from '@cloudflare\u002Fsandbox'`\n\n### Never Do\n\n❌ **Assume files persist after idle** - Container resets after ~10 min\n❌ **Ignore exit codes** - Always check `result.success` or `result.exitCode`\n❌ **Chain commands without sessions** - `cd \u002Fdir` then `ls` won't work\n❌ **Execute unsanitized user input** - Use code interpreter or validate thoroughly\n❌ **Forget nodejs_compat flag** - Required in wrangler.jsonc\n❌ **Skip migrations** - Durable Objects need migration entries\n❌ **Use .workers.dev for preview URLs** - Need custom domain\n❌ **Create unlimited sandboxes** - Destroy ephemeral ones to avoid leaks\n\n---\n\n## Known Issues Prevention\n\nThis skill prevents **10** documented issues:\n\n### Issue #1: Missing nodejs_compat Flag\n**Error**: `ReferenceError: fetch is not defined` or `Buffer is not defined`\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fget-started\u002F\n**Why It Happens**: SDK requires Node.js APIs not available in standard Workers\n**Prevention**: Add `\"compatibility_flags\": [\"nodejs_compat\"]` to wrangler.jsonc\n\n### Issue #2: Missing Migrations\n**Error**: `Error: Class 'Sandbox' not found`\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fdurable-objects\u002F\n**Why It Happens**: Durable Objects must be registered via migrations\n**Prevention**: Include migrations array in wrangler.jsonc\n\n### Issue #3: Assuming File Persistence\n**Error**: Files disappear after inactivity\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fconcepts\u002Fsandboxes\u002F\n**Why It Happens**: Containers go idle after ~10 min, all state reset\n**Prevention**: Use external storage (R2\u002FKV) or check existence on each request\n\n### Issue #4: Session Directory Confusion\n**Error**: Commands execute in wrong directory\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fconcepts\u002Fsessions\u002F\n**Why It Happens**: Each exec() uses new session unless explicitly specified\n**Prevention**: Create session with `createSession()`, pass to all related commands\n\n### Issue #5: Ignoring Exit Codes\n**Error**: Assuming command succeeded when it failed\n**Source**: Shell best practices\n**Why It Happens**: Not checking `result.success` or `result.exitCode`\n**Prevention**: Always check: `if (!result.success) throw new Error(result.stderr)`\n\n### Issue #6: Not Handling Cold Starts\n**Error**: Commands fail because dependencies aren't installed\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fconcepts\u002Fsandboxes\u002F\n**Why It Happens**: Container resets after idle period\n**Prevention**: Check if setup needed before running commands\n\n### Issue #7: Docker Not Running (Local Dev)\n**Error**: `Failed to build container` during local development\n**Source**: https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fget-started\u002F\n**Why It Happens**: Local dev requires Docker daemon\n**Prevention**: Ensure Docker Desktop is running before `npm run dev`\n\n### Issue #8: Version Mismatch (Package vs Docker Image)\n**Error**: API methods not available or behaving unexpectedly\n**Source**: GitHub issues\n**Why It Happens**: npm package version doesn't match Docker image version\n**Prevention**: Keep `@cloudflare\u002Fsandbox` package and `cloudflare\u002Fsandbox` image in sync\n\n### Issue #9: Not Cleaning Up Ephemeral Sandboxes\n**Error**: Resource exhaustion, unexpected costs\n**Source**: Resource management best practices\n**Why It Happens**: Creating sandboxes without destroying them\n**Prevention**: `await sandbox.destroy()` in finally block for temp sandboxes\n\n### Issue #10: Command Injection Vulnerability\n**Error**: Security breach from unsanitized user input\n**Source**: Security best practices\n**Why It Happens**: Passing user input directly to `exec()`\n**Prevention**: Use code interpreter API or validate\u002Fsanitize input thoroughly\n\n---\n\n## wrangler.jsonc Example\n\n```jsonc\n{\n  \"name\": \"my-sandbox-app\",\n  \"main\": \"src\u002Findex.ts\",\n  \"compatibility_date\": \"2025-10-29\",\n  \"compatibility_flags\": [\"nodejs_compat\"], \u002F\u002F ← REQUIRED\n\n  \"containers\": [{\n    \"class_name\": \"Sandbox\",\n    \"image\": \"cloudflare\u002Fsandbox:0.6.3-python\", \u002F\u002F ← Use -python for Python support\n    \"instance_type\": \"lite\"\n  }],\n\n  \"durable_objects\": {\n    \"bindings\": [{\"class_name\": \"Sandbox\", \"name\": \"Sandbox\"}]\n  },\n\n  \"migrations\": [{\n    \"tag\": \"v1\",\n    \"new_sqlite_classes\": [\"Sandbox\"]\n  }]\n}\n```\n\n---\n\n## Common Patterns\n\nFour production-ready patterns for building with Cloudflare Sandboxes: one-shot code execution, persistent user workspaces, CI\u002FCD pipelines, and AI agent integration.\n\n**? Load `references\u002Fpatterns.md`** when you need complete implementation examples for:\n1. **One-Shot Code Execution** - API endpoints, code playgrounds, learning platforms\n2. **Persistent User Workspace** - Interactive environments, notebooks, IDEs\n3. **CI\u002FCD Build Pipeline** - Build systems, testing pipelines, deployment automation\n4. **AI Agent with Claude Code** - Automated refactoring, code generation, AI development\n\n---\n\n## Using Bundled Resources\n\n### Scripts (scripts\u002F)\n\n- `setup-sandbox-binding.sh` - Interactive wrangler.jsonc configuration\n- `test-sandbox.ts` - Validation script to test sandbox setup\n\n**Example Usage:**\n```bash\n# Setup wrangler config\n.\u002Fscripts\u002Fsetup-sandbox-binding.sh\n\n# Test sandbox\nbunx tsx scripts\u002Ftest-sandbox.ts\n```\n\n### References (references\u002F)\n\n- `references\u002Fpersistence-guide.md` - Deep dive on container lifecycle and persistence\n- `references\u002Fsession-management.md` - Advanced session patterns and best practices\n- `references\u002Fcommon-errors.md` - Complete list of errors with solutions\n- `references\u002Fnaming-strategies.md` - Choosing sandbox IDs for different use cases\n\n**When Claude should load these**:\n- Load `persistence-guide.md` when debugging state issues or cold starts\n- Load `session-management.md` when building multi-step workflows or chat agents\n- Load `common-errors.md` when encountering specific errors\n- Load `naming-strategies.md` when designing sandbox architecture\n\n---\n\n## Advanced Topics\n\n**? Load `references\u002Fadvanced.md`** for production patterns:\n- Geographic distribution strategies for global apps\n- Error handling wrapper functions\n- Security hardening and input validation\n\n---\n\n## Official Resources\n\n**Package**: `@cloudflare\u002Fsandbox@0.6.3` | **Docker**: `cloudflare\u002Fsandbox:0.6.3-python`\n\n**Docs**: [Cloudflare Sandboxes](https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002F) | [API Reference](https:\u002F\u002Fdevelopers.cloudflare.com\u002Fsandbox\u002Fapi-reference\u002F) | [GitHub SDK](https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fsandbox-sdk)\n\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill cloudflare-sandbox",{"tool":49,"command":50},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill cloudflare-sandbox",{"tool":52,"command":53},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill cloudflare-sandbox","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002FSKILL.md",true,[57,63,69,73,77,81,85,89,93,97,103,107,111,115,119,123],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"assets\u002Fexample-template.txt","ASSET","资产文件",416,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Fassets\u002Fexample-template.txt",{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"references\u002Fadvanced.md","REFERENCE","参考文档",4526,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Freferences\u002Fadvanced.md",{"path":70,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002Fapi-reference.md",3119,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Freferences\u002Fapi-reference.md",{"path":74,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002Fcommon-errors.md",9741,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Freferences\u002Fcommon-errors.md",{"path":78,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Fexample-reference.md",760,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Freferences\u002Fexample-reference.md",{"path":82,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fnaming-strategies.md",8663,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Freferences\u002Fnaming-strategies.md",{"path":86,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fpatterns.md",5091,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Freferences\u002Fpatterns.md",{"path":90,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fpersistence-guide.md",8178,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Freferences\u002Fpersistence-guide.md",{"path":94,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Fsession-management.md",10111,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Freferences\u002Fsession-management.md",{"path":98,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":101,"sourceHtmlUrl":102},"scripts\u002Fexample-script.sh","SCRIPT","脚本",302,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Fscripts\u002Fexample-script.sh",{"path":104,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":105,"sourceHtmlUrl":106},"scripts\u002Fsetup-sandbox-binding.sh",2773,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Fscripts\u002Fsetup-sandbox-binding.sh",{"path":108,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":109,"sourceHtmlUrl":110},"scripts\u002Ftest-sandbox.ts",6957,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Fscripts\u002Ftest-sandbox.ts",{"path":112,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":113,"sourceHtmlUrl":114},"templates\u002Fbasic-executor.ts",3296,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Ftemplates\u002Fbasic-executor.ts",{"path":116,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":117,"sourceHtmlUrl":118},"templates\u002Fchat-agent.ts",6437,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Ftemplates\u002Fchat-agent.ts",{"path":120,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":121,"sourceHtmlUrl":122},"templates\u002Fci-cd.ts",7720,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Ftemplates\u002Fci-cd.ts",{"path":124,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":125,"sourceHtmlUrl":126},"templates\u002Fworkspace.ts",10484,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fcloudflare-sandbox\u002Ftemplates\u002Fworkspace.ts",[128,138,148,157,163,170],{"skillNo":129,"name":130,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":134,"publishedAt":29},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[133],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[135,136,137],"model","model hierarchy","model hierarchy skill",{"skillNo":139,"name":140,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":144,"publishedAt":29},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[143],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[145,146,147],"MCP","zoom","zoom mcp",{"skillNo":149,"name":150,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":29},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[154,155,156,146],"sdk","zoom apps sdk","apps",{"skillNo":158,"name":159,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":162,"publishedAt":29},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[159],{"skillNo":164,"name":165,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":169,"publishedAt":29},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[168],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[165],{"skillNo":171,"name":172,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":175,"publishedAt":29},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[172]]