mirror of
https://github.com/wanikua/danghuangshang.git
synced 2026-09-03 07:03:37 +08:00
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:
85
.github/workflows/duchayuan-review.yml
vendored
Normal file
85
.github/workflows/duchayuan-review.yml
vendored
Normal 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
95
docs/sansheng-flow.md
Normal 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 个 Secrets(Settings → 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/Vue?)2. 认证方式(JWT/Session?)3. 是否需要第三方登录?」
|
||||
|
||||
司礼监 → [追问用户]
|
||||
「内阁需要确认几个问题:1. 技术栈? 2. 认证方式? 3. 第三方登录?」
|
||||
|
||||
用户:React + JWT,不需要第三方登录
|
||||
|
||||
司礼监 → [再次发给内阁]
|
||||
|
||||
内阁 → [返回优化结果]
|
||||
「【优化后 Prompt】...
|
||||
【执行计划】
|
||||
Step 1: @兵部 — 实现 JWT 认证后端 API
|
||||
Step 2: @兵部 — 实现 React 登录页面组件
|
||||
Step 3: @都察院 — push 后自动审查」
|
||||
|
||||
司礼监 → [在频道派活]
|
||||
「@兵部 【任务】实现用户登录功能...」
|
||||
|
||||
兵部 → [执行 + push]
|
||||
|
||||
GitHub Action → [自动触发都察院]
|
||||
|
||||
都察院 → [审查报告]
|
||||
「✅ commit abc1234 审查通过,无安全问题。建议:密码哈希可考虑用 argon2 替代 bcrypt。」
|
||||
```
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user