{
  "markdown": "<div align=\"center\">\n\n<img src=\"docs/assets/nh-mark.png\" alt=\"\" width=\"140\" height=\"140\">\n\n# no_human\n\n<!-- mcp-name: io.github.no-human-ai/no_human -->\n\n**From ticket to reviewed pull request.**<br>***Free and open-source, on your machine.***\n\n**English** · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md)\n\n[![latest release](https://img.shields.io/github/v/release/no-human-ai/no_human?label=release&color=4C9AFF)](https://github.com/no-human-ai/no_human/releases/latest) [![CI](https://img.shields.io/github/actions/workflow/status/no-human-ai/no_human/ci.yml?branch=main&label=CI)](https://github.com/no-human-ai/no_human/actions/workflows/ci.yml) [![python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org/) [![license MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE) [![Open Source Helpers](https://www.codetriage.com/no-human-ai/no_human/badges/users.svg)](https://www.codetriage.com/no-human-ai/no_human)\n\n[getnohuman.com](https://getnohuman.com) · [Quickstart](docs/quickstart.md) · [Docs](docs/README.md) · [Watch it work a sprint](https://getnohuman.com/demo)\n\n[![Download for macOS](https://img.shields.io/badge/Download%20for-macOS-4C9AFF?style=for-the-badge)](https://github.com/no-human-ai/no_human/releases/latest) [![Download for Windows](https://img.shields.io/badge/Download%20for-Windows-4C9AFF?style=for-the-badge)](https://getnohuman.com/) [![Download for Linux](https://img.shields.io/badge/Download%20for-Linux-4C9AFF?style=for-the-badge)](https://getnohuman.com/)\n\n<a href=\"https://getnohuman.com/\"><img src=\"docs/assets/hero-loop-poster.jpg\" alt=\"The no_human board: one task waiting on a question in Needs answer, four tasks working in parallel, one pull request ready for review.\" width=\"880\"></a>\n\n<sub>▶ <a href=\"https://getnohuman.com/\">Watch the loop</a> — a ticket in, a reviewed pull request out; the whole loop in 57 seconds.</sub>\n\n</div>\n\nThe AI coding factory you <ins>**can trust**</ins>:\n\n- **A plan before any code**, from the ticket plus what it finds in your repo.\n  When planning fails, the coder is told it is working without one; when the\n  change is judged trivial the plan is skipped without telling the coder, by\n  design — the skip is still stated in the run's event stream.\n- **An adversarial review.** A different model, in a session that never saw the\n  coder's transcript, told to refute \"done\". You get a pass/fail checklist\n  citing file and line — never a numeric self-score.\n- **A tamper guard.** Deleted tests, new skips, an assertion turned into a\n  tautology — counted mechanically before the review gate runs, then justified\n  against your acceptance criteria or the attempt stops.\n- **Proof the fix fixed the bug.** The tests offered as evidence must fail at\n  the merge base and pass on the new tree — the reproduction gate runs both.\n  Out of the box that binds a Python bug fix; `repro_gate.mode: required` binds\n  every kind and every change.\n- **Your tests run**, locally and optionally through your CI — and a PR that\n  found no test command says **NOT RUN** on its face.\n- **An honest stop.** When it cannot finish it stops and says why — a specific\n  question when your answer would unblock it, a structured record when it has\n  simply run out of budget — never an invented plausible diff.\n\n## Install\n\n### One line (CLI + board)\n\n```bash\nuv tool install no-human   # or: pipx install no-human — the wheel ships the board\nnh init && nh doctor       # token, config, first repo; then prove the install is real\n```\n\n### Desktop app\n\n[![Download for macOS](https://img.shields.io/badge/Download%20for-macOS-4C9AFF?style=for-the-badge)](https://github.com/no-human-ai/no_human/releases/latest) [![Download for Windows](https://img.shields.io/badge/Download%20for-Windows-4C9AFF?style=for-the-badge)](https://getnohuman.com/) [![Download for Linux](https://img.shields.io/badge/Download%20for-Linux-4C9AFF?style=for-the-badge)](https://getnohuman.com/)\n\nEach release ships a SHA-256 alongside the artifact. Platform notes and the\nfirst-run walk-through: [docs/quickstart.md](docs/quickstart.md).\n\n### From source\n\n```bash\ngit clone https://github.com/no-human-ai/no_human.git && cd no_human\nuv sync                 # installs the `nh` entry point into .venv\n(cd web && npm install && npm run build)   # builds the board (cold first install can take minutes)\nuv run nh init          # token, config, first repo (about 2 minutes)\nuv run nh doctor        # verify the install is real before relying on it\n```\n\nThe `web` build is not optional if you want the board: a source checkout ships\nno `web/dist`, so without it `nh start` serves the API only and renders no UI.\nNeeds Python 3.12+, [uv](https://github.com/astral-sh/uv), git, and Node with\nnpm for the board build.\n\n## Product highlights\n\n<table>\n  <tr>\n    <td width=\"36%\" valign=\"middle\">\n      <h3>A plan before any code</h3>\n      <p>Acceptance criteria you can check, written from the ticket and your repo.</p>\n    </td>\n    <td width=\"64%\">\n      <img src=\"docs/assets/readme/highlight-plan.png\" alt=\"The task's plan: what we understood as three acceptance criteria, the two files to change, the approach, the test plan, what is out of scope, and the verification command.\" width=\"100%\" />\n    </td>\n  </tr>\n  <tr>\n    <td width=\"36%\" valign=\"middle\">\n      <h3>An independent reviewer</h3>\n      <p>A second model that never saw the coder's session, told to refute \"done\". Pass or fail; every finding that blocks cites file and line.</p>\n    </td>\n    <td width=\"64%\">\n      <img src=\"docs/assets/readme/highlight-verdict.png\" alt=\"The reviewer's verdict: PASSED, each acceptance criterion ticked with the file and line that satisfies it, one non-blocking nit with the diff it points at.\" width=\"100%\" />\n    </td>\n  </tr>\n  <tr>\n    <td width=\"36%\" valign=\"middle\">\n      <h3>Your tests, on the PR's face</h3>\n      <p>Run locally or through your CI. No test command found reads <b>NOT RUN</b>, never blank.</p>\n    </td>\n    <td width=\"64%\">\n      <img src=\"docs/assets/readme/highlight-tests.png\" alt=\"The task's Test results panel: CLEAN, 5 passed of 5 total, with the pytest output underneath.\" width=\"100%\" />\n    </td>\n  </tr>\n  <tr>\n    <td width=\"36%\" valign=\"middle\">\n      <h3>A tamper guard</h3>\n      <p>Deleted tests, new skips and tautological assertions are counted before review. Unjustified, the attempt stops.</p>\n    </td>\n    <td width=\"64%\">\n      <img src=\"docs/assets/readme/highlight-tamper.png\" alt=\"A stopped attempt: a red TAMPER DETECTED banner, the reviewer verdict FAILED, and the blocking finding that three tests were deleted without an acceptance criterion to justify it.\" width=\"100%\" />\n    </td>\n  </tr>\n  <tr>\n    <td width=\"36%\" valign=\"middle\">\n      <h3>Proof the fix fixed the bug</h3>\n      <p>The tests offered as evidence must fail on the old code and pass on the new. The gate runs both, and the event log shows the verdict.</p>\n    </td>\n    <td width=\"64%\">\n      <img src=\"docs/assets/readme/highlight-repro.png\" alt=\"The task's event log: tests pass, status reviewing, the reviewer's tamper check reading none, the reproduction gate reading pass, required, then lint, commit and the pull request opening.\" width=\"100%\" />\n    </td>\n  </tr>\n  <tr>\n    <td width=\"36%\" valign=\"middle\">\n      <h3>An honest stop</h3>\n      <p>When it needs you, it parks with one specific question instead of guessing.</p>\n    </td>\n    <td width=\"64%\">\n      <img src=\"docs/assets/readme/highlight-question.png\" alt=\"The board's Needs answer lane: one task parked with its question, 'Dedupe by user, or by digest id?', and an Answer question button; the Working and Review PR lanes beside it.\" width=\"100%\" />\n    </td>\n  </tr>\n  <tr>\n    <td width=\"36%\" valign=\"middle\">\n      <h3>Your tracker's tickets, on your board</h3>\n      <p>Pick Jira or Linear tickets from the backlog (monday.com boards are polled). Each one is scoped with you before it starts.</p>\n    </td>\n    <td width=\"64%\">\n      <img src=\"docs/assets/readme/highlight-backlog.png\" alt=\"The Backlog synced from Jira: four matching tickets selected, and a Start 4 tasks button.\" width=\"100%\" />\n    </td>\n  </tr>\n</table>\n\n<sub>Stills: the real board on a demo workload.</sub>\n\n## Run one task\n\nRun `nh` with no arguments for the shell: your lanes, a live event tail, and an\nintake you describe a task to in plain English. Every command below still works.\n\n```bash\nnh                                   # the shell\nnh start                             # board + worker on 127.0.0.1:8420\nnh task add https://github.com/org/repo/issues/42 --repo ~/git/repo\nnh status                            # needs-you / working / waiting / done\nnh review <id>                       # the reviewer's evidence checklist\nnh diff <id>                         # the diff it wants to ship\nnh approve <id>                      # your approval squash-lands the PR (git.approve_identity)\nnh reject <id> --reason \"...\"        # send it back with feedback\n```\n\n## Integrations\n\nPoint no_human at the tracker you already use and it pulls the tickets to your\nboard — a tracker's filter lives in your config, never in a task's own text,\nand a transport error logs and retries on the next tick instead of crashing\nthe pool.\n\n| Tracker | How tickets arrive | Filter you configure |\n|---|---|---|\n| **Jira Cloud** | Polled via REST `search/jql` (HTTP Basic `email:token`) | `integrations.jira.jql` |\n| **Linear** | Polled via the GraphQL API | `integrations.linear.team_key` + `state_types` + `label` |\n| **monday.com** | Polled via GraphQL v2 | `integrations.monday.board_id` + `status_column` + `todo_labels` |\n\nWith write-back on (`write_back`, off by default), the ticket moves with the\ntask — matched by status category, type, or the label you name, never a\nhard-coded transition id — and gets the PR link; a task that needs a human is commented on, never\ntransitioned. GitHub and\nGitLab issues import as tasks by URL, and PRs or MRs open on your own host;\nSlack and Teams get a message when a task needs you; Jenkins and CircleCI can\nrun your test layers and gate the loop. Setup for each:\n[docs/adapters.md](docs/adapters.md).\n\n**Watch the Jira flow end to end** — tickets synced from a Jira board, scoped,\nimplemented, and delivered as a review-passed pull request (click for the full\nvideo with every step):\n\n[![Jira flow demo](https://getnohuman.com/assets/demo-jira.gif)](https://getnohuman.com/assets/demo-jira.mp4)\n\n<p align=\"center\">▶️&nbsp;&nbsp;<strong><a href=\"https://getnohuman.com/assets/demo-jira.mp4\">Play the full demo</a></strong> — 1:33, from Jira board to review-passed PR</p>\n\n## MCP server — hand it work from the agent you are already in\n\nno_human ships an **MCP (Model Context Protocol) server**: a stdio bridge, built\non the official Python MCP SDK, that lets Claude Code, Cursor or any MCP client\nfile work with your local no_human and check on it.\n\n```bash\nnh mcp-serve        # the MCP server, over stdio\n```\n\nTwo tools, and no more:\n\n| Tool | What it does |\n|---|---|\n| `task_add(title, description, repo_path)` | Files a task. no_human then plans it, writes the change, runs your tests, has a second model review it, and opens the pull request. |\n| `task_status(task_id_or_external_id)` | Returns that task's current state — status, attempts, the PR link once there is one. |\n\nIt talks to your own no_human at `http://127.0.0.1:8420` and nothing else: no\nauth, because that address is localhost, and no service of ours in between. For\nClaude Code, the same server ships as a plugin — this repository is its own\nplugin marketplace, so the two tools appear in your session after:\n\n```\n/plugin marketplace add no-human-ai/no_human\n/plugin install no-human@no-human-ai\n```\n\nAny other MCP client takes the usual stdio entry:\n\n```jsonc\n// .mcp.json\n{ \"mcpServers\": { \"no_human\": { \"command\": \"nh\", \"args\": [\"mcp-serve\"] } } }\n```\n\n## Docs\n\n| | |\n|---|---|\n| [quickstart.md](docs/quickstart.md) | Zero to first task, per platform |\n| [configuration.md](docs/configuration.md) | Every setting and default |\n| [verification.md](docs/verification.md) | The gates, the bounded loop, the limits |\n| [security.md](docs/security.md) | Auth boundary, the never-merge rule, guards |\n| [blockers.md](docs/blockers.md) | Escalation, wake watcher, `nh reply` |\n| [adapters.md](docs/adapters.md) | Intake, context, VCS and CI backends |\n| [eval.md](docs/eval.md) | Golden set, replay scoring, shadow mode |\n| [CHANGELOG.md](CHANGELOG.md) | What changed, per release |\n\n## Development\n\n```bash\nuv sync\nuv run pytest -q\nuv run nh --help\n```\n\nIssues and pull requests welcome; run `uv run pytest -q` before submitting.\n\nIf no_human saved you a review cycle, a star helps other people find it:\n[![GitHub stars](https://img.shields.io/github/stars/no-human-ai/no_human?style=social)](https://github.com/no-human-ai/no_human/stargazers)\n\n## License\n\nMIT — see [LICENSE](LICENSE). The licence covers the code, not the name:\n[TRADEMARK.md](TRADEMARK.md) is the policy on using \"no_human\" and the logo.\nPackaging a binary carries obligations the source tree does not, listed in\n[THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md).\n",
  "bytes": 13193,
  "sha": "eab0637b0657dd6b74fe7ab65e4be7459115620544a867990e820757cd4cf6bb",
  "repo_slug": "no-human-ai/no_human",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_no_human_ai_no_human_0b44886e/readme"
}