@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
@@ -0,0 +1,268 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { z } from 'zod';
4
+ import { createRunner } from './core/runner-factory.js';
5
+ import { loadConfig } from './config.js';
6
+ import { discoverSkills } from './skills.js';
7
+ import { resolveProfileEnvForRoot } from './workspace/agent-profiles.js';
8
+ import { workflowStepSchema } from './workflows/types.js';
9
+ /**
10
+ * Chain-from-prompt (spec 008): one cheap `claude` call turns the user's task
11
+ * into a proposed chain of workflow steps built from the skills at hand plus a
12
+ * detected verification command. The planner NEVER blocks the user — any
13
+ * error, timeout or unparseable answer degrades to a one-step quick-task plan
14
+ * with `fallback: true` so the GUI can show a dim note.
15
+ */
16
+ const PLANNER_TIMEOUT_MS = 60_000;
17
+ const PLANNER_SYSTEM_PROMPT = 'You are a planning assistant for an AI coding agent cockpit. Respond with ONLY a JSON object: ' +
18
+ '{"title":string,"steps":[{"skill"?:string,"name":string,"prompt"?:string,"command"?:string}],"rationale":string}. ' +
19
+ 'Rules: pick skills ONLY from the provided catalog; a step has either "prompt" (an agent step) or ' +
20
+ '"command" (a shell verification check); include the {{task}} placeholder in agent prompts where ' +
21
+ "the user's task text belongs; 1-5 steps; prefer fewer; \"title\" is a short kebab-case name for " +
22
+ 'the whole workflow (2-4 words, e.g. "fix-and-review").';
23
+ const plannerResponseSchema = z.object({
24
+ /** A short workflow name the builder pre-fills. Optional so older / partial answers still parse. */
25
+ title: z.string().optional(),
26
+ steps: z
27
+ .array(z.object({
28
+ skill: z.string().optional(),
29
+ name: z.string().min(1),
30
+ prompt: z.string().optional(),
31
+ command: z.string().optional(),
32
+ }))
33
+ .min(1)
34
+ .max(5),
35
+ rationale: z.string().default(''),
36
+ });
37
+ export async function planChain(repoRoot, task) {
38
+ const [skills, config, verifyCommands] = await Promise.all([
39
+ discoverSkills(repoRoot),
40
+ loadConfig(repoRoot),
41
+ detectVerifyCommands(repoRoot),
42
+ ]);
43
+ const skillNames = new Set(skills.map((s) => s.name));
44
+ const userPrompt = buildPlannerPrompt(task, skills, verifyCommands);
45
+ // Plan with the configured default runner. `plannerModel` ("sonnet") is a
46
+ // Claude alias, so only pass it when the planner runs on Claude — Codex /
47
+ // OpenCode pick their own default model instead.
48
+ const runner = createRunner(config.defaultRunner);
49
+ const plannerModel = config.defaultRunner === 'claude' ? config.plannerModel : undefined;
50
+ // Plan under the SAME agent account this project's tasks run on (spec
51
+ // 2026-07-29-agent-profiles). Without this the planner would quietly bill the personal
52
+ // subscription for a project the user pointed at their work account.
53
+ const { env: profileEnv } = await resolveProfileEnvForRoot(repoRoot, config.defaultRunner);
54
+ // One retry on an unparseable answer; a runner error goes straight to fallback.
55
+ for (let attempt = 0; attempt < 2; attempt++) {
56
+ let text;
57
+ try {
58
+ const result = await runner.run({
59
+ systemPrompt: PLANNER_SYSTEM_PROMPT,
60
+ userPrompt,
61
+ cwd: repoRoot,
62
+ allowedTools: [],
63
+ ...(Object.keys(profileEnv).length > 0 ? { env: profileEnv } : {}),
64
+ model: plannerModel,
65
+ timeoutMs: PLANNER_TIMEOUT_MS,
66
+ });
67
+ text = result.text;
68
+ }
69
+ catch {
70
+ break;
71
+ }
72
+ const parsed = parseStructured(text, plannerResponseSchema);
73
+ if (!parsed)
74
+ continue;
75
+ const steps = sanitizeSteps(parsed.steps, skillNames);
76
+ if (steps.length === 0)
77
+ break; // everything got rejected — degrade
78
+ const name = proposeWorkflowName(parsed.title);
79
+ return { ...(name ? { name } : {}), steps, rationale: parsed.rationale, fallback: false };
80
+ }
81
+ return {
82
+ steps: [{ id: 'task', name: 'Do the task', prompt: '{{task}}' }],
83
+ rationale: 'planner unavailable — single-step plan',
84
+ fallback: true,
85
+ };
86
+ }
87
+ /** The `[cez-planner]` marker lets the CEZ_DRY_RUN mock recognize a planning call. */
88
+ function buildPlannerPrompt(task, skills, verifyCommands) {
89
+ const catalog = skills.length
90
+ ? skills.map((s) => `- ${s.name} — ${s.description ?? ''}`).join('\n')
91
+ : '(no skills available)';
92
+ const verify = verifyCommands.length
93
+ ? verifyCommands.map((c) => `- ${c}`).join('\n')
94
+ : '(none detected)';
95
+ return [
96
+ '[cez-planner] Plan a chain of steps for this task.',
97
+ '',
98
+ 'Task:',
99
+ task,
100
+ '',
101
+ 'Skill catalog (name — description):',
102
+ catalog,
103
+ '',
104
+ 'Verification commands detected in this repo:',
105
+ verify,
106
+ ].join('\n');
107
+ }
108
+ /**
109
+ * Detect verification commands the planner may propose as `check` steps:
110
+ * `package.json` scripts (test/lint/build) and Makefile targets (first 50
111
+ * lines). Best effort — an unreadable file just contributes nothing.
112
+ */
113
+ async function detectVerifyCommands(repoRoot) {
114
+ const out = [];
115
+ const pkgSchema = z.object({ scripts: z.record(z.string(), z.string()).default({}) });
116
+ try {
117
+ const raw = JSON.parse(await readFile(join(repoRoot, 'package.json'), 'utf8'));
118
+ const pkg = pkgSchema.safeParse(raw);
119
+ if (pkg.success) {
120
+ if (pkg.data.scripts['test'])
121
+ out.push('npm test');
122
+ if (pkg.data.scripts['lint'])
123
+ out.push('npm run lint');
124
+ if (pkg.data.scripts['build'])
125
+ out.push('npm run build');
126
+ }
127
+ }
128
+ catch {
129
+ // no package.json — fine
130
+ }
131
+ try {
132
+ const make = await readFile(join(repoRoot, 'Makefile'), 'utf8');
133
+ for (const line of make.split('\n').slice(0, 50)) {
134
+ const m = /^([A-Za-z0-9_.-]+):(?!=)/.exec(line);
135
+ if (m && m[1] && !m[1].startsWith('.'))
136
+ out.push(`make ${m[1]}`);
137
+ if (out.length >= 8)
138
+ break;
139
+ }
140
+ }
141
+ catch {
142
+ // no Makefile — fine
143
+ }
144
+ return out;
145
+ }
146
+ /**
147
+ * Turn the model's raw steps into valid `WorkflowStepDef`s: exactly one of
148
+ * prompt/command, unknown skills stripped (the prompt still carries the step),
149
+ * ids derived from names with `-2`-style dedup. Steps that can't be repaired
150
+ * are dropped — the caller falls back when nothing survives.
151
+ */
152
+ function sanitizeSteps(raw, skillNames) {
153
+ const out = [];
154
+ const usedIds = new Set();
155
+ for (const s of raw) {
156
+ let skill = s.skill?.trim() || undefined;
157
+ const prompt = s.prompt?.trim() || undefined;
158
+ const command = s.command?.trim() || undefined;
159
+ if (Boolean(prompt) === Boolean(command))
160
+ continue; // needs exactly one
161
+ if (command)
162
+ skill = undefined; // a shell check carries no skill
163
+ if (skill && !skillNames.has(skill))
164
+ skill = undefined; // unknown skill → plain prompt
165
+ const id = uniqueId(slugify(s.name) || 'step', usedIds);
166
+ const candidate = workflowStepSchema.safeParse({
167
+ id,
168
+ name: s.name,
169
+ ...(skill ? { skill } : {}),
170
+ ...(prompt ? { prompt } : {}),
171
+ ...(command ? { command } : {}),
172
+ });
173
+ if (!candidate.success)
174
+ continue;
175
+ usedIds.add(id);
176
+ out.push(candidate.data);
177
+ }
178
+ return out;
179
+ }
180
+ export function slugify(name) {
181
+ return name
182
+ .toLowerCase()
183
+ .replace(/[^a-z0-9]+/g, '-')
184
+ .replace(/^-+|-+$/g, '');
185
+ }
186
+ /**
187
+ * The proposed workflow title, normalized to the same kebab-case slug the builder saves as a
188
+ * file name — so what the auto chain creator pre-fills is already a valid workflow name. A blank
189
+ * or slug-less title (e.g. all punctuation) answers undefined, and the caller keeps the current
190
+ * name instead of blanking it.
191
+ */
192
+ export function proposeWorkflowName(raw) {
193
+ const slug = slugify((raw ?? '').trim());
194
+ return slug || undefined;
195
+ }
196
+ function uniqueId(base, used) {
197
+ if (!used.has(base))
198
+ return base;
199
+ for (let n = 2;; n++) {
200
+ const id = `${base}-${n}`;
201
+ if (!used.has(id))
202
+ return id;
203
+ }
204
+ }
205
+ /**
206
+ * Best-effort structured-output extraction (trimmed from @cezar/core's
207
+ * `parseStructured`): try the whole string after stripping a ```json fence,
208
+ * then scan for balanced top-level `{...}` blocks and return the first that
209
+ * validates. Null when nothing does — the caller decides how to recover.
210
+ */
211
+ export function parseStructured(raw, schema) {
212
+ const cleaned = raw
213
+ .replace(/^```(?:json|javascript|js|jsonl)?\s*\n?/im, '')
214
+ .replace(/\n?```\s*$/m, '')
215
+ .trim();
216
+ try {
217
+ return schema.parse(JSON.parse(cleaned));
218
+ }
219
+ catch {
220
+ for (const candidate of extractJsonObjectCandidates(raw)) {
221
+ try {
222
+ return schema.parse(JSON.parse(candidate));
223
+ }
224
+ catch {
225
+ continue;
226
+ }
227
+ }
228
+ return null;
229
+ }
230
+ }
231
+ function extractJsonObjectCandidates(raw) {
232
+ const candidates = [];
233
+ let start = -1;
234
+ let depth = 0;
235
+ let inString = false;
236
+ let escaped = false;
237
+ for (let i = 0; i < raw.length; i++) {
238
+ const ch = raw[i];
239
+ if (inString) {
240
+ if (escaped)
241
+ escaped = false;
242
+ else if (ch === '\\')
243
+ escaped = true;
244
+ else if (ch === '"')
245
+ inString = false;
246
+ continue;
247
+ }
248
+ if (ch === '"') {
249
+ inString = true;
250
+ }
251
+ else if (ch === '{') {
252
+ if (depth === 0)
253
+ start = i;
254
+ depth++;
255
+ }
256
+ else if (ch === '}') {
257
+ if (depth === 0)
258
+ continue;
259
+ depth--;
260
+ if (depth === 0 && start >= 0) {
261
+ candidates.push(raw.slice(start, i + 1));
262
+ start = -1;
263
+ }
264
+ }
265
+ }
266
+ return candidates;
267
+ }
268
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAwB,MAAM,sBAAsB,CAAC;AAEhF;;;;;;GAMG;AAEH,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,qBAAqB,GACzB,gGAAgG;IAChG,oHAAoH;IACpH,mGAAmG;IACnG,kGAAkG;IAClG,kGAAkG;IAClG,wDAAwD,CAAC;AAE3D,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,oGAAoG;IACpG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,KAAK,EAAE,CAAC;SACL,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC/B,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,CAAC,CAAC;IACT,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CAClC,CAAC,CAAC;AAYH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,IAAY;IAC5D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzD,cAAc,CAAC,QAAQ,CAAC;QACxB,UAAU,CAAC,QAAQ,CAAC;QACpB,oBAAoB,CAAC,QAAQ,CAAC;KAC/B,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAEpE,0EAA0E;IAC1E,0EAA0E;IAC1E,iDAAiD;IACjD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,sEAAsE;IACtE,uFAAuF;IACvF,qEAAqE;IACrE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAC3F,gFAAgF;IAChF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC;gBAC9B,YAAY,EAAE,qBAAqB;gBACnC,UAAU;gBACV,GAAG,EAAE,QAAQ;gBACb,YAAY,EAAE,EAAE;gBAChB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,kBAAkB;aAC9B,CAAC,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,CAAC,oCAAoC;QACnE,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC5F,CAAC;IAED,OAAO;QACL,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAChE,SAAS,EAAE,wCAAwC;QACnD,QAAQ,EAAE,IAAI;KACf,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,SAAS,kBAAkB,CAAC,IAAY,EAAE,MAAe,EAAE,cAAwB;IACjF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM;QAC3B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACtE,CAAC,CAAC,uBAAuB,CAAC;IAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM;QAClC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAChD,CAAC,CAAC,iBAAiB,CAAC;IACtB,OAAO;QACL,oDAAoD;QACpD,EAAE;QACF,OAAO;QACP,IAAI;QACJ,EAAE;QACF,qCAAqC;QACrC,OAAO;QACP,EAAE;QACF,8CAA8C;QAC9C,MAAM;KACP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IAClD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACxF,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACvD,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QAChE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjE,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;gBAAE,MAAM;QAC7B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CACpB,GAA+E,EAC/E,UAAuB;IAEvB,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;QACzC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;QAC7C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;QAC/C,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;YAAE,SAAS,CAAC,oBAAoB;QACxE,IAAI,OAAO;YAAE,KAAK,GAAG,SAAS,CAAC,CAAC,iCAAiC;QACjE,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,KAAK,GAAG,SAAS,CAAC,CAAC,+BAA+B;QACvF,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC;YAC7C,EAAE;YACF,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,SAAS;QACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAuB;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,IAAI,IAAI,SAAS,CAAC;AAC3B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAiB;IAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAI,GAAW,EAAE,MAA6B;IAC3E,MAAM,OAAO,GAAG,GAAG;SAChB,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC;SACxD,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,IAAI,EAAE,CAAC;IACV,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,MAAM,SAAS,IAAI,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,GAAW;IAC9C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,OAAO;gBAAE,OAAO,GAAG,KAAK,CAAC;iBACxB,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,GAAG,IAAI,CAAC;iBAChC,IAAI,EAAE,KAAK,GAAG;gBAAE,QAAQ,GAAG,KAAK,CAAC;YACtC,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,IAAI,KAAK,KAAK,CAAC;gBAAE,KAAK,GAAG,CAAC,CAAC;YAC3B,KAAK,EAAE,CAAC;QACV,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,IAAI,KAAK,KAAK,CAAC;gBAAE,SAAS;YAC1B,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC9B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzC,KAAK,GAAG,CAAC,CAAC,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,81 @@
1
+ /** The manifest arithmetic both release channels share — the pure half of stamping.
2
+ *
3
+ * `stable.ts` and `snapshot.ts` differ in exactly one decision (how a released package pins
4
+ * its sibling: a caret range for stable, an exact pin for a snapshot), so everything else
5
+ * lives here rather than twice.
6
+ *
7
+ * Deliberately name-agnostic: names come from the checked-out manifests at call time, never
8
+ * from constants, so a package rename lands without touching this pipeline.
9
+ */
10
+ /** The minimal manifest shape the stamper touches; everything else passes through. */
11
+ export interface ManifestLike {
12
+ name: string;
13
+ version: string;
14
+ /** npm's own opt-out. A private package is still versioned in lockstep, never published. */
15
+ private?: boolean;
16
+ dependencies?: Record<string, string>;
17
+ devDependencies?: Record<string, string>;
18
+ [key: string]: unknown;
19
+ }
20
+ /**
21
+ * Whether a release stamps AND publishes this package, or only stamps it.
22
+ *
23
+ * The distinction exists because "in the release" and "on the registry" are different things.
24
+ * A package that ships nowhere yet still needs its version moved in lockstep: the api-client is
25
+ * the worked example — the service pins it, so a frozen version would leave that range pointing
26
+ * at a build the release was not cut from, which is exactly the drift this pipeline exists to
27
+ * prevent. Publishing is gated on npm's own `private` flag rather than a list here, so opening
28
+ * a package up is one line in ITS manifest and no change to the release code.
29
+ */
30
+ export declare function isPublishable(pkg: ManifestLike): boolean;
31
+ /**
32
+ * Every manifest a release stamps.
33
+ *
34
+ * The order of the fields is the order they must be PUBLISHED in, because each one depends on
35
+ * the one before it: the alias is a bin-shim over the service, and the service (from the phase
36
+ * where it stops merely testing against the client and starts importing it) depends on the
37
+ * api-client. Publishing the dependent first would briefly advertise a version of its
38
+ * dependency that does not exist on the registry yet.
39
+ */
40
+ export interface ReleaseManifests {
41
+ /**
42
+ * The API contract (zod schemas + inferred types). FIRST in the stamped set because both the
43
+ * api-client and the service depend on it, so its version has to settle before their pins are
44
+ * rewritten. Like the api-client it is `private`, so it is stamped but never published — which
45
+ * is exactly why the service cannot simply depend on it at runtime: `packages/cezar/scripts/
46
+ * inline-contract.mjs` folds it into `dist/contract/` at build time instead. It moves to a real
47
+ * publish the day that script is deleted.
48
+ */
49
+ contract: ManifestLike;
50
+ /** The contract package a consumer installs to talk to a cezar service. */
51
+ apiClient: ManifestLike;
52
+ /** The published service + CLI. */
53
+ cezar: ManifestLike;
54
+ /** The unscoped bin alias, so `npx cezarion` works. */
55
+ alias: ManifestLike;
56
+ }
57
+ /** How a released package pins a sibling it depends on. */
58
+ export type PinStyle = (version: string) => string;
59
+ /**
60
+ * Rewrite `pkg`'s range for `depName`, in whichever dependency section already declares it.
61
+ *
62
+ * Absent means absent: a package that does not depend on the other is returned untouched. That
63
+ * is what lets the api-client dependency migrate from `devDependencies` (today: only the tests
64
+ * import it) to `dependencies` (once the service imports its DTOs at runtime) without the
65
+ * release pipeline needing to know it happened.
66
+ */
67
+ export declare function pinDependency(pkg: ManifestLike, depName: string, range: string): ManifestLike;
68
+ /**
69
+ * Stamp every manifest to `version` and re-pin the intra-release dependencies.
70
+ *
71
+ * Two pins, both derived from the manifests rather than hardcoded:
72
+ * - the alias → the service, so `npx <alias>@<v>` runs the matching CLI;
73
+ * - the service → the api-client, so a published service can never resolve a client build it
74
+ * was not released with.
75
+ *
76
+ * The alias also inherits `repository`/`homepage`/`bugs` from the service manifest: we publish
77
+ * with `--provenance`, and npm rejects (E422) any manifest whose `repository.url` does not
78
+ * match the building repo. The alias file carries none of its own, so it borrows the
79
+ * service's — already correct, and being a git URL, unaffected by any npm-name rename.
80
+ */
81
+ export declare function stampManifestSet(manifests: ReleaseManifests, version: string, pin: PinStyle): ReleaseManifests;
@@ -0,0 +1,74 @@
1
+ /** The manifest arithmetic both release channels share — the pure half of stamping.
2
+ *
3
+ * `stable.ts` and `snapshot.ts` differ in exactly one decision (how a released package pins
4
+ * its sibling: a caret range for stable, an exact pin for a snapshot), so everything else
5
+ * lives here rather than twice.
6
+ *
7
+ * Deliberately name-agnostic: names come from the checked-out manifests at call time, never
8
+ * from constants, so a package rename lands without touching this pipeline.
9
+ */
10
+ /**
11
+ * Whether a release stamps AND publishes this package, or only stamps it.
12
+ *
13
+ * The distinction exists because "in the release" and "on the registry" are different things.
14
+ * A package that ships nowhere yet still needs its version moved in lockstep: the api-client is
15
+ * the worked example — the service pins it, so a frozen version would leave that range pointing
16
+ * at a build the release was not cut from, which is exactly the drift this pipeline exists to
17
+ * prevent. Publishing is gated on npm's own `private` flag rather than a list here, so opening
18
+ * a package up is one line in ITS manifest and no change to the release code.
19
+ */
20
+ export function isPublishable(pkg) {
21
+ return pkg.private !== true;
22
+ }
23
+ /**
24
+ * Rewrite `pkg`'s range for `depName`, in whichever dependency section already declares it.
25
+ *
26
+ * Absent means absent: a package that does not depend on the other is returned untouched. That
27
+ * is what lets the api-client dependency migrate from `devDependencies` (today: only the tests
28
+ * import it) to `dependencies` (once the service imports its DTOs at runtime) without the
29
+ * release pipeline needing to know it happened.
30
+ */
31
+ export function pinDependency(pkg, depName, range) {
32
+ const sections = ['dependencies', 'devDependencies', 'peerDependencies'];
33
+ const out = { ...pkg };
34
+ for (const section of sections) {
35
+ const deps = pkg[section];
36
+ if (deps && depName in deps)
37
+ out[section] = { ...deps, [depName]: range };
38
+ }
39
+ return out;
40
+ }
41
+ /**
42
+ * Stamp every manifest to `version` and re-pin the intra-release dependencies.
43
+ *
44
+ * Two pins, both derived from the manifests rather than hardcoded:
45
+ * - the alias → the service, so `npx <alias>@<v>` runs the matching CLI;
46
+ * - the service → the api-client, so a published service can never resolve a client build it
47
+ * was not released with.
48
+ *
49
+ * The alias also inherits `repository`/`homepage`/`bugs` from the service manifest: we publish
50
+ * with `--provenance`, and npm rejects (E422) any manifest whose `repository.url` does not
51
+ * match the building repo. The alias file carries none of its own, so it borrows the
52
+ * service's — already correct, and being a git URL, unaffected by any npm-name rename.
53
+ */
54
+ export function stampManifestSet(manifests, version, pin) {
55
+ const { contract, apiClient, cezar, alias } = manifests;
56
+ const range = pin(version);
57
+ const inherited = {};
58
+ for (const field of ['repository', 'homepage', 'bugs']) {
59
+ if (cezar[field] !== undefined)
60
+ inherited[field] = cezar[field];
61
+ }
62
+ return {
63
+ contract: { ...contract, version },
64
+ apiClient: pinDependency({ ...apiClient, version }, contract.name, range),
65
+ cezar: pinDependency(pinDependency({ ...cezar, version }, apiClient.name, range), contract.name, range),
66
+ alias: {
67
+ ...pinDependency({ ...alias, ...inherited, version }, cezar.name, range),
68
+ // The alias exists only to depend on the service — an unpinned or missing entry would
69
+ // make `npx <alias>` install nothing useful, so this one is asserted, not merged.
70
+ dependencies: { ...alias.dependencies, [cezar.name]: range },
71
+ },
72
+ };
73
+ }
74
+ //# sourceMappingURL=manifests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifests.js","sourceRoot":"","sources":["../../src/release/manifests.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,GAAiB;IAC7C,OAAO,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC;AAC9B,CAAC;AAgCD;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,GAAiB,EAAE,OAAe,EAAE,KAAa;IAC7E,MAAM,QAAQ,GAAG,CAAC,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,CAAU,CAAC;IAClF,MAAM,GAAG,GAAiB,EAAE,GAAG,GAAG,EAAE,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAuC,CAAC;QAChE,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI;YAAE,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAA2B,EAC3B,OAAe,EACf,GAAa;IAEb,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;IACxD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,MAAM,SAAS,GAA0B,EAAE,CAAC;IAC5C,KAAK,MAAM,KAAK,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAU,EAAE,CAAC;QAChE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;YAAE,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE;QAClC,SAAS,EAAE,aAAa,CAAC,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;QACzE,KAAK,EAAE,aAAa,CAClB,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,EAC3D,QAAQ,CAAC,IAAI,EACb,KAAK,CACN;QACD,KAAK,EAAE;YACL,GAAG,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;YACxE,sFAAsF;YACtF,kFAAkF;YAClF,YAAY,EAAE,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE;SAC7D;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,67 @@
1
+ /** Snapshot release decisions — the pure half of `scripts/release-snapshot.mjs`.
2
+ *
3
+ * Spec `.ai/specs/2026-07-18-npm-preview-publish.md` (#482): every green CI run
4
+ * publishes an installable preview of the CLI. This module decides *whether* a
5
+ * given CI event publishes, under *which* version and dist-tag, and how the two
6
+ * manifests (the scoped package and its unscoped alias) are stamped. Kept
7
+ * dependency-free and side-effect-free so the decision is unit-testable; the
8
+ * script owns file writes, `npm publish`, and the exit code.
9
+ *
10
+ * Deliberately name-agnostic: package names come from the checked-out manifests
11
+ * at call time, never from constants — so the `@pat-lewczuk/cezar` →
12
+ * `@wjarka/cezarion` rename (#23) lands independently of this pipeline.
13
+ */
14
+ import { type ReleaseManifests as ReleaseManifestSet } from './manifests.ts';
15
+ /** The CI facts the decision needs, straight from GitHub Actions' env/event. */
16
+ export interface SnapshotContext {
17
+ /** `GITHUB_EVENT_NAME` — `pull_request` and `push` publish previews; `schedule`
18
+ * and `workflow_dispatch` publish only the explicitly requested nightly. */
19
+ eventName: string;
20
+ /** `GITHUB_REF_NAME` for push events — only `develop` publishes a snapshot;
21
+ * `main` is reserved for owner-driven stable releases (see stable.ts) and for
22
+ * the nightly channel below, which never moves `latest` either. */
23
+ refName: string;
24
+ /** `CEZ_RELEASE_CHANNEL` — a channel asked for by name rather than derived from
25
+ * the event. Only `.github/workflows/nightly.yml` sets it (to `nightly`); every
26
+ * other caller leaves it empty and gets the event-derived channel. Opt-in by
27
+ * name is what keeps a `workflow_dispatch` of ci.yml from cutting a nightly by
28
+ * accident — the event alone is not enough. */
29
+ requestedChannel?: string;
30
+ /** `YYYYMMDD` (UTC) of the day a nightly is cut — the nightly version is named
31
+ * after its date. Required for the nightly channel, ignored by every other. */
32
+ nightlyDate?: string;
33
+ /** PR number for pull_request events; absent/invalid → no publish. */
34
+ prNumber?: number;
35
+ /** `owner/name` of the PR head repo — fork PRs (≠ `repo`) never publish. */
36
+ headRepo?: string;
37
+ /** `GITHUB_REPOSITORY` — this repo's `owner/name`. */
38
+ repo?: string;
39
+ /** The base version from the root `package.json` (e.g. `0.1.5`). */
40
+ baseVersion: string;
41
+ /** `GITHUB_RUN_NUMBER` — monotonic per workflow; makes versions unique. */
42
+ runNumber: number;
43
+ /** `GITHUB_RUN_ATTEMPT` — appended only when > 1 so re-runs never collide. */
44
+ runAttempt?: number;
45
+ }
46
+ /** A publishable snapshot: prerelease version + the explicit dist-tag.
47
+ * The dist-tag is structurally never `latest` — snapshots must not become the
48
+ * default install; stable releases stay owner-driven (spec, resolved Q2). */
49
+ export interface SnapshotPlan {
50
+ channel: string;
51
+ version: string;
52
+ distTag: string;
53
+ }
54
+ export declare function computeSnapshot(ctx: SnapshotContext): SnapshotPlan | null;
55
+ export type { ManifestLike, ReleaseManifests } from './manifests.ts';
56
+ /** Stamp the release set to the snapshot version.
57
+ *
58
+ * Every intra-release dependency is pinned **exact** (`0.1.5-pr482.123`, no range) so
59
+ * `npx <alias>@<version>` runs exactly the PR's code and the service resolves exactly the
60
+ * api-client it was cut with — a `^` range would resolve to whatever newer version exists
61
+ * (spec, resolved Q5). Stable releases keep their `^` range and never go through this
62
+ * stamper. */
63
+ export declare function stampManifests(manifests: ReleaseManifestSet, version: string): ReleaseManifestSet;
64
+ /** The copy-pasteable commands for the sticky PR comment and the step summary.
65
+ * Rendered from the *actual* alias package name so a future rename of the npx
66
+ * command can never leave stale instructions (spec, resolved Q1). */
67
+ export declare function buildInstallLines(aliasName: string, version: string): string[];
@@ -0,0 +1,97 @@
1
+ /** Snapshot release decisions — the pure half of `scripts/release-snapshot.mjs`.
2
+ *
3
+ * Spec `.ai/specs/2026-07-18-npm-preview-publish.md` (#482): every green CI run
4
+ * publishes an installable preview of the CLI. This module decides *whether* a
5
+ * given CI event publishes, under *which* version and dist-tag, and how the two
6
+ * manifests (the scoped package and its unscoped alias) are stamped. Kept
7
+ * dependency-free and side-effect-free so the decision is unit-testable; the
8
+ * script owns file writes, `npm publish`, and the exit code.
9
+ *
10
+ * Deliberately name-agnostic: package names come from the checked-out manifests
11
+ * at call time, never from constants — so the `@pat-lewczuk/cezar` →
12
+ * `@wjarka/cezarion` rename (#23) lands independently of this pipeline.
13
+ */
14
+ import { stampManifestSet } from './manifests.js';
15
+ export function computeSnapshot(ctx) {
16
+ const channel = resolveChannel(ctx);
17
+ if (!channel)
18
+ return null;
19
+ if (!ctx.baseVersion || !Number.isInteger(ctx.runNumber) || ctx.runNumber <= 0)
20
+ return null;
21
+ const attempt = ctx.runAttempt !== undefined && Number.isInteger(ctx.runAttempt) && ctx.runAttempt > 1
22
+ ? `.${ctx.runAttempt}`
23
+ : '';
24
+ // A nightly is named after the day it was cut — `0.1.5-nightly.20260813.126` —
25
+ // so `npm view cezarion versions` reads as a calendar and a user can tell at a
26
+ // glance how old their build is. The run number still trails the date, because a
27
+ // manual re-cut on the same day must not collide with the scheduled one. Both are
28
+ // plain numeric semver identifiers, so the ordering stays chronological.
29
+ const nightly = channel.channel === 'nightly';
30
+ if (nightly && !/^\d{8}$/.test(ctx.nightlyDate ?? ''))
31
+ return null;
32
+ const stamp = nightly ? `${ctx.nightlyDate}.${ctx.runNumber}` : `${ctx.runNumber}`;
33
+ return {
34
+ channel: channel.channel,
35
+ version: `${ctx.baseVersion}-${channel.channel}.${stamp}${attempt}`,
36
+ distTag: channel.distTag,
37
+ };
38
+ }
39
+ function resolveChannel(ctx) {
40
+ // A named channel wins over the event-derived ones, and is the ONLY way to reach
41
+ // nightly — asked for explicitly by nightly.yml, never inferred from an event.
42
+ // An unrecognised name publishes nothing rather than silently falling back: a
43
+ // typo in a workflow should be a no-op, not a publish under the wrong tag.
44
+ if (ctx.requestedChannel) {
45
+ if (ctx.requestedChannel !== 'nightly')
46
+ return null;
47
+ // Nightly cuts main's tip — on the schedule, or on demand from the Actions tab
48
+ // when someone needs a fresh build before the next night.
49
+ if (ctx.eventName !== 'schedule' && ctx.eventName !== 'workflow_dispatch')
50
+ return null;
51
+ if (ctx.refName !== 'main')
52
+ return null;
53
+ return { channel: 'nightly', distTag: 'nightly' };
54
+ }
55
+ if (ctx.eventName === 'pull_request') {
56
+ const n = ctx.prNumber;
57
+ if (n === undefined || !Number.isInteger(n) || n <= 0)
58
+ return null;
59
+ // Defense in depth: the workflow's `if` already excludes forks, and fork PRs
60
+ // get no secrets — but the decision must not rely on workflow wiring alone.
61
+ if (!ctx.headRepo || !ctx.repo || ctx.headRepo !== ctx.repo)
62
+ return null;
63
+ return { channel: `pr${n}`, distTag: `pr-${n}` };
64
+ }
65
+ if (ctx.eventName === 'push') {
66
+ // Only `develop` publishes a snapshot. `main` is deliberately excluded so a
67
+ // merge to main never touches npm — stable `latest` releases are cut
68
+ // manually via the Release workflow (stable.ts). Defense in depth: the
69
+ // workflow's `if` already restricts the push channel to develop.
70
+ if (ctx.refName === 'develop')
71
+ return { channel: 'develop', distTag: 'develop' };
72
+ return null;
73
+ }
74
+ return null;
75
+ }
76
+ /** Stamp the release set to the snapshot version.
77
+ *
78
+ * Every intra-release dependency is pinned **exact** (`0.1.5-pr482.123`, no range) so
79
+ * `npx <alias>@<version>` runs exactly the PR's code and the service resolves exactly the
80
+ * api-client it was cut with — a `^` range would resolve to whatever newer version exists
81
+ * (spec, resolved Q5). Stable releases keep their `^` range and never go through this
82
+ * stamper. */
83
+ export function stampManifests(manifests, version) {
84
+ return stampManifestSet(manifests, version, (v) => v);
85
+ }
86
+ /** The copy-pasteable commands for the sticky PR comment and the step summary.
87
+ * Rendered from the *actual* alias package name so a future rename of the npx
88
+ * command can never leave stale instructions (spec, resolved Q1). */
89
+ export function buildInstallLines(aliasName, version) {
90
+ const cmd = `npx ${aliasName}@${version}`;
91
+ return [
92
+ `${cmd} # cockpit at http://localhost:4321`,
93
+ `${cmd} run "…" # headless run`,
94
+ `${cmd} server-deploy --platform <id> # roll a server to this exact build`,
95
+ ];
96
+ }
97
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/release/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /** Stable-release decisions — the pure half of `scripts/release.mjs`.
2
+ *
3
+ * Sibling of `snapshot.ts`, but for the *owner-driven* `latest` channel. The
4
+ * `Release` workflow (`.github/workflows/release.yml`) is run manually and
5
+ * never fires from a push, so — unlike snapshots — a stable release is the only
6
+ * thing that ever moves the `latest` dist-tag (spec
7
+ * `.ai/specs/2026-07-18-npm-preview-publish.md`, #482).
8
+ *
9
+ * Two decisions live here so they stay unit-testable and side-effect-free: the next stable
10
+ * version for a given bump, and the pin style the release set is stamped with. Crucially,
11
+ * stable releases use a **caret** range — the opposite of the snapshot stamper's exact pin —
12
+ * so a stable `cezarion` picks up compatible patch releases of the implementation package.
13
+ */
14
+ import { type ReleaseManifests as ReleaseManifestSet } from './manifests.ts';
15
+ /** The version-bump modes the Release workflow offers. `existing` publishes the
16
+ * version already committed to the service manifest (for hand-prepared releases);
17
+ * the rest increment semver from the current base. */
18
+ export type ReleaseBump = 'patch' | 'minor' | 'major' | 'existing';
19
+ export declare const RELEASE_BUMPS: readonly ReleaseBump[];
20
+ export declare function isReleaseBump(value: string): value is ReleaseBump;
21
+ /** Compute the next stable version from the current base and a bump mode.
22
+ *
23
+ * `base` must be a plain `major.minor.patch` (no prerelease/build suffix) — a
24
+ * stable release should never start from a snapshot version. `existing` returns
25
+ * the base verbatim; the increments zero out the lower components the way
26
+ * `npm version` does. Returns `null` for an unparseable base so the caller can
27
+ * fail loudly instead of publishing a garbage version. */
28
+ export declare function computeStableVersion(bump: ReleaseBump, base: string): string | null;
29
+ export type { ManifestLike, ReleaseManifests } from './manifests.ts';
30
+ /** Stamp the release set to a stable version.
31
+ *
32
+ * Mirror of `stampSnapshotManifests`, differing in exactly one decision: intra-release
33
+ * dependencies get a **caret** range (`^0.1.6`), not an exact pin. A stable `cezarion` should
34
+ * follow compatible releases of the implementation package, and a stable service should follow
35
+ * compatible releases of the api-client; a snapshot must pin the one exact build it was cut
36
+ * from. Everything else — which manifests exist, which sections carry the pin, what the alias
37
+ * inherits — lives in `manifests.ts` so the two channels cannot drift apart. */
38
+ export declare function stampStableManifests(manifests: ReleaseManifestSet, version: string): ReleaseManifestSet;