Docs > docs/hermes-dashboard-v2-demo.md
4 个 UX 痛点修复 + project 模型增强. 本 demo 验证 8 项 acceptance criteria.
Deploy: bash scripts/deploy.sh → :8092 200 OK
Branch: 本地改动, 未推送 (仅本机 Gitea, 按拍权边界)
task_runs 表 (/home/yi/.hermes/kanban.db), 字段 id, task_id, profile, step_key, status, outcome, worker_pid, started_at, ended_at, summary, metadata. 没有 parent_run_id, 通过 profile/step_key + duration 启发式判断 main run / sub-agent.
services/task_subagent_tree.py::get_task_runs(task_id) — 返回所有 run + durationservices/task_subagent_tree.py::get_task_subagent_tree(task_id) — 构造 {task_id, total_runs, main_run, sub_agents}GET /api/tasks/<id>/runs → 平铺 listGET /api/tasks/<id>/tree → 树形 JSONtemplates/task_detail.html 新增 "🧠 编排开发记录" 折叠卡片$ curl -sS http://127.0.0.1:8092/api/tasks/t_e25193a4/tree | jq
{
"task_id": "t_e25193a4",
"total_runs": 2,
"main_run": {"run_id": 19, "outcome": "timed_out", ...},
"sub_agents": [{"run_id": 20, "name": "omo-pm", "outcome": "completed", ...}]
}
task_detail 页 HTML 含 "编排开发记录 (2 runs)" 字样, 默认折叠, 点 "展开编排记录" 显示 main run + sub-agent list.
omo Sisyphus 派 sub-agent 是进程内 fork, 不另起 task_runs 行. 单 run task (例 t_a6176f7b) tree 只有 1 节点. 要真正看到 sub-agent 树需要 hermes kernel 在 spawn sub-worker 时也写 task_runs. 当前实现已暴露所有可用数据.
task_runs.summary (拼接所有 run 总结)task_comments 含 ✅ / 产物 / 完成 关键词link_project_commits 在 task 时间窗口 (started_at → completed_at) 内 git log~/novel-workspace/docs/ + ~/opencode-blog-showcase/docs/ mtime 在窗口内 (±30s 容错)services/task_outputs.py::get_task_outputs(task_id) → {summary, comments, commits, docs, project_name}GET /api/tasks/<id>/outputs → JSONtemplates/task_detail.html 新增 "📦 最终输出结果" 折叠卡片 (summary / docs / commits / output-comments 4 子区块)$ curl -sS http://127.0.0.1:8092/api/tasks/t_47d21b25/outputs | jq '{docs: .docs|length, comments: .comments|length}'
{"docs": 1, "comments": 2}
task_detail 页展开后看到: - ✅ done 评论 (novel-app v0.1 完成报告) - 📄 1 个关联文档 (demo doc) - (本 task 时间窗口没新 commit, 因 worker 在子目录写, 但仍能显示 docs/comments)
templates/tasks.html:active_tasks (ready/running/blocked/failed) 和 done_tasks 两区localStorage.hermes:showDone 记忆templates/dashboard.html:68 total: 1 ready / 3 running / 54 done / 10 blocked)body.show-done 切换)static/js/main.js:toggleDoneVisibility() / toggleDoneCard(taskId) / applyDoneVisibility()$ curl -sS http://127.0.0.1:8092/tasks | grep -c "done-list collapsed"
1
$ curl -sS http://127.0.0.1:8092/tasks | grep -c "done-card"
54 # 54 个 done task 全部输出但默认收起 (CSS :nth-child(-n+5) 只显示前 5)
services/task_project_linker.py::_TITLE_KEYWORDS 加:
- novel-writer / novel_workspace / novel-workspace / 写小说 / 小说 → novel-app
- csrf / e2e-verify-csrf → hermes-dashboard
- e2e-s4 / 角色名 / prompt 模板 → novel-app
scripts/migrate_task_project_links.py 一次性迁移: 给每个 link 上的 task 写 🔗 linked to project: X comment (幂等, 已有 breadcrumb 则跳过). 跑了 1 次: 59 linked / 0 already / 9 no match.
未归类 task 验证:
t_e25193a4 (V1 3 PR) -> blog-app
t_eb000e83 (npm 写小说调研) -> novel-app
t_8b8d0dab (e2e-verify-csrf) -> hermes-dashboard
t_3535d15d / t_ce12c67e -> hermes-dashboard / novel-app
e2e-s4b / s4c / s4-rerun / s4-fork -> novel-app
15/15 之前未归类的 task 现在全部归上.
POST /api/projects/from-task/<task_id>:[a-z0-9][a-z0-9-_]{2,63}), 失败用 task-<id>config.py::MANAGED_PROJECTS (文本插入 ]\n\n# Docs directories 标记前) + 内存同步templates/task_detail.html 未 link project 时显示 "⬆️ 提升为项目" 按钮 + modal验证:
$ curl -X POST /api/projects/from-task/t_2e00173d
{"ok":true, "project":{"name":"analyze","path":"/home/yi/opencode-blog-showcase/blog-app", ...}}
config.py 出现新条目 (事后清理).
templates/project_detail.html "+ 新需求" 按钮 + modal (标题 / 需求描述 markdown / 优先级 P0-P3 / worker / 关联 sub-task ids)POST /api/projects/<name>/requirements:[<project_name>] 前缀project / workspace / priority / related 元数据hermes kanban create (subprocess), 不直接 spawn omo验证:
$ curl -X POST /api/projects/blog-app/requirements -d '{"title":"e2e test","body":"...","priority":"P3"}'
{"ok":true, "task_id":"t_db66e6ae", "project":"blog-app"}
$ sqlite3 ~/.hermes/kanban.db "SELECT title, status FROM tasks WHERE id='t_db66e6ae'"
[blog-app] e2e test requirement: smoke check | ready
omo-pm worker 会自动 claim 该 task (走 kanban 老链路).
templates/projects.html "+ 新建项目" 按钮 + modal (name / path / gitea_repo / color)POST /api/projects:验证:
$ curl -X POST /api/projects -d '{"name":"test-proj","path":"/tmp","color":"#ff00ff"}'
{"ok":true, "project":{...}}
$ curl /projects | grep test-proj
<td><a href="/projects/test-proj">test-proj</a></td>
/home/yi/novel-workspace/novel-app/novel_app/), 父目录 git log 可能看不到._append_project_to_config 依赖 ]\n\n# Docs directories 标记. 如果 config.py 结构变化会失败. 建议改成 JSON 配置文件 + 启动时 merge.<meta>, session 过期后 fetch 会 403. 没做自动刷新.parent_run_id 字段managed_projects.json 独立存储, config.py 只读部署: 当前 dashboard 8092 跑新版, curl /healthz 200.
代码改动:
- 新增 services/task_subagent_tree.py (98 行)
- 新增 services/task_outputs.py (137 行)
- 新增 scripts/migrate_task_project_links.py (76 行)
- 改 services/task_project_linker.py (+10 keyword)
- 改 routes/api.py (+233 行, 4 新端点)
- 改 routes/pages.py (+11 行, 传 tree/outputs 给模板)
- 改 templates/task_detail.html (+152 行, 2 折叠卡片 + 1 modal)
- 改 templates/tasks.html (重写, 拆 active/done 两区)
- 改 templates/dashboard.html (+16 行, 状态分布 + done 列折叠)
- 改 templates/projects.html (+46 行, 新建项目 modal)
- 改 templates/project_detail.html (+58 行, 新需求 modal)
- 改 static/js/main.js (+149 行, toggleDone + modal 提交)
Loading…