@open-mercato/cezar 0.1.5-pr506.357

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/README.md +573 -0
  2. package/dist/config.d.ts +144 -0
  3. package/dist/config.js +106 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/core/agent-runner.d.ts +169 -0
  6. package/dist/core/agent-runner.js +23 -0
  7. package/dist/core/agent-runner.js.map +1 -0
  8. package/dist/core/backend-detect.d.ts +16 -0
  9. package/dist/core/backend-detect.js +118 -0
  10. package/dist/core/backend-detect.js.map +1 -0
  11. package/dist/core/claude-cli-runner.d.ts +56 -0
  12. package/dist/core/claude-cli-runner.js +416 -0
  13. package/dist/core/claude-cli-runner.js.map +1 -0
  14. package/dist/core/claude-ui-mapper.d.ts +71 -0
  15. package/dist/core/claude-ui-mapper.js +567 -0
  16. package/dist/core/claude-ui-mapper.js.map +1 -0
  17. package/dist/core/codex-app-server-runner.d.ts +29 -0
  18. package/dist/core/codex-app-server-runner.js +489 -0
  19. package/dist/core/codex-app-server-runner.js.map +1 -0
  20. package/dist/core/codex-ui-mapper.d.ts +63 -0
  21. package/dist/core/codex-ui-mapper.js +491 -0
  22. package/dist/core/codex-ui-mapper.js.map +1 -0
  23. package/dist/core/ndjson.d.ts +6 -0
  24. package/dist/core/ndjson.js +23 -0
  25. package/dist/core/ndjson.js.map +1 -0
  26. package/dist/core/opencode-server-runner.d.ts +30 -0
  27. package/dist/core/opencode-server-runner.js +488 -0
  28. package/dist/core/opencode-server-runner.js.map +1 -0
  29. package/dist/core/opencode-ui-mapper.d.ts +105 -0
  30. package/dist/core/opencode-ui-mapper.js +588 -0
  31. package/dist/core/opencode-ui-mapper.js.map +1 -0
  32. package/dist/core/process-usage.d.ts +63 -0
  33. package/dist/core/process-usage.js +181 -0
  34. package/dist/core/process-usage.js.map +1 -0
  35. package/dist/core/runner-factory.d.ts +8 -0
  36. package/dist/core/runner-factory.js +22 -0
  37. package/dist/core/runner-factory.js.map +1 -0
  38. package/dist/core/tool-display.d.ts +30 -0
  39. package/dist/core/tool-display.js +156 -0
  40. package/dist/core/tool-display.js.map +1 -0
  41. package/dist/core/ui-events.d.ts +308 -0
  42. package/dist/core/ui-events.js +25 -0
  43. package/dist/core/ui-events.js.map +1 -0
  44. package/dist/core/usage.d.ts +11 -0
  45. package/dist/core/usage.js +15 -0
  46. package/dist/core/usage.js.map +1 -0
  47. package/dist/git-worktree.d.ts +88 -0
  48. package/dist/git-worktree.js +297 -0
  49. package/dist/git-worktree.js.map +1 -0
  50. package/dist/handoff.d.ts +62 -0
  51. package/dist/handoff.js +147 -0
  52. package/dist/handoff.js.map +1 -0
  53. package/dist/index.d.ts +2 -0
  54. package/dist/index.js +466 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/install-as-command.d.ts +39 -0
  57. package/dist/install-as-command.js +51 -0
  58. package/dist/install-as-command.js.map +1 -0
  59. package/dist/pack-check.d.ts +17 -0
  60. package/dist/pack-check.js +27 -0
  61. package/dist/pack-check.js.map +1 -0
  62. package/dist/paths.d.ts +23 -0
  63. package/dist/paths.js +34 -0
  64. package/dist/paths.js.map +1 -0
  65. package/dist/planner.d.ts +17 -0
  66. package/dist/planner.js +248 -0
  67. package/dist/planner.js.map +1 -0
  68. package/dist/release/snapshot.d.ts +64 -0
  69. package/dist/release/snapshot.js +75 -0
  70. package/dist/release/snapshot.js.map +1 -0
  71. package/dist/release/stable.d.ts +46 -0
  72. package/dist/release/stable.js +57 -0
  73. package/dist/release/stable.js.map +1 -0
  74. package/dist/runs/auto-name.d.ts +75 -0
  75. package/dist/runs/auto-name.js +168 -0
  76. package/dist/runs/auto-name.js.map +1 -0
  77. package/dist/runs/retention.d.ts +60 -0
  78. package/dist/runs/retention.js +86 -0
  79. package/dist/runs/retention.js.map +1 -0
  80. package/dist/runs/review-gate.d.ts +18 -0
  81. package/dist/runs/review-gate.js +21 -0
  82. package/dist/runs/review-gate.js.map +1 -0
  83. package/dist/runs/store.d.ts +408 -0
  84. package/dist/runs/store.js +526 -0
  85. package/dist/runs/store.js.map +1 -0
  86. package/dist/runs/task-refs.d.ts +24 -0
  87. package/dist/runs/task-refs.js +74 -0
  88. package/dist/runs/task-refs.js.map +1 -0
  89. package/dist/runs/ui-event-sink.d.ts +81 -0
  90. package/dist/runs/ui-event-sink.js +210 -0
  91. package/dist/runs/ui-event-sink.js.map +1 -0
  92. package/dist/server/capabilities.d.ts +33 -0
  93. package/dist/server/capabilities.js +43 -0
  94. package/dist/server/capabilities.js.map +1 -0
  95. package/dist/server/forge/github.d.ts +70 -0
  96. package/dist/server/forge/github.js +375 -0
  97. package/dist/server/forge/github.js.map +1 -0
  98. package/dist/server/forge/index.d.ts +24 -0
  99. package/dist/server/forge/index.js +45 -0
  100. package/dist/server/forge/index.js.map +1 -0
  101. package/dist/server/forge/types.d.ts +80 -0
  102. package/dist/server/forge/types.js +2 -0
  103. package/dist/server/forge/types.js.map +1 -0
  104. package/dist/server/git-changes.d.ts +195 -0
  105. package/dist/server/git-changes.js +497 -0
  106. package/dist/server/git-changes.js.map +1 -0
  107. package/dist/server/git.d.ts +26 -0
  108. package/dist/server/git.js +103 -0
  109. package/dist/server/git.js.map +1 -0
  110. package/dist/server/github.d.ts +8 -0
  111. package/dist/server/github.js +8 -0
  112. package/dist/server/github.js.map +1 -0
  113. package/dist/server/launch-key.d.ts +7 -0
  114. package/dist/server/launch-key.js +33 -0
  115. package/dist/server/launch-key.js.map +1 -0
  116. package/dist/server/open-in-app.d.ts +51 -0
  117. package/dist/server/open-in-app.js +189 -0
  118. package/dist/server/open-in-app.js.map +1 -0
  119. package/dist/server/open-in-terminal.d.ts +25 -0
  120. package/dist/server/open-in-terminal.js +120 -0
  121. package/dist/server/open-in-terminal.js.map +1 -0
  122. package/dist/server/pr.d.ts +7 -0
  123. package/dist/server/pr.js +7 -0
  124. package/dist/server/pr.js.map +1 -0
  125. package/dist/server/server.d.ts +41 -0
  126. package/dist/server/server.js +1390 -0
  127. package/dist/server/server.js.map +1 -0
  128. package/dist/server/static-ui.d.ts +49 -0
  129. package/dist/server/static-ui.js +92 -0
  130. package/dist/server/static-ui.js.map +1 -0
  131. package/dist/server/wsl.d.ts +25 -0
  132. package/dist/server/wsl.js +92 -0
  133. package/dist/server/wsl.js.map +1 -0
  134. package/dist/server-install/engine.d.ts +33 -0
  135. package/dist/server-install/engine.js +314 -0
  136. package/dist/server-install/engine.js.map +1 -0
  137. package/dist/server-install/platforms/macosx-ngrok.d.ts +6 -0
  138. package/dist/server-install/platforms/macosx-ngrok.js +345 -0
  139. package/dist/server-install/platforms/macosx-ngrok.js.map +1 -0
  140. package/dist/server-install/platforms/ubuntu-vps.d.ts +39 -0
  141. package/dist/server-install/platforms/ubuntu-vps.js +746 -0
  142. package/dist/server-install/platforms/ubuntu-vps.js.map +1 -0
  143. package/dist/server-install/state.d.ts +26 -0
  144. package/dist/server-install/state.js +125 -0
  145. package/dist/server-install/state.js.map +1 -0
  146. package/dist/server-install/steps.d.ts +109 -0
  147. package/dist/server-install/steps.js +330 -0
  148. package/dist/server-install/steps.js.map +1 -0
  149. package/dist/server-install/strategies.d.ts +4 -0
  150. package/dist/server-install/strategies.js +20 -0
  151. package/dist/server-install/strategies.js.map +1 -0
  152. package/dist/server-install/types.d.ts +597 -0
  153. package/dist/server-install/types.js +98 -0
  154. package/dist/server-install/types.js.map +1 -0
  155. package/dist/server-install/ui.d.ts +42 -0
  156. package/dist/server-install/ui.js +130 -0
  157. package/dist/server-install/ui.js.map +1 -0
  158. package/dist/skills-banner.d.ts +21 -0
  159. package/dist/skills-banner.js +40 -0
  160. package/dist/skills-banner.js.map +1 -0
  161. package/dist/skills-remote.d.ts +35 -0
  162. package/dist/skills-remote.js +266 -0
  163. package/dist/skills-remote.js.map +1 -0
  164. package/dist/skills.d.ts +45 -0
  165. package/dist/skills.js +182 -0
  166. package/dist/skills.js.map +1 -0
  167. package/dist/todos.d.ts +63 -0
  168. package/dist/todos.js +168 -0
  169. package/dist/todos.js.map +1 -0
  170. package/dist/ui-state.d.ts +12 -0
  171. package/dist/ui-state.js +25 -0
  172. package/dist/ui-state.js.map +1 -0
  173. package/dist/update-check.d.ts +12 -0
  174. package/dist/update-check.js +41 -0
  175. package/dist/update-check.js.map +1 -0
  176. package/dist/workflows/load.d.ts +15 -0
  177. package/dist/workflows/load.js +56 -0
  178. package/dist/workflows/load.js.map +1 -0
  179. package/dist/workflows/run.d.ts +281 -0
  180. package/dist/workflows/run.js +1511 -0
  181. package/dist/workflows/run.js.map +1 -0
  182. package/dist/workflows/types.d.ts +307 -0
  183. package/dist/workflows/types.js +171 -0
  184. package/dist/workflows/types.js.map +1 -0
  185. package/package.json +90 -0
  186. package/scripts/check-pack.mjs +46 -0
  187. package/scripts/dev.mjs +74 -0
  188. package/scripts/install-as-command.mjs +120 -0
  189. package/scripts/mock-claude.mjs +310 -0
  190. package/scripts/release-snapshot.mjs +130 -0
  191. package/scripts/release.mjs +119 -0
  192. package/scripts/test-process-usage.mjs +47 -0
  193. package/web/dist/assets/arrow-left-BE957rJs.js +1 -0
  194. package/web/dist/assets/bundle-mjs-DLPpRFyl.js +1 -0
  195. package/web/dist/assets/centered-state-BddhEEtO.js +43 -0
  196. package/web/dist/assets/chunk-BO2N2NFS-f5igTtpB.js +131 -0
  197. package/web/dist/assets/command-CjhFbABo.js +1 -0
  198. package/web/dist/assets/compare-variants-Cs52IAEG.js +1 -0
  199. package/web/dist/assets/core-BuMqAF_1.js +12 -0
  200. package/web/dist/assets/css-BsVw1vtW.js +1 -0
  201. package/web/dist/assets/dialog-DFvXTkFv.js +1 -0
  202. package/web/dist/assets/diff-view-C9b8AITq.js +4 -0
  203. package/web/dist/assets/diff-woXpYk--.js +1 -0
  204. package/web/dist/assets/dist-FBs4wmIY.js +1 -0
  205. package/web/dist/assets/dist-o_kVMXjg.js +1 -0
  206. package/web/dist/assets/engine-javascript-FQvzRocB.js +141 -0
  207. package/web/dist/assets/file-BVuztAOd.js +1 -0
  208. package/web/dist/assets/folder-0pJ1NZ_S.js +1 -0
  209. package/web/dist/assets/git-pull-request-DJkAMT0f.js +1 -0
  210. package/web/dist/assets/git-toolbar-CwhQdx3J.js +1 -0
  211. package/web/dist/assets/github-D0rAX4-r.js +1 -0
  212. package/web/dist/assets/go-rLFTqkRN.js +1 -0
  213. package/web/dist/assets/highlighted-body-OFNGDK62-DGHHie_q.js +1 -0
  214. package/web/dist/assets/highlighter-BKVEsACy.js +3 -0
  215. package/web/dist/assets/html-BY76lXLH.js +1 -0
  216. package/web/dist/assets/index-CEkI7QxN.css +2 -0
  217. package/web/dist/assets/index-CO2lH2et.js +11 -0
  218. package/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  219. package/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  220. package/web/dist/assets/javascript-BgS3c2Ky.js +1 -0
  221. package/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  222. package/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  223. package/web/dist/assets/json-qhed-kSA.js +1 -0
  224. package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
  225. package/web/dist/assets/jsx-Bz0zcwM4.js +1 -0
  226. package/web/dist/assets/lib-CNGa3Dig.js +1 -0
  227. package/web/dist/assets/loader-circle-BV3DO9mE.js +1 -0
  228. package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
  229. package/web/dist/assets/markdown-D4-ADgH9.js +1 -0
  230. package/web/dist/assets/mermaid-GHXKKRXX-DM2VsGBG.js +1 -0
  231. package/web/dist/assets/open-mercato-toBr6SOa.svg +11 -0
  232. package/web/dist/assets/prompt-templates-C7ptKvDd.js +15 -0
  233. package/web/dist/assets/python-gzcpVVnB.js +1 -0
  234. package/web/dist/assets/react-dom-Ddtik4qM.js +1 -0
  235. package/web/dist/assets/refresh-cw-DCa-Rlwz.js +1 -0
  236. package/web/dist/assets/repo-git-DIhryGDx.js +1 -0
  237. package/web/dist/assets/run-diff-Dyow8B1q.js +3 -0
  238. package/web/dist/assets/run-header-jx9-18b8.js +1 -0
  239. package/web/dist/assets/rust-Cfkwpbl8.js +1 -0
  240. package/web/dist/assets/search-x-CoCyl7zT.js +1 -0
  241. package/web/dist/assets/shellscript-CLZ0U2zV.js +1 -0
  242. package/web/dist/assets/skill-detail-DB7x_FQp.js +1 -0
  243. package/web/dist/assets/skills-98vCroU8.js +1 -0
  244. package/web/dist/assets/skills-BKIoqD6K.js +1 -0
  245. package/web/dist/assets/sql-BsFa4tDR.js +1 -0
  246. package/web/dist/assets/square-terminal-B6PZX4Qp.js +1 -0
  247. package/web/dist/assets/tab-link-C5--YMQd.js +1 -0
  248. package/web/dist/assets/task-changes-ejxPGVJw.js +1 -0
  249. package/web/dist/assets/task-commits-C6GO5qT-.js +1 -0
  250. package/web/dist/assets/task-files-CatpCBXa.js +2 -0
  251. package/web/dist/assets/task-thread-BMbXDM3d.js +5 -0
  252. package/web/dist/assets/tasks-table-dgezlCcg.js +1 -0
  253. package/web/dist/assets/trash-2-CDtxmmc8.js +1 -0
  254. package/web/dist/assets/triangle-alert-6su4Js5O.js +1 -0
  255. package/web/dist/assets/tsx-udAQXfEw.js +1 -0
  256. package/web/dist/assets/typescript-bsJCZSQ-.js +1 -0
  257. package/web/dist/assets/upload-Bp7hQxll.js +1 -0
  258. package/web/dist/assets/use-desktop-CvTwojOJ.js +3 -0
  259. package/web/dist/assets/utils-rQGbOrwc.js +1 -0
  260. package/web/dist/assets/workflows-Dy2c6790.js +11 -0
  261. package/web/dist/assets/x-Br_jIDBw.js +1 -0
  262. package/web/dist/assets/yaml-rwi0_p6S.js +1 -0
  263. package/web/dist/index.html +70 -0
  264. package/web/open-mercato.svg +11 -0
package/README.md ADDED
@@ -0,0 +1,573 @@
1
+ <div align="center">
2
+
3
+ # cezar ⚡
4
+
5
+ **Parallel coding agents orchestrator** — a local cockpit for running and
6
+ tracking AI coding-agent tasks in your repo.
7
+
8
+ Type a task, pick a workflow and an agent — **Claude Code, Codex or OpenCode,
9
+ or a mix of them per step** — and watch it work live: steps, tool calls,
10
+ tokens, diffs, in a browser cockpit that runs entirely on your machine.
11
+ Your CLI logins, your `gh`, your files. No accounts, no database, no cloud.
12
+
13
+ 🔥 **Fire and forget.** Queue a stack of autonomous coding and maintenance
14
+ tasks and let them run — cezar orchestrates them across isolated worktrees,
15
+ in parallel. Flip the **Autonomous** flag
16
+ and a run never stops to ask; it just finishes. Leave it on a VPS and you get
17
+ a dev team that's *always on* — a mobile-friendly cockpit you can check from
18
+ your phone, working your backlog while you're away.
19
+
20
+ [A look inside](#a-look-inside) · [What cezar does best](#what-cezar-does-best) · [What it solves](#what-it-solves) · [Who it's for](#who-its-for) · [Quick start](#quick-start) · [How it works](#how-it-works) · [Core concepts](#core-concepts) · [Cockpit tour](#cockpit-tour) · [Agent backends](#coding-agent-backends) · [Remote access](#remote-access-host-cezar-on-a-server)
21
+
22
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](#license)
23
+ ![Node 20+](https://img.shields.io/badge/Node-20%2B-339933)
24
+ ![TypeScript 5.x](https://img.shields.io/badge/TypeScript-5.x-3178c6)
25
+ ![Zero config](https://img.shields.io/badge/config-zero-success)
26
+ ![No database](https://img.shields.io/badge/database-none-success)
27
+
28
+ </div>
29
+
30
+ ---
31
+
32
+ ```bash
33
+ cd your-repo
34
+ npx cezar-cli # → cockpit at http://localhost:4321
35
+ ```
36
+
37
+ That's the whole setup. If your `claude` CLI is logged in (Pro/Max) and `gh` is
38
+ authenticated, there is nothing else to configure. State lives in `.ai/cezar/`
39
+ inside your repo — plain JSON, NDJSON and Markdown you can `cat` and fix by hand.
40
+
41
+ ## A look inside
42
+
43
+ Click any thumbnail for the full-size screenshot.
44
+
45
+ | Orchestrate parallel agents | Watch a run live | Parallel variants |
46
+ |:--:|:--:|:--:|
47
+ | [![The Tasks view — parallel runs, a queue with positions, per-run cost and peak memory, and a variants compare card](docs/screenshots/task-view.png)](docs/screenshots/task-view.png) | [![A running task streaming agent text, tool calls and screenshots live](docs/screenshots/live-run.png)](docs/screenshots/live-run.png) | [![Two competing variants of the same task compared side by side — pick the winner](docs/screenshots/variants-compare.png)](docs/screenshots/variants-compare.png) |
48
+ | *Run and queue many tasks at once — each in its own worktree — with live status, cost and peak memory per run.* | *Every step, tool call, token and screenshot — streamed as it happens.* | *Run a task ×2/×3 in isolated worktrees, compare the diffs, keep one.* |
49
+ | **Workflow builder** | **GitHub, one click away** | **Skills + fire-and-forget** |
50
+ | [![The workflow builder — drag skills into an ordered chain of agent steps and shell checks](docs/screenshots/workflow-builder.png)](docs/screenshots/workflow-builder.png) | [![The GitHub tab — hand an open issue to the agent with a workflow and skills](docs/screenshots/github-issues.png)](docs/screenshots/github-issues.png) | [![The task composer — pick a skill playbook and flip the Autonomous flag to run unattended](docs/screenshots/skills-autonomous.png)](docs/screenshots/skills-autonomous.png) |
51
+ | *Stitch skills and shell checks into a reusable YAML chain, no code.* | *Open issues and PRs via your `gh` — run the agent straight on an issue.* | *Pick a Markdown skill and flip **Autonomous** — the run never stops to ask, so you can walk away.* |
52
+
53
+ ---
54
+
55
+ ## What cezar does best 🏆
56
+
57
+ Plenty of tools wrap a single coding agent in a nicer window — a "Codex GUI", a
58
+ conductor-style app, one-agent front-ends. cezar's bet is different. Three things
59
+ it does better than any of them:
60
+
61
+ - 🪶 **Genuinely zero config.** `npx cezar-cli` in your repo and you're running —
62
+ no wizard, no API keys, no env vars, no schema, no database. It rides the
63
+ `claude` / `codex` / `opencode` logins and the `gh` you already have, and every
64
+ missing piece degrades gracefully instead of blocking you.
65
+ - 🖥️ **Built for a server (VPS mode).** cezar is made to live on a **VPS, cloud,
66
+ or dedicated box** as an always-on janitor for your repo — headless-first, with
67
+ a mobile-friendly cockpit you drive from anywhere. It's a coding server you can
68
+ actually watch, not a desktop app bolted onto one machine.
69
+ - 🔀 **Parallel + autonomous orchestration.** The real edge: cezar runs **many
70
+ agents at once** in isolated worktrees, **queues** the overflow, and pushes each
71
+ one **autonomously** through skill playbooks — fire-and-forget. This is exactly
72
+ what single-agent GUIs don't do well: they babysit one agent, while cezar
73
+ orchestrates a whole team and drains your backlog while you're away.
74
+
75
+ ---
76
+
77
+ ## What it solves
78
+
79
+ Most "AI coding agent" tooling makes you choose between a **terminal** you can't
80
+ see into once it's running, and a **cloud product** that wants your API key, your
81
+ code on their servers, and an account. cezar is the third option: the agents run
82
+ locally under *your* subscription, a cockpit shows you exactly what they're doing,
83
+ and an orchestrator keeps a whole queue of them moving.
84
+
85
+ - 👀 **No visibility into a running agent.** A headless `claude` run is a black box
86
+ until it finishes. cezar streams every step — agent text, each tool call and
87
+ its result, tokens and cost per step — live, and keeps the full replay.
88
+ - 🧩 **One agent, one working tree, one thing at a time.** Kick off a second task and
89
+ it fights the first over your files. cezar runs each task in its **own git
90
+ worktree**, so two (or three) agents work in parallel without stepping on
91
+ each other — or on the branch you're editing.
92
+ - 🗂️ **A backlog that needs babysitting.** Queue a stack of tasks and cezar
93
+ **orchestrates** them: it runs up to your parallel limit and holds the rest in
94
+ an ordered queue. Point it at a GitHub issue and it runs straight on that, so
95
+ working the tracker down stops being a manual chore. Turn on the opt-in
96
+ **Inbox** (`CEZ_FOLLOWUPS=1`) and an agent's leftover follow-ups become the
97
+ next tasks too — one click each.
98
+ - 🤖 **"Autonomous" means you still have to sit there.** Flip the **Autonomous**
99
+ flag and a run never parks to ask — it keeps going until the task is done. Pair
100
+ it with a **skill** (a Markdown playbook) and you've got fire-and-forget
101
+ automation: hand off "fix this", "upgrade that", "triage these" and walk away.
102
+ - ✅ **The agent finishes and you have to trust it.** cezar ends non-trivial runs at
103
+ a **review gate**: inspect the diff, send notes back into the same session, or
104
+ push a **draft PR** — never an auto-merge.
105
+ - ♻️ **Losing a session when it fails.** Every run records its `claude` session id.
106
+ Take it over interactively in one click (`claude --resume <id>`), or continue it
107
+ in-process from the cockpit.
108
+ - 🔀 **Locked into one agent vendor.** Most tools wed you to a single CLI. cezar
109
+ drives **Claude Code, Codex and OpenCode** through one runner seam — set a
110
+ default, pick a backend per task, or mix them inside one workflow (implement
111
+ with one agent, review with another) — and through **OpenCode** you can point
112
+ a run at **open-source or local models**, not just the big vendors. See
113
+ [Agent backends](#coding-agent-backends).
114
+ - 🖥️ **Close the laptop and the work stops.** A local agent only runs while your
115
+ machine is on and awake. Put cezar on a **VPS, cloud box, or dedicated server**
116
+ and the cockpit becomes the GUI for an **always-on AI coding team** — kick off,
117
+ watch and steer tasks from your laptop or **phone**, on the train or between
118
+ meetings, while the agents keep grinding through the backlog back on the server.
119
+ - ⚡ **Setup tax.** No wizard, no env vars, no schema. Skills are Markdown, workflows
120
+ are short YAML, and everything degrades: no `gh` → works without PRs, no network
121
+ → local skills still load, no `.ai/skills` → the bare prompt still runs.
122
+
123
+ ---
124
+
125
+ ## Who it's for
126
+
127
+ - **Solo devs and small teams** who want the leverage of coding agents without
128
+ handing their code and keys to a SaaS — the agent runs on your subscription,
129
+ on your machine.
130
+ - **`claude` CLI power users** who love headless runs but want to *see* them,
131
+ compare a few attempts side by side, and review a diff before it lands.
132
+ - **Anyone with a backlog** who'd rather queue three tasks into isolated worktrees
133
+ and pick the winners than babysit one terminal.
134
+ - **Teams with shared conventions** who want their playbooks (skills) pulled from
135
+ a git repo, applied consistently, with zero per-project setup.
136
+
137
+ ---
138
+
139
+ ## Quick start
140
+
141
+ **Prerequisites:** Node 20+, at least one logged-in agent CLI — the
142
+ [`claude` CLI](https://github.com/anthropics/claude-code) (Pro/Max subscription),
143
+ the [`codex` CLI](https://github.com/openai/codex), or
144
+ [OpenCode](https://opencode.ai) — and, optionally, `git` and the `gh` CLI.
145
+
146
+ ```bash
147
+ cd your-repo
148
+ npx cezar-cli # start the cockpit for the current repo
149
+ # or: npx @open-mercato/cezar
150
+ ```
151
+
152
+ The cockpit opens at `http://localhost:4321` (auto-picks the next free port if
153
+ busy). Type a task, pick a workflow, hit **Start**. That's it.
154
+
155
+ ```bash
156
+ npx cezar-cli run "add a --json flag to the export command" # headless, CI-friendly
157
+ npx cezar-cli init # scaffold .ai/cezar/
158
+ ```
159
+
160
+ Both the `cezar` and `cez` commands are installed, so once it's on your PATH you
161
+ can run either. No API key is ever used — cezar shells out to whichever agent
162
+ CLIs you are already logged into, `claude` by default.
163
+
164
+ > **Contributing?** [Local development](#local-development) shows how to get a
165
+ > global `cezar` command straight off your checkout (`npm run install-as-command`)
166
+ > — no publish needed.
167
+
168
+ > **Just kicking the tires?** Set `CEZ_DRY_RUN=1` to run against a bundled mock
169
+ > instead of the real CLI — the whole cockpit works with no `claude` login, so
170
+ > you can explore runs, diffs, variants and the review gate offline.
171
+
172
+ ### Preview builds
173
+
174
+ Every green CI run publishes an installable npm snapshot
175
+ ([how it works](docs/publishing.md)), so you can try unreleased code without
176
+ cloning anything:
177
+
178
+ ```bash
179
+ npx cezar-cli@develop # current develop head
180
+ npx cezar-cli@main # current main head (ahead of the latest stable release)
181
+ ```
182
+
183
+ Every pull request gets its own preview too — the CI bot posts a sticky comment
184
+ on the PR with the exact pinned version to copy-paste
185
+ (`npx cezar-cli@<version>-pr<N>.<run>`). Previews are prerelease versions under
186
+ their own dist-tags; a plain `npx cezar-cli` always resolves to the latest
187
+ stable release.
188
+
189
+ ---
190
+
191
+ ## How it works
192
+
193
+ You describe a task. cezar runs it as a **workflow** — an ordered list of agent
194
+ steps and shell checks — shelling out to your locally installed agent CLI
195
+ (Claude Code by default; Codex and OpenCode are drop-in alternatives, per task
196
+ or per step). Each task gets its own git worktree; the cockpit streams every
197
+ event live and parks the run at a review gate when there's a diff to inspect.
198
+
199
+ ```
200
+ you type a task
201
+
202
+
203
+ ┌─────────────┐ optional: Plan → AI drafts a chain of steps you approve
204
+ │ workflow │ (agent steps + shell checks, with bounded onFail retries)
205
+ └─────────────┘
206
+
207
+
208
+ ┌──────────────────────────────┐ ┌───────────────────────────────┐
209
+ │ git worktree per task │ │ agent CLI (your login) │
210
+ │ (isolated branch, parallel) │◄───►│ claude · codex · opencode │
211
+ └──────────────────────────────┘ │ Bash open · no prompts │
212
+ │ └───────────────────────────────┘
213
+ │ agent text · tool calls · tool results · tokens · cost
214
+
215
+ ┌─────────────┐ SSE (replay + live) ┌──────────────────────────┐
216
+ │ .ai/cezar/ │ ──────────────────────► │ cockpit localhost:4321 │
217
+ │ JSON·NDJSON │ │ Tasks · Git · GitHub · │
218
+ │ ·Markdown │ │ Skills · Workflows │
219
+ └─────────────┘ └──────────────────────────┘
220
+
221
+ review gate: read the diff →
222
+ send notes back · draft PR · finish
223
+ ```
224
+
225
+ When a check fails, the workflow can loop back to an earlier step (bounded by
226
+ `max`) with the failing output appended to the retried agent's prompt. Nothing
227
+ auto-merges: a run with changes rests in `review` until you act on it.
228
+
229
+ ---
230
+
231
+ ## Core concepts
232
+
233
+ Three words, no jargon — **task**, **skill**, **chain**:
234
+
235
+ - 📋 **Tasks** are the unit of work. Every task is a **run**: `queued → running →
236
+ review / done / failed / cancelled`, with a live event log, per-step token and
237
+ cost usage, cancel/delete, and — for anything with a diff — a review gate. Paste
238
+ screenshots into the task, or send follow-up messages into the live session
239
+ while it works.
240
+ - 📖 **Skills** are Markdown playbooks. Drop them in `.ai/skills/` or
241
+ `.ai/cezar/skills/`, or pull them from a shared **team skills repo** (a bare
242
+ git clone cached globally in `~/.cache/cez/`). A workflow step references one by
243
+ `skill: <name>` and its body becomes the agent's extra system prompt — so you
244
+ shape *how* the agent reasons without touching code.
245
+ - 🔗 **Chains (workflows)** stitch steps into a pipeline: agent steps plus shell
246
+ checks, with bounded `onFail` retry loops. Write the YAML yourself, build one by
247
+ drag-ordering skills in the **Workflows** tab, or press **Plan first** and let the
248
+ AI draft a chain for your task that you review, trim and start. The built-in
249
+ `quick-task` (one agent step) works with zero setup.
250
+
251
+ Five moves that make the cockpit worth the browser tab:
252
+
253
+ - 🗃️ **Queue + orchestration.** Start as many tasks as you like: cezar runs up to
254
+ `maxParallel` at once (default **2**; a non-git directory always runs one) and
255
+ holds the rest in a FIFO queue with visible positions (`#1`, `#2`, …). Cancel a
256
+ queued task before it starts; the queue even survives a cockpit restart —
257
+ everything still `queued` is re-enqueued in order. It's the orchestration layer
258
+ that turns "one agent at a time" into a backlog that drains itself.
259
+ - 🧠 **Memory-aware runs.** Each run's whole process tree is sampled (~2 s) for CPU
260
+ and RSS, and its **peak memory** is recorded and shown in the task table. Set an
261
+ optional per-task **memory ceiling** (`memoryLimitMb`) and a run that crosses it
262
+ is *paused* — freeing its tree so the queue keeps advancing — and resumes on
263
+ demand. Event logs are append-only NDJSON and streamed rather than re-serialized,
264
+ and live UI deltas are coalesced so they never hit disk.
265
+ - 🪞 **Parallel variants (×2 / ×3).** Run the same task as competing agents in
266
+ separate worktrees, then compare their diffs side by side and **pick** one —
267
+ the losers are archived and their worktrees cleaned up.
268
+ - 🧹 **Bounded worktree disk.** Each task runs in its own full checkout, so a busy
269
+ cockpit would otherwise grow without limit. cezar keeps only the last
270
+ `worktreeRetention` **finished** worktrees on disk (default **10**; `0` =
271
+ unlimited) and reclaims the rest — directory only, the `cez/<id8>` branch is
272
+ always kept, so the work stays recoverable. Settings → Resources shows every
273
+ worktree's disk use with per-row delete and a **Reclaim now** button.
274
+ - 🛡️ **Review gate.** A finished run with changes waits in `review`. Read the diff,
275
+ type notes that go straight back into the agent's session, or push a
276
+ `gh pr create --draft`. You stay the merge button.
277
+ - 📱 **Runs on your coding server, drives from your pocket.** The cockpit is a
278
+ responsive web app streaming over SSE, so the box running cezar can be a
279
+ **VPS, cloud, or dedicated server** you never sit in front of. Point a browser
280
+ — laptop or **phone** — at it and run an **always-on coding team** on the move:
281
+ start tasks, watch them live, and hit the review gate from anywhere.
282
+
283
+ ---
284
+
285
+ ## Cockpit tour
286
+
287
+ Seven views, one browser window, all live over Server-Sent Events (six until you opt into the Inbox):
288
+
289
+ | View | What's in it |
290
+ |---|---|
291
+ | **Tasks** | Every task with its status, live event stream (agent text · tool calls · tool results · pasted/generated screenshots), tokens and cost. Continue, cancel, open in terminal (`claude --resume`), review the diff, or push a draft PR. |
292
+ | **Inbox** | **Opt-in** (`CEZ_FOLLOWUPS=1`; hidden by default). Follow-ups an agent left behind (`todos.json`) — one click turns a suggestion into the next task, pre-wired to its suggested skill. Off, agents are never asked to leave follow-ups; each task's own **Notes** handoff journal is unaffected. |
293
+ | **Git** | Branch, working-tree status, diff vs HEAD, recent commits (click one for its inline patch + GitHub link), and the configurable base branch that worktrees fork from and PRs target. |
294
+ | **GitHub** | Open issues and PRs of the repo's origin, read through your logged-in `gh`. Hand an issue straight to the agent — pick a workflow and skills, one click runs it. |
295
+ | **Skills** | Local skills plus the team skills repo, with a rendered body + prompt preview. Refresh pulls the latest from the remote. |
296
+ | **Workflows** | Build a chain by drag-ordering skills, save it as portable YAML, import/export, or delete. Built-ins always come back. |
297
+ | **Settings** | Appearance (dark/light theme, accent, density), agent backends, notifications, and the skills catalog. |
298
+
299
+ The cockpit is a React app served pre-built from the package — `npx cezar-cli`
300
+ still means no build step and no dev server on your machine — with a dark/light
301
+ theme, a ⌘K command palette, and bookmarklets that launch a task straight from
302
+ a GitHub page.
303
+
304
+ ---
305
+
306
+ ## Workflow format
307
+
308
+ A workflow is a small YAML file in `.ai/cezar/workflows/`:
309
+
310
+ ```yaml
311
+ name: fix-and-verify
312
+ description: Implement the task, then verify; retry with failing output on red.
313
+ steps:
314
+ - id: implement
315
+ name: Implement
316
+ prompt: "{{task}}"
317
+ skill: project-conventions # optional — from .ai/skills or .ai/cezar/skills
318
+ # model: opus # optional per-step model override
319
+ # runner: codex # optional per-step backend: claude · codex · opencode
320
+ # allowedTools: [Read, Edit, Write, Grep, Glob, Bash]
321
+ - id: verify
322
+ name: Verify
323
+ command: "npm test" # a check step: exit 0 passes
324
+ onFail:
325
+ retry: implement # loop back to an earlier step…
326
+ max: 2 # …at most twice
327
+ ```
328
+
329
+ `{{task}}` is replaced with the task text you typed. When a check fails and loops
330
+ back, its failing output is appended to the retried agent's prompt so the next
331
+ attempt can see what broke.
332
+
333
+ Prefer skills over steps? A workflow can also be written in the portable
334
+ shorthand — an ordered list of skill names, each becoming one agent step:
335
+
336
+ ```yaml
337
+ name: triage-and-fix
338
+ skills: [reproduce, root-cause, implement, self-review]
339
+ ```
340
+
341
+ ---
342
+
343
+ ## How it runs agents
344
+
345
+ cezar shells out to your locally installed, logged-in agent CLI —
346
+ **your subscription, no API key**. With the default Claude Code backend that
347
+ means headless `stream-json` mode, tool access via `--allowedTools`, with
348
+ unapproved tools denied without prompting (`--permission-mode dontAsk`) inside
349
+ the task's worktree — but note the zero-config default list (`Read`, `Edit`,
350
+ `Write`, `Grep`, `Glob`, `Bash`) grants unrestricted `Bash` unless a step sets
351
+ `bashAllowlist`, so treat a run as having full shell access in its worktree,
352
+ not a sandboxed allowlist. Set `CEZ_APPROVAL_GATE=1` to opt into Claude's
353
+ interactive approval UI. Codex and OpenCode are driven through their own
354
+ native protocols and don't honor `allowedTools` at all — see
355
+ [Coding agent backends](#coding-agent-backends) for what each one actually
356
+ locks down. Nothing runs on a server you don't own.
357
+
358
+ Useful environment variables:
359
+
360
+ | Var | Effect |
361
+ |---|---|
362
+ | `CEZ_DRY_RUN=1` | Use the bundled mock instead of the real `claude` CLI — the entire cockpit works offline, for demos and development. |
363
+ | `CEZ_APPROVAL_GATE=1` | Opt into Claude's interactive approval UI; by default, unapproved tools are denied without interrupting the run. |
364
+ | `CEZ_FOLLOWUPS=1` | Turn on the global follow-up **Inbox**: agents are asked to leave follow-ups in `todos.json` when they finish, and the Inbox view appears. Off by default — each task's own **Notes** handoff journal runs either way. |
365
+ | `CEZ_AUTOSAVE=1` | Re-enable the periodic (90 s) `cezar autosave` commit in task worktrees. Off by default (#471) — turn-end and pre-PR flushes always run, so branches still end complete. |
366
+ | `CEZ_CLAUDE_BIN=/path/to/claude` | Override which `claude` binary is used. |
367
+ | `CEZ_CODEX_BIN=/path/to/codex` | Override which `codex` binary is used. |
368
+ | `CEZ_OPENCODE_BIN=/path/to/opencode` | Override which `opencode` binary is used. |
369
+ | `GITHUB_TOKEN` | Fallback for GitHub reads/PRs when `gh` isn't authenticated. |
370
+ | `CEZ_TITLE_UPDATES=0` | Turn off the live task-title refresh (namer re-runs on each turn end). The Settings → Agents toggle overrides this default. |
371
+ | `CEZ_AUTONAME=0` | Disable ALL LLM task naming (creation + live) — titles stay heuristic (`437: /om-auto-review-pr`). Under `CEZ_DRY_RUN=1` naming is already off unless forced with `CEZ_AUTONAME=1`. |
372
+ | `CEZ_REVIEW_GATE=1` | Turn ON the optional diff-first review gate (#489): a successful, non-autonomous run with changes parks at `review` (Accept / Send back / Draft PR) instead of finishing. Off by default — changed runs settle to `done` with the diff left in the worktree. Only `1` enables. The Settings → Agents toggle overrides this; autonomous runs always skip it. |
373
+ | `CEZ_NO_BANNER=1` | Skip the `open-mercato/skills` banner on `cezar serve` startup. Dismissing the same banner in the cockpit silences the terminal one too. |
374
+
375
+ ---
376
+
377
+ ## Coding agent backends
378
+
379
+ cezar is not married to one vendor. Every agent step runs through a single
380
+ `AgentRunner` seam with three built-in backends:
381
+
382
+ | Backend | CLI | How cezar drives it | Tool access |
383
+ |---|---|---|---|
384
+ | **Claude Code** (default) | [`claude`](https://github.com/anthropics/claude-code) | Headless `stream-json` mode. | Per-tool `--allowedTools` (`bashAllowlist` scopes `Bash`); `dontAsk` denies unapproved tools without prompting (`CEZ_APPROVAL_GATE=1` → `acceptEdits` + approval UI). |
385
+ | **Codex** | [`codex`](https://github.com/openai/codex) | `codex app-server` — JSON-RPC over stdio, the same transport the Codex IDE extensions use. | Ignores `allowedTools`; runs its own `workspace-write` sandbox with `approvalPolicy: never` and network access on. |
386
+ | **OpenCode** | [`opencode`](https://opencode.ai) | `opencode serve` — a local HTTP server with an SSE event stream. | Ignores `allowedTools` entirely; every permission is auto-approved. |
387
+
388
+ On startup cezar probes which CLIs are installed and the cockpit only offers
389
+ the backends it found — install any one of the three and you're operational.
390
+
391
+ **Pick a backend at three levels** (most specific wins):
392
+
393
+ 1. **Config default** — `"defaultRunner": "codex"` in `.ai/cezar/config.json`.
394
+ 2. **Per task** — the backend picker next to the task box in the cockpit.
395
+ 3. **Per workflow step** — `runner:` on any step in the YAML.
396
+
397
+ Per-step overrides are what make **mixed-agent strategies** a one-liner:
398
+ implement with one agent, review with another, and let a shell check referee:
399
+
400
+ ```yaml
401
+ name: implement-and-cross-review
402
+ steps:
403
+ - id: implement
404
+ name: Implement
405
+ prompt: "{{task}}"
406
+ runner: codex # one vendor writes the code…
407
+ - id: review
408
+ name: Cross-review
409
+ prompt: "Review the diff produced for: {{task}}. Fix real issues only."
410
+ runner: claude # …another one reviews it
411
+ - id: verify
412
+ name: Verify
413
+ command: "npm test"
414
+ onFail: { retry: implement, max: 2 }
415
+ ```
416
+
417
+ Parallel variants (×2/×3) of one task share that task's backend — mixing
418
+ happens per task and per step, not inside a variant group.
419
+
420
+ The seam is deliberately small: a backend is one class implementing the
421
+ `AgentRunner` interface (`src/core/agent-runner.ts`) that turns a prompt into
422
+ a stream of normalized events. Other CLIs — pi, aider, whatever ships next —
423
+ can slot in the same way.
424
+
425
+ ---
426
+
427
+ ## Remote access (host cezar on a server)
428
+
429
+ cezar runs on `localhost` by default. To reach the cockpit from another machine —
430
+ a shared team box, a VPS, your phone — put an **authenticated public front** in
431
+ front of it. The built-in installer does this interactively, per **platform
432
+ strategy**, and never escalates silently: every privileged command is printed
433
+ and verified, and it ends with a real authenticated end-to-end check.
434
+
435
+ ```bash
436
+ npx cezar-cli server-install --platform ubuntu-vps # stand it up
437
+ npx cezar-cli server-deploy --platform ubuntu-vps # roll out a new version (reload the service)
438
+ npx cezar-cli server-uninstall --platform ubuntu-vps # reverse it
439
+ ```
440
+
441
+ | Provider | `--platform` | Public front | Guide |
442
+ |----------|--------------|--------------|-------|
443
+ | Ubuntu / Debian VPS | `ubuntu-vps` | nginx + Let's Encrypt HTTPS, htpasswd login, systemd | [Step-by-step →](docs/server-install/ubuntu-vps.md) |
444
+ | macOS + ngrok | `macosx-ngrok` | ngrok tunnel + `--basic-auth`, launchd | [Step-by-step →](docs/server-install/macosx-ngrok.md) |
445
+
446
+ See the **[Remote access overview](docs/server-install/README.md)** for how it
447
+ works and how to redeploy new versions.
448
+
449
+ ---
450
+
451
+ ## Configuration (optional)
452
+
453
+ Zero config is the default — everything below is opt-in via
454
+ `.ai/cezar/config.json` (a missing or invalid file simply uses the defaults, and
455
+ never blocks startup):
456
+
457
+ ```jsonc
458
+ {
459
+ "skillsRepos": [{ "repo": "open-mercato/skills", "ref": "main" }], // team skills; [] disables
460
+ "maxParallel": 2, // how many tasks may run at once (non-git dirs always run 1)
461
+ "worktreeRetention": 10, // keep the last N finished worktrees on disk; 0 = unlimited (branch always kept)
462
+ "defaultRunner": "claude", // agent backend: "claude" (default) · "codex" · "opencode"
463
+ "plannerModel": "sonnet", // model the "Plan first" button uses to draft chains
464
+ "baseBranch": "develop" // branch worktrees fork from + PRs target (also settable in the Git tab)
465
+ }
466
+ ```
467
+
468
+ Run data (`runs.json`, NDJSON event logs, worktrees, `todos.json`) is
469
+ git-ignored automatically; your workflows and skills stay committable.
470
+
471
+ ---
472
+
473
+ ## Local development
474
+
475
+ End-to-end, from a fresh clone to a global `cezar` command you can run in **any**
476
+ repo on your machine — no npm publish required.
477
+
478
+ **1. Prerequisites** — Node 20+ and `git` (plus at least one logged-in agent CLI,
479
+ as in [Quick start](#quick-start)).
480
+
481
+ **2. Clone & install**
482
+
483
+ ```bash
484
+ git clone https://github.com/open-mercato/cezar.git
485
+ cd cezar
486
+ npm install
487
+ ```
488
+
489
+ **3. Build** — compiles the server (`tsc → dist/`) and the cockpit
490
+ (`vite build → web/dist/`), then runs the pack gate:
491
+
492
+ ```bash
493
+ npm run build
494
+ ```
495
+
496
+ **4. Install as a global command** — build + put `cezar` / `cez` / `cezar-cli` on
497
+ your PATH pointing at *this checkout*:
498
+
499
+ ```bash
500
+ npm run install-as-command # live link (default) — see the change loop below
501
+ # or: npm run install-as-command:global # self-contained snapshot copy
502
+ ```
503
+
504
+ Now `cd` into any other repo and run it:
505
+
506
+ ```bash
507
+ cd ~/some-other-project
508
+ cezar # cockpit for that repo, straight off your checkout
509
+ cezar-cli --help # same binary; the name matches `npx cezar-cli`
510
+ ```
511
+
512
+ **5. The change loop**
513
+
514
+ - **Link mode** (default): edit source → `npm run build` → the global command
515
+ reflects it immediately. No relink needed. (It is a live symlink into this
516
+ checkout — don't move or delete the checkout while it's linked.)
517
+ - **Snapshot mode** (`:global`): re-run `npm run install-as-command:global` to
518
+ refresh the installed copy. It survives moving/deleting the checkout.
519
+
520
+ **6. Uninstall**
521
+
522
+ ```bash
523
+ npm run uninstall-as-command # removes cezar / cez / cezar-cli (either flavor)
524
+ ```
525
+
526
+ **7. Troubleshooting**
527
+
528
+ - **`cezar: command not found`** after install → your npm global bin dir isn't on
529
+ PATH. The script prints the exact dir; add it to your shell profile
530
+ (`export PATH="$(npm prefix -g)/bin:$PATH"`).
531
+ - **`EACCES` / permission denied** → your global prefix is root-owned. Point npm
532
+ at a user-writable one and retry — **never** sudo:
533
+ `npm config set prefix ~/.npm-global`.
534
+ - **Already installed the published `@open-mercato/cezar` globally?** The
535
+ link/snapshot install replaces it; `uninstall-as-command` removes ours, and
536
+ `npm i -g @open-mercato/cezar` brings the published one back.
537
+
538
+ ### In-checkout scripts
539
+
540
+ ```bash
541
+ npm run dev # server (API :4321) + Vite dev server, opens the cockpit in the browser
542
+ npm run dev:server # tsx src/index.ts — the API server alone
543
+ npm run dev:web # Vite dev server alone (proxies /api to :4321)
544
+ npm run build # tsc → dist/, vite build → web/dist/, then the pack gate
545
+ npm run typecheck # server + web (tsc --noEmit)
546
+ npm test # vitest — server + cockpit unit suites
547
+ npm run test:unit # node:test — fast core-module tests
548
+ npm run test:package # pack/install and exercise the built CLI
549
+ npm run test:e2e # real-browser cockpit suite (agent-browser)
550
+ ```
551
+
552
+ The stack is deliberately small: **TypeScript** (strict, ESM), **Hono** + SSE for
553
+ the server, **Zod** at every boundary, **YAML** for workflows, and a **React 19 +
554
+ Vite + Tailwind v4 + shadcn/ui** cockpit shipped pre-built in `web/dist/` — the
555
+ published package carries the built app, so `npx` users never run a bundler.
556
+ Every module is meant to be read in one sitting.
557
+
558
+ ---
559
+
560
+ ## Relationship to cezar (the SaaS)
561
+
562
+ cez is the radically-simple, single-user sibling of
563
+ [**cezar**](https://github.com/comerito/cezar) — the team SaaS cockpit for
564
+ running agents across the whole GitHub issue lifecycle (auto-triage, webhooks,
565
+ Supabase, multi-repo). Same core ideas — agent runner, skills, declarative
566
+ workflows, a live run cockpit — with none of the accounts, database or cloud.
567
+ Start here; graduate to cezar when a team needs shared visibility.
568
+
569
+ ---
570
+
571
+ ## License
572
+
573
+ **MIT** © Patryk Lewczuk