theoju/engineering-docs-agent
GitHub: theoju/engineering-docs-agent
Claude Code 插件,通过多个专用子代理自动将 Git/Jira 变更转化为每晚的文档更新 PR,并附带发布验证与内容质量检查。
Stars: 0 | Forks: 0
# engineering-docs-agent
一个 Claude Code 插件:夜间的文档 PR 生成器,包含发布验证和分层内容 lint。
## 功能
- 监控宿主仓库的 Git/PRs/Jira,获取自上次成功运行以来的更改。
- 针对宿主的文档站点发起一个 PR,包含:
- 总结更改的 **What's New** 条目。
- 由 `page-author` 子代理使用 voice few-shot 编写的 **更新/新页面**。
- 针对没有 spec/plan 的非琐碎 PR 提供的 **Gap flags**。
- 发送 Slack + 电子邮件摘要。
- 在 PR 合并后,验证宿主的构建 pipeline 是否成功以及页面是否已上线。
## 安装
1. `claude plugin marketplace add ` — 从本地路径或远程 URL 注册 marketplace。
2. `claude plugin install engineering-docs-agent@engineering-docs-agent-marketplace` — 安装插件。
3. `claude /engineering-docs-agent-setup` — 从宿主仓库的根目录运行 setup skill。
有关全面的操作指南(GitHub App 注册、所有仓库 secrets、分支保护、验证、每种语言的宿主说明、针对每种 partial-mode 失败的故障排除),请参阅 [docs/site-src/setup-guide.md](docs/site-src/setup-guide.md)。相同的内容也会发布在文档站点的 `setup-guide.html` 上。
## 自托管 (dogfood)
此仓库配置为针对自身运行代理 —— 为新宿主仓库提供的参考布局:
1. `.engineering-docs-agent/config.yml` — 宿主配置(框架、路径、Jira 项目键、voice 样本、发布目标)。
2. `.engineering-docs-agent/state.json` — 提交的状态。`last_successful_run.head_sha` 是下一次夜间运行窗口的事实来源。每个合并的 `docs-agent/YYYY-MM-DD` PR 都通过正常的 git merge 推进它 —— 没有单独的 promote workflow。
3. `.engineering-docs-agent/state.example.json` — 用于全新宿主仓库的种子模板。此 dogfood 宿主已经拥有真实的 `state.json`;该示例文件是为安装到新仓库的插件用户保留的。
4. `.engineering-docs-agent/current_run.json` — 被 gitignore 的临时运行状态,每次状态更新时都会写入,用于诊断和测试可观测性。不是 docs-agent PR 的一部分。
5. `docs/site-src/` — 代理可编辑区域和 MkDocs 源目录;`agent_editable_paths` glob (`docs/site-src/**`) 限制在此处的写入,并且同一棵树会发布到 GitHub Pages。
针对此宿主在本地运行代理:
```
python3 scripts/orchestrator_runner.py --repo-root . --no-pr
```
要获取每个子代理的原始 stdout 诊断信息,请在调用前设置 `DOCS_AGENT_DEBUG_DIR=/tmp/cce-debug`。
### 夜间编写运行
主要的编写 pipeline(不带子命令的 `scripts/orchestrator_runner.py`)每天 07:00 UTC 通过 `.github/workflows/docs-agent-nightly.yml` 自动运行一次。该 workflow 会打开或附加提交到一个 `docs-agent/YYYY-MM-DD` PR;根据规范第 8 节,partial run 仍然会打开并在 body 中包含 `partial: true` 的 PR,以便使操作差距可见,而不是静默的。
要手动触发它:
```
gh workflow run docs-agent-nightly.yml -f reason=""
gh run watch
```
`reason` 输入是一个自由文本标签,会与运行后的 `state.json` 快照一起显示在运行摘要中。身份验证通过 `CLAUDE_CODE_OAUTH_TOKEN` 仓库 secret 进行(与 `release.yml` 的 secret 相同)。每个仓库一次只能运行一个 —— 并发调用会排队,而不是在同一个 docs-agent 分支上竞争。
### 从本地 clone 安装
如果您正在通过此仓库的检出进行工作(例如,在发布前测试更改),请注册本地 marketplace 并安装插件:
```
claude plugin marketplace add /path/to/engineering-docs-agent
claude plugin install engineering-docs-agent@engineering-docs-agent-marketplace
```
这使得这八个代理无需 `--plugin-dir` 变通方法即可解析。marketplace 注册会读取 `.claude-plugin/marketplace.json`;插件清单位于 `.claude-plugin/plugin.json`。
### Lens 路径和可编辑路径
代理从 **lens 路径**读取并写入**可编辑路径**。它们有重叠,但却是不同的:
- `docs.lens_paths` 定义了_每个 lens 的文档所在位置_(例如,`core: docs/site-src/`)。voice-load、gap-detection 和 PR-summarization 阶段会从这些路径读取。
- `docs.agent_editable_paths` 定义了_代理可以写入的位置_。Orchestrator 的 runtime filter 会拒绝任何不在这些 globs 之内的建议页面。
**不变式:** 每个 `lens_paths` 条目都必须至少被一个 `agent_editable_paths` glob 覆盖。Config loader 会在启动时通过 `scripts/state_io.py` 中的 `_validate_lens_paths_are_editable` 强制执行此操作。一个没有匹配可编辑 glob 的 lens 意味着代理读取了它永远无法更新的文档 —— 这通常是一个错误。
可编辑的 glob 可以比 lens 路径**更窄** —— 例如,一个 lens `core: docs/` 配对可编辑的 `docs/generated/**` 是有效的:代理读取 `docs/` 下的所有内容,但只写入 `generated/` 子路径。验证器接受这一点,因为可编辑 glob 的锚点 (`docs/generated/`) 以 lens 路径 (`docs/`) 开头。兼容性规则是双向的:glob 锚点和 lens 路径必须共享一个路径分支。此仓库的 dogfood 配置将两者放在同一位置:lens `docs/site-src/` 配对可编辑的 `docs/site-src/**`。
### Jira 丰富 (可选)
如果您的宿主配置设置了 `sources.jira.enabled: true` 并且您希望
source-collector 子代理获取链接的 issue 摘要,请在调用
orchestrator 的 shell 中设置两个环境变量:
```
export JIRA_EMAIL="your.email@example.com"
export JIRA_API_TOKEN="…" # token from https://id.atlassian.com/manage-profile/security/api-tokens
```
`JIRA_API_TOKEN` 是 Atlassian Cloud API token(不是您的密码)。该
token 通过 TLS 使用 HTTP basic-auth 发送到 Jira REST API。
`dispatch_subagent` 已经将完整的父环境传递到
subprocess 中,因此任何继承的 `JIRA_*` 变量都可以到达代理,而无需
额外的连接配置。
如果没有这些环境变量,orchestrator 将继续运行;source-collector 输出中的 `jira_issues`
将是 `[]`,并且运行将被标记为
`partial: true` 以及 `error: "jira_auth_missing"`,以便在 `.engineering-docs-agent/state.json` 的 partial_reasons 和
Slack/电子邮件通知中使操作差距可见。有关代理端的契约,请参阅 `agents/source-collector.md` 第 5 步 +
Forbidden outputs 第 6 节。
## 实时集成测试
默认的 `pytest` 运行是完全模拟的 —— 没有网络,没有 LLM,没有成本。一个单独的 `@pytest.mark.live` 门控涵盖了真实的 LLM 调度路径:
```
pytest -m live -v
```
这些测试调用真实的 `claude` CLI,每次完整通过的成本约为 **$1-3**(每个测试约 $0.10-$0.50)。它们需要安装并验证过(OAuth 或 `ANTHROPIC_API_KEY`)的 `claude` CLI、网络访问权限和 API 配额。默认情况下会跳过实时测试(一个 `conftest.py` hook);使用 `-m live` 选择加入。CI 仅在 tag 推送时运行它们 (`.github/workflows/release.yml`),从不在每个 PR 上运行。
涵盖范围:每种 payload 形状进行一次 `dispatch_subagent` 调用(带有摘要的 notifier,带有 PR 元数据的 pr-summarizer)。调度路径是被测系统 —— CCE-2 和 CCE-3 修复的那类连接错误正是这些测试要捕获的。
## 架构
请参阅 [设计规范](docs/superpowers/specs/2026-05-19-engineering-docs-agent-design.md)。
## Lint 规则
位于 `scripts/lint/` 中的独立脚本。宿主可以在自己的 CI 中对人工编写的 PR 运行它们:
```
python scripts/lint/lint_runner.py --config .engineering-docs-agent/config.yml --paths docs/**/*.md --json
```
## License
MIT。
标签:AI代理, Claude插件, SOC Prime, 安全规则引擎, 开发工具, 开源框架, 持续集成, 文档自动化, 逆向工具