{"_id":"@4242labs/pi-tron-clu","_rev":"2-d8f2ce231783e9e6c74dc6c4ffba7b21","name":"@4242labs/pi-tron-clu","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@4242labs/pi-tron-clu","version":"0.1.0","keywords":["pi-package","pi-extension","pi","tron","clu","orchestration","multi-agent"],"author":{"name":"42labs"},"license":"Apache-2.0","_id":"@4242labs/pi-tron-clu@0.1.0","maintainers":[{"name":"42piratas","email":"anderson@42labs.io"}],"homepage":"https://github.com/4242labs/tron-clu-pi","bugs":{"url":"https://github.com/4242labs/tron-clu-pi/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"e51bf9d45642c6d1bb7b6d19f8cc0fbb7b65e598","tarball":"https://registry.npmjs.org/@4242labs/pi-tron-clu/-/pi-tron-clu-0.1.0.tgz","fileCount":25,"integrity":"sha512-dT4LjzaRhPZ8y4iIetUi4j2dv+QpLW0UVYELWcgigkowOm5B5T2hxUScpcwnY2dMILh3sSTVHFbBYYIx9op9kA==","signatures":[{"sig":"MEQCIB+KizDhhmZBASV0Id5NmV0JVO177t6Xv/yu99L5JMFeAiAC3SdqLc6BRzjeiGt0afLzUHy2BZ7CzLQIVwAPVRbS/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121746},"type":"module","exports":{".":{"types":"./src/index.ts","default":"./src/index.ts"}},"gitHead":"324258c9947c6c2da7bf3c1ddb5f78abf8db0df1","scripts":{"test":"node --import tsx/esm --test ./test/*.test.ts","check":"biome check --vcs-use-ignore-file=false src test package.json tsconfig.json","format":"biome check --write --vcs-use-ignore-file=false src test package.json tsconfig.json","typecheck":"tsc --noEmit","pack:check":"node scripts/check-tarball.mjs"},"_npmUser":{"name":"42piratas","email":"anderson@42labs.io"},"repository":{"url":"git+https://github.com/4242labs/tron-clu-pi.git","type":"git"},"_npmVersion":"11.11.0","description":"TRON-CLU for Pi — a supervisor extension that drives a fleet of Pi seats through a build/review/merge pipeline.","directories":{},"piExtension":{"lifecycle":"experimental"},"_nodeVersion":"25.8.1","dependencies":{"@4242labs/pi-memento":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.23.12","typescript":"7.0.2","@types/node":"26.2.0","@biomejs/biome":"2.5.8","@earendil-works/pi-coding-agent":"0.84.1"},"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-tron-clu_0.1.0_1786733800873_0.2755809897512669","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@4242labs/pi-tron-clu","version":"0.1.1","description":"TRON-CLU for Pi — a supervisor extension that drives a fleet of Pi seats through a build/review/merge pipeline.","type":"module","license":"Apache-2.0","author":{"name":"42labs"},"homepage":"https://github.com/4242labs/tron-clu-pi","repository":{"type":"git","url":"git+https://github.com/4242labs/tron-clu-pi.git"},"bugs":{"url":"https://github.com/4242labs/tron-clu-pi/issues"},"keywords":["pi-package","pi-extension","pi","tron","clu","orchestration","multi-agent"],"pi":{"extensions":["./src/index.ts"]},"publishConfig":{"access":"public"},"scripts":{"typecheck":"tsc --noEmit","check":"biome check --vcs-use-ignore-file=false src test package.json tsconfig.json","format":"biome check --write --vcs-use-ignore-file=false src test package.json tsconfig.json","test":"node --import tsx/esm --test ./test/*.test.ts","pack:check":"node scripts/check-tarball.mjs"},"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"devDependencies":{"@biomejs/biome":"2.5.8","@earendil-works/pi-coding-agent":"0.84.1","@types/node":"26.2.0","tsx":"4.23.12","typescript":"7.0.2"},"exports":{".":{"types":"./src/index.ts","default":"./src/index.ts"}},"dependencies":{"@4242labs/pi-memento":"^0.1.0"},"gitHead":"0b2c608048aca609b024cd1e0542de02fb62ae4e","_id":"@4242labs/pi-tron-clu@0.1.1","_nodeVersion":"25.8.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-muq9HrsCE++y1Jkj2Nkj7QewbjFwk1ltmjqymTbhYqDBB7ujosCFWnMOvOXcqDemNfMmd2SP8r9Z7em7sep5UQ==","shasum":"fa7c5da00991a5c10a9f97585d53674e8e358255","tarball":"https://registry.npmjs.org/@4242labs/pi-tron-clu/-/pi-tron-clu-0.1.1.tgz","fileCount":25,"unpackedSize":122541,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIE8010Z0vGDrvVHlhg4Fn3CFrP8jDcEuSNmfkrylTATpAiBE3XO1nvGSEzXhvUl8wLj+rrEYL8YuKZY3lEL9eg/b/A=="}]},"_npmUser":{"name":"42piratas","email":"anderson@42labs.io"},"directories":{},"maintainers":[{"name":"42piratas","email":"anderson@42labs.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-tron-clu_0.1.1_1786741571768_0.06134106947269613"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-14T18:56:40.575Z","modified":"2026-08-14T21:06:12.147Z","0.1.0":"2026-08-14T18:56:41.017Z","0.1.1":"2026-08-14T21:06:11.941Z"},"bugs":{"url":"https://github.com/4242labs/tron-clu-pi/issues"},"author":{"name":"42labs"},"license":"Apache-2.0","homepage":"https://github.com/4242labs/tron-clu-pi","keywords":["pi-package","pi-extension","pi","tron","clu","orchestration","multi-agent"],"repository":{"type":"git","url":"git+https://github.com/4242labs/tron-clu-pi.git"},"description":"TRON-CLU for Pi — a supervisor extension that drives a fleet of Pi seats through a build/review/merge pipeline.","maintainers":[{"name":"42piratas","email":"anderson@42labs.io"}],"readme":"# @4242labs/pi-tron-clu\n\n[![Project Status: WIP](https://www.repostatus.org/badges/latest/wip.svg)](https://www.repostatus.org/#wip)\n[![Maintenance](https://img.shields.io/badge/maintenance-passively--maintained-yellowgreen.svg)](CONTRIBUTING.md)\n[![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)\n[![npm](https://img.shields.io/npm/v/@4242labs/pi-tron-clu)](https://www.npmjs.com/package/@4242labs/pi-tron-clu)\n\nTRON-CLU for [Pi](https://github.com/earendil-works/pi-mono) — a supervisor extension that\ndrives a fleet of Pi seats through a build → review → merge pipeline, one block at a time,\nand **stops at every merge to ask you**.\n\n<p align=\"center\">\n  <img src=\"docs/assets/hero-terminal.svg\" alt=\"A terminal session: a mandate of three blocks is started; the first block is built, gated and reviewed by agent seats; then the run stops and waits for the operator to approve the merge.\" width=\"680\">\n</p>\n\n> **Pre-v1.** The driver, the seats, the law and the memory adapter are built and tested, and\n> one three-block pilot has run end to end on a private sandbox. Seats are not contained yet —\n> see [docs/containerization.md](docs/containerization.md) before pointing it at work you care\n> about.\n\n## What it does\n\nYou give CLU a mandate: an ordered list of blocks. Each block is a task, a branch, and a set\nof acceptance criteria — where every criterion carries the **command that decides it**, so\n\"done\" is never a judgement call.\n\nFor each block, in order:\n\n1. a **worker seat** builds it in its own git worktree and commits;\n2. the **gates** run in a fresh detached checkout of what was committed — never in the\n   worker's live worktree, so uncommitted work cannot reach a gate;\n3. a **reviewer seat** reads the diff, the evidence, and the protected paths the change\n   touched, and returns APPROVED or REJECTED with its reasons;\n4. the branch is pushed and the run **parks**. Nothing merges until you say so.\n\nA rejection sends the block back to the same worker seat with the reviewer's own words as its\nbrief. A wall the driver cannot clear — a retry cap, a spent budget, a block file edited\nunderneath it — parks an escalation with a fixed set of answers, and waits.\n\n## The one rule\n\n**A seat never lands work.** That is held three ways, in order of strength: the tool\nallowlist Pi enforces from the parent process, the parked merge that no code path can clear,\nand a pattern-matching deny extension that is *bypassable and documented as such*.\n[docs/law.md](docs/law.md) states exactly where each stops working, and which one is\nload-bearing (it is you).\n\n## Install\n\n```bash\npi install npm:@4242labs/pi-tron-clu\n```\n\nThen, in a Pi session at the root of a git repository:\n\n```\n/tron-clu init                 # gates, branch, merge strategy — written to .pi/tron-clu.json\n/tron-clu ./blocks/mandate.json # start a mandate\n/tron-clu status               # where it is\n/tron-clu approve <block>      # the merge. TUI only, always\n/tron-clu reject <block> <why>\n/tron-clu answer <item> <choice>\n```\n\n`approve`, `reject`, `answer` and starting a mandate are **TUI-only**: there is no\nprogrammatic path to starting a run or approving a merge.\n\n## A block\n\n```json\n{\n  \"id\": \"b1-titlecase\",\n  \"task\": \"Add a titleCase function to src/kit.js and export it…\",\n  \"reviewerClass\": \"code\",\n  \"acceptance\": [\n    { \"criterion\": \"titleCase is exported\", \"verify\": \"node -e \\\"…\\\"\" },\n    { \"criterion\": \"the whole suite passes\", \"verify\": \"npm test\" }\n  ]\n}\n```\n\nA criterion with no `verify` command is refused: a criterion no command can check is not a\ncriterion. So is an unknown field — a typo is a reason not to run.\n\n## What it does not do\n\n- **It does not decide.** No timeout resolves a merge or an escalation. Silence keeps a run\n  parked forever, on purpose.\n- **It does not contain its seats.** A worker seat has `bash`, and `bash` reaches the network\n  and the filesystem. See [docs/containerization.md](docs/containerization.md) — evaluated,\n  deferred, with the conditions for adopting it named.\n- **It does not run seats in parallel.** One block at a time, in the mandate's order.\n\n## Documentation\n\n| | |\n|:--|:--|\n| [docs/law.md](docs/law.md) | what a seat cannot do, and where that stops being a guarantee |\n| [docs/drills.md](docs/drills.md) | every failure this design claims to survive, and the test that proves it |\n| [docs/pi-api.md](docs/pi-api.md) | the verified Pi contract this is built against |\n| [docs/memento-adapter.md](docs/memento-adapter.md) | what the supervisor remembers, and what it must not |\n| [docs/containerization.md](docs/containerization.md) | seat containment: evaluated and deferred |\n| [docs/publishing.md](docs/publishing.md) | how this reaches npm and Pi's gallery |\n\n## Requirements\n\n- pi **0.84.1** or later (the verified baseline)\n- git 2.5+ (worktrees)\n- `gh`, for the `pr` and `squash` merge strategies\n\n## License\n\nOpen source — [Apache-2.0](LICENSE).\n\n---\nIf it earned its keep, [coffee is appreciated](https://buymeacoffee.com/42piratas). ☕\n","readmeFilename":"README.md"}