[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"post-v2-\u002Fblog\u002Fhermes-to-deploy":3},{"id":4,"title":5,"body":6,"date":980,"description":981,"draft":982,"extension":983,"meta":984,"navigation":721,"path":986,"seo":987,"stem":988,"tags":989,"__hash__":996},"blog\u002Fblog\u002Fhermes-to-deploy.md","从 QQ 消息到网站上线：Hermes 多 Agent 全流程实战",{"type":7,"value":8,"toc":955},"minimark",[9,13,20,32,35,40,51,56,122,129,134,136,140,145,151,184,188,195,201,207,211,214,220,224,227,253,301,305,308,378,384,388,391,393,397,400,470,473,487,493,497,500,502,506,509,515,518,524,527,533,535,539,543,550,560,568,577,581,584,589,595,600,616,621,665,670,828,833,840,864,868,875,877,881,884,890,895,897,901,907,910,936,939,941,951],[10,11,5],"h1",{"id":12},"从-qq-消息到网站上线hermes-多-agent-全流程实战",[14,15,16],"blockquote",{},[17,18,19],"p",{},"你在 QQ 上说一句话，几分钟后网站预览就上线了。中间发生了什么？",[17,21,22,23,27,28,31],{},"这是我用 ",[24,25,26],"strong",{},"Hermes Agent"," 搭建个人网站的完整过程。不是\"AI 帮你写代码\"那么简单——真正有意思的是那条",[24,29,30],{},"从聊天消息到生产部署的全自动流水线","。",[33,34],"hr",{},[36,37,39],"h2",{"id":38},"一架构全景","一、架构全景",[41,42,47],"pre",{"className":43,"code":45,"language":46},[44],"language-text","QQ 消息\n  │\n  ▼\nHermes (DeepSeek)          ← 你的主对话 Agent\n  │\n  ├─ Manager Profile          ← 项目经理，拆任务、派活\n  │     │\n  │     ▼\n  │   Kanban (SQLite)         ← 任务板，持久化，多 Worker 抢任务\n  │     │\n  │     ├─ Designer           ← 出效果图（SVG → v1 → v2 → v3 → v4）\n  │     ├─ Coder              ← 写代码\n  │     ├─ FullStack          ← 前后端串\n  │     ├─ Reviewer           ← 代码审查\n  │     ├─ Ops                ← SSH 部署到腾讯云\n  │     └─ ...\n  │\n  ├─ Cron Jobs ×5             ← 财经舆情监控，定时抓取+邮件推送\n  │\n  └─ QQ Gateway               ← 双向消息（你发 → Agent 收，Agent 完成 → 通知你）\n","text",[48,49,45],"code",{"__ignoreMap":50},"",[17,52,53],{},[24,54,55],{},"关键角色：",[57,58,59,75],"table",{},[60,61,62],"thead",{},[63,64,65,69,72],"tr",{},[66,67,68],"th",{},"角色",[66,70,71],{},"模型",[66,73,74],{},"干什么",[76,77,78,90,100,111],"tbody",{},[63,79,80,84,87],{},[81,82,83],"td",{},"你对话的 Agent",[81,85,86],{},"DeepSeek",[81,88,89],{},"理解需求，转给 Manager",[63,91,92,95,97],{},[81,93,94],{},"Manager",[81,96,86],{},[81,98,99],{},"拆任务，分配 Worker，跟踪进度",[63,101,102,105,108],{},[81,103,104],{},"9 个 Worker",[81,106,107],{},"MiniMax",[81,109,110],{},"各自领域的专家，抢任务干活",[63,112,113,116,119],{},[81,114,115],{},"Kanban Dispatcher",[81,117,118],{},"Gateway 内置",[81,120,121],{},"自动调度，Worker 完成了就派下一个",[123,124],"iframe",{"src":125,"width":126,"height":127,"style":128},"https:\u002F\u002Fdeeeli.com\u002Fpreview\u002Fimages\u002Fdiagrams\u002Fhermes-architecture.html","100%",500,"border:1px solid #1e293b;border-radius:8px;margin:1rem 0;",[130,131,133],"small",{"style":132},"color:#64748b;","▲ 全流程架构：从 QQ 消息到部署上线的完整链路",[33,135],{},[36,137,139],{"id":138},"二一条消息的旅程","二、一条消息的旅程",[141,142,144],"h3",{"id":143},"第-1-步你在-qq-说帮我开发个人网站","第 1 步：你在 QQ 说\"帮我开发个人网站\"",[17,146,147,148,31],{},"消息通过 QQ Bot Gateway 进入 Hermes。Agent 没有直接写代码——它把需求拆解，",[24,149,150],{},"创建了一条 Kanban 任务，分配给 Manager",[41,152,156],{"className":153,"code":154,"language":155,"meta":50,"style":50},"language-bash shiki shiki-themes github-light github-dark","hermes kanban create \"全功能个人品牌站开发\" --assignee manager\n","bash",[48,157,158],{"__ignoreMap":50},[159,160,163,167,171,174,177,181],"span",{"class":161,"line":162},"line",1,[159,164,166],{"class":165},"sScJk","hermes",[159,168,170],{"class":169},"sZZnC"," kanban",[159,172,173],{"class":169}," create",[159,175,176],{"class":169}," \"全功能个人品牌站开发\"",[159,178,180],{"class":179},"sj4cs"," --assignee",[159,182,183],{"class":169}," manager\n",[141,185,187],{"id":186},"第-2-步manager-拆解流水线","第 2 步：Manager 拆解流水线",[17,189,190,191,194],{},"Manager 按照内置的",[24,192,193],{},"标准 7 阶段流水线","（Pipeline）拆解：",[41,196,199],{"className":197,"code":198,"language":46},[44],"阶段 1: ProductManager → 需求分析，出 PRD\n阶段 2: Architect     → 技术选型，Nuxt + Tailwind + PostgreSQL\n阶段 2.5: Designer    → 效果图（v1→v2→v3→v4）\n阶段 2.6: Reviewer    → 审查方案\n阶段 3: Coder\u002FFullStack → 并行开发\n阶段 4: Reviewer      → 代码审查\n阶段 5: Tester        → 测试\n阶段 6: Ops           → 部署上线\n",[48,200,198],{"__ignoreMap":50},[17,202,203,204],{},"每一步都是一个独立的 Kanban 任务，有依赖关系，有门禁条件。",[24,205,206],{},"Manager 只管分配，不写一行代码。",[141,208,210],{"id":209},"第-3-步worker-抢任务干活","第 3 步：Worker 抢任务干活",[17,212,213],{},"Dispatcher（调度器）发现 ready 状态的任务，匹配对应 Profile 的 Worker，自动启动。",[41,215,218],{"className":216,"code":217,"language":46},[44],"Dispatcher: t_014efa5b 状态=ready, assignee=designer → 启动 designer profile\nDesigner:   读取任务描述 → 出 SVG 效果图 → 保存到 docs\u002F → 标记完成\nDispatcher: 发现下一个任务 → 继续...\n",[48,219,217],{"__ignoreMap":50},[141,221,223],{"id":222},"第-4-步部署到腾讯云","第 4 步：部署到腾讯云",[17,225,226],{},"Ops Worker 拿到部署任务后：",[228,229,230,234,241,247,250],"ol",{},[231,232,233],"li",{},"读取本地 HTML 设计文件",[231,235,236,237,240],{},"通过 ",[24,238,239],{},"paramiko"," SSH 连接到腾讯云香港 CentOS 7",[231,242,243,244],{},"SFTP 上传到 ",[48,245,246],{},"\u002Fvar\u002Fwww\u002Fpreview\u002F",[231,248,249],{},"验证 HTTP 200",[231,251,252],{},"标记任务完成",[41,254,258],{"className":255,"code":256,"language":257,"meta":50,"style":50},"language-python shiki shiki-themes github-light github-dark","# ops worker 实际使用的部署脚本片段\nssh = paramiko.SSHClient()\nssh.connect(host, port=22, username='root', password=password)\nsftp = ssh.open_sftp()\nsftp.put(local_path, remote_path)\n# 验证\nstdin, stdout, stderr = ssh.exec_command(f'curl -s -o \u002Fdev\u002Fnull -w \"%{{http_code}}\" {url}')\n","python",[48,259,260,265,271,277,283,289,295],{"__ignoreMap":50},[159,261,262],{"class":161,"line":162},[159,263,264],{},"# ops worker 实际使用的部署脚本片段\n",[159,266,268],{"class":161,"line":267},2,[159,269,270],{},"ssh = paramiko.SSHClient()\n",[159,272,274],{"class":161,"line":273},3,[159,275,276],{},"ssh.connect(host, port=22, username='root', password=password)\n",[159,278,280],{"class":161,"line":279},4,[159,281,282],{},"sftp = ssh.open_sftp()\n",[159,284,286],{"class":161,"line":285},5,[159,287,288],{},"sftp.put(local_path, remote_path)\n",[159,290,292],{"class":161,"line":291},6,[159,293,294],{},"# 验证\n",[159,296,298],{"class":161,"line":297},7,[159,299,300],{},"stdin, stdout, stderr = ssh.exec_command(f'curl -s -o \u002Fdev\u002Fnull -w \"%{{http_code}}\" {url}')\n",[141,302,304],{"id":303},"第-5-步通知你","第 5 步：通知你",[17,306,307],{},"最初这是个痛点——Worker 干完了没人通知。后来我们打通了 Kanban 原生通知：",[41,309,311],{"className":153,"code":310,"language":155,"meta":50,"style":50},"# Manager 每创建一个任务，就帮你订阅通知\nhermes kanban notify-subscribe \\\n  --platform qqbot \\\n  --chat-id [QQ会话ID] \\\n  --notifier-profile default \\\n  \u003Ctask_id>\n",[48,312,313,319,331,341,353,363],{"__ignoreMap":50},[159,314,315],{"class":161,"line":162},[159,316,318],{"class":317},"sJ8bj","# Manager 每创建一个任务，就帮你订阅通知\n",[159,320,321,323,325,328],{"class":161,"line":267},[159,322,166],{"class":165},[159,324,170],{"class":169},[159,326,327],{"class":169}," notify-subscribe",[159,329,330],{"class":179}," \\\n",[159,332,333,336,339],{"class":161,"line":273},[159,334,335],{"class":179},"  --platform",[159,337,338],{"class":169}," qqbot",[159,340,330],{"class":179},[159,342,343,346,350],{"class":161,"line":279},[159,344,345],{"class":179},"  --chat-id",[159,347,349],{"class":348},"sVt8B"," [QQ会话ID] ",[159,351,352],{"class":179},"\\\n",[159,354,355,358,361],{"class":161,"line":285},[159,356,357],{"class":165},"  --notifier-profile",[159,359,360],{"class":169}," default",[159,362,330],{"class":179},[159,364,365,369,372,375],{"class":161,"line":291},[159,366,368],{"class":367},"szBVR","  \u003C",[159,370,371],{"class":169},"task_i",[159,373,374],{"class":348},"d",[159,376,377],{"class":367},">\n",[17,379,380,381],{},"任务完成\u002F阻塞\u002F崩溃 → Gateway 自动推送到你的 QQ。",[24,382,383],{},"不需要 cron，不依赖轮询。",[123,385],{"src":386,"width":126,"height":387,"style":128},"https:\u002F\u002Fdeeeli.com\u002Fpreview\u002Fimages\u002Fdiagrams\u002Fnotification-loop.html",400,[130,389,390],{"style":132},"▲ 通知闭环：Manager 订阅 → Worker 完成 → Kanban 事件 → Gateway → QQ",[33,392],{},[36,394,396],{"id":395},"三设计迭代v1-v4","三、设计迭代：v1 → v4",[17,398,399],{},"设计是最能体现多 Agent 价值的环节。用户不需要懂设计，只需给方向。",[57,401,402,418],{},[60,403,404],{},[63,405,406,409,412,415],{},[66,407,408],{},"版本",[66,410,411],{},"Worker",[66,413,414],{},"技术",[66,416,417],{},"耗时",[76,419,420,434,446,458],{},[63,421,422,425,428,431],{},[81,423,424],{},"v1",[81,426,427],{},"Designer",[81,429,430],{},"SVG 矢量效果图",[81,432,433],{},"2 min",[63,435,436,439,441,444],{},[81,437,438],{},"v2",[81,440,427],{},[81,442,443],{},"增强层次感",[81,445,433],{},[63,447,448,451,453,456],{},[81,449,450],{},"v3",[81,452,427],{},[81,454,455],{},"HTML\u002FCSS 真实渲染",[81,457,433],{},[63,459,460,463,465,468],{},[81,461,462],{},"v4",[81,464,427],{},[81,466,467],{},"Three.js 3D + Canvas 神经网络",[81,469,433],{},[17,471,472],{},"每次迭代：",[228,474,475,478,481,484],{},[231,476,477],{},"Designer 出图",[231,479,480],{},"Manager 审查",[231,482,483],{},"用户确认（或给出反馈：\"不够科幻\" → \"要3D\" → \"加神经网络\"）",[231,485,486],{},"下一版开始",[17,488,489,492],{},[24,490,491],{},"4 个版本累计不到 10 分钟","，从 SVG 草图进化到 Three.js 3D 粒子场景。",[123,494],{"src":495,"width":126,"height":496,"style":128},"https:\u002F\u002Fdeeeli.com\u002Fpreview\u002Fimages\u002Fdiagrams\u002Fdesign-iteration.html",450,[130,498,499],{"style":132},"▲ 设计迭代时间线：v1 SVG → v2 增强 → v3 HTML → v4 Three.js 3D",[33,501],{},[36,503,505],{"id":504},"四技术栈","四、技术栈",[141,507,508],{"id":508},"网站本身",[41,510,513],{"className":511,"code":512,"language":46},[44],"Nuxt + Vue\nTailwind CSS + Nuxt UI\n@nuxt\u002Fcontent (Markdown 博客)\nPostgreSQL (内容存储)\nDocker (容器化运行)\n",[48,514,512],{"__ignoreMap":50},[141,516,517],{"id":517},"部署架构",[41,519,522],{"className":520,"code":521,"language":46},[44],"腾讯云香港 CentOS 7\n├─ Nginx (80\u002F443, 反向代理 + SSL)\n├─ Git (自建代码仓库)\n├─ \u002Fvar\u002Fwww\u002Fpreview\u002F (设计预览)\n├─ \u002Fvar\u002Fwww\u002Fproduction\u002F (生产环境)\n└─ Docker (可选，容器化运行)\n",[48,523,521],{"__ignoreMap":50},[141,525,526],{"id":526},"自动化",[41,528,531],{"className":529,"code":530,"language":46},[44],"Hermes Agent (主控)\n├─ QQ Bot Gateway (消息双向通道)\n├─ Kanban + 9 Worker Profiles (任务协作)\n├─ Cron ×5 (财经舆情监控)\n├─ 邮件 SMTP (QQ 邮箱)\n└─ Paramiko (SSH 部署)\n",[48,532,530],{"__ignoreMap":50},[33,534],{},[36,536,538],{"id":537},"五几个有趣的坑","五、几个有趣的坑",[141,540,542],{"id":541},"坑-1ssh-22-端口被防火墙挡了","坑 1：SSH 22 端口被防火墙挡了",[17,544,545,546,549],{},"本地 ",[48,547,548],{},"ssh root@[服务器IP]"," 死活不通。排查发现是腾讯云安全组没放行。",[17,551,552,555,556,559],{},[24,553,554],{},"解决："," 走 ",[24,557,558],{},"OrcaTerm 网页终端","作为跳板，或者让用户在 FinalShell 上手动跑一次性命令。后来配好安全组后 Ops Worker 可以直接 SSH。",[141,561,563,564,567],{"id":562},"坑-2windows-cron-里-python3-不存在","坑 2：Windows cron 里 ",[48,565,566],{},"python3"," 不存在",[17,569,570,571,573,574,576],{},"Git Bash 环境下只有 ",[48,572,257],{},"，脚本里写 ",[48,575,566],{}," 直接 command not found。cron prompt 里所有路径必须用绝对路径。",[141,578,580],{"id":579},"git-代码提交与维护流程","Git 代码提交与维护流程",[17,582,583],{},"多 Agent 协作开发的核心基础设施是 Git。我们采用自托管的 Git 服务作为代码仓库，所有 Worker 的代码产出都通过标准 Git 工作流管理。",[17,585,586],{},[24,587,588],{},"日常流程：",[41,590,593],{"className":591,"code":592,"language":46},[44],"开发者本地 (D:\\work\\personal\\personal-website)\n  │\n  ├─ git add \u002F commit         ← Worker 产出代码后提交\n  ├─ git push origin main     ← 推送到远程仓库（代码备份 + 版本追溯）\n  │\n  ▼\n远程 Git 仓库 (腾讯云服务器)\n  │\n  ├─ Ops Worker git pull      ← 部署前拉取最新代码\n  │\n  ▼\n本地 Docker 构建\n  ├─ docker build -t website:latest .        ← 本地编译镜像\n  ├─ docker save website:latest | gzip > website.tar.gz  ← 打包\n  │\n  ▼\nSFTP 上传到服务器 \u002Ftmp\u002F\n  ├─ sftp.put('website.tar.gz', '\u002Ftmp\u002F')\n  │\n  ▼\n服务器端\n  ├─ docker load \u003C \u002Ftmp\u002Fwebsite.tar.gz       ← 加载镜像\n  ├─ docker compose up -d                    ← 更新容器\n  ├─ nginx -s reload                         ← 热重载\n  │\n  ▼\n生产环境 (deeeli.com)\n",[48,594,592],{"__ignoreMap":50},[17,596,597],{},[24,598,599],{},"为什么本地构建而非服务器构建？",[601,602,603,606,609],"ul",{},[231,604,605],{},"服务器 CentOS 7 环境老旧，编译原生模块（如 Node.js addon）容易失败",[231,607,608],{},"本地 Docker 环境与目标一致，构建一次到处运行",[231,610,611,612,615],{},"服务器只需 ",[48,613,614],{},"docker load","，不装完整编译链",[17,617,618],{},[24,619,620],{},"分支策略：",[57,622,623,633],{},[60,624,625],{},[63,626,627,630],{},[66,628,629],{},"分支",[66,631,632],{},"用途",[76,634,635,645,655],{},[63,636,637,642],{},[81,638,639],{},[48,640,641],{},"main",[81,643,644],{},"生产就绪代码，Ops 直接从 main 拉取部署",[63,646,647,652],{},[81,648,649],{},[48,650,651],{},"feature\u002F*",[81,653,654],{},"新功能开发分支，由 Manager 创建任务时指定",[63,656,657,662],{},[81,658,659],{},[48,660,661],{},"fix\u002F*",[81,663,664],{},"Bug 修复分支，完成后合并回 main",[17,666,667],{},[24,668,669],{},"实际命令流：",[41,671,673],{"className":153,"code":672,"language":155,"meta":50,"style":50},"# Worker 完成任务后提交\ngit add docs\u002Fsci-fi-home-v4.html\ngit commit -m \"designer: v4 3D交互效果图\"\ngit push origin main\n\n# 部署：本地构建 → 上传 → 服务器加载\ndocker build -t website:latest .\ndocker save website:latest | gzip > website.tar.gz\nsftp root@server \u003C\u003C\u003C \"put website.tar.gz \u002Ftmp\u002F\"\n\n# 服务器端\nssh root@server \"\n  docker load \u003C \u002Ftmp\u002Fwebsite.tar.gz &&\n  cd \u002Fapp && docker compose up -d &&\n  nginx -s reload\n\"\n",[48,674,675,680,691,704,717,723,728,745,767,782,787,793,804,810,816,822],{"__ignoreMap":50},[159,676,677],{"class":161,"line":162},[159,678,679],{"class":317},"# Worker 完成任务后提交\n",[159,681,682,685,688],{"class":161,"line":267},[159,683,684],{"class":165},"git",[159,686,687],{"class":169}," add",[159,689,690],{"class":169}," docs\u002Fsci-fi-home-v4.html\n",[159,692,693,695,698,701],{"class":161,"line":273},[159,694,684],{"class":165},[159,696,697],{"class":169}," commit",[159,699,700],{"class":179}," -m",[159,702,703],{"class":169}," \"designer: v4 3D交互效果图\"\n",[159,705,706,708,711,714],{"class":161,"line":279},[159,707,684],{"class":165},[159,709,710],{"class":169}," push",[159,712,713],{"class":169}," origin",[159,715,716],{"class":169}," main\n",[159,718,719],{"class":161,"line":285},[159,720,722],{"emptyLinePlaceholder":721},true,"\n",[159,724,725],{"class":161,"line":291},[159,726,727],{"class":317},"# 部署：本地构建 → 上传 → 服务器加载\n",[159,729,730,733,736,739,742],{"class":161,"line":297},[159,731,732],{"class":165},"docker",[159,734,735],{"class":169}," build",[159,737,738],{"class":179}," -t",[159,740,741],{"class":169}," website:latest",[159,743,744],{"class":169}," .\n",[159,746,748,750,753,755,758,761,764],{"class":161,"line":747},8,[159,749,732],{"class":165},[159,751,752],{"class":169}," save",[159,754,741],{"class":169},[159,756,757],{"class":367}," |",[159,759,760],{"class":165}," gzip",[159,762,763],{"class":367}," >",[159,765,766],{"class":169}," website.tar.gz\n",[159,768,770,773,776,779],{"class":161,"line":769},9,[159,771,772],{"class":165},"sftp",[159,774,775],{"class":169}," root@server",[159,777,778],{"class":367}," \u003C\u003C\u003C",[159,780,781],{"class":169}," \"put website.tar.gz \u002Ftmp\u002F\"\n",[159,783,785],{"class":161,"line":784},10,[159,786,722],{"emptyLinePlaceholder":721},[159,788,790],{"class":161,"line":789},11,[159,791,792],{"class":317},"# 服务器端\n",[159,794,796,799,801],{"class":161,"line":795},12,[159,797,798],{"class":165},"ssh",[159,800,775],{"class":169},[159,802,803],{"class":169}," \"\n",[159,805,807],{"class":161,"line":806},13,[159,808,809],{"class":169},"  docker load \u003C \u002Ftmp\u002Fwebsite.tar.gz &&\n",[159,811,813],{"class":161,"line":812},14,[159,814,815],{"class":169},"  cd \u002Fapp && docker compose up -d &&\n",[159,817,819],{"class":161,"line":818},15,[159,820,821],{"class":169},"  nginx -s reload\n",[159,823,825],{"class":161,"line":824},16,[159,826,827],{"class":169},"\"\n",[17,829,830],{},[24,831,832],{},"Git 与 Kanban 的配合：",[17,834,835,836,839],{},"每个 Kanban 任务完成后，Worker 将产出文件通过 Git push 到远程仓库。下游 Worker（如 Reviewer、Ops）通过 ",[48,837,838],{},"git pull"," 获取最新代码。整个过程中：",[601,841,842,848,858],{},[231,843,844,847],{},[24,845,846],{},"代码版本可追溯","：每次改动都有 commit 记录",[231,849,850,853,854,857],{},[24,851,852],{},"回滚无压力","：",[48,855,856],{},"git revert"," 一键回退",[231,859,860,863],{},[24,861,862],{},"并行开发不冲突","：不同 Worker 操作不同文件（designer 改 docs\u002F，coder 改 app\u002F），天然隔离",[141,865,867],{"id":866},"坑-4任务完成了没人通知","坑 4：任务完成了没人通知",[17,869,870,871,874],{},"前面说过了——这是推动我们实现 ",[48,872,873],{},"notify-subscribe"," 的原因。现在 Manager 创建任务时自动订阅，用户 QQ 实时收到推送。",[33,876],{},[36,878,880],{"id":879},"六效果","六、效果",[17,882,883],{},"从 QQ 发一条消息到看到预览，完整链路：",[41,885,888],{"className":886,"code":887,"language":46},[44],"\"设计要有科技感\" \n  → Manager 拆任务 (5s)\n  → Designer 出 v4 效果图 (2min) \n  → Manager 审查 (10s)\n  → Ops SSH 上传到服务器 (15s)\n  → QQ 通知 \"预览已上线: http:\u002F\u002F[服务器]\u002Fpreview\u002F\"\n",[48,889,887],{"__ignoreMap":50},[17,891,892],{},[24,893,894],{},"全自动，零手动操作，2-3 分钟端到端。",[33,896],{},[36,898,900],{"id":899},"七总结","七、总结",[17,902,903,904,31],{},"这不是\"AI 帮你写了个网站\"——这是",[24,905,906],{},"建了一条从聊天到部署的装配线",[17,908,909],{},"核心思想：",[228,911,912,918,924,930],{},[231,913,914,917],{},[24,915,916],{},"Manager 只管不管干","——拆任务、派活、跟踪，不写代码",[231,919,920,923],{},[24,921,922],{},"Worker 各司其职","——Designer 出图、Coder 写码、Ops 部署，互不干扰",[231,925,926,929],{},[24,927,928],{},"Kanban 是共享工作台","——所有 Agent 看同一块板子，任务状态一目了然",[231,931,932,935],{},[24,933,934],{},"通知闭环","——Worker 干完了你马上知道，不用手动查",[17,937,938],{},"下一步：把 Manager 的流水线模板化，让\"开发网站\"和\"写爬虫\"共用同一套调度逻辑。",[33,940],{},[17,942,943],{},[944,945,946,947,950],"em",{},"本文由 Hermes Agent 根据实际开发过程记录撰写，陈德立署名发布。所有 Kanban 任务日志可在 ",[48,948,949],{},"hermes kanban log"," 中回溯。",[952,953,954],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":50,"searchDepth":267,"depth":267,"links":956},[957,958,965,966,971,978,979],{"id":38,"depth":267,"text":39},{"id":138,"depth":267,"text":139,"children":959},[960,961,962,963,964],{"id":143,"depth":273,"text":144},{"id":186,"depth":273,"text":187},{"id":209,"depth":273,"text":210},{"id":222,"depth":273,"text":223},{"id":303,"depth":273,"text":304},{"id":395,"depth":267,"text":396},{"id":504,"depth":267,"text":505,"children":967},[968,969,970],{"id":508,"depth":273,"text":508},{"id":517,"depth":273,"text":517},{"id":526,"depth":273,"text":526},{"id":537,"depth":267,"text":538,"children":972},[973,974,976,977],{"id":541,"depth":273,"text":542},{"id":562,"depth":273,"text":975},"坑 2：Windows cron 里 python3 不存在",{"id":579,"depth":273,"text":580},{"id":866,"depth":273,"text":867},{"id":879,"depth":267,"text":880},{"id":899,"depth":267,"text":900},"2026-05-27","记录个人网站从 QQ 聊天出发，经 Manager-Kanban-Worker 多 Agent 协作，到部署上线并建立通知闭环的完整技术链路。",false,"md",{"author":985},"陈德立","\u002Fblog\u002Fhermes-to-deploy",{"title":5,"description":981},"blog\u002Fhermes-to-deploy",[166,990,991,992,993,994,995],"ai-agent","kanban","multi-agent","devops","nuxt","workflow","aMdixpec3YsWhz-NuzJuGYPlpq9DYpRL3Y44_zOLJyo"]