@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.
- package/README.md +573 -0
- package/dist/config.d.ts +144 -0
- package/dist/config.js +106 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-runner.d.ts +169 -0
- package/dist/core/agent-runner.js +23 -0
- package/dist/core/agent-runner.js.map +1 -0
- package/dist/core/backend-detect.d.ts +16 -0
- package/dist/core/backend-detect.js +118 -0
- package/dist/core/backend-detect.js.map +1 -0
- package/dist/core/claude-cli-runner.d.ts +56 -0
- package/dist/core/claude-cli-runner.js +416 -0
- package/dist/core/claude-cli-runner.js.map +1 -0
- package/dist/core/claude-ui-mapper.d.ts +71 -0
- package/dist/core/claude-ui-mapper.js +567 -0
- package/dist/core/claude-ui-mapper.js.map +1 -0
- package/dist/core/codex-app-server-runner.d.ts +29 -0
- package/dist/core/codex-app-server-runner.js +489 -0
- package/dist/core/codex-app-server-runner.js.map +1 -0
- package/dist/core/codex-ui-mapper.d.ts +63 -0
- package/dist/core/codex-ui-mapper.js +491 -0
- package/dist/core/codex-ui-mapper.js.map +1 -0
- package/dist/core/ndjson.d.ts +6 -0
- package/dist/core/ndjson.js +23 -0
- package/dist/core/ndjson.js.map +1 -0
- package/dist/core/opencode-server-runner.d.ts +30 -0
- package/dist/core/opencode-server-runner.js +488 -0
- package/dist/core/opencode-server-runner.js.map +1 -0
- package/dist/core/opencode-ui-mapper.d.ts +105 -0
- package/dist/core/opencode-ui-mapper.js +588 -0
- package/dist/core/opencode-ui-mapper.js.map +1 -0
- package/dist/core/process-usage.d.ts +63 -0
- package/dist/core/process-usage.js +181 -0
- package/dist/core/process-usage.js.map +1 -0
- package/dist/core/runner-factory.d.ts +8 -0
- package/dist/core/runner-factory.js +22 -0
- package/dist/core/runner-factory.js.map +1 -0
- package/dist/core/tool-display.d.ts +30 -0
- package/dist/core/tool-display.js +156 -0
- package/dist/core/tool-display.js.map +1 -0
- package/dist/core/ui-events.d.ts +308 -0
- package/dist/core/ui-events.js +25 -0
- package/dist/core/ui-events.js.map +1 -0
- package/dist/core/usage.d.ts +11 -0
- package/dist/core/usage.js +15 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/git-worktree.d.ts +88 -0
- package/dist/git-worktree.js +297 -0
- package/dist/git-worktree.js.map +1 -0
- package/dist/handoff.d.ts +62 -0
- package/dist/handoff.js +147 -0
- package/dist/handoff.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +466 -0
- package/dist/index.js.map +1 -0
- package/dist/install-as-command.d.ts +39 -0
- package/dist/install-as-command.js +51 -0
- package/dist/install-as-command.js.map +1 -0
- package/dist/pack-check.d.ts +17 -0
- package/dist/pack-check.js +27 -0
- package/dist/pack-check.js.map +1 -0
- package/dist/paths.d.ts +23 -0
- package/dist/paths.js +34 -0
- package/dist/paths.js.map +1 -0
- package/dist/planner.d.ts +17 -0
- package/dist/planner.js +248 -0
- package/dist/planner.js.map +1 -0
- package/dist/release/snapshot.d.ts +64 -0
- package/dist/release/snapshot.js +75 -0
- package/dist/release/snapshot.js.map +1 -0
- package/dist/release/stable.d.ts +46 -0
- package/dist/release/stable.js +57 -0
- package/dist/release/stable.js.map +1 -0
- package/dist/runs/auto-name.d.ts +75 -0
- package/dist/runs/auto-name.js +168 -0
- package/dist/runs/auto-name.js.map +1 -0
- package/dist/runs/retention.d.ts +60 -0
- package/dist/runs/retention.js +86 -0
- package/dist/runs/retention.js.map +1 -0
- package/dist/runs/review-gate.d.ts +18 -0
- package/dist/runs/review-gate.js +21 -0
- package/dist/runs/review-gate.js.map +1 -0
- package/dist/runs/store.d.ts +408 -0
- package/dist/runs/store.js +526 -0
- package/dist/runs/store.js.map +1 -0
- package/dist/runs/task-refs.d.ts +24 -0
- package/dist/runs/task-refs.js +74 -0
- package/dist/runs/task-refs.js.map +1 -0
- package/dist/runs/ui-event-sink.d.ts +81 -0
- package/dist/runs/ui-event-sink.js +210 -0
- package/dist/runs/ui-event-sink.js.map +1 -0
- package/dist/server/capabilities.d.ts +33 -0
- package/dist/server/capabilities.js +43 -0
- package/dist/server/capabilities.js.map +1 -0
- package/dist/server/forge/github.d.ts +70 -0
- package/dist/server/forge/github.js +375 -0
- package/dist/server/forge/github.js.map +1 -0
- package/dist/server/forge/index.d.ts +24 -0
- package/dist/server/forge/index.js +45 -0
- package/dist/server/forge/index.js.map +1 -0
- package/dist/server/forge/types.d.ts +80 -0
- package/dist/server/forge/types.js +2 -0
- package/dist/server/forge/types.js.map +1 -0
- package/dist/server/git-changes.d.ts +195 -0
- package/dist/server/git-changes.js +497 -0
- package/dist/server/git-changes.js.map +1 -0
- package/dist/server/git.d.ts +26 -0
- package/dist/server/git.js +103 -0
- package/dist/server/git.js.map +1 -0
- package/dist/server/github.d.ts +8 -0
- package/dist/server/github.js +8 -0
- package/dist/server/github.js.map +1 -0
- package/dist/server/launch-key.d.ts +7 -0
- package/dist/server/launch-key.js +33 -0
- package/dist/server/launch-key.js.map +1 -0
- package/dist/server/open-in-app.d.ts +51 -0
- package/dist/server/open-in-app.js +189 -0
- package/dist/server/open-in-app.js.map +1 -0
- package/dist/server/open-in-terminal.d.ts +25 -0
- package/dist/server/open-in-terminal.js +120 -0
- package/dist/server/open-in-terminal.js.map +1 -0
- package/dist/server/pr.d.ts +7 -0
- package/dist/server/pr.js +7 -0
- package/dist/server/pr.js.map +1 -0
- package/dist/server/server.d.ts +41 -0
- package/dist/server/server.js +1390 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/static-ui.d.ts +49 -0
- package/dist/server/static-ui.js +92 -0
- package/dist/server/static-ui.js.map +1 -0
- package/dist/server/wsl.d.ts +25 -0
- package/dist/server/wsl.js +92 -0
- package/dist/server/wsl.js.map +1 -0
- package/dist/server-install/engine.d.ts +33 -0
- package/dist/server-install/engine.js +314 -0
- package/dist/server-install/engine.js.map +1 -0
- package/dist/server-install/platforms/macosx-ngrok.d.ts +6 -0
- package/dist/server-install/platforms/macosx-ngrok.js +345 -0
- package/dist/server-install/platforms/macosx-ngrok.js.map +1 -0
- package/dist/server-install/platforms/ubuntu-vps.d.ts +39 -0
- package/dist/server-install/platforms/ubuntu-vps.js +746 -0
- package/dist/server-install/platforms/ubuntu-vps.js.map +1 -0
- package/dist/server-install/state.d.ts +26 -0
- package/dist/server-install/state.js +125 -0
- package/dist/server-install/state.js.map +1 -0
- package/dist/server-install/steps.d.ts +109 -0
- package/dist/server-install/steps.js +330 -0
- package/dist/server-install/steps.js.map +1 -0
- package/dist/server-install/strategies.d.ts +4 -0
- package/dist/server-install/strategies.js +20 -0
- package/dist/server-install/strategies.js.map +1 -0
- package/dist/server-install/types.d.ts +597 -0
- package/dist/server-install/types.js +98 -0
- package/dist/server-install/types.js.map +1 -0
- package/dist/server-install/ui.d.ts +42 -0
- package/dist/server-install/ui.js +130 -0
- package/dist/server-install/ui.js.map +1 -0
- package/dist/skills-banner.d.ts +21 -0
- package/dist/skills-banner.js +40 -0
- package/dist/skills-banner.js.map +1 -0
- package/dist/skills-remote.d.ts +35 -0
- package/dist/skills-remote.js +266 -0
- package/dist/skills-remote.js.map +1 -0
- package/dist/skills.d.ts +45 -0
- package/dist/skills.js +182 -0
- package/dist/skills.js.map +1 -0
- package/dist/todos.d.ts +63 -0
- package/dist/todos.js +168 -0
- package/dist/todos.js.map +1 -0
- package/dist/ui-state.d.ts +12 -0
- package/dist/ui-state.js +25 -0
- package/dist/ui-state.js.map +1 -0
- package/dist/update-check.d.ts +12 -0
- package/dist/update-check.js +41 -0
- package/dist/update-check.js.map +1 -0
- package/dist/workflows/load.d.ts +15 -0
- package/dist/workflows/load.js +56 -0
- package/dist/workflows/load.js.map +1 -0
- package/dist/workflows/run.d.ts +281 -0
- package/dist/workflows/run.js +1511 -0
- package/dist/workflows/run.js.map +1 -0
- package/dist/workflows/types.d.ts +307 -0
- package/dist/workflows/types.js +171 -0
- package/dist/workflows/types.js.map +1 -0
- package/package.json +90 -0
- package/scripts/check-pack.mjs +46 -0
- package/scripts/dev.mjs +74 -0
- package/scripts/install-as-command.mjs +120 -0
- package/scripts/mock-claude.mjs +310 -0
- package/scripts/release-snapshot.mjs +130 -0
- package/scripts/release.mjs +119 -0
- package/scripts/test-process-usage.mjs +47 -0
- package/web/dist/assets/arrow-left-BE957rJs.js +1 -0
- package/web/dist/assets/bundle-mjs-DLPpRFyl.js +1 -0
- package/web/dist/assets/centered-state-BddhEEtO.js +43 -0
- package/web/dist/assets/chunk-BO2N2NFS-f5igTtpB.js +131 -0
- package/web/dist/assets/command-CjhFbABo.js +1 -0
- package/web/dist/assets/compare-variants-Cs52IAEG.js +1 -0
- package/web/dist/assets/core-BuMqAF_1.js +12 -0
- package/web/dist/assets/css-BsVw1vtW.js +1 -0
- package/web/dist/assets/dialog-DFvXTkFv.js +1 -0
- package/web/dist/assets/diff-view-C9b8AITq.js +4 -0
- package/web/dist/assets/diff-woXpYk--.js +1 -0
- package/web/dist/assets/dist-FBs4wmIY.js +1 -0
- package/web/dist/assets/dist-o_kVMXjg.js +1 -0
- package/web/dist/assets/engine-javascript-FQvzRocB.js +141 -0
- package/web/dist/assets/file-BVuztAOd.js +1 -0
- package/web/dist/assets/folder-0pJ1NZ_S.js +1 -0
- package/web/dist/assets/git-pull-request-DJkAMT0f.js +1 -0
- package/web/dist/assets/git-toolbar-CwhQdx3J.js +1 -0
- package/web/dist/assets/github-D0rAX4-r.js +1 -0
- package/web/dist/assets/go-rLFTqkRN.js +1 -0
- package/web/dist/assets/highlighted-body-OFNGDK62-DGHHie_q.js +1 -0
- package/web/dist/assets/highlighter-BKVEsACy.js +3 -0
- package/web/dist/assets/html-BY76lXLH.js +1 -0
- package/web/dist/assets/index-CEkI7QxN.css +2 -0
- package/web/dist/assets/index-CO2lH2et.js +11 -0
- package/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/web/dist/assets/javascript-BgS3c2Ky.js +1 -0
- package/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/web/dist/assets/json-qhed-kSA.js +1 -0
- package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
- package/web/dist/assets/jsx-Bz0zcwM4.js +1 -0
- package/web/dist/assets/lib-CNGa3Dig.js +1 -0
- package/web/dist/assets/loader-circle-BV3DO9mE.js +1 -0
- package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
- package/web/dist/assets/markdown-D4-ADgH9.js +1 -0
- package/web/dist/assets/mermaid-GHXKKRXX-DM2VsGBG.js +1 -0
- package/web/dist/assets/open-mercato-toBr6SOa.svg +11 -0
- package/web/dist/assets/prompt-templates-C7ptKvDd.js +15 -0
- package/web/dist/assets/python-gzcpVVnB.js +1 -0
- package/web/dist/assets/react-dom-Ddtik4qM.js +1 -0
- package/web/dist/assets/refresh-cw-DCa-Rlwz.js +1 -0
- package/web/dist/assets/repo-git-DIhryGDx.js +1 -0
- package/web/dist/assets/run-diff-Dyow8B1q.js +3 -0
- package/web/dist/assets/run-header-jx9-18b8.js +1 -0
- package/web/dist/assets/rust-Cfkwpbl8.js +1 -0
- package/web/dist/assets/search-x-CoCyl7zT.js +1 -0
- package/web/dist/assets/shellscript-CLZ0U2zV.js +1 -0
- package/web/dist/assets/skill-detail-DB7x_FQp.js +1 -0
- package/web/dist/assets/skills-98vCroU8.js +1 -0
- package/web/dist/assets/skills-BKIoqD6K.js +1 -0
- package/web/dist/assets/sql-BsFa4tDR.js +1 -0
- package/web/dist/assets/square-terminal-B6PZX4Qp.js +1 -0
- package/web/dist/assets/tab-link-C5--YMQd.js +1 -0
- package/web/dist/assets/task-changes-ejxPGVJw.js +1 -0
- package/web/dist/assets/task-commits-C6GO5qT-.js +1 -0
- package/web/dist/assets/task-files-CatpCBXa.js +2 -0
- package/web/dist/assets/task-thread-BMbXDM3d.js +5 -0
- package/web/dist/assets/tasks-table-dgezlCcg.js +1 -0
- package/web/dist/assets/trash-2-CDtxmmc8.js +1 -0
- package/web/dist/assets/triangle-alert-6su4Js5O.js +1 -0
- package/web/dist/assets/tsx-udAQXfEw.js +1 -0
- package/web/dist/assets/typescript-bsJCZSQ-.js +1 -0
- package/web/dist/assets/upload-Bp7hQxll.js +1 -0
- package/web/dist/assets/use-desktop-CvTwojOJ.js +3 -0
- package/web/dist/assets/utils-rQGbOrwc.js +1 -0
- package/web/dist/assets/workflows-Dy2c6790.js +11 -0
- package/web/dist/assets/x-Br_jIDBw.js +1 -0
- package/web/dist/assets/yaml-rwi0_p6S.js +1 -0
- package/web/dist/index.html +70 -0
- 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)
|
|
23
|
+

|
|
24
|
+

|
|
25
|
+

|
|
26
|
+

|
|
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
|
+
| [](docs/screenshots/task-view.png) | [](docs/screenshots/live-run.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
|
+
| [](docs/screenshots/workflow-builder.png) | [](docs/screenshots/github-issues.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
|