把 API schema 变成可用的 CLI 工具
读取 clip.yaml · 生成 commander CLI · 统一管理 API 凭据
clip 解决两个具体问题:
- 认证 — 在
~/.clip/<alias>/credentials.json(0600 权限)安全存储 API 凭据,支持headerAPI key、browser-login浏览器登录、cf-access服务令牌三种鉴权形式 - API → CLI — 读取
clip.yaml,生成一个 commander 驱动的 TypeScript CLI 项目,每个 endpoint 是一个可独立编辑的命令文件
定义一次 schema,得到一个会自动注入鉴权头的命令行客户端;凭据存储与生成的 CLI 解耦,凭据轮换不需要重生成代码。
clip.yaml ──► clip generate ──► .clip-output/<alias>/
└─ commander CLI (TypeScript)
│
└─► reads ~/.clip/<alias>/credentials.json
(managed by `clip auth …`)
clip generate [path]— 读取clip.yaml(或指定路径),生成 CLI 项目到.clip-output/<alias>/clip install [path]— 生成后通过bun link把 CLI 全局可用clip auth set <alias>— 保存 header 或 cf-access 凭据,带交互式遮罩输入clip auth login <alias>— 走浏览器登录流程拿 token,适用于browser-login类型 schemaclip auth show <alias>— 显示遮罩后的凭据clip auth remove <alias>— 删除凭据clip test <alias>— 对生成的 CLI 跑实时 API 测试
| 类型 | 用途 | 凭据来源 |
|---|---|---|
header |
单 header API key(如 X-API-Key) |
clip auth set 交互输入 |
browser-login |
用户在浏览器登录后回调 loopback 拿 token | clip auth login 自动打开浏览器 |
cf-access |
Cloudflare Access service token,双 header | clip auth set --client-id ... --client-secret ... |
clip.yaml 声明 endpoint 后,生成的代码包括:
src/index.ts— commander 入口,每个 endpoint 一个 sub-commandsrc/commands/<name>.ts— 单个 endpoint 的实现(可读、可手改)src/client.ts— 注入鉴权头的 fetch 封装src/config.ts— 从~/.clip/<alias>/credentials.json解析鉴权package.json+tsconfig.json— 完整可独立运行的 bun 项目
# 当前只支持源码安装(尚未发布到 npm)
git clone https://github.com/nocoo/clip.git
cd clip
bun install
bun link packages/cli# 1. 在项目根目录写一份 clip.yaml(见 docs/features/01-schema-definition.md)
cat > clip.yaml <<'EOF'
name: "Todo API"
alias: todo
version: "1.0.0"
baseUrl: "http://localhost:3000"
auth:
type: header
headerName: "X-API-Key"
endpoints:
- name: list
method: GET
path: /todos
description: "List all todos"
EOF
# 2. 生成 CLI
clip generate
# 3. 保存凭据
clip auth set todo
# 4. 全局安装生成的 CLI
clip install
# 5. 使用
todo listclip/
├── packages/
│ ├── cli/ # 核心:schema 解析、codegen、auth 存储、test 生成
│ ├── example-api/ # Hono Todo API,用于 dogfooding 和集成测试
│ └── web/ # Astro 文档站
├── docs/
│ ├── architecture/ # 架构设计
│ └── features/ # 各模块详细设计
├── scripts/hooks/ # Git pre-commit / pre-push 钩子
└── logo.png
| 层 | 技术 |
|---|---|
| Runtime | Bun |
| Language | TypeScript 5 strict mode |
| Schema | Zod + yaml |
| Generated CLI | commander |
| Browser-login flow | @nocoo/base-cli |
| Example API | Hono |
| Docs Site | Astro |
| Lint / Format | Biome |
| Testing | Vitest + Bun test |
bun install # 安装依赖
bun run lint # Biome 静态检查
bun run typecheck # tsc --noEmit
bun run test:unit # Vitest 单元测试 + 覆盖率
bun run lint:secrets # gitleaks 扫描
bun run lint:deps # osv-scanner 依赖漏洞扫描| 命令 | 说明 |
|---|---|
bun run lint |
Biome 检查 + 格式化校验 |
bun run typecheck |
TypeScript 全项目类型检查 |
bun run test:unit |
Vitest 跑所有单元测试,生成 v8 覆盖率 |
| 层 | 内容 | 触发时机 |
|---|---|---|
| Unit | packages/cli/tests/unit/ — schema / codegen / auth / commands |
bun run test:unit |
| Pre-commit hook | lint + typecheck + test:unit |
每次 git commit |
| Pre-push hook | gitleaks + osv-scanner |
每次 git push |
- 凭据目录
~/.clip/<alias>/创建时强制0700,credentials.json0600 - 通过
CLIP_HOME环境变量可重定向凭据存储位置 clip auth set --key <value>会留在 shell history,推荐省略--key使用交互式遮罩输入- pre-push 跑 gitleaks 防止凭据泄漏入仓
- pre-push 跑 osv-scanner 扫描 bun.lock 依赖漏洞
| 文档 | 说明 |
|---|---|
| docs/architecture/ | 系统总览与数据流 |
| docs/features/01-schema-definition.md | clip.yaml 字段规范与 Zod schema |
| docs/features/02-cli-codegen.md | 代码生成管线 |
| docs/features/03-auth-storage.md | 凭据存储与 clip auth 命令族 |
| docs/features/04-test-generation.md | 测试套件自动生成 |
| docs/features/05-example-api.md | Hono Todo 集成测试 fixture |
| docs/features/06-marketing-website.md | Astro 文档站 |
MIT © 2026 Zheng Li
