@open-mercato/cezar 0.1.5-pr506.357

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/README.md +573 -0
  2. package/dist/config.d.ts +144 -0
  3. package/dist/config.js +106 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/core/agent-runner.d.ts +169 -0
  6. package/dist/core/agent-runner.js +23 -0
  7. package/dist/core/agent-runner.js.map +1 -0
  8. package/dist/core/backend-detect.d.ts +16 -0
  9. package/dist/core/backend-detect.js +118 -0
  10. package/dist/core/backend-detect.js.map +1 -0
  11. package/dist/core/claude-cli-runner.d.ts +56 -0
  12. package/dist/core/claude-cli-runner.js +416 -0
  13. package/dist/core/claude-cli-runner.js.map +1 -0
  14. package/dist/core/claude-ui-mapper.d.ts +71 -0
  15. package/dist/core/claude-ui-mapper.js +567 -0
  16. package/dist/core/claude-ui-mapper.js.map +1 -0
  17. package/dist/core/codex-app-server-runner.d.ts +29 -0
  18. package/dist/core/codex-app-server-runner.js +489 -0
  19. package/dist/core/codex-app-server-runner.js.map +1 -0
  20. package/dist/core/codex-ui-mapper.d.ts +63 -0
  21. package/dist/core/codex-ui-mapper.js +491 -0
  22. package/dist/core/codex-ui-mapper.js.map +1 -0
  23. package/dist/core/ndjson.d.ts +6 -0
  24. package/dist/core/ndjson.js +23 -0
  25. package/dist/core/ndjson.js.map +1 -0
  26. package/dist/core/opencode-server-runner.d.ts +30 -0
  27. package/dist/core/opencode-server-runner.js +488 -0
  28. package/dist/core/opencode-server-runner.js.map +1 -0
  29. package/dist/core/opencode-ui-mapper.d.ts +105 -0
  30. package/dist/core/opencode-ui-mapper.js +588 -0
  31. package/dist/core/opencode-ui-mapper.js.map +1 -0
  32. package/dist/core/process-usage.d.ts +63 -0
  33. package/dist/core/process-usage.js +181 -0
  34. package/dist/core/process-usage.js.map +1 -0
  35. package/dist/core/runner-factory.d.ts +8 -0
  36. package/dist/core/runner-factory.js +22 -0
  37. package/dist/core/runner-factory.js.map +1 -0
  38. package/dist/core/tool-display.d.ts +30 -0
  39. package/dist/core/tool-display.js +156 -0
  40. package/dist/core/tool-display.js.map +1 -0
  41. package/dist/core/ui-events.d.ts +308 -0
  42. package/dist/core/ui-events.js +25 -0
  43. package/dist/core/ui-events.js.map +1 -0
  44. package/dist/core/usage.d.ts +11 -0
  45. package/dist/core/usage.js +15 -0
  46. package/dist/core/usage.js.map +1 -0
  47. package/dist/git-worktree.d.ts +88 -0
  48. package/dist/git-worktree.js +297 -0
  49. package/dist/git-worktree.js.map +1 -0
  50. package/dist/handoff.d.ts +62 -0
  51. package/dist/handoff.js +147 -0
  52. package/dist/handoff.js.map +1 -0
  53. package/dist/index.d.ts +2 -0
  54. package/dist/index.js +466 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/install-as-command.d.ts +39 -0
  57. package/dist/install-as-command.js +51 -0
  58. package/dist/install-as-command.js.map +1 -0
  59. package/dist/pack-check.d.ts +17 -0
  60. package/dist/pack-check.js +27 -0
  61. package/dist/pack-check.js.map +1 -0
  62. package/dist/paths.d.ts +23 -0
  63. package/dist/paths.js +34 -0
  64. package/dist/paths.js.map +1 -0
  65. package/dist/planner.d.ts +17 -0
  66. package/dist/planner.js +248 -0
  67. package/dist/planner.js.map +1 -0
  68. package/dist/release/snapshot.d.ts +64 -0
  69. package/dist/release/snapshot.js +75 -0
  70. package/dist/release/snapshot.js.map +1 -0
  71. package/dist/release/stable.d.ts +46 -0
  72. package/dist/release/stable.js +57 -0
  73. package/dist/release/stable.js.map +1 -0
  74. package/dist/runs/auto-name.d.ts +75 -0
  75. package/dist/runs/auto-name.js +168 -0
  76. package/dist/runs/auto-name.js.map +1 -0
  77. package/dist/runs/retention.d.ts +60 -0
  78. package/dist/runs/retention.js +86 -0
  79. package/dist/runs/retention.js.map +1 -0
  80. package/dist/runs/review-gate.d.ts +18 -0
  81. package/dist/runs/review-gate.js +21 -0
  82. package/dist/runs/review-gate.js.map +1 -0
  83. package/dist/runs/store.d.ts +408 -0
  84. package/dist/runs/store.js +526 -0
  85. package/dist/runs/store.js.map +1 -0
  86. package/dist/runs/task-refs.d.ts +24 -0
  87. package/dist/runs/task-refs.js +74 -0
  88. package/dist/runs/task-refs.js.map +1 -0
  89. package/dist/runs/ui-event-sink.d.ts +81 -0
  90. package/dist/runs/ui-event-sink.js +210 -0
  91. package/dist/runs/ui-event-sink.js.map +1 -0
  92. package/dist/server/capabilities.d.ts +33 -0
  93. package/dist/server/capabilities.js +43 -0
  94. package/dist/server/capabilities.js.map +1 -0
  95. package/dist/server/forge/github.d.ts +70 -0
  96. package/dist/server/forge/github.js +375 -0
  97. package/dist/server/forge/github.js.map +1 -0
  98. package/dist/server/forge/index.d.ts +24 -0
  99. package/dist/server/forge/index.js +45 -0
  100. package/dist/server/forge/index.js.map +1 -0
  101. package/dist/server/forge/types.d.ts +80 -0
  102. package/dist/server/forge/types.js +2 -0
  103. package/dist/server/forge/types.js.map +1 -0
  104. package/dist/server/git-changes.d.ts +195 -0
  105. package/dist/server/git-changes.js +497 -0
  106. package/dist/server/git-changes.js.map +1 -0
  107. package/dist/server/git.d.ts +26 -0
  108. package/dist/server/git.js +103 -0
  109. package/dist/server/git.js.map +1 -0
  110. package/dist/server/github.d.ts +8 -0
  111. package/dist/server/github.js +8 -0
  112. package/dist/server/github.js.map +1 -0
  113. package/dist/server/launch-key.d.ts +7 -0
  114. package/dist/server/launch-key.js +33 -0
  115. package/dist/server/launch-key.js.map +1 -0
  116. package/dist/server/open-in-app.d.ts +51 -0
  117. package/dist/server/open-in-app.js +189 -0
  118. package/dist/server/open-in-app.js.map +1 -0
  119. package/dist/server/open-in-terminal.d.ts +25 -0
  120. package/dist/server/open-in-terminal.js +120 -0
  121. package/dist/server/open-in-terminal.js.map +1 -0
  122. package/dist/server/pr.d.ts +7 -0
  123. package/dist/server/pr.js +7 -0
  124. package/dist/server/pr.js.map +1 -0
  125. package/dist/server/server.d.ts +41 -0
  126. package/dist/server/server.js +1390 -0
  127. package/dist/server/server.js.map +1 -0
  128. package/dist/server/static-ui.d.ts +49 -0
  129. package/dist/server/static-ui.js +92 -0
  130. package/dist/server/static-ui.js.map +1 -0
  131. package/dist/server/wsl.d.ts +25 -0
  132. package/dist/server/wsl.js +92 -0
  133. package/dist/server/wsl.js.map +1 -0
  134. package/dist/server-install/engine.d.ts +33 -0
  135. package/dist/server-install/engine.js +314 -0
  136. package/dist/server-install/engine.js.map +1 -0
  137. package/dist/server-install/platforms/macosx-ngrok.d.ts +6 -0
  138. package/dist/server-install/platforms/macosx-ngrok.js +345 -0
  139. package/dist/server-install/platforms/macosx-ngrok.js.map +1 -0
  140. package/dist/server-install/platforms/ubuntu-vps.d.ts +39 -0
  141. package/dist/server-install/platforms/ubuntu-vps.js +746 -0
  142. package/dist/server-install/platforms/ubuntu-vps.js.map +1 -0
  143. package/dist/server-install/state.d.ts +26 -0
  144. package/dist/server-install/state.js +125 -0
  145. package/dist/server-install/state.js.map +1 -0
  146. package/dist/server-install/steps.d.ts +109 -0
  147. package/dist/server-install/steps.js +330 -0
  148. package/dist/server-install/steps.js.map +1 -0
  149. package/dist/server-install/strategies.d.ts +4 -0
  150. package/dist/server-install/strategies.js +20 -0
  151. package/dist/server-install/strategies.js.map +1 -0
  152. package/dist/server-install/types.d.ts +597 -0
  153. package/dist/server-install/types.js +98 -0
  154. package/dist/server-install/types.js.map +1 -0
  155. package/dist/server-install/ui.d.ts +42 -0
  156. package/dist/server-install/ui.js +130 -0
  157. package/dist/server-install/ui.js.map +1 -0
  158. package/dist/skills-banner.d.ts +21 -0
  159. package/dist/skills-banner.js +40 -0
  160. package/dist/skills-banner.js.map +1 -0
  161. package/dist/skills-remote.d.ts +35 -0
  162. package/dist/skills-remote.js +266 -0
  163. package/dist/skills-remote.js.map +1 -0
  164. package/dist/skills.d.ts +45 -0
  165. package/dist/skills.js +182 -0
  166. package/dist/skills.js.map +1 -0
  167. package/dist/todos.d.ts +63 -0
  168. package/dist/todos.js +168 -0
  169. package/dist/todos.js.map +1 -0
  170. package/dist/ui-state.d.ts +12 -0
  171. package/dist/ui-state.js +25 -0
  172. package/dist/ui-state.js.map +1 -0
  173. package/dist/update-check.d.ts +12 -0
  174. package/dist/update-check.js +41 -0
  175. package/dist/update-check.js.map +1 -0
  176. package/dist/workflows/load.d.ts +15 -0
  177. package/dist/workflows/load.js +56 -0
  178. package/dist/workflows/load.js.map +1 -0
  179. package/dist/workflows/run.d.ts +281 -0
  180. package/dist/workflows/run.js +1511 -0
  181. package/dist/workflows/run.js.map +1 -0
  182. package/dist/workflows/types.d.ts +307 -0
  183. package/dist/workflows/types.js +171 -0
  184. package/dist/workflows/types.js.map +1 -0
  185. package/package.json +90 -0
  186. package/scripts/check-pack.mjs +46 -0
  187. package/scripts/dev.mjs +74 -0
  188. package/scripts/install-as-command.mjs +120 -0
  189. package/scripts/mock-claude.mjs +310 -0
  190. package/scripts/release-snapshot.mjs +130 -0
  191. package/scripts/release.mjs +119 -0
  192. package/scripts/test-process-usage.mjs +47 -0
  193. package/web/dist/assets/arrow-left-BE957rJs.js +1 -0
  194. package/web/dist/assets/bundle-mjs-DLPpRFyl.js +1 -0
  195. package/web/dist/assets/centered-state-BddhEEtO.js +43 -0
  196. package/web/dist/assets/chunk-BO2N2NFS-f5igTtpB.js +131 -0
  197. package/web/dist/assets/command-CjhFbABo.js +1 -0
  198. package/web/dist/assets/compare-variants-Cs52IAEG.js +1 -0
  199. package/web/dist/assets/core-BuMqAF_1.js +12 -0
  200. package/web/dist/assets/css-BsVw1vtW.js +1 -0
  201. package/web/dist/assets/dialog-DFvXTkFv.js +1 -0
  202. package/web/dist/assets/diff-view-C9b8AITq.js +4 -0
  203. package/web/dist/assets/diff-woXpYk--.js +1 -0
  204. package/web/dist/assets/dist-FBs4wmIY.js +1 -0
  205. package/web/dist/assets/dist-o_kVMXjg.js +1 -0
  206. package/web/dist/assets/engine-javascript-FQvzRocB.js +141 -0
  207. package/web/dist/assets/file-BVuztAOd.js +1 -0
  208. package/web/dist/assets/folder-0pJ1NZ_S.js +1 -0
  209. package/web/dist/assets/git-pull-request-DJkAMT0f.js +1 -0
  210. package/web/dist/assets/git-toolbar-CwhQdx3J.js +1 -0
  211. package/web/dist/assets/github-D0rAX4-r.js +1 -0
  212. package/web/dist/assets/go-rLFTqkRN.js +1 -0
  213. package/web/dist/assets/highlighted-body-OFNGDK62-DGHHie_q.js +1 -0
  214. package/web/dist/assets/highlighter-BKVEsACy.js +3 -0
  215. package/web/dist/assets/html-BY76lXLH.js +1 -0
  216. package/web/dist/assets/index-CEkI7QxN.css +2 -0
  217. package/web/dist/assets/index-CO2lH2et.js +11 -0
  218. package/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  219. package/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  220. package/web/dist/assets/javascript-BgS3c2Ky.js +1 -0
  221. package/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  222. package/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  223. package/web/dist/assets/json-qhed-kSA.js +1 -0
  224. package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
  225. package/web/dist/assets/jsx-Bz0zcwM4.js +1 -0
  226. package/web/dist/assets/lib-CNGa3Dig.js +1 -0
  227. package/web/dist/assets/loader-circle-BV3DO9mE.js +1 -0
  228. package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
  229. package/web/dist/assets/markdown-D4-ADgH9.js +1 -0
  230. package/web/dist/assets/mermaid-GHXKKRXX-DM2VsGBG.js +1 -0
  231. package/web/dist/assets/open-mercato-toBr6SOa.svg +11 -0
  232. package/web/dist/assets/prompt-templates-C7ptKvDd.js +15 -0
  233. package/web/dist/assets/python-gzcpVVnB.js +1 -0
  234. package/web/dist/assets/react-dom-Ddtik4qM.js +1 -0
  235. package/web/dist/assets/refresh-cw-DCa-Rlwz.js +1 -0
  236. package/web/dist/assets/repo-git-DIhryGDx.js +1 -0
  237. package/web/dist/assets/run-diff-Dyow8B1q.js +3 -0
  238. package/web/dist/assets/run-header-jx9-18b8.js +1 -0
  239. package/web/dist/assets/rust-Cfkwpbl8.js +1 -0
  240. package/web/dist/assets/search-x-CoCyl7zT.js +1 -0
  241. package/web/dist/assets/shellscript-CLZ0U2zV.js +1 -0
  242. package/web/dist/assets/skill-detail-DB7x_FQp.js +1 -0
  243. package/web/dist/assets/skills-98vCroU8.js +1 -0
  244. package/web/dist/assets/skills-BKIoqD6K.js +1 -0
  245. package/web/dist/assets/sql-BsFa4tDR.js +1 -0
  246. package/web/dist/assets/square-terminal-B6PZX4Qp.js +1 -0
  247. package/web/dist/assets/tab-link-C5--YMQd.js +1 -0
  248. package/web/dist/assets/task-changes-ejxPGVJw.js +1 -0
  249. package/web/dist/assets/task-commits-C6GO5qT-.js +1 -0
  250. package/web/dist/assets/task-files-CatpCBXa.js +2 -0
  251. package/web/dist/assets/task-thread-BMbXDM3d.js +5 -0
  252. package/web/dist/assets/tasks-table-dgezlCcg.js +1 -0
  253. package/web/dist/assets/trash-2-CDtxmmc8.js +1 -0
  254. package/web/dist/assets/triangle-alert-6su4Js5O.js +1 -0
  255. package/web/dist/assets/tsx-udAQXfEw.js +1 -0
  256. package/web/dist/assets/typescript-bsJCZSQ-.js +1 -0
  257. package/web/dist/assets/upload-Bp7hQxll.js +1 -0
  258. package/web/dist/assets/use-desktop-CvTwojOJ.js +3 -0
  259. package/web/dist/assets/utils-rQGbOrwc.js +1 -0
  260. package/web/dist/assets/workflows-Dy2c6790.js +11 -0
  261. package/web/dist/assets/x-Br_jIDBw.js +1 -0
  262. package/web/dist/assets/yaml-rwi0_p6S.js +1 -0
  263. package/web/dist/index.html +70 -0
  264. package/web/open-mercato.svg +11 -0
package/dist/index.js ADDED
@@ -0,0 +1,466 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from 'node:util';
3
+ import { spawn, execFileSync } from 'node:child_process';
4
+ import { createServer } from 'node:net';
5
+ import { mkdirSync, writeFileSync, existsSync, readFileSync } from 'node:fs';
6
+ import { dirname, join, resolve } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { detectEnvironment } from './core/backend-detect.js';
9
+ import { pruneOrphans } from './git-worktree.js';
10
+ import { getRepoInfo } from './server/git.js';
11
+ import { loadConfig } from './config.js';
12
+ import { reclaimWorktrees } from './runs/retention.js';
13
+ import { RunStore } from './runs/store.js';
14
+ import { RunManager } from './workflows/run.js';
15
+ import { loadWorkflows } from './workflows/load.js';
16
+ import { startServer } from './server/server.js';
17
+ import { checkForUpdate } from './update-check.js';
18
+ import { printSkillsBanner } from './skills-banner.js';
19
+ const HELP = `cezar — local cockpit for AI agent tasks in your repo
20
+
21
+ Usage:
22
+ cezar start the cockpit (server + GUI) for the current repo
23
+ cezar run "<task>" run a task headless in the terminal
24
+ cezar init scaffold .ai/cezar/ (example workflow + skill)
25
+ cezar server-install interactive wizard to host cezar on a server
26
+ cezar server-deploy redeploy a new version (reload the service) + verify
27
+ cezar server-uninstall reverse a server-install
28
+
29
+ Options:
30
+ -p, --port <n> cockpit port (default 4321)
31
+ --repo <dir> repo to operate on (default: cwd)
32
+ --workflow <name> workflow for \`run\` (default: quick-task)
33
+ --model <model> model override for \`run\`
34
+ --no-open don't open the browser
35
+ --platform <id> server-install target (ubuntu-vps | macosx-ngrok)
36
+ --yes server-install: accept safe defaults (never auto-sudo)
37
+ --reconfigure <ids> server-install: force re-run of step id(s), comma-separated
38
+ --reinstall server-install: force re-run of every step (full reinstall)
39
+ -h, --help show this help
40
+
41
+ Zero config: uses your logged-in \`claude\` CLI (and \`gh\` for GitHub bits).
42
+ Skills live in .ai/skills/, .ai/cezar/skills/ and your team skills repo
43
+ (default open-mercato/skills; override via .ai/cezar/config.json);
44
+ workflows in .ai/cezar/workflows/.`;
45
+ async function main() {
46
+ const { values, positionals } = parseArgs({
47
+ options: {
48
+ port: { type: 'string', short: 'p', default: '4321' },
49
+ repo: { type: 'string' },
50
+ workflow: { type: 'string' },
51
+ model: { type: 'string' },
52
+ 'no-open': { type: 'boolean', default: false },
53
+ platform: { type: 'string' },
54
+ yes: { type: 'boolean', default: false },
55
+ reconfigure: { type: 'string' },
56
+ reinstall: { type: 'boolean', default: false },
57
+ help: { type: 'boolean', short: 'h', default: false },
58
+ },
59
+ allowPositionals: true,
60
+ });
61
+ if (values.help) {
62
+ console.log(HELP);
63
+ return;
64
+ }
65
+ const command = positionals[0] ?? 'serve';
66
+ const cwd = resolve(values.repo ?? process.cwd());
67
+ const repoInfo = await getRepoInfo(cwd);
68
+ const repoRoot = repoInfo?.root ?? cwd;
69
+ switch (command) {
70
+ case 'serve':
71
+ await serveCommand(repoRoot, Number(values.port), !values['no-open']);
72
+ return;
73
+ case 'run':
74
+ await runCommand(repoRoot, positionals.slice(1).join(' ').trim(), values.workflow, values.model);
75
+ return;
76
+ case 'init':
77
+ initCommand(repoRoot);
78
+ return;
79
+ case 'server-install':
80
+ await serverCommand('install', repoRoot, values.platform, {
81
+ yes: Boolean(values.yes),
82
+ reconfigure: values.reconfigure,
83
+ reinstall: Boolean(values.reinstall),
84
+ });
85
+ return;
86
+ case 'server-deploy':
87
+ await serverCommand('deploy', repoRoot, values.platform, { yes: Boolean(values.yes) });
88
+ return;
89
+ case 'server-uninstall':
90
+ await serverCommand('uninstall', repoRoot, values.platform, { yes: Boolean(values.yes) });
91
+ return;
92
+ default:
93
+ console.error(`unknown command: ${command}\n`);
94
+ console.log(HELP);
95
+ process.exitCode = 1;
96
+ }
97
+ }
98
+ // ---- serve -----------------------------------------------------------------
99
+ async function serveCommand(repoRoot, preferredPort, openBrowser) {
100
+ // keepLive + recover() (#367): runs that were queued/running/waiting when
101
+ // the previous process exited are re-queued or resumed instead of failed.
102
+ const store = openStore(repoRoot, { keepLive: true });
103
+ const manager = new RunManager(store, repoRoot);
104
+ const version = readOwnVersion();
105
+ const checks = await detectEnvironment();
106
+ const repo = await getRepoInfo(repoRoot);
107
+ // Startup reconcile (spec 006): sweep worktrees whose run no longer exists.
108
+ if (repo) {
109
+ const orphans = await pruneOrphans(repoRoot, new Set(store.listRuns().map((r) => r.id))).catch(() => []);
110
+ if (orphans.length > 0) {
111
+ console.log(` cleaned ${orphans.length} orphaned worktree(s): ${orphans.map((id) => id.slice(0, 8)).join(', ')}`);
112
+ }
113
+ // Count-based worktree retention (#483): reclaim finished worktrees beyond
114
+ // the keep-limit (directory only — `cez/<id8>` branch kept, so recoverable).
115
+ // Best-effort; never blocks boot.
116
+ const keep = (await loadConfig(repoRoot).catch(() => null))?.worktreeRetention ?? 10;
117
+ const reclaimed = await reclaimWorktrees(repoRoot, store, keep).catch(() => []);
118
+ if (reclaimed.length > 0) {
119
+ console.log(` reclaimed ${reclaimed.length} old worktree(s), branch kept: ${reclaimed.map((id) => id.slice(0, 8)).join(', ')}`);
120
+ }
121
+ }
122
+ const recovered = store
123
+ .listRuns()
124
+ .filter((r) => ['queued', 'waiting', 'running'].includes(r.status)).length;
125
+ await manager.recover();
126
+ if (recovered > 0)
127
+ console.log(` recovered ${recovered} run(s) from the previous session`);
128
+ // Update discovery (#368) — fire-and-forget; the banner prints whenever the
129
+ // registry answers and /api/health picks it up for the GUI chip.
130
+ const pkgName = readOwnName();
131
+ const update = {};
132
+ void checkForUpdate(pkgName, version).then((latest) => {
133
+ if (!latest)
134
+ return;
135
+ update.latest = latest;
136
+ console.log(`\n ⬆ cezar ${latest} is available (running ${version}) — restart with: npx ${pkgName}@latest\n`);
137
+ });
138
+ const port = await pickPort(preferredPort);
139
+ startServer({ repoRoot, store, manager, version, update }, port);
140
+ const url = `http://localhost:${port}`;
141
+ console.log(`\n cezar v${version} — ${repoRoot}`);
142
+ console.log(` ${repo ? `branch ${repo.branch}` : 'not a git repository (tasks run in place, one at a time; repo view is empty)'}`);
143
+ for (const check of checks) {
144
+ const mark = check.available ? '✓' : '✗';
145
+ const detail = check.available ? (check.version ?? 'ok') : (check.hint ?? 'missing');
146
+ console.log(` ${mark} ${check.name.padEnd(6)} ${detail}`);
147
+ }
148
+ if (port !== preferredPort)
149
+ console.log(` (port ${preferredPort} was busy — using ${port})`);
150
+ console.log(`\n cockpit → ${url}\n`);
151
+ // Silenced by CEZ_NO_BANNER=1 or by dismissing the cockpit's banner (#391).
152
+ await printSkillsBanner(repoRoot);
153
+ const shutdown = () => {
154
+ store.flush();
155
+ process.exit(0);
156
+ };
157
+ process.on('SIGINT', shutdown);
158
+ process.on('SIGTERM', shutdown);
159
+ // Open the browser only once the server actually answers, so the first
160
+ // paint is the cockpit and never a connection error.
161
+ if (openBrowser) {
162
+ const healthy = await waitForHealth(`${url}/api/health`, 5_000);
163
+ if (healthy)
164
+ openUrl(url);
165
+ }
166
+ }
167
+ /** First free port starting at `start` (the launch.mjs pattern from janitor). */
168
+ async function pickPort(start) {
169
+ for (let port = start; port < start + 50; port++) {
170
+ if (await canListen(port))
171
+ return port;
172
+ }
173
+ return start; // let the server fail loudly if 50 ports are somehow busy
174
+ }
175
+ function canListen(port) {
176
+ return new Promise((resolvePort) => {
177
+ const probe = createServer();
178
+ probe.once('error', () => resolvePort(false));
179
+ probe.once('listening', () => probe.close(() => resolvePort(true)));
180
+ probe.listen(port, '127.0.0.1');
181
+ });
182
+ }
183
+ async function waitForHealth(healthUrl, timeoutMs) {
184
+ const deadline = Date.now() + timeoutMs;
185
+ while (Date.now() < deadline) {
186
+ try {
187
+ const res = await fetch(healthUrl);
188
+ if (res.ok)
189
+ return true;
190
+ }
191
+ catch {
192
+ // not up yet
193
+ }
194
+ await new Promise((r) => setTimeout(r, 150));
195
+ }
196
+ return false;
197
+ }
198
+ // ---- run (headless) ----------------------------------------------------------
199
+ async function runCommand(repoRoot, task, workflowName, model) {
200
+ if (!task) {
201
+ console.error('usage: cezar run "<task>" [--workflow name] [--model model]');
202
+ process.exitCode = 1;
203
+ return;
204
+ }
205
+ const { workflows, issues } = await loadWorkflows(repoRoot);
206
+ for (const issue of issues)
207
+ console.error(`! skipped ${issue.path}: ${issue.message}`);
208
+ const name = workflowName ?? 'quick-task';
209
+ const workflow = workflows.find((w) => w.name === name);
210
+ if (!workflow) {
211
+ console.error(`unknown workflow: ${name} (available: ${workflows.map((w) => w.name).join(', ')})`);
212
+ process.exitCode = 1;
213
+ return;
214
+ }
215
+ const store = openStore(repoRoot);
216
+ const manager = new RunManager(store, repoRoot);
217
+ store.on('event', ({ event }) => {
218
+ switch (event.type) {
219
+ case 'text':
220
+ console.log(String(event.text ?? ''));
221
+ break;
222
+ case 'tool-call':
223
+ console.log(` → ${String(event.tool)} ${previewJson(event.input)}`);
224
+ break;
225
+ case 'tool-result':
226
+ console.log(` ← ${firstLine(String(event.result ?? ''))}`);
227
+ break;
228
+ case 'check-output':
229
+ console.log(String(event.text ?? ''));
230
+ break;
231
+ case 'step-start':
232
+ console.log(`\n── step: ${String(event.name)} ${Number(event.iteration) > 1 ? `(attempt ${event.iteration})` : ''}`);
233
+ break;
234
+ case 'note':
235
+ case 'lifecycle':
236
+ console.log(` · ${String(event.message ?? '')}`);
237
+ break;
238
+ case 'error':
239
+ console.error(` ✗ ${String(event.message ?? '')}`);
240
+ break;
241
+ }
242
+ });
243
+ const run = manager.startRun(workflow, { task, model });
244
+ // `review` is terminal here too (spec 009) — headless runs must not hang on
245
+ // the GUI's review gate; the diff waits on the task branch/cockpit instead.
246
+ const final = await new Promise((resolveStatus) => {
247
+ store.on('run', (r) => {
248
+ if (r.id === run.id && ['done', 'review', 'failed', 'cancelled'].includes(r.status))
249
+ resolveStatus(r.status);
250
+ });
251
+ });
252
+ store.flush();
253
+ const record = store.getRun(run.id);
254
+ if (final === 'review') {
255
+ console.log(`\n changes ready for review on branch ${record?.branch ?? '?'} — inspect them in the cockpit: npx cezar`);
256
+ }
257
+ console.log(`\nrun ${final} — ${record?.tokensUsed ?? 0} tokens — details in the cockpit: npx cezar`);
258
+ process.exitCode = final === 'done' || final === 'review' ? 0 : 1;
259
+ }
260
+ // ---- server-install / server-uninstall --------------------------------------
261
+ // The whole server-install module (and its @clack/prompts dependency) is loaded
262
+ // lazily here so it never enters the `serve`/`run`/`init` import graph — the
263
+ // runtime server stack stays tiny (AGENTS.md).
264
+ /**
265
+ * Prepend the operator's login-shell PATH to this process's PATH so tool
266
+ * detection and installs find things in ~/.local/bin, nvm, and other
267
+ * profile-added dirs even when the installer was launched non-interactively.
268
+ * Best-effort: a shell that errors or hangs leaves PATH untouched.
269
+ */
270
+ function augmentPathFromLoginShell() {
271
+ try {
272
+ const out = execFileSync('bash', ['-lc', 'printf %s "$PATH"'], { timeout: 5000, encoding: 'utf8' });
273
+ const loginPath = out.split('\n').map((s) => s.trim()).filter(Boolean).pop() ?? '';
274
+ if (!loginPath)
275
+ return;
276
+ const seen = new Set();
277
+ process.env.PATH = [...loginPath.split(':'), ...(process.env.PATH ?? '').split(':')]
278
+ .filter((d) => d && !seen.has(d) && seen.add(d))
279
+ .join(':');
280
+ }
281
+ catch {
282
+ // best effort — keep the existing PATH
283
+ }
284
+ }
285
+ async function serverCommand(mode, repoRoot, platform, flags) {
286
+ // Detection (claude/gh/codex) and tool installs resolve executables off the
287
+ // process PATH. When the installer is launched from a non-login shell (an
288
+ // `ssh host cmd`, a script, a fresh service context), ~/.local/bin and nvm's
289
+ // bin are absent, so tools the user actually has look "not installed". Merge
290
+ // the login shell's PATH first so we see exactly what the operator sees.
291
+ augmentPathFromLoginShell();
292
+ const { getStrategy, availablePlatformIds } = await import('./server-install/strategies.js');
293
+ const { runInstall, runUninstall, runDeploy } = await import('./server-install/engine.js');
294
+ const ids = availablePlatformIds();
295
+ // Uninstall and deploy can read the platform from the recorded state when omitted.
296
+ let chosen = platform;
297
+ if ((mode === 'uninstall' || mode === 'deploy') && !chosen) {
298
+ const { loadServerState } = await import('./server-install/state.js');
299
+ chosen = loadServerState().platform;
300
+ }
301
+ if (!chosen) {
302
+ console.error(`--platform is required. Valid platforms: ${ids.join(', ')}`);
303
+ process.exitCode = 1;
304
+ return;
305
+ }
306
+ const strategy = getStrategy(chosen);
307
+ if (!strategy) {
308
+ console.error(`unknown platform: ${chosen} (valid: ${ids.join(', ')})`);
309
+ process.exitCode = 1;
310
+ return;
311
+ }
312
+ const runOpts = {
313
+ dryRun: process.env.CEZ_DRY_RUN === '1',
314
+ assumeYes: flags.yes,
315
+ reconfigure: new Set((flags.reconfigure ?? '').split(',').map((s) => s.trim()).filter(Boolean)),
316
+ reinstall: Boolean(flags.reinstall),
317
+ repoRoot,
318
+ now: new Date().toISOString(),
319
+ };
320
+ try {
321
+ const result = mode === 'install'
322
+ ? await runInstall(strategy, runOpts)
323
+ : mode === 'deploy'
324
+ ? await runDeploy(strategy, runOpts)
325
+ : await runUninstall(strategy, runOpts);
326
+ if (mode === 'install' && result.status === 'complete') {
327
+ console.log(`\n cezar server-install (${chosen}) complete.`);
328
+ console.log(` Redeploy a new version any time with: cezar server-deploy --platform ${chosen}\n`);
329
+ }
330
+ else if (mode === 'deploy' && result.status === 'complete') {
331
+ console.log(`\n cezar server-deploy (${chosen}) complete — the service was reloaded and verified.\n`);
332
+ }
333
+ else if (mode === 'uninstall' && result.status === 'complete') {
334
+ console.log(`\n cezar server-uninstall (${chosen}) complete — the changes it made were reversed.\n`);
335
+ }
336
+ // complete + cancelled (resumable) exit 0; failed exits 1.
337
+ process.exitCode = result.status === 'failed' ? 1 : 0;
338
+ }
339
+ catch (err) {
340
+ console.error(err instanceof Error ? err.message : String(err));
341
+ process.exitCode = 1;
342
+ }
343
+ }
344
+ // ---- init --------------------------------------------------------------------
345
+ function initCommand(repoRoot) {
346
+ const workflowsDir = join(repoRoot, '.ai/cezar', 'workflows');
347
+ const skillsDir = join(repoRoot, '.ai/cezar', 'skills');
348
+ mkdirSync(workflowsDir, { recursive: true });
349
+ mkdirSync(skillsDir, { recursive: true });
350
+ const examples = [
351
+ {
352
+ path: join(workflowsDir, 'fix-and-verify.yaml'),
353
+ content: `name: fix-and-verify
354
+ description: Implement the task, then run your test command; on failure the agent retries with the failing output.
355
+ steps:
356
+ - id: implement
357
+ name: Implement
358
+ prompt: "{{task}}"
359
+ - id: verify
360
+ name: Verify
361
+ command: "echo 'replace me with: npm test / yarn test / pytest'"
362
+ onFail:
363
+ retry: implement
364
+ max: 2
365
+ `,
366
+ },
367
+ {
368
+ path: join(skillsDir, 'project-conventions.md'),
369
+ content: `---
370
+ name: project-conventions
371
+ description: House rules the agent should follow in this repo.
372
+ ---
373
+
374
+ # Project conventions
375
+
376
+ - Describe your stack, style and testing conventions here.
377
+ - Reference this skill from a workflow step via \`skill: project-conventions\`.
378
+ `,
379
+ },
380
+ ];
381
+ for (const example of examples) {
382
+ if (existsSync(example.path)) {
383
+ console.log(` = ${example.path} (exists, left untouched)`);
384
+ }
385
+ else {
386
+ writeFileSync(example.path, example.content, 'utf8');
387
+ console.log(` + ${example.path}`);
388
+ }
389
+ }
390
+ ensureDataGitignore(repoRoot);
391
+ console.log('\nDone. Start the cockpit with: npx cezar');
392
+ }
393
+ // ---- helpers -----------------------------------------------------------------
394
+ function openStore(repoRoot, opts) {
395
+ const dataDir = join(repoRoot, '.ai/cezar');
396
+ const store = RunStore.open(dataDir, opts);
397
+ ensureDataGitignore(repoRoot);
398
+ return store;
399
+ }
400
+ /** Keep run data out of the user's repo history; workflows/skills stay committable. */
401
+ function ensureDataGitignore(repoRoot) {
402
+ const path = join(repoRoot, '.ai/cezar', '.gitignore');
403
+ const wanted = ['runs.json', 'runs.json.tmp', 'runs/', 'worktrees/', 'todos.json', 'todos.json.tmp', 'launch-key'];
404
+ try {
405
+ mkdirSync(join(repoRoot, '.ai/cezar'), { recursive: true });
406
+ const current = existsSync(path) ? readFileSync(path, 'utf8') : '';
407
+ const lines = current.split('\n');
408
+ const missing = wanted.filter((w) => !lines.includes(w));
409
+ if (missing.length > 0) {
410
+ const glue = current && !current.endsWith('\n') ? '\n' : '';
411
+ writeFileSync(path, `${current}${glue}${missing.join('\n')}\n`, 'utf8');
412
+ }
413
+ }
414
+ catch {
415
+ // non-fatal
416
+ }
417
+ }
418
+ /** Own package name — for the npm-registry update check (#368). */
419
+ function readOwnName() {
420
+ try {
421
+ const here = dirname(fileURLToPath(import.meta.url));
422
+ const pkg = JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf8'));
423
+ return pkg.name ?? '@open-mercato/cezar';
424
+ }
425
+ catch {
426
+ return '@open-mercato/cezar';
427
+ }
428
+ }
429
+ function readOwnVersion() {
430
+ try {
431
+ const here = dirname(fileURLToPath(import.meta.url));
432
+ const pkg = JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf8'));
433
+ return pkg.version ?? '0.0.0';
434
+ }
435
+ catch {
436
+ return '0.0.0';
437
+ }
438
+ }
439
+ function openUrl(url) {
440
+ const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
441
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
442
+ try {
443
+ spawn(cmd, args, { stdio: 'ignore', detached: true }).unref();
444
+ }
445
+ catch {
446
+ // the printed URL is enough
447
+ }
448
+ }
449
+ function previewJson(input) {
450
+ try {
451
+ const s = JSON.stringify(input);
452
+ return s.length > 120 ? `${s.slice(0, 117)}…` : s;
453
+ }
454
+ catch {
455
+ return '';
456
+ }
457
+ }
458
+ function firstLine(s) {
459
+ const line = s.split('\n')[0] ?? '';
460
+ return line.length > 120 ? `${line.slice(0, 117)}…` : line;
461
+ }
462
+ main().catch((err) => {
463
+ console.error(err instanceof Error ? err.message : String(err));
464
+ process.exit(1);
465
+ });
466
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /** The pure half of `scripts/install-as-command.mjs` (spec 013).
2
+ *
3
+ * `npm run install-as-command` builds this checkout and puts a global
4
+ * `cezar`/`cez`/`cezar-cli` command on PATH pointing at THIS working tree —
5
+ * the local-dev equivalent of `npx cezar-cli`, with no publish. This module
6
+ * owns the *decisions* (which npm command runs, where the shims land) so they
7
+ * are unit-testable; the `.mjs` script owns the spawning and exit codes.
8
+ * Kept dependency-free and side-effect-free (mirrors `pack-check.ts`).
9
+ */
10
+ /** Scoped package name — both install flavors register globally under it, so
11
+ * uninstall is a single `npm rm --global` of this name regardless of flavor. */
12
+ export declare const PACKAGE_NAME = "@open-mercato/cezar";
13
+ /** Every bin the main package installs. `cezar-cli` is added (spec 013) so a
14
+ * single link / global-install exposes the same name as `npx cezar-cli`. */
15
+ export declare const BIN_NAMES: readonly ["cezar", "cez", "cezar-cli"];
16
+ export type InstallMode = 'link' | 'global' | 'uninstall';
17
+ /** One npm invocation: `args` are passed straight to npm (no shell). */
18
+ export interface NpmStep {
19
+ args: string[];
20
+ label: string;
21
+ }
22
+ export interface InstallPlan {
23
+ /** Run `npm run build` before the npm steps (link/global need a fresh dist). */
24
+ build: boolean;
25
+ steps: NpmStep[];
26
+ }
27
+ /** Decide the build + npm steps for a mode. `build` defaults to true for the
28
+ * install flavors and is forced false for uninstall (nothing to rebuild). */
29
+ export declare function planInstall(opts: {
30
+ mode: InstallMode;
31
+ build?: boolean;
32
+ }): InstallPlan;
33
+ /** Expected shim paths for all three bins under an `npm prefix -g` value.
34
+ * npm drops POSIX shims in `<prefix>/bin/<name>` and Windows shims directly in
35
+ * `<prefix>\<name>.cmd`. `platform` is passed in (not read from `process`) so
36
+ * the mapping is deterministic and testable for either OS. */
37
+ export declare function globalShimPaths(prefix: string, platform?: NodeJS.Platform): string[];
38
+ /** The directory the shims live in (for the post-install PATH hint). */
39
+ export declare function globalBinDir(prefix: string, platform?: NodeJS.Platform): string;
@@ -0,0 +1,51 @@
1
+ /** The pure half of `scripts/install-as-command.mjs` (spec 013).
2
+ *
3
+ * `npm run install-as-command` builds this checkout and puts a global
4
+ * `cezar`/`cez`/`cezar-cli` command on PATH pointing at THIS working tree —
5
+ * the local-dev equivalent of `npx cezar-cli`, with no publish. This module
6
+ * owns the *decisions* (which npm command runs, where the shims land) so they
7
+ * are unit-testable; the `.mjs` script owns the spawning and exit codes.
8
+ * Kept dependency-free and side-effect-free (mirrors `pack-check.ts`).
9
+ */
10
+ import path from 'node:path';
11
+ /** Scoped package name — both install flavors register globally under it, so
12
+ * uninstall is a single `npm rm --global` of this name regardless of flavor. */
13
+ export const PACKAGE_NAME = '@open-mercato/cezar';
14
+ /** Every bin the main package installs. `cezar-cli` is added (spec 013) so a
15
+ * single link / global-install exposes the same name as `npx cezar-cli`. */
16
+ export const BIN_NAMES = ['cezar', 'cez', 'cezar-cli'];
17
+ /** Decide the build + npm steps for a mode. `build` defaults to true for the
18
+ * install flavors and is forced false for uninstall (nothing to rebuild). */
19
+ export function planInstall(opts) {
20
+ switch (opts.mode) {
21
+ case 'uninstall':
22
+ return {
23
+ build: false,
24
+ steps: [{ args: ['rm', '--global', PACKAGE_NAME], label: `remove global ${PACKAGE_NAME}` }],
25
+ };
26
+ case 'link':
27
+ return {
28
+ build: opts.build ?? true,
29
+ steps: [{ args: ['link'], label: 'link this checkout into the global prefix' }],
30
+ };
31
+ case 'global':
32
+ return {
33
+ build: opts.build ?? true,
34
+ steps: [{ args: ['install', '--global', '.'], label: 'install this checkout globally (snapshot)' }],
35
+ };
36
+ }
37
+ }
38
+ /** Expected shim paths for all three bins under an `npm prefix -g` value.
39
+ * npm drops POSIX shims in `<prefix>/bin/<name>` and Windows shims directly in
40
+ * `<prefix>\<name>.cmd`. `platform` is passed in (not read from `process`) so
41
+ * the mapping is deterministic and testable for either OS. */
42
+ export function globalShimPaths(prefix, platform = process.platform) {
43
+ const p = platform === 'win32' ? path.win32 : path.posix;
44
+ return BIN_NAMES.map((name) => platform === 'win32' ? p.join(prefix, `${name}.cmd`) : p.join(prefix, 'bin', name));
45
+ }
46
+ /** The directory the shims live in (for the post-install PATH hint). */
47
+ export function globalBinDir(prefix, platform = process.platform) {
48
+ const p = platform === 'win32' ? path.win32 : path.posix;
49
+ return platform === 'win32' ? prefix : p.join(prefix, 'bin');
50
+ }
51
+ //# sourceMappingURL=install-as-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-as-command.js","sourceRoot":"","sources":["../src/install-as-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;iFACiF;AACjF,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAElD;6EAC6E;AAC7E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAU,CAAC;AAgBhE;8EAC8E;AAC9E,MAAM,UAAU,WAAW,CAAC,IAA4C;IACtE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,WAAW;YACd,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,iBAAiB,YAAY,EAAE,EAAE,CAAC;aAC5F,CAAC;QACJ,KAAK,MAAM;YACT,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;gBACzB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;aAChF,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;gBACzB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;aACpG,CAAC;IACN,CAAC;AACH,CAAC;AAED;;;+DAG+D;AAC/D,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAC1F,MAAM,CAAC,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACzD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5B,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CACnF,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,WAA4B,OAAO,CAAC,QAAQ;IACvF,MAAM,CAAC,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACzD,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,17 @@
1
+ /** Tarball bundle check — the pure half of `scripts/check-pack.mjs`.
2
+ *
3
+ * Phase R1 of the cockpit redesign shipped an npm tarball with no UI in it
4
+ * (`files` listed the sources, not the Vite build). This module pins that bug
5
+ * class: given the file list `npm pack --dry-run --json` reports, decide
6
+ * whether the package would ship a working cockpit. Kept dependency-free and
7
+ * side-effect-free so the decision is unit-testable; the script owns the
8
+ * `npm pack` invocation and the exit code.
9
+ */
10
+ /** Human-readable problems with a would-be tarball; empty array = publishable.
11
+ *
12
+ * Requirements (spec `.ai/specs/2026-07-14-cockpit-ui-redesign.md`, Serving):
13
+ * - `web/dist/index.html` — the built shell every GET serves.
14
+ * - at least one `web/dist/assets/*` file — the hashed JS/CSS bundles; an
15
+ * index.html alone renders a blank page.
16
+ */
17
+ export declare function findPackGaps(packedFiles: readonly string[]): string[];
@@ -0,0 +1,27 @@
1
+ /** Tarball bundle check — the pure half of `scripts/check-pack.mjs`.
2
+ *
3
+ * Phase R1 of the cockpit redesign shipped an npm tarball with no UI in it
4
+ * (`files` listed the sources, not the Vite build). This module pins that bug
5
+ * class: given the file list `npm pack --dry-run --json` reports, decide
6
+ * whether the package would ship a working cockpit. Kept dependency-free and
7
+ * side-effect-free so the decision is unit-testable; the script owns the
8
+ * `npm pack` invocation and the exit code.
9
+ */
10
+ /** Human-readable problems with a would-be tarball; empty array = publishable.
11
+ *
12
+ * Requirements (spec `.ai/specs/2026-07-14-cockpit-ui-redesign.md`, Serving):
13
+ * - `web/dist/index.html` — the built shell every GET serves.
14
+ * - at least one `web/dist/assets/*` file — the hashed JS/CSS bundles; an
15
+ * index.html alone renders a blank page.
16
+ */
17
+ export function findPackGaps(packedFiles) {
18
+ const gaps = [];
19
+ if (!packedFiles.includes('web/dist/index.html')) {
20
+ gaps.push('web/dist/index.html is missing — the tarball would ship no UI shell (run `npm run build:web`)');
21
+ }
22
+ if (!packedFiles.some((f) => f.startsWith('web/dist/assets/') && f.length > 'web/dist/assets/'.length)) {
23
+ gaps.push('no web/dist/assets/* bundle in the tarball — the shell would load with no JS/CSS');
24
+ }
25
+ return gaps;
26
+ }
27
+ //# sourceMappingURL=pack-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-check.js","sourceRoot":"","sources":["../src/pack-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,WAA8B;IACzD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QACvG,IAAI,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}