edict-multi-agent-orchestration by aradotso/trending-skills
npx skills add https://github.com/aradotso/trending-skills --skill edict-multi-agent-orchestrationSkill by ara.so — Daily 2026 Skills collection.
Edict 将 1400 年前的唐朝治理模型实现为 AI 多智能体架构。十二个专业智能体形成一个制衡管道:太子(分流)→ 中书(规划)→ 门下(审核/否决)→ 尚书(分发)→ 六部(并行执行)。基于 OpenClaw 构建,它提供实时 React 看板仪表盘、完整审计追踪和每个智能体的 LLM 配置。
You (Emperor) → taizi (triage) → zhongshu (plan) → menxia (review/veto)
→ shangshu (dispatch) → [hubu|libu|bingbu|xingbu|gongbu|libu2] (execute)
→ memorial (result archived)
与 CrewAI/AutoGen 的关键区别:门下省是一个强制性的质量关卡——它可以在任务到达执行者之前否决并强制返工。
# x86/amd64 (Ubuntu, WSL2)
docker run --platform linux/amd64 -p 7891:7891 cft0808/sansheng-demo
# Apple Silicon / ARM
docker run -p 7891:7891 cft0808/sansheng-demo
# 或使用 docker-compose (平台已设置)
docker compose up
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
git clone https://github.com/cft0808/edict.git
cd edict
chmod +x install.sh && ./install.sh
安装脚本自动执行:
openclaw.json 中注册智能体和权限矩阵sessions.visibility all 以启用智能体间消息路由# 在第一个智能体上配置 API 密钥
openclaw agents add taizi
# 然后重新运行安装以传播到所有智能体
./install.sh
# 终端 1: 数据刷新循环 (保持看板数据最新)
bash scripts/run_loop.sh
# 终端 2: 仪表盘服务器
python3 dashboard/server.py
# 打开仪表盘
open http://127.0.0.1:7891
# 列出所有已注册的智能体
openclaw agents list
# 添加/配置智能体
openclaw agents add <agent-name>
# 检查智能体状态
openclaw agents status
# 重启网关 (配置更改后需要)
openclaw gateway restart
# 向系统发送消息/诏令
openclaw send taizi "帮我分析一下竞争对手的产品策略"
# dashboard/server.py — 在端口 7891 上提供服务
# 内置: React 前端 + REST API + WebSocket 更新
python3 dashboard/server.py
# 自定义端口
PORT=8080 python3 dashboard/server.py
# 同步官方 (智能体) 统计数据
python3 scripts/sync_officials.py
# 更新看板任务状态
python3 scripts/kanban_update.py
# 运行新闻聚合
python3 scripts/fetch_news.py
# 完整刷新循环 (按顺序运行所有脚本)
bash scripts/run_loop.sh
openclaw.json){
"agents": {
"taizi": {
"model": "claude-3-5-sonnet-20241022",
"workspace": "~/.openclaw/workspaces/taizi"
},
"zhongshu": {
"model": "gpt-4o",
"workspace": "~/.openclaw/workspaces/zhongshu"
},
"menxia": {
"model": "claude-3-5-sonnet-20241022",
"workspace": "~/.openclaw/workspaces/menxia"
},
"shangshu": {
"model": "gpt-4o-mini",
"workspace": "~/.openclaw/workspaces/shangshu"
}
},
"gateway": {
"port": 7891,
"sessions": {
"visibility": "all"
}
}
}
导航到 ⚙️ 模型 面板 → 选择智能体 → 选择 LLM → 应用。网关会自动重启 (~5 秒)。
# API 密钥 (在运行 install.sh 或 openclaw 之前设置)
export ANTHROPIC_API_KEY="sk-ant-..."
export OPENAI_API_KEY="sk-..."
# 可选: 用于通知的飞书/Lark webhook
export FEISHU_WEBHOOK_URL="https://open.feishu.cn/open-apis/bot/v2/hook/..."
# 可选: 新闻聚合
export NEWS_API_KEY="..."
# 仪表盘端口覆盖
export DASHBOARD_PORT=7891
| 智能体 | 角色 | 职责 |
|---|---|---|
taizi | 太子 Crown Prince | 分流: 聊天 → 自动回复,诏令 → 创建任务 |
zhongshu | 中书省 | 规划: 将诏令分解为子任务 |
menxia | 门下省 | 审核/否决 : 质量关卡,可以拒绝并强制返工 |
shangshu | 尚书省 | 分发: 将子任务分配给各部 |
hubu | 户部 Ministry of Revenue | 财务、数据分析任务 |
libu | 礼部 Ministry of Rites | 沟通、文档任务 |
bingbu | 兵部 Ministry of War | 战略、安全任务 |
xingbu | 刑部 Ministry of Justice | 审查、合规任务 |
gongbu | 工部 Ministry of Works | 工程、技术任务 |
libu2 | 吏部 Ministry of Personnel | 人力资源、智能体管理任务 |
zaochao | 早朝官 | 晨报聚合器 |
# 在 openclaw.json 中定义 — 由网关强制执行
PERMISSIONS = {
"taizi": ["zhongshu"],
"zhongshu": ["menxia"],
"menxia": ["zhongshu", "shangshu"], # 可以否决并返回给 zhongshu
"shangshu": ["hubu", "libu", "bingbu", "xingbu", "gongbu", "libu2"],
# 各部向上级报告
"hubu": ["shangshu"],
"libu": ["shangshu"],
"bingbu": ["shangshu"],
"xingbu": ["shangshu"],
"gongbu": ["shangshu"],
"libu2": ["shangshu"],
}
# scripts/kanban_update.py 强制执行有效转换
VALID_TRANSITIONS = {
"pending": ["planning"],
"planning": ["reviewing", "pending"], # zhongshu → menxia
"reviewing": ["dispatching", "planning"], # menxia 批准或否决
"dispatching": ["executing"],
"executing": ["completed", "failed"],
"completed": [],
"failed": ["pending"], # 重试
}
# 无效转换会被拒绝 — 不会出现静默状态损坏
import subprocess
import json
def send_edict(message: str, agent: str = "taizi") -> dict:
"""向太子发送诏令进行分流。"""
result = subprocess.run(
["openclaw", "send", agent, message],
capture_output=True,
text=True
)
return {"stdout": result.stdout, "returncode": result.returncode}
# 示例诏令
send_edict("分析本季度用户增长数据,找出关键驱动因素")
send_edict("起草一份关于产品路线图的对外公告")
send_edict("审查现有代码库的安全漏洞")
import json
from pathlib import Path
def get_kanban_tasks(data_dir: str = "data") -> list[dict]:
"""读取当前看板任务状态。"""
tasks_file = Path(data_dir) / "tasks.json"
if not tasks_file.exists():
return []
with open(tasks_file) as f:
return json.load(f)
def get_tasks_by_status(status: str) -> list[dict]:
tasks = get_kanban_tasks()
return [t for t in tasks if t.get("status") == status]
# 用法
executing = get_tasks_by_status("executing")
completed = get_tasks_by_status("completed")
print(f"In progress: {len(executing)}, Done: {len(completed)}")
import json
from pathlib import Path
from datetime import datetime, timezone
VALID_TRANSITIONS = {
"pending": ["planning"],
"planning": ["reviewing", "pending"],
"reviewing": ["dispatching", "planning"],
"dispatching": ["executing"],
"executing": ["completed", "failed"],
"completed": [],
"failed": ["pending"],
}
def update_task_status(task_id: str, new_status: str, data_dir: str = "data") -> bool:
"""使用状态机验证更新任务状态。"""
tasks_file = Path(data_dir) / "tasks.json"
tasks = json.loads(tasks_file.read_text())
task = next((t for t in tasks if t["id"] == task_id), None)
if not task:
raise ValueError(f"Task {task_id} not found")
current = task["status"]
allowed = VALID_TRANSITIONS.get(current, [])
if new_status not in allowed:
raise ValueError(
f"Invalid transition: {current} → {new_status}. "
f"Allowed: {allowed}"
)
task["status"] = new_status
task["updated_at"] = datetime.now(timezone.utc).isoformat()
task.setdefault("history", []).append({
"from": current,
"to": new_status,
"timestamp": task["updated_at"]
})
tasks_file.write_text(json.dumps(tasks, ensure_ascii=False, indent=2))
return True
import urllib.request
import json
BASE_URL = "http://127.0.0.1:7891/api"
def api_get(endpoint: str) -> dict:
with urllib.request.urlopen(f"{BASE_URL}{endpoint}") as resp:
return json.loads(resp.read())
def api_post(endpoint: str, data: dict) -> dict:
payload = json.dumps(data).encode()
req = urllib.request.Request(
f"{BASE_URL}{endpoint}",
data=payload,
headers={"Content-Type": "application/json"},
method="POST"
)
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read())
# 读取仪表盘数据
tasks = api_get("/tasks")
agents = api_get("/agents")
sessions = api_get("/sessions")
news = api_get("/news")
# 触发任务操作
api_post("/tasks/pause", {"task_id": "task-123"})
api_post("/tasks/cancel", {"task_id": "task-123"})
api_post("/tasks/resume", {"task_id": "task-123"})
# 为智能体切换模型
api_post("/agents/model", {
"agent": "zhongshu",
"model": "gpt-4o-2024-11-20"
})
import json
from pathlib import Path
from datetime import datetime, timezone, timedelta
def check_agent_health(data_dir: str = "data") -> dict[str, str]:
"""
返回每个智能体的健康状态。
🟢 active = 2 分钟内有心跳
🟡 stale = 心跳在 2-10 分钟前
🔴 offline = 心跳 >10 分钟前或缺失
"""
heartbeats_file = Path(data_dir) / "heartbeats.json"
if not heartbeats_file.exists():
return {}
heartbeats = json.loads(heartbeats_file.read_text())
now = datetime.now(timezone.utc)
status = {}
for agent, last_beat in heartbeats.items():
last = datetime.fromisoformat(last_beat)
delta = now - last
if delta < timedelta(minutes=2):
status[agent] = "🟢 active"
elif delta < timedelta(minutes=10):
status[agent] = "🟡 stale"
else:
status[agent] = "🔴 offline"
return status
# 用法
health = check_agent_health()
for agent, s in health.items():
print(f"{agent:12} {s}")
<!-- ~/.openclaw/workspaces/gongbu/SOUL.md -->
# 工部尚书 · Minister of Works
## Role
You are the Minister of Works (工部). You handle all technical,
engineering, and infrastructure tasks assigned by Shangshu Province.
## Rules
1. Always break technical tasks into concrete, verifiable steps
2. Return structured results: { "status": "...", "output": "...", "artifacts": [] }
3. Flag blockers immediately — do not silently fail
4. Estimate complexity: S/M/L/XL before starting
## Output Format
Always respond with valid JSON. Include a `summary` field ≤ 50 chars
for kanban display.
| 面板 | URL 片段 | 关键功能 |
|---|---|---|
| 看板 | #kanban | 任务列、心跳徽章、过滤/搜索、暂停/取消/恢复 |
| 监控 | #monitor | 智能体健康卡片、任务分布图表 |
| 奏折 | #memorials | 已完成任务存档、5 阶段时间线、Markdown 导出 |
| 模板 | #templates | 9 个预设诏令模板,带参数表单 |
| 官员 | #officials | 令牌使用排名、活动统计 |
| 新闻 | #news | 每日科技/财经简报、飞书推送 |
| 模型 | #models | 按智能体 LLM 切换器 (热重载 ~5s) |
| 技能 | #skills | 查看/添加智能体技能 |
| 会话 | #sessions | 实时 OC-* 会话监控 |
| 朝会 | #court | 围绕主题的多智能体讨论 |
# 尚书同时分发给多个部委
# 每个部委独立工作;尚书汇总结果
edict = "竞品分析:研究TOP3竞争对手的产品、定价、市场策略"
# 中书拆分为子任务:
# hubu → 定价分析
# libu → 市场沟通分析
# bingbu → 竞争策略分析
# gongbu → 技术特性比较
# 全部并行执行;尚书等待所有 4 个,然后汇总
# 如果门下省拒绝中书的计划:
# menxia → zhongshu: "子任务拆解不完整,缺少风险评估维度,请补充"
# 中书修订并重新提交给门下省
# 循环持续直到门下省批准
# 最大迭代次数可在 openclaw.json 中配置: "max_review_cycles": 3
# scripts/fetch_news.py → data/news.json → dashboard #news 面板
# 可选飞书推送:
import os, json, urllib.request
def push_to_feishu(summary: str):
webhook = os.environ["FEISHU_WEBHOOK_URL"]
payload = json.dumps({
"msg_type": "text",
"content": {"text": f"📰 天下要闻\n{summary}"}
}).encode()
req = urllib.request.Request(
webhook, data=payload,
headers={"Content-Type": "application/json"}
)
urllib.request.urlopen(req)
exec format error# 在 x86/amd64 上强制指定平台
docker run --platform linux/amd64 -p 7891:7891 cft0808/sansheng-demo
# 确保会话可见性设置为 "all"
openclaw config set sessions.visibility all
openclaw gateway restart
# 或重新运行 install.sh — 它会自动设置此选项
./install.sh
# 在第一个智能体上配置密钥后重新运行安装
openclaw agents add taizi # 在此处配置密钥
./install.sh # 传播到所有智能体
# 确保 run_loop.sh 正在运行
bash scripts/run_loop.sh
# 或触发手动刷新
python3 scripts/sync_officials.py
python3 scripts/kanban_update.py
# 需要 Node.js 18+
cd dashboard/frontend
npm install && npm run build
# server.py 随后将提供构建的资产
# kanban_update.py 强制执行状态机
# 更新前检查当前状态:
tasks = get_kanban_tasks()
task = next(t for t in tasks if t["id"] == "your-task-id")
print(f"Current: {task['status']}")
print(f"Allowed next: {VALID_TRANSITIONS[task['status']]}")
# 编辑 openclaw.json 模型部分后
openclaw gateway restart
# 等待 ~5 秒让智能体重新连接
edict/
├── install.sh # 一键设置
├── openclaw.json # 智能体注册 + 权限 + 模型配置
├── scripts/
│ ├── run_loop.sh # 持续数据刷新守护进程
│ ├── kanban_update.py # 状态机强制执行
│ ├── sync_officials.py # 智能体统计聚合
│ └── fetch_news.py # 新闻聚合
├── dashboard/
│ ├── server.py # 仅标准库的 HTTP + WebSocket 服务器 (端口 7891)
│ ├── dashboard.html # 备用单文件仪表盘
│ └── frontend/ # React 18 源代码 (构建到 server.py 资产)
├── data/ # 共享数据 (符号链接到所有工作区)
│ ├── tasks.json
│ ├── heartbeats.json
│ ├── news.json
│ └── officials.json
├── workspaces/ # 每个智能体的工作区根目录
│ ├── taizi/SOUL.md
│ ├── zhongshu/SOUL.md
│ └── ...
└── docs/
├── task-dispatch-architecture.md
└── getting-started.md
每周安装数
341
仓库
GitHub 星标
10
首次出现
7 天前
安全审计
安装于
kimi-cli340
gemini-cli340
amp340
cline340
github-copilot340
codex340
Skill by ara.so — Daily 2026 Skills collection.
Edict implements a 1400-year-old Tang Dynasty governance model as an AI multi-agent architecture. Twelve specialized agents form a checks-and-balances pipeline: Crown Prince (triage) → Zhongshu (planning) → Menxia (review/veto) → Shangshu (dispatch) → Six Ministries (parallel execution). Built on OpenClaw, it provides a real-time React kanban dashboard, full audit trails, and per-agent LLM configuration.
You (Emperor) → taizi (triage) → zhongshu (plan) → menxia (review/veto)
→ shangshu (dispatch) → [hubu|libu|bingbu|xingbu|gongbu|libu2] (execute)
→ memorial (result archived)
Key differentiator vs CrewAI/AutoGen : Menxia (门下省) is a mandatory quality gate — it can veto and force rework before tasks reach executors.
# x86/amd64 (Ubuntu, WSL2)
docker run --platform linux/amd64 -p 7891:7891 cft0808/sansheng-demo
# Apple Silicon / ARM
docker run -p 7891:7891 cft0808/sansheng-demo
# Or with docker-compose (platform already set)
docker compose up
git clone https://github.com/cft0808/edict.git
cd edict
chmod +x install.sh && ./install.sh
The install script automatically:
openclaw.jsonsessions.visibility all for inter-agent message routing# Configure API key on first agent
openclaw agents add taizi
# Then re-run install to propagate to all agents
./install.sh
# Terminal 1: Data refresh loop (keeps kanban data current)
bash scripts/run_loop.sh
# Terminal 2: Dashboard server
python3 dashboard/server.py
# Open dashboard
open http://127.0.0.1:7891
# List all registered agents
openclaw agents list
# Add/configure an agent
openclaw agents add <agent-name>
# Check agent status
openclaw agents status
# Restart gateway (required after config changes)
openclaw gateway restart
# Send a message/edict to the system
openclaw send taizi "帮我分析一下竞争对手的产品策略"
# dashboard/server.py — serves on port 7891
# Built-in: React frontend + REST API + WebSocket updates
python3 dashboard/server.py
# Custom port
PORT=8080 python3 dashboard/server.py
# Sync official (agent) statistics
python3 scripts/sync_officials.py
# Update kanban task states
python3 scripts/kanban_update.py
# Run news aggregation
python3 scripts/fetch_news.py
# Full refresh loop (runs all scripts in sequence)
bash scripts/run_loop.sh
openclaw.json){
"agents": {
"taizi": {
"model": "claude-3-5-sonnet-20241022",
"workspace": "~/.openclaw/workspaces/taizi"
},
"zhongshu": {
"model": "gpt-4o",
"workspace": "~/.openclaw/workspaces/zhongshu"
},
"menxia": {
"model": "claude-3-5-sonnet-20241022",
"workspace": "~/.openclaw/workspaces/menxia"
},
"shangshu": {
"model": "gpt-4o-mini",
"workspace": "~/.openclaw/workspaces/shangshu"
}
},
"gateway": {
"port": 7891,
"sessions": {
"visibility": "all"
}
}
}
Navigate to ⚙️ Models panel → select agent → choose LLM → Apply. Gateway restarts automatically (~5 seconds).
# API keys (set before running install.sh or openclaw)
export ANTHROPIC_API_KEY="sk-ant-..."
export OPENAI_API_KEY="sk-..."
# Optional: Feishu/Lark webhook for notifications
export FEISHU_WEBHOOK_URL="https://open.feishu.cn/open-apis/bot/v2/hook/..."
# Optional: news aggregation
export NEWS_API_KEY="..."
# Dashboard port override
export DASHBOARD_PORT=7891
| Agent | Role | Responsibility |
|---|---|---|
taizi | 太子 Crown Prince | Triage: chat → auto-reply, edicts → create task |
zhongshu | 中书省 | Planning: decompose edict into subtasks |
menxia | 门下省 | Review/Veto : quality gate, can reject and force rework |
shangshu | 尚书省 | Dispatch: assign subtasks to ministries |
hubu | 户部 Ministry of Revenue |
# Defined in openclaw.json — enforced by gateway
PERMISSIONS = {
"taizi": ["zhongshu"],
"zhongshu": ["menxia"],
"menxia": ["zhongshu", "shangshu"], # can veto back to zhongshu
"shangshu": ["hubu", "libu", "bingbu", "xingbu", "gongbu", "libu2"],
# ministries report back up the chain
"hubu": ["shangshu"],
"libu": ["shangshu"],
"bingbu": ["shangshu"],
"xingbu": ["shangshu"],
"gongbu": ["shangshu"],
"libu2": ["shangshu"],
}
# scripts/kanban_update.py enforces valid transitions
VALID_TRANSITIONS = {
"pending": ["planning"],
"planning": ["reviewing", "pending"], # zhongshu → menxia
"reviewing": ["dispatching", "planning"], # menxia approve or veto
"dispatching": ["executing"],
"executing": ["completed", "failed"],
"completed": [],
"failed": ["pending"], # retry
}
# Invalid transitions are rejected — no silent state corruption
import subprocess
import json
def send_edict(message: str, agent: str = "taizi") -> dict:
"""Send an edict to the Crown Prince for triage."""
result = subprocess.run(
["openclaw", "send", agent, message],
capture_output=True,
text=True
)
return {"stdout": result.stdout, "returncode": result.returncode}
# Example edicts
send_edict("分析本季度用户增长数据,找出关键驱动因素")
send_edict("起草一份关于产品路线图的对外公告")
send_edict("审查现有代码库的安全漏洞")
import json
from pathlib import Path
def get_kanban_tasks(data_dir: str = "data") -> list[dict]:
"""Read current kanban task state."""
tasks_file = Path(data_dir) / "tasks.json"
if not tasks_file.exists():
return []
with open(tasks_file) as f:
return json.load(f)
def get_tasks_by_status(status: str) -> list[dict]:
tasks = get_kanban_tasks()
return [t for t in tasks if t.get("status") == status]
# Usage
executing = get_tasks_by_status("executing")
completed = get_tasks_by_status("completed")
print(f"In progress: {len(executing)}, Done: {len(completed)}")
import json
from pathlib import Path
from datetime import datetime, timezone
VALID_TRANSITIONS = {
"pending": ["planning"],
"planning": ["reviewing", "pending"],
"reviewing": ["dispatching", "planning"],
"dispatching": ["executing"],
"executing": ["completed", "failed"],
"completed": [],
"failed": ["pending"],
}
def update_task_status(task_id: str, new_status: str, data_dir: str = "data") -> bool:
"""Update task status with state machine validation."""
tasks_file = Path(data_dir) / "tasks.json"
tasks = json.loads(tasks_file.read_text())
task = next((t for t in tasks if t["id"] == task_id), None)
if not task:
raise ValueError(f"Task {task_id} not found")
current = task["status"]
allowed = VALID_TRANSITIONS.get(current, [])
if new_status not in allowed:
raise ValueError(
f"Invalid transition: {current} → {new_status}. "
f"Allowed: {allowed}"
)
task["status"] = new_status
task["updated_at"] = datetime.now(timezone.utc).isoformat()
task.setdefault("history", []).append({
"from": current,
"to": new_status,
"timestamp": task["updated_at"]
})
tasks_file.write_text(json.dumps(tasks, ensure_ascii=False, indent=2))
return True
import urllib.request
import json
BASE_URL = "http://127.0.0.1:7891/api"
def api_get(endpoint: str) -> dict:
with urllib.request.urlopen(f"{BASE_URL}{endpoint}") as resp:
return json.loads(resp.read())
def api_post(endpoint: str, data: dict) -> dict:
payload = json.dumps(data).encode()
req = urllib.request.Request(
f"{BASE_URL}{endpoint}",
data=payload,
headers={"Content-Type": "application/json"},
method="POST"
)
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read())
# Read dashboard data
tasks = api_get("/tasks")
agents = api_get("/agents")
sessions = api_get("/sessions")
news = api_get("/news")
# Trigger task action
api_post("/tasks/pause", {"task_id": "task-123"})
api_post("/tasks/cancel", {"task_id": "task-123"})
api_post("/tasks/resume", {"task_id": "task-123"})
# Switch model for an agent
api_post("/agents/model", {
"agent": "zhongshu",
"model": "gpt-4o-2024-11-20"
})
import json
from pathlib import Path
from datetime import datetime, timezone, timedelta
def check_agent_health(data_dir: str = "data") -> dict[str, str]:
"""
Returns health status for each agent.
🟢 active = heartbeat within 2 min
🟡 stale = heartbeat 2-10 min ago
🔴 offline = heartbeat >10 min ago or missing
"""
heartbeats_file = Path(data_dir) / "heartbeats.json"
if not heartbeats_file.exists():
return {}
heartbeats = json.loads(heartbeats_file.read_text())
now = datetime.now(timezone.utc)
status = {}
for agent, last_beat in heartbeats.items():
last = datetime.fromisoformat(last_beat)
delta = now - last
if delta < timedelta(minutes=2):
status[agent] = "🟢 active"
elif delta < timedelta(minutes=10):
status[agent] = "🟡 stale"
else:
status[agent] = "🔴 offline"
return status
# Usage
health = check_agent_health()
for agent, s in health.items():
print(f"{agent:12} {s}")
<!-- ~/.openclaw/workspaces/gongbu/SOUL.md -->
# 工部尚书 · Minister of Works
## Role
You are the Minister of Works (工部). You handle all technical,
engineering, and infrastructure tasks assigned by Shangshu Province.
## Rules
1. Always break technical tasks into concrete, verifiable steps
2. Return structured results: { "status": "...", "output": "...", "artifacts": [] }
3. Flag blockers immediately — do not silently fail
4. Estimate complexity: S/M/L/XL before starting
## Output Format
Always respond with valid JSON. Include a `summary` field ≤ 50 chars
for kanban display.
| Panel | URL Fragment | Key Features |
|---|---|---|
| Kanban | #kanban | Task columns, heartbeat badges, filter/search, pause/cancel/resume |
| Monitor | #monitor | Agent health cards, task distribution charts |
| Memorials | #memorials | Completed task archive, 5-stage timeline, Markdown export |
| Templates | #templates | 9 preset edict templates with parameter forms |
| Officials | #officials |
# Shangshu dispatches to multiple ministries simultaneously
# Each ministry works independently; shangshu aggregates results
edict = "竞品分析:研究TOP3竞争对手的产品、定价、市场策略"
# Zhongshu splits into subtasks:
# hubu → pricing analysis
# libu → market communication analysis
# bingbu → competitive strategy analysis
# gongbu → technical feature comparison
# All execute in parallel; shangshu waits for all 4, then aggregates
# If menxia rejects zhongshu's plan:
# menxia → zhongshu: "子任务拆解不完整,缺少风险评估维度,请补充"
# zhongshu revises and resubmits to menxia
# Loop continues until menxia approves
# Max iterations configurable in openclaw.json: "max_review_cycles": 3
# scripts/fetch_news.py → data/news.json → dashboard #news panel
# Optional Feishu push:
import os, json, urllib.request
def push_to_feishu(summary: str):
webhook = os.environ["FEISHU_WEBHOOK_URL"]
payload = json.dumps({
"msg_type": "text",
"content": {"text": f"📰 天下要闻\n{summary}"}
}).encode()
req = urllib.request.Request(
webhook, data=payload,
headers={"Content-Type": "application/json"}
)
urllib.request.urlopen(req)
exec format error in Docker# Force platform on x86/amd64
docker run --platform linux/amd64 -p 7891:7891 cft0808/sansheng-demo
# Ensure sessions visibility is set to "all"
openclaw config set sessions.visibility all
openclaw gateway restart
# Or re-run install.sh — it sets this automatically
./install.sh
# Re-run install after configuring key on first agent
openclaw agents add taizi # configure key here
./install.sh # propagates to all agents
# Ensure run_loop.sh is running
bash scripts/run_loop.sh
# Or trigger manual refresh
python3 scripts/sync_officials.py
python3 scripts/kanban_update.py
# Requires Node.js 18+
cd dashboard/frontend
npm install && npm run build
# server.py will then serve the built assets
# kanban_update.py enforces the state machine
# Check current status before updating:
tasks = get_kanban_tasks()
task = next(t for t in tasks if t["id"] == "your-task-id")
print(f"Current: {task['status']}")
print(f"Allowed next: {VALID_TRANSITIONS[task['status']]}")
# After editing openclaw.json models section
openclaw gateway restart
# Wait ~5 seconds for agents to reconnect
edict/
├── install.sh # One-command setup
├── openclaw.json # Agent registry + permissions + model config
├── scripts/
│ ├── run_loop.sh # Continuous data refresh daemon
│ ├── kanban_update.py # State machine enforcement
│ ├── sync_officials.py # Agent stats aggregation
│ └── fetch_news.py # News aggregation
├── dashboard/
│ ├── server.py # stdlib-only HTTP + WebSocket server (port 7891)
│ ├── dashboard.html # Fallback single-file dashboard
│ └── frontend/ # React 18 source (builds to server.py assets)
├── data/ # Shared data (symlinked into all workspaces)
│ ├── tasks.json
│ ├── heartbeats.json
│ ├── news.json
│ └── officials.json
├── workspaces/ # Per-agent workspace roots
│ ├── taizi/SOUL.md
│ ├── zhongshu/SOUL.md
│ └── ...
└── docs/
├── task-dispatch-architecture.md
└── getting-started.md
Weekly Installs
341
Repository
GitHub Stars
10
First Seen
7 days ago
Security Audits
Gen Agent Trust HubFailSocketWarnSnykWarn
Installed on
kimi-cli340
gemini-cli340
amp340
cline340
github-copilot340
codex340
AI Elements:基于shadcn/ui的AI原生应用组件库,快速构建对话界面
56,200 周安装
主动研究工具:使用Actionbook Browser智能分析主题、论文并生成HTML报告
1,200 周安装
Flutter自适应UI开发指南:三步构建响应式布局,适配手机平板桌面
1,300 周安装
Post Bridge 社交增长教练:30天TikTok/Instagram有机增长系统,无需付费广告
1,300 周安装
Figma设计系统规则生成指南 - 为AI编码代理定制项目规则
1,300 周安装
skill-lookup:Claude技能搜索与安装工具,支持按类别标签过滤,快速集成AI助手功能
1,300 周安装
GitHub Issue 分类自动化工具 - 流式架构实现高效问题管理与分析
1,300 周安装
| Finance, data analysis tasks |
libu | 礼部 Ministry of Rites | Communication, documentation tasks |
bingbu | 兵部 Ministry of War | Strategy, security tasks |
xingbu | 刑部 Ministry of Justice | Review, compliance tasks |
gongbu | 工部 Ministry of Works | Engineering, technical tasks |
libu2 | 吏部 Ministry of Personnel | HR, agent management tasks |
zaochao | 早朝官 | Morning briefing aggregator |
| Token usage ranking, activity stats |
| News | #news | Daily tech/finance briefing, Feishu push |
| Models | #models | Per-agent LLM switcher (hot reload ~5s) |
| Skills | #skills | View/add agent skills |
| Sessions | #sessions | Live OC-* session monitor |
| Court | #court | Multi-agent discussion around a topic |