@joshuafolkken/kit 1.1387.0 → 1.1435.0

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 (236) hide show
  1. package/.claude/skills/epic-commands/SKILL.md +1 -1
  2. package/.claude/skills/epic-commands/epic-bundle.md +5 -0
  3. package/.claude/skills/workflow-commands/backlogrun-lanes.md +5 -3
  4. package/.claude/skills/workflow-commands/backlogrun-steps.md +4 -3
  5. package/.claude/skills/workflow-commands/backlogrun.md +1 -0
  6. package/.claude/skills/workflow-commands/chain-rule.md +4 -2
  7. package/.claude/skills/workflow-commands/issue-comments.md +6 -0
  8. package/.claude/skills/workflow-commands/observation-ledger.md +3 -2
  9. package/.claude/skills/workflow-commands/pre-gate-cut.md +5 -3
  10. package/README.md +25 -0
  11. package/dist/hooks/audit-provision.js +2 -2
  12. package/dist/hooks/batch-guard.js +7 -7
  13. package/dist/hooks/{chunk-IYVOLN6A.js → chunk-2G5F2YCD.js} +3 -3
  14. package/dist/hooks/{chunk-2YSW3CXH.js → chunk-3LE6VLSR.js} +17 -6
  15. package/dist/hooks/{chunk-J3KSS7II.js → chunk-4BHUPFKF.js} +1 -1
  16. package/dist/hooks/{chunk-EAQEGME7.js → chunk-5SJSSCJG.js} +1 -1
  17. package/dist/hooks/{chunk-FZ6FUSBM.js → chunk-723HKZO5.js} +1 -1
  18. package/dist/hooks/{chunk-LMWBRJIP.js → chunk-7KMN5QB5.js} +3 -3
  19. package/dist/hooks/{chunk-NEC4AT4Z.js → chunk-DGT54IH5.js} +4 -0
  20. package/dist/hooks/{chunk-STDSEPWU.js → chunk-EMB55BDF.js} +4 -4
  21. package/dist/hooks/{chunk-JBBMAPC4.js → chunk-IX6TTTI6.js} +4 -0
  22. package/dist/hooks/{chunk-GJ7JPIHN.js → chunk-JXQBK323.js} +2674 -187
  23. package/dist/hooks/{chunk-DCY2GWHC.js → chunk-MSYSUSY6.js} +5 -5
  24. package/dist/hooks/{chunk-EBSHN25W.js → chunk-MU4LJFIV.js} +4 -4
  25. package/dist/hooks/{chunk-WNFJLBXI.js → chunk-QL6QTPWN.js} +3 -3
  26. package/dist/hooks/{chunk-SL4GQ2XP.js → chunk-XER6SSIB.js} +91 -18
  27. package/dist/hooks/{chunk-U32VSRNG.js → chunk-YW452ZAX.js} +89 -34
  28. package/dist/hooks/{chunk-GNDJ7NJ7.js → chunk-YZXYOAZ3.js} +202 -55
  29. package/dist/hooks/codex-hook-adapter.js +15 -15
  30. package/dist/hooks/duplicate-read-guard.js +8 -8
  31. package/dist/hooks/format-edited.js +5 -5
  32. package/dist/hooks/inputs.json +288 -229
  33. package/dist/hooks/investigation-guard.js +8 -8
  34. package/dist/hooks/pretool-guard.js +14 -14
  35. package/dist/hooks/session-lang.js +69 -16
  36. package/dist/hooks/stop-guard.js +13 -38
  37. package/dist/josh.js +62 -9
  38. package/package.json +4 -3
  39. package/prompts/review.md +22 -0
  40. package/scripts/agent/claude-agent-argv.ts +13 -1
  41. package/scripts/auth/auth-setup-cli.ts +101 -0
  42. package/scripts/auth/claude-token-output.ts +78 -0
  43. package/scripts/auth/claude-token.ts +68 -0
  44. package/scripts/backlog/backlog-drive-epic.ts +24 -8
  45. package/scripts/backlog/backlog-drive-launch.ts +3 -0
  46. package/scripts/backlog/backlog-drive-named-offer.ts +7 -2
  47. package/scripts/backlog/backlog-drive-named.ts +4 -2
  48. package/scripts/backlog/backlog-drive-unread.ts +56 -0
  49. package/scripts/backlog/backlog-drive.ts +16 -8
  50. package/scripts/backlog/backlog-overlap.ts +22 -5
  51. package/scripts/backlog/backlog-ready.ts +1 -3
  52. package/scripts/backlog/backlogrun-args.ts +13 -2
  53. package/scripts/backlog/backlogrun-cli.ts +91 -19
  54. package/scripts/backlog/backlogrun-launch.ts +24 -0
  55. package/scripts/backlog/backlogrun-replace.ts +166 -0
  56. package/scripts/backlog/backlogrun-stop.ts +178 -0
  57. package/scripts/behavior/behavior-cli.ts +6 -1
  58. package/scripts/doctor/doctor-io.ts +60 -9
  59. package/scripts/doctor/doctor.ts +20 -1
  60. package/scripts/document/document-byte-budget.ts +3 -3
  61. package/scripts/epic/epic-bundle-cli.ts +8 -8
  62. package/scripts/epic/epic-bundle-referenced.ts +2 -5
  63. package/scripts/epic/epic-bundle.ts +39 -4
  64. package/scripts/exports/unused-members-cli.ts +2 -1
  65. package/scripts/followup/followup-checks-event.ts +82 -0
  66. package/scripts/followup/git-followup-finish.ts +16 -2
  67. package/scripts/followup/git-followup-workflow.ts +5 -2
  68. package/scripts/followup/git-pr-followup-checks.ts +18 -4
  69. package/scripts/followup/git-pr-followup-wrapup.ts +5 -0
  70. package/scripts/followup/git-pr-followup.ts +4 -1
  71. package/scripts/fresh-machine/fresh-machine-cli.ts +204 -0
  72. package/scripts/fresh-machine/fresh-machine-docker.ts +65 -0
  73. package/scripts/fresh-machine/fresh-machine-image.ts +62 -0
  74. package/scripts/fresh-machine/fresh-machine-log.ts +61 -0
  75. package/scripts/fresh-machine/fresh-machine-patterns.ts +130 -0
  76. package/scripts/fresh-machine/fresh-machine-run.ts +215 -0
  77. package/scripts/fresh-machine/fresh-machine-script.ts +45 -0
  78. package/scripts/fresh-machine/fresh-machine-spec.ts +57 -0
  79. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +34 -0
  80. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +31 -0
  81. package/scripts/gate/gate-report.ts +70 -15
  82. package/scripts/gate/project-checks.ts +13 -2
  83. package/scripts/gate/scoped-green.ts +2 -1
  84. package/scripts/gate/verification-gate.ts +4 -3
  85. package/scripts/gh/gh-author-association.ts +14 -0
  86. package/scripts/gh/git-gh-conditional.ts +66 -0
  87. package/scripts/gh/git-gh-exec.ts +1 -1
  88. package/scripts/gh/git-gh-issue-read.ts +6 -3
  89. package/scripts/gh/git-gh-issue-write.ts +5 -1
  90. package/scripts/gh/git-gh-issue.ts +4 -1
  91. package/scripts/gh/git-pr-checks-eval.ts +13 -0
  92. package/scripts/gh/git-pr-checks-parse.ts +8 -1
  93. package/scripts/gh/git-pr-checks-watch.ts +11 -4
  94. package/scripts/gh/git-pr-checks.ts +36 -2
  95. package/scripts/git/git-command.ts +16 -4
  96. package/scripts/git/git-schemas.ts +1 -0
  97. package/scripts/git/git-spawn-sync.ts +1 -1
  98. package/scripts/hooks/pretool-guard.ts +3 -1
  99. package/scripts/init/hook-command-rewrite.ts +31 -0
  100. package/scripts/init/init-actions.ts +4 -1
  101. package/scripts/init/init-ai-copy.ts +33 -10
  102. package/scripts/init/init-basic.ts +8 -3
  103. package/scripts/init/init-logic-toolchain.ts +76 -0
  104. package/scripts/init/init-logic.ts +2 -0
  105. package/scripts/init/init.ts +5 -23
  106. package/scripts/init/project-profile.ts +36 -7
  107. package/scripts/init/start-exec.ts +27 -1
  108. package/scripts/init/start-plan.ts +15 -0
  109. package/scripts/init/start-steps.ts +46 -0
  110. package/scripts/init/start.ts +1 -0
  111. package/scripts/init/workflow-mark.ts +35 -0
  112. package/scripts/issue/issue-ack-cli.ts +84 -0
  113. package/scripts/issue/issue-labels.ts +40 -8
  114. package/scripts/issue/issue-state-cli.ts +14 -4
  115. package/scripts/issue/issue-watch-diff.ts +152 -0
  116. package/scripts/issue/issue-watch-gate.ts +81 -0
  117. package/scripts/issue/issue-watch-hook.ts +54 -0
  118. package/scripts/issue/issue-watch.ts +240 -0
  119. package/scripts/issue/measure-rerun-cli.ts +3 -4
  120. package/scripts/josh/josh-command-map.ts +4 -0
  121. package/scripts/josh/josh-commands-backlog.ts +2 -2
  122. package/scripts/josh/josh-commands-development.ts +1 -1
  123. package/scripts/josh/josh-commands-issue.ts +7 -0
  124. package/scripts/josh/josh-commands-lane.ts +11 -2
  125. package/scripts/josh/josh-commands-project.ts +24 -0
  126. package/scripts/josh/josh-verdict.ts +33 -4
  127. package/scripts/lane/claude-lane-broker.ts +142 -0
  128. package/scripts/lane/lane-await.ts +6 -2
  129. package/scripts/lane/lane-cache.ts +37 -7
  130. package/scripts/lane/lane-capacity.ts +8 -6
  131. package/scripts/lane/lane-child-invocation.ts +1 -0
  132. package/scripts/lane/lane-cli.ts +15 -1
  133. package/scripts/lane/lane-close.ts +15 -6
  134. package/scripts/lane/lane-dispatch.ts +36 -10
  135. package/scripts/lane/lane-environment.ts +1 -1
  136. package/scripts/lane/lane-launch-cli.ts +13 -4
  137. package/scripts/lane/lane-ledger.ts +21 -3
  138. package/scripts/lane/lane-measure-cli.ts +10 -2
  139. package/scripts/lane/lane-open.ts +9 -1
  140. package/scripts/lane/lane-preserve.ts +49 -0
  141. package/scripts/lane/lane-reap.ts +20 -5
  142. package/scripts/lane/lane-registry.ts +6 -0
  143. package/scripts/lane/lane-restart-cli.ts +51 -0
  144. package/scripts/lane/lane-restart.ts +175 -0
  145. package/scripts/lane/{openai-review-broker.ts → lane-session-broker.ts} +106 -28
  146. package/scripts/lane/lane-spent.ts +195 -0
  147. package/scripts/lane/lane-stage-stats.ts +27 -3
  148. package/scripts/lane/lane-stop-stats.ts +96 -0
  149. package/scripts/lane/openai-lane-supervisor.ts +2 -2
  150. package/scripts/lane/process-tools.ts +31 -0
  151. package/scripts/lib/buffered-process.ts +36 -2
  152. package/scripts/lib/pnpm-reach.ts +27 -0
  153. package/scripts/lib/status-icons.ts +5 -1
  154. package/scripts/lint/lint-parallel.ts +19 -2
  155. package/scripts/observations/observation-ledger-home.ts +1 -0
  156. package/scripts/review/review-attest-cli.ts +21 -6
  157. package/scripts/review/review-brief-cli.ts +2 -2
  158. package/scripts/review/review-comment-round.ts +114 -0
  159. package/scripts/review/review-record-cli.ts +39 -17
  160. package/scripts/rules/implementation-cut.ts +3 -3
  161. package/scripts/rules/pre-gate-cut.ts +1 -1
  162. package/scripts/run/board/run-board-checks.ts +42 -0
  163. package/scripts/run/board/run-board-cli.ts +2 -0
  164. package/scripts/run/board/run-board-every.ts +3 -1
  165. package/scripts/run/board/run-board-fit.ts +16 -5
  166. package/scripts/run/board/run-board-fresh.ts +64 -0
  167. package/scripts/run/board/run-board-header.ts +129 -53
  168. package/scripts/run/board/run-board-labels.ts +47 -4
  169. package/scripts/run/board/run-board-lane-event.ts +66 -0
  170. package/scripts/run/board/run-board-layout.ts +57 -9
  171. package/scripts/run/board/run-board-now.ts +234 -0
  172. package/scripts/run/board/run-board-operation-read.ts +75 -0
  173. package/scripts/run/board/run-board-operation.ts +150 -0
  174. package/scripts/run/board/run-board-phase.ts +26 -1
  175. package/scripts/run/board/run-board-plan.ts +4 -6
  176. package/scripts/run/board/run-board-read.ts +49 -3
  177. package/scripts/run/board/run-board-reason.ts +124 -0
  178. package/scripts/run/board/run-board-render-checks.ts +55 -0
  179. package/scripts/run/board/run-board-render-legend.ts +12 -3
  180. package/scripts/run/board/run-board-render-slot.ts +2 -2
  181. package/scripts/run/board/run-board-render-tail.ts +128 -0
  182. package/scripts/run/board/run-board-render-thanks.ts +50 -0
  183. package/scripts/run/board/run-board-render-title.ts +58 -0
  184. package/scripts/run/board/run-board-render.ts +96 -80
  185. package/scripts/run/board/run-board-row-yield.ts +32 -0
  186. package/scripts/run/board/run-board-setup.ts +61 -13
  187. package/scripts/run/board/run-board-state.ts +10 -0
  188. package/scripts/run/board/run-board-status.ts +66 -7
  189. package/scripts/run/board/run-board-thanks-csv.ts +71 -0
  190. package/scripts/run/board/run-board-thanks-read.ts +112 -0
  191. package/scripts/run/board/run-board-thanks.ts +53 -0
  192. package/scripts/run/board/run-board-tick.ts +50 -21
  193. package/scripts/run/board/run-board-usual.ts +44 -0
  194. package/scripts/run/carry/run-carry-args.ts +9 -1
  195. package/scripts/run/carry/run-carry-cli.ts +2 -45
  196. package/scripts/run/carry/run-carry-end.ts +73 -0
  197. package/scripts/run/carry/run-carry.ts +8 -1
  198. package/scripts/run/entry/run-entry-cli.ts +5 -0
  199. package/scripts/run/event/run-event-checks.ts +54 -0
  200. package/scripts/run/event/run-event-render.ts +2 -0
  201. package/scripts/run/event/run-event-scope.ts +1 -0
  202. package/scripts/run/event/run-event-setup.ts +55 -11
  203. package/scripts/run/event/run-event-stream.ts +27 -11
  204. package/scripts/run/merge/run-merge-cli.ts +7 -4
  205. package/scripts/run/merge/run-merge-ship.ts +61 -0
  206. package/scripts/run/merge/run-merge-steps.ts +7 -14
  207. package/scripts/run/merge/run-merge-token.ts +16 -2
  208. package/scripts/run/run-headless.ts +1 -0
  209. package/scripts/run/run-step.ts +2 -0
  210. package/scripts/run/ship/run-ship-cli.ts +22 -2
  211. package/scripts/run/ship/run-ship-return.ts +31 -13
  212. package/scripts/run/ship/run-ship-review-steps.ts +17 -4
  213. package/scripts/run/ship/run-ship-stage.ts +1 -0
  214. package/scripts/run/wake/run-wake-await.ts +130 -0
  215. package/scripts/run/wake/run-wake-cli.ts +60 -71
  216. package/scripts/run/wake/run-wake-describe.ts +34 -2
  217. package/scripts/run/wake/run-wake-driver.ts +11 -4
  218. package/scripts/run/wake/run-wake-session.ts +20 -3
  219. package/scripts/run/wake/run-wake-stop.ts +37 -0
  220. package/scripts/run/wake/run-wake-supervise.ts +44 -0
  221. package/scripts/sync/claude-settings-merge.ts +144 -0
  222. package/scripts/sync/sync-ai-files.ts +28 -3
  223. package/scripts/sync/sync.ts +15 -0
  224. package/scripts/test/project-test-script.ts +73 -0
  225. package/scripts/test/skip-marker.ts +14 -1
  226. package/scripts/test/test-related.ts +3 -2
  227. package/scripts/test/test-unit-guard.ts +78 -14
  228. package/scripts/time-runtime/time-reported-failure.ts +11 -3
  229. package/scripts/uninstall/distributed-files.ts +92 -0
  230. package/scripts/uninstall/uninstall-plan.ts +119 -0
  231. package/scripts/uninstall/uninstall-report.ts +61 -0
  232. package/scripts/uninstall/uninstall.ts +206 -0
  233. package/templates/AGENTS.basic.md +4 -0
  234. package/templates/GEMINI.basic.md +6 -0
  235. package/dist/hooks/chunk-6V5OPIUU.js +0 -13
  236. package/scripts/run/board/run-board-track.ts +0 -22
@@ -8,7 +8,7 @@ import {
8
8
  repo_origin,
9
9
  run_event_stream,
10
10
  run_event_stream_emit
11
- } from "./chunk-U32VSRNG.js";
11
+ } from "./chunk-YW452ZAX.js";
12
12
  import {
13
13
  error_text
14
14
  } from "./chunk-CDY4NFQG.js";
@@ -30,10 +30,10 @@ import {
30
30
  time_density_hook,
31
31
  time_shell,
32
32
  time_transcript_line
33
- } from "./chunk-SL4GQ2XP.js";
33
+ } from "./chunk-XER6SSIB.js";
34
34
  import {
35
35
  lane_child_marker
36
- } from "./chunk-J3KSS7II.js";
36
+ } from "./chunk-4BHUPFKF.js";
37
37
  import {
38
38
  agent_session_environment,
39
39
  backlog_budget,
@@ -42,11 +42,12 @@ import {
42
42
  has_timed_out,
43
43
  json_value,
44
44
  process_identity
45
- } from "./chunk-2YSW3CXH.js";
45
+ } from "./chunk-3LE6VLSR.js";
46
46
  import {
47
47
  COMMAND_TIMEOUT_MS,
48
+ PROJECT_ROOT,
48
49
  stamp_file
49
- } from "./chunk-NEC4AT4Z.js";
50
+ } from "./chunk-DGT54IH5.js";
50
51
 
51
52
  // scripts/lib/bounded-pool.ts
52
53
  function pool_width(limit, total) {
@@ -1301,6 +1302,7 @@ var lane_handoff = { is_handed_off, is_ship_running };
1301
1302
 
1302
1303
  // scripts/issue/issue-labels.ts
1303
1304
  var EPIC_LABEL = "epic";
1305
+ var BUG_LABEL = "bug";
1304
1306
  var ENHANCEMENT_LABEL = "enhancement";
1305
1307
  var BREAKING_CHANGE_LABEL = "breaking-change";
1306
1308
  var IN_PROGRESS_LABEL = "in-progress";
@@ -1309,9 +1311,11 @@ var NEEDS_DECISION_LABEL = "needs-decision";
1309
1311
  var RUN_SOLO_LABEL = "run:solo";
1310
1312
  var RUN_LANE_LABEL = "run:lane";
1311
1313
  var PRIORITY_HIGH_LABEL = "priority:high";
1314
+ var AUTO_OK_LABEL = "auto-ok";
1312
1315
  var NEEDS_HUMAN_REVIEW_LABEL = "needs-human-review";
1313
1316
  var ALREADY_DONE_LABEL = "already-done";
1314
1317
  var RELEASE_LABEL = "release";
1318
+ var REVIEW_ROUND2_SKIPPED_LABEL = "review-round2-skipped";
1315
1319
  var INTERRUPT_ROUTE_LABEL = "route:interrupt";
1316
1320
  var REVIEW_CAP_ROUTE_LABEL = "route:review-cap";
1317
1321
  var SPLIT_ROUTE_LABEL = "route:split";
@@ -1390,6 +1394,32 @@ var WORKFLOW_LABELS = [
1390
1394
  color: "fef2c0",
1391
1395
  description: "Tracks the next release; its blockers are the merged work it publishes"
1392
1396
  },
1397
+ {
1398
+ name: AUTO_OK_LABEL,
1399
+ color: "0e8a16",
1400
+ description: "Opted in to unattended execution outside an epic"
1401
+ },
1402
+ {
1403
+ name: NEEDS_DECISION_LABEL,
1404
+ color: "d93f0b",
1405
+ description: "Parked: needs a decision before it can run"
1406
+ },
1407
+ {
1408
+ name: NEEDS_HUMAN_REVIEW_LABEL,
1409
+ color: "d93f0b",
1410
+ description: "Implement and verify, but stop before committing so a person can look"
1411
+ },
1412
+ {
1413
+ name: ALREADY_DONE_LABEL,
1414
+ color: "6f42c1",
1415
+ description: "Verified already merged \u2014 a person closes it"
1416
+ },
1417
+ {
1418
+ name: REVIEW_ROUND2_SKIPPED_LABEL,
1419
+ color: "c5def5",
1420
+ description: "Review round 2 was skipped under the condition in prompts/review.md"
1421
+ },
1422
+ { name: BUG_LABEL, color: "d73a4a", description: "Something isn't working" },
1393
1423
  ...FILING_ROUTE_LABELS,
1394
1424
  ...DEPTH_LABELS
1395
1425
  ];
@@ -2051,10 +2081,10 @@ async function issue_get_plan_fields_classified(issue_number) {
2051
2081
  async function issue_get_labels_and_body(issue_number) {
2052
2082
  return await issue_view_json(issue_number, "number,state,labels,body");
2053
2083
  }
2054
- async function issue_list_comments(issue_number) {
2084
+ async function issue_list_comments(issue_number, timeout_ms) {
2055
2085
  const path = `${git_gh_api_path.issue_comments_api_path(issue_number)}${git_gh_api_path.FULL_PAGE_QUERY}`;
2056
2086
  try {
2057
- return await git_gh_exec.exec_gh_api({ path, should_paginate: true });
2087
+ return await git_gh_exec.exec_gh_api({ path, should_paginate: true, timeout_ms });
2058
2088
  } catch {
2059
2089
  return void 0;
2060
2090
  }
@@ -2181,6 +2211,89 @@ var git_gh_issue_list = {
2181
2211
  issue_list
2182
2212
  };
2183
2213
 
2214
+ // scripts/issue/issue-watch-diff.ts
2215
+ import { z as z7 } from "zod";
2216
+ var RUN_MARKER = "<!-- josh:run -->";
2217
+ var BOT_TYPE = "Bot";
2218
+ var BOT_SUFFIX = "[bot]";
2219
+ var NO_COMMENT_ID = 0;
2220
+ var UNKNOWN_AUTHOR = "(unknown)";
2221
+ var UNKNOWN_TIME = "(undated)";
2222
+ var BODY_HEADING = "Body edited:";
2223
+ var REMOVED_PREFIX = "- ";
2224
+ var ADDED_PREFIX = "+ ";
2225
+ var COMMENT_HEADING = "New comment by ";
2226
+ var AT = " at ";
2227
+ var SECTION_SEPARATOR = "\n\n";
2228
+ var LINE_SEPARATOR = "\n";
2229
+ var CRLF = "\r\n";
2230
+ var comment_schema = z7.looseObject({
2231
+ id: z7.number(),
2232
+ user: z7.looseObject({ login: z7.string(), type: z7.string().optional() }).nullish(),
2233
+ created_at: z7.string().optional(),
2234
+ body: z7.string().nullish()
2235
+ });
2236
+ function is_bot(user) {
2237
+ return user?.type === BOT_TYPE || (user?.login.endsWith(BOT_SUFFIX) ?? false);
2238
+ }
2239
+ function is_automated(user, body) {
2240
+ return is_bot(user) || body.includes(RUN_MARKER);
2241
+ }
2242
+ function to_comment(raw) {
2243
+ const body = raw.body ?? "";
2244
+ const author = raw.user?.login ?? UNKNOWN_AUTHOR;
2245
+ const created_at = raw.created_at ?? UNKNOWN_TIME;
2246
+ return { id: raw.id, author, is_automated: is_automated(raw.user, body), created_at, body };
2247
+ }
2248
+ function parse_comments(json) {
2249
+ if (json === void 0) return void 0;
2250
+ const listing = read_json_listing(json, comment_schema);
2251
+ return listing.kind === "read" ? listing.rows.map((row) => to_comment(row)) : void 0;
2252
+ }
2253
+ function last_comment_id(comments) {
2254
+ return Math.max(NO_COMMENT_ID, ...comments.map((comment) => comment.id));
2255
+ }
2256
+ function baseline_of(snapshot) {
2257
+ return { body: snapshot.body, last_comment_id: last_comment_id(snapshot.comments) };
2258
+ }
2259
+ function lines_missing_from(source, other) {
2260
+ const present = new Set(other.split(LINE_SEPARATOR));
2261
+ return source.split(LINE_SEPARATOR).filter((line) => line.trim() !== "" && !present.has(line));
2262
+ }
2263
+ function to_lf(body) {
2264
+ return body.split(CRLF).join(LINE_SEPARATOR);
2265
+ }
2266
+ function body_section(previous_raw, current_raw) {
2267
+ const previous = to_lf(previous_raw);
2268
+ const current = to_lf(current_raw);
2269
+ if (previous === current) return void 0;
2270
+ const removed = lines_missing_from(previous, current).map((line) => `${REMOVED_PREFIX}${line}`);
2271
+ const added = lines_missing_from(current, previous).map((line) => `${ADDED_PREFIX}${line}`);
2272
+ return [BODY_HEADING, ...removed, ...added].join(LINE_SEPARATOR);
2273
+ }
2274
+ function comment_section(comment) {
2275
+ return `${COMMENT_HEADING}${comment.author}${AT}${comment.created_at}${LINE_SEPARATOR}${comment.body}`;
2276
+ }
2277
+ function new_person_comments(baseline, snapshot) {
2278
+ return snapshot.comments.filter(
2279
+ (comment) => comment.id > baseline.last_comment_id && !comment.is_automated
2280
+ );
2281
+ }
2282
+ function unread_diff(baseline, snapshot) {
2283
+ const body = body_section(baseline.body, snapshot.body);
2284
+ const comments = new_person_comments(baseline, snapshot).map(
2285
+ (comment) => comment_section(comment)
2286
+ );
2287
+ const sections = [...body === void 0 ? [] : [body], ...comments];
2288
+ return sections.length === 0 ? void 0 : sections.join(SECTION_SEPARATOR);
2289
+ }
2290
+ var issue_watch_diff = {
2291
+ RUN_MARKER,
2292
+ baseline_of,
2293
+ parse_comments,
2294
+ unread_diff
2295
+ };
2296
+
2184
2297
  // scripts/gh/git-gh-issue-write.ts
2185
2298
  var PATCH_METHOD = "PATCH";
2186
2299
  var DELETE_METHOD = "DELETE";
@@ -2213,7 +2326,9 @@ async function issue_edit_body(issue_number, body) {
2213
2326
  async function issue_comment(issue_number, body) {
2214
2327
  return await git_gh_exec.exec_gh_api({
2215
2328
  path: `${git_gh_api_path.issue_api_path(issue_number)}${COMMENTS_SEGMENT}`,
2216
- body: JSON.stringify({ body }),
2329
+ body: JSON.stringify({ body: `${body}
2330
+
2331
+ ${issue_watch_diff.RUN_MARKER}` }),
2217
2332
  jq_filter: HTML_URL_FILTER
2218
2333
  });
2219
2334
  }
@@ -2354,7 +2469,7 @@ var git_gh_issue_write = {
2354
2469
 
2355
2470
  // scripts/gh/git-gh-issue.ts
2356
2471
  var NUMBER_AND_BODY_FIELDS = "number,body";
2357
- var BACKLOG_SCAN_FIELDS = `number,title,body,${BLOCKED_BY_COUNT_FIELD}`;
2472
+ var BACKLOG_SCAN_FIELDS = `number,title,body,labels,${BLOCKED_BY_COUNT_FIELD}`;
2358
2473
  var NUMBER_TITLE_AND_LABELS_FIELDS = "number,title,labels";
2359
2474
  var SUMMARY_FIELDS = "number,title,labels,createdAt";
2360
2475
  var PICKUP_FIELDS = `${SUMMARY_FIELDS},blockedBy,body`;
@@ -2408,18 +2523,18 @@ var git_gh_issue = {
2408
2523
  // scripts/ci/pr-classification.ts
2409
2524
  import { readFileSync as readFileSync2 } from "node:fs";
2410
2525
  import { fileURLToPath } from "node:url";
2411
- import { z as z7 } from "zod";
2526
+ import { z as z8 } from "zod";
2412
2527
  var CLASSIFICATION_SET = new Set(RELEASE_CLASSIFICATION_NAMES);
2413
2528
  var ISSUE_BUG_LABEL = "bug";
2414
2529
  var DECLARATION_PREFIX = "- \u30EA\u30EA\u30FC\u30B9\u5206\u985E: ";
2415
2530
  var DECLARATION = new RegExp(`^${DECLARATION_PREFIX}(.+)$`, "gmu");
2416
2531
  var LEGACY_LABELS = /* @__PURE__ */ new Set(["semver-major", "semver-minor"]);
2417
- var LABEL = z7.object({ name: z7.string() });
2418
- var USER = z7.object({ login: z7.string() });
2419
- var PULL_REQUEST = z7.object({ number: z7.number(), user: USER });
2420
- var EVENT = z7.object({
2532
+ var LABEL = z8.object({ name: z8.string() });
2533
+ var USER = z8.object({ login: z8.string() });
2534
+ var PULL_REQUEST = z8.object({ number: z8.number(), user: USER });
2535
+ var EVENT = z8.object({
2421
2536
  pull_request: PULL_REQUEST,
2422
- repository: z7.object({ full_name: z7.string() })
2537
+ repository: z8.object({ full_name: z8.string() })
2423
2538
  });
2424
2539
  function classification_error(labels, author) {
2425
2540
  const legacy = labels.filter((label) => LEGACY_LABELS.has(label.toLowerCase()));
@@ -2442,7 +2557,7 @@ function release_candidates(candidates) {
2442
2557
  return candidates.filter((candidate) => candidate !== ENHANCEMENT_LABEL);
2443
2558
  }
2444
2559
  function issue_candidates(issue_json) {
2445
- const issue2 = z7.object({ labels: z7.array(LABEL), body: z7.string().nullable() }).parse(JSON.parse(issue_json));
2560
+ const issue2 = z8.object({ labels: z8.array(LABEL), body: z8.string().nullable() }).parse(JSON.parse(issue_json));
2446
2561
  const names = issue2.labels.map((label) => label.name.toLowerCase());
2447
2562
  const declared = [...(issue2.body ?? "").matchAll(DECLARATION)].map((match) => match[1] ?? "");
2448
2563
  const candidates = [...release_candidates([...names, ...declared].filter(is_classification))];
@@ -2517,30 +2632,30 @@ async function poll_until(is_done, options) {
2517
2632
  var poll = { poll_until, sleep: sleep2 };
2518
2633
 
2519
2634
  // scripts/gh/git-gh-pr.ts
2520
- import { z as z11 } from "zod";
2635
+ import { z as z12 } from "zod";
2521
2636
 
2522
2637
  // scripts/gh/git-gh-pr-rest.ts
2523
- import { z as z8 } from "zod";
2524
- var rest_repo_schema = z8.looseObject({ full_name: z8.string().optional() }).nullish();
2525
- var rest_pull_side_schema = z8.looseObject({ repo: rest_repo_schema });
2526
- var rest_pull_schema = z8.looseObject({
2527
- number: z8.number(),
2528
- html_url: z8.string().optional(),
2529
- body: z8.string().nullish(),
2530
- state: z8.string().optional(),
2531
- merged: z8.boolean().nullish(),
2532
- merged_at: z8.string().nullish(),
2533
- mergeable: z8.boolean().nullish(),
2534
- mergeable_state: z8.string().optional(),
2638
+ import { z as z9 } from "zod";
2639
+ var rest_repo_schema = z9.looseObject({ full_name: z9.string().optional() }).nullish();
2640
+ var rest_pull_side_schema = z9.looseObject({ repo: rest_repo_schema });
2641
+ var rest_pull_schema = z9.looseObject({
2642
+ number: z9.number(),
2643
+ html_url: z9.string().optional(),
2644
+ body: z9.string().nullish(),
2645
+ state: z9.string().optional(),
2646
+ merged: z9.boolean().nullish(),
2647
+ merged_at: z9.string().nullish(),
2648
+ mergeable: z9.boolean().nullish(),
2649
+ mergeable_state: z9.string().optional(),
2535
2650
  // `sha` is the head commit, which is what both halves of the merge-gate rollup are keyed by —
2536
2651
  // REST hangs the check runs and the status contexts off the commit rather than off the pull
2537
2652
  // request.
2538
- head: z8.looseObject({ ref: z8.string().optional(), sha: z8.string().optional(), repo: rest_repo_schema }).nullish(),
2653
+ head: z9.looseObject({ ref: z9.string().optional(), sha: z9.string().optional(), repo: rest_repo_schema }).nullish(),
2539
2654
  base: rest_pull_side_schema.nullish(),
2540
2655
  // `node_id` is what the GraphQL auto-merge mutation addresses a pull request by, and `auto_merge`
2541
2656
  // is `null` until auto-merge is enabled — both read by `git-gh-pr-auto-merge.ts`.
2542
- node_id: z8.string().optional(),
2543
- auto_merge: z8.looseObject({}).nullish()
2657
+ node_id: z9.string().optional(),
2658
+ auto_merge: z9.looseObject({}).nullish()
2544
2659
  });
2545
2660
  var NOT_A_PULL_MESSAGE = "gh api answered something other than a pull request object";
2546
2661
  var NOT_A_PULL_LISTING_MESSAGE = "gh api answered something other than a pull request listing";
@@ -2759,14 +2874,14 @@ var git_gh_pr_read = {
2759
2874
  };
2760
2875
 
2761
2876
  // scripts/gh/git-gh-pr-review.ts
2762
- import { z as z9 } from "zod";
2877
+ import { z as z10 } from "zod";
2763
2878
  var REVIEW_APPROVED = "APPROVED";
2764
2879
  var REVIEW_CHANGES_REQUESTED = "CHANGES_REQUESTED";
2765
2880
  var REVIEW_NONE = "";
2766
2881
  var STATE_CHANGING_REVIEWS = /* @__PURE__ */ new Set([REVIEW_APPROVED, REVIEW_CHANGES_REQUESTED]);
2767
- var rest_review_schema = z9.looseObject({
2768
- state: z9.string().optional(),
2769
- user: z9.looseObject({ login: z9.string().optional() }).nullish()
2882
+ var rest_review_schema = z10.looseObject({
2883
+ state: z10.string().optional(),
2884
+ user: z10.looseObject({ login: z10.string().optional() }).nullish()
2770
2885
  });
2771
2886
  var NOT_A_REVIEW_LISTING = "gh api answered something other than a review listing";
2772
2887
  function parse_rest_reviews(reviews_json) {
@@ -2799,18 +2914,18 @@ function to_review_decision(reviews_json) {
2799
2914
  var git_gh_pr_review = { to_review_decision };
2800
2915
 
2801
2916
  // scripts/gh/git-gh-pr-rollup.ts
2802
- import { z as z10 } from "zod";
2917
+ import { z as z11 } from "zod";
2803
2918
  var STATUS_CONTEXT_TYPE_NAME = "StatusContext";
2804
2919
  var TYPE_NAME_KEY = "__typename";
2805
- var rollup_element_schema = z10.looseObject({});
2806
- var check_runs_page_schema = z10.looseObject({
2920
+ var rollup_element_schema = z11.looseObject({});
2921
+ var check_runs_page_schema = z11.looseObject({
2807
2922
  // Required, not optional: GitHub always names the key, and accepting a page without one would
2808
2923
  // answer an empty rollup — which `git-pr-followup.ts` reports as "this branch has no checks".
2809
- check_runs: z10.array(rollup_element_schema)
2924
+ check_runs: z11.array(rollup_element_schema)
2810
2925
  });
2811
- var id_holder_schema = z10.object({ id: z10.number() });
2812
- var status_page_schema = z10.looseObject({
2813
- statuses: z10.array(rollup_element_schema)
2926
+ var id_holder_schema = z11.object({ id: z11.number() });
2927
+ var status_page_schema = z11.looseObject({
2928
+ statuses: z11.array(rollup_element_schema)
2814
2929
  });
2815
2930
  var NOT_A_CHECK_RUNS_LISTING = "gh api answered something other than a check run listing";
2816
2931
  var NOT_A_STATUS_LISTING = "gh api answered something other than a commit status listing";
@@ -2944,7 +3059,7 @@ var MERGE_READ_BACK_ATTEMPTS = 3;
2944
3059
  var MERGE_READ_BACK_INTERVAL_MS = 1e3;
2945
3060
  var PR_NUMBER_PATTERN = /\/pull\/([1-9]\d*)$/u;
2946
3061
  var LABELS_SEGMENT2 = "/labels";
2947
- var PR_LABELS = z11.array(z11.object({ name: z11.string() }));
3062
+ var PR_LABELS = z12.array(z12.object({ name: z12.string() }));
2948
3063
  async function add_pr_classification(number, label) {
2949
3064
  await git_gh_exec.exec_gh_api({
2950
3065
  path: `${git_gh_api_path.issue_api_path(number)}${LABELS_SEGMENT2}`,
@@ -3206,6 +3321,7 @@ async function wait_for_pr_success(options) {
3206
3321
  let carried = { next_stable_count: 0, next_failure_count: 0 };
3207
3322
  for (let attempt = 0; attempt < options.max_attempts; attempt += 1) {
3208
3323
  console.info(`Checking PR status\u2026 (${String(attempt + 1)}/${String(options.max_attempts)})`);
3324
+ await options.before_poll?.();
3209
3325
  carried = await attempt_pr_success_poll({
3210
3326
  options,
3211
3327
  stable_count: carried.next_stable_count,
@@ -3223,6 +3339,14 @@ async function default_fetch_pr_state(branch_name, should_read_review_decision =
3223
3339
  const decision = await git_gh_pr_snapshot.pr_get_review_decision(checks.pr_number);
3224
3340
  return { ...snapshot, review_decision: read_string(decision) };
3225
3341
  }
3342
+ function observed_fetcher(observe) {
3343
+ if (observe === void 0) return default_fetch_pr_state;
3344
+ return async function fetch_observed(branch_name, should_read_review_decision) {
3345
+ const snapshot = await default_fetch_pr_state(branch_name, should_read_review_decision);
3346
+ await observe(snapshot);
3347
+ return snapshot;
3348
+ };
3349
+ }
3226
3350
 
3227
3351
  // scripts/gh/git-pr-checks-watch.ts
3228
3352
  var PR_CHECKS_WATCH_TIMEOUT_MS = 12e4;
@@ -3252,10 +3376,10 @@ var CHECKS_SETTLED_EVALUATOR = {
3252
3376
  describe: describe_checks_failure,
3253
3377
  should_read_review_decision: should_never_read_review_decision
3254
3378
  };
3255
- async function watch_until_settled(branch_name) {
3379
+ async function watch_until_settled(branch_name, observe) {
3256
3380
  await wait_for_pr_success({
3257
3381
  branch_name,
3258
- fetcher: default_fetch_pr_state,
3382
+ fetcher: observed_fetcher(observe),
3259
3383
  interval_ms: CHECK_WAIT_INTERVAL_MS,
3260
3384
  max_attempts: compute_max_attempts(
3261
3385
  PR_CHECKS_WATCH_TIMEOUT_MS / SECONDS_TO_MS,
@@ -3269,9 +3393,9 @@ async function fail_when_no_checks(branch_name) {
3269
3393
  const snapshot = await default_fetch_pr_state(branch_name, should_never_read_review_decision);
3270
3394
  if (snapshot.rollup.length === 0) throw new Error(NO_CHECKS_MESSAGE);
3271
3395
  }
3272
- async function pr_checks_watch(branch_name) {
3396
+ async function pr_checks_watch(branch_name, observe) {
3273
3397
  try {
3274
- await watch_until_settled(branch_name);
3398
+ await watch_until_settled(branch_name, observe);
3275
3399
  return { timed_out: false };
3276
3400
  } catch (error) {
3277
3401
  if (!is_pr_checks_timeout(error)) throw error;
@@ -3291,15 +3415,42 @@ var git_gh_command = {
3291
3415
  ...git_gh_repo
3292
3416
  };
3293
3417
 
3418
+ // scripts/gh/gh-spawn.ts
3419
+ var NO_BUDGET = 0;
3420
+ function fetch_repo_name(timeout_ms) {
3421
+ const stdout = git_gh_exec.read_gh_api_sync({
3422
+ path: git_gh_api_path.repo_api_path(),
3423
+ jq_filter: ".full_name",
3424
+ cwd: PROJECT_ROOT,
3425
+ timeout_ms: timeout_ms ?? NO_BUDGET
3426
+ });
3427
+ const name = stdout?.trim();
3428
+ return name === "" ? void 0 : name;
3429
+ }
3430
+ function get_repo_name_with_owner() {
3431
+ return fetch_repo_name(void 0);
3432
+ }
3433
+ function get_repo_name_with_owner_within(timeout_ms) {
3434
+ return fetch_repo_name(timeout_ms);
3435
+ }
3436
+ var gh_spawn = { get_repo_name_with_owner, get_repo_name_with_owner_within };
3437
+
3294
3438
  export {
3295
3439
  bounded_pool,
3440
+ git_gh_api_path,
3441
+ read_json_listing,
3442
+ parse_json_object_or_undefined,
3443
+ has_stdout_field,
3444
+ git_gh_exec,
3445
+ git_gh_issue_read,
3446
+ issue_watch_diff,
3447
+ issue_citation,
3448
+ session_cite,
3296
3449
  shell_segments,
3297
3450
  bash_triggers,
3298
3451
  tail_commands,
3299
3452
  filing_cap,
3300
3453
  CONTEXT_CUT_THRESHOLD,
3301
- issue_citation,
3302
- session_cite,
3303
3454
  run_hold,
3304
3455
  run_cut_handoff,
3305
3456
  run_cut,
@@ -3315,12 +3466,8 @@ export {
3315
3466
  has_label_name,
3316
3467
  lane_handoff,
3317
3468
  lane_park,
3469
+ gh_spawn,
3318
3470
  repo_party,
3319
- git_gh_api_path,
3320
- read_json_listing,
3321
- parse_json_object_or_undefined,
3322
- git_gh_exec,
3323
- git_gh_issue_read,
3324
3471
  git_gh_pr_read,
3325
3472
  git_gh_command
3326
3473
  };
@@ -1,34 +1,34 @@
1
1
  #!/usr/bin/env tsx
2
2
  import {
3
3
  pretool_guard
4
- } from "./chunk-GJ7JPIHN.js";
5
- import "./chunk-DCY2GWHC.js";
4
+ } from "./chunk-JXQBK323.js";
5
+ import "./chunk-MSYSUSY6.js";
6
6
  import {
7
7
  bounded_pool
8
- } from "./chunk-GNDJ7NJ7.js";
8
+ } from "./chunk-YZXYOAZ3.js";
9
9
  import {
10
10
  build_envelope,
11
11
  compose_context,
12
12
  format_edited_payload
13
- } from "./chunk-STDSEPWU.js";
14
- import "./chunk-JBBMAPC4.js";
15
- import "./chunk-U32VSRNG.js";
13
+ } from "./chunk-EMB55BDF.js";
14
+ import "./chunk-IX6TTTI6.js";
15
+ import "./chunk-YW452ZAX.js";
16
16
  import "./chunk-CDY4NFQG.js";
17
- import "./chunk-LMWBRJIP.js";
18
- import "./chunk-IYVOLN6A.js";
19
- import "./chunk-WNFJLBXI.js";
20
- import "./chunk-EAQEGME7.js";
17
+ import "./chunk-7KMN5QB5.js";
18
+ import "./chunk-2G5F2YCD.js";
19
+ import "./chunk-QL6QTPWN.js";
20
+ import "./chunk-5SJSSCJG.js";
21
21
  import {
22
22
  hook_decision
23
- } from "./chunk-EBSHN25W.js";
23
+ } from "./chunk-MU4LJFIV.js";
24
24
  import {
25
25
  time_density_hook
26
- } from "./chunk-SL4GQ2XP.js";
27
- import "./chunk-J3KSS7II.js";
26
+ } from "./chunk-XER6SSIB.js";
27
+ import "./chunk-4BHUPFKF.js";
28
28
  import {
29
29
  json_value
30
- } from "./chunk-2YSW3CXH.js";
31
- import "./chunk-NEC4AT4Z.js";
30
+ } from "./chunk-3LE6VLSR.js";
31
+ import "./chunk-DGT54IH5.js";
32
32
 
33
33
  // scripts/hooks/codex-hook-adapter.ts
34
34
  import { text } from "node:stream/consumers";
@@ -9,14 +9,14 @@ import {
9
9
  is_enabled,
10
10
  notice_refusal_path,
11
11
  refusal_path
12
- } from "./chunk-DCY2GWHC.js";
13
- import "./chunk-WNFJLBXI.js";
14
- import "./chunk-EAQEGME7.js";
15
- import "./chunk-EBSHN25W.js";
16
- import "./chunk-SL4GQ2XP.js";
17
- import "./chunk-J3KSS7II.js";
18
- import "./chunk-2YSW3CXH.js";
19
- import "./chunk-NEC4AT4Z.js";
12
+ } from "./chunk-MSYSUSY6.js";
13
+ import "./chunk-QL6QTPWN.js";
14
+ import "./chunk-5SJSSCJG.js";
15
+ import "./chunk-MU4LJFIV.js";
16
+ import "./chunk-XER6SSIB.js";
17
+ import "./chunk-4BHUPFKF.js";
18
+ import "./chunk-3LE6VLSR.js";
19
+ import "./chunk-DGT54IH5.js";
20
20
  export {
21
21
  DISABLED_VALUES,
22
22
  SWITCH_ENV_KEY,
@@ -2,11 +2,11 @@
2
2
  import {
3
3
  report_no_payload,
4
4
  run_hook
5
- } from "./chunk-STDSEPWU.js";
6
- import "./chunk-JBBMAPC4.js";
7
- import "./chunk-SL4GQ2XP.js";
8
- import "./chunk-2YSW3CXH.js";
9
- import "./chunk-NEC4AT4Z.js";
5
+ } from "./chunk-EMB55BDF.js";
6
+ import "./chunk-IX6TTTI6.js";
7
+ import "./chunk-XER6SSIB.js";
8
+ import "./chunk-3LE6VLSR.js";
9
+ import "./chunk-DGT54IH5.js";
10
10
 
11
11
  // scripts/hooks/format-edited-cli.ts
12
12
  import { text } from "node:stream/consumers";