重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
cloudflare-deployment by autumnsgrove/groveengine
npx skills add https://github.com/autumnsgrove/groveengine --skill cloudflare-deployment在以下情况下激活此技能:
# 安装 wrangler
pnpm add -g wrangler
# 登录
wrangler login
# 初始化新的 Worker
wrangler init my-worker
# 本地开发
wrangler dev
# 部署到 Cloudflare
wrangler deploy
# 查看日志
wrangler tail my-worker
| 服务 | 用途 | 使用场景 |
|---|---|---|
| Workers | 无服务器函数 | API 端点、中间件 |
| Pages | 静态站点 + 函数 | SvelteKit、Next.js |
| KV | 键值存储 | 缓存、会话数据 |
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| R2 | 对象存储 | 文件、图像、备份 |
| D1 | SQLite 数据库 | 结构化数据 |
wrangler init my-worker --type javascript
cd my-worker
wrangler dev
wrangler deploy
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (url.pathname === "/api/hello") {
return new Response(JSON.stringify({ message: "Hello!" }), {
headers: { "Content-Type": "application/json" },
});
}
return new Response("Not found", { status: 404 });
},
};
# 创建命名空间
wrangler kv namespace create MY_KV
# 添加到 wrangler.toml
# kv_namespaces = [{ binding = "MY_KV", id = "abc123" }]
// 在 Worker 中
export default {
async fetch(request, env) {
// 写入
await env.MY_KV.put("key", "value");
// 读取
const value = await env.MY_KV.get("key");
return new Response(value);
},
};
wrangler r2 bucket create my-bucket
# 添加: r2_buckets = [{ binding = "MY_BUCKET", bucket_name = "my-bucket" }]
// 在 Worker 中
await env.MY_BUCKET.put("file.txt", "content");
const object = await env.MY_BUCKET.get("file.txt");
const text = await object.text();
wrangler d1 create my-database
wrangler d1 execute my-database --command="CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"
# 添加: d1_databases = [{ binding = "DB", database_name = "my-database", database_id = "..." }]
// 在 Worker 中
const { results } = await env.DB.prepare("SELECT * FROM users WHERE id = ?").bind(1).all();
return Response.json(results);
Grove 使用来自 @autumnsgrove/infra 的可移植基础设施接口,而不是原始的 Cloudflare API。这使得后端具有可移植性,并在所有服务中保持一致的开发模式。
| 原始 Cloudflare | Infra SDK 接口 | 导入 |
|---|---|---|
env.DB (D1Database) | GroveDatabase | @autumnsgrove/infra |
env.STORAGE (R2Bucket) | GroveStorage | @autumnsgrove/infra |
env.CACHE_KV (KVNamespace) | GroveKV | @autumnsgrove/infra |
| 服务绑定 (Fetcher) | GroveServiceBus | @autumnsgrove/infra |
在你的 Worker 入口点通过 createCloudflareContext() 创建一个 GroveContext:
import { createCloudflareContext } from "@autumnsgrove/infra/cloudflare";
const ctx = createCloudflareContext({
db: env.DB,
storage: env.STORAGE,
kv: env.CACHE_KV,
});
// 使用可移植接口
const files = await ctx.storage.list("prefix");
const cached = await ctx.kv.get("key");
对于文件/存储管理,使用 Amber SDK (@autumnsgrove/lattice/amber),它在 GroveStorage 之上提供了 FileManager、QuotaManager、ExportManager 和 AddonManager:
import { FileManager, QuotaManager } from "@autumnsgrove/lattice/amber";
const fileManager = new FileManager(ctx.storage);
const quotaManager = new QuotaManager(ctx.storage);
// 类型安全的文件操作
const metadata = await fileManager.upload("user-123/photo.jpg", stream);
const quota = await quotaManager.getUsage("user-123");
使用来自 @autumnsgrove/lattice/server 的 Rootwork 工具来实现边界类型安全:
import { safeJsonParse, parseFormData } from "@autumnsgrove/lattice/server";
import { z } from "zod";
// 安全地解析 KV 读取
const cached = await ctx.kv.get("config");
const config = safeJsonParse(cached, ConfigSchema);
// 解析表单数据并进行验证
const formData = await request.formData();
const data = parseFormData(formData, UploadSchema);
# 部署静态站点
wrangler pages deploy ./build --project-name=my-site
# 使用 SvelteKit
pnpm add -D @sveltejs/adapter-cloudflare
pnpm build
wrangler pages deploy .svelte-kit/cloudflare
name = "my-worker"
main = "src/index.js"
compatibility_date = "2024-01-01"
# 自动资源调配 (v4.45.0+)
kv_namespaces = [{ binding = "MY_KV" }]
r2_buckets = [{ binding = "MY_BUCKET" }]
d1_databases = [{ binding = "DB" }]
# 本地 (模拟资源)
wrangler dev
# 远程 (真实的 Cloudflare 资源)
wrangler dev --remote
# 设置密钥
wrangler secret put API_KEY --name my-worker
# 在代码中访问
const apiKey = env.API_KEY;
wrangler dev 进行本地测试wrangler tail 监控日志export default {
async fetch(request, env) {
const url = new URL(request.url);
const cacheKey = url.pathname;
// 检查 KV 缓存
let content = await env.MY_KV.get(cacheKey);
if (content) return new Response(content);
// 从 R2 获取
const object = await env.MY_BUCKET.get(cacheKey.slice(1));
if (!object) return new Response("Not found", { status: 404 });
content = await object.text();
// 缓存到 KV
await env.MY_KV.put(cacheKey, content, { expirationTtl: 3600 });
return new Response(content);
},
};
查看 AgentUsage/cloudflare_guide.md 获取完整文档,包括:
每周安装次数
71
代码仓库
GitHub 星标数
2
首次出现
2026年1月28日
安全审计
安装于
gemini-cli70
codex70
opencode70
github-copilot69
cursor69
cline69
Activate this skill when:
# Install wrangler
pnpm add -g wrangler
# Login
wrangler login
# Initialize new Worker
wrangler init my-worker
# Local development
wrangler dev
# Deploy to Cloudflare
wrangler deploy
# View logs
wrangler tail my-worker
| Service | Purpose | Use Case |
|---|---|---|
| Workers | Serverless functions | API endpoints, middleware |
| Pages | Static sites + functions | SvelteKit, Next.js |
| KV | Key-value storage | Caching, session data |
| R2 | Object storage | Files, images, backups |
| D1 | SQLite database | Structured data |
wrangler init my-worker --type javascript
cd my-worker
wrangler dev
wrangler deploy
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (url.pathname === "/api/hello") {
return new Response(JSON.stringify({ message: "Hello!" }), {
headers: { "Content-Type": "application/json" },
});
}
return new Response("Not found", { status: 404 });
},
};
# Create namespace
wrangler kv namespace create MY_KV
# Add to wrangler.toml
# kv_namespaces = [{ binding = "MY_KV", id = "abc123" }]
// In Worker
export default {
async fetch(request, env) {
// Write
await env.MY_KV.put("key", "value");
// Read
const value = await env.MY_KV.get("key");
return new Response(value);
},
};
wrangler r2 bucket create my-bucket
# Add: r2_buckets = [{ binding = "MY_BUCKET", bucket_name = "my-bucket" }]
// In Worker
await env.MY_BUCKET.put("file.txt", "content");
const object = await env.MY_BUCKET.get("file.txt");
const text = await object.text();
wrangler d1 create my-database
wrangler d1 execute my-database --command="CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"
# Add: d1_databases = [{ binding = "DB", database_name = "my-database", database_id = "..." }]
// In Worker
const { results } = await env.DB.prepare("SELECT * FROM users WHERE id = ?").bind(1).all();
return Response.json(results);
Grove uses portable infrastructure interfaces from @autumnsgrove/infra instead of raw Cloudflare APIs. This enables backend portability and consistent patterns across all services.
| Raw Cloudflare | Infra SDK Interface | Import |
|---|---|---|
env.DB (D1Database) | GroveDatabase | @autumnsgrove/infra |
env.STORAGE (R2Bucket) | GroveStorage | @autumnsgrove/infra |
env.CACHE_KV (KVNamespace) | GroveKV |
Create a GroveContext via createCloudflareContext() in your Worker entry point:
import { createCloudflareContext } from "@autumnsgrove/infra/cloudflare";
const ctx = createCloudflareContext({
db: env.DB,
storage: env.STORAGE,
kv: env.CACHE_KV,
});
// Use portable interfaces
const files = await ctx.storage.list("prefix");
const cached = await ctx.kv.get("key");
For file/storage management, use Amber SDK (@autumnsgrove/lattice/amber) which provides FileManager, QuotaManager, ExportManager, and AddonManager on top of GroveStorage:
import { FileManager, QuotaManager } from "@autumnsgrove/lattice/amber";
const fileManager = new FileManager(ctx.storage);
const quotaManager = new QuotaManager(ctx.storage);
// Type-safe file operations
const metadata = await fileManager.upload("user-123/photo.jpg", stream);
const quota = await quotaManager.getUsage("user-123");
Use Rootwork utilities from @autumnsgrove/lattice/server for boundary type safety:
import { safeJsonParse, parseFormData } from "@autumnsgrove/lattice/server";
import { z } from "zod";
// Parse KV reads safely
const cached = await ctx.kv.get("config");
const config = safeJsonParse(cached, ConfigSchema);
// Parse form data with validation
const formData = await request.formData();
const data = parseFormData(formData, UploadSchema);
# Deploy static site
wrangler pages deploy ./build --project-name=my-site
# With SvelteKit
pnpm add -D @sveltejs/adapter-cloudflare
pnpm build
wrangler pages deploy .svelte-kit/cloudflare
name = "my-worker"
main = "src/index.js"
compatibility_date = "2024-01-01"
# Automatic resource provisioning (v4.45.0+)
kv_namespaces = [{ binding = "MY_KV" }]
r2_buckets = [{ binding = "MY_BUCKET" }]
d1_databases = [{ binding = "DB" }]
# Local (simulated resources)
wrangler dev
# Remote (real Cloudflare resources)
wrangler dev --remote
# Set secret
wrangler secret put API_KEY --name my-worker
# Access in code
const apiKey = env.API_KEY;
wrangler dev for local testing firstwrangler tailexport default {
async fetch(request, env) {
const url = new URL(request.url);
const cacheKey = url.pathname;
// Check KV cache
let content = await env.MY_KV.get(cacheKey);
if (content) return new Response(content);
// Fetch from R2
const object = await env.MY_BUCKET.get(cacheKey.slice(1));
if (!object) return new Response("Not found", { status: 404 });
content = await object.text();
// Cache in KV
await env.MY_KV.put(cacheKey, content, { expirationTtl: 3600 });
return new Response(content);
},
};
See AgentUsage/cloudflare_guide.md for complete documentation including:
Weekly Installs
71
Repository
GitHub Stars
2
First Seen
Jan 28, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
gemini-cli70
codex70
opencode70
github-copilot69
cursor69
cline69
专业专利现有技术检索七步法 - 全面评估可专利性,查找阻碍性专利
99 周安装
DigitalOcean托管数据库完全指南:PostgreSQL、MySQL、Redis、MongoDB、Kafka等云数据库管理
101 周安装
Web安全漏洞大全:100个关键漏洞详解与修复指南 | 渗透测试必备
100 周安装
文章插图生成器 - AI智能分析文章内容,自动生成风格一致的信息图、流程图等插图
105 周安装
Weights & Biases (W&B) 使用指南:机器学习实验追踪与 MLOps 平台
63 周安装
AI 端到端测试工具 - 支持 8 大平台,零代码实现自动化测试
98 周安装
@autumnsgrove/infra |
| Service bindings (Fetcher) | GroveServiceBus | @autumnsgrove/infra |