gnhf README

The project's README from github.com/kunchenguid/gnhf. As one markdown file: README.md.

Before I go to bed, I tell my agents:

good night, have fun

npm CI Release Platform X Discord

gnhf - Good Night, Have Fun

Never wake up empty-handed.

gnhf is a ralph, autoresearch-style orchestrator that keeps your agents running while you sleep - each iteration makes one small, committed, documented change towards an objective. You wake up to a branch full of clean work and a log of everything that happened.

Quick Start

$ gnhf "reduce complexity of the codebase without changing functionality"
# have a good sleep
$ gnhf "reduce complexity of the codebase without changing functionality" \
    --max-iterations 10 \
    --max-tokens 5000000
# have a good nap
# Run multiple agents on the same repo simultaneously using worktrees
$ gnhf --worktree "implement feature X" &
$ gnhf --worktree "add tests for module Y" &
$ gnhf --worktree "refactor the API layer" &
# Commit directly on the current branch and push after each successful iteration
$ gnhf --current-branch --push "keep improving this app"

Run gnhf from inside a Git repository with a clean working tree. If you are starting from a plain directory, run git init first. gnhf supports macOS, Linux, and Windows.

Install

npm

npm install -g gnhf

From source

git clone https://github.com/kunchenguid/gnhf.git
cd gnhf
corepack enable
pnpm install
pnpm run build
pnpm link --global

Agent Skill

The npm package includes an agent-facing skill at skills/gnhf/SKILL.md. Agents that support local skills can copy or reference this file to learn how to run GNHF in Hands-Off mode for bounded overnight work, or Companion mode when the outer agent should steer and review a long-running GNHF run.

After installing from npm, the skill is available under the installed package directory. From a source checkout, use skills/gnhf/SKILL.md directly.

How It Works

                    ┌─────────────┐
                    │  gnhf start │
                    └──────┬──────┘
                           ▼
                ┌──────────────────────┐
                │  validate clean git  │
                │  create or use branch │
                │  write prompt.md     │
                └──────────┬───────────┘
                           ▼
              ┌────────────────────────────┐
              │  build iteration prompt    │◄──────────────┐
              │  (inject notes.md context) │               │
              └────────────┬───────────────┘               │
                           ▼                               │
              ┌────────────────────────────┐               │
              │  invoke your agent         │               │
              │  (non-interactive mode)    │               │
              └────────────┬───────────────┘               │
                           ▼                               │
                    ┌─────────────┐                        │
                    │  success?   │                        │
                    └──┬──────┬───┘                        │
                  yes  │      │  no                        │
                       ▼      ▼                            │
              ┌──────────┐  ┌───────────┐                  │
              │  commit  │  │ reset or  │                  │
              │  append  │  │  repair   │                  │
              │ notes.md │  │           │                  │
              │maybe wait│  │ maybe wait│                  │
              └────┬─────┘  └─────┬─────┘                  │
                   │              │                        │
                   │   ┌──────────┘                        │
                   ▼   ▼                                   │
              ┌────────────┐    yes   ┌──────────┐         │
              │ 3 consec.  ├─────────►│  abort   │         │
              │ failures   │          └────▲─────┘         │
              │ or perm.   ├───────────────┘               │
              │ error?     │                               │
              └─────┬──────┘                               │
                 no │                                      │
                    └──────────────────────────────────────┘

Live Branch Mode

Pass --current-branch to run on the branch you are already on instead of creating a gnhf/ branch. Pass --push to push the current branch after each successful iteration. Together, --current-branch --push is useful for loose projects where you want a deployed or locally watched branch to update throughout the run.

Worktree Mode

Pass --worktree to run each agent in an isolated git worktree. This lets you launch multiple agents on the same repo simultaneously - each gets its own working directory and branch without interfering with the others or your main checkout.

<repo>/                              ← your repo (unchanged)
<repo>-gnhf-worktrees/
  ├── <run-slug-1>/                  ← worktree for agent 1
  └── <run-slug-2>/                  ← worktree for agent 2

CLI Reference

Command Description
gnhf "<prompt>" Start a new run with the given objective
gnhf Resume a run (when on an existing gnhf/ branch)
echo "<prompt>" | gnhf Pipe prompt via stdin
cat prd.md | gnhf Pipe a large spec or PRD via stdin

If you run gnhf on an existing gnhf/ branch with a different prompt, gnhf asks whether to update prompt.md and continue the existing run history, start a new branch, or quit. When the prompt came from stdin, that confirmation is read from the controlling terminal, so it must be available.

Flags

Flag Description Default
--agent <agent> Agent to use: a native agent name or acp:<target-or-command>; see Agents config file (claude)
--model <model> Model for the agent; overrides agentModel.<agent> from the config file config file
--max-iterations <n> Abort after n total iterations unlimited
--max-tokens <n> Abort after n total input+output+cache tokens unlimited
--max-rate-limit-wait <duration> Abort after this much total Claude usage-limit wait (30m, 2h, or 0) 24h safety cap
--stop-when <cond> End when the agent reports this condition, after any commit-failure repair; persists across resume unlimited
--prevent-sleep <mode> Prevent system sleep during the run (on/off or true/false) config file (on)
--worktree Run in a separate git worktree (enables multiple agents concurrently) false
--current-branch Run on the current branch instead of creating a gnhf/ branch false
--push Push the current branch after each successful iteration false
--meteor-frequency <n> Set TUI meteor frequency from 0 to 5 (0 disables meteors) 3
--version Show version

Configuration

Config lives at ~/.gnhf/config.yml. If the file does not exist yet, gnhf creates it on first run with its defaults. A supplied --agent is written as the default agent. With the default configuration, it has this exact content:

# Agent to use by default: native agent name or acp:<target-or-command>
agent: claude

# Custom paths to native agent binaries (optional)
# Paths may be absolute, bare executable names on PATH,
# ~-prefixed, or relative to this config directory.
# Note: rovodev overrides must point to an acli-compatible binary.
# agentPathOverride:
#   claude: /path/to/custom-claude
#   codex: /path/to/custom-codex
#   copilot: /path/to/custom-copilot
#   pi: /path/to/custom-pi
#   cursor: /path/to/custom-cursor-agent

# Native agent CLI arg overrides (optional)
# ACP targets do not support path or arg overrides.
# agentArgsOverride:
#   codex:
#     - -m
#     - gpt-5.4
#     - -c
#     - model_reasoning_effort="high"
#     - --full-auto
#   copilot:
#     - --model
#     - gpt-5.4
#   pi:
#     - --provider
#     - openai-codex
#     - --model
#     - gpt-5.5
#     - --thinking
#     - high
#   cursor:
#     - --model
#     - composer-2.5

# Models for supported native agents (optional)
# Values are forwarded to the CLI except opencode, which receives
# its model in the request body.
# agentModel:
#   claude: sonnet
#   codex: gpt-5.4
#   opencode: fireworks-ai/accounts/fireworks/models/qwen3p6-plus

# Custom ACP target commands (optional)
# Maps acp:<target> names to spawn commands. Useful for naming a
# local or beta build of an ACP agent.
# acpRegistryOverrides:
#   my-fork: "/usr/local/bin/my-claude-code-fork --acp"
#   staging: "node /opt/staging/agent.mjs"

# Commit message convention (optional)
# Defaults to: gnhf <iteration>: <summary>
# Use Conventional Commits semantic-release headers:
# commitMessage:
#   preset: conventional

# Abort after this many consecutive failures
maxConsecutiveFailures: 3

# Prevent the machine from sleeping during a run
preventSleep: true

CLI flags override config file values. --prevent-sleep accepts on/off as well as true/false; the config file always uses a boolean. The iteration, token, and rate-limit-wait caps are runtime-only flags and are not persisted in config.yml; --stop-when is persisted per run for resume, but not in config.

`

gnhf (kunchenguid/gnhf)

Searching Database…

4.2K ·GitHub
Что это такое?gnhf — это оркестратор ночной работы для ИИ-агентов, пишущих код: вы задаёте цель перед сном, и он работает автономно в цикле, где каждая итерация делает одно небольшое, закоммиченное и задокументированное изменение в направлении цели. Утром вы получаете ветку с аккуратной работой и лог всего, что произошло.
Так это терминальная утилита, фоновый сервис или библиотека?Терминальная утилита: вы устанавливаете её через npm и запускаете одной командой из своего репозитория. Во время работы в интерактивном TUI показываются статус в реальном времени, суммарное количество токенов и число коммитов, а каждый запуск завершается постоянной итоговой сводкой: затраченное время, итерации, токены и статистика диффов.
Как запустить процесс?Установите пакет из npm, затем запустите gnhf внутри Git-репозитория с чистым рабочим деревом, например: gnhf 'fix all failing tests'. Обычной директории сначала нужен git init, а большие спецификации можно передать через конвейер: cat prd.md | gnhf.
Мне нужен свой ИИ-агент для написания кода, чтобы это работало?Да — gnhf управляет CLI-агентом для кодинга, сама модель в него не входит. По умолчанию используется Claude, также работают другие популярные CLI-агенты для кодинга и любой ACP-таргет; ещё понадобятся Node.js 20 или новее и Git.
Есть ли подводные камни, если оставить его работать на ночь?Начинайте с чистого рабочего дерева, и учтите, что коммиты специально делаются неподписанными, чтобы запросы GPG или SSH не могли заблокировать цикл. В Linux есть известный баг: после re-exec под systemd-inhibit может остаться пустой worktree — удалите его вручную командой git worktree remove.
Он будет работать на Windows или это только для Mac и Linux?Поддерживаются все три настольные системы: gnhf работает на macOS, Linux и Windows. Во время запуска он также старается не давать машине заснуть с помощью --prevent-sleep — эта опция включена по умолчанию.
Что именно делает одна итерация?Успешный результат коммитится как отдельный неподписанный Git-коммит; неудачная итерация откатывается командой git reset --hard. Агенты передают контекст дальше через файл notes.md, который каждая итерация читает и дополняет, поэтому последующие итерации помнят предыдущую работу.
Что будет, если агент упрётся в лимит использования посреди ночи?Он не падает, а ждёт: gnhf считывает время сброса из события rate-limit агента, спит до момента сразу после сброса окна и автоматически повторяет ту же итерацию. Опция --fallback-model позволяет повторить отклонённую итерацию на другой модели.
Как не дать ему сжигать токены всю ночь?Три ограничения на этапе выполнения: --max-iterations останавливает перед началом следующей итерации, --max-tokens прерывает итерацию на середине, как только заявленный расход превысит лимит, а --stop-when завершает цикл, как только агент сообщит, что ваше условие на естественном языке выполнено.
Можно ли запустить несколько агентов в одном репозитории одновременно?Да — передайте --worktree, и каждый агент получит изолированный Git-worktree со своей веткой, не трогая ваш основной чекаут. Worktree с коммитами сохраняются после работы — их можно посмотреть или перенести через cherry-pick; запускайте из обычной ветки, например main.
Size
4.4 MB
Stars
4.2K
Age
6mo
Commits · 90 Days