@cleocode/cleo 2026.3.56 → 2026.3.58

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 (705) hide show
  1. package/dist/cli/commander-shim.d.ts +112 -0
  2. package/dist/cli/commander-shim.d.ts.map +1 -0
  3. package/dist/cli/commander-shim.js +233 -0
  4. package/dist/cli/commander-shim.js.map +1 -0
  5. package/dist/cli/commands/add.d.ts +12 -0
  6. package/dist/cli/commands/add.d.ts.map +1 -0
  7. package/dist/cli/commands/add.js +91 -0
  8. package/dist/cli/commands/add.js.map +1 -0
  9. package/dist/cli/commands/adr.d.ts +27 -0
  10. package/dist/cli/commands/adr.d.ts.map +1 -0
  11. package/dist/cli/commands/adr.js +79 -0
  12. package/dist/cli/commands/adr.js.map +1 -0
  13. package/dist/cli/commands/analyze.d.ts +12 -0
  14. package/dist/cli/commands/analyze.d.ts.map +1 -0
  15. package/dist/cli/commands/analyze.js +20 -0
  16. package/dist/cli/commands/analyze.js.map +1 -0
  17. package/dist/cli/commands/archive-stats.d.ts +18 -0
  18. package/dist/cli/commands/archive-stats.d.ts.map +1 -0
  19. package/dist/cli/commands/archive-stats.js +49 -0
  20. package/dist/cli/commands/archive-stats.js.map +1 -0
  21. package/dist/cli/commands/archive.d.ts +12 -0
  22. package/dist/cli/commands/archive.d.ts.map +1 -0
  23. package/dist/cli/commands/archive.js +32 -0
  24. package/dist/cli/commands/archive.js.map +1 -0
  25. package/dist/cli/commands/backup.d.ts +8 -0
  26. package/dist/cli/commands/backup.d.ts.map +1 -0
  27. package/dist/cli/commands/backup.js +35 -0
  28. package/dist/cli/commands/backup.js.map +1 -0
  29. package/dist/cli/commands/blockers.d.ts +7 -0
  30. package/dist/cli/commands/blockers.d.ts.map +1 -0
  31. package/dist/cli/commands/blockers.js +16 -0
  32. package/dist/cli/commands/blockers.js.map +1 -0
  33. package/dist/cli/commands/briefing.d.ts +22 -0
  34. package/dist/cli/commands/briefing.d.ts.map +1 -0
  35. package/dist/cli/commands/briefing.js +45 -0
  36. package/dist/cli/commands/briefing.js.map +1 -0
  37. package/dist/cli/commands/bug.d.ts +12 -0
  38. package/dist/cli/commands/bug.d.ts.map +1 -0
  39. package/dist/cli/commands/bug.js +81 -0
  40. package/dist/cli/commands/bug.js.map +1 -0
  41. package/dist/cli/commands/checkpoint.d.ts +15 -0
  42. package/dist/cli/commands/checkpoint.d.ts.map +1 -0
  43. package/dist/cli/commands/checkpoint.js +91 -0
  44. package/dist/cli/commands/checkpoint.js.map +1 -0
  45. package/dist/cli/commands/commands.d.ts +13 -0
  46. package/dist/cli/commands/commands.d.ts.map +1 -0
  47. package/dist/cli/commands/commands.js +30 -0
  48. package/dist/cli/commands/commands.js.map +1 -0
  49. package/dist/cli/commands/complete.d.ts +12 -0
  50. package/dist/cli/commands/complete.d.ts.map +1 -0
  51. package/dist/cli/commands/complete.js +43 -0
  52. package/dist/cli/commands/complete.js.map +1 -0
  53. package/dist/cli/commands/compliance.d.ts +8 -0
  54. package/dist/cli/commands/compliance.d.ts.map +1 -0
  55. package/dist/cli/commands/compliance.js +85 -0
  56. package/dist/cli/commands/compliance.js.map +1 -0
  57. package/dist/cli/commands/config.d.ts +9 -0
  58. package/dist/cli/commands/config.d.ts.map +1 -0
  59. package/dist/cli/commands/config.js +43 -0
  60. package/dist/cli/commands/config.js.map +1 -0
  61. package/dist/cli/commands/consensus.d.ts +13 -0
  62. package/dist/cli/commands/consensus.d.ts.map +1 -0
  63. package/dist/cli/commands/consensus.js +45 -0
  64. package/dist/cli/commands/consensus.js.map +1 -0
  65. package/dist/cli/commands/context.d.ts +8 -0
  66. package/dist/cli/commands/context.d.ts.map +1 -0
  67. package/dist/cli/commands/context.js +40 -0
  68. package/dist/cli/commands/context.js.map +1 -0
  69. package/dist/cli/commands/contribution.d.ts +13 -0
  70. package/dist/cli/commands/contribution.d.ts.map +1 -0
  71. package/dist/cli/commands/contribution.js +41 -0
  72. package/dist/cli/commands/contribution.js.map +1 -0
  73. package/dist/cli/commands/current.d.ts +13 -0
  74. package/dist/cli/commands/current.d.ts.map +1 -0
  75. package/dist/cli/commands/current.js +20 -0
  76. package/dist/cli/commands/current.js.map +1 -0
  77. package/dist/cli/commands/dash.d.ts +12 -0
  78. package/dist/cli/commands/dash.d.ts.map +1 -0
  79. package/dist/cli/commands/dash.js +24 -0
  80. package/dist/cli/commands/dash.js.map +1 -0
  81. package/dist/cli/commands/decomposition.d.ts +13 -0
  82. package/dist/cli/commands/decomposition.d.ts.map +1 -0
  83. package/dist/cli/commands/decomposition.js +45 -0
  84. package/dist/cli/commands/decomposition.js.map +1 -0
  85. package/dist/cli/commands/delete.d.ts +12 -0
  86. package/dist/cli/commands/delete.d.ts.map +1 -0
  87. package/dist/cli/commands/delete.js +37 -0
  88. package/dist/cli/commands/delete.js.map +1 -0
  89. package/dist/cli/commands/deps.d.ts +9 -0
  90. package/dist/cli/commands/deps.d.ts.map +1 -0
  91. package/dist/cli/commands/deps.js +73 -0
  92. package/dist/cli/commands/deps.js.map +1 -0
  93. package/dist/cli/commands/detect-drift.d.ts +15 -0
  94. package/dist/cli/commands/detect-drift.d.ts.map +1 -0
  95. package/dist/cli/commands/detect-drift.js +386 -0
  96. package/dist/cli/commands/detect-drift.js.map +1 -0
  97. package/dist/cli/commands/detect.d.ts +10 -0
  98. package/dist/cli/commands/detect.d.ts.map +1 -0
  99. package/dist/cli/commands/detect.js +24 -0
  100. package/dist/cli/commands/detect.js.map +1 -0
  101. package/dist/cli/commands/docs.d.ts +13 -0
  102. package/dist/cli/commands/docs.d.ts.map +1 -0
  103. package/dist/cli/commands/docs.js +169 -0
  104. package/dist/cli/commands/docs.js.map +1 -0
  105. package/dist/cli/commands/doctor.d.ts +11 -0
  106. package/dist/cli/commands/doctor.d.ts.map +1 -0
  107. package/dist/cli/commands/doctor.js +54 -0
  108. package/dist/cli/commands/doctor.js.map +1 -0
  109. package/dist/cli/commands/dynamic.d.ts +24 -0
  110. package/dist/cli/commands/dynamic.d.ts.map +1 -0
  111. package/dist/cli/commands/dynamic.js +27 -0
  112. package/dist/cli/commands/dynamic.js.map +1 -0
  113. package/dist/cli/commands/env.d.ts +12 -0
  114. package/dist/cli/commands/env.d.ts.map +1 -0
  115. package/dist/cli/commands/env.js +44 -0
  116. package/dist/cli/commands/env.js.map +1 -0
  117. package/dist/cli/commands/exists.d.ts +7 -0
  118. package/dist/cli/commands/exists.d.ts.map +1 -0
  119. package/dist/cli/commands/exists.js +33 -0
  120. package/dist/cli/commands/exists.js.map +1 -0
  121. package/dist/cli/commands/export-tasks.d.ts +10 -0
  122. package/dist/cli/commands/export-tasks.d.ts.map +1 -0
  123. package/dist/cli/commands/export-tasks.js +47 -0
  124. package/dist/cli/commands/export-tasks.js.map +1 -0
  125. package/dist/cli/commands/export.d.ts +9 -0
  126. package/dist/cli/commands/export.d.ts.map +1 -0
  127. package/dist/cli/commands/export.js +46 -0
  128. package/dist/cli/commands/export.js.map +1 -0
  129. package/dist/cli/commands/find.d.ts +14 -0
  130. package/dist/cli/commands/find.d.ts.map +1 -0
  131. package/dist/cli/commands/find.js +70 -0
  132. package/dist/cli/commands/find.js.map +1 -0
  133. package/dist/cli/commands/generate-changelog.d.ts +14 -0
  134. package/dist/cli/commands/generate-changelog.d.ts.map +1 -0
  135. package/dist/cli/commands/generate-changelog.js +252 -0
  136. package/dist/cli/commands/generate-changelog.js.map +1 -0
  137. package/dist/cli/commands/grade.d.ts +13 -0
  138. package/dist/cli/commands/grade.d.ts.map +1 -0
  139. package/dist/cli/commands/grade.js +26 -0
  140. package/dist/cli/commands/grade.js.map +1 -0
  141. package/dist/cli/commands/history.d.ts +9 -0
  142. package/dist/cli/commands/history.d.ts.map +1 -0
  143. package/dist/cli/commands/history.js +30 -0
  144. package/dist/cli/commands/history.js.map +1 -0
  145. package/dist/cli/commands/implementation.d.ts +13 -0
  146. package/dist/cli/commands/implementation.d.ts.map +1 -0
  147. package/dist/cli/commands/implementation.js +41 -0
  148. package/dist/cli/commands/implementation.js.map +1 -0
  149. package/dist/cli/commands/import-tasks.d.ts +10 -0
  150. package/dist/cli/commands/import-tasks.d.ts.map +1 -0
  151. package/dist/cli/commands/import-tasks.js +38 -0
  152. package/dist/cli/commands/import-tasks.js.map +1 -0
  153. package/dist/cli/commands/import.d.ts +9 -0
  154. package/dist/cli/commands/import.d.ts.map +1 -0
  155. package/dist/cli/commands/import.js +28 -0
  156. package/dist/cli/commands/import.js.map +1 -0
  157. package/dist/cli/commands/init.d.ts +34 -0
  158. package/dist/cli/commands/init.d.ts.map +1 -0
  159. package/dist/cli/commands/init.js +89 -0
  160. package/dist/cli/commands/init.js.map +1 -0
  161. package/dist/cli/commands/inject.d.ts +8 -0
  162. package/dist/cli/commands/inject.d.ts.map +1 -0
  163. package/dist/cli/commands/inject.js +28 -0
  164. package/dist/cli/commands/inject.js.map +1 -0
  165. package/dist/cli/commands/install-global.d.ts +19 -0
  166. package/dist/cli/commands/install-global.d.ts.map +1 -0
  167. package/dist/cli/commands/install-global.js +50 -0
  168. package/dist/cli/commands/install-global.js.map +1 -0
  169. package/dist/cli/commands/issue.d.ts +14 -0
  170. package/dist/cli/commands/issue.d.ts.map +1 -0
  171. package/dist/cli/commands/issue.js +105 -0
  172. package/dist/cli/commands/issue.js.map +1 -0
  173. package/dist/cli/commands/labels.d.ts +13 -0
  174. package/dist/cli/commands/labels.d.ts.map +1 -0
  175. package/dist/cli/commands/labels.js +44 -0
  176. package/dist/cli/commands/labels.js.map +1 -0
  177. package/dist/cli/commands/lifecycle.d.ts +8 -0
  178. package/dist/cli/commands/lifecycle.d.ts.map +1 -0
  179. package/dist/cli/commands/lifecycle.js +72 -0
  180. package/dist/cli/commands/lifecycle.js.map +1 -0
  181. package/dist/cli/commands/list.d.ts +14 -0
  182. package/dist/cli/commands/list.d.ts.map +1 -0
  183. package/dist/cli/commands/list.js +71 -0
  184. package/dist/cli/commands/list.js.map +1 -0
  185. package/dist/cli/commands/log.d.ts +12 -0
  186. package/dist/cli/commands/log.d.ts.map +1 -0
  187. package/dist/cli/commands/log.js +30 -0
  188. package/dist/cli/commands/log.js.map +1 -0
  189. package/dist/cli/commands/map.d.ts +10 -0
  190. package/dist/cli/commands/map.d.ts.map +1 -0
  191. package/dist/cli/commands/map.js +23 -0
  192. package/dist/cli/commands/map.js.map +1 -0
  193. package/dist/cli/commands/mcp-install.d.ts +17 -0
  194. package/dist/cli/commands/mcp-install.d.ts.map +1 -0
  195. package/dist/cli/commands/mcp-install.js +128 -0
  196. package/dist/cli/commands/mcp-install.js.map +1 -0
  197. package/dist/cli/commands/memory-brain.d.ts +14 -0
  198. package/dist/cli/commands/memory-brain.d.ts.map +1 -0
  199. package/dist/cli/commands/memory-brain.js +151 -0
  200. package/dist/cli/commands/memory-brain.js.map +1 -0
  201. package/dist/cli/commands/migrate-claude-mem.d.ts +18 -0
  202. package/dist/cli/commands/migrate-claude-mem.d.ts.map +1 -0
  203. package/dist/cli/commands/migrate-claude-mem.js +60 -0
  204. package/dist/cli/commands/migrate-claude-mem.js.map +1 -0
  205. package/dist/cli/commands/next.d.ts +9 -0
  206. package/dist/cli/commands/next.d.ts.map +1 -0
  207. package/dist/cli/commands/next.js +20 -0
  208. package/dist/cli/commands/next.js.map +1 -0
  209. package/dist/cli/commands/nexus.d.ts +16 -0
  210. package/dist/cli/commands/nexus.d.ts.map +1 -0
  211. package/dist/cli/commands/nexus.js +155 -0
  212. package/dist/cli/commands/nexus.js.map +1 -0
  213. package/dist/cli/commands/observe.d.ts +9 -0
  214. package/dist/cli/commands/observe.d.ts.map +1 -0
  215. package/dist/cli/commands/observe.js +39 -0
  216. package/dist/cli/commands/observe.js.map +1 -0
  217. package/dist/cli/commands/ops.d.ts +10 -0
  218. package/dist/cli/commands/ops.d.ts.map +1 -0
  219. package/dist/cli/commands/ops.js +19 -0
  220. package/dist/cli/commands/ops.js.map +1 -0
  221. package/dist/cli/commands/orchestrate.d.ts +8 -0
  222. package/dist/cli/commands/orchestrate.d.ts.map +1 -0
  223. package/dist/cli/commands/orchestrate.js +58 -0
  224. package/dist/cli/commands/orchestrate.js.map +1 -0
  225. package/dist/cli/commands/otel.d.ts +12 -0
  226. package/dist/cli/commands/otel.d.ts.map +1 -0
  227. package/dist/cli/commands/otel.js +128 -0
  228. package/dist/cli/commands/otel.js.map +1 -0
  229. package/dist/cli/commands/phase.d.ts +12 -0
  230. package/dist/cli/commands/phase.d.ts.map +1 -0
  231. package/dist/cli/commands/phase.js +88 -0
  232. package/dist/cli/commands/phase.js.map +1 -0
  233. package/dist/cli/commands/phases.d.ts +12 -0
  234. package/dist/cli/commands/phases.d.ts.map +1 -0
  235. package/dist/cli/commands/phases.js +37 -0
  236. package/dist/cli/commands/phases.js.map +1 -0
  237. package/dist/cli/commands/plan.d.ts +8 -0
  238. package/dist/cli/commands/plan.d.ts.map +1 -0
  239. package/dist/cli/commands/plan.js +15 -0
  240. package/dist/cli/commands/plan.js.map +1 -0
  241. package/dist/cli/commands/promote.d.ts +7 -0
  242. package/dist/cli/commands/promote.d.ts.map +1 -0
  243. package/dist/cli/commands/promote.js +15 -0
  244. package/dist/cli/commands/promote.js.map +1 -0
  245. package/dist/cli/commands/refresh-memory.d.ts +9 -0
  246. package/dist/cli/commands/refresh-memory.d.ts.map +1 -0
  247. package/dist/cli/commands/refresh-memory.js +24 -0
  248. package/dist/cli/commands/refresh-memory.js.map +1 -0
  249. package/dist/cli/commands/relates.d.ts +12 -0
  250. package/dist/cli/commands/relates.d.ts.map +1 -0
  251. package/dist/cli/commands/relates.js +53 -0
  252. package/dist/cli/commands/relates.js.map +1 -0
  253. package/dist/cli/commands/release.d.ts +8 -0
  254. package/dist/cli/commands/release.d.ts.map +1 -0
  255. package/dist/cli/commands/release.js +72 -0
  256. package/dist/cli/commands/release.js.map +1 -0
  257. package/dist/cli/commands/remote.d.ts +12 -0
  258. package/dist/cli/commands/remote.d.ts.map +1 -0
  259. package/dist/cli/commands/remote.js +207 -0
  260. package/dist/cli/commands/remote.js.map +1 -0
  261. package/dist/cli/commands/reorder.d.ts +7 -0
  262. package/dist/cli/commands/reorder.d.ts.map +1 -0
  263. package/dist/cli/commands/reorder.js +20 -0
  264. package/dist/cli/commands/reorder.js.map +1 -0
  265. package/dist/cli/commands/reparent.d.ts +10 -0
  266. package/dist/cli/commands/reparent.d.ts.map +1 -0
  267. package/dist/cli/commands/reparent.js +19 -0
  268. package/dist/cli/commands/reparent.js.map +1 -0
  269. package/dist/cli/commands/research.d.ts +8 -0
  270. package/dist/cli/commands/research.d.ts.map +1 -0
  271. package/dist/cli/commands/research.js +129 -0
  272. package/dist/cli/commands/research.js.map +1 -0
  273. package/dist/cli/commands/restore.d.ts +11 -0
  274. package/dist/cli/commands/restore.d.ts.map +1 -0
  275. package/dist/cli/commands/restore.js +224 -0
  276. package/dist/cli/commands/restore.js.map +1 -0
  277. package/dist/cli/commands/roadmap.d.ts +8 -0
  278. package/dist/cli/commands/roadmap.d.ts.map +1 -0
  279. package/dist/cli/commands/roadmap.js +21 -0
  280. package/dist/cli/commands/roadmap.js.map +1 -0
  281. package/dist/cli/commands/safestop.d.ts +14 -0
  282. package/dist/cli/commands/safestop.d.ts.map +1 -0
  283. package/dist/cli/commands/safestop.js +32 -0
  284. package/dist/cli/commands/safestop.js.map +1 -0
  285. package/dist/cli/commands/self-update.d.ts +15 -0
  286. package/dist/cli/commands/self-update.d.ts.map +1 -0
  287. package/dist/cli/commands/self-update.js +329 -0
  288. package/dist/cli/commands/self-update.js.map +1 -0
  289. package/dist/cli/commands/sequence.d.ts +8 -0
  290. package/dist/cli/commands/sequence.d.ts.map +1 -0
  291. package/dist/cli/commands/sequence.js +30 -0
  292. package/dist/cli/commands/sequence.js.map +1 -0
  293. package/dist/cli/commands/session.d.ts +12 -0
  294. package/dist/cli/commands/session.d.ts.map +1 -0
  295. package/dist/cli/commands/session.js +160 -0
  296. package/dist/cli/commands/session.js.map +1 -0
  297. package/dist/cli/commands/show.d.ts +13 -0
  298. package/dist/cli/commands/show.d.ts.map +1 -0
  299. package/dist/cli/commands/show.js +20 -0
  300. package/dist/cli/commands/show.js.map +1 -0
  301. package/dist/cli/commands/skills.d.ts +13 -0
  302. package/dist/cli/commands/skills.d.ts.map +1 -0
  303. package/dist/cli/commands/skills.js +131 -0
  304. package/dist/cli/commands/skills.js.map +1 -0
  305. package/dist/cli/commands/snapshot.d.ts +9 -0
  306. package/dist/cli/commands/snapshot.d.ts.map +1 -0
  307. package/dist/cli/commands/snapshot.js +50 -0
  308. package/dist/cli/commands/snapshot.js.map +1 -0
  309. package/dist/cli/commands/specification.d.ts +13 -0
  310. package/dist/cli/commands/specification.d.ts.map +1 -0
  311. package/dist/cli/commands/specification.js +45 -0
  312. package/dist/cli/commands/specification.js.map +1 -0
  313. package/dist/cli/commands/start.d.ts +13 -0
  314. package/dist/cli/commands/start.d.ts.map +1 -0
  315. package/dist/cli/commands/start.js +20 -0
  316. package/dist/cli/commands/start.js.map +1 -0
  317. package/dist/cli/commands/stats.d.ts +12 -0
  318. package/dist/cli/commands/stats.d.ts.map +1 -0
  319. package/dist/cli/commands/stats.js +23 -0
  320. package/dist/cli/commands/stats.js.map +1 -0
  321. package/dist/cli/commands/sticky.d.ts +16 -0
  322. package/dist/cli/commands/sticky.d.ts.map +1 -0
  323. package/dist/cli/commands/sticky.js +211 -0
  324. package/dist/cli/commands/sticky.js.map +1 -0
  325. package/dist/cli/commands/stop.d.ts +13 -0
  326. package/dist/cli/commands/stop.d.ts.map +1 -0
  327. package/dist/cli/commands/stop.js +20 -0
  328. package/dist/cli/commands/stop.js.map +1 -0
  329. package/dist/cli/commands/testing.d.ts +13 -0
  330. package/dist/cli/commands/testing.d.ts.map +1 -0
  331. package/dist/cli/commands/testing.js +64 -0
  332. package/dist/cli/commands/testing.js.map +1 -0
  333. package/dist/cli/commands/token.d.ts +10 -0
  334. package/dist/cli/commands/token.d.ts.map +1 -0
  335. package/dist/cli/commands/token.js +135 -0
  336. package/dist/cli/commands/token.js.map +1 -0
  337. package/dist/cli/commands/update.d.ts +12 -0
  338. package/dist/cli/commands/update.d.ts.map +1 -0
  339. package/dist/cli/commands/update.js +77 -0
  340. package/dist/cli/commands/update.js.map +1 -0
  341. package/dist/cli/commands/upgrade.d.ts +16 -0
  342. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  343. package/dist/cli/commands/upgrade.js +83 -0
  344. package/dist/cli/commands/upgrade.js.map +1 -0
  345. package/dist/cli/commands/validate.d.ts +12 -0
  346. package/dist/cli/commands/validate.d.ts.map +1 -0
  347. package/dist/cli/commands/validate.js +23 -0
  348. package/dist/cli/commands/validate.js.map +1 -0
  349. package/dist/cli/commands/verify.d.ts +8 -0
  350. package/dist/cli/commands/verify.d.ts.map +1 -0
  351. package/dist/cli/commands/verify.js +28 -0
  352. package/dist/cli/commands/verify.js.map +1 -0
  353. package/dist/cli/commands/web.d.ts +13 -0
  354. package/dist/cli/commands/web.d.ts.map +1 -0
  355. package/dist/cli/commands/web.js +264 -0
  356. package/dist/cli/commands/web.js.map +1 -0
  357. package/dist/cli/field-context.d.ts +32 -0
  358. package/dist/cli/field-context.d.ts.map +1 -0
  359. package/dist/cli/field-context.js +47 -0
  360. package/dist/cli/field-context.js.map +1 -0
  361. package/dist/cli/format-context.d.ts +32 -0
  362. package/dist/cli/format-context.d.ts.map +1 -0
  363. package/dist/cli/format-context.js +50 -0
  364. package/dist/cli/format-context.js.map +1 -0
  365. package/dist/cli/index.d.ts +9 -0
  366. package/dist/cli/index.d.ts.map +1 -0
  367. package/dist/cli/index.js +16876 -14937
  368. package/dist/cli/index.js.map +4 -4
  369. package/dist/cli/logger-bootstrap.d.ts +6 -0
  370. package/dist/cli/logger-bootstrap.d.ts.map +1 -0
  371. package/dist/cli/logger-bootstrap.js +10 -0
  372. package/dist/cli/logger-bootstrap.js.map +1 -0
  373. package/dist/cli/middleware/output-format.d.ts +30 -0
  374. package/dist/cli/middleware/output-format.d.ts.map +1 -0
  375. package/dist/cli/middleware/output-format.js +35 -0
  376. package/dist/cli/middleware/output-format.js.map +1 -0
  377. package/dist/cli/progress.d.ts +84 -0
  378. package/dist/cli/progress.d.ts.map +1 -0
  379. package/dist/cli/progress.js +169 -0
  380. package/dist/cli/progress.js.map +1 -0
  381. package/dist/cli/renderers/colors.d.ts +32 -0
  382. package/dist/cli/renderers/colors.d.ts.map +1 -0
  383. package/dist/cli/renderers/colors.js +141 -0
  384. package/dist/cli/renderers/colors.js.map +1 -0
  385. package/dist/cli/renderers/error.d.ts +13 -0
  386. package/dist/cli/renderers/error.d.ts.map +1 -0
  387. package/dist/cli/renderers/error.js +42 -0
  388. package/dist/cli/renderers/error.js.map +1 -0
  389. package/dist/cli/renderers/index.d.ts +59 -0
  390. package/dist/cli/renderers/index.d.ts.map +1 -0
  391. package/dist/cli/renderers/index.js +184 -0
  392. package/dist/cli/renderers/index.js.map +1 -0
  393. package/dist/cli/renderers/normalizer.d.ts +21 -0
  394. package/dist/cli/renderers/normalizer.d.ts.map +1 -0
  395. package/dist/cli/renderers/normalizer.js +106 -0
  396. package/dist/cli/renderers/normalizer.js.map +1 -0
  397. package/dist/cli/renderers/system.d.ts +25 -0
  398. package/dist/cli/renderers/system.d.ts.map +1 -0
  399. package/dist/cli/renderers/system.js +416 -0
  400. package/dist/cli/renderers/system.js.map +1 -0
  401. package/dist/cli/renderers/tasks.d.ts +28 -0
  402. package/dist/cli/renderers/tasks.d.ts.map +1 -0
  403. package/dist/cli/renderers/tasks.js +306 -0
  404. package/dist/cli/renderers/tasks.js.map +1 -0
  405. package/dist/dispatch/adapters/cli.d.ts +67 -0
  406. package/dist/dispatch/adapters/cli.d.ts.map +1 -0
  407. package/dist/dispatch/adapters/cli.js +205 -0
  408. package/dist/dispatch/adapters/cli.js.map +1 -0
  409. package/dist/dispatch/adapters/mcp.d.ts +37 -0
  410. package/dist/dispatch/adapters/mcp.d.ts.map +1 -0
  411. package/dist/dispatch/adapters/mcp.js +122 -0
  412. package/dist/dispatch/adapters/mcp.js.map +1 -0
  413. package/dist/dispatch/context/session-context.d.ts +54 -0
  414. package/dist/dispatch/context/session-context.d.ts.map +1 -0
  415. package/dist/dispatch/context/session-context.js +61 -0
  416. package/dist/dispatch/context/session-context.js.map +1 -0
  417. package/dist/dispatch/dispatcher.d.ts +23 -0
  418. package/dist/dispatch/dispatcher.d.ts.map +1 -0
  419. package/dist/dispatch/dispatcher.js +84 -0
  420. package/dist/dispatch/dispatcher.js.map +1 -0
  421. package/dist/dispatch/domains/_base.d.ts +59 -0
  422. package/dist/dispatch/domains/_base.d.ts.map +1 -0
  423. package/dist/dispatch/domains/_base.js +77 -0
  424. package/dist/dispatch/domains/_base.js.map +1 -0
  425. package/dist/dispatch/domains/_meta.d.ts +23 -0
  426. package/dist/dispatch/domains/_meta.d.ts.map +1 -0
  427. package/dist/dispatch/domains/_meta.js +25 -0
  428. package/dist/dispatch/domains/_meta.js.map +1 -0
  429. package/dist/dispatch/domains/_routing.d.ts +8 -0
  430. package/dist/dispatch/domains/_routing.d.ts.map +1 -0
  431. package/dist/dispatch/domains/_routing.js +20 -0
  432. package/dist/dispatch/domains/_routing.js.map +1 -0
  433. package/dist/dispatch/domains/admin.d.ts +25 -0
  434. package/dist/dispatch/domains/admin.d.ts.map +1 -0
  435. package/dist/dispatch/domains/admin.js +670 -0
  436. package/dist/dispatch/domains/admin.js.map +1 -0
  437. package/dist/dispatch/domains/check.d.ts +22 -0
  438. package/dist/dispatch/domains/check.d.ts.map +1 -0
  439. package/dist/dispatch/domains/check.js +279 -0
  440. package/dist/dispatch/domains/check.js.map +1 -0
  441. package/dist/dispatch/domains/index.d.ts +26 -0
  442. package/dist/dispatch/domains/index.d.ts.map +1 -0
  443. package/dist/dispatch/domains/index.js +38 -0
  444. package/dist/dispatch/domains/index.js.map +1 -0
  445. package/dist/dispatch/domains/memory.d.ts +22 -0
  446. package/dist/dispatch/domains/memory.d.ts.map +1 -0
  447. package/dist/dispatch/domains/memory.js +303 -0
  448. package/dist/dispatch/domains/memory.js.map +1 -0
  449. package/dist/dispatch/domains/nexus.d.ts +22 -0
  450. package/dist/dispatch/domains/nexus.d.ts.map +1 -0
  451. package/dist/dispatch/domains/nexus.js +286 -0
  452. package/dist/dispatch/domains/nexus.js.map +1 -0
  453. package/dist/dispatch/domains/orchestrate.d.ts +19 -0
  454. package/dist/dispatch/domains/orchestrate.d.ts.map +1 -0
  455. package/dist/dispatch/domains/orchestrate.js +259 -0
  456. package/dist/dispatch/domains/orchestrate.js.map +1 -0
  457. package/dist/dispatch/domains/pipeline.d.ts +35 -0
  458. package/dist/dispatch/domains/pipeline.d.ts.map +1 -0
  459. package/dist/dispatch/domains/pipeline.js +553 -0
  460. package/dist/dispatch/domains/pipeline.js.map +1 -0
  461. package/dist/dispatch/domains/session.d.ts +22 -0
  462. package/dist/dispatch/domains/session.d.ts.map +1 -0
  463. package/dist/dispatch/domains/session.js +255 -0
  464. package/dist/dispatch/domains/session.js.map +1 -0
  465. package/dist/dispatch/domains/sticky.d.ts +20 -0
  466. package/dist/dispatch/domains/sticky.d.ts.map +1 -0
  467. package/dist/dispatch/domains/sticky.js +164 -0
  468. package/dist/dispatch/domains/sticky.js.map +1 -0
  469. package/dist/dispatch/domains/tasks.d.ts +25 -0
  470. package/dist/dispatch/domains/tasks.d.ts.map +1 -0
  471. package/dist/dispatch/domains/tasks.js +323 -0
  472. package/dist/dispatch/domains/tasks.js.map +1 -0
  473. package/dist/dispatch/domains/tools.d.ts +36 -0
  474. package/dist/dispatch/domains/tools.d.ts.map +1 -0
  475. package/dist/dispatch/domains/tools.js +451 -0
  476. package/dist/dispatch/domains/tools.js.map +1 -0
  477. package/dist/dispatch/engines/_error.d.ts +42 -0
  478. package/dist/dispatch/engines/_error.d.ts.map +1 -0
  479. package/dist/dispatch/engines/_error.js +201 -0
  480. package/dist/dispatch/engines/_error.js.map +1 -0
  481. package/dist/dispatch/engines/codebase-map-engine.d.ts +17 -0
  482. package/dist/dispatch/engines/codebase-map-engine.d.ts.map +1 -0
  483. package/dist/dispatch/engines/codebase-map-engine.js +29 -0
  484. package/dist/dispatch/engines/codebase-map-engine.js.map +1 -0
  485. package/dist/dispatch/engines/config-engine.d.ts +21 -0
  486. package/dist/dispatch/engines/config-engine.d.ts.map +1 -0
  487. package/dist/dispatch/engines/config-engine.js +45 -0
  488. package/dist/dispatch/engines/config-engine.js.map +1 -0
  489. package/dist/dispatch/engines/hooks-engine.d.ts +47 -0
  490. package/dist/dispatch/engines/hooks-engine.d.ts.map +1 -0
  491. package/dist/dispatch/engines/hooks-engine.js +57 -0
  492. package/dist/dispatch/engines/hooks-engine.js.map +1 -0
  493. package/dist/dispatch/engines/init-engine.d.ts +43 -0
  494. package/dist/dispatch/engines/init-engine.d.ts.map +1 -0
  495. package/dist/dispatch/engines/init-engine.js +73 -0
  496. package/dist/dispatch/engines/init-engine.js.map +1 -0
  497. package/dist/dispatch/engines/lifecycle-engine.d.ts +66 -0
  498. package/dist/dispatch/engines/lifecycle-engine.d.ts.map +1 -0
  499. package/dist/dispatch/engines/lifecycle-engine.js +213 -0
  500. package/dist/dispatch/engines/lifecycle-engine.js.map +1 -0
  501. package/dist/dispatch/engines/memory-engine.d.ts +10 -0
  502. package/dist/dispatch/engines/memory-engine.d.ts.map +1 -0
  503. package/dist/dispatch/engines/memory-engine.js +10 -0
  504. package/dist/dispatch/engines/memory-engine.js.map +1 -0
  505. package/dist/dispatch/engines/nexus-engine.d.ts +167 -0
  506. package/dist/dispatch/engines/nexus-engine.d.ts.map +1 -0
  507. package/dist/dispatch/engines/nexus-engine.js +356 -0
  508. package/dist/dispatch/engines/nexus-engine.js.map +1 -0
  509. package/dist/dispatch/engines/orchestrate-engine.d.ts +133 -0
  510. package/dist/dispatch/engines/orchestrate-engine.d.ts.map +1 -0
  511. package/dist/dispatch/engines/orchestrate-engine.js +769 -0
  512. package/dist/dispatch/engines/orchestrate-engine.js.map +1 -0
  513. package/dist/dispatch/engines/pipeline-engine.d.ts +51 -0
  514. package/dist/dispatch/engines/pipeline-engine.d.ts.map +1 -0
  515. package/dist/dispatch/engines/pipeline-engine.js +191 -0
  516. package/dist/dispatch/engines/pipeline-engine.js.map +1 -0
  517. package/dist/dispatch/engines/release-engine.d.ts +94 -0
  518. package/dist/dispatch/engines/release-engine.d.ts.map +1 -0
  519. package/dist/dispatch/engines/release-engine.js +669 -0
  520. package/dist/dispatch/engines/release-engine.js.map +1 -0
  521. package/dist/dispatch/engines/session-engine.d.ts +323 -0
  522. package/dist/dispatch/engines/session-engine.d.ts.map +1 -0
  523. package/dist/dispatch/engines/session-engine.js +865 -0
  524. package/dist/dispatch/engines/session-engine.js.map +1 -0
  525. package/dist/dispatch/engines/sticky-engine.d.ts +100 -0
  526. package/dist/dispatch/engines/sticky-engine.d.ts.map +1 -0
  527. package/dist/dispatch/engines/sticky-engine.js +181 -0
  528. package/dist/dispatch/engines/sticky-engine.js.map +1 -0
  529. package/dist/dispatch/engines/system-engine.d.ts +377 -0
  530. package/dist/dispatch/engines/system-engine.d.ts.map +1 -0
  531. package/dist/dispatch/engines/system-engine.js +979 -0
  532. package/dist/dispatch/engines/system-engine.js.map +1 -0
  533. package/dist/dispatch/engines/task-engine.d.ts +612 -0
  534. package/dist/dispatch/engines/task-engine.d.ts.map +1 -0
  535. package/dist/dispatch/engines/task-engine.js +950 -0
  536. package/dist/dispatch/engines/task-engine.js.map +1 -0
  537. package/dist/dispatch/engines/template-parser.d.ts +34 -0
  538. package/dist/dispatch/engines/template-parser.d.ts.map +1 -0
  539. package/dist/dispatch/engines/template-parser.js +57 -0
  540. package/dist/dispatch/engines/template-parser.js.map +1 -0
  541. package/dist/dispatch/engines/tools-engine.d.ts +270 -0
  542. package/dist/dispatch/engines/tools-engine.d.ts.map +1 -0
  543. package/dist/dispatch/engines/tools-engine.js +636 -0
  544. package/dist/dispatch/engines/tools-engine.js.map +1 -0
  545. package/dist/dispatch/engines/validate-engine.d.ts +154 -0
  546. package/dist/dispatch/engines/validate-engine.d.ts.map +1 -0
  547. package/dist/dispatch/engines/validate-engine.js +524 -0
  548. package/dist/dispatch/engines/validate-engine.js.map +1 -0
  549. package/dist/dispatch/index.d.ts +20 -0
  550. package/dist/dispatch/index.d.ts.map +1 -0
  551. package/dist/dispatch/index.js +19 -0
  552. package/dist/dispatch/index.js.map +1 -0
  553. package/dist/dispatch/lib/capability-matrix.d.ts +11 -0
  554. package/dist/dispatch/lib/capability-matrix.d.ts.map +1 -0
  555. package/dist/dispatch/lib/capability-matrix.js +10 -0
  556. package/dist/dispatch/lib/capability-matrix.js.map +1 -0
  557. package/dist/dispatch/lib/config.d.ts +16 -0
  558. package/dist/dispatch/lib/config.d.ts.map +1 -0
  559. package/dist/dispatch/lib/config.js +15 -0
  560. package/dist/dispatch/lib/config.js.map +1 -0
  561. package/dist/dispatch/lib/engine.d.ts +25 -0
  562. package/dist/dispatch/lib/engine.d.ts.map +1 -0
  563. package/dist/dispatch/lib/engine.js +44 -0
  564. package/dist/dispatch/lib/engine.js.map +1 -0
  565. package/dist/dispatch/lib/meta.d.ts +26 -0
  566. package/dist/dispatch/lib/meta.d.ts.map +1 -0
  567. package/dist/dispatch/lib/meta.js +37 -0
  568. package/dist/dispatch/lib/meta.js.map +1 -0
  569. package/dist/dispatch/lib/param-utils.d.ts +11 -0
  570. package/dist/dispatch/lib/param-utils.d.ts.map +1 -0
  571. package/dist/dispatch/lib/param-utils.js +10 -0
  572. package/dist/dispatch/lib/param-utils.js.map +1 -0
  573. package/dist/dispatch/lib/projections.d.ts +23 -0
  574. package/dist/dispatch/lib/projections.d.ts.map +1 -0
  575. package/dist/dispatch/lib/projections.js +48 -0
  576. package/dist/dispatch/lib/projections.js.map +1 -0
  577. package/dist/dispatch/lib/schema-utils.d.ts +42 -0
  578. package/dist/dispatch/lib/schema-utils.d.ts.map +1 -0
  579. package/dist/dispatch/lib/schema-utils.js +93 -0
  580. package/dist/dispatch/lib/schema-utils.js.map +1 -0
  581. package/dist/dispatch/lib/security.d.ts +11 -0
  582. package/dist/dispatch/lib/security.d.ts.map +1 -0
  583. package/dist/dispatch/lib/security.js +10 -0
  584. package/dist/dispatch/lib/security.js.map +1 -0
  585. package/dist/dispatch/middleware/audit.d.ts +23 -0
  586. package/dist/dispatch/middleware/audit.d.ts.map +1 -0
  587. package/dist/dispatch/middleware/audit.js +169 -0
  588. package/dist/dispatch/middleware/audit.js.map +1 -0
  589. package/dist/dispatch/middleware/field-filter.d.ts +24 -0
  590. package/dist/dispatch/middleware/field-filter.d.ts.map +1 -0
  591. package/dist/dispatch/middleware/field-filter.js +65 -0
  592. package/dist/dispatch/middleware/field-filter.js.map +1 -0
  593. package/dist/dispatch/middleware/pipeline.d.ts +20 -0
  594. package/dist/dispatch/middleware/pipeline.d.ts.map +1 -0
  595. package/dist/dispatch/middleware/pipeline.js +47 -0
  596. package/dist/dispatch/middleware/pipeline.js.map +1 -0
  597. package/dist/dispatch/middleware/projection.d.ts +35 -0
  598. package/dist/dispatch/middleware/projection.d.ts.map +1 -0
  599. package/dist/dispatch/middleware/projection.js +145 -0
  600. package/dist/dispatch/middleware/projection.js.map +1 -0
  601. package/dist/dispatch/middleware/protocol-enforcement.d.ts +12 -0
  602. package/dist/dispatch/middleware/protocol-enforcement.d.ts.map +1 -0
  603. package/dist/dispatch/middleware/protocol-enforcement.js +30 -0
  604. package/dist/dispatch/middleware/protocol-enforcement.js.map +1 -0
  605. package/dist/dispatch/middleware/rate-limiter.d.ts +30 -0
  606. package/dist/dispatch/middleware/rate-limiter.d.ts.map +1 -0
  607. package/dist/dispatch/middleware/rate-limiter.js +101 -0
  608. package/dist/dispatch/middleware/rate-limiter.js.map +1 -0
  609. package/dist/dispatch/middleware/sanitizer.d.ts +10 -0
  610. package/dist/dispatch/middleware/sanitizer.d.ts.map +1 -0
  611. package/dist/dispatch/middleware/sanitizer.js +42 -0
  612. package/dist/dispatch/middleware/sanitizer.js.map +1 -0
  613. package/dist/dispatch/middleware/session-resolver.d.ts +26 -0
  614. package/dist/dispatch/middleware/session-resolver.d.ts.map +1 -0
  615. package/dist/dispatch/middleware/session-resolver.js +65 -0
  616. package/dist/dispatch/middleware/session-resolver.js.map +1 -0
  617. package/dist/dispatch/middleware/verification-gates.d.ts +3 -0
  618. package/dist/dispatch/middleware/verification-gates.d.ts.map +1 -0
  619. package/dist/dispatch/middleware/verification-gates.js +40 -0
  620. package/dist/dispatch/middleware/verification-gates.js.map +1 -0
  621. package/dist/dispatch/registry.d.ts +91 -0
  622. package/dist/dispatch/registry.d.ts.map +1 -0
  623. package/dist/dispatch/registry.js +2833 -0
  624. package/dist/dispatch/registry.js.map +1 -0
  625. package/dist/dispatch/types.d.ts +218 -0
  626. package/dist/dispatch/types.d.ts.map +1 -0
  627. package/dist/dispatch/types.js +25 -0
  628. package/dist/dispatch/types.js.map +1 -0
  629. package/dist/mcp/gateways/mutate.d.ts +146 -0
  630. package/dist/mcp/gateways/mutate.d.ts.map +1 -0
  631. package/dist/mcp/gateways/mutate.js +1016 -0
  632. package/dist/mcp/gateways/mutate.js.map +1 -0
  633. package/dist/mcp/gateways/query.d.ts +138 -0
  634. package/dist/mcp/gateways/query.d.ts.map +1 -0
  635. package/dist/mcp/gateways/query.js +186 -0
  636. package/dist/mcp/gateways/query.js.map +1 -0
  637. package/dist/mcp/index.d.ts +16 -0
  638. package/dist/mcp/index.d.ts.map +1 -0
  639. package/dist/mcp/index.js +16735 -14861
  640. package/dist/mcp/index.js.map +4 -4
  641. package/dist/mcp/lib/background-jobs.d.ts +86 -0
  642. package/dist/mcp/lib/background-jobs.d.ts.map +1 -0
  643. package/dist/mcp/lib/background-jobs.js +183 -0
  644. package/dist/mcp/lib/background-jobs.js.map +1 -0
  645. package/dist/mcp/lib/budget.d.ts +35 -0
  646. package/dist/mcp/lib/budget.d.ts.map +1 -0
  647. package/dist/mcp/lib/budget.js +102 -0
  648. package/dist/mcp/lib/budget.js.map +1 -0
  649. package/dist/mcp/lib/cache.d.ts +78 -0
  650. package/dist/mcp/lib/cache.d.ts.map +1 -0
  651. package/dist/mcp/lib/cache.js +207 -0
  652. package/dist/mcp/lib/cache.js.map +1 -0
  653. package/dist/mcp/lib/config.d.ts +42 -0
  654. package/dist/mcp/lib/config.d.ts.map +1 -0
  655. package/dist/mcp/lib/config.js +241 -0
  656. package/dist/mcp/lib/config.js.map +1 -0
  657. package/dist/mcp/lib/defaults.d.ts +115 -0
  658. package/dist/mcp/lib/defaults.d.ts.map +1 -0
  659. package/dist/mcp/lib/defaults.js +61 -0
  660. package/dist/mcp/lib/defaults.js.map +1 -0
  661. package/dist/mcp/lib/gate-validators.d.ts +13 -0
  662. package/dist/mcp/lib/gate-validators.d.ts.map +1 -0
  663. package/dist/mcp/lib/gate-validators.js +13 -0
  664. package/dist/mcp/lib/gate-validators.js.map +1 -0
  665. package/dist/mcp/lib/gateway-meta.d.ts +37 -0
  666. package/dist/mcp/lib/gateway-meta.d.ts.map +1 -0
  667. package/dist/mcp/lib/gateway-meta.js +50 -0
  668. package/dist/mcp/lib/gateway-meta.js.map +1 -0
  669. package/dist/mcp/lib/job-manager-accessor.d.ts +10 -0
  670. package/dist/mcp/lib/job-manager-accessor.d.ts.map +1 -0
  671. package/dist/mcp/lib/job-manager-accessor.js +14 -0
  672. package/dist/mcp/lib/job-manager-accessor.js.map +1 -0
  673. package/dist/mcp/lib/protocol-enforcement.d.ts +12 -0
  674. package/dist/mcp/lib/protocol-enforcement.d.ts.map +1 -0
  675. package/dist/mcp/lib/protocol-enforcement.js +12 -0
  676. package/dist/mcp/lib/protocol-enforcement.js.map +1 -0
  677. package/dist/mcp/lib/protocol-rules.d.ts +12 -0
  678. package/dist/mcp/lib/protocol-rules.d.ts.map +1 -0
  679. package/dist/mcp/lib/protocol-rules.js +12 -0
  680. package/dist/mcp/lib/protocol-rules.js.map +1 -0
  681. package/dist/mcp/lib/rate-limiter.d.ts +110 -0
  682. package/dist/mcp/lib/rate-limiter.d.ts.map +1 -0
  683. package/dist/mcp/lib/rate-limiter.js +208 -0
  684. package/dist/mcp/lib/rate-limiter.js.map +1 -0
  685. package/dist/mcp/lib/router.d.ts +58 -0
  686. package/dist/mcp/lib/router.d.ts.map +1 -0
  687. package/dist/mcp/lib/router.js +12 -0
  688. package/dist/mcp/lib/router.js.map +1 -0
  689. package/dist/mcp/lib/security.d.ts +161 -0
  690. package/dist/mcp/lib/security.d.ts.map +1 -0
  691. package/dist/mcp/lib/security.js +360 -0
  692. package/dist/mcp/lib/security.js.map +1 -0
  693. package/dist/mcp/lib/verification-gates.d.ts +13 -0
  694. package/dist/mcp/lib/verification-gates.d.ts.map +1 -0
  695. package/dist/mcp/lib/verification-gates.js +12 -0
  696. package/dist/mcp/lib/verification-gates.js.map +1 -0
  697. package/dist/mcp/resources/budget.d.ts +22 -0
  698. package/dist/mcp/resources/budget.d.ts.map +1 -0
  699. package/dist/mcp/resources/budget.js +46 -0
  700. package/dist/mcp/resources/budget.js.map +1 -0
  701. package/dist/mcp/resources/index.d.ts +53 -0
  702. package/dist/mcp/resources/index.d.ts.map +1 -0
  703. package/dist/mcp/resources/index.js +278 -0
  704. package/dist/mcp/resources/index.js.map +1 -0
  705. package/package.json +3 -3
@@ -0,0 +1,669 @@
1
+ /**
2
+ * Release Engine
3
+ *
4
+ * Thin wrapper around core release manifest operations.
5
+ * Business logic lives in src/core/release/release-manifest.ts.
6
+ *
7
+ * Note: Some operations (push, rollback) inherently require git CLI.
8
+ * Those are handled as hybrid operations - native for data, CLI for git.
9
+ *
10
+ * @task T4788
11
+ */
12
+ import { execFileSync } from 'node:child_process';
13
+ import { readFileSync } from 'node:fs';
14
+ import { buildPRBody, bumpVersionFromConfig, cancelRelease, channelToDistTag, checkDoubleListing, checkEpicCompleteness, commitRelease, createPullRequest, generateReleaseChangelog, getAccessor, getGitFlowConfig, getPushMode, getVersionBumpConfig, isGhCliAvailable, listManifestReleases, loadReleaseConfig, markReleasePushed, prepareRelease, pushRelease, resolveChannelFromBranch, resolveProjectRoot, rollbackRelease, runReleaseGates, showManifestRelease, tagRelease, } from '@cleocode/core/internal';
15
+ import { engineError } from './_error.js';
16
+ /**
17
+ * Detect whether the current execution context is an AI agent.
18
+ * Checks for CLEO_SESSION_ID or CLAUDE_AGENT_TYPE environment variables.
19
+ * @task T4279
20
+ */
21
+ function isAgentContext() {
22
+ return !!(process.env['CLEO_SESSION_ID'] || process.env['CLAUDE_AGENT_TYPE']);
23
+ }
24
+ /**
25
+ * Verify that a release manifest entry exists for the given version.
26
+ * Used as a protocol guard to ensure agents go through the proper
27
+ * release.ship workflow rather than calling release.push directly.
28
+ * @task T4279
29
+ */
30
+ async function hasManifestEntry(version, projectRoot) {
31
+ try {
32
+ await showManifestRelease(version, projectRoot);
33
+ return true;
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ /**
40
+ * Load tasks via DataAccessor (SQLite).
41
+ */
42
+ async function loadTasks(projectRoot) {
43
+ const root = projectRoot ?? resolveProjectRoot();
44
+ try {
45
+ const accessor = await getAccessor(root);
46
+ const result = await accessor.queryTasks({});
47
+ return result?.tasks ?? [];
48
+ }
49
+ catch (error) {
50
+ throw new Error(`Failed to load task data: ${error.message}`);
51
+ }
52
+ }
53
+ /**
54
+ * release.prepare - Prepare a release
55
+ * @task T4788
56
+ */
57
+ export async function releasePrepare(version, tasks, notes, projectRoot) {
58
+ try {
59
+ const data = await prepareRelease(version, tasks, notes, () => loadTasks(projectRoot), projectRoot);
60
+ return { success: true, data };
61
+ }
62
+ catch (err) {
63
+ const message = err.message;
64
+ let code = 'E_RELEASE_PREPARE_FAILED';
65
+ if (message.includes('required'))
66
+ code = 'E_INVALID_INPUT';
67
+ else if (message.includes('Invalid version'))
68
+ code = 'E_INVALID_VERSION';
69
+ else if (message.includes('already exists'))
70
+ code = 'E_VERSION_EXISTS';
71
+ return engineError(code, message);
72
+ }
73
+ }
74
+ /**
75
+ * release.changelog - Generate changelog
76
+ * @task T4788
77
+ */
78
+ export async function releaseChangelog(version, projectRoot) {
79
+ try {
80
+ const data = await generateReleaseChangelog(version, () => loadTasks(projectRoot), projectRoot);
81
+ return { success: true, data };
82
+ }
83
+ catch (err) {
84
+ const message = err.message;
85
+ let code = 'E_CHANGELOG_FAILED';
86
+ if (message.includes('required'))
87
+ code = 'E_INVALID_INPUT';
88
+ else if (message.includes('not found'))
89
+ code = 'E_NOT_FOUND';
90
+ return engineError(code, message);
91
+ }
92
+ }
93
+ /**
94
+ * release.list - List all releases (query operation via data read)
95
+ * @task T4788
96
+ */
97
+ export async function releaseList(optionsOrProjectRoot, projectRoot) {
98
+ try {
99
+ const options = typeof optionsOrProjectRoot === 'string' || optionsOrProjectRoot === undefined
100
+ ? {}
101
+ : optionsOrProjectRoot;
102
+ const effectiveProjectRoot = typeof optionsOrProjectRoot === 'string' ? optionsOrProjectRoot : projectRoot;
103
+ const data = await listManifestReleases(options, effectiveProjectRoot);
104
+ return {
105
+ success: true,
106
+ data: {
107
+ releases: data.releases,
108
+ total: data.total,
109
+ filtered: data.filtered,
110
+ latest: data.latest,
111
+ },
112
+ page: data.page,
113
+ };
114
+ }
115
+ catch (err) {
116
+ return engineError('E_LIST_FAILED', err.message);
117
+ }
118
+ }
119
+ /**
120
+ * release.show - Show release details (query operation via data read)
121
+ * @task T4788
122
+ */
123
+ export async function releaseShow(version, projectRoot) {
124
+ try {
125
+ const data = await showManifestRelease(version, projectRoot);
126
+ return { success: true, data };
127
+ }
128
+ catch (err) {
129
+ const message = err.message;
130
+ const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_SHOW_FAILED';
131
+ return engineError(code, message);
132
+ }
133
+ }
134
+ /**
135
+ * release.commit - Mark release as committed (metadata only)
136
+ * @task T4788
137
+ */
138
+ export async function releaseCommit(version, projectRoot) {
139
+ try {
140
+ const data = await commitRelease(version, projectRoot);
141
+ return { success: true, data };
142
+ }
143
+ catch (err) {
144
+ const message = err.message;
145
+ let code = 'E_COMMIT_FAILED';
146
+ if (message.includes('not found'))
147
+ code = 'E_NOT_FOUND';
148
+ else if (message.includes('expected'))
149
+ code = 'E_INVALID_STATE';
150
+ return engineError(code, message);
151
+ }
152
+ }
153
+ /**
154
+ * release.tag - Mark release as tagged (metadata only)
155
+ * @task T4788
156
+ */
157
+ export async function releaseTag(version, projectRoot) {
158
+ try {
159
+ const data = await tagRelease(version, projectRoot);
160
+ return { success: true, data };
161
+ }
162
+ catch (err) {
163
+ const message = err.message;
164
+ const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_TAG_FAILED';
165
+ return engineError(code, message);
166
+ }
167
+ }
168
+ /**
169
+ * release.gates.run - Run release gates (validation checks)
170
+ * @task T4788
171
+ */
172
+ export async function releaseGatesRun(version, projectRoot) {
173
+ try {
174
+ const data = await runReleaseGates(version, () => loadTasks(projectRoot), projectRoot);
175
+ return { success: true, data };
176
+ }
177
+ catch (err) {
178
+ const message = err.message;
179
+ const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_GATES_FAILED';
180
+ return engineError(code, message);
181
+ }
182
+ }
183
+ /**
184
+ * release.rollback - Rollback a release
185
+ * @task T4788
186
+ */
187
+ export async function releaseRollback(version, reason, projectRoot) {
188
+ try {
189
+ const data = await rollbackRelease(version, reason, projectRoot);
190
+ return { success: true, data };
191
+ }
192
+ catch (err) {
193
+ const message = err.message;
194
+ const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_ROLLBACK_FAILED';
195
+ return engineError(code, message);
196
+ }
197
+ }
198
+ /**
199
+ * release.cancel - Cancel and remove a release in draft or prepared state
200
+ * @task T5602
201
+ */
202
+ export async function releaseCancel(version, projectRoot) {
203
+ if (!version) {
204
+ return engineError('E_INVALID_INPUT', 'version is required');
205
+ }
206
+ try {
207
+ const result = await cancelRelease(version, projectRoot);
208
+ if (!result.success) {
209
+ const code = result.message.includes('not found') ? 'E_NOT_FOUND' : 'E_INVALID_STATE';
210
+ return engineError(code, result.message);
211
+ }
212
+ return { success: true, data: result };
213
+ }
214
+ catch (err) {
215
+ const message = err.message;
216
+ const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_CANCEL_FAILED';
217
+ return engineError(code, message);
218
+ }
219
+ }
220
+ /**
221
+ * release.push - Push release to remote via git
222
+ * Uses execFileSync (no shell) for safety.
223
+ * Respects config.release.push policy.
224
+ *
225
+ * Agent protocol guard (T4279): When running in agent context
226
+ * (detected via CLEO_SESSION_ID or CLAUDE_AGENT_TYPE env vars),
227
+ * requires a release manifest entry for the version. This ensures
228
+ * agents go through the proper release.ship workflow rather than
229
+ * calling release.push directly, maintaining provenance tracking.
230
+ *
231
+ * @task T4788
232
+ * @task T4276
233
+ * @task T4279
234
+ */
235
+ export async function releasePush(version, remote, projectRoot, opts) {
236
+ // Agent protocol guard: require manifest entry when in agent context
237
+ if (isAgentContext()) {
238
+ const hasEntry = await hasManifestEntry(version, projectRoot);
239
+ if (!hasEntry) {
240
+ return engineError('E_PROTOCOL_RELEASE', `Agent protocol violation: no release manifest entry for '${version}'. ` +
241
+ 'Use the full release.ship workflow to ensure provenance tracking. ' +
242
+ 'Direct release.push is not allowed in agent context without a manifest entry.', {
243
+ fix: `ct release ship ${version} --epic T####`,
244
+ alternatives: [
245
+ {
246
+ action: 'Use full ship workflow',
247
+ command: `ct release ship ${version} --epic T####`,
248
+ },
249
+ ],
250
+ });
251
+ }
252
+ }
253
+ try {
254
+ const result = await pushRelease(version, remote, projectRoot, opts);
255
+ // Capture commit SHA for provenance and update the manifest
256
+ let commitSha;
257
+ try {
258
+ commitSha = execFileSync('git', ['rev-parse', 'HEAD'], {
259
+ cwd: projectRoot ?? process.cwd(),
260
+ encoding: 'utf-8',
261
+ stdio: 'pipe',
262
+ })
263
+ .toString()
264
+ .trim();
265
+ }
266
+ catch {
267
+ // Non-fatal: provenance capture is best-effort
268
+ }
269
+ const gitTag = `v${result.version.replace(/^v/, '')}`;
270
+ await markReleasePushed(result.version, result.pushedAt, projectRoot, { commitSha, gitTag });
271
+ return { success: true, data: result };
272
+ }
273
+ catch (err) {
274
+ const execError = err;
275
+ const message = (execError.stderr ?? execError.message ?? '').slice(0, 500);
276
+ // Distinguish config policy errors from git errors
277
+ if (execError.message?.includes('disabled by config') ||
278
+ execError.message?.includes('not in allowed branches') ||
279
+ execError.message?.includes('not clean')) {
280
+ return engineError('E_VALIDATION', message);
281
+ }
282
+ return engineError('E_GENERAL', `Git push failed: ${message}`, {
283
+ details: { exitCode: execError.status },
284
+ });
285
+ }
286
+ }
287
+ /**
288
+ * release.ship - Composite release operation
289
+ *
290
+ * Sequence: validate gates → epic completeness → double-listing check →
291
+ * write CHANGELOG → git commit/tag/push (or PR) → record provenance
292
+ *
293
+ * @task T5582
294
+ * @task T5586
295
+ * @epic T5576
296
+ */
297
+ export async function releaseShip(params, projectRoot) {
298
+ const { version, epicId, remote, dryRun = false, bump = true } = params;
299
+ if (!version) {
300
+ return engineError('E_INVALID_INPUT', 'version is required');
301
+ }
302
+ if (!epicId) {
303
+ return engineError('E_INVALID_INPUT', 'epicId is required');
304
+ }
305
+ const cwd = projectRoot ?? resolveProjectRoot();
306
+ /** Collected step log messages, included in every return value for MCP visibility. */
307
+ const steps = [];
308
+ /** Emit a step line for each release stage. Pushes to steps[] and console.log for CLI. */
309
+ const logStep = (n, total, label, done, error) => {
310
+ let msg;
311
+ if (done === undefined) {
312
+ msg = `[Step ${n}/${total}] ${label}...`;
313
+ }
314
+ else if (done) {
315
+ msg = ` ✓ ${label}`;
316
+ }
317
+ else {
318
+ msg = ` ✗ ${label}: ${error ?? 'failed'}`;
319
+ }
320
+ steps.push(msg);
321
+ console.log(msg);
322
+ };
323
+ const bumpTargets = getVersionBumpConfig(cwd);
324
+ const shouldBump = bump && bumpTargets.length > 0;
325
+ try {
326
+ // Step 0: Bump version files (if configured and bump not disabled)
327
+ if (shouldBump) {
328
+ logStep(0, 8, 'Bump version files');
329
+ if (!dryRun) {
330
+ const bumpResults = bumpVersionFromConfig(version, { dryRun: false }, cwd);
331
+ if (!bumpResults.allSuccess) {
332
+ const failed = bumpResults.results.filter((r) => !r.success).map((r) => r.file);
333
+ steps.push(` ! Version bump partial: failed for ${failed.join(', ')}`);
334
+ }
335
+ else {
336
+ logStep(0, 8, 'Bump version files', true);
337
+ }
338
+ }
339
+ else {
340
+ logStep(0, 8, 'Bump version files', true);
341
+ }
342
+ }
343
+ // Step 0.5: Ensure release record exists (auto-prepare if needed)
344
+ // Since T5615 removed release.add/plan, ship must be self-contained
345
+ try {
346
+ await showManifestRelease(version, cwd);
347
+ }
348
+ catch {
349
+ // Release record doesn't exist yet — create it
350
+ logStep(0, 8, 'Auto-prepare release record');
351
+ if (!dryRun) {
352
+ await prepareRelease(version, undefined, `Auto-prepared by release.ship (${epicId})`, () => loadTasks(projectRoot), cwd);
353
+ // Set epicId on the newly created record (prepareRelease doesn't accept it)
354
+ const { getDb } = await import('@cleocode/core/internal');
355
+ const { releaseManifests } = await import('@cleocode/core/internal');
356
+ const { eq } = await import('drizzle-orm');
357
+ const normalizedVer = version.startsWith('v') ? version : `v${version}`;
358
+ const db = await getDb(cwd);
359
+ await db
360
+ .update(releaseManifests)
361
+ .set({ epicId })
362
+ .where(eq(releaseManifests.version, normalizedVer))
363
+ .run();
364
+ // Pre-generate changelog so has_changelog gate passes
365
+ await generateReleaseChangelog(version, () => loadTasks(projectRoot), cwd);
366
+ }
367
+ logStep(0, 8, 'Auto-prepare release record', true);
368
+ }
369
+ // Step 1: Run release gates
370
+ logStep(1, 8, 'Validate release gates');
371
+ const gatesResult = await runReleaseGates(version, () => loadTasks(projectRoot), projectRoot, {
372
+ dryRun,
373
+ });
374
+ if (gatesResult && !gatesResult.allPassed) {
375
+ const failedGates = gatesResult.gates.filter((g) => g.status === 'failed');
376
+ logStep(1, 8, 'Validate release gates', false, failedGates.map((g) => g.name).join(', '));
377
+ return engineError('E_LIFECYCLE_GATE_FAILED', `Release gates failed for ${version}: ${failedGates.map((g) => g.name).join(', ')}`, {
378
+ details: { gates: gatesResult.gates, failedCount: gatesResult.failedCount },
379
+ });
380
+ }
381
+ logStep(1, 8, 'Validate release gates', true);
382
+ // Resolve release channel from current branch (after gates, which read the branch)
383
+ let resolvedChannel = 'latest';
384
+ let currentBranchForPR = 'HEAD';
385
+ try {
386
+ const branchName = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
387
+ cwd,
388
+ encoding: 'utf-8',
389
+ stdio: 'pipe',
390
+ }).trim();
391
+ currentBranchForPR = branchName;
392
+ const channelEnum = resolveChannelFromBranch(branchName);
393
+ resolvedChannel = channelToDistTag(channelEnum);
394
+ }
395
+ catch {
396
+ // git unavailable — keep default
397
+ }
398
+ // Prefer metadata from gates result if available (B4 populates this)
399
+ const gateMetadata = gatesResult.metadata;
400
+ const requiresPRFromGates = gateMetadata?.requiresPR ?? false;
401
+ const targetBranchFromGates = gateMetadata?.targetBranch;
402
+ if (gateMetadata?.currentBranch) {
403
+ currentBranchForPR = gateMetadata.currentBranch;
404
+ }
405
+ // Step 2: Check epic completeness — load release tasks from manifest
406
+ logStep(2, 8, 'Check epic completeness');
407
+ let releaseTaskIds = [];
408
+ try {
409
+ const manifest = await showManifestRelease(version, projectRoot);
410
+ releaseTaskIds = manifest.tasks ?? [];
411
+ }
412
+ catch {
413
+ // Manifest may not exist yet if prepare hasn't been called; proceed
414
+ }
415
+ const epicAccessor = await getAccessor(cwd);
416
+ const epicCheck = await checkEpicCompleteness(releaseTaskIds, projectRoot, epicAccessor);
417
+ if (epicCheck.hasIncomplete) {
418
+ const incomplete = epicCheck.epics
419
+ .filter((e) => e.missingChildren.length > 0)
420
+ .map((e) => `${e.epicId}: missing ${e.missingChildren.map((c) => c.id).join(', ')}`)
421
+ .join('; ');
422
+ logStep(2, 8, 'Check epic completeness', false, incomplete);
423
+ return engineError('E_LIFECYCLE_GATE_FAILED', `Epic completeness check failed: ${incomplete}`, {
424
+ details: { epics: epicCheck.epics },
425
+ });
426
+ }
427
+ logStep(2, 8, 'Check epic completeness', true);
428
+ // Step 3: Check for double-listing
429
+ logStep(3, 8, 'Check task double-listing');
430
+ const allReleases = await listManifestReleases(projectRoot);
431
+ const existingReleases = (allReleases.releases ?? []).filter((r) => r.version !== version);
432
+ const doubleCheck = checkDoubleListing(releaseTaskIds, existingReleases.map((r) => ({ version: r.version, tasks: r.tasks ?? [] })));
433
+ if (doubleCheck.hasDoubleListing) {
434
+ const dupes = doubleCheck.duplicates
435
+ .map((d) => `${d.taskId} (in ${d.releases.join(', ')})`)
436
+ .join('; ');
437
+ logStep(3, 8, 'Check task double-listing', false, dupes);
438
+ return engineError('E_VALIDATION', `Double-listing detected: ${dupes}`, {
439
+ details: { duplicates: doubleCheck.duplicates },
440
+ });
441
+ }
442
+ logStep(3, 8, 'Check task double-listing', true);
443
+ // Resolve push mode for dry-run and PR logic
444
+ const loadedConfig = loadReleaseConfig(cwd);
445
+ const pushMode = getPushMode(loadedConfig);
446
+ const gitflowCfg = getGitFlowConfig(loadedConfig);
447
+ const targetBranch = targetBranchFromGates ?? gitflowCfg.branches.main;
448
+ if (dryRun) {
449
+ // Step 4 (dry-run): Preview CHANGELOG generation without writing to disk
450
+ logStep(4, 8, 'Generate CHANGELOG');
451
+ logStep(4, 8, 'Generate CHANGELOG', true);
452
+ const wouldCreatePR = requiresPRFromGates || pushMode === 'pr';
453
+ const filesToStagePreview = [
454
+ 'CHANGELOG.md',
455
+ ...(shouldBump ? bumpTargets.map((t) => t.file) : []),
456
+ ];
457
+ const wouldDo = [];
458
+ if (shouldBump) {
459
+ wouldDo.push(`bump version files: ${bumpTargets.map((t) => t.file).join(', ')} → ${version}`);
460
+ }
461
+ wouldDo.push(`write CHANGELOG.md: ## [${version}] - ${new Date().toISOString().split('T')[0]} (preview only, not written in dry-run)`, `git add ${filesToStagePreview.join(' ')}`, `git commit -m "release: ship v${version} (${epicId})"`, `git tag -a v${version} -m "Release v${version}"`);
462
+ const dryRunOutput = {
463
+ version,
464
+ epicId,
465
+ dryRun: true,
466
+ channel: resolvedChannel,
467
+ pushMode,
468
+ wouldDo,
469
+ };
470
+ if (wouldCreatePR) {
471
+ const ghAvailable = isGhCliAvailable();
472
+ dryRunOutput['wouldDo'].push(ghAvailable
473
+ ? `gh pr create --base ${targetBranch} --head ${currentBranchForPR} --title "release: ship v${version}"`
474
+ : `manual PR: ${currentBranchForPR} → ${targetBranch} (gh CLI not available)`);
475
+ dryRunOutput['wouldCreatePR'] = true;
476
+ dryRunOutput['prTitle'] = `release: ship v${version}`;
477
+ dryRunOutput['prTargetBranch'] = targetBranch;
478
+ }
479
+ else {
480
+ dryRunOutput['wouldDo'].push(`git push ${remote ?? 'origin'} --follow-tags`);
481
+ dryRunOutput['wouldCreatePR'] = false;
482
+ }
483
+ dryRunOutput['wouldDo'].push('markReleasePushed(...)');
484
+ return { success: true, data: { ...dryRunOutput, steps } };
485
+ }
486
+ // Step 4: Write CHANGELOG section (non-dry-run only)
487
+ logStep(4, 8, 'Generate CHANGELOG');
488
+ await generateReleaseChangelog(version, () => loadTasks(projectRoot), projectRoot);
489
+ const changelogPath = `${cwd}/CHANGELOG.md`;
490
+ // Verify CHANGELOG.md actually contains ## [VERSION] — CI will reject without it
491
+ const cleanVersion = version.replace(/^v/, '');
492
+ try {
493
+ const changelogContent = readFileSync(changelogPath, 'utf8');
494
+ if (!changelogContent.includes(`## [${cleanVersion}]`)) {
495
+ logStep(4, 8, 'Generate CHANGELOG', false, `CHANGELOG.md missing ## [${cleanVersion}] section`);
496
+ return engineError('E_VALIDATION', `CHANGELOG.md does not contain ## [${cleanVersion}] after generation. ` +
497
+ `This will cause the release workflow to fail.`);
498
+ }
499
+ }
500
+ catch (err) {
501
+ const msg = err.message ?? String(err);
502
+ logStep(4, 8, 'Generate CHANGELOG', false, `Cannot read CHANGELOG.md: ${msg}`);
503
+ return engineError('E_GENERAL', `Cannot read CHANGELOG.md: ${msg}`);
504
+ }
505
+ logStep(4, 8, 'Generate CHANGELOG', true);
506
+ // Step 4.5: Lint check — warn on biome errors but don't block release
507
+ try {
508
+ execFileSync('npx', ['biome', 'check', '--no-errors-on-unmatched', cwd], {
509
+ cwd,
510
+ encoding: 'utf-8',
511
+ stdio: 'pipe',
512
+ timeout: 30_000,
513
+ });
514
+ logStep(4, 8, 'Lint check', true);
515
+ }
516
+ catch (err) {
517
+ const execErr = err;
518
+ if (execErr.status && execErr.status > 0) {
519
+ const output = (execErr.stdout ?? execErr.stderr ?? '').slice(0, 500);
520
+ const errorMatch = output.match(/Found (\d+) error/);
521
+ const errorCount = errorMatch ? errorMatch[1] : 'unknown';
522
+ logStep(4, 8, 'Lint check', true, `${errorCount} biome warning(s) — non-blocking`);
523
+ }
524
+ }
525
+ // Step 5: Git commit
526
+ logStep(5, 8, 'Commit release');
527
+ const gitCwd = { cwd, encoding: 'utf-8', stdio: 'pipe' };
528
+ const filesToStage = ['CHANGELOG.md', ...(shouldBump ? bumpTargets.map((t) => t.file) : [])];
529
+ try {
530
+ execFileSync('git', ['add', ...filesToStage], gitCwd);
531
+ }
532
+ catch (err) {
533
+ const msg = err.message ?? String(err);
534
+ logStep(5, 8, 'Commit release', false, `git add failed: ${msg}`);
535
+ return engineError('E_GENERAL', `git add failed: ${msg}`);
536
+ }
537
+ try {
538
+ execFileSync('git', ['commit', '-m', `release: ship v${version} (${epicId})`], gitCwd);
539
+ }
540
+ catch (err) {
541
+ const msg = err.stderr ??
542
+ err.message ??
543
+ String(err);
544
+ logStep(5, 8, 'Commit release', false, `git commit failed: ${msg}`);
545
+ return engineError('E_GENERAL', `git commit failed: ${msg}`);
546
+ }
547
+ logStep(5, 8, 'Commit release', true);
548
+ let commitSha;
549
+ try {
550
+ commitSha = execFileSync('git', ['rev-parse', 'HEAD'], gitCwd).toString().trim();
551
+ }
552
+ catch {
553
+ // Non-fatal
554
+ }
555
+ // Step 6: Tag release
556
+ logStep(6, 8, 'Tag release');
557
+ const gitTag = `v${version.replace(/^v/, '')}`;
558
+ try {
559
+ execFileSync('git', ['tag', '-a', gitTag, '-m', `Release ${gitTag}`], gitCwd);
560
+ }
561
+ catch (err) {
562
+ const msg = err.stderr ??
563
+ err.message ??
564
+ String(err);
565
+ logStep(6, 8, 'Tag release', false, `git tag failed: ${msg}`);
566
+ return engineError('E_GENERAL', `git tag failed: ${msg}`);
567
+ }
568
+ logStep(6, 8, 'Tag release', true);
569
+ // Step 7: Push or create PR
570
+ logStep(7, 8, 'Push / create PR');
571
+ let prResult = null;
572
+ // First attempt the core pushRelease (which may signal requiresPR)
573
+ const pushResult = await pushRelease(version, remote, projectRoot, {
574
+ explicitPush: true,
575
+ mode: pushMode,
576
+ });
577
+ if (pushResult.requiresPR || requiresPRFromGates) {
578
+ // Branch is protected — create PR instead of direct push
579
+ const prBody = buildPRBody({
580
+ base: targetBranch,
581
+ head: currentBranchForPR,
582
+ title: `release: ship v${version}`,
583
+ body: '',
584
+ version,
585
+ epicId,
586
+ projectRoot: cwd,
587
+ });
588
+ prResult = await createPullRequest({
589
+ base: targetBranch,
590
+ head: currentBranchForPR,
591
+ title: `release: ship v${version}`,
592
+ body: prBody,
593
+ labels: ['release', resolvedChannel],
594
+ version,
595
+ epicId,
596
+ projectRoot: cwd,
597
+ });
598
+ if (prResult.mode === 'created') {
599
+ const m1 = ` ✓ Push / create PR`;
600
+ const m2 = ` PR created: ${prResult.prUrl}`;
601
+ const m3 = ` → Next: merge the PR, then CI will publish to npm @${resolvedChannel}`;
602
+ steps.push(m1, m2, m3);
603
+ console.log(m1);
604
+ console.log(m2);
605
+ console.log(m3);
606
+ }
607
+ else if (prResult.mode === 'skipped') {
608
+ const m1 = ` ✓ Push / create PR`;
609
+ const m2 = ` PR already exists: ${prResult.prUrl}`;
610
+ steps.push(m1, m2);
611
+ console.log(m1);
612
+ console.log(m2);
613
+ }
614
+ else {
615
+ const m1 = ` ! Push / create PR — manual PR required:`;
616
+ const m2 = prResult.instructions ?? '';
617
+ steps.push(m1, m2);
618
+ console.log(m1);
619
+ console.log(m2);
620
+ }
621
+ }
622
+ else {
623
+ // Direct push path (pushRelease already ran, but it skips the actual push
624
+ // when requiresPR is false — so we do the git push here directly)
625
+ try {
626
+ execFileSync('git', ['push', remote ?? 'origin', '--follow-tags'], gitCwd);
627
+ logStep(7, 8, 'Push / create PR', true);
628
+ }
629
+ catch (err) {
630
+ const execError = err;
631
+ const msg = (execError.stderr ?? execError.message ?? '').slice(0, 500);
632
+ logStep(7, 8, 'Push / create PR', false, `git push failed: ${msg}`);
633
+ return engineError('E_GENERAL', `git push failed: ${msg}`, {
634
+ details: { exitCode: execError.status },
635
+ });
636
+ }
637
+ }
638
+ // Step 8 (internal): Record provenance
639
+ const pushedAt = new Date().toISOString();
640
+ await markReleasePushed(version, pushedAt, projectRoot, { commitSha, gitTag });
641
+ return {
642
+ success: true,
643
+ data: {
644
+ version,
645
+ epicId,
646
+ commitSha,
647
+ gitTag,
648
+ pushedAt,
649
+ changelog: changelogPath,
650
+ channel: resolvedChannel,
651
+ steps,
652
+ ...(prResult
653
+ ? {
654
+ pr: {
655
+ mode: prResult.mode,
656
+ prUrl: prResult.prUrl,
657
+ prNumber: prResult.prNumber,
658
+ instructions: prResult.instructions,
659
+ },
660
+ }
661
+ : {}),
662
+ },
663
+ };
664
+ }
665
+ catch (err) {
666
+ return engineError('E_GENERAL', err.message ?? String(err));
667
+ }
668
+ }
669
+ //# sourceMappingURL=release-engine.js.map