@on-par/factory-core 0.9.28-next.8 → 0.9.28

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 (285) hide show
  1. package/dist/blockers/declared-prerequisites.d.ts +4 -1
  2. package/dist/blockers/declared-prerequisites.d.ts.map +1 -1
  3. package/dist/blockers/declared-prerequisites.js +10 -5
  4. package/dist/blockers/declared-prerequisites.js.map +1 -1
  5. package/dist/checkers/app-smoke.d.ts.map +1 -1
  6. package/dist/checkers/app-smoke.js +4 -1
  7. package/dist/checkers/app-smoke.js.map +1 -1
  8. package/dist/checkers/evidence-plan.d.ts +2 -0
  9. package/dist/checkers/evidence-plan.d.ts.map +1 -1
  10. package/dist/checkers/evidence-plan.js +13 -6
  11. package/dist/checkers/evidence-plan.js.map +1 -1
  12. package/dist/checkers/evidence-selector.d.ts +2 -0
  13. package/dist/checkers/evidence-selector.d.ts.map +1 -1
  14. package/dist/checkers/evidence-selector.js +13 -10
  15. package/dist/checkers/evidence-selector.js.map +1 -1
  16. package/dist/checkers/evidence-workspace.d.ts +21 -0
  17. package/dist/checkers/evidence-workspace.d.ts.map +1 -0
  18. package/dist/checkers/evidence-workspace.js +118 -0
  19. package/dist/checkers/evidence-workspace.js.map +1 -0
  20. package/dist/checkers/index.js +1 -1
  21. package/dist/checkers/index.js.map +1 -1
  22. package/dist/checkers/internal-exports.d.ts +3 -1
  23. package/dist/checkers/internal-exports.d.ts.map +1 -1
  24. package/dist/checkers/internal-exports.js +3 -1
  25. package/dist/checkers/internal-exports.js.map +1 -1
  26. package/dist/checkers/resolve-commands.d.ts.map +1 -1
  27. package/dist/checkers/resolve-commands.js +5 -1
  28. package/dist/checkers/resolve-commands.js.map +1 -1
  29. package/dist/config/example.d.ts.map +1 -1
  30. package/dist/config/example.js +5 -2
  31. package/dist/config/example.js.map +1 -1
  32. package/dist/config/index.d.ts +6 -32
  33. package/dist/config/index.d.ts.map +1 -1
  34. package/dist/config/index.js +17 -32
  35. package/dist/config/index.js.map +1 -1
  36. package/dist/config/merge-policy.d.ts +36 -0
  37. package/dist/config/merge-policy.d.ts.map +1 -0
  38. package/dist/config/merge-policy.js +31 -0
  39. package/dist/config/merge-policy.js.map +1 -0
  40. package/dist/config/repo.js +1 -1
  41. package/dist/config/repo.js.map +1 -1
  42. package/dist/config/run-config-env.d.ts +5 -0
  43. package/dist/config/run-config-env.d.ts.map +1 -0
  44. package/dist/config/run-config-env.js +11 -0
  45. package/dist/config/run-config-env.js.map +1 -0
  46. package/dist/config/run-config-ladder.d.ts +18 -0
  47. package/dist/config/run-config-ladder.d.ts.map +1 -0
  48. package/dist/config/run-config-ladder.js +110 -0
  49. package/dist/config/run-config-ladder.js.map +1 -0
  50. package/dist/config/run-config-source.d.ts +6 -6
  51. package/dist/config/run-config-source.d.ts.map +1 -1
  52. package/dist/config/run-config-source.js +16 -15
  53. package/dist/config/run-config-source.js.map +1 -1
  54. package/dist/constitutions/index.d.ts.map +1 -1
  55. package/dist/constitutions/index.js +8 -0
  56. package/dist/constitutions/index.js.map +1 -1
  57. package/dist/environment/process-groups.d.ts +5 -0
  58. package/dist/environment/process-groups.d.ts.map +1 -1
  59. package/dist/environment/process-groups.js +19 -0
  60. package/dist/environment/process-groups.js.map +1 -1
  61. package/dist/events/config-traits.d.ts +1 -1
  62. package/dist/events/config-traits.d.ts.map +1 -1
  63. package/dist/events/config-traits.js +2 -0
  64. package/dist/events/config-traits.js.map +1 -1
  65. package/dist/events/queue-traits.d.ts +1 -1
  66. package/dist/events/queue-traits.d.ts.map +1 -1
  67. package/dist/events/queue-traits.js +8 -1
  68. package/dist/events/queue-traits.js.map +1 -1
  69. package/dist/events/rotation.js +1 -1
  70. package/dist/events/rotation.js.map +1 -1
  71. package/dist/fakes/octokit.d.ts +13 -1
  72. package/dist/fakes/octokit.d.ts.map +1 -1
  73. package/dist/fakes/octokit.js +13 -0
  74. package/dist/fakes/octokit.js.map +1 -1
  75. package/dist/filing/redact.d.ts +1 -0
  76. package/dist/filing/redact.d.ts.map +1 -1
  77. package/dist/filing/redact.js +1 -1
  78. package/dist/filing/redact.js.map +1 -1
  79. package/dist/harness/opencode-version.d.ts +2 -2
  80. package/dist/harness/opencode-version.d.ts.map +1 -1
  81. package/dist/harness/opencode-version.js +3 -3
  82. package/dist/harness/opencode-version.js.map +1 -1
  83. package/dist/internal.d.ts +13 -1
  84. package/dist/internal.d.ts.map +1 -1
  85. package/dist/internal.js +14 -0
  86. package/dist/internal.js.map +1 -1
  87. package/dist/kpis/index.d.ts.map +1 -1
  88. package/dist/kpis/index.js +2 -1
  89. package/dist/kpis/index.js.map +1 -1
  90. package/dist/kpis/park.d.ts.map +1 -1
  91. package/dist/kpis/park.js +2 -1
  92. package/dist/kpis/park.js.map +1 -1
  93. package/dist/kpis/phase.d.ts.map +1 -1
  94. package/dist/kpis/phase.js +1 -0
  95. package/dist/kpis/phase.js.map +1 -1
  96. package/dist/land/changelog.d.ts +8 -0
  97. package/dist/land/changelog.d.ts.map +1 -0
  98. package/dist/land/changelog.js +90 -0
  99. package/dist/land/changelog.js.map +1 -0
  100. package/dist/land/sync.d.ts.map +1 -1
  101. package/dist/land/sync.js +93 -32
  102. package/dist/land/sync.js.map +1 -1
  103. package/dist/phases/check-evidence.d.ts.map +1 -1
  104. package/dist/phases/check-evidence.js +5 -1
  105. package/dist/phases/check-evidence.js.map +1 -1
  106. package/dist/phases/ship-approval.d.ts +17 -0
  107. package/dist/phases/ship-approval.d.ts.map +1 -0
  108. package/dist/phases/ship-approval.js +21 -0
  109. package/dist/phases/ship-approval.js.map +1 -0
  110. package/dist/phases/ship-branch-push.d.ts +17 -0
  111. package/dist/phases/ship-branch-push.d.ts.map +1 -0
  112. package/dist/phases/ship-branch-push.js +77 -0
  113. package/dist/phases/ship-branch-push.js.map +1 -0
  114. package/dist/phases/ship-ci-watch.d.ts +25 -0
  115. package/dist/phases/ship-ci-watch.d.ts.map +1 -0
  116. package/dist/phases/ship-ci-watch.js +53 -0
  117. package/dist/phases/ship-ci-watch.js.map +1 -0
  118. package/dist/phases/ship-evidence-comment.d.ts +14 -0
  119. package/dist/phases/ship-evidence-comment.d.ts.map +1 -0
  120. package/dist/phases/ship-evidence-comment.js +31 -0
  121. package/dist/phases/ship-evidence-comment.js.map +1 -0
  122. package/dist/phases/ship-existing-pr.d.ts +11 -0
  123. package/dist/phases/ship-existing-pr.d.ts.map +1 -0
  124. package/dist/phases/ship-existing-pr.js +36 -0
  125. package/dist/phases/ship-existing-pr.js.map +1 -0
  126. package/dist/phases/ship-finish.d.ts +15 -0
  127. package/dist/phases/ship-finish.d.ts.map +1 -0
  128. package/dist/phases/ship-finish.js +69 -0
  129. package/dist/phases/ship-finish.js.map +1 -0
  130. package/dist/phases/ship-git-detail.d.ts +31 -0
  131. package/dist/phases/ship-git-detail.d.ts.map +1 -0
  132. package/dist/phases/ship-git-detail.js +71 -0
  133. package/dist/phases/ship-git-detail.js.map +1 -0
  134. package/dist/phases/ship-git-remote.d.ts +51 -0
  135. package/dist/phases/ship-git-remote.d.ts.map +1 -0
  136. package/dist/phases/ship-git-remote.js +70 -0
  137. package/dist/phases/ship-git-remote.js.map +1 -0
  138. package/dist/phases/ship-git.d.ts +4 -79
  139. package/dist/phases/ship-git.d.ts.map +1 -1
  140. package/dist/phases/ship-git.js +2 -135
  141. package/dist/phases/ship-git.js.map +1 -1
  142. package/dist/phases/ship-main-sync.d.ts +18 -0
  143. package/dist/phases/ship-main-sync.d.ts.map +1 -0
  144. package/dist/phases/ship-main-sync.js +34 -0
  145. package/dist/phases/ship-main-sync.js.map +1 -0
  146. package/dist/phases/ship-open-pr.d.ts +24 -0
  147. package/dist/phases/ship-open-pr.d.ts.map +1 -0
  148. package/dist/phases/ship-open-pr.js +75 -0
  149. package/dist/phases/ship-open-pr.js.map +1 -0
  150. package/dist/phases/ship-options.d.ts +81 -0
  151. package/dist/phases/ship-options.d.ts.map +1 -0
  152. package/dist/phases/ship-options.js +4 -0
  153. package/dist/phases/ship-options.js.map +1 -0
  154. package/dist/phases/ship-recovery.d.ts +16 -0
  155. package/dist/phases/ship-recovery.d.ts.map +1 -0
  156. package/dist/phases/ship-recovery.js +81 -0
  157. package/dist/phases/ship-recovery.js.map +1 -0
  158. package/dist/phases/ship-reentry.d.ts +20 -0
  159. package/dist/phases/ship-reentry.d.ts.map +1 -0
  160. package/dist/phases/ship-reentry.js +47 -0
  161. package/dist/phases/ship-reentry.js.map +1 -0
  162. package/dist/phases/ship.d.ts +4 -76
  163. package/dist/phases/ship.d.ts.map +1 -1
  164. package/dist/phases/ship.js +67 -425
  165. package/dist/phases/ship.js.map +1 -1
  166. package/dist/phases/stack-order.d.ts +9 -0
  167. package/dist/phases/stack-order.d.ts.map +1 -1
  168. package/dist/phases/stack-order.js +13 -0
  169. package/dist/phases/stack-order.js.map +1 -1
  170. package/dist/queue/comment-rework-trigger.d.ts +24 -0
  171. package/dist/queue/comment-rework-trigger.d.ts.map +1 -0
  172. package/dist/queue/comment-rework-trigger.js +128 -0
  173. package/dist/queue/comment-rework-trigger.js.map +1 -0
  174. package/dist/queue/github-queue.d.ts +4 -2
  175. package/dist/queue/github-queue.d.ts.map +1 -1
  176. package/dist/queue/github-queue.js.map +1 -1
  177. package/dist/queue/internal-exports.d.ts +3 -0
  178. package/dist/queue/internal-exports.d.ts.map +1 -1
  179. package/dist/queue/internal-exports.js +2 -0
  180. package/dist/queue/internal-exports.js.map +1 -1
  181. package/dist/queue/lane-discovery-interval.d.ts +6 -0
  182. package/dist/queue/lane-discovery-interval.d.ts.map +1 -0
  183. package/dist/queue/lane-discovery-interval.js +9 -0
  184. package/dist/queue/lane-discovery-interval.js.map +1 -0
  185. package/dist/queue/linear-queue-backend.d.ts +17 -0
  186. package/dist/queue/linear-queue-backend.d.ts.map +1 -0
  187. package/dist/queue/linear-queue-backend.js +42 -0
  188. package/dist/queue/linear-queue-backend.js.map +1 -0
  189. package/dist/queue/linear-queue.d.ts +4 -2
  190. package/dist/queue/linear-queue.d.ts.map +1 -1
  191. package/dist/queue/linear-queue.js +79 -2
  192. package/dist/queue/linear-queue.js.map +1 -1
  193. package/dist/queue/prerequisite-stack.d.ts +47 -0
  194. package/dist/queue/prerequisite-stack.d.ts.map +1 -0
  195. package/dist/queue/prerequisite-stack.js +41 -0
  196. package/dist/queue/prerequisite-stack.js.map +1 -0
  197. package/dist/queue/queue-backend.d.ts +11 -5
  198. package/dist/queue/queue-backend.d.ts.map +1 -1
  199. package/dist/queue/queue-backend.js +8 -3
  200. package/dist/queue/queue-backend.js.map +1 -1
  201. package/dist/queue/review-rework-trigger.d.ts +7 -2
  202. package/dist/queue/review-rework-trigger.d.ts.map +1 -1
  203. package/dist/queue/review-rework-trigger.js +16 -8
  204. package/dist/queue/review-rework-trigger.js.map +1 -1
  205. package/dist/reports/pr-body.d.ts +5 -2
  206. package/dist/reports/pr-body.d.ts.map +1 -1
  207. package/dist/reports/pr-body.js +21 -10
  208. package/dist/reports/pr-body.js.map +1 -1
  209. package/dist/run/ci-rework-loop.d.ts.map +1 -1
  210. package/dist/run/ci-rework-loop.js +5 -1
  211. package/dist/run/ci-rework-loop.js.map +1 -1
  212. package/dist/run/feedback-github.d.ts +50 -0
  213. package/dist/run/feedback-github.d.ts.map +1 -0
  214. package/dist/run/feedback-github.js +87 -0
  215. package/dist/run/feedback-github.js.map +1 -0
  216. package/dist/run/feedback-round-hooks.d.ts +19 -0
  217. package/dist/run/feedback-round-hooks.d.ts.map +1 -0
  218. package/dist/run/feedback-round-hooks.js +106 -0
  219. package/dist/run/feedback-round-hooks.js.map +1 -0
  220. package/dist/run/feedback-round.d.ts +97 -0
  221. package/dist/run/feedback-round.d.ts.map +1 -0
  222. package/dist/run/feedback-round.js +275 -0
  223. package/dist/run/feedback-round.js.map +1 -0
  224. package/dist/run/linear-run.d.ts +23 -0
  225. package/dist/run/linear-run.d.ts.map +1 -0
  226. package/dist/run/linear-run.js +18 -0
  227. package/dist/run/linear-run.js.map +1 -0
  228. package/dist/run/park-comment.d.ts +9 -0
  229. package/dist/run/park-comment.d.ts.map +1 -1
  230. package/dist/run/park-comment.js +12 -0
  231. package/dist/run/park-comment.js.map +1 -1
  232. package/dist/run/ports.d.ts +10 -0
  233. package/dist/run/ports.d.ts.map +1 -1
  234. package/dist/run/ports.js +12 -0
  235. package/dist/run/ports.js.map +1 -1
  236. package/dist/run/pr-run-state.d.ts +99 -0
  237. package/dist/run/pr-run-state.d.ts.map +1 -0
  238. package/dist/run/pr-run-state.js +235 -0
  239. package/dist/run/pr-run-state.js.map +1 -0
  240. package/dist/run/prerequisite-restack.d.ts +39 -0
  241. package/dist/run/prerequisite-restack.d.ts.map +1 -0
  242. package/dist/run/prerequisite-restack.js +79 -0
  243. package/dist/run/prerequisite-restack.js.map +1 -0
  244. package/dist/run/review-rework-cap.d.ts +3 -1
  245. package/dist/run/review-rework-cap.d.ts.map +1 -1
  246. package/dist/run/review-rework-cap.js +2 -1
  247. package/dist/run/review-rework-cap.js.map +1 -1
  248. package/dist/run/review-rework.d.ts +17 -2
  249. package/dist/run/review-rework.d.ts.map +1 -1
  250. package/dist/run/review-rework.js +99 -33
  251. package/dist/run/review-rework.js.map +1 -1
  252. package/dist/run/run-issue.d.ts +5 -1
  253. package/dist/run/run-issue.d.ts.map +1 -1
  254. package/dist/run/run-issue.js +35 -28
  255. package/dist/run/run-issue.js.map +1 -1
  256. package/dist/run/stack-rebase.d.ts +28 -0
  257. package/dist/run/stack-rebase.d.ts.map +1 -0
  258. package/dist/run/stack-rebase.js +79 -0
  259. package/dist/run/stack-rebase.js.map +1 -0
  260. package/dist/run/stack-restack.d.ts.map +1 -1
  261. package/dist/run/stack-restack.js +21 -49
  262. package/dist/run/stack-restack.js.map +1 -1
  263. package/dist/utils/command-runner.d.ts.map +1 -1
  264. package/dist/utils/command-runner.js +4 -1
  265. package/dist/utils/command-runner.js.map +1 -1
  266. package/dist/utils/exec.d.ts.map +1 -1
  267. package/dist/utils/exec.js +4 -1
  268. package/dist/utils/exec.js.map +1 -1
  269. package/dist/utils/in-place.d.ts +24 -0
  270. package/dist/utils/in-place.d.ts.map +1 -0
  271. package/dist/utils/in-place.js +105 -0
  272. package/dist/utils/in-place.js.map +1 -0
  273. package/dist/work/internal-exports.d.ts +3 -0
  274. package/dist/work/internal-exports.d.ts.map +1 -0
  275. package/dist/work/internal-exports.js +4 -0
  276. package/dist/work/internal-exports.js.map +1 -0
  277. package/dist/work/ticket-writeback.d.ts +22 -0
  278. package/dist/work/ticket-writeback.d.ts.map +1 -0
  279. package/dist/work/ticket-writeback.js +73 -0
  280. package/dist/work/ticket-writeback.js.map +1 -0
  281. package/dist/work/work-key.d.ts +2 -0
  282. package/dist/work/work-key.d.ts.map +1 -1
  283. package/dist/work/work-key.js +4 -0
  284. package/dist/work/work-key.js.map +1 -1
  285. package/package.json +5 -5
@@ -0,0 +1,105 @@
1
+ // src/utils/in-place.ts — in-place workspace mode (#3904): run the pipeline in the current
2
+ // checkout instead of a factory worktree. The clone is the isolation boundary, so the checkout
3
+ // must be clean and at the fetched default-branch tip, and nothing here ever deletes anything.
4
+ import { execGit } from './git-exec.js';
5
+ import { defaultRemoteBase, detectRemoteBranch, gitFetch, } from './index.js';
6
+ const MAX_LISTED_FILES = 20;
7
+ function porcelainPath(line) {
8
+ const path = line.slice(3);
9
+ const arrow = path.indexOf(' -> ');
10
+ return arrow === -1 ? path : path.slice(arrow + 4);
11
+ }
12
+ async function revParse(repoRoot, args) {
13
+ const { stdout } = await execGit(['rev-parse', ...args], { cwd: repoRoot });
14
+ return stdout.trim();
15
+ }
16
+ /** Why the checkout cannot host an in-place run, or null when it is clean and at origin/<default>. */
17
+ export async function checkInPlaceCheckout(repoRoot) {
18
+ await gitFetch(repoRoot);
19
+ const { stdout: status } = await execGit(['status', '--porcelain'], { cwd: repoRoot });
20
+ const files = status
21
+ .split('\n')
22
+ .filter((line) => line.trim() !== '')
23
+ .map(porcelainPath);
24
+ if (files.length > 0) {
25
+ const listed = files.slice(0, MAX_LISTED_FILES).join(', ');
26
+ const more = files.length > MAX_LISTED_FILES ? ` (+${files.length - MAX_LISTED_FILES} more)` : '';
27
+ return {
28
+ kind: 'dirty',
29
+ files,
30
+ message: `in-place run refused: the checkout has uncommitted changes: ${listed}${more} — commit, stash or discard them, or use a fresh clone`,
31
+ };
32
+ }
33
+ const expected = await defaultRemoteBase(repoRoot);
34
+ const defaultName = expected.replace(/^origin\//, '');
35
+ const current = await revParse(repoRoot, ['--abbrev-ref', 'HEAD']);
36
+ if (current !== defaultName) {
37
+ return {
38
+ kind: 'wrong-branch',
39
+ current,
40
+ expected: defaultName,
41
+ message: `in-place run refused: the checkout is on '${current}' (detached HEAD when 'HEAD'), not the default branch '${defaultName}' — git switch ${defaultName}`,
42
+ };
43
+ }
44
+ const head = await revParse(repoRoot, ['HEAD']);
45
+ const tip = await revParse(repoRoot, [`${expected}^{commit}`]);
46
+ if (head !== tip) {
47
+ return {
48
+ kind: 'not-at-tip',
49
+ head,
50
+ tip,
51
+ expected,
52
+ message: `in-place run refused: HEAD ${head.slice(0, 8)} is not the fetched ${expected} tip ${tip.slice(0, 8)} — git reset --hard ${expected} in a disposable clone`,
53
+ };
54
+ }
55
+ return null;
56
+ }
57
+ /** Switches the checkout to the factory branch, cut from origin/<default> (or the branch's open
58
+ * PR head). Re-checks readiness first to guard a race with the preflight. Never deletes. */
59
+ export async function setupInPlaceCheckout(repoRoot, branch, log, opts) {
60
+ const problem = await checkInPlaceCheckout(repoRoot);
61
+ if (problem)
62
+ throw new Error(problem.message);
63
+ let openPrBranch = false;
64
+ let remoteBranch = null;
65
+ const remoteSha = await detectRemoteBranch(repoRoot, branch);
66
+ if (remoteSha) {
67
+ remoteBranch = { sha: remoteSha };
68
+ let prText = 'open PR not checked';
69
+ if (opts?.findOpenPr) {
70
+ let lookup;
71
+ try {
72
+ lookup = await opts.findOpenPr(branch);
73
+ }
74
+ catch (err) {
75
+ lookup = { status: 'error', detail: err instanceof Error ? err.message : String(err) };
76
+ }
77
+ if (lookup.status === 'found') {
78
+ remoteBranch.prNumber = lookup.prNumber;
79
+ openPrBranch = true;
80
+ prText = `open PR #${lookup.prNumber} — continuing on origin/${branch}`;
81
+ }
82
+ else if (lookup.status === 'absent') {
83
+ prText = 'no open PR';
84
+ }
85
+ else {
86
+ prText = `open PR lookup failed: ${lookup.detail}`;
87
+ }
88
+ }
89
+ log?.('remote-branch-preexisting', `origin/${branch} already exists @ ${remoteSha}; ${prText}`);
90
+ }
91
+ const base = openPrBranch ? `origin/${branch}` : await defaultRemoteBase(repoRoot);
92
+ try {
93
+ await execGit(['switch', '--no-track', '-c', branch, base], { cwd: repoRoot });
94
+ }
95
+ catch (err) {
96
+ const stderr = (err?.stderr ?? (err instanceof Error ? err.message : String(err)))
97
+ .toString()
98
+ .trim();
99
+ throw new Error(`in-place run refused: could not create branch '${branch}' in the checkout (${stderr}) — delete the local branch or use a fresh clone`, { cause: err });
100
+ }
101
+ const head = await revParse(repoRoot, ['--verify', 'HEAD']);
102
+ log?.('worktree-base', `in-place: switched ${repoRoot} to ${branch} from ${base} @ ${head}`);
103
+ return { base, head, remoteBranch };
104
+ }
105
+ //# sourceMappingURL=in-place.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-place.js","sourceRoot":"","sources":["../../src/utils/in-place.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { closesTrailer, createLinearTicketWriteback, mirrorSlicePlanToTicket, postTicketComment, ticketKeyOf, ticketTrackerOf, type LinearTicketClient, type TicketTrackerKind, type TicketWriteback, } from './ticket-writeback.js';
2
+ export { isTicketKey } from './work-key.js';
3
+ //# sourceMappingURL=internal-exports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-exports.d.ts","sourceRoot":"","sources":["../../src/work/internal-exports.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ // Work-source ticket write-back exports re-exported from internal.ts (keeps that file under its max-lines ceiling)
2
+ export { closesTrailer, createLinearTicketWriteback, mirrorSlicePlanToTicket, postTicketComment, ticketKeyOf, ticketTrackerOf, } from './ticket-writeback.js';
3
+ export { isTicketKey } from './work-key.js';
4
+ //# sourceMappingURL=internal-exports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-exports.js","sourceRoot":"","sources":["../../src/work/internal-exports.ts"],"names":[],"mappings":"AAAA,mHAAmH;AACnH,OAAO,EACL,aAAa,EACb,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB,EACjB,WAAW,EACX,eAAe,GAIhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { LinearQueueLifecycleClient } from '../queue/linear-queue-lifecycle.js';
2
+ import type { SlicePlanStore } from '../readiness/slice-plan-store.js';
3
+ import type { WorkRequest } from './index.js';
4
+ import type { WorkKey } from './work-key.js';
5
+ export type TicketTrackerKind = 'github' | 'linear';
6
+ export type LinearTicketClient = Pick<LinearQueueLifecycleClient, 'findIssue' | 'addComment'>;
7
+ export interface TicketWriteback {
8
+ comment(key: WorkKey, body: string): Promise<void>;
9
+ labels(key: WorkKey): Promise<string[]>;
10
+ }
11
+ /** The tracker a work request lives in; undefined for a work source with no ticket (e.g. a local brief). */
12
+ export declare function ticketTrackerOf(work: Pick<WorkRequest, 'kind'> | undefined): TicketTrackerKind | undefined;
13
+ /** The Linear issue key of a work request; undefined for any other work. */
14
+ export declare function ticketKeyOf(work: Pick<WorkRequest, 'kind' | 'key'> | undefined): WorkKey | undefined;
15
+ /** The single PR-body trailer line: closes the ticket on the final slice, otherwise only references it. */
16
+ export declare function closesTrailer(tracker: TicketTrackerKind, key: WorkKey, finalSlice: boolean): string;
17
+ export declare function createLinearTicketWriteback(client: LinearTicketClient): TicketWriteback;
18
+ /** Posts a comment to the ticket; never throws. A missing writeback or a failed post only warns. */
19
+ export declare function postTicketComment(writeback: TicketWriteback | undefined, key: WorkKey, body: string, warn: (msg: string) => void): Promise<boolean>;
20
+ /** A slice-plan store that also mirrors each saved plan to the ticket; the inner store stays the source of truth. */
21
+ export declare function mirrorSlicePlanToTicket(store: SlicePlanStore, writeback: TicketWriteback | undefined, key: WorkKey, warn: (msg: string) => void): SlicePlanStore;
22
+ //# sourceMappingURL=ticket-writeback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-writeback.d.ts","sourceRoot":"","sources":["../../src/work/ticket-writeback.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAGvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACpD,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,0BAA0B,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC;AAC9F,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACzC;AAED,4GAA4G;AAC5G,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAI1G;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAEpG;AAED,2GAA2G;AAC3G,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAGnG;AAOD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe,CAgBvF;AAED,oGAAoG;AACpG,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,eAAe,GAAG,SAAS,EACtC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAAC,OAAO,CAAC,CAalB;AAED,qHAAqH;AACrH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,eAAe,GAAG,SAAS,EACtC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC1B,cAAc,CAShB"}
@@ -0,0 +1,73 @@
1
+ // packages/core/src/work/ticket-writeback.ts — write-back to a Linear ticket: closing trailer, comments, labels (#3894).
2
+ import { renderSlicePlanComment } from '../readiness/slice-plan.js';
3
+ import { GITHUB_ISSUE_SOURCE } from './github-issue.js';
4
+ import { LINEAR_ISSUE_SOURCE } from './linear-issue.js';
5
+ import { stripHiddenContent } from '../filing/sanitize.js';
6
+ /** The tracker a work request lives in; undefined for a work source with no ticket (e.g. a local brief). */
7
+ export function ticketTrackerOf(work) {
8
+ if (work === undefined || work.kind === GITHUB_ISSUE_SOURCE)
9
+ return 'github';
10
+ if (work.kind === LINEAR_ISSUE_SOURCE)
11
+ return 'linear';
12
+ return undefined;
13
+ }
14
+ /** The Linear issue key of a work request; undefined for any other work. */
15
+ export function ticketKeyOf(work) {
16
+ return ticketTrackerOf(work) === 'linear' && work?.key !== undefined ? work.key : undefined;
17
+ }
18
+ /** The single PR-body trailer line: closes the ticket on the final slice, otherwise only references it. */
19
+ export function closesTrailer(tracker, key, finalSlice) {
20
+ if (tracker === 'github')
21
+ return finalSlice ? `Closes #${key}` : `Part of #${key}`;
22
+ return finalSlice ? `Fixes ${key}` : `Part of ${key}`;
23
+ }
24
+ /** Linear renders HTML comments literally, so factory markers (and any hidden content) are removed before posting. */
25
+ function stripMarkers(body) {
26
+ return stripHiddenContent(body).trim();
27
+ }
28
+ export function createLinearTicketWriteback(client) {
29
+ async function find(key) {
30
+ const issue = await client.findIssue(key);
31
+ if (!issue)
32
+ throw new Error(`Linear issue ${key} not found`);
33
+ return issue;
34
+ }
35
+ return {
36
+ async comment(key, body) {
37
+ const issue = await find(key);
38
+ await client.addComment(issue.id, stripMarkers(body));
39
+ },
40
+ async labels(key) {
41
+ const issue = await find(key);
42
+ return issue.labels.map((l) => l.name);
43
+ },
44
+ };
45
+ }
46
+ /** Posts a comment to the ticket; never throws. A missing writeback or a failed post only warns. */
47
+ export async function postTicketComment(writeback, key, body, warn) {
48
+ if (!writeback) {
49
+ warn(`no Linear writeback is wired; could not post to ${key}`);
50
+ return false;
51
+ }
52
+ try {
53
+ await writeback.comment(key, body);
54
+ return true;
55
+ }
56
+ catch (err) {
57
+ const message = err instanceof Error ? err.message : String(err);
58
+ warn(`could not post to Linear issue ${key}: ${message}`);
59
+ return false;
60
+ }
61
+ }
62
+ /** A slice-plan store that also mirrors each saved plan to the ticket; the inner store stays the source of truth. */
63
+ export function mirrorSlicePlanToTicket(store, writeback, key, warn) {
64
+ return {
65
+ find: () => store.find(),
66
+ async save(plan) {
67
+ const saved = await store.save(plan);
68
+ await postTicketComment(writeback, key, renderSlicePlanComment(plan), warn);
69
+ return saved;
70
+ },
71
+ };
72
+ }
73
+ //# sourceMappingURL=ticket-writeback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-writeback.js","sourceRoot":"","sources":["../../src/work/ticket-writeback.ts"],"names":[],"mappings":"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"}
@@ -11,5 +11,7 @@ export declare function toWorkKey(raw: string): WorkKey;
11
11
  export declare function isNumericWorkKey(key: WorkKey): boolean;
12
12
  /** The only sanctioned path from a key to an Octokit `issue_number`; throws for non-numeric keys. */
13
13
  export declare function issueNumberOf(key: WorkKey): number;
14
+ /** True for a real ticket key in the event log: a GitHub issue number or an upper-case tracker key like ON-12. */
15
+ export declare function isTicketKey(issue: string): boolean;
14
16
  export {};
15
17
  //# sourceMappingURL=work-key.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"work-key.d.ts","sourceRoot":"","sources":["../../src/work/work-key.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,YAAY,EAAE,OAAO,MAAM,CAAC;AAE1C,8GAA8G;AAC9G,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAEjE,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ9C;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEtD;AAED,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAGlD"}
1
+ {"version":3,"file":"work-key.d.ts","sourceRoot":"","sources":["../../src/work/work-key.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,YAAY,EAAE,OAAO,MAAM,CAAC;AAE1C,8GAA8G;AAC9G,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAEjE,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ9C;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEtD;AAED,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAGlD;AAED,kHAAkH;AAClH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD"}
@@ -24,4 +24,8 @@ export function issueNumberOf(key) {
24
24
  throw new Error(`work key "${key}" is not a numeric GitHub issue number`);
25
25
  return Number(key);
26
26
  }
27
+ /** True for a real ticket key in the event log: a GitHub issue number or an upper-case tracker key like ON-12. */
28
+ export function isTicketKey(issue) {
29
+ return /^\d+$/.test(issue) || /^[A-Z][A-Z0-9]*-[1-9]\d*$/.test(issue);
30
+ }
27
31
  //# sourceMappingURL=work-key.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"work-key.js","sourceRoot":"","sources":["../../src/work/work-key.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAOhF,gGAAgG;AAChG,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,UAAU,CAAC,yDAAyD,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAY,CAAC;AAClC,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,qBAAqB,GAAG,+EAA+E,CACxG,CAAC;IACJ,CAAC;IACD,OAAO,GAAc,CAAC;AACxB,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;AAC1D,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,wCAAwC,CAAC,CAAC;IACtG,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"work-key.js","sourceRoot":"","sources":["../../src/work/work-key.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAOhF,gGAAgG;AAChG,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,UAAU,CAAC,yDAAyD,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAY,CAAC;AAClC,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,qBAAqB,GAAG,+EAA+E,CACxG,CAAC;IACJ,CAAC;IACD,OAAO,GAAc,CAAC;AACxB,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;AAC1D,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,wCAAwC,CAAC,CAAC;IACtG,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@on-par/factory-core",
3
- "version": "0.9.28-next.8",
3
+ "version": "0.9.28",
4
4
  "description": "Core engine: model router, constitutions, checkers, and pipeline phases for the Software Factory.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -54,10 +54,10 @@
54
54
  "prepack": "node ../../scripts/pack-hygiene-cli.ts prepack"
55
55
  },
56
56
  "dependencies": {
57
- "@on-par/adr-kit": "0.9.28-next.8",
58
- "@on-par/contracts": "0.9.28-next.8",
59
- "@on-par/factory-config": "0.9.28-next.8",
60
- "@on-par/repo-context": "0.9.28-next.8",
57
+ "@on-par/adr-kit": "0.9.28",
58
+ "@on-par/contracts": "0.9.28",
59
+ "@on-par/factory-config": "0.9.28",
60
+ "@on-par/repo-context": "0.9.28",
61
61
  "@octokit/rest": "^22.0.0",
62
62
  "execa": "^10.2.1",
63
63
  "gray-matter": "^4.0.3",