@wjarka/cezarion 0.10.0-pr30.54

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 (478) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +838 -0
  3. package/dist/agent-config/account-identity.d.ts +44 -0
  4. package/dist/agent-config/account-identity.js +128 -0
  5. package/dist/agent-config/account-identity.js.map +1 -0
  6. package/dist/agent-config/catalog.d.ts +72 -0
  7. package/dist/agent-config/catalog.js +223 -0
  8. package/dist/agent-config/catalog.js.map +1 -0
  9. package/dist/agent-config/files.d.ts +46 -0
  10. package/dist/agent-config/files.js +119 -0
  11. package/dist/agent-config/files.js.map +1 -0
  12. package/dist/agent-config/model-settings/claude.d.ts +2 -0
  13. package/dist/agent-config/model-settings/claude.js +11 -0
  14. package/dist/agent-config/model-settings/claude.js.map +1 -0
  15. package/dist/agent-config/model-settings/codex.d.ts +2 -0
  16. package/dist/agent-config/model-settings/codex.js +16 -0
  17. package/dist/agent-config/model-settings/codex.js.map +1 -0
  18. package/dist/agent-config/model-settings/opencode.d.ts +2 -0
  19. package/dist/agent-config/model-settings/opencode.js +8 -0
  20. package/dist/agent-config/model-settings/opencode.js.map +1 -0
  21. package/dist/agent-config/model-settings/pi.d.ts +12 -0
  22. package/dist/agent-config/model-settings/pi.js +18 -0
  23. package/dist/agent-config/model-settings/pi.js.map +1 -0
  24. package/dist/agent-config/model-settings/shared.d.ts +9 -0
  25. package/dist/agent-config/model-settings/shared.js +93 -0
  26. package/dist/agent-config/model-settings/shared.js.map +1 -0
  27. package/dist/agent-config/model-settings/types.d.ts +9 -0
  28. package/dist/agent-config/model-settings/types.js +2 -0
  29. package/dist/agent-config/model-settings/types.js.map +1 -0
  30. package/dist/agent-config/models.d.ts +9 -0
  31. package/dist/agent-config/models.js +32 -0
  32. package/dist/agent-config/models.js.map +1 -0
  33. package/dist/agent-config/seed.d.ts +7 -0
  34. package/dist/agent-config/seed.js +90 -0
  35. package/dist/agent-config/seed.js.map +1 -0
  36. package/dist/agent-config/service.d.ts +44 -0
  37. package/dist/agent-config/service.js +71 -0
  38. package/dist/agent-config/service.js.map +1 -0
  39. package/dist/agent-config/validate.d.ts +21 -0
  40. package/dist/agent-config/validate.js +76 -0
  41. package/dist/agent-config/validate.js.map +1 -0
  42. package/dist/automations/coordinator.d.ts +26 -0
  43. package/dist/automations/coordinator.js +66 -0
  44. package/dist/automations/coordinator.js.map +1 -0
  45. package/dist/automations/github-poller.d.ts +74 -0
  46. package/dist/automations/github-poller.js +234 -0
  47. package/dist/automations/github-poller.js.map +1 -0
  48. package/dist/automations/scheduler.d.ts +42 -0
  49. package/dist/automations/scheduler.js +192 -0
  50. package/dist/automations/scheduler.js.map +1 -0
  51. package/dist/automations/store.d.ts +65 -0
  52. package/dist/automations/store.js +298 -0
  53. package/dist/automations/store.js.map +1 -0
  54. package/dist/automations/task-template.d.ts +18 -0
  55. package/dist/automations/task-template.js +95 -0
  56. package/dist/automations/task-template.js.map +1 -0
  57. package/dist/automations/types.d.ts +255 -0
  58. package/dist/automations/types.js +159 -0
  59. package/dist/automations/types.js.map +1 -0
  60. package/dist/config.d.ts +77 -0
  61. package/dist/config.js +242 -0
  62. package/dist/config.js.map +1 -0
  63. package/dist/contract/agent-config.d.ts +153 -0
  64. package/dist/contract/agent-profiles.d.ts +347 -0
  65. package/dist/contract/automations.d.ts +935 -0
  66. package/dist/contract/events.d.ts +104 -0
  67. package/dist/contract/github.d.ts +556 -0
  68. package/dist/contract/health.d.ts +102 -0
  69. package/dist/contract/index.d.ts +16 -0
  70. package/dist/contract/index.js +1895 -0
  71. package/dist/contract/projects.d.ts +210 -0
  72. package/dist/contract/repo.d.ts +234 -0
  73. package/dist/contract/runs.d.ts +1473 -0
  74. package/dist/contract/skills.d.ts +232 -0
  75. package/dist/contract/workflows.d.ts +218 -0
  76. package/dist/contract/workspace.d.ts +579 -0
  77. package/dist/core/agent-env.d.ts +31 -0
  78. package/dist/core/agent-env.js +371 -0
  79. package/dist/core/agent-env.js.map +1 -0
  80. package/dist/core/agent-model-policy.d.ts +10 -0
  81. package/dist/core/agent-model-policy.js +36 -0
  82. package/dist/core/agent-model-policy.js.map +1 -0
  83. package/dist/core/agent-profiles.d.ts +62 -0
  84. package/dist/core/agent-profiles.js +90 -0
  85. package/dist/core/agent-profiles.js.map +1 -0
  86. package/dist/core/agent-runner.d.ts +211 -0
  87. package/dist/core/agent-runner.js +68 -0
  88. package/dist/core/agent-runner.js.map +1 -0
  89. package/dist/core/ask.d.ts +105 -0
  90. package/dist/core/ask.js +187 -0
  91. package/dist/core/ask.js.map +1 -0
  92. package/dist/core/backend-detect.d.ts +16 -0
  93. package/dist/core/backend-detect.js +155 -0
  94. package/dist/core/backend-detect.js.map +1 -0
  95. package/dist/core/claude-cli-runner.d.ts +59 -0
  96. package/dist/core/claude-cli-runner.js +483 -0
  97. package/dist/core/claude-cli-runner.js.map +1 -0
  98. package/dist/core/claude-ui-mapper.d.ts +80 -0
  99. package/dist/core/claude-ui-mapper.js +598 -0
  100. package/dist/core/claude-ui-mapper.js.map +1 -0
  101. package/dist/core/codex-app-server-runner.d.ts +41 -0
  102. package/dist/core/codex-app-server-runner.js +584 -0
  103. package/dist/core/codex-app-server-runner.js.map +1 -0
  104. package/dist/core/codex-app-server-transport.d.ts +35 -0
  105. package/dist/core/codex-app-server-transport.js +150 -0
  106. package/dist/core/codex-app-server-transport.js.map +1 -0
  107. package/dist/core/codex-model-catalog.d.ts +10 -0
  108. package/dist/core/codex-model-catalog.js +110 -0
  109. package/dist/core/codex-model-catalog.js.map +1 -0
  110. package/dist/core/codex-ui-mapper.d.ts +112 -0
  111. package/dist/core/codex-ui-mapper.js +766 -0
  112. package/dist/core/codex-ui-mapper.js.map +1 -0
  113. package/dist/core/model-identity.d.ts +125 -0
  114. package/dist/core/model-identity.js +132 -0
  115. package/dist/core/model-identity.js.map +1 -0
  116. package/dist/core/model-presets.d.ts +21 -0
  117. package/dist/core/model-presets.js +81 -0
  118. package/dist/core/model-presets.js.map +1 -0
  119. package/dist/core/ndjson.d.ts +6 -0
  120. package/dist/core/ndjson.js +23 -0
  121. package/dist/core/ndjson.js.map +1 -0
  122. package/dist/core/opencode-model-catalog.d.ts +32 -0
  123. package/dist/core/opencode-model-catalog.js +153 -0
  124. package/dist/core/opencode-model-catalog.js.map +1 -0
  125. package/dist/core/opencode-server-runner.d.ts +32 -0
  126. package/dist/core/opencode-server-runner.js +882 -0
  127. package/dist/core/opencode-server-runner.js.map +1 -0
  128. package/dist/core/opencode-ui-mapper.d.ts +137 -0
  129. package/dist/core/opencode-ui-mapper.js +800 -0
  130. package/dist/core/opencode-ui-mapper.js.map +1 -0
  131. package/dist/core/pi-model-catalog.d.ts +31 -0
  132. package/dist/core/pi-model-catalog.js +152 -0
  133. package/dist/core/pi-model-catalog.js.map +1 -0
  134. package/dist/core/pi-runner.d.ts +24 -0
  135. package/dist/core/pi-runner.js +403 -0
  136. package/dist/core/pi-runner.js.map +1 -0
  137. package/dist/core/pi-ui-mapper.d.ts +36 -0
  138. package/dist/core/pi-ui-mapper.js +304 -0
  139. package/dist/core/pi-ui-mapper.js.map +1 -0
  140. package/dist/core/process-usage.d.ts +66 -0
  141. package/dist/core/process-usage.js +193 -0
  142. package/dist/core/process-usage.js.map +1 -0
  143. package/dist/core/provider-auth.d.ts +154 -0
  144. package/dist/core/provider-auth.js +509 -0
  145. package/dist/core/provider-auth.js.map +1 -0
  146. package/dist/core/provider-availability.d.ts +3 -0
  147. package/dist/core/provider-availability.js +14 -0
  148. package/dist/core/provider-availability.js.map +1 -0
  149. package/dist/core/runner-factory.d.ts +8 -0
  150. package/dist/core/runner-factory.js +25 -0
  151. package/dist/core/runner-factory.js.map +1 -0
  152. package/dist/core/runner-model-catalog.d.ts +29 -0
  153. package/dist/core/runner-model-catalog.js +78 -0
  154. package/dist/core/runner-model-catalog.js.map +1 -0
  155. package/dist/core/secret-redaction.d.ts +37 -0
  156. package/dist/core/secret-redaction.js +115 -0
  157. package/dist/core/secret-redaction.js.map +1 -0
  158. package/dist/core/shell-env.d.ts +28 -0
  159. package/dist/core/shell-env.js +56 -0
  160. package/dist/core/shell-env.js.map +1 -0
  161. package/dist/core/tool-display.d.ts +31 -0
  162. package/dist/core/tool-display.js +179 -0
  163. package/dist/core/tool-display.js.map +1 -0
  164. package/dist/core/ui-events.d.ts +335 -0
  165. package/dist/core/ui-events.js +25 -0
  166. package/dist/core/ui-events.js.map +1 -0
  167. package/dist/core/usage-limit.d.ts +42 -0
  168. package/dist/core/usage-limit.js +209 -0
  169. package/dist/core/usage-limit.js.map +1 -0
  170. package/dist/core/usage.d.ts +11 -0
  171. package/dist/core/usage.js +15 -0
  172. package/dist/core/usage.js.map +1 -0
  173. package/dist/core/v1-text-coalescer.d.ts +36 -0
  174. package/dist/core/v1-text-coalescer.js +72 -0
  175. package/dist/core/v1-text-coalescer.js.map +1 -0
  176. package/dist/git-diff-base.d.ts +85 -0
  177. package/dist/git-diff-base.js +180 -0
  178. package/dist/git-diff-base.js.map +1 -0
  179. package/dist/git-refs.d.ts +11 -0
  180. package/dist/git-refs.js +14 -0
  181. package/dist/git-refs.js.map +1 -0
  182. package/dist/git-worktree.d.ts +161 -0
  183. package/dist/git-worktree.js +508 -0
  184. package/dist/git-worktree.js.map +1 -0
  185. package/dist/handoff.d.ts +62 -0
  186. package/dist/handoff.js +154 -0
  187. package/dist/handoff.js.map +1 -0
  188. package/dist/index.d.ts +2 -0
  189. package/dist/index.js +680 -0
  190. package/dist/index.js.map +1 -0
  191. package/dist/install-as-command.d.ts +40 -0
  192. package/dist/install-as-command.js +52 -0
  193. package/dist/install-as-command.js.map +1 -0
  194. package/dist/pack-check.d.ts +17 -0
  195. package/dist/pack-check.js +27 -0
  196. package/dist/pack-check.js.map +1 -0
  197. package/dist/paths.d.ts +140 -0
  198. package/dist/paths.js +192 -0
  199. package/dist/paths.js.map +1 -0
  200. package/dist/planner.d.ts +27 -0
  201. package/dist/planner.js +268 -0
  202. package/dist/planner.js.map +1 -0
  203. package/dist/release/manifests.d.ts +81 -0
  204. package/dist/release/manifests.js +74 -0
  205. package/dist/release/manifests.js.map +1 -0
  206. package/dist/release/snapshot.d.ts +67 -0
  207. package/dist/release/snapshot.js +97 -0
  208. package/dist/release/snapshot.js.map +1 -0
  209. package/dist/release/stable.d.ts +38 -0
  210. package/dist/release/stable.js +55 -0
  211. package/dist/release/stable.js.map +1 -0
  212. package/dist/runs/agent-tmpdir.d.ts +41 -0
  213. package/dist/runs/agent-tmpdir.js +183 -0
  214. package/dist/runs/agent-tmpdir.js.map +1 -0
  215. package/dist/runs/auto-name.d.ts +75 -0
  216. package/dist/runs/auto-name.js +179 -0
  217. package/dist/runs/auto-name.js.map +1 -0
  218. package/dist/runs/event-history.d.ts +50 -0
  219. package/dist/runs/event-history.js +613 -0
  220. package/dist/runs/event-history.js.map +1 -0
  221. package/dist/runs/retention.d.ts +60 -0
  222. package/dist/runs/retention.js +86 -0
  223. package/dist/runs/retention.js.map +1 -0
  224. package/dist/runs/review-gate.d.ts +18 -0
  225. package/dist/runs/review-gate.js +21 -0
  226. package/dist/runs/review-gate.js.map +1 -0
  227. package/dist/runs/run-index.d.ts +19 -0
  228. package/dist/runs/run-index.js +43 -0
  229. package/dist/runs/run-index.js.map +1 -0
  230. package/dist/runs/store.d.ts +446 -0
  231. package/dist/runs/store.js +1118 -0
  232. package/dist/runs/store.js.map +1 -0
  233. package/dist/runs/task-markers.d.ts +28 -0
  234. package/dist/runs/task-markers.js +74 -0
  235. package/dist/runs/task-markers.js.map +1 -0
  236. package/dist/runs/task-refs.d.ts +25 -0
  237. package/dist/runs/task-refs.js +74 -0
  238. package/dist/runs/task-refs.js.map +1 -0
  239. package/dist/runs/ui-event-sink.d.ts +81 -0
  240. package/dist/runs/ui-event-sink.js +210 -0
  241. package/dist/runs/ui-event-sink.js.map +1 -0
  242. package/dist/server/app-type.d.ts +21 -0
  243. package/dist/server/app-type.js +2 -0
  244. package/dist/server/app-type.js.map +1 -0
  245. package/dist/server/capabilities.d.ts +70 -0
  246. package/dist/server/capabilities.js +152 -0
  247. package/dist/server/capabilities.js.map +1 -0
  248. package/dist/server/checkout.d.ts +128 -0
  249. package/dist/server/checkout.js +296 -0
  250. package/dist/server/checkout.js.map +1 -0
  251. package/dist/server/forge/github.d.ts +513 -0
  252. package/dist/server/forge/github.js +2364 -0
  253. package/dist/server/forge/github.js.map +1 -0
  254. package/dist/server/forge/index.d.ts +40 -0
  255. package/dist/server/forge/index.js +72 -0
  256. package/dist/server/forge/index.js.map +1 -0
  257. package/dist/server/forge/types.d.ts +242 -0
  258. package/dist/server/forge/types.js +2 -0
  259. package/dist/server/forge/types.js.map +1 -0
  260. package/dist/server/fs-browse.d.ts +105 -0
  261. package/dist/server/fs-browse.js +182 -0
  262. package/dist/server/fs-browse.js.map +1 -0
  263. package/dist/server/git-changes.d.ts +213 -0
  264. package/dist/server/git-changes.js +555 -0
  265. package/dist/server/git-changes.js.map +1 -0
  266. package/dist/server/git.d.ts +28 -0
  267. package/dist/server/git.js +112 -0
  268. package/dist/server/git.js.map +1 -0
  269. package/dist/server/github.d.ts +9 -0
  270. package/dist/server/github.js +8 -0
  271. package/dist/server/github.js.map +1 -0
  272. package/dist/server/launch-key.d.ts +7 -0
  273. package/dist/server/launch-key.js +33 -0
  274. package/dist/server/launch-key.js.map +1 -0
  275. package/dist/server/open-in-app.d.ts +66 -0
  276. package/dist/server/open-in-app.js +211 -0
  277. package/dist/server/open-in-app.js.map +1 -0
  278. package/dist/server/open-in-terminal.d.ts +70 -0
  279. package/dist/server/open-in-terminal.js +179 -0
  280. package/dist/server/open-in-terminal.js.map +1 -0
  281. package/dist/server/pr.d.ts +7 -0
  282. package/dist/server/pr.js +7 -0
  283. package/dist/server/pr.js.map +1 -0
  284. package/dist/server/project-context.d.ts +120 -0
  285. package/dist/server/project-context.js +182 -0
  286. package/dist/server/project-context.js.map +1 -0
  287. package/dist/server/provider-action-gate.d.ts +8 -0
  288. package/dist/server/provider-action-gate.js +56 -0
  289. package/dist/server/provider-action-gate.js.map +1 -0
  290. package/dist/server/provider-auth-runtime.d.ts +21 -0
  291. package/dist/server/provider-auth-runtime.js +66 -0
  292. package/dist/server/provider-auth-runtime.js.map +1 -0
  293. package/dist/server/server.d.ts +13138 -0
  294. package/dist/server/server.js +5263 -0
  295. package/dist/server/server.js.map +1 -0
  296. package/dist/server/static-ui.d.ts +49 -0
  297. package/dist/server/static-ui.js +92 -0
  298. package/dist/server/static-ui.js.map +1 -0
  299. package/dist/server/validators.d.ts +97 -0
  300. package/dist/server/validators.js +86 -0
  301. package/dist/server/validators.js.map +1 -0
  302. package/dist/server/ws.d.ts +85 -0
  303. package/dist/server/ws.js +218 -0
  304. package/dist/server/ws.js.map +1 -0
  305. package/dist/server/wsl.d.ts +25 -0
  306. package/dist/server/wsl.js +92 -0
  307. package/dist/server/wsl.js.map +1 -0
  308. package/dist/server-install/engine.d.ts +50 -0
  309. package/dist/server-install/engine.js +324 -0
  310. package/dist/server-install/engine.js.map +1 -0
  311. package/dist/server-install/platforms/macosx-ngrok.d.ts +6 -0
  312. package/dist/server-install/platforms/macosx-ngrok.js +345 -0
  313. package/dist/server-install/platforms/macosx-ngrok.js.map +1 -0
  314. package/dist/server-install/platforms/ubuntu-vps.d.ts +78 -0
  315. package/dist/server-install/platforms/ubuntu-vps.js +1016 -0
  316. package/dist/server-install/platforms/ubuntu-vps.js.map +1 -0
  317. package/dist/server-install/state.d.ts +52 -0
  318. package/dist/server-install/state.js +182 -0
  319. package/dist/server-install/state.js.map +1 -0
  320. package/dist/server-install/steps.d.ts +109 -0
  321. package/dist/server-install/steps.js +334 -0
  322. package/dist/server-install/steps.js.map +1 -0
  323. package/dist/server-install/strategies.d.ts +4 -0
  324. package/dist/server-install/strategies.js +20 -0
  325. package/dist/server-install/strategies.js.map +1 -0
  326. package/dist/server-install/types.d.ts +287 -0
  327. package/dist/server-install/types.js +121 -0
  328. package/dist/server-install/types.js.map +1 -0
  329. package/dist/server-install/ui.d.ts +42 -0
  330. package/dist/server-install/ui.js +130 -0
  331. package/dist/server-install/ui.js.map +1 -0
  332. package/dist/skills-banner.d.ts +22 -0
  333. package/dist/skills-banner.js +41 -0
  334. package/dist/skills-banner.js.map +1 -0
  335. package/dist/skills-remote.d.ts +84 -0
  336. package/dist/skills-remote.js +468 -0
  337. package/dist/skills-remote.js.map +1 -0
  338. package/dist/skills-update.d.ts +88 -0
  339. package/dist/skills-update.js +392 -0
  340. package/dist/skills-update.js.map +1 -0
  341. package/dist/skills.d.ts +82 -0
  342. package/dist/skills.js +251 -0
  343. package/dist/skills.js.map +1 -0
  344. package/dist/todos.d.ts +48 -0
  345. package/dist/todos.js +201 -0
  346. package/dist/todos.js.map +1 -0
  347. package/dist/ui-state.d.ts +26 -0
  348. package/dist/ui-state.js +38 -0
  349. package/dist/ui-state.js.map +1 -0
  350. package/dist/update-check.d.ts +12 -0
  351. package/dist/update-check.js +41 -0
  352. package/dist/update-check.js.map +1 -0
  353. package/dist/workflows/load.d.ts +15 -0
  354. package/dist/workflows/load.js +56 -0
  355. package/dist/workflows/load.js.map +1 -0
  356. package/dist/workflows/run.d.ts +758 -0
  357. package/dist/workflows/run.js +3389 -0
  358. package/dist/workflows/run.js.map +1 -0
  359. package/dist/workflows/types.d.ts +153 -0
  360. package/dist/workflows/types.js +212 -0
  361. package/dist/workflows/types.js.map +1 -0
  362. package/dist/workspace/agent-accounts.d.ts +153 -0
  363. package/dist/workspace/agent-accounts.js +304 -0
  364. package/dist/workspace/agent-accounts.js.map +1 -0
  365. package/dist/workspace/agent-profiles.d.ts +78 -0
  366. package/dist/workspace/agent-profiles.js +115 -0
  367. package/dist/workspace/agent-profiles.js.map +1 -0
  368. package/dist/workspace/config.d.ts +169 -0
  369. package/dist/workspace/config.js +379 -0
  370. package/dist/workspace/config.js.map +1 -0
  371. package/dist/workspace/migrations.d.ts +45 -0
  372. package/dist/workspace/migrations.js +147 -0
  373. package/dist/workspace/migrations.js.map +1 -0
  374. package/dist/workspace/projects-cli.d.ts +25 -0
  375. package/dist/workspace/projects-cli.js +172 -0
  376. package/dist/workspace/projects-cli.js.map +1 -0
  377. package/dist/workspace/projects.d.ts +109 -0
  378. package/dist/workspace/projects.js +250 -0
  379. package/dist/workspace/projects.js.map +1 -0
  380. package/dist/workspace/semaphore.d.ts +179 -0
  381. package/dist/workspace/semaphore.js +195 -0
  382. package/dist/workspace/semaphore.js.map +1 -0
  383. package/dist/workspace/ui-state.d.ts +34 -0
  384. package/dist/workspace/ui-state.js +53 -0
  385. package/dist/workspace/ui-state.js.map +1 -0
  386. package/package.json +70 -0
  387. package/scripts/check-pack.mjs +46 -0
  388. package/scripts/inline-contract.mjs +112 -0
  389. package/scripts/install-as-command.mjs +120 -0
  390. package/scripts/mock-claude.mjs +520 -0
  391. package/scripts/mock-pi-rpc.mjs +83 -0
  392. package/scripts/sync-readme.mjs +20 -0
  393. package/scripts/test-process-usage.mjs +47 -0
  394. package/web/dist/assets/alert-dialog-B4Ofsgv7.js +1 -0
  395. package/web/dist/assets/arrow-down-Dy8dup7j.js +1 -0
  396. package/web/dist/assets/arrow-left-BJaucbhn.js +1 -0
  397. package/web/dist/assets/bundle-mjs-BT31bpU6.js +1 -0
  398. package/web/dist/assets/centered-state-duPW0phQ.js +43 -0
  399. package/web/dist/assets/chevron-right-Be4A5TCS.js +1 -0
  400. package/web/dist/assets/chunk-BO2N2NFS-DE6qKn3r.js +131 -0
  401. package/web/dist/assets/collapsible-DdcNBdSk.js +1 -0
  402. package/web/dist/assets/commit-list-CgvN9vec.js +1 -0
  403. package/web/dist/assets/compare-variants-CQA2nd65.js +1 -0
  404. package/web/dist/assets/core-BCsw8oQw.js +12 -0
  405. package/web/dist/assets/css-BsVw1vtW.js +1 -0
  406. package/web/dist/assets/diff-B6Agp5Hl.js +3 -0
  407. package/web/dist/assets/diff-stat-BoXuGkgq.js +1 -0
  408. package/web/dist/assets/diff-view-CD8XI-fj.js +6 -0
  409. package/web/dist/assets/diff-woXpYk--.js +1 -0
  410. package/web/dist/assets/dropdown-menu-B3SYw-k5.js +1 -0
  411. package/web/dist/assets/editable-title-B-hjp5wl.js +1 -0
  412. package/web/dist/assets/ellipsis-vertical-BYwzw0xl.js +1 -0
  413. package/web/dist/assets/engine-javascript-FQvzRocB.js +141 -0
  414. package/web/dist/assets/file-BRj5eISx.js +1 -0
  415. package/web/dist/assets/folder-z4oT5981.js +1 -0
  416. package/web/dist/assets/git-toolbar-owSEkYld.js +1 -0
  417. package/web/dist/assets/github-Bz2VgRX3.js +1 -0
  418. package/web/dist/assets/go-rLFTqkRN.js +1 -0
  419. package/web/dist/assets/highlighted-body-OFNGDK62-BL-MfFgl.js +1 -0
  420. package/web/dist/assets/highlighter-CdHqIwFr.js +3 -0
  421. package/web/dist/assets/html-BY76lXLH.js +1 -0
  422. package/web/dist/assets/image-preview-h3WFluuy.js +1 -0
  423. package/web/dist/assets/index-BbcQNT92.css +2 -0
  424. package/web/dist/assets/index-EtQQQ6Kj.js +7 -0
  425. package/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  426. package/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  427. package/web/dist/assets/javascript-BgS3c2Ky.js +1 -0
  428. package/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  429. package/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  430. package/web/dist/assets/json-qhed-kSA.js +1 -0
  431. package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
  432. package/web/dist/assets/jsx-Bz0zcwM4.js +1 -0
  433. package/web/dist/assets/lib-BQXq3kEf.js +1 -0
  434. package/web/dist/assets/lib-BxQXEXDF.js +1 -0
  435. package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
  436. package/web/dist/assets/markdown-DqBKYPiB.js +2 -0
  437. package/web/dist/assets/mermaid-GHXKKRXX-C4jxqUUb.js +1 -0
  438. package/web/dist/assets/new-task-form-BdJKRBJX.js +1 -0
  439. package/web/dist/assets/pill-BQfmfpYp.js +1 -0
  440. package/web/dist/assets/project-router-DxgFZY1l.js +1 -0
  441. package/web/dist/assets/prompt-templates-B6m16gq-.js +15 -0
  442. package/web/dist/assets/python-gzcpVVnB.js +1 -0
  443. package/web/dist/assets/react-runtime-CCIEwYL0.js +9 -0
  444. package/web/dist/assets/refresh-cw-mhSpxf2a.js +1 -0
  445. package/web/dist/assets/repo-git-CUNRxR3_.js +1 -0
  446. package/web/dist/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  447. package/web/dist/assets/run-diff-DsmmDVfx.js +3 -0
  448. package/web/dist/assets/run-header-BkhrseLJ.js +1 -0
  449. package/web/dist/assets/rust-Cfkwpbl8.js +1 -0
  450. package/web/dist/assets/search-x-BqDMB2g8.js +1 -0
  451. package/web/dist/assets/shellscript-CLZ0U2zV.js +1 -0
  452. package/web/dist/assets/skill-empty-hint-BWEvTggc.js +1 -0
  453. package/web/dist/assets/skills-9oR_oHse.js +1 -0
  454. package/web/dist/assets/skills-DwIxnnWO.js +1 -0
  455. package/web/dist/assets/sparkles-DIoTQpyx.js +1 -0
  456. package/web/dist/assets/sql-BsFa4tDR.js +1 -0
  457. package/web/dist/assets/square-terminal-Cc7CuQxc.js +1 -0
  458. package/web/dist/assets/tab-link-D1fQgpmO.js +1 -0
  459. package/web/dist/assets/task-changes-BKeLlDpK.js +1 -0
  460. package/web/dist/assets/task-commits-gcEFZIa5.js +1 -0
  461. package/web/dist/assets/task-files-BGAqoXTW.js +2 -0
  462. package/web/dist/assets/task-thread-DT8aUYTS.js +9 -0
  463. package/web/dist/assets/textarea-BOVbfy5C.js +1 -0
  464. package/web/dist/assets/thread-loading-CypW73KD.js +1 -0
  465. package/web/dist/assets/toml-CcmNWLt0.js +1 -0
  466. package/web/dist/assets/trash-2-CJq6LHWn.js +1 -0
  467. package/web/dist/assets/triangle-alert-CjDFvU27.js +1 -0
  468. package/web/dist/assets/tsx-udAQXfEw.js +1 -0
  469. package/web/dist/assets/typescript-bsJCZSQ-.js +1 -0
  470. package/web/dist/assets/upload-CPDZlJeK.js +1 -0
  471. package/web/dist/assets/use-desktop-5JsLmi0a.js +1 -0
  472. package/web/dist/assets/use-submit-shortcut-CHVFevty.js +1 -0
  473. package/web/dist/assets/utils-DiO6zyJd.js +64 -0
  474. package/web/dist/assets/workflows-rQDFzWRt.js +11 -0
  475. package/web/dist/assets/yaml-rwi0_p6S.js +1 -0
  476. package/web/dist/assets/zoomable-image-COWqb11v.js +1 -0
  477. package/web/dist/index.html +80 -0
  478. package/web/dist/open-mercato.svg +11 -0
package/README.md ADDED
@@ -0,0 +1,838 @@
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, OpenCode or pi
9
+ (the latter two experimental), 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 7.x](https://img.shields.io/badge/TypeScript-7.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 cezarion # → 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 cezarion` 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` / `pi` 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 (experimental)** 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 cezarion # start the cockpit for the current repo
149
+ # or: npx @wjarka/cezarion
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 cezarion run "add a --json flag to the export command" # headless, CI-friendly
157
+ npx cezarion init # scaffold .ai/cezar/
158
+ ```
159
+
160
+ Both the `cezarion` 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 `cez` 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
+ ### Nightly builds — help us shape cezar 🌙
173
+
174
+ Every night we publish the trunk to npm, so the features landing in the next
175
+ release are one command away:
176
+
177
+ ```bash
178
+ npx cezarion@nightly # everything merged as of last night
179
+ ```
180
+
181
+ **Come build this with us.** cezar is shaped by the people who run it on real
182
+ repos: if you try a nightly and something feels wrong — a workflow that stalls, a
183
+ diff that reads badly, a runner that should exist — [open an
184
+ issue](https://github.com/wjarka/cezar/issues) and tell us. That feedback,
185
+ early, is worth more than a bug report six weeks after a release, and it is how
186
+ most of the features here got their final shape.
187
+
188
+ **Know what you're installing.** A nightly is verified (typecheck, unit suites,
189
+ packaged-CLI e2e — the same gate a release runs) but it is *not* a release: it
190
+ can be rough, a flag or a screen may change under you, and something occasionally
191
+ breaks in a way no test caught. Nothing is at risk beyond your patience — every
192
+ task runs in its own git worktree and cezar never auto-merges — but if you need a
193
+ boring day, stay on the stable release. Pin a nightly you liked with its exact
194
+ version (`npx cezarion@0.9.2-nightly.20260813.126` — the cockpit prints the
195
+ version it booted, and the date in it tells you how old the build is), and drop
196
+ back to stable any time with a plain `npx cezarion`.
197
+
198
+ ### Preview builds
199
+
200
+ Every green CI run also publishes an installable npm snapshot
201
+ ([how it works](docs/publishing.md)), so you can try code that has not even
202
+ merged yet:
203
+
204
+ ```bash
205
+ npx cezarion@develop # current develop head
206
+ ```
207
+
208
+ Every pull request gets its own preview too — the CI bot posts a sticky comment
209
+ on the PR with the exact pinned version to copy-paste
210
+ (`npx cezarion@<version>-pr<N>.<run>`). Nightlies and previews are all
211
+ prerelease versions under their own dist-tags; a plain `npx cezarion` always
212
+ resolves to the latest stable release.
213
+
214
+ ---
215
+
216
+ ## How it works
217
+
218
+ You describe a task. cezar runs it as a **workflow** — an ordered list of agent
219
+ steps and shell checks — shelling out to your locally installed agent CLI
220
+ (Claude Code by default; Codex and OpenCode are drop-in alternatives, per task
221
+ or per step). Each task gets its own git worktree; the cockpit streams every
222
+ event live and parks the run at a review gate when there's a diff to inspect.
223
+
224
+ ```
225
+ you type a task
226
+
227
+
228
+ ┌─────────────┐ optional: Plan → AI drafts a chain of steps you approve
229
+ │ workflow │ (agent steps + shell checks, with bounded onFail retries)
230
+ └─────────────┘
231
+
232
+
233
+ ┌──────────────────────────────┐ ┌───────────────────────────────┐
234
+ │ git worktree per task │ │ agent CLI (your login) │
235
+ │ (isolated branch, parallel) │◄───►│ claude · codex · opencode · pi│
236
+ └──────────────────────────────┘ │ Bash open · no prompts │
237
+ │ └───────────────────────────────┘
238
+ │ agent text · tool calls · tool results · tokens · cost
239
+
240
+ ┌─────────────┐ SSE (replay + live) ┌──────────────────────────┐
241
+ │ .ai/cezar/ │ ──────────────────────► │ cockpit localhost:4321 │
242
+ │ JSON·NDJSON │ │ Tasks · Git · GitHub · │
243
+ │ ·Markdown │ │ Skills · Workflows │
244
+ └─────────────┘ └──────────────────────────┘
245
+
246
+ review gate: read the diff →
247
+ send notes back · draft PR · finish
248
+ ```
249
+
250
+ When a check fails, the workflow can loop back to an earlier step (bounded by
251
+ `max`) with the failing output appended to the retried agent's prompt. Nothing
252
+ auto-merges: a run with changes rests in `review` until you act on it.
253
+
254
+ ---
255
+
256
+ ## Core concepts
257
+
258
+ Three words, no jargon — **task**, **skill**, **chain**:
259
+
260
+ - 📋 **Tasks** are the unit of work. Every task is a **run**: `queued → running →
261
+ review / done / failed / cancelled`, with a live event log, per-step token and
262
+ cost usage, cancel/delete, and — for anything with a diff — a review gate. Paste
263
+ screenshots into the task, or send follow-up messages into the live session
264
+ while it works.
265
+ - 📖 **Skills** are Markdown playbooks. Drop them in `.ai/skills/` or
266
+ `.ai/cezar/skills/`, or pull them from a shared **team skills repo** (a bare
267
+ git clone cached globally in `~/.cache/cez/`). A workflow step references one by
268
+ `skill: <name>` and its body becomes the agent's extra system prompt — so you
269
+ shape *how* the agent reasons without touching code.
270
+ - 🔗 **Chains (workflows)** stitch steps into a pipeline: agent steps plus shell
271
+ checks, with bounded `onFail` retry loops. Write the YAML yourself, build one by
272
+ drag-ordering skills in the **Workflows** tab, or press **Plan first** and let the
273
+ AI draft a chain for your task that you review, trim and start. The built-in
274
+ `quick-task` (one agent step) works with zero setup.
275
+
276
+ Five moves that make the cockpit worth the browser tab:
277
+
278
+ - 🗃️ **Queue + orchestration.** Start as many tasks as you like: cezar runs up to
279
+ `maxParallel` at once across every project (default **2**; a non-git directory
280
+ always runs one) and
281
+ holds the rest in a FIFO queue with visible positions (`#1`, `#2`, …). Cancel a
282
+ queued task before it starts; the queue even survives a cockpit restart —
283
+ everything still `queued` is re-enqueued in order. It's the orchestration layer
284
+ that turns "one agent at a time" into a backlog that drains itself.
285
+ - 🧠 **Memory-aware runs.** Each run's whole process tree is sampled (~2 s) for CPU
286
+ and RSS, and its **peak memory** is recorded and shown in the task table. Set an
287
+ optional per-task **memory ceiling** (`memoryLimitMb`) and a run that crosses it
288
+ is *paused* — freeing its tree so the queue keeps advancing — and resumes on
289
+ demand. Event logs are append-only NDJSON and streamed rather than re-serialized,
290
+ and live UI deltas are coalesced so they never hit disk.
291
+ - 🪞 **Parallel variants (×2 / ×3).** Run the same task as competing agents in
292
+ separate worktrees, then compare their diffs side by side and **pick** one —
293
+ the losers are archived and their worktrees cleaned up.
294
+ - 🧹 **Bounded worktree disk.** Each task runs in its own full checkout, so a busy
295
+ cockpit would otherwise grow without limit. cezar keeps only the last
296
+ `worktreeRetention` **finished** worktrees on disk (default **10**; `0` =
297
+ unlimited) and reclaims the rest — directory only, the `cez/<id8>` branch is
298
+ always kept, so the work stays recoverable. Settings → Resources shows every
299
+ worktree's disk use with per-row delete and a **Reclaim now** button.
300
+ - 🛡️ **Review gate.** A finished run with changes waits in `review`. Read the diff,
301
+ type notes that go straight back into the agent's session, or push a
302
+ `gh pr create --draft`. You stay the merge button.
303
+ - 📱 **Runs on your coding server, drives from your pocket.** The cockpit is a
304
+ responsive web app streaming over SSE, so the box running cezar can be a
305
+ **VPS, cloud, or dedicated server** you never sit in front of. Point a browser
306
+ — laptop or **phone** — at it and run an **always-on coding team** on the move:
307
+ start tasks, watch them live, and hit the review gate from anywhere.
308
+
309
+ ---
310
+
311
+ ## Cockpit tour
312
+
313
+ Eight views, one browser window, all live over Server-Sent Events (seven until you opt into the Inbox):
314
+
315
+ | View | What's in it |
316
+ |---|---|
317
+ | **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. |
318
+ | **All tasks** | Every *registered project's* tasks in one table, filtered and grouped by tag, project, status or workflow — see [Grouping connected repositories](#grouping-connected-repositories-tags-and-the-all-tasks-page). Appears once a second project is registered. |
319
+ | **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. |
320
+ | **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. |
321
+ | **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. |
322
+ | **Skills** | Local skills plus the team skills repo, with a rendered body + prompt preview. Refresh pulls the latest from the remote. |
323
+ | **Workflows** | Build a chain by drag-ordering skills, save it as portable YAML, import/export, or delete. Built-ins always come back. |
324
+ | **Settings** | Appearance (dark/light theme, accent, density), agent backends, notifications, and the skills catalog. |
325
+
326
+ The cockpit is a React app served pre-built from the package — `npx cezarion`
327
+ still means no build step and no dev server on your machine — with a dark/light
328
+ theme, a ⌘K command palette, and bookmarklets that launch a task straight from
329
+ a GitHub page.
330
+
331
+ ---
332
+
333
+ ## Multiple projects, one cockpit
334
+
335
+ One `cez serve` hosts **every repo you work in**, not just the one you started
336
+ it in. Each repo cezar boots in registers itself in a per-user registry at
337
+ `~/.cezar/config.json` — the workspace file that also holds the global knobs
338
+ (the parallel cap, the memory ceiling, the browse root, and the checkout root). Nothing is added to
339
+ the repo: per-project state stays exactly where it was, in that repo's
340
+ `.ai/cezar/`.
341
+
342
+ Every view is project-scoped:
343
+
344
+ ```
345
+ /p/<projectId>/ tasks · git · github · skills · workflows · settings
346
+ ```
347
+
348
+ `<projectId>` is a slug derived from the folder name (`my-app`, then `my-app-2`
349
+ on a collision), and `/p/default/…` always means the project cezar was started
350
+ in. The sidebar shows one collapsible group per project — each with its own nav
351
+ and task list — and the new-task composer names the project it will run in.
352
+
353
+ **Adding a project** — the **+** button beside *New task*:
354
+
355
+ - 📂 **Open local folder…** browses from the configured browse root
356
+ (**Settings → Projects**, default `~/`) in a folder picker and
357
+ registers the folder you pick.
358
+ - ⬇️ **Clone from GitHub…** clones with your logged-in `gh` into the checkout
359
+ root (**Settings → Projects**, default `~/cezar/projects`) with live progress,
360
+ then registers the clone. Close the dialog and the clone is killed and its
361
+ partial directory removed.
362
+
363
+ Removing a project (**Settings → Projects**) drops the registry entry only — the
364
+ repo and its `.ai/cezar/` are never touched, so re-adding it later finds all its
365
+ tasks intact. The project cezar is currently serving can't be removed: it
366
+ re-registers itself at the next start.
367
+
368
+ **From the terminal** — the same registry, no cockpit required (handy over ssh):
369
+
370
+ ```bash
371
+ cez projects # list: id, branch or status, path, tags
372
+ cez projects add ~/code/api # register a folder (defaults to the current repo)
373
+ cez projects remove api # drop the registry entry; the repo is untouched
374
+ cez projects tag api storefront backend # set the grouping tags (no tags clears them)
375
+ ```
376
+
377
+ These read and write `~/.cezar/config.json` directly, so they work with the
378
+ server stopped, and `CEZ_HOME` selects which workspace they operate on.
379
+
380
+ Settings split along the same line: **General** (the project's folder, its
381
+ registry facts, its parallel-task ceiling, and Remove), **Agents**,
382
+ **Worktrees**, **Bookmarklets**, **Prompt templates** and **MCP** describe one
383
+ repo and live under `/p/<projectId>/settings`; **Appearance**,
384
+ **Notifications**, **Resources**, **Projects** and **Keyboard** are yours or the
385
+ machine's and live at `/settings/global`.
386
+
387
+ ### Grouping connected repositories: tags and the All tasks page
388
+
389
+ Work rarely stops at a repo boundary. A storefront is an API, a web app and a
390
+ design system; a platform is a handful of services plus the infra that runs
391
+ them. **Tags** are how you say so, and **All tasks** is where saying so pays off.
392
+
393
+ **Tag a repo** in **Settings → Projects**: type into the *Tags* cell on its row
394
+ and press Enter (comma works too; the × on a chip, or Backspace in an empty
395
+ field, removes one). The field **autocompletes from the tags already used in the
396
+ workspace** — click the field to see them all, arrow keys and Enter to pick —
397
+ which is what keeps the second repo landing on the first one's spelling instead
398
+ of inventing `store-front` next to `storefront`. Anything not on the list is
399
+ just typed. A tag is a free-form label — `storefront`, `infra`, `client-acme` —
400
+ and a project can carry several, because a repo can belong to more than one
401
+ piece of work. Tags are trimmed, deduplicated case-insensitively (`API` and
402
+ `api` are one tag) and stored in `~/.cezar/config.json` beside the rest of the
403
+ registry, so they are yours and this machine's, never something added to the
404
+ repo.
405
+
406
+ **All tasks** — the top item in the sidebar, `/tasks`, or `⌘K → All tasks` —
407
+ then shows every registered project's work in one table:
408
+
409
+ - **Filter** by tag, status and workflow. Tags are one-click chips; status and
410
+ workflow are searchable multi-selects. Every facet ORs inside itself and ANDs
411
+ across, so *"anything running or waiting in storefront or infra"* is one set
412
+ of clicks. Each option carries how many tasks it would leave, so a filter that
413
+ would empty the table says so before you click it. The search box matches
414
+ title, project, workflow, branch and tags.
415
+ - **Group by** tag, project, status or workflow — click the pressed one again to
416
+ ungroup. Grouping by tag is the reason tags exist: three repos tagged
417
+ `storefront` become one section, and a repo tagged twice appears under both —
418
+ it genuinely belongs to both.
419
+
420
+ The filters, the grouping and the Active/Archived tab live in the **URL**, so a
421
+ filtered view survives a refresh, pastes into a chat, and sits in a bookmark —
422
+ `/tasks?tag=storefront&status=running&group=tag` is a link to exactly what you
423
+ were looking at. Only what you changed shows up: Active is the default, so the
424
+ Archived view is `?archived=1` and a normal link carries no key for it.
425
+
426
+ Each row shows **every** PR and issue it references — a task opened on an issue
427
+ that landed a PR shows both — plus its cost and live CPU/memory, and can be
428
+ marked **read/unread** (the eye) or **archived** (or restored) right there. Every task title, project name and project group heading links into that
429
+ project, so the thread, its diff and its worktree are one click away and stay
430
+ exactly where they were.
431
+
432
+ There is deliberately **no project filter**: narrowing this page to one project
433
+ is that project's own Tasks page, which is a better version of the same answer
434
+ (live updates, the full column set, the composer). So picking a project *leaves*
435
+ for it rather than turning the global view into a worse local one.
436
+
437
+ Nothing else in cezar reads tags, on purpose: a tag is a lens, not a permission,
438
+ a queue or a routing rule. Removing one changes what you see and nothing else.
439
+
440
+ > The page reads a workspace-wide index capped at the newest 200 tasks per
441
+ > project — it says so, and names the projects it capped, rather than showing a
442
+ > short list as if it were complete. Older tasks are always in that project's own
443
+ > Tasks page.
444
+
445
+ **Old page URLs keep working.** Every unprefixed page path — `/`, `/tasks/<id>`,
446
+ `/settings` — still answers, bound to the project cezar was started in; the
447
+ cockpit redirects flat paths to their `/p/<boot>/…` twin, so existing bookmarks
448
+ and bookmarklets need no change. The HTTP API is the exception: it moved to
449
+ `/api/v1/…` (see the CHANGELOG), so a script that calls it needs the extra
450
+ segment.
451
+
452
+ > **Hosted cockpit?** The folder picker is confined to the independent browse
453
+ > root. Set `CEZ_BROWSE_ROOT` narrowly before first boot (or save it in
454
+ > **Settings → Projects**) when a remote viewer should not enumerate the host's
455
+ > whole home. Clones continue to use the separate checkout root.
456
+
457
+ ---
458
+
459
+ ## Workflow format
460
+
461
+ A workflow is a small YAML file in `.ai/cezar/workflows/`:
462
+
463
+ ```yaml
464
+ name: fix-and-verify
465
+ description: Implement the task, then verify; retry with failing output on red.
466
+ steps:
467
+ - id: implement
468
+ name: Implement
469
+ prompt: "{{task}}"
470
+ skill: project-conventions # optional — from .ai/skills or .ai/cezar/skills
471
+ # model: opus # optional per-step model override
472
+ # runner: codex # optional per-step backend: claude · codex · opencode · pi
473
+ # allowedTools: [Read, Edit, Write, Grep, Glob, Bash]
474
+ - id: verify
475
+ name: Verify
476
+ command: "npm test" # a check step: exit 0 passes
477
+ onFail:
478
+ retry: implement # loop back to an earlier step…
479
+ max: 2 # …at most twice
480
+ ```
481
+
482
+ `{{task}}` is replaced with the task text you typed. When a check fails and loops
483
+ back, its failing output is appended to the retried agent's prompt so the next
484
+ attempt can see what broke.
485
+
486
+ Prefer skills over steps? A workflow can also be written in the portable
487
+ shorthand — an ordered list of skill names, each becoming one agent step:
488
+
489
+ ```yaml
490
+ name: triage-and-fix
491
+ skills: [reproduce, root-cause, implement, self-review]
492
+ ```
493
+
494
+ ---
495
+
496
+ ## How it runs agents
497
+
498
+ cezar shells out to your locally installed, logged-in agent CLI —
499
+ **your subscription, no API key**. With the default Claude Code backend that
500
+ means headless `stream-json` mode, tool access via `--allowedTools`, with
501
+ unapproved tools denied without prompting (`--permission-mode dontAsk`) inside
502
+ the task's worktree — but note the zero-config default list (`Read`, `Edit`,
503
+ `Write`, `Grep`, `Glob`, `Bash`) grants unrestricted `Bash` unless a step sets
504
+ `bashAllowlist`, so treat a run as having full shell access in its worktree,
505
+ not a sandboxed allowlist. Set `CEZ_APPROVAL_GATE=1` to opt into Claude's
506
+ interactive approval UI. Codex and OpenCode are driven through their own
507
+ native protocols and don't honor `allowedTools` at all — see
508
+ [Coding agent backends](#coding-agent-backends) for what each one actually
509
+ locks down. Nothing runs on a server you don't own.
510
+
511
+ Useful environment variables:
512
+
513
+ | Var | Effect |
514
+ |---|---|
515
+ | `CEZ_DRY_RUN=1` | Use the bundled mock instead of the real `claude` CLI — the entire cockpit works offline, for demos and development. |
516
+ | `CEZ_AGENT_MODELS_LOCKED=1` | Globally lock each runner to the model configured in its native Claude/Codex/OpenCode settings while keeping runner selection available. Exact `1` also delegates authentication and provider enablement to those native agents, so Cezar skips its credential probes and provider-disable preferences. Existing Cezar presets are preserved but ignored, and an environment change requires a restart. The config-file equivalent is `"modelsLocked": true` in global `~/.cezar/config.json` or one repository's `.ai/cezar/config.json`; config-file locks do not disable provider checks. |
517
+ | `CEZ_APPROVAL_GATE=1` | Opt into Claude's interactive approval UI; by default, unapproved tools are denied without interrupting the run. Ignored when `CEZ_CLAUDE_PERMISSION_MODE` is a recognized value (`dontAsk`, `acceptEdits`, or `bypass`). |
518
+ | `CEZ_CLAUDE_PERMISSION_MODE` | Claude agent-run permission flag: `dontAsk` (default), `acceptEdits`, or `bypass`. `bypass` passes `--dangerously-skip-permissions` and omits `--permission-mode`. Unset or unknown keeps today's `dontAsk` / `CEZ_APPROVAL_GATE` path. Provider verification commands are never given this flag. |
519
+ | `CEZ_CLAUDE_SETTING_SOURCES` | When set, Claude agent runs also pass `--setting-sources <value>` (e.g. `user,project,local`). Unset or empty omits the flag. Provider verification is never given this flag. |
520
+ | `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. |
521
+ | `CEZ_AUTOMATIONS=1` | Turn on **GitHub automations**: the Automations view appears and cezar polls GitHub on each enabled automation's interval, launching tasks from what it finds. Off by default, and only the exact value `1` enables it — without it nothing polls GitHub, the automations endpoints answer `409`, and the nav item is absent. Read at boot, so restart after changing it; definitions, receipts and high-watermarks are retained, so unsetting it and restarting restores the feature without migration or data loss. |
522
+ | `CEZ_AUTOSAVE=1` | Re-enable the periodic (90 s) autosave commit in task worktrees. Off by default (#471) — turn-end and pre-PR flushes always run, so branches still end complete. Every autosave names its trigger in the commit subject (`cezar autosave (periodic)` vs `(turn end)` / `(run finalize)` / `(pre-PR)`), so the flushes you keep are distinguishable from the timer you disabled. |
523
+ | `CEZ_CLAUDE_BIN=/path/to/claude` | Override which `claude` binary is used. |
524
+ | `CEZ_CODEX_BIN=/path/to/codex` | Override which `codex` binary is used. |
525
+ | `CEZ_OPENCODE_BIN=/path/to/opencode` | Override which `opencode` binary is used. |
526
+ | `CEZ_PI_BIN=/path/to/pi` | Override which `pi` binary is used. |
527
+ | `CLAUDE_CONFIG_DIR`, `CODEX_HOME` | The agents' **own** variables, honoured where the vendor documents one. Setting one moves that agent's **default account** — the config folder cezar discovers. A *second* login of the same CLI is deliberately not an environment setting, since one process-wide value cannot differ per project: add it under **Settings → Agent accounts** and pick it per project. |
528
+ | `CEZ_BROWSE_ROOT=~/` | Default root for **Add project → Open local folder…**. The picker cannot navigate above it; a saved workspace value overrides the environment default and must name an existing folder. |
529
+ | `CEZ_PROJECTS_DIR=~/cezar/projects` | Default destination for **Clone from GitHub**. Saved workspace settings override it, and missing directories are created recursively. |
530
+ | `CEZ_SKILLS_AUTO_UPDATE=0` | Disable automatic checks and updates for upstream-CLI-tracked Open Mercato skill installations. On by default; a saved global Skills setting overrides this environment default. Checks are delayed, bounded, cached, and non-blocking. |
531
+ | `CEZ_AUTONOMOUS_DEFAULT=0` | Seed the New Task Autonomous default (`0` or `1`). Without a seed, skills default on and workflows off; a saved global Resources setting overrides it. |
532
+ | `CEZ_WORKTREE_DEFAULT=1` | Seed the New Task Worktree default (`0` or `1`). Without a seed, eligible runs default on; a saved global Resources setting overrides it. |
533
+ | `CEZ_DISABLE_REPO_LOCK=1` | **Dangerous escape hatch:** allow any run executing in the repository root — an explicit `worktree=false` run, non-Git degradation, or a continuation whose worktree cannot be restored — to proceed without Cezar’s repository-root lease. Agents can overwrite each other’s files or Git state; isolated worktree runs are unaffected. Off by default; only the exact value `1` enables it. |
534
+ | `CEZ_SINGLE_PROJECT=1` | Opt into a launch-project-only cockpit: only the exact value `1` enables it. Project add, edit, checkout, folder browsing, and removal are refused and only the launch project is shown. Off by default; stored registry rows are retained, so unsetting it and restarting restores the full multi-project workspace without migration or data loss. |
535
+ | `CEZ_HIDE_TOKEN_USAGE=1` | Hide raw input/output token counts throughout the browser cockpit while leaving backend-reported cost visible. Only the exact value `1` enables it; telemetry and API payloads are unchanged, and a restart is required after changing it. |
536
+ | `CEZ_HIDE_COST=1` | Hide backend-reported monetary cost throughout the browser cockpit while leaving raw input/output token counts visible. Only the exact value `1` enables it; telemetry and API payloads are unchanged, and a restart is required after changing it. |
537
+ | `CEZ_HIDE_TOKEN_METRICS=1` | Legacy master switch that hides both token usage and cost. It takes precedence over the two independent flags; only the exact value `1` enables it, payloads are unchanged, and a restart is required. |
538
+ | `GITHUB_TOKEN` | Fallback for GitHub reads/PRs when `gh` isn't authenticated. |
539
+ | `CEZ_ENV_PASSTHROUGH=A,B` | Forward these extra host env vars to spawned agents. By default agents get a least-privilege env (safe shell/toolchain vars + the backend's own auth + `GITHUB_TOKEN` + `CEZ_*`), not your full environment — use this to add a var an agent needs. |
540
+ | `CEZ_AGENT_ENV_FULL=1` | Escape hatch: give spawned agents the full host environment (pre-hardening behavior). Off by default; only set it if you understand that this hands every host secret to the agent process. |
541
+ | `CEZ_AGENT_TMPDIR=0` | Stop giving each task its own temp directory and hand agents the host `TMPDIR` again (pre-#785 behavior). On by default: every run gets `TMPDIR`/`TEMP`/`TMP` pointing at `.ai/cezar/tmp/<task-id>`, created and write-probed before the agent spawns and reaped when the run ends, so concurrent tasks stop sharing one directory and a task refuses to start rather than run against a temp directory that silently swallows its shell output (see Troubleshooting below). Only an exact `0` disables it, and it disables the whole thing — the pre-spawn check included, so this stays an escape hatch you can actually take. |
542
+ | `CEZ_REDACT_SECRETS=0` | Disable scrubbing of credential values/token shapes from the on-disk state (the NDJSON transcript and the free-text fields of `runs.json`). On by default; leave it on. Best-effort defense-in-depth, not a guarantee: it catches known token shapes and the values of your own secret-named env vars, so a credential in neither category can still get through. |
543
+ | `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. |
544
+ | `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`. |
545
+ | `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. |
546
+ | `CEZ_NO_BANNER=1` | Skip the `open-mercato/skills` banner on `cez serve` startup. (The cockpit no longer shows a banner — its skills now live on the Skills page's Manage panel — so this env var is the terminal banner's only switch.) |
547
+ | `VITE_CEZ_API_BASE=http://localhost:4321` | **Build time only**, and only when the cockpit bundle is deployed apart from the service it talks to. Empty (the default) means "the origin that served this page", which is right for both normal cases: the CLI serves the bundle itself, and `npm run dev` proxies `/api` to the local service. A deployment that must be configured without a rebuild can put `<meta name="cez-api-base" content="…">` in the served HTML instead, which wins over this. |
548
+
549
+ ### Troubleshooting: the agent's shell returns nothing
550
+
551
+ **Symptom.** A task on the Claude backend keeps working, but every shell command
552
+ comes back with no output and a spurious non-zero exit status — `echo hello`
553
+ included. Redirecting into a file inside the worktree still produces the right
554
+ content, so the commands genuinely run; only the *capture* is lost. Codex tasks
555
+ on the same machine are unaffected, because that backend streams over stdio
556
+ pipes instead of round-tripping a command's output through a temp file.
557
+
558
+ **Diagnosis.** The temp directory the agent was given is out of space or out of
559
+ quota. One line tells you:
560
+
561
+ ```bash
562
+ echo probe > "${TMPDIR:-/tmp}/probe" # "Disk quota exceeded" / "No space left on device"
563
+ df -i "${TMPDIR:-/tmp}" # a tmpfs can exhaust inodes long before bytes
564
+ ```
565
+
566
+ Under quota the file is *created* and the write then fails, so the backend reads
567
+ back a zero-byte capture file and hands the agent an empty result.
568
+
569
+ **Fix.** Since #785 cezar gives each task its own `TMPDIR` under
570
+ `.ai/cezar/tmp/<task-id>` and write-probes it before spawning, so a broken temp
571
+ directory fails the task with `agent temp directory is not writable: …` on the
572
+ task thread instead of corrupting its work. If you see that error, free space on
573
+ the disk holding the repo. `CEZ_AGENT_TMPDIR=0` turns the whole mechanism off —
574
+ per-task directory and pre-spawn check alike — and hands agents the host
575
+ `TMPDIR` again, which is the way out if the check itself is wrong on your
576
+ platform.
577
+
578
+ ---
579
+
580
+ ## Coding agent backends
581
+
582
+ cezar is not married to one vendor. Every agent step runs through a single
583
+ `AgentRunner` seam with four built-in backends:
584
+
585
+ | Backend | CLI | How cezar drives it | Tool access |
586
+ |---|---|---|---|
587
+ | **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; `CEZ_CLAUDE_PERMISSION_MODE=bypass` → `--dangerously-skip-permissions`). |
588
+ | **Codex** | [`codex`](https://github.com/openai/codex) | `codex app-server` — JSON-RPC over stdio, the same transport the Codex IDE extensions use. | Ignores `allowedTools`; the default auto mode uses `danger-full-access` with `approvalPolicy: never` (`CEZ_CODEX_NETWORK=0` opts into the network-blocked `workspace-write` sandbox). |
589
+ | **OpenCode** _(experimental)_ | [`opencode`](https://opencode.ai) | `opencode serve` — a local HTTP server with an SSE event stream. | Ignores `allowedTools` entirely; every permission is auto-approved. |
590
+ | **pi** _(experimental)_ | [`pi`](https://github.com/badlogic/pi-mono) | Persistent `--mode rpc` over JSONL; models are picked with the `provider/model` convention. | Maps `allowedTools` onto pi's `--tools` allowlist; default sessions also pass harness extras (`Subagent`) through `--tools`, and an explicit `allowedTools` still restricts. A configured `bashAllowlist` disables Bash because pi cannot express command-prefix rules. |
591
+
592
+ > ⚠️ **OpenCode and pi support are experimental.** Both runners work but are less
593
+ > battle-tested than the Claude Code and Codex backends, and OpenCode auto-approves
594
+ > every permission (it ignores `allowedTools`). Treat them as previews and expect
595
+ > rough edges.
596
+
597
+ On startup cezar probes which CLIs are installed and the cockpit only offers
598
+ the backends it found — install any one of the four and you're operational.
599
+
600
+ **Pick a backend at three levels** (most specific wins):
601
+
602
+ 1. **Config default** — `"defaultRunner": "codex"` in `.ai/cezar/config.json`.
603
+ 2. **Per task** — the backend picker next to the task box in the cockpit.
604
+ 3. **Per workflow step** — `runner:` on any step in the YAML.
605
+
606
+ Per-step overrides are what make **mixed-agent strategies** a one-liner:
607
+ implement with one agent, review with another, and let a shell check referee:
608
+
609
+ ```yaml
610
+ name: implement-and-cross-review
611
+ steps:
612
+ - id: implement
613
+ name: Implement
614
+ prompt: "{{task}}"
615
+ runner: codex # one vendor writes the code…
616
+ - id: review
617
+ name: Cross-review
618
+ prompt: "Review the diff produced for: {{task}}. Fix real issues only."
619
+ runner: claude # …another one reviews it
620
+ - id: verify
621
+ name: Verify
622
+ command: "npm test"
623
+ onFail: { retry: implement, max: 2 }
624
+ ```
625
+
626
+ Parallel variants (×2/×3) of one task share that task's backend — mixing
627
+ happens per task and per step, not inside a variant group.
628
+
629
+ **Models come from your own machine.** For Codex, OpenCode, and Pi, the model picker
630
+ is not a list cezar ships — it asks the installed CLI what it can actually run
631
+ (`codex app-server`'s `model/list`, `opencode models`, and `pi --list-models`), caches the answer in
632
+ memory for five minutes, and shows it. A model your provider rolled out
633
+ yesterday is selectable without a cezar release, and one it retired stops being
634
+ offered. Claude Code has no equivalent local catalog, so it keeps a short list
635
+ of tier aliases and pinned versions. `auto` (let the agent decide) is always
636
+ available, including when the CLI is missing, logged out, or slow — discovery
637
+ never blocks the cockpit, and a model you pinned yourself stays selectable even
638
+ if it is absent from the discovered list.
639
+
640
+ The seam is deliberately small: a backend is one class implementing the
641
+ `AgentRunner` interface (`packages/cezar/src/core/agent-runner.ts`) that turns a prompt into
642
+ a stream of normalized events. Other CLIs — pi, aider, whatever ships next —
643
+ can slot in the same way.
644
+
645
+ ---
646
+
647
+ ## Remote access (host cezar on a server)
648
+
649
+ cezar runs on `localhost` by default. To reach the cockpit from another machine —
650
+ a shared team box, a VPS, your phone — put an **authenticated public front** in
651
+ front of it. The built-in installer does this interactively, per **platform
652
+ strategy**, and never escalates silently: every privileged command is printed
653
+ and verified, and it ends with a real authenticated end-to-end check.
654
+
655
+ ```bash
656
+ npx cezarion server-install --platform ubuntu-vps # stand it up
657
+ npx cezarion server-deploy --platform ubuntu-vps # roll out a new version (reload the service)
658
+ npx cezarion server-uninstall --platform ubuntu-vps # reverse it
659
+
660
+ # host a SECOND cockpit for another domain on the same box (ubuntu-vps):
661
+ npx cezarion server-install --platform ubuntu-vps --domain shop.example.com
662
+ ```
663
+
664
+ On `ubuntu-vps` a single host can run several independent cockpits — add
665
+ `--domain <host>` and each gets its own port, nginx site, login and service; a
666
+ new domain never resumes or clobbers the first install.
667
+
668
+ **Already running a reverse proxy?** If Dokploy, Coolify, Caddy or your own
669
+ nginx already owns `:80/:443`, cezar's would fight it for the ports. Install the
670
+ service only and let your proxy front it:
671
+
672
+ ```bash
673
+ npx cezarion server-install --platform ubuntu-vps \
674
+ --external-proxy --domain cezar.example.com --bind-host 172.17.0.1
675
+ ```
676
+
677
+ `--bind-host` is only needed when the proxy runs in a **container** (Traefik
678
+ can't reach the host's loopback); a host-installed proxy uses the `127.0.0.1`
679
+ default. In this mode **your proxy must enforce authentication** — cezar has
680
+ none of its own. [Details →](docs/server-install/ubuntu-vps.md#the-box-already-has-a-reverse-proxy-dokploy-coolify-caddy)
681
+
682
+ | Provider | `--platform` | Public front | Guide |
683
+ |----------|--------------|--------------|-------|
684
+ | Ubuntu / Debian VPS | `ubuntu-vps` | nginx + Let's Encrypt HTTPS, htpasswd login, systemd | [Step-by-step →](docs/server-install/ubuntu-vps.md) |
685
+ | Ubuntu + existing proxy | `ubuntu-vps --external-proxy` | your Dokploy/Traefik/Caddy front; cezar ships the service only | [Step-by-step →](docs/server-install/ubuntu-vps.md#the-box-already-has-a-reverse-proxy-dokploy-coolify-caddy) |
686
+ | macOS + ngrok | `macosx-ngrok` | ngrok tunnel + `--basic-auth`, launchd | [Step-by-step →](docs/server-install/macosx-ngrok.md) |
687
+
688
+ See the **[Remote access overview](docs/server-install/README.md)** for how it
689
+ works and how to redeploy new versions.
690
+
691
+ ---
692
+
693
+ ## Configuration (optional)
694
+
695
+ Zero config is the default — everything below is opt-in via
696
+ `.ai/cezar/config.json` (a missing or invalid file simply uses the defaults, and
697
+ never blocks startup):
698
+
699
+ ```jsonc
700
+ {
701
+ "skillsRepos": [{ "repo": "open-mercato/skills", "ref": "main" }], // team skills; [] disables
702
+ // Team-skill repos are code-trusted: a skill body becomes an agent system prompt.
703
+ // Only owner/name, https/ssh URLs, or local paths (`/abs`, `./rel`, `~/dir`,
704
+ // `C:\dir`) are accepted — no ext::/fd:: transport helpers. Write a relative
705
+ // path as `./name`, not a bare `name`. Pin `ref` to a full commit SHA to freeze
706
+ // the source against a moving branch head — cezar verifies it resolves to
707
+ // exactly that commit, and reports it as `team.commit`.
708
+ "worktreeRetention": 10, // keep the last N finished worktrees on disk; 0 = unlimited (branch always kept)
709
+ "defaultRunner": "claude", // agent backend: "claude" (default) · "codex" · "opencode" · "pi"
710
+ "modelsLocked": true, // optional: native per-runner model is fixed/read-only; runner stays selectable
711
+ "plannerModel": "sonnet", // model the "Plan first" button uses to draft chains
712
+ "baseBranch": "develop" // branch worktrees fork from + PRs target (also settable in the Git tab)
713
+ }
714
+ ```
715
+
716
+ Put the same `"modelsLocked": true` key in `~/.cezar/config.json` to apply it
717
+ to every registered project. When the key is absent or `false` in both config
718
+ files (and `CEZ_AGENT_MODELS_LOCKED` is not `1`), each runner's normal model
719
+ selector uses that runner's discovered model list. While locked, the model is
720
+ shown read-only and follows the selected runner's native settings; the runner
721
+ itself remains selectable.
722
+
723
+ Run data (`runs.json`, NDJSON event logs, worktrees, `todos.json`) is
724
+ git-ignored automatically; your workflows and skills stay committable.
725
+
726
+ Settings that belong to *you* rather than to a repo — the parallel cap
727
+ (`maxParallel`, default **2**), the per-task memory ceiling and the checkout
728
+ root — live once in `~/.cezar/config.json`, alongside the
729
+ [project registry](#multiple-projects-one-cockpit), and are edited from
730
+ **Settings → Resources** and **Settings → Projects**. A `maxParallel` left over
731
+ in a repo's `.ai/cezar/config.json` is imported into the workspace file the
732
+ first time cezar boots there, and ignored afterwards.
733
+
734
+ ### Editing the agents' own config (Settings → Agent config)
735
+
736
+ cezar picks *which* agent runs; **Settings → Agent config** lets you edit *how* it
737
+ behaves — the raw config files Claude, Codex and OpenCode read for settings,
738
+ MCP, and memory. In the multi-project cockpit the section is project-scoped:
739
+ repo-relative files resolve from the selected project's root, while user-scope
740
+ files continue to resolve from the agent's home.
741
+
742
+ Each file keeps its native format and vendor-documented precedence. Tracked
743
+ files reach task worktrees after commit; Claude's gitignored personal layer is
744
+ seeded into each run's worktree. Editing is a local-machine capability, so a
745
+ hosted cockpit (`CEZ_REMOTE=1`) is read-only and never serves home-file contents.
746
+
747
+ ---
748
+
749
+ ## Local development
750
+
751
+ End-to-end, from a fresh clone to a global `cez` command you can run in **any**
752
+ repo on your machine — no npm publish required.
753
+
754
+ **1. Prerequisites** — Node 20+ and `git` (plus at least one logged-in agent CLI,
755
+ as in [Quick start](#quick-start)).
756
+
757
+ **2. Clone & install**
758
+
759
+ ```bash
760
+ git clone https://github.com/wjarka/cezar.git
761
+ cd cezar
762
+ npm install
763
+ ```
764
+
765
+ **3. Build** — compiles the api-client and the server (`tsc → packages/cezar/dist/`) and the cockpit
766
+ (`vite build → packages/cezar/web/dist/`), then runs the pack gate:
767
+
768
+ ```bash
769
+ npm run build
770
+ ```
771
+
772
+ **4. Install as a global command** — build + put `cezarion` / `cez` on
773
+ your PATH pointing at *this checkout*:
774
+
775
+ ```bash
776
+ npm run install-as-command # live link (default) — see the change loop below
777
+ # or: npm run install-as-command:global # self-contained snapshot copy
778
+ ```
779
+
780
+ Now `cd` into any other repo and run it:
781
+
782
+ ```bash
783
+ cd ~/some-other-project
784
+ cez # cockpit for that repo, straight off your checkout
785
+ cezarion --help # same binary; the name matches `npx cezarion`
786
+ ```
787
+
788
+ **5. The change loop**
789
+
790
+ - **Link mode** (default): edit source → `npm run build` → the global command
791
+ reflects it immediately. No relink needed. (It is a live symlink into this
792
+ checkout — don't move or delete the checkout while it's linked.)
793
+ - **Snapshot mode** (`:global`): re-run `npm run install-as-command:global` to
794
+ refresh the installed copy. It survives moving/deleting the checkout.
795
+
796
+ **6. Uninstall**
797
+
798
+ ```bash
799
+ npm run uninstall-as-command # removes cezarion / cez (either flavor)
800
+ ```
801
+
802
+ **7. Troubleshooting**
803
+
804
+ - **`cez: command not found`** after install → your npm global bin dir isn't on
805
+ PATH. The script prints the exact dir; add it to your shell profile
806
+ (`export PATH="$(npm prefix -g)/bin:$PATH"`).
807
+ - **`EACCES` / permission denied** → your global prefix is root-owned. Point npm
808
+ at a user-writable one and retry — **never** sudo:
809
+ `npm config set prefix ~/.npm-global`.
810
+ - **Already installed the published `@wjarka/cezarion` globally?** The
811
+ link/snapshot install replaces it; `uninstall-as-command` removes ours, and
812
+ `npm i -g @wjarka/cezarion` brings the published one back.
813
+
814
+ ### In-checkout scripts
815
+
816
+ ```bash
817
+ npm run dev # server (API :4321) + Vite dev server, opens the cockpit in the browser
818
+ npm run dev:server # tsx packages/cezar/src/index.ts — the API server alone
819
+ npm run dev:web # Vite dev server alone (proxies /api to :4321)
820
+ npm run build # tsc → packages/cezar/dist/, vite build → packages/cezar/web/dist/, then the pack gate
821
+ npm run typecheck # server + web (tsc --noEmit)
822
+ npm test # vitest — server + cockpit unit suites
823
+ npm run test:unit # node:test — fast core-module tests
824
+ npm run test:package # pack/install and exercise the built CLI
825
+ npm run test:e2e # real-browser cockpit suite (agent-browser)
826
+ ```
827
+
828
+ The stack is deliberately small: **TypeScript** (strict, ESM), **Hono** + SSE for
829
+ the server, **Zod** at every boundary, **YAML** for workflows, and a **React 19 +
830
+ Vite + Tailwind v4 + shadcn/ui** cockpit shipped pre-built in `packages/cezar/web/dist/` — the
831
+ published package carries the built app, so `npx` users never run a bundler.
832
+ Every module is meant to be read in one sitting.
833
+
834
+ ---
835
+
836
+ ## License
837
+
838
+ **MIT** © Patryk Lewczuk — full text in [LICENSE](LICENSE).