Claude Code 实战入门(六):SDK、GitHub 集成、把 Claude 放进 CI
SDK 把 Claude Code 从 CLI 变成库。GitHub Action 让它在 PR 上响应 @claude。两者一起把 Claude 放进已经在跑你测试的同一条 CI 流水线——又不交出控制。
CK
Chen Kai
· 3 分钟 · 1477 字
CLI 是显眼的表面,SDK 是有意思的那个,GitHub 集成是它真正回本的地方。
SDK 一段话
@anthropic-ai/claude-code 是 npm 包。它把 CLI 同款 Claude Code 引擎——同样的工具、同样的权限——以编程接口暴露。给它一个 Prompt,得到一个对话事件的异步迭代。塞进任何脚本、服务、CI 步骤都行。
装:
1
| npm install @anthropic-ai/claude-code
|
Hello world:
1
2
3
4
5
6
7
8
9
10
11
12
13
| import { query } from '@anthropic-ai/claude-code';
const result = query({
prompt: '列出本仓库最大的 3 个源文件,每个用一句话说明它做什么。',
options: {
cwd: process.cwd(),
permissionMode: 'default'
}
});
for await (const event of result) {
if (event.type === 'text') process.stdout.write(event.text);
}
|
跑。终端里同样的 Agent 循环展开——工具调用全在。这就是 CLI 减去聊天 UI。
程序化的权限
这一段必须做对。CLI 默认"问人"。脚本不能问人。SDK 因此暴露权限模式:
| 模式 | 意思 |
|---|
default | 任何需要确认的工具——报错 |
acceptEdits | 自动接受文件编辑,shell 仍问 |
bypassPermissions | 全部自动接受(危险) |
| 自定义 | 提供回调,按调用决定 |
真活儿要用回调:
1
2
3
4
5
6
7
8
9
10
11
| const result = query({
prompt: '...',
options: {
permissionMode: 'custom',
permissionCallback: async (tool, input) => {
if (tool === 'Bash' && input.command.startsWith('rm ')) return 'deny';
if (tool === 'Write' && input.path.startsWith('/etc')) return 'deny';
return 'allow';
}
}
});
|
现在你有程序化策略。脚本可以无人值守,且你知道它不能做你显式禁的事。
一个真脚本:自动更新 CHANGELOG
我在几个项目里都有 scripts/update-changelog.ts:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| import { query } from '@anthropic-ai/claude-code';
import { execSync } from 'child_process';
const lastTag = execSync('git describe --tags --abbrev=0').toString().trim();
const commits = execSync(`git log ${lastTag}..HEAD --oneline`).toString();
const result = query({
prompt: `
在 CHANGELOG.md 里加一个即将发布的版本条目。
自 ${lastTag} 以来的 commit:
${commits}
分组到 Added/Changed/Fixed/Removed。
用 SemVer 建议下一个版本号。
就地编辑 CHANGELOG.md。
`,
options: {
cwd: process.cwd(),
permissionMode: 'acceptEdits'
}
});
for await (const event of result) {
if (event.type === 'text') process.stdout.write(event.text);
}
|
每次发版前跑一次。CHANGELOG 自己写好,commit log 被整理成散文,我审核然后 commit。每次发版省 5 分钟 × 过去半年的每次发版。
GitHub Action
Anthropic 出了官方 Action:anthropic/claude-code-action@v1。塞进 workflow:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| name: Claude on PR
on:
pull_request_review_comment:
types: [created]
issue_comment:
types: [created]
jobs:
claude:
if: contains(github.event.comment.body, '@claude')
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
steps:
- uses: actions/checkout@v4
- uses: anthropic/claude-code-action@v1
with:
anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
|
现在仓库里任何人在 PR 评论里写 @claude please review the failing test,Claude 会:
- 检出分支
- 读评论上下文
- 跑它需要的(测试、Lint、读文件)
- 在 PR 上回复分析
- 被要求时还能 push commit
Action 尊重 Repo 里 .claude/settings.json。第五篇里写的 Hook 仍生效。第三篇里写的斜杠命令仍可用——@claude /review 干你预期的事。
GitHub Action 我用来做什么
3 件事固定下来:
1. PR 分诊。 新 PR 一开 workflow 自动跑 @claude /review。等人来看时已有第一遍意见。给 reviewer 省 10 分钟、抓住明显的事。
2. Issue 总结。 workflow 在新 issue 上跑:打标签、建议修复范围、链相关代码。报告者更快收到 ack,维护者一开始就有起点。
3. 文档更新。 Schema 变化时一个 Action 让 Claude 更新文档去匹配。不总是完美,但 80% 是机械活。
SDK 与 Action 的边界
我用 SDK 的时候:
- 想要 Claude 在我本机跑的脚本里
- 触发是 cron、文件变化、或手动命令
- 我需要程序化看事件
我用 Action 的时候:
- 触发是 GitHub 事件
- 输出该落到 PR 或 Issue 上
- 我想要人在环里,环是
@mention
当然有重叠。Action 底层就是 SDK。
把系列拼起来
6 篇,一条递进:
- 安装 + 三层配置
- 快捷键与模式
- 个人工作流的斜杠命令
- 外部集成的 MCP
- 安全栏的 Hooks
- 程序化与 CI 的 SDK + Action
每篇单独都买你具体的东西。合起来,Claude Code 从"代码场景下的聊天客户端"变成"住在你 Repo 里的可编程基础设施"。
我观察到的高级用户的单一特征是:他们把 .claude/ 当代码库的一部分。Settings、Commands、Hooks 都 commit、都进 PR review、都和项目共同演进。这是值得练的肌肉。
发版顺利。
翻完了?
去 GitHub 关注一下,新一篇通常隔一周就到。
GitHub →