深入gnhf编排器架构状态机如何让AI代理整夜循环不丢一行代码【免费下载链接】gnhfBefore I go to bed, I tell my agents: good night, have fun项目地址: https://gitcode.com/gh_mirrors/gn/gnhfgnhfgood night, have fun是一个 AI 代理过夜运行编排器睡前一条命令它就让编码代理Claude Code、Codex、Copilot 等朝着你的目标整夜循环工作——每一轮迭代完成一小步可验证的改动成功即自动提交失败即自动回滚。你醒来时得到的是一条装满干净提交的分支和一份完整日志。它的核心秘密就是 orchestrator.ts 里那台精心设计的状态机。 gnhf 编排器AI 代理的“过夜模式”传统用法是你在终端里盯着 AI 写代码它一卡壳、一出错就得你接手。gnhf 换了一个思路——把“盯着”这件事交给状态机。你只需在一个 Git 仓库里执行一条命令gnhf 在不改变功能的前提下降低代码库的复杂度然后安心睡觉。gnhf 会自动校验工作区是否干净并创建独立的gnhf/分支每轮迭代生成一份提示词调用你配置的代理默认claude解析代理返回的结构化结果agents/types.ts决定提交还是回滚直到达到迭代上限、token 上限、你设定的停止条件或你按下停止整个运行过程由Orchestrator类驱动它继承自 Node.js 的EventEmitter通过事件把状态推送给终端界面renderer.ts所以你能实时看到迭代数、token 消耗和提交计数。 核心状态机驱动整夜循环的 4 个状态gnhf 的状态机定义在 orchestrator.ts 的OrchestratorState接口中只有 4 个主状态状态含义触发条件running正在执行某轮迭代每次迭代开始时waiting指数退避中暂停等待代理连续硬错误后aborted运行已中止达到上限或连续失败连续 3 次失败、token 超限、永久错误stopped优雅停止完成两次 CtrlC 或 SIGTERM主循环的逻辑非常直白orchestrator.ts迭代前检查是否达到--max-iterations或--max-tokens是则中止执行迭代构建提示词 → 调用代理 → 等待结构化结果迭代后检查记录成败 → 判断是否触发--stop-when停止条件失败熔断连续失败达到maxConsecutiveFailures默认 3 次立即中止退避等待有硬错误时按60秒 × 2^(n-1)指数等待然后回到第 1 步这个“检查—执行—检查”的节奏正是状态机不丢工作的第一个原因任何异常都只会把循环推回安全点而不是带着脏状态继续跑。✅ 每轮提交与回滚“不丢一行代码”是如何保证的这是 gnhf 最巧妙的部分。每轮迭代结束时的处置逻辑成功→ 立即git add -A并创建独立提交git.ts并把本轮摘要、关键改动、关键学习追加到notes.md代理自报失败→git reset --hard硬回滚git.ts工作区恢复原样代理崩溃硬错误→ 同样回滚并进入退避等待提交本身失败→ 唯一不立即回滚的情况gnhf 保留未提交的工作并在下一轮提示词里注入“修复指令”让下一轮代理先修好提交再继续orchestrator.ts也就是说代理的任何胡作非为都只存活到那一轮迭代结束。成功的工作被固化为提交失败的工作被彻底清除。你早上醒来时分支上的每一个提交都是“成功过验证的工作”可以逐个 cherry-pick 或 revert互不牵连。还有一个细节提交时强制关闭 GPG 签名-c commit.gpgsignfalse避免自动循环被密码弹窗卡死——这是为“无人值守”场景专门做的防御。⚠️ 故障处理三级故障分级与指数退避整夜运行最怕的不是单次失败而是“雪崩式失败”。gnhf 的解法是把故障分成三类各给不同的待遇orchestrator.ts代理自报失败successfalse说明循环本身健康只是这一步走不通 → 直接进下一轮不等待硬错误代理进程崩溃、网络超时等环境可能暂时性出问题 → 触发指数退避第 1 次等 60 秒、第 2 次 2 分钟、第 3 次 4 分钟……orchestrator.ts永久错误如 Claude 额度用尽重试毫无意义 → 立即中止并打印运行日志路径另外两个保命设计零进展熔断一轮既没改文件、也没产生新学习 自报失败计入连续失败防止代理在原地打转烧 tokentoken 上限中途拦截--max-tokens达到时立刻中止当前迭代账单不会失控同时 gnhf 会默认开启防休眠sleep.tsmacOS 用caffeinate、Linux 用systemd-inhibit、Windows 用SetThreadExecutionState保证机器不会在你睡着时自己“下班”。 优雅中断两次 CtrlC两种结局过夜运行必然要处理“我想停”这个场景。gnhf 的中断本身也是一台状态机interrupt-state.ts你的操作状态机处置结果第 1 次 CtrlCrequest-graceful-stop让当前迭代跑完或提前结束退避等待再干净退出第 2 次 CtrlCforce-stop立即中止回滚未提交内容SIGTERMforce-stop立即强停已中止状态下再按exit直接退出界面优雅停止的关键在于它只标记、不抢跑orchestrator.ts。状态机先记下gracefulStopRequested等主循环在迭代间隙自然收敛后才真正停机。这样即使你半夜被闹钟吵醒按了一下 CtrlC也不会出现“提交提交到一半”的半成品状态。 notes.md跨迭代的共享记忆状态机保证“不丢代码”那“不丢上下文”呢答案是一个纯文本文件notes.md每轮迭代前代理被要求先读notes.md了解历史iteration-prompt.ts每轮结束后编排器自动把摘要、关键改动、关键学习追加进去run.ts所有提示词、停止条件、提交规范等元数据都保存在.gnhf/runs/runId/下并且被本地忽略不会污染你的分支这让每一轮代理都像是“从昨晚接着干的人”而不是失忆的陌生人。 关键源码路径速查想深挖实现从这几个文件入手状态机主循环src/core/orchestrator.ts运行元数据与 notes.mdsrc/core/run.ts中断状态机src/core/interrupt-state.tsGit 提交与回滚src/core/git.ts迭代提示词模板src/templates/iteration-prompt.ts代理输出 schemasrc/core/agents/types.tsCLI 入口src/cli.ts代理技能说明skills/gnhf/SKILL.md 快速上手 gnhf 过夜运行安装npm install -g gnhf准备在 Git 仓库中确保工作区干净空目录请先git init启动执行gnhf 你的目标建议加上限更安心gnhf reduce complexity of the codebase --max-iterations 10 --max-tokens 5000000进阶--worktree可让多个代理在隔离 worktree 中同时干活--stop-when支持用自然语言设定停止条件在已有gnhf/分支上重跑gnhf即可断点续跑一次运行结束后gnhf 会打印退出摘要分支、耗时、迭代数、token 总量、diff 统计和复盘命令。从此你只需要在睡前说一句good night, have fun。【免费下载链接】gnhfBefore I go to bed, I tell my agents: good night, have fun项目地址: https://gitcode.com/gh_mirrors/gn/gnhf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
VirtualBox E_FAIL (0x80004005) 报错全解析:从驱动冲突到UUID修复 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:44
MIPI DSI转LVDS桥接方案:LT9211与N76E003配置实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:44
Windows 11锁屏机制深度解析与分版本禁用方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:44
边缘AI芯片选型:从场景约束反推技术方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:55:35
高频变压器三明治绕法:原理、实操与EMI/效率优化 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:55:35
网盘搜索引擎原理与实战:找资源不再靠运气 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:55:35
Django与协同过滤实战:动漫推荐系统从算法到部署 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:55:35
STM32开源项目交付指南:代码、原理图与仿真全解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:55:35
无驱动IP打印实战:ZPL指令与Python直连Zebra打印机 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:55:29
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37