@urateam/core 0.1.16 → 0.1.19

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 (293) hide show
  1. package/dist/__tests__/agentic-deep-review-provider.test.d.ts +2 -0
  2. package/dist/__tests__/agentic-deep-review-provider.test.d.ts.map +1 -0
  3. package/dist/__tests__/agentic-deep-review-provider.test.js +70 -0
  4. package/dist/__tests__/agentic-deep-review-provider.test.js.map +1 -0
  5. package/dist/__tests__/audit-immutability.test.js +16 -1
  6. package/dist/__tests__/audit-immutability.test.js.map +1 -1
  7. package/dist/__tests__/cost/per-run-multi-model.test.d.ts +2 -0
  8. package/dist/__tests__/cost/per-run-multi-model.test.d.ts.map +1 -0
  9. package/dist/__tests__/cost/per-run-multi-model.test.js +102 -0
  10. package/dist/__tests__/cost/per-run-multi-model.test.js.map +1 -0
  11. package/dist/__tests__/db-qa-gap-issues.test.d.ts +2 -0
  12. package/dist/__tests__/db-qa-gap-issues.test.d.ts.map +1 -0
  13. package/dist/__tests__/db-qa-gap-issues.test.js +113 -0
  14. package/dist/__tests__/db-qa-gap-issues.test.js.map +1 -0
  15. package/dist/__tests__/db-release-decisions.test.d.ts +2 -0
  16. package/dist/__tests__/db-release-decisions.test.d.ts.map +1 -0
  17. package/dist/__tests__/db-release-decisions.test.js +98 -0
  18. package/dist/__tests__/db-release-decisions.test.js.map +1 -0
  19. package/dist/__tests__/db-review-model-runs.test.d.ts +2 -0
  20. package/dist/__tests__/db-review-model-runs.test.d.ts.map +1 -0
  21. package/dist/__tests__/db-review-model-runs.test.js +90 -0
  22. package/dist/__tests__/db-review-model-runs.test.js.map +1 -0
  23. package/dist/__tests__/e2e-fanout.test.d.ts +17 -0
  24. package/dist/__tests__/e2e-fanout.test.d.ts.map +1 -0
  25. package/dist/__tests__/e2e-fanout.test.js +184 -0
  26. package/dist/__tests__/e2e-fanout.test.js.map +1 -0
  27. package/dist/__tests__/e2e-pipeline.test.js +1 -0
  28. package/dist/__tests__/e2e-pipeline.test.js.map +1 -1
  29. package/dist/__tests__/notifier-discord.test.js +3 -3
  30. package/dist/__tests__/notifier-discord.test.js.map +1 -1
  31. package/dist/__tests__/notifier-slack.test.js +2 -2
  32. package/dist/__tests__/notifier-slack.test.js.map +1 -1
  33. package/dist/__tests__/notifier.test.js +1 -0
  34. package/dist/__tests__/notifier.test.js.map +1 -1
  35. package/dist/__tests__/openrouter-client.test.d.ts +2 -0
  36. package/dist/__tests__/openrouter-client.test.d.ts.map +1 -0
  37. package/dist/__tests__/openrouter-client.test.js +56 -0
  38. package/dist/__tests__/openrouter-client.test.js.map +1 -0
  39. package/dist/__tests__/openrouter-fanout.test.d.ts +2 -0
  40. package/dist/__tests__/openrouter-fanout.test.d.ts.map +1 -0
  41. package/dist/__tests__/openrouter-fanout.test.js +93 -0
  42. package/dist/__tests__/openrouter-fanout.test.js.map +1 -0
  43. package/dist/__tests__/pm-budget.test.js +1 -0
  44. package/dist/__tests__/pm-budget.test.js.map +1 -1
  45. package/dist/__tests__/pm-promote.test.js +189 -0
  46. package/dist/__tests__/pm-promote.test.js.map +1 -1
  47. package/dist/__tests__/pm-scheduler.test.js +1 -0
  48. package/dist/__tests__/pm-scheduler.test.js.map +1 -1
  49. package/dist/__tests__/pm-types.test.js +2 -0
  50. package/dist/__tests__/pm-types.test.js.map +1 -1
  51. package/dist/__tests__/post-fanout-comments.test.d.ts +2 -0
  52. package/dist/__tests__/post-fanout-comments.test.d.ts.map +1 -0
  53. package/dist/__tests__/post-fanout-comments.test.js +84 -0
  54. package/dist/__tests__/post-fanout-comments.test.js.map +1 -0
  55. package/dist/__tests__/qa-audit-events.test.d.ts +2 -0
  56. package/dist/__tests__/qa-audit-events.test.d.ts.map +1 -0
  57. package/dist/__tests__/qa-audit-events.test.js +57 -0
  58. package/dist/__tests__/qa-audit-events.test.js.map +1 -0
  59. package/dist/__tests__/qa-config.test.d.ts +2 -0
  60. package/dist/__tests__/qa-config.test.d.ts.map +1 -0
  61. package/dist/__tests__/qa-config.test.js +80 -0
  62. package/dist/__tests__/qa-config.test.js.map +1 -0
  63. package/dist/__tests__/qa-eval.test.d.ts +2 -0
  64. package/dist/__tests__/qa-eval.test.d.ts.map +1 -0
  65. package/dist/__tests__/qa-eval.test.js +146 -0
  66. package/dist/__tests__/qa-eval.test.js.map +1 -0
  67. package/dist/__tests__/qa-gap.test.d.ts +2 -0
  68. package/dist/__tests__/qa-gap.test.d.ts.map +1 -0
  69. package/dist/__tests__/qa-gap.test.js +100 -0
  70. package/dist/__tests__/qa-gap.test.js.map +1 -0
  71. package/dist/__tests__/qa-github.test.d.ts +2 -0
  72. package/dist/__tests__/qa-github.test.d.ts.map +1 -0
  73. package/dist/__tests__/qa-github.test.js +162 -0
  74. package/dist/__tests__/qa-github.test.js.map +1 -0
  75. package/dist/__tests__/ralph-review-fix-regression.test.js +1 -0
  76. package/dist/__tests__/ralph-review-fix-regression.test.js.map +1 -1
  77. package/dist/__tests__/release-manager-audit-events.test.d.ts +2 -0
  78. package/dist/__tests__/release-manager-audit-events.test.d.ts.map +1 -0
  79. package/dist/__tests__/release-manager-audit-events.test.js +64 -0
  80. package/dist/__tests__/release-manager-audit-events.test.js.map +1 -0
  81. package/dist/__tests__/release-manager-config.test.d.ts +2 -0
  82. package/dist/__tests__/release-manager-config.test.d.ts.map +1 -0
  83. package/dist/__tests__/release-manager-config.test.js +56 -0
  84. package/dist/__tests__/release-manager-config.test.js.map +1 -0
  85. package/dist/__tests__/release-manager-decide.test.d.ts +2 -0
  86. package/dist/__tests__/release-manager-decide.test.d.ts.map +1 -0
  87. package/dist/__tests__/release-manager-decide.test.js +102 -0
  88. package/dist/__tests__/release-manager-decide.test.js.map +1 -0
  89. package/dist/__tests__/release-manager-github.test.d.ts +2 -0
  90. package/dist/__tests__/release-manager-github.test.d.ts.map +1 -0
  91. package/dist/__tests__/release-manager-github.test.js +83 -0
  92. package/dist/__tests__/release-manager-github.test.js.map +1 -0
  93. package/dist/__tests__/release-manager-license-gate.test.d.ts +2 -0
  94. package/dist/__tests__/release-manager-license-gate.test.d.ts.map +1 -0
  95. package/dist/__tests__/release-manager-license-gate.test.js +25 -0
  96. package/dist/__tests__/release-manager-license-gate.test.js.map +1 -0
  97. package/dist/__tests__/release-manager-scheduler.test.d.ts +2 -0
  98. package/dist/__tests__/release-manager-scheduler.test.d.ts.map +1 -0
  99. package/dist/__tests__/release-manager-scheduler.test.js +395 -0
  100. package/dist/__tests__/release-manager-scheduler.test.js.map +1 -0
  101. package/dist/__tests__/release-manager-slack-handler.test.d.ts +2 -0
  102. package/dist/__tests__/release-manager-slack-handler.test.d.ts.map +1 -0
  103. package/dist/__tests__/release-manager-slack-handler.test.js +175 -0
  104. package/dist/__tests__/release-manager-slack-handler.test.js.map +1 -0
  105. package/dist/__tests__/release-manager-triggers.test.d.ts +2 -0
  106. package/dist/__tests__/release-manager-triggers.test.d.ts.map +1 -0
  107. package/dist/__tests__/release-manager-triggers.test.js +67 -0
  108. package/dist/__tests__/release-manager-triggers.test.js.map +1 -0
  109. package/dist/__tests__/release-manager-versioning.test.d.ts +2 -0
  110. package/dist/__tests__/release-manager-versioning.test.d.ts.map +1 -0
  111. package/dist/__tests__/release-manager-versioning.test.js +51 -0
  112. package/dist/__tests__/release-manager-versioning.test.js.map +1 -0
  113. package/dist/__tests__/reproduce-bec113-pagination-warning.test.js +1 -0
  114. package/dist/__tests__/reproduce-bec113-pagination-warning.test.js.map +1 -1
  115. package/dist/__tests__/reproduce-bec62.test.js +1 -0
  116. package/dist/__tests__/reproduce-bec62.test.js.map +1 -1
  117. package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js +2 -0
  118. package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js.map +1 -1
  119. package/dist/__tests__/review-prompt.test.d.ts +2 -0
  120. package/dist/__tests__/review-prompt.test.d.ts.map +1 -0
  121. package/dist/__tests__/review-prompt.test.js +88 -0
  122. package/dist/__tests__/review-prompt.test.js.map +1 -0
  123. package/dist/__tests__/review-provider-registry.test.d.ts +2 -0
  124. package/dist/__tests__/review-provider-registry.test.d.ts.map +1 -0
  125. package/dist/__tests__/review-provider-registry.test.js +61 -0
  126. package/dist/__tests__/review-provider-registry.test.js.map +1 -0
  127. package/dist/__tests__/runner-fanout-integration.test.d.ts +2 -0
  128. package/dist/__tests__/runner-fanout-integration.test.d.ts.map +1 -0
  129. package/dist/__tests__/runner-fanout-integration.test.js +107 -0
  130. package/dist/__tests__/runner-fanout-integration.test.js.map +1 -0
  131. package/dist/__tests__/webhook-handler.test.js +1 -0
  132. package/dist/__tests__/webhook-handler.test.js.map +1 -1
  133. package/dist/audit/events.d.ts +54 -0
  134. package/dist/audit/events.d.ts.map +1 -1
  135. package/dist/audit/events.js +100 -0
  136. package/dist/audit/events.js.map +1 -1
  137. package/dist/audit/writer.d.ts +22 -8
  138. package/dist/audit/writer.d.ts.map +1 -1
  139. package/dist/audit/writer.js +22 -8
  140. package/dist/audit/writer.js.map +1 -1
  141. package/dist/cost/aggregate.d.ts.map +1 -1
  142. package/dist/cost/aggregate.js +14 -2
  143. package/dist/cost/aggregate.js.map +1 -1
  144. package/dist/cost/csv.d.ts.map +1 -1
  145. package/dist/cost/csv.js +14 -2
  146. package/dist/cost/csv.js.map +1 -1
  147. package/dist/cost/per-run.d.ts +11 -0
  148. package/dist/cost/per-run.d.ts.map +1 -1
  149. package/dist/cost/per-run.js +21 -8
  150. package/dist/cost/per-run.js.map +1 -1
  151. package/dist/cost/rollup.d.ts.map +1 -1
  152. package/dist/cost/rollup.js +14 -2
  153. package/dist/cost/rollup.js.map +1 -1
  154. package/dist/db/client.d.ts.map +1 -1
  155. package/dist/db/client.js +20 -1
  156. package/dist/db/client.js.map +1 -1
  157. package/dist/db/migrations/postgres/009_review_model_runs.sql +18 -0
  158. package/dist/db/migrations/postgres/010_release_manager.sql +38 -0
  159. package/dist/db/migrations/postgres/011_qa_run_columns.sql +8 -0
  160. package/dist/db/migrations/postgres/012_qa_gap_issues.sql +18 -0
  161. package/dist/db/migrations/sqlite/008_review_model_runs.sql +18 -0
  162. package/dist/db/migrations/sqlite/009_release_manager.sql +43 -0
  163. package/dist/db/migrations/sqlite/010_qa_run_columns.sql +9 -0
  164. package/dist/db/migrations/sqlite/011_qa_gap_issues.sql +22 -0
  165. package/dist/db/review-model-runs.d.ts +4 -0
  166. package/dist/db/review-model-runs.d.ts.map +1 -0
  167. package/dist/db/review-model-runs.js +25 -0
  168. package/dist/db/review-model-runs.js.map +1 -0
  169. package/dist/db/schema.d.ts +761 -0
  170. package/dist/db/schema.d.ts.map +1 -1
  171. package/dist/db/schema.js +67 -0
  172. package/dist/db/schema.js.map +1 -1
  173. package/dist/executor/executor.d.ts.map +1 -1
  174. package/dist/executor/executor.js +2 -0
  175. package/dist/executor/executor.js.map +1 -1
  176. package/dist/executor/review/agentic-deep-review.d.ts +6 -0
  177. package/dist/executor/review/agentic-deep-review.d.ts.map +1 -0
  178. package/dist/executor/review/agentic-deep-review.js +37 -0
  179. package/dist/executor/review/agentic-deep-review.js.map +1 -0
  180. package/dist/executor/review/openrouter-client.d.ts +23 -0
  181. package/dist/executor/review/openrouter-client.d.ts.map +1 -0
  182. package/dist/executor/review/openrouter-client.js +34 -0
  183. package/dist/executor/review/openrouter-client.js.map +1 -0
  184. package/dist/executor/review/openrouter-fanout.d.ts +17 -0
  185. package/dist/executor/review/openrouter-fanout.d.ts.map +1 -0
  186. package/dist/executor/review/openrouter-fanout.js +84 -0
  187. package/dist/executor/review/openrouter-fanout.js.map +1 -0
  188. package/dist/executor/review/post-fanout-comments.d.ts +4 -0
  189. package/dist/executor/review/post-fanout-comments.d.ts.map +1 -0
  190. package/dist/executor/review/post-fanout-comments.js +45 -0
  191. package/dist/executor/review/post-fanout-comments.js.map +1 -0
  192. package/dist/executor/review/review-prompt.d.ts +21 -0
  193. package/dist/executor/review/review-prompt.d.ts.map +1 -0
  194. package/dist/executor/review/review-prompt.js +130 -0
  195. package/dist/executor/review/review-prompt.js.map +1 -0
  196. package/dist/executor/review/review-provider.d.ts +27 -0
  197. package/dist/executor/review/review-provider.d.ts.map +1 -0
  198. package/dist/executor/review/review-provider.js +36 -0
  199. package/dist/executor/review/review-provider.js.map +1 -0
  200. package/dist/executor/review/workdir-snapshot.d.ts +13 -0
  201. package/dist/executor/review/workdir-snapshot.d.ts.map +1 -0
  202. package/dist/executor/review/workdir-snapshot.js +24 -0
  203. package/dist/executor/review/workdir-snapshot.js.map +1 -0
  204. package/dist/index.d.ts +4 -0
  205. package/dist/index.d.ts.map +1 -1
  206. package/dist/index.js +4 -0
  207. package/dist/index.js.map +1 -1
  208. package/dist/license.d.ts.map +1 -1
  209. package/dist/license.js +1 -0
  210. package/dist/license.js.map +1 -1
  211. package/dist/pipeline/review-providers-runner.d.ts +31 -0
  212. package/dist/pipeline/review-providers-runner.d.ts.map +1 -0
  213. package/dist/pipeline/review-providers-runner.js +64 -0
  214. package/dist/pipeline/review-providers-runner.js.map +1 -0
  215. package/dist/pipeline/runner.d.ts.map +1 -1
  216. package/dist/pipeline/runner.js +99 -7
  217. package/dist/pipeline/runner.js.map +1 -1
  218. package/dist/pm/actions/promote.d.ts +12 -0
  219. package/dist/pm/actions/promote.d.ts.map +1 -1
  220. package/dist/pm/actions/promote.js +27 -2
  221. package/dist/pm/actions/promote.js.map +1 -1
  222. package/dist/pm/actions/resolve-approvals.js +3 -3
  223. package/dist/pm/actions/resolve-approvals.js.map +1 -1
  224. package/dist/pm/actions/triage.js +2 -2
  225. package/dist/pm/actions/triage.js.map +1 -1
  226. package/dist/pm/scheduler.d.ts.map +1 -1
  227. package/dist/pm/scheduler.js +5 -3
  228. package/dist/pm/scheduler.js.map +1 -1
  229. package/dist/pm/slack-interface.d.ts +8 -0
  230. package/dist/pm/slack-interface.d.ts.map +1 -1
  231. package/dist/pm/slack-interface.js +20 -3
  232. package/dist/pm/slack-interface.js.map +1 -1
  233. package/dist/pm/types.d.ts +1 -0
  234. package/dist/pm/types.d.ts.map +1 -1
  235. package/dist/pm/types.js +6 -0
  236. package/dist/pm/types.js.map +1 -1
  237. package/dist/qa/gap.d.ts +29 -0
  238. package/dist/qa/gap.d.ts.map +1 -0
  239. package/dist/qa/gap.js +91 -0
  240. package/dist/qa/gap.js.map +1 -0
  241. package/dist/qa/github.d.ts +77 -0
  242. package/dist/qa/github.d.ts.map +1 -0
  243. package/dist/qa/github.js +106 -0
  244. package/dist/qa/github.js.map +1 -0
  245. package/dist/qa/index.d.ts +4 -0
  246. package/dist/qa/index.d.ts.map +1 -0
  247. package/dist/qa/index.js +4 -0
  248. package/dist/qa/index.js.map +1 -0
  249. package/dist/qa/types.d.ts +44 -0
  250. package/dist/qa/types.d.ts.map +1 -0
  251. package/dist/qa/types.js +12 -0
  252. package/dist/qa/types.js.map +1 -0
  253. package/dist/release-manager/decide.d.ts +26 -0
  254. package/dist/release-manager/decide.d.ts.map +1 -0
  255. package/dist/release-manager/decide.js +58 -0
  256. package/dist/release-manager/decide.js.map +1 -0
  257. package/dist/release-manager/github.d.ts +47 -0
  258. package/dist/release-manager/github.d.ts.map +1 -0
  259. package/dist/release-manager/github.js +66 -0
  260. package/dist/release-manager/github.js.map +1 -0
  261. package/dist/release-manager/index.d.ts +9 -0
  262. package/dist/release-manager/index.d.ts.map +1 -0
  263. package/dist/release-manager/index.js +9 -0
  264. package/dist/release-manager/index.js.map +1 -0
  265. package/dist/release-manager/scheduler.d.ts +30 -0
  266. package/dist/release-manager/scheduler.d.ts.map +1 -0
  267. package/dist/release-manager/scheduler.js +427 -0
  268. package/dist/release-manager/scheduler.js.map +1 -0
  269. package/dist/release-manager/slack-handler.d.ts +39 -0
  270. package/dist/release-manager/slack-handler.d.ts.map +1 -0
  271. package/dist/release-manager/slack-handler.js +124 -0
  272. package/dist/release-manager/slack-handler.js.map +1 -0
  273. package/dist/release-manager/state.d.ts +18 -0
  274. package/dist/release-manager/state.d.ts.map +1 -0
  275. package/dist/release-manager/state.js +154 -0
  276. package/dist/release-manager/state.js.map +1 -0
  277. package/dist/release-manager/triggers.d.ts +32 -0
  278. package/dist/release-manager/triggers.d.ts.map +1 -0
  279. package/dist/release-manager/triggers.js +82 -0
  280. package/dist/release-manager/triggers.js.map +1 -0
  281. package/dist/release-manager/types.d.ts +79 -0
  282. package/dist/release-manager/types.d.ts.map +1 -0
  283. package/dist/release-manager/types.js +48 -0
  284. package/dist/release-manager/types.js.map +1 -0
  285. package/dist/release-manager/versioning.d.ts +20 -0
  286. package/dist/release-manager/versioning.d.ts.map +1 -0
  287. package/dist/release-manager/versioning.js +60 -0
  288. package/dist/release-manager/versioning.js.map +1 -0
  289. package/dist/types.d.ts +48 -0
  290. package/dist/types.d.ts.map +1 -1
  291. package/dist/types.js +8 -0
  292. package/dist/types.js.map +1 -1
  293. package/package.json +3 -1
@@ -0,0 +1,154 @@
1
+ import { and, eq, isNull, desc, gte } from "drizzle-orm";
2
+ import { releaseApprovals, releaseDecisions } from "../db/schema.js";
3
+ import { createLogger } from "../logger.js";
4
+ import { parseRepoFromUrl } from "./github.js";
5
+ const log = createLogger({ component: "ReleaseManager:state" });
6
+ /**
7
+ * Single GitHub call surface for one tick. Wrapped in try/catch by the
8
+ * scheduler — failures here surface as "ci_check_unavailable" or are
9
+ * re-thrown depending on which API failed.
10
+ */
11
+ export async function collectState(input) {
12
+ const { octokit, db, repoUrl, branch, approvalTtlMs } = input;
13
+ const { owner, repo } = parseRepoFromUrl(repoUrl);
14
+ // 1. HEAD SHA of the configured branch
15
+ const branchRes = await octokit.repos.getBranch({ owner, repo, branch });
16
+ const headSha = branchRes.data.commit.sha;
17
+ // 2. Latest tag (matching v*.*.* convention).
18
+ let lastTag = null;
19
+ let lastTagSha = null;
20
+ let lastTagAt = null;
21
+ try {
22
+ const tagsRes = await octokit.repos.listTags({ owner, repo, per_page: 30 });
23
+ const candidate = tagsRes.data.find((t) => /^v?\d+\.\d+\.\d+$/.test(t.name));
24
+ if (candidate) {
25
+ lastTag = candidate.name.startsWith("v") ? candidate.name : `v${candidate.name}`;
26
+ lastTagSha = candidate.commit.sha;
27
+ // Tag commit timestamp — use the commit's committer date for a wall-clock anchor.
28
+ const commit = await octokit.repos.getCommit({ owner, repo, ref: lastTagSha });
29
+ const dateStr = commit.data?.commit?.committer?.date ?? commit.data?.commit?.author?.date;
30
+ lastTagAt = dateStr ? new Date(dateStr) : null;
31
+ }
32
+ }
33
+ catch (err) {
34
+ log.warn({ err, repoUrl, branch }, "listTags failed — treating as no-tag");
35
+ }
36
+ // 3. Manual-tag detection: did any release_decisions with kind="fire" record
37
+ // a fired_tag, and does the current latest tag differ from it?
38
+ const lastFired = await db
39
+ .select({ firedTag: releaseDecisions.firedTag })
40
+ .from(releaseDecisions)
41
+ .where(and(eq(releaseDecisions.repoUrl, repoUrl), eq(releaseDecisions.branch, branch), eq(releaseDecisions.decision, "fire")))
42
+ .orderBy(desc(releaseDecisions.decidedAt))
43
+ .limit(1);
44
+ const lastFiredTag = lastFired?.[0]?.firedTag ?? null;
45
+ const manualTagDetected = lastTag !== null && lastFiredTag !== null && lastTag !== lastFiredTag;
46
+ // 4. Commits between lastTagSha and headSha (proxy for "merged PRs since last tag").
47
+ let mergedCommitsSinceLastTag = 0;
48
+ let commitsSinceLastTag = [];
49
+ if (lastTagSha) {
50
+ try {
51
+ const cmp = await octokit.repos.compareCommits({ owner, repo, base: lastTagSha, head: headSha });
52
+ const commits = cmp.data.commits ?? [];
53
+ mergedCommitsSinceLastTag = commits.length;
54
+ commitsSinceLastTag = commits.map((c) => ({ message: c?.commit?.message ?? "" }));
55
+ }
56
+ catch (err) {
57
+ log.warn({ err, lastTagSha, headSha }, "compareCommits failed");
58
+ }
59
+ }
60
+ else {
61
+ // No prior tag — count all commits on branch (cap at first page; v2 paginates).
62
+ try {
63
+ const list = await octokit.repos.listCommits({ owner, repo, sha: branch, per_page: 100 });
64
+ mergedCommitsSinceLastTag = (list.data ?? []).length;
65
+ commitsSinceLastTag = (list.data ?? []).map((c) => ({
66
+ message: c?.commit?.message ?? "",
67
+ }));
68
+ }
69
+ catch (err) {
70
+ log.warn({ err }, "listCommits failed");
71
+ }
72
+ }
73
+ // 5. CI status for headSha — aggregate check_runs.
74
+ let ciStatus = "unavailable";
75
+ let ciGreenSince = null;
76
+ try {
77
+ const checks = await octokit.checks.listForRef({ owner, repo, ref: headSha, per_page: 100 });
78
+ const runs = (checks.data?.check_runs ?? []);
79
+ if (runs.length === 0) {
80
+ ciStatus = "unavailable";
81
+ }
82
+ else {
83
+ const allCompleted = runs.every((r) => r.status === "completed");
84
+ const allSuccess = runs.every((r) => r.conclusion === "success");
85
+ if (!allCompleted) {
86
+ ciStatus = "not-green";
87
+ }
88
+ else if (allSuccess) {
89
+ ciStatus = "green";
90
+ // ciGreenSince = latest completed_at across all runs
91
+ const completedAts = runs
92
+ .map((r) => (r.completed_at ? new Date(r.completed_at).getTime() : null))
93
+ .filter((t) => t !== null);
94
+ if (completedAts.length > 0) {
95
+ ciGreenSince = new Date(Math.max(...completedAts));
96
+ }
97
+ }
98
+ else {
99
+ ciStatus = "not-green";
100
+ }
101
+ }
102
+ }
103
+ catch (err) {
104
+ log.warn({ err }, "checks.listForRef failed — ciStatus unavailable");
105
+ ciStatus = "unavailable";
106
+ }
107
+ // 6. Fresh approval lookup. "Fresh" = consumed_at IS NULL AND approved_at within approvalTtlMs.
108
+ // Use drizzle's gte() so the cross-dialect crossTimestamp serializer converts
109
+ // Date → INTEGER epoch on SQLite and Date → TIMESTAMPTZ on Postgres correctly.
110
+ const cutoff = new Date(Date.now() - approvalTtlMs);
111
+ const freshRows = await db
112
+ .select({ approvedBy: releaseApprovals.approvedBy, approvedAt: releaseApprovals.approvedAt })
113
+ .from(releaseApprovals)
114
+ .where(and(eq(releaseApprovals.repoUrl, repoUrl), eq(releaseApprovals.branch, branch), isNull(releaseApprovals.consumedAt), gte(releaseApprovals.approvedAt, cutoff)))
115
+ .orderBy(desc(releaseApprovals.approvedAt))
116
+ .limit(1);
117
+ const hasFreshApproval = (freshRows?.length ?? 0) > 0;
118
+ const freshApprovalApprover = hasFreshApproval ? freshRows[0].approvedBy : null;
119
+ // 7. BEC-136: most-recent in-flight QA run snapshot.
120
+ const qaRunRows = await db
121
+ .select({
122
+ qaRunId: releaseDecisions.qaRunId,
123
+ qaRunSha: releaseDecisions.qaRunSha,
124
+ decidedAt: releaseDecisions.decidedAt,
125
+ })
126
+ .from(releaseDecisions)
127
+ .where(and(eq(releaseDecisions.repoUrl, repoUrl), eq(releaseDecisions.branch, branch)))
128
+ .orderBy(desc(releaseDecisions.decidedAt))
129
+ .limit(20);
130
+ // Take the most recent row that actually has a qa_run_id.
131
+ const latestQaRow = qaRunRows.find((r) => r.qaRunId !== null && r.qaRunId !== undefined);
132
+ const qaRun = latestQaRow
133
+ ? {
134
+ runId: latestQaRow.qaRunId,
135
+ runSha: latestQaRow.qaRunSha,
136
+ triggeredAt: latestQaRow.decidedAt instanceof Date ? latestQaRow.decidedAt : new Date(latestQaRow.decidedAt),
137
+ }
138
+ : null;
139
+ return {
140
+ lastTag,
141
+ lastTagSha,
142
+ lastTagAt,
143
+ headSha,
144
+ mergedCommitsSinceLastTag,
145
+ commitsSinceLastTag,
146
+ ciStatus,
147
+ ciGreenSince,
148
+ hasFreshApproval,
149
+ freshApprovalApprover,
150
+ manualTagDetected,
151
+ qaRun,
152
+ };
153
+ }
154
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/release-manager/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface TriggerResult {
2
+ pass: boolean;
3
+ reason: string;
4
+ }
5
+ export declare function evalMergedPRsSince(actualCount: number, threshold: number): TriggerResult;
6
+ export declare function evalTimeSinceLastHours(lastTagAt: Date | null, thresholdHours: number, now?: Date): TriggerResult;
7
+ export declare function evalCiGreenForMinutes(ciStatus: "green" | "not-green" | "unavailable", greenSince: Date | null, thresholdMinutes: number, now?: Date): TriggerResult;
8
+ export declare function evalRequireSlackApproval(required: boolean, hasFresh: boolean): TriggerResult;
9
+ import type { QaCheckConfig, QaRunSnapshot, QaTriggerResult } from "../qa/types.js";
10
+ export interface EvalQaCheckInput {
11
+ qaConfig: QaCheckConfig;
12
+ headSha: string;
13
+ /** Whether the configured workflow file exists at headSha (per workflowFileExists). */
14
+ workflowFileExists: boolean;
15
+ /** Most recent in-flight run snapshot, or null when nothing tracked. */
16
+ qaRun: QaRunSnapshot | null;
17
+ /** When qaRun is for current SHA AND the run has completed: the GitHub conclusion string. Null otherwise. */
18
+ runConclusion: string | null;
19
+ now?: Date;
20
+ }
21
+ /**
22
+ * Pure decision: given current state and qaCheck config, return one of 6 result kinds.
23
+ *
24
+ * Ordering inside the function:
25
+ * 1. If workflow file is missing → qa_no_workflow (file gap issue + skip)
26
+ * 2. If no in-flight run OR the run is for a stale SHA → qa_needs_trigger (dispatch)
27
+ * 3. If completed: success → pass:true, else → qa_failed (with conclusion)
28
+ * 4. If still running and elapsed > timeoutMinutes → qa_timed_out
29
+ * 5. Otherwise → qa_running (await next tick)
30
+ */
31
+ export declare function evalQaCheck(input: EvalQaCheckInput): QaTriggerResult;
32
+ //# sourceMappingURL=triggers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../src/release-manager/triggers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,aAAa,CAKf;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,IAAI,GAAG,IAAI,EACtB,cAAc,EAAE,MAAM,EACtB,GAAG,GAAE,IAAiB,GACrB,aAAa,CAef;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,GAAG,WAAW,GAAG,aAAa,EAC/C,UAAU,EAAE,IAAI,GAAG,IAAI,EACvB,gBAAgB,EAAE,MAAM,EACxB,GAAG,GAAE,IAAiB,GACrB,aAAa,CAkBf;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,OAAO,GAChB,aAAa,CAIf;AAED,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,kBAAkB,EAAE,OAAO,CAAC;IAC5B,wEAAwE;IACxE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,6GAA6G;IAC7G,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe,CA0BpE"}
@@ -0,0 +1,82 @@
1
+ export function evalMergedPRsSince(actualCount, threshold) {
2
+ if (actualCount >= threshold) {
3
+ return { pass: true, reason: `mergedPRsSince=${threshold} (have ${actualCount})` };
4
+ }
5
+ return { pass: false, reason: `mergedPRsSince not met (${actualCount}/${threshold})` };
6
+ }
7
+ export function evalTimeSinceLastHours(lastTagAt, thresholdHours, now = new Date()) {
8
+ if (lastTagAt === null) {
9
+ return { pass: true, reason: "no prior tag" };
10
+ }
11
+ const elapsedHours = (now.getTime() - lastTagAt.getTime()) / 3600 / 1000;
12
+ if (elapsedHours >= thresholdHours) {
13
+ return {
14
+ pass: true,
15
+ reason: `timeSinceLastHours=${thresholdHours} (have ${elapsedHours.toFixed(1)}h)`,
16
+ };
17
+ }
18
+ return {
19
+ pass: false,
20
+ reason: `timeSinceLastHours not met (${elapsedHours.toFixed(1)}h/${thresholdHours}h)`,
21
+ };
22
+ }
23
+ export function evalCiGreenForMinutes(ciStatus, greenSince, thresholdMinutes, now = new Date()) {
24
+ if (ciStatus === "unavailable") {
25
+ return { pass: false, reason: "ci_check_unavailable" };
26
+ }
27
+ if (ciStatus !== "green" || greenSince === null) {
28
+ return { pass: false, reason: "ci_not_green" };
29
+ }
30
+ const elapsedMin = (now.getTime() - greenSince.getTime()) / 60 / 1000;
31
+ if (elapsedMin >= thresholdMinutes) {
32
+ return {
33
+ pass: true,
34
+ reason: `ciGreenForMinutes=${thresholdMinutes} (${elapsedMin.toFixed(0)}m green)`,
35
+ };
36
+ }
37
+ return {
38
+ pass: false,
39
+ reason: `ciGreenForMinutes not met (${elapsedMin.toFixed(0)}m/${thresholdMinutes}m)`,
40
+ };
41
+ }
42
+ export function evalRequireSlackApproval(required, hasFresh) {
43
+ if (!required)
44
+ return { pass: true, reason: "approval not required" };
45
+ if (hasFresh)
46
+ return { pass: true, reason: "approval is fresh" };
47
+ return { pass: false, reason: "no_fresh_approval" };
48
+ }
49
+ /**
50
+ * Pure decision: given current state and qaCheck config, return one of 6 result kinds.
51
+ *
52
+ * Ordering inside the function:
53
+ * 1. If workflow file is missing → qa_no_workflow (file gap issue + skip)
54
+ * 2. If no in-flight run OR the run is for a stale SHA → qa_needs_trigger (dispatch)
55
+ * 3. If completed: success → pass:true, else → qa_failed (with conclusion)
56
+ * 4. If still running and elapsed > timeoutMinutes → qa_timed_out
57
+ * 5. Otherwise → qa_running (await next tick)
58
+ */
59
+ export function evalQaCheck(input) {
60
+ const { qaConfig, headSha, workflowFileExists, qaRun, runConclusion, now = new Date() } = input;
61
+ if (!workflowFileExists) {
62
+ return { pass: false, reason: "qa_no_workflow" };
63
+ }
64
+ if (qaRun === null || qaRun.runSha !== headSha) {
65
+ return { pass: false, reason: "qa_needs_trigger" };
66
+ }
67
+ // We have an in-flight run for current SHA.
68
+ if (runConclusion !== null) {
69
+ if (runConclusion === "success") {
70
+ return { pass: true, reason: "qa passed" };
71
+ }
72
+ return { pass: false, reason: "qa_failed", runId: qaRun.runId, conclusion: runConclusion };
73
+ }
74
+ // Still running — check timeout.
75
+ const elapsedMs = now.getTime() - qaRun.triggeredAt.getTime();
76
+ const timeoutMs = qaConfig.timeoutMinutes * 60 * 1000;
77
+ if (elapsedMs > timeoutMs) {
78
+ return { pass: false, reason: "qa_timed_out", runId: qaRun.runId };
79
+ }
80
+ return { pass: false, reason: "qa_running", runId: qaRun.runId };
81
+ }
82
+ //# sourceMappingURL=triggers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../src/release-manager/triggers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { z } from "zod";
2
+ import { type QaRunSnapshot, type QaTriggerResult } from "../qa/types.js";
3
+ export declare const ReleaseManagerTriggersSchema: z.ZodObject<{
4
+ mergedPRsSince: z.ZodOptional<z.ZodNumber>;
5
+ timeSinceLastHours: z.ZodOptional<z.ZodNumber>;
6
+ ciGreenForMinutes: z.ZodOptional<z.ZodNumber>;
7
+ requireSlackApproval: z.ZodDefault<z.ZodBoolean>;
8
+ qaCheck: z.ZodOptional<z.ZodObject<{
9
+ workflow: z.ZodString;
10
+ timeoutMinutes: z.ZodDefault<z.ZodNumber>;
11
+ linearTeamId: z.ZodString;
12
+ workflowInputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
13
+ }, z.core.$strip>>;
14
+ }, z.core.$strip>;
15
+ export type ReleaseManagerTriggers = z.infer<typeof ReleaseManagerTriggersSchema>;
16
+ export declare const ReleaseManagerConfigSchema: z.ZodObject<{
17
+ enabled: z.ZodBoolean;
18
+ schedule: z.ZodDefault<z.ZodString>;
19
+ triggers: z.ZodObject<{
20
+ mergedPRsSince: z.ZodOptional<z.ZodNumber>;
21
+ timeSinceLastHours: z.ZodOptional<z.ZodNumber>;
22
+ ciGreenForMinutes: z.ZodOptional<z.ZodNumber>;
23
+ requireSlackApproval: z.ZodDefault<z.ZodBoolean>;
24
+ qaCheck: z.ZodOptional<z.ZodObject<{
25
+ workflow: z.ZodString;
26
+ timeoutMinutes: z.ZodDefault<z.ZodNumber>;
27
+ linearTeamId: z.ZodString;
28
+ workflowInputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
29
+ }, z.core.$strip>>;
30
+ }, z.core.$strip>;
31
+ versionBump: z.ZodDefault<z.ZodEnum<{
32
+ patch: "patch";
33
+ minor: "minor";
34
+ "conventional-commits": "conventional-commits";
35
+ }>>;
36
+ slackChannel: z.ZodOptional<z.ZodString>;
37
+ branch: z.ZodDefault<z.ZodString>;
38
+ paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
39
+ }, z.core.$strip>;
40
+ export type ReleaseManagerConfig = z.infer<typeof ReleaseManagerConfigSchema>;
41
+ /** Computed snapshot of the world at decision time. */
42
+ export interface CollectedState {
43
+ /** Last tag string in 'vX.Y.Z' form, or null if no tags exist yet. */
44
+ lastTag: string | null;
45
+ lastTagSha: string | null;
46
+ lastTagAt: Date | null;
47
+ /** SHA of the tip of the configured branch. */
48
+ headSha: string;
49
+ /** Count of commits between lastTagSha and headSha (a proxy for "merged PRs since last tag"). */
50
+ mergedCommitsSinceLastTag: number;
51
+ /** Subset of commit messages between lastTagSha and headSha — drives conventional-commits scan. */
52
+ commitsSinceLastTag: Array<{
53
+ message: string;
54
+ }>;
55
+ /** Aggregated CI status for headSha. "green" iff all required check_runs are "success". */
56
+ ciStatus: "green" | "not-green" | "unavailable";
57
+ /** Time at which CI first became green for headSha. null when not green or unavailable. */
58
+ ciGreenSince: Date | null;
59
+ /** True iff a fresh, un-consumed approval row exists for (repo, branch). */
60
+ hasFreshApproval: boolean;
61
+ /** Slack user id of the most recent fresh approval (for audit). null if hasFreshApproval=false. */
62
+ freshApprovalApprover: string | null;
63
+ /** True iff the latest tag in the repo is newer than what we last fired. Re-baselines counters. */
64
+ manualTagDetected: boolean;
65
+ /** BEC-136: in-flight QA run for this (repo, branch). Null when nothing in flight. */
66
+ qaRun: QaRunSnapshot | null;
67
+ }
68
+ export type DecisionResult = {
69
+ kind: "fire";
70
+ reason: string;
71
+ } | {
72
+ kind: "skip";
73
+ reason: string;
74
+ qaActionNeeded?: QaTriggerResult;
75
+ } | {
76
+ kind: "awaiting-approval";
77
+ reason: string;
78
+ };
79
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/release-manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAuB,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE/F,eAAO,MAAM,4BAA4B;;;;;;;;;;;iBAOvC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;iBAqCnC,CAAC;AACL,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,yBAAyB,EAAE,MAAM,CAAC;IAClC,mGAAmG;IACnG,mBAAmB,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,2FAA2F;IAC3F,QAAQ,EAAE,OAAO,GAAG,WAAW,GAAG,aAAa,CAAC;IAChD,2FAA2F;IAC3F,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,4EAA4E;IAC5E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mGAAmG;IACnG,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,mGAAmG;IACnG,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,eAAe,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ import { QaCheckConfigSchema } from "../qa/types.js";
3
+ export const ReleaseManagerTriggersSchema = z.object({
4
+ mergedPRsSince: z.number().int().positive().optional(),
5
+ timeSinceLastHours: z.number().int().positive().optional(),
6
+ ciGreenForMinutes: z.number().int().positive().optional(),
7
+ requireSlackApproval: z.boolean().default(false),
8
+ /** BEC-136: trigger workflow + gate release on its result. */
9
+ qaCheck: QaCheckConfigSchema.optional(),
10
+ });
11
+ export const ReleaseManagerConfigSchema = z
12
+ .object({
13
+ enabled: z.boolean(),
14
+ /** Cron expression — defaults to every 30 minutes. Parsed by croner at scheduler start. */
15
+ schedule: z.string().default("*/30 * * * *"),
16
+ triggers: ReleaseManagerTriggersSchema,
17
+ /** Version bump policy. "major" is intentionally absent — humans must retag manually. */
18
+ versionBump: z.enum(["patch", "minor", "conventional-commits"]).default("patch"),
19
+ /** Required when triggers.requireSlackApproval=true. Channel ID or "#name". */
20
+ slackChannel: z.string().optional(),
21
+ /** Branch the agent watches and tags from. */
22
+ branch: z.string().default("main"),
23
+ /** Optional path globs — only fire if PRs since last tag touched these files. v2 may add this. */
24
+ paths: z.array(z.string()).optional(),
25
+ })
26
+ .superRefine((cfg, ctx) => {
27
+ const t = cfg.triggers;
28
+ const anyTrigger = t.mergedPRsSince !== undefined ||
29
+ t.timeSinceLastHours !== undefined ||
30
+ t.ciGreenForMinutes !== undefined ||
31
+ t.requireSlackApproval === true ||
32
+ t.qaCheck !== undefined;
33
+ if (!anyTrigger) {
34
+ ctx.addIssue({
35
+ code: z.ZodIssueCode.custom,
36
+ path: ["triggers"],
37
+ message: "at least one trigger field must be set (mergedPRsSince, timeSinceLastHours, ciGreenForMinutes, requireSlackApproval=true, or qaCheck)",
38
+ });
39
+ }
40
+ if (t.requireSlackApproval === true && !cfg.slackChannel) {
41
+ ctx.addIssue({
42
+ code: z.ZodIssueCode.custom,
43
+ path: ["slackChannel"],
44
+ message: "slackChannel is required when triggers.requireSlackApproval=true",
45
+ });
46
+ }
47
+ });
48
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/release-manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAA4C,MAAM,gBAAgB,CAAC;AAE/F,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACtD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1D,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACzD,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChD,8DAA8D;IAC9D,OAAO,EAAE,mBAAmB,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,2FAA2F;IAC3F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC;IAC5C,QAAQ,EAAE,4BAA4B;IACtC,yFAAyF;IACzF,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAChF,+EAA+E;IAC/E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,8CAA8C;IAC9C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAClC,kGAAkG;IAClG,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC;KACD,WAAW,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACxB,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC;IACvB,MAAM,UAAU,GACd,CAAC,CAAC,cAAc,KAAK,SAAS;QAC9B,CAAC,CAAC,kBAAkB,KAAK,SAAS;QAClC,CAAC,CAAC,iBAAiB,KAAK,SAAS;QACjC,CAAC,CAAC,oBAAoB,KAAK,IAAI;QAC/B,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC;IAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,IAAI,EAAE,CAAC,UAAU,CAAC;YAClB,OAAO,EAAE,uIAAuI;SACjJ,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,CAAC,oBAAoB,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACzD,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,IAAI,EAAE,CAAC,cAAc,CAAC;YACtB,OAAO,EAAE,kEAAkE;SAC5E,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type BumpPolicy = "patch" | "minor" | "conventional-commits";
2
+ /**
3
+ * Compute the next semver tag given the current tag, the commits since it,
4
+ * and the configured bump policy.
5
+ *
6
+ * - "patch": always patch bump
7
+ * - "minor": always minor bump (patch resets to 0)
8
+ * - "conventional-commits": scan commit messages — major on BREAKING/!,
9
+ * minor on any feat:, else patch.
10
+ *
11
+ * Major bumps are ONLY produced by "conventional-commits". "patch" and
12
+ * "minor" never escalate to major — protects against runaway breaking
13
+ * releases from config alone (per spec §8 + D4).
14
+ *
15
+ * Returns the next tag with a leading "v".
16
+ */
17
+ export declare function bumpFromConfigAndCommits(current: string | null, commits: Array<{
18
+ message: string;
19
+ }>, policy: BumpPolicy): string;
20
+ //# sourceMappingURL=versioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.d.ts","sourceRoot":"","sources":["../../src/release-manager/versioning.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,sBAAsB,CAAC;AAwCpE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACnC,MAAM,EAAE,UAAU,GACjB,MAAM,CASR"}
@@ -0,0 +1,60 @@
1
+ const BREAKING_SUBJECT_RE = /^(feat|fix|refactor|perf)(\([^)]+\))?!:/m;
2
+ const BREAKING_BODY_RE = /BREAKING CHANGE:/m;
3
+ const FEAT_SUBJECT_RE = /^feat(\([^)]+\))?:/m;
4
+ function parseSemver(input) {
5
+ if (!input)
6
+ return { major: 0, minor: 0, patch: 0 };
7
+ const stripped = input.replace(/^v/, "");
8
+ const parts = stripped.split(".");
9
+ return {
10
+ major: parseInt(parts[0] ?? "0", 10) || 0,
11
+ minor: parseInt(parts[1] ?? "0", 10) || 0,
12
+ patch: parseInt(parts[2] ?? "0", 10) || 0,
13
+ };
14
+ }
15
+ function detectKindFromCommits(commits) {
16
+ let saw = "patch";
17
+ for (const c of commits) {
18
+ const msg = c.message ?? "";
19
+ if (BREAKING_SUBJECT_RE.test(msg) || BREAKING_BODY_RE.test(msg))
20
+ return "major";
21
+ if (FEAT_SUBJECT_RE.test(msg))
22
+ saw = "minor";
23
+ }
24
+ return saw;
25
+ }
26
+ function applyBump(v, kind) {
27
+ if (kind === "major")
28
+ return { major: v.major + 1, minor: 0, patch: 0 };
29
+ if (kind === "minor")
30
+ return { major: v.major, minor: v.minor + 1, patch: 0 };
31
+ return { major: v.major, minor: v.minor, patch: v.patch + 1 };
32
+ }
33
+ /**
34
+ * Compute the next semver tag given the current tag, the commits since it,
35
+ * and the configured bump policy.
36
+ *
37
+ * - "patch": always patch bump
38
+ * - "minor": always minor bump (patch resets to 0)
39
+ * - "conventional-commits": scan commit messages — major on BREAKING/!,
40
+ * minor on any feat:, else patch.
41
+ *
42
+ * Major bumps are ONLY produced by "conventional-commits". "patch" and
43
+ * "minor" never escalate to major — protects against runaway breaking
44
+ * releases from config alone (per spec §8 + D4).
45
+ *
46
+ * Returns the next tag with a leading "v".
47
+ */
48
+ export function bumpFromConfigAndCommits(current, commits, policy) {
49
+ const v = parseSemver(current);
50
+ let kind;
51
+ if (policy === "patch")
52
+ kind = "patch";
53
+ else if (policy === "minor")
54
+ kind = "minor";
55
+ else
56
+ kind = detectKindFromCommits(commits);
57
+ const next = applyBump(v, kind);
58
+ return `v${next.major}.${next.minor}.${next.patch}`;
59
+ }
60
+ //# sourceMappingURL=versioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.js","sourceRoot":"","sources":["../../src/release-manager/versioning.ts"],"names":[],"mappings":"AAGA,MAAM,mBAAmB,GAAG,0CAA0C,CAAC;AACvE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAC7C,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAQ9C,SAAS,WAAW,CAAC,KAAoB;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;QACzC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;QACzC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAmC;IAChE,IAAI,GAAG,GAAa,OAAO,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QAC5B,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;QAChF,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,GAAG,GAAG,OAAO,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,CAAS,EAAE,IAAc;IAC1C,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACxE,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC9E,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAsB,EACtB,OAAmC,EACnC,MAAkB;IAElB,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,IAAc,CAAC;IACnB,IAAI,MAAM,KAAK,OAAO;QAAE,IAAI,GAAG,OAAO,CAAC;SAClC,IAAI,MAAM,KAAK,OAAO;QAAE,IAAI,GAAG,OAAO,CAAC;;QACvC,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;AACtD,CAAC"}
package/dist/types.d.ts CHANGED
@@ -196,6 +196,30 @@ export declare const RepoConfigSchema: z.ZodObject<{
196
196
  autoTrigger: z.ZodOptional<z.ZodBoolean>;
197
197
  rerequestReview: z.ZodOptional<z.ZodBoolean>;
198
198
  }, z.core.$strip>>;
199
+ releaseManager: z.ZodOptional<z.ZodObject<{
200
+ enabled: z.ZodBoolean;
201
+ schedule: z.ZodDefault<z.ZodString>;
202
+ triggers: z.ZodObject<{
203
+ mergedPRsSince: z.ZodOptional<z.ZodNumber>;
204
+ timeSinceLastHours: z.ZodOptional<z.ZodNumber>;
205
+ ciGreenForMinutes: z.ZodOptional<z.ZodNumber>;
206
+ requireSlackApproval: z.ZodDefault<z.ZodBoolean>;
207
+ qaCheck: z.ZodOptional<z.ZodObject<{
208
+ workflow: z.ZodString;
209
+ timeoutMinutes: z.ZodDefault<z.ZodNumber>;
210
+ linearTeamId: z.ZodString;
211
+ workflowInputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
212
+ }, z.core.$strip>>;
213
+ }, z.core.$strip>;
214
+ versionBump: z.ZodDefault<z.ZodEnum<{
215
+ patch: "patch";
216
+ minor: "minor";
217
+ "conventional-commits": "conventional-commits";
218
+ }>>;
219
+ slackChannel: z.ZodOptional<z.ZodString>;
220
+ branch: z.ZodDefault<z.ZodString>;
221
+ paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
222
+ }, z.core.$strip>>;
199
223
  }, z.core.$strip>;
200
224
  export type RepoConfig = z.infer<typeof RepoConfigSchema>;
201
225
  export declare const TestResultSchema: z.ZodObject<{
@@ -359,6 +383,10 @@ export interface StageResult {
359
383
  outputTokens: number;
360
384
  turns: number;
361
385
  errorMessage?: string;
386
+ /** ID of the `stage_runs` row created for this execution. Used by callers that
387
+ * need to associate per-stage artifacts (e.g. `review_model_runs`) with the
388
+ * same row the executor inserted. Always populated by `executeStage`. */
389
+ stageRunId: string;
362
390
  }
363
391
  export interface PipelineRun {
364
392
  id: string;
@@ -450,6 +478,15 @@ export declare const AuditEventTypeSchema: z.ZodEnum<{
450
478
  "policy.cost_exceeded": "policy.cost_exceeded";
451
479
  "policy.override_used": "policy.override_used";
452
480
  "policy.reviewers_requested": "policy.reviewers_requested";
481
+ "release.fired": "release.fired";
482
+ "release.skipped": "release.skipped";
483
+ "release.approved": "release.approved";
484
+ "release.tag_conflict": "release.tag_conflict";
485
+ "release.partial": "release.partial";
486
+ "slack.post_failed": "slack.post_failed";
487
+ "qa.run_triggered": "qa.run_triggered";
488
+ "qa.run_completed": "qa.run_completed";
489
+ "qa.gap_issue_filed": "qa.gap_issue_filed";
453
490
  }>;
454
491
  export type AuditEventType = z.infer<typeof AuditEventTypeSchema>;
455
492
  export declare const AuditActorTypeSchema: z.ZodEnum<{
@@ -458,6 +495,7 @@ export declare const AuditActorTypeSchema: z.ZodEnum<{
458
495
  webhook: "webhook";
459
496
  "dashboard-user": "dashboard-user";
460
497
  cli: "cli";
498
+ "release-manager": "release-manager";
461
499
  }>;
462
500
  export type AuditActorType = z.infer<typeof AuditActorTypeSchema>;
463
501
  export declare const AuditEventSchema: z.ZodObject<{
@@ -487,6 +525,15 @@ export declare const AuditEventSchema: z.ZodObject<{
487
525
  "policy.cost_exceeded": "policy.cost_exceeded";
488
526
  "policy.override_used": "policy.override_used";
489
527
  "policy.reviewers_requested": "policy.reviewers_requested";
528
+ "release.fired": "release.fired";
529
+ "release.skipped": "release.skipped";
530
+ "release.approved": "release.approved";
531
+ "release.tag_conflict": "release.tag_conflict";
532
+ "release.partial": "release.partial";
533
+ "slack.post_failed": "slack.post_failed";
534
+ "qa.run_triggered": "qa.run_triggered";
535
+ "qa.run_completed": "qa.run_completed";
536
+ "qa.gap_issue_filed": "qa.gap_issue_filed";
490
537
  }>;
491
538
  actor: z.ZodString;
492
539
  actorType: z.ZodEnum<{
@@ -495,6 +542,7 @@ export declare const AuditEventSchema: z.ZodObject<{
495
542
  webhook: "webhook";
496
543
  "dashboard-user": "dashboard-user";
497
544
  cli: "cli";
545
+ "release-manager": "release-manager";
498
546
  }>;
499
547
  scope: z.ZodNullable<z.ZodString>;
500
548
  runId: z.ZodNullable<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}