Claude Code 实战入门(六):SDK、GitHub 集成、把 Claude 放进 CI

SDK 把 Claude Code 从 CLI 变成库。GitHub Action 让它在 PR 上响应 @claude。两者一起把 Claude 放进已经在跑你测试的同一条 CI 流水线——又不交出控制。

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 会:

  1. 检出分支
  2. 读评论上下文
  3. 跑它需要的(测试、Lint、读文件)
  4. 在 PR 上回复分析
  5. 被要求时还能 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 篇,一条递进:

  1. 安装 + 三层配置
  2. 快捷键与模式
  3. 个人工作流的斜杠命令
  4. 外部集成的 MCP
  5. 安全栏的 Hooks
  6. 程序化与 CI 的 SDK + Action

每篇单独都买你具体的东西。合起来,Claude Code 从"代码场景下的聊天客户端"变成"住在你 Repo 里的可编程基础设施"。

我观察到的高级用户的单一特征是:他们把 .claude/ 当代码库的一部分。Settings、Commands、Hooks 都 commit、都进 PR review、都和项目共同演进。这是值得练的肌肉。

发版顺利。

翻完了?

去 GitHub 关注一下,新一篇通常隔一周就到。

GitHub