gnhf(Good Night, Have Fun)
睡前给编码代理一句话目标,它整夜迭代提交小改动,醒来得到一个干净的分支和完整日志。
- Star 数
- ★ 4.2k
- 最近更新
- 17 天前
- License
- MIT
- 主语言
- TypeScript
- FA 评分
- 51/100 · 缺口较多
30 秒速览
- 运行形态
- 可在哪里用
- 通用 · 跨平台Codex · Claude Code
- 费用
- 软件免费,模型调用费用自付
- 上手难度
- 中 · 需要几步配置
- 开始前需要
- 典型场景
- 想在睡觉或开会期间让代理推进一个长期目标(例如降低代码复杂度、补齐测试),早上直接审查分支的人。
- 不适合
- 需要人工逐条审查每次提交、不接受无人值守改动的团队
- 无法提供稳定登录态或额度充足的编码代理账号的用户
- 不在 Git 仓库中工作、或要求干净工作树不被占用的场景
- 源码审查
- 51/100 · 缺口较多
这个 Agent 能做什么,适合哪些场景?
gnhf 是一个命令行编排器,把 Claude Code、Codex、GitHub Copilot CLI、Pi、Cursor CLI、Rovo Dev、OpenCode 等编码代理包装成一个持续运行的循环。启动时它校验 Git 工作树是否干净、创建 gnhf/ 分支(或用 --current-branch 留在当前分支)、把目标写入 prompt.md,然后反复构建迭代提示、以非交互模式调用代理。每次成功迭代产生一个独立的 git 提交并把经验追加到 notes.md,失败迭代则通过 git reset --hard 回滚,连续三次失败会中止。运行元数据(prompt、notes、停止条件、end-state.json、gnhf.log)保存在本地 .gnhf/runs/ 目录并被忽略,因此分支上只留下有意的改动。它面向无人值守的夜间运行,提供迭代数、token 上限、sleep 防止、worktree 并行和退出摘要等控制手段。
在 Git 仓库内运行 gnhf "<prompt>" 后,它先检查工作树干净、写入 prompt.md 并建立或复用 gnhf/ 分支;每一轮把目标、notes.md 中累积的上下文和输出 JSON 结构拼成迭代提示,通过非交互模式调用所选代理(例如 claude、codex exec、copilot 的 JSONL 模式、opencode serve、acli rovodev serve,或 acpx 驱动的 acp:<target>)。代理返回结构化结果后,gnhf 判定成功则创建一次无签名提交、把摘要追加到 notes.md,失败则回滚并计数,可重试错误按指数退避,永久错误(如额度不足)直接中止并打印日志路径。遇到 Claude 用量窗口耗尽时,它读取限流事件中的重置时间,等待后自动重试同一迭代,并可用 --max-rate-limit-wait 设置总等待上限。运行时以 --max-iterations、--max-tokens、--stop-when 控制何时结束;交互式 TUI 在终端标题和统计行显示耗时、token 与提交数,Ctrl+C 第一次请求优雅停止、第二次强制停止。结束时输出包含分支、耗时、迭代与 token 总量、分支 diff 统计、notes 与日志路径以及复查命令的摘要,并把完整 JSONL 调试日志写入 .gnhf/runs/<runId>/gnhf.log。
- 想在睡觉或开会期间让代理推进一个长期目标(例如降低代码复杂度、补齐测试),早上直接审查分支的人。
- 需要同时在一个仓库上跑多个互不干扰任务时,用 --worktree 为每个代理开独立环境与分支。
- 希望边跑边部署或本地热更新的松散项目,用 --current-branch --push 让每次成功迭代推送到远端。
- 已经订阅 Claude Code、Codex 或 Copilot 并希望把闲置额度用满的开发者。
- 需要通过 ACP 接入 Gemini、Grok 等非原生代理,同时保留统一日志与回滚语义的团队。
- 想给代理设定硬性预算(迭代数、token 上限、限流等待上限)再放手的成本敏感用户。
如何安装或部署这个 Agent?
需要 Node.js、Git 和已登录的编码代理 CLI;在 Git 仓库内使用。
npm install -g gnhf从源码安装:
git clone https://github.com/kunchenguid/gnhf.git
cd gnhf
corepack enable
pnpm install
pnpm run build
pnpm link --global首次运行会在 ~/.gnhf/config.yml 生成默认配置(默认代理为 claude),可按需修改:
agent: claude
maxConsecutiveFailures: 3
preventSleep: true如何使用这个 Agent?
在干净的 Git 仓库中给出一句话目标即可开始:
$ gnhf "reduce complexity of the codebase without changing functionality"加上迭代与 token 预算,适合短睡:
$ gnhf "reduce complexity of the codebase without changing functionality" \
--max-iterations 10 \
--max-tokens 5000000并行跑多个任务:
$ gnhf --worktree "implement feature X" &
$ gnhf --worktree "add tests for module Y" &在当前分支上每次成功迭代后推送:
$ gnhf --current-branch --push "keep improving this app"切换代理或指定模型:
$ gnhf --agent codex --model gpt-5.4 "fix failing tests"
$ gnhf --agent 'acp:gemini' "polish the docs"如需关闭匿名遥测:
export GNHF_TELEMETRY=0这个 Agent 有哪些优点和局限?
- 单命令启动的完整循环:校验工作树、建分支、迭代、提交/回滚、退出摘要一次到位,无需自己写脚本。
- 代理无关:原生支持七个编码代理 CLI,并可通过内置 acpx 运行任意 acp:<target> 或自定义 ACP 命令。
- 失败语义明确:成功即提交、失败回滚、连续三次失败中止,提交失败会保留未提交改动让下一轮修复。
- 针对夜间运行的细节完善:Claude 用量窗口自动等待重试、sleep 防止、交互式 TUI 显示 token 与提交数。
- --worktree 让多个代理在同一仓库并行工作,互不干扰,且有提交的 worktree 会保留供审查。
- 本地 .gnhf/runs/ 保存 prompt、notes、end-state.json 与 JSONL 调试日志,便于复盘且不污染分支。
- 本身不提供模型:你必须已安装并登录某个编码代理 CLI,成本由该代理的订阅或 API 用量决定。
- 要求干净的 Git 工作树且不支持无 Git 的目录,--current-branch 与 --worktree 不能同时使用。
- 默认向作者自托管分析发送匿名遥测,需要手动设置 GNHF_TELEMETRY=0 关闭。
- 部分能力受上游限制:Copilot 不暴露完整输入/缓存 token 统计,OpenCode 与 Rovo Dev 的模型覆盖方式受限。
- Linux 下以 systemd-inhibit 防睡眠时,无提交的 worktree 可能残留,需要手动 git worktree remove。
- 无人值守意味着你需要接受代理自主提交的代码,合并前仍需人工复查分支 diff。
这个 Agent 与同类方案有什么区别?
README 明确将自身定位为 ralph(ghuntley.com/ralph)与 Karpathy autoresearch 风格的编排器,属于同一类“让代理持续迭代”的做法;它没有点名具体的竞品工具,因此不与其他产品做逐项对比。
与相关度最高的同类 agent 并排比较关键指标。
| Agent | 源码审查 | 形态 / 费用 | Star | 最近更新 | 主语言 | 完整支持的平台 |
|---|---|---|---|---|---|---|
| gnhf(Good Night, Have Fun) 当前 | 51 · 缺口较多 | 命令行工具免费 + 模型费 | ★ 4.2k | 17 天前 | TypeScript | Codex · Claude Code |
| Vicoa | 52 · 缺口较多 | 桌面应用免费 + 模型费 | ★ 516 | 10 天前 | Python | Codex · Claude Code |
| Cezar — AI 编码代理编排器 | 63 · 存在缺口 | 命令行工具免费 | ★ 743 | 今天 | TypeScript | Codex · Claude Code |
| Maestro:AI 代理编曲指挥中心 | 43 · 缺口较多 | 桌面应用免费 + 模型费 | ★ 3.5k | 今天 | TypeScript | Codex · Claude Code |
FollowAgents 如何评估这个 Agent?
查看各维度的扣分理由
README 说明默认在 gnhf/ 分支上运行、失败回滚、不强制推送,并允许通过 agentArgsOverride 覆盖权限标志;但默认会向编码代理传递非交互式权限默认值,且 --current-branch --push 会直接推送,缺少逐次确认机制。敏感数据处理(凭据、API key)仅以“不要通过覆盖传入”的方式提示,未给出完整的数据流说明。依赖仅 commander 与 js-yaml,锁定版本,依赖面较小,故 dependency_security 给 2;其余项因缺少显式最小权限与确认设计而扣分。
README 对失败处理、连续失败中止、速率限制等待、OpenCode 空响应等有较详细描述,且 CI 在三大平台运行 lint/typecheck/test,自洽性较好;但部分行为(如 systemd-inhibit 下 worktree 泄漏)仍为已知缺陷,故未给满分。依赖可用性由 npm 发布与 engines 约束支撑,给 2。
支持多代理、ACP、worktree、当前分支、stdin 提示等场景,边界说明较清楚;但触发精度依赖自然语言 --stop-when 与代理自报结果,缺少结构化判定,故 trigger_precision 仅 1。
README 结构清晰,含安装、CLI 参考、配置、限制说明;MIT 许可证完整。但版本号仅见于 package.json,CHANGELOG 由 release-please 生成且未在证据中展示,维护责任与发布者身份未验证,故相应项扣分。
输出可用性较好(退出摘要、notes.md、调试日志、审查命令),对夜间无人值守场景有明确边际价值;但成本控制依赖 token 上限与速率等待,缺少成本估算与预算告警,cost_benefit 仅 1。
README 中的行为声明多与代码/CI 配置相互印证(如 golden config 测试、CI 矩阵),但多数声明无法在静态证据中完全追溯,且未区分事实与推断,故各项给 1。
- 默认向编码代理传递非交互式权限标志,可能扩大代理权限,需用户自行审查 agentArgsOverride 与权限设置。
- --current-branch --push 会在每次成功迭代后直接推送,缺少逐次确认,误推送风险需自行评估。
- 发布者身份未经 FollowAgents 注册表验证,维护责任与更新路径不明确。
- 触发条件依赖自然语言 --stop-when 与代理自报结果,判定精度有限。
- 已知 Linux systemd-inhibit 下 worktree 泄漏问题,需手动清理。