feat: 内阁前置优化 + 都察院 push 自动审查

1. 司礼监 prompt 重构:收到任务先 sessions_send 给内阁优化 Prompt/生成 plan,拿到结果后再派活
2. 内阁 prompt 重构:明确 Prompt 优化、Plan 生成、缺失 context 追问职责
3. 都察院 prompt 重构:支持 push 触发的自动审查流程
4. 新增 GitHub Action: duchayuan-review.yml — push 到 main 时自动发 diff 给都察院审查
5. 新增 docs/sansheng-flow.md — 三省流程文档(含配置步骤和完整示例)

Closes #71
This commit is contained in:
wanikua
2026-03-15 07:55:57 +00:00
parent c96b109664
commit 16fb418d7e
3 changed files with 183 additions and 3 deletions

85
.github/workflows/duchayuan-review.yml vendored Normal file
View File

@@ -0,0 +1,85 @@
# 都察院自动审查 — push 时触发
# 通过 OpenClaw Gateway API 将 diff 发送给都察院 Agent 审查
name: 都察院 Code Review
on:
push:
branches: [main]
paths-ignore:
- '*.md'
- 'docs/**'
- 'images/**'
- 'LICENSE'
jobs:
duchayuan-review:
runs-on: ubuntu-latest
# 跳过 merge commit 和 bot commit
if: "!contains(github.event.head_commit.message, '[skip review]') && github.actor != 'github-actions[bot]'"
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2 # 需要上一个 commit 来算 diff
- name: Generate diff
id: diff
run: |
DIFF=$(git diff HEAD~1 HEAD -- . ':!*.md' ':!docs/*' ':!images/*' | head -c 12000)
if [ -z "$DIFF" ]; then
echo "skip=true" >> "$GITHUB_OUTPUT"
echo "No code changes detected, skipping review."
else
# 写入文件避免 shell 转义问题
echo "$DIFF" > /tmp/diff.txt
echo "skip=false" >> "$GITHUB_OUTPUT"
fi
- name: Get commit info
if: steps.diff.outputs.skip != 'true'
id: commit
run: |
echo "author=${{ github.event.head_commit.author.username || github.actor }}" >> "$GITHUB_OUTPUT"
echo "message=${{ github.event.head_commit.message }}" >> "$GITHUB_OUTPUT"
echo "sha=$(echo ${{ github.sha }} | cut -c1-7)" >> "$GITHUB_OUTPUT"
echo "url=${{ github.event.head_commit.url }}" >> "$GITHUB_OUTPUT"
- name: Send to 都察院 via OpenClaw API
if: steps.diff.outputs.skip != 'true'
env:
OPENCLAW_API_URL: ${{ secrets.OPENCLAW_API_URL }} # e.g. http://your-server:18789
OPENCLAW_API_TOKEN: ${{ secrets.OPENCLAW_API_TOKEN }} # Gateway admin token
DUCHAYUAN_CHANNEL: ${{ secrets.DUCHAYUAN_DISCORD_CHANNEL }} # Discord channel ID for review reports
run: |
DIFF_CONTENT=$(cat /tmp/diff.txt)
REVIEW_PROMPT=$(cat <<'PROMPT_END'
【都察院自动审查 — GitHub Push 触发】
提交者: ${{ steps.commit.outputs.author }}
Commit: ${{ steps.commit.outputs.sha }}
消息: ${{ steps.commit.outputs.message }}
链接: ${{ steps.commit.outputs.url }}
请审查以下代码变更,检查:安全漏洞、性能问题、逻辑错误、代码规范。
审查完毕后将结论发送到 Discord 频道。
--- DIFF 开始 ---
PROMPT_END
)
# 拼接 prompt + diff
FULL_PROMPT="${REVIEW_PROMPT}
${DIFF_CONTENT}
--- DIFF 结束 ---"
# 通过 OpenClaw sessions API 发送给都察院
curl -s -X POST "${OPENCLAW_API_URL}/api/sessions/send" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${OPENCLAW_API_TOKEN}" \
-d "$(jq -n \
--arg agentId "duchayuan" \
--arg message "$FULL_PROMPT" \
--arg label "duchayuan-review-${{ github.sha }}" \
'{agentId: $agentId, message: $message, label: $label}'
)" || echo "⚠️ Failed to reach OpenClaw API. Make sure OPENCLAW_API_URL and OPENCLAW_API_TOKEN secrets are configured."

95
docs/sansheng-flow.md Normal file
View File

@@ -0,0 +1,95 @@
# 三省流程:内阁前置 + 都察院后置
> ← [返回 README](../README.md) | [架构详解](./architecture.md)
---
## 流程总览
```
用户下旨 → 司礼监接旨 → 内阁(前置优化)→ 司礼监(调度派活)→ 六部执行 → push → 都察院(后置审查)
↑ │
└──── 如缺 context追问用户 ────────────────────────────────┘
如有 bug打回修改
```
## 一、内阁前置优化(自动)
### 触发条件
用户 @司礼监 下达任务(非闲聊/非简单问答)
### 流程
1. **司礼监** 收到任务,自动 `sessions_send` 转发给 **内阁**
2. **内阁** 分析需求:
- ✅ 需求明确 → 输出优化后的 Prompt + 执行计划(标注派给哪个部门)
- ❓ 需求模糊 → 列出需补充的问题,返回司礼监
3. **司礼监** 如需补充 → 追问用户 → 拿到后再次发给内阁
4. **司礼监** 拿到内阁的优化结果后,在频道内 @对应部门 派发
### 跳过内阁的情况
- 纯闲聊、简单问答
- 状态查询git status、系统状态等
- 紧急 hotfix需标注跳过原因
## 二、都察院后置审查(自动)
### 触发条件
代码 push 到 `main` 分支(自动排除纯文档变更)
### 流程
1. GitHub Action 检测到 push
2. 自动生成 diff通过 OpenClaw API 发送给 **都察院**
3. **都察院** 审查:安全漏洞、性能问题、逻辑错误、代码规范
4. 审查结论发送到 Discord 频道:
- ✅ 通过
- ⚠️ 建议修改(列出问题和建议)
- ❌ 必须修改(列出问题、行号、修复方案)
### 配置步骤
在 GitHub 仓库设置 3 个 SecretsSettings → Secrets and variables → Actions
| Secret 名称 | 说明 | 示例 |
|---|---|---|
| `OPENCLAW_API_URL` | 你的 OpenClaw Gateway 地址 | `http://你的服务器IP:18789` |
| `OPENCLAW_API_TOKEN` | Gateway 的 admin token | 在 `openclaw.json``gateway.adminToken` 中设置 |
| `DUCHAYUAN_DISCORD_CHANNEL` | 审查报告发送的 Discord 频道 ID | `1234567890` |
> ⚠️ Gateway 需要能从公网访问(或使用 Tailscale/Cloudflare Tunnel
> 如果 Gateway 在内网,可以用 [smee.io](https://smee.io) 或 Cloudflare Tunnel 转发。
## 三、完整示例
```
用户:@司礼监 帮我写一个用户登录功能
司礼监 → [sessions_send 给内阁]
「用户需求:写一个用户登录功能,请优化 Prompt 并生成执行计划」
内阁 → [返回给司礼监]
「需要补充1. 技术栈React/Vue2. 认证方式JWT/Session3. 是否需要第三方登录?」
司礼监 → [追问用户]
「内阁需要确认几个问题1. 技术栈? 2. 认证方式? 3. 第三方登录?」
用户React + JWT不需要第三方登录
司礼监 → [再次发给内阁]
内阁 → [返回优化结果]
「【优化后 Prompt】...
【执行计划】
Step 1: @兵部 — 实现 JWT 认证后端 API
Step 2: @兵部 — 实现 React 登录页面组件
Step 3: @都察院 — push 后自动审查」
司礼监 → [在频道派活]
「@兵部 【任务】实现用户登录功能...」
兵部 → [执行 + push]
GitHub Action → [自动触发都察院]
都察院 → [审查报告]
「✅ commit abc1234 审查通过,无安全问题。建议:密码哈希可考虑用 argon2 替代 bcrypt。」
```

View File

@@ -48,7 +48,7 @@
"primary": "your-provider/fast-model"
},
"identity": {
"theme": "你是AI朝廷的司礼监大内总管。你的职责是【规划调度】不是亲自执行。说话简练干脆。\n\n【核心原则】除了日常闲聊和简单问答所有涉及实际工作的任务写代码、查资料、分析数据、写文案、运维操作等一律在当前频道 @对应部门 派发,让所有人可见工作流转。你是指挥官,不是搬砖工。\n\n【部门职责】内阁=战略决策、都察院=审查监察、兵部=编码开发、户部=财务分析、礼部=品牌营销、工部=运维部署、吏部=项目管理、刑部=法务合规、翰林院=研究文档。\n\n【派活方式】用 message 工具在当前 Discord 频道发消息,@对应部门bot 下达任务。派活时用高级 Prompt 模板:【角色】+【任务】+【背景】+【要求】+【格式】,确保一次性给出所有约束。禁止用 sessions_spawn 暗地里干活,一切工作流转必须在频道内公开可见。\n\n【审批流程】涉及代码提交 → @都察院 审查;涉及重大决策(预算、架构、方向变更)→ @内阁 审议。都察院审查不通过则打回修改,内阁有否决权。\n\n【什么时候自己回答】仅限纯闲聊、确认信息、汇报进度、问澄清问题。其他一律派活。"
"theme": "你是AI朝廷的司礼监大内总管。你的职责是【规划调度】不是亲自执行。说话简练干脆。\n\n【核心原则】除了日常闲聊和简单问答所有涉及实际工作的任务写代码、查资料、分析数据、写文案、运维操作等必须先经内阁优化再派发。你是调度枢纽,不是搬砖工。\n\n【任务流程——内阁前置】收到用户任务后\n1. 先用 sessions_spawn 或 sessions_send 将原始任务发给内阁agentId: neige请内阁优化 Prompt、生成执行计划plan、判断是否缺失关键 context\n2. 如果内阁回复需要补充信息,你向用户追问,拿到后再次发给内阁;\n3. 内阁返回优化后的任务描述和 plan 后,你再按 plan 在频道 @对应部门 派发具体任务。\n跳过内阁的情况纯闲聊、简单问答、状态查询、紧急 hotfix标注跳过原因。\n\n【部门职责】内阁=Prompt优化与计划生成、都察院=代码审查push后自动触发、兵部=编码开发、户部=财务分析、礼部=品牌营销、工部=运维部署、吏部=项目管理、刑部=法务合规、翰林院=研究文档。\n\n【派活方式】用 message 工具在当前 Discord 频道发消息,@对应部门bot 下达任务。派活时用内阁优化后的 Prompt,确保包含:【角色】+【任务】+【背景】+【要求】+【格式】一切工作流转必须在频道内公开可见。\n\n【审批流程】涉及代码提交 → 都察院会在 push 时自动审查;涉及重大决策(预算、架构、方向变更)→ @内阁 审议。都察院审查不通过则打回修改,内阁有否决权。\n\n【什么时候自己回答】仅限纯闲聊、确认信息、汇报进度、问澄清问题。其他一律走内阁前置流程。"
},
"sandbox": {
"mode": "off"
@@ -74,7 +74,7 @@
"primary": "your-provider/strong-model"
},
"identity": {
"theme": "你是内阁首辅,专精战略决策、方案审议、全局规划。回答用中文,高屋建瓴。当收到重大决策请求时,从多角度分析利弊,给出明确建议。擅长将复杂问题拆解为可执行的步骤,协调各部门资源。【审议职责】当司礼监重大决策(预算、架构变更、战略方向)提交审议时,必须独立评估可行性、风险和替代方案,给出明确的批准/驳回/修改建议。有权否决不合理的方案。任务完成后主动汇报决策建议和执行路径。"
"theme": "你是内阁首辅,在朝廷流程中担任【前置优化】角色。回答用中文,高屋建瓴。\n\n【核心职责——Prompt 优化与 Plan 生成】当司礼监转发用户任务给你时:\n1. 分析用户原始需求,判断是否完整、清晰;\n2. 如果缺失关键 context目标不明确、技术栈未指定、范围模糊等列出需要用户补充的问题返回给司礼监追问\n3. 如果需求明确,输出:\n - 【优化后 Prompt】将用户口语化需求转化为结构化的高质量 Prompt含角色、任务、背景、要求、格式\n - 【执行计划】:拆解为具体步骤,标注每步应派给哪个部门(兵部/户部/礼部/工部/吏部/刑部/翰林院);\n - 【风险提示】:如有潜在风险或需要注意的点,一并指出。\n\n【审议职责】当司礼监提交重大决策(预算、架构变更、战略方向)时,独立评估可行性、风险和替代方案,给出明确的批准/驳回/修改建议。有权否决不合理的方案。\n\n【原则】宁可多问一句不要让模糊需求流入执行层。你的优化质量直接决定六部的执行效率。"
},
"sandbox": {
"mode": "off"
@@ -87,7 +87,7 @@
"primary": "your-provider/strong-model"
},
"identity": {
"theme": "你是都察院御史,专精监察审计、代码审查、质量把控、安全评估。回答用中文,铁面无私。审查代码时关注安全漏洞、性能问题、最佳实践。审计项目时检查进度偏差、资源浪费、风险隐患。发现问题直言不讳,给出具体改进建议。任务完成后主动汇报审查结论和整改建议。【自动审查】当其他部门通过 sessions_send 或 spawn 提交代码/PR 给你审查时,逐一检查并给出通过/驳回结论。驳回时必须说明具体原因和修改建议。"
"theme": "你是都察院御史,专精监察审计、代码审查、质量把控、安全评估。回答用中文,铁面无私。\n\n【自动审查——Push 触发】当 GitHub Action 通过 webhook 触发你审查时,你会收到 push 的 commit 信息和 diff。审查流程\n1. 逐文件检查变更:安全漏洞、性能问题、逻辑错误、代码规范;\n2. 给出结论:✅ 通过 / ⚠️ 建议修改 / ❌ 必须修改;\n3. 如有问题,列出具体文件、行号、问题描述和修复建议;\n4. 将审查报告发送到 Discord 频道,@提交者和司礼监。\n\n【手动审查】当其他部门通过 sessions_send 或 spawn 提交代码/PR 给你审查时,同样逐一检查并给出通过/驳回结论。驳回时必须说明具体原因和修改建议。\n\n【审计职责】定期检查项目进度偏差、资源浪费、风险隐患。发现问题直言不讳。"
},
"sandbox": {
"mode": "all",