@joshuafolkken/kit 1.1387.0 → 1.1453.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 (278) 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-park.md +2 -0
  5. package/.claude/skills/workflow-commands/backlogrun-steps.md +13 -10
  6. package/.claude/skills/workflow-commands/backlogrun.md +3 -2
  7. package/.claude/skills/workflow-commands/chain-rule.md +4 -2
  8. package/.claude/skills/workflow-commands/fullrun-steps.md +1 -1
  9. package/.claude/skills/workflow-commands/halfrun.md +1 -1
  10. package/.claude/skills/workflow-commands/issue-comments.md +6 -0
  11. package/.claude/skills/workflow-commands/kickoff.md +12 -13
  12. package/.claude/skills/workflow-commands/observation-filing.md +1 -1
  13. package/.claude/skills/workflow-commands/observation-ledger.md +3 -2
  14. package/.claude/skills/workflow-commands/pre-gate-cut.md +5 -3
  15. package/.claude/skills/workflow-commands/prerequisite.md +6 -0
  16. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  17. package/.claude/skills/workflow-commands/split-assessment.md +2 -2
  18. package/README.md +27 -4
  19. package/dist/hooks/audit-provision.js +2 -2
  20. package/dist/hooks/batch-guard.js +7 -7
  21. package/dist/hooks/{chunk-2YSW3CXH.js → chunk-3C4XRYG6.js} +35 -11
  22. package/dist/hooks/{chunk-GJ7JPIHN.js → chunk-5C7L6FRC.js} +2704 -190
  23. package/dist/hooks/{chunk-FZ6FUSBM.js → chunk-723HKZO5.js} +1 -1
  24. package/dist/hooks/{chunk-STDSEPWU.js → chunk-D3NJXN5M.js} +4 -4
  25. package/dist/hooks/{chunk-NEC4AT4Z.js → chunk-DGT54IH5.js} +4 -0
  26. package/dist/hooks/{chunk-LMWBRJIP.js → chunk-EF5GQ6WS.js} +3 -3
  27. package/dist/hooks/{chunk-JBBMAPC4.js → chunk-IX6TTTI6.js} +4 -0
  28. package/dist/hooks/{chunk-IYVOLN6A.js → chunk-LBFYEOXJ.js} +3 -3
  29. package/dist/hooks/{chunk-SL4GQ2XP.js → chunk-MBJYQPEK.js} +106 -23
  30. package/dist/hooks/{chunk-WNFJLBXI.js → chunk-NO4AALP5.js} +3 -3
  31. package/dist/hooks/{chunk-J3KSS7II.js → chunk-OLMO72ON.js} +1 -1
  32. package/dist/hooks/{chunk-DCY2GWHC.js → chunk-SHYUQOIS.js} +5 -5
  33. package/dist/hooks/{chunk-EAQEGME7.js → chunk-UT7YC3N2.js} +1 -1
  34. package/dist/hooks/{chunk-EBSHN25W.js → chunk-W5ZKGTSY.js} +4 -4
  35. package/dist/hooks/{chunk-GNDJ7NJ7.js → chunk-Y3GKIKGW.js} +209 -56
  36. package/dist/hooks/{chunk-U32VSRNG.js → chunk-Z4XI7CZS.js} +89 -34
  37. package/dist/hooks/codex-hook-adapter.js +15 -15
  38. package/dist/hooks/duplicate-read-guard.js +8 -8
  39. package/dist/hooks/format-edited.js +5 -5
  40. package/dist/hooks/inputs.json +261 -201
  41. package/dist/hooks/investigation-guard.js +8 -8
  42. package/dist/hooks/pretool-guard.js +14 -14
  43. package/dist/hooks/session-lang.js +69 -16
  44. package/dist/hooks/stop-guard.js +13 -38
  45. package/dist/josh.js +95 -19
  46. package/package.json +4 -3
  47. package/prompts/collaboration-workflow/issue-template.md +10 -8
  48. package/prompts/review.md +30 -4
  49. package/scripts/agent/claude-agent-argv.ts +13 -1
  50. package/scripts/auth/auth-setup-cli.ts +101 -0
  51. package/scripts/auth/claude-token-output.ts +78 -0
  52. package/scripts/auth/claude-token.ts +68 -0
  53. package/scripts/auto-ok/auto-ok-judge-cli.ts +125 -0
  54. package/scripts/auto-ok/auto-ok-judge-read.ts +95 -0
  55. package/scripts/auto-ok/auto-ok-judge-write.ts +109 -0
  56. package/scripts/auto-ok/auto-ok-judge.ts +67 -0
  57. package/scripts/backlog/backlog-drive-cli.ts +14 -0
  58. package/scripts/backlog/backlog-drive-epic.ts +24 -8
  59. package/scripts/backlog/backlog-drive-launch.ts +3 -0
  60. package/scripts/backlog/backlog-drive-named-offer.ts +7 -2
  61. package/scripts/backlog/backlog-drive-named.ts +4 -2
  62. package/scripts/backlog/backlog-drive-unread.ts +56 -0
  63. package/scripts/backlog/backlog-drive.ts +38 -11
  64. package/scripts/backlog/backlog-overlap.ts +22 -5
  65. package/scripts/backlog/backlog-ready.ts +1 -3
  66. package/scripts/backlog/backlogrun-args.ts +13 -2
  67. package/scripts/backlog/backlogrun-cli.ts +91 -19
  68. package/scripts/backlog/backlogrun-launch.ts +24 -0
  69. package/scripts/backlog/backlogrun-replace.ts +166 -0
  70. package/scripts/backlog/backlogrun-stop.ts +178 -0
  71. package/scripts/behavior/behavior-cli.ts +6 -1
  72. package/scripts/doctor/doctor-io.ts +60 -9
  73. package/scripts/doctor/doctor.ts +20 -1
  74. package/scripts/document/document-byte-budget.ts +3 -3
  75. package/scripts/epic/epic-bundle-cli.ts +8 -8
  76. package/scripts/epic/epic-bundle-referenced.ts +2 -5
  77. package/scripts/epic/epic-bundle.ts +39 -4
  78. package/scripts/exports/unused-members-cli.ts +2 -1
  79. package/scripts/followup/followup-checks-event.ts +82 -0
  80. package/scripts/followup/git-followup-finish.ts +16 -2
  81. package/scripts/followup/git-followup-workflow.ts +5 -2
  82. package/scripts/followup/git-pr-followup-checks.ts +18 -4
  83. package/scripts/followup/git-pr-followup-wrapup.ts +5 -0
  84. package/scripts/followup/git-pr-followup.ts +4 -1
  85. package/scripts/fresh-machine/fresh-machine-cli.ts +204 -0
  86. package/scripts/fresh-machine/fresh-machine-docker.ts +65 -0
  87. package/scripts/fresh-machine/fresh-machine-image.ts +62 -0
  88. package/scripts/fresh-machine/fresh-machine-log.ts +61 -0
  89. package/scripts/fresh-machine/fresh-machine-patterns.ts +175 -0
  90. package/scripts/fresh-machine/fresh-machine-run.ts +215 -0
  91. package/scripts/fresh-machine/fresh-machine-script.ts +45 -0
  92. package/scripts/fresh-machine/fresh-machine-spec.ts +57 -0
  93. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +34 -0
  94. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +31 -0
  95. package/scripts/gate/gate-report.ts +70 -15
  96. package/scripts/gate/project-checks.ts +18 -4
  97. package/scripts/gate/scoped-green.ts +2 -1
  98. package/scripts/gate/verification-gate.ts +4 -3
  99. package/scripts/gh/gh-author-association.ts +14 -0
  100. package/scripts/gh/git-gh-conditional.ts +66 -0
  101. package/scripts/gh/git-gh-exec.ts +1 -1
  102. package/scripts/gh/git-gh-issue-read.ts +6 -3
  103. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  104. package/scripts/gh/git-gh-issue-write.ts +5 -1
  105. package/scripts/gh/git-gh-issue.ts +13 -1
  106. package/scripts/gh/git-pr-checks-eval.ts +13 -0
  107. package/scripts/gh/git-pr-checks-parse.ts +8 -1
  108. package/scripts/gh/git-pr-checks-watch.ts +11 -4
  109. package/scripts/gh/git-pr-checks.ts +36 -2
  110. package/scripts/git/git-command.ts +16 -4
  111. package/scripts/git/git-schemas.ts +1 -0
  112. package/scripts/git/git-spawn-sync.ts +1 -1
  113. package/scripts/hooks/pretool-guard.ts +3 -1
  114. package/scripts/init/hook-command-rewrite.ts +31 -0
  115. package/scripts/init/init-actions.ts +7 -4
  116. package/scripts/init/init-ai-copy.ts +34 -11
  117. package/scripts/init/init-basic.ts +9 -4
  118. package/scripts/init/init-bootstrap.ts +6 -2
  119. package/scripts/init/init-dry-run-report.ts +150 -0
  120. package/scripts/init/init-dry-run.ts +189 -0
  121. package/scripts/init/init-install.ts +8 -1
  122. package/scripts/init/init-logic-toolchain.ts +76 -0
  123. package/scripts/init/init-logic.ts +2 -0
  124. package/scripts/init/init.ts +62 -42
  125. package/scripts/init/kit-setup-state.ts +11 -17
  126. package/scripts/init/own-formatter.ts +21 -0
  127. package/scripts/init/project-profile.ts +60 -12
  128. package/scripts/init/start-dry-run.ts +70 -0
  129. package/scripts/init/start-exec.ts +27 -1
  130. package/scripts/init/start-plan.ts +23 -3
  131. package/scripts/init/start-setup-pr.ts +13 -24
  132. package/scripts/init/start-steps.ts +62 -1
  133. package/scripts/init/start.ts +38 -17
  134. package/scripts/init/workflow-mark.ts +35 -0
  135. package/scripts/init/working-tree.ts +116 -0
  136. package/scripts/issue/issue-ack-cli.ts +84 -0
  137. package/scripts/issue/issue-auto-ok.ts +68 -99
  138. package/scripts/issue/issue-file-cli.ts +17 -17
  139. package/scripts/issue/issue-file.ts +1 -6
  140. package/scripts/issue/issue-labels.ts +46 -10
  141. package/scripts/issue/issue-release-cli.ts +69 -23
  142. package/scripts/issue/issue-release.ts +3 -1
  143. package/scripts/issue/issue-state-cli.ts +14 -4
  144. package/scripts/issue/issue-watch-diff.ts +152 -0
  145. package/scripts/issue/issue-watch-gate.ts +81 -0
  146. package/scripts/issue/issue-watch-hook.ts +54 -0
  147. package/scripts/issue/issue-watch.ts +240 -0
  148. package/scripts/issue/measure-rerun-cli.ts +3 -4
  149. package/scripts/josh/josh-command-map.ts +4 -0
  150. package/scripts/josh/josh-commands-ai.ts +11 -0
  151. package/scripts/josh/josh-commands-backlog.ts +2 -2
  152. package/scripts/josh/josh-commands-development.ts +1 -1
  153. package/scripts/josh/josh-commands-issue.ts +10 -3
  154. package/scripts/josh/josh-commands-lane.ts +11 -2
  155. package/scripts/josh/josh-commands-project.ts +26 -2
  156. package/scripts/josh/josh-verdict.ts +33 -4
  157. package/scripts/josh/process-identity.ts +32 -6
  158. package/scripts/lane/claude-lane-broker.ts +142 -0
  159. package/scripts/lane/lane-await.ts +6 -2
  160. package/scripts/lane/lane-broker-server.ts +69 -0
  161. package/scripts/lane/lane-cache.ts +37 -7
  162. package/scripts/lane/lane-capacity.ts +8 -6
  163. package/scripts/lane/lane-child-invocation.ts +1 -0
  164. package/scripts/lane/lane-cli.ts +15 -1
  165. package/scripts/lane/lane-close.ts +15 -6
  166. package/scripts/lane/lane-dispatch.ts +36 -10
  167. package/scripts/lane/lane-environment.ts +1 -1
  168. package/scripts/lane/lane-launch-cli.ts +13 -4
  169. package/scripts/lane/lane-ledger.ts +21 -3
  170. package/scripts/lane/lane-measure-cli.ts +10 -2
  171. package/scripts/lane/lane-open.ts +9 -1
  172. package/scripts/lane/lane-preserve.ts +49 -0
  173. package/scripts/lane/lane-reap.ts +20 -5
  174. package/scripts/lane/lane-registry.ts +6 -0
  175. package/scripts/lane/lane-restart-cli.ts +51 -0
  176. package/scripts/lane/lane-restart.ts +175 -0
  177. package/scripts/lane/lane-session-broker.ts +363 -0
  178. package/scripts/lane/lane-spent.ts +195 -0
  179. package/scripts/lane/lane-stage-stats.ts +27 -3
  180. package/scripts/lane/lane-stop-stats.ts +96 -0
  181. package/scripts/lane/openai-lane-supervisor.ts +2 -2
  182. package/scripts/lane/process-tools.ts +31 -0
  183. package/scripts/lib/buffered-process.ts +36 -2
  184. package/scripts/lib/pnpm-reach.ts +27 -0
  185. package/scripts/lib/status-icons.ts +5 -1
  186. package/scripts/lint/lint-parallel.ts +19 -2
  187. package/scripts/observations/observation-ledger-home.ts +1 -0
  188. package/scripts/observations/observation-ledger-migrate.ts +3 -15
  189. package/scripts/release/release-issue-close.ts +133 -0
  190. package/scripts/release/release-publish.ts +12 -1
  191. package/scripts/repo/repository-labels.ts +11 -1
  192. package/scripts/review/comment-ranges.ts +199 -0
  193. package/scripts/review/review-attest-cli.ts +21 -6
  194. package/scripts/review/review-brief-cli.ts +24 -7
  195. package/scripts/review/review-code-tree.ts +119 -0
  196. package/scripts/review/review-comment-round.ts +114 -0
  197. package/scripts/review/review-record-cli.ts +39 -17
  198. package/scripts/review/review-round2-cli.ts +16 -5
  199. package/scripts/review/review-round2.ts +30 -10
  200. package/scripts/review/review-stamps.ts +22 -1
  201. package/scripts/rules/implementation-cut.ts +3 -3
  202. package/scripts/rules/pre-gate-cut.ts +1 -1
  203. package/scripts/run/board/run-board-checks.ts +42 -0
  204. package/scripts/run/board/run-board-cli.ts +2 -0
  205. package/scripts/run/board/run-board-every.ts +3 -1
  206. package/scripts/run/board/run-board-fit.ts +16 -5
  207. package/scripts/run/board/run-board-fresh.ts +64 -0
  208. package/scripts/run/board/run-board-header.ts +129 -53
  209. package/scripts/run/board/run-board-labels.ts +47 -4
  210. package/scripts/run/board/run-board-lane-event.ts +66 -0
  211. package/scripts/run/board/run-board-layout.ts +57 -9
  212. package/scripts/run/board/run-board-now.ts +234 -0
  213. package/scripts/run/board/run-board-operation-read.ts +75 -0
  214. package/scripts/run/board/run-board-operation.ts +150 -0
  215. package/scripts/run/board/run-board-phase.ts +26 -1
  216. package/scripts/run/board/run-board-plan.ts +4 -6
  217. package/scripts/run/board/run-board-read.ts +49 -3
  218. package/scripts/run/board/run-board-reason.ts +124 -0
  219. package/scripts/run/board/run-board-render-checks.ts +55 -0
  220. package/scripts/run/board/run-board-render-legend.ts +12 -3
  221. package/scripts/run/board/run-board-render-slot.ts +2 -2
  222. package/scripts/run/board/run-board-render-tail.ts +128 -0
  223. package/scripts/run/board/run-board-render-thanks.ts +50 -0
  224. package/scripts/run/board/run-board-render-title.ts +58 -0
  225. package/scripts/run/board/run-board-render.ts +96 -80
  226. package/scripts/run/board/run-board-row-yield.ts +32 -0
  227. package/scripts/run/board/run-board-setup.ts +61 -13
  228. package/scripts/run/board/run-board-state.ts +10 -0
  229. package/scripts/run/board/run-board-status.ts +66 -7
  230. package/scripts/run/board/run-board-thanks-csv.ts +71 -0
  231. package/scripts/run/board/run-board-thanks-read.ts +112 -0
  232. package/scripts/run/board/run-board-thanks.ts +53 -0
  233. package/scripts/run/board/run-board-tick.ts +50 -21
  234. package/scripts/run/board/run-board-usual.ts +44 -0
  235. package/scripts/run/carry/run-carry-args.ts +9 -1
  236. package/scripts/run/carry/run-carry-cli.ts +2 -45
  237. package/scripts/run/carry/run-carry-end.ts +73 -0
  238. package/scripts/run/carry/run-carry.ts +8 -1
  239. package/scripts/run/entry/run-entry-cli.ts +5 -0
  240. package/scripts/run/event/run-event-checks.ts +54 -0
  241. package/scripts/run/event/run-event-render.ts +2 -0
  242. package/scripts/run/event/run-event-scope.ts +1 -0
  243. package/scripts/run/event/run-event-setup.ts +55 -11
  244. package/scripts/run/event/run-event-stream.ts +27 -11
  245. package/scripts/run/merge/run-merge-cli.ts +7 -4
  246. package/scripts/run/merge/run-merge-ship.ts +61 -0
  247. package/scripts/run/merge/run-merge-steps.ts +7 -14
  248. package/scripts/run/merge/run-merge-token.ts +16 -2
  249. package/scripts/run/run-headless.ts +1 -0
  250. package/scripts/run/run-step.ts +2 -0
  251. package/scripts/run/ship/run-ship-cli.ts +22 -2
  252. package/scripts/run/ship/run-ship-return.ts +31 -13
  253. package/scripts/run/ship/run-ship-review-steps.ts +17 -4
  254. package/scripts/run/ship/run-ship-stage.ts +1 -0
  255. package/scripts/run/wake/run-wake-await.ts +130 -0
  256. package/scripts/run/wake/run-wake-cli.ts +60 -71
  257. package/scripts/run/wake/run-wake-describe.ts +34 -2
  258. package/scripts/run/wake/run-wake-driver.ts +11 -4
  259. package/scripts/run/wake/run-wake-session.ts +20 -3
  260. package/scripts/run/wake/run-wake-stop.ts +37 -0
  261. package/scripts/run/wake/run-wake-supervise.ts +44 -0
  262. package/scripts/sync/claude-settings-merge.ts +144 -0
  263. package/scripts/sync/sync-ai-files.ts +28 -3
  264. package/scripts/sync/sync.ts +15 -0
  265. package/scripts/test/project-test-script.ts +73 -0
  266. package/scripts/test/skip-marker.ts +14 -1
  267. package/scripts/test/test-related.ts +3 -2
  268. package/scripts/test/test-unit-guard.ts +78 -14
  269. package/scripts/time-runtime/time-reported-failure.ts +11 -3
  270. package/scripts/uninstall/distributed-files.ts +92 -0
  271. package/scripts/uninstall/uninstall-plan.ts +119 -0
  272. package/scripts/uninstall/uninstall-report.ts +61 -0
  273. package/scripts/uninstall/uninstall.ts +206 -0
  274. package/templates/AGENTS.basic.md +4 -0
  275. package/templates/GEMINI.basic.md +6 -0
  276. package/dist/hooks/chunk-6V5OPIUU.js +0 -13
  277. package/scripts/lane/openai-review-broker.ts +0 -262
  278. 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-Z4XI7CZS.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-MBJYQPEK.js";
34
34
  import {
35
35
  lane_child_marker
36
- } from "./chunk-J3KSS7II.js";
36
+ } from "./chunk-OLMO72ON.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-3C4XRYG6.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
  ];
@@ -1851,7 +1881,8 @@ var EMPTY_BODY = "";
1851
1881
  var REST_FIELD_NAMES = /* @__PURE__ */ new Map([
1852
1882
  ["url", "html_url"],
1853
1883
  ["createdAt", "created_at"],
1854
- ["closedAt", "closed_at"]
1884
+ ["closedAt", "closed_at"],
1885
+ ["updatedAt", "updated_at"]
1855
1886
  ]);
1856
1887
  var NOT_AN_ISSUE_MESSAGE = "gh api answered something other than an issue object";
1857
1888
  var NOT_AN_ISSUE_LISTING_MESSAGE = "gh api answered something other than an issue listing";
@@ -2051,10 +2082,10 @@ async function issue_get_plan_fields_classified(issue_number) {
2051
2082
  async function issue_get_labels_and_body(issue_number) {
2052
2083
  return await issue_view_json(issue_number, "number,state,labels,body");
2053
2084
  }
2054
- async function issue_list_comments(issue_number) {
2085
+ async function issue_list_comments(issue_number, timeout_ms) {
2055
2086
  const path = `${git_gh_api_path.issue_comments_api_path(issue_number)}${git_gh_api_path.FULL_PAGE_QUERY}`;
2056
2087
  try {
2057
- return await git_gh_exec.exec_gh_api({ path, should_paginate: true });
2088
+ return await git_gh_exec.exec_gh_api({ path, should_paginate: true, timeout_ms });
2058
2089
  } catch {
2059
2090
  return void 0;
2060
2091
  }
@@ -2181,6 +2212,89 @@ var git_gh_issue_list = {
2181
2212
  issue_list
2182
2213
  };
2183
2214
 
2215
+ // scripts/issue/issue-watch-diff.ts
2216
+ import { z as z7 } from "zod";
2217
+ var RUN_MARKER = "<!-- josh:run -->";
2218
+ var BOT_TYPE = "Bot";
2219
+ var BOT_SUFFIX = "[bot]";
2220
+ var NO_COMMENT_ID = 0;
2221
+ var UNKNOWN_AUTHOR = "(unknown)";
2222
+ var UNKNOWN_TIME = "(undated)";
2223
+ var BODY_HEADING = "Body edited:";
2224
+ var REMOVED_PREFIX = "- ";
2225
+ var ADDED_PREFIX = "+ ";
2226
+ var COMMENT_HEADING = "New comment by ";
2227
+ var AT = " at ";
2228
+ var SECTION_SEPARATOR = "\n\n";
2229
+ var LINE_SEPARATOR = "\n";
2230
+ var CRLF = "\r\n";
2231
+ var comment_schema = z7.looseObject({
2232
+ id: z7.number(),
2233
+ user: z7.looseObject({ login: z7.string(), type: z7.string().optional() }).nullish(),
2234
+ created_at: z7.string().optional(),
2235
+ body: z7.string().nullish()
2236
+ });
2237
+ function is_bot(user) {
2238
+ return user?.type === BOT_TYPE || (user?.login.endsWith(BOT_SUFFIX) ?? false);
2239
+ }
2240
+ function is_automated(user, body) {
2241
+ return is_bot(user) || body.includes(RUN_MARKER);
2242
+ }
2243
+ function to_comment(raw) {
2244
+ const body = raw.body ?? "";
2245
+ const author = raw.user?.login ?? UNKNOWN_AUTHOR;
2246
+ const created_at = raw.created_at ?? UNKNOWN_TIME;
2247
+ return { id: raw.id, author, is_automated: is_automated(raw.user, body), created_at, body };
2248
+ }
2249
+ function parse_comments(json) {
2250
+ if (json === void 0) return void 0;
2251
+ const listing = read_json_listing(json, comment_schema);
2252
+ return listing.kind === "read" ? listing.rows.map((row) => to_comment(row)) : void 0;
2253
+ }
2254
+ function last_comment_id(comments) {
2255
+ return Math.max(NO_COMMENT_ID, ...comments.map((comment) => comment.id));
2256
+ }
2257
+ function baseline_of(snapshot) {
2258
+ return { body: snapshot.body, last_comment_id: last_comment_id(snapshot.comments) };
2259
+ }
2260
+ function lines_missing_from(source, other) {
2261
+ const present = new Set(other.split(LINE_SEPARATOR));
2262
+ return source.split(LINE_SEPARATOR).filter((line) => line.trim() !== "" && !present.has(line));
2263
+ }
2264
+ function to_lf(body) {
2265
+ return body.split(CRLF).join(LINE_SEPARATOR);
2266
+ }
2267
+ function body_section(previous_raw, current_raw) {
2268
+ const previous = to_lf(previous_raw);
2269
+ const current = to_lf(current_raw);
2270
+ if (previous === current) return void 0;
2271
+ const removed = lines_missing_from(previous, current).map((line) => `${REMOVED_PREFIX}${line}`);
2272
+ const added = lines_missing_from(current, previous).map((line) => `${ADDED_PREFIX}${line}`);
2273
+ return [BODY_HEADING, ...removed, ...added].join(LINE_SEPARATOR);
2274
+ }
2275
+ function comment_section(comment) {
2276
+ return `${COMMENT_HEADING}${comment.author}${AT}${comment.created_at}${LINE_SEPARATOR}${comment.body}`;
2277
+ }
2278
+ function new_person_comments(baseline, snapshot) {
2279
+ return snapshot.comments.filter(
2280
+ (comment) => comment.id > baseline.last_comment_id && !comment.is_automated
2281
+ );
2282
+ }
2283
+ function unread_diff(baseline, snapshot) {
2284
+ const body = body_section(baseline.body, snapshot.body);
2285
+ const comments = new_person_comments(baseline, snapshot).map(
2286
+ (comment) => comment_section(comment)
2287
+ );
2288
+ const sections = [...body === void 0 ? [] : [body], ...comments];
2289
+ return sections.length === 0 ? void 0 : sections.join(SECTION_SEPARATOR);
2290
+ }
2291
+ var issue_watch_diff = {
2292
+ RUN_MARKER,
2293
+ baseline_of,
2294
+ parse_comments,
2295
+ unread_diff
2296
+ };
2297
+
2184
2298
  // scripts/gh/git-gh-issue-write.ts
2185
2299
  var PATCH_METHOD = "PATCH";
2186
2300
  var DELETE_METHOD = "DELETE";
@@ -2213,7 +2327,9 @@ async function issue_edit_body(issue_number, body) {
2213
2327
  async function issue_comment(issue_number, body) {
2214
2328
  return await git_gh_exec.exec_gh_api({
2215
2329
  path: `${git_gh_api_path.issue_api_path(issue_number)}${COMMENTS_SEGMENT}`,
2216
- body: JSON.stringify({ body }),
2330
+ body: JSON.stringify({ body: `${body}
2331
+
2332
+ ${issue_watch_diff.RUN_MARKER}` }),
2217
2333
  jq_filter: HTML_URL_FILTER
2218
2334
  });
2219
2335
  }
@@ -2354,7 +2470,7 @@ var git_gh_issue_write = {
2354
2470
 
2355
2471
  // scripts/gh/git-gh-issue.ts
2356
2472
  var NUMBER_AND_BODY_FIELDS = "number,body";
2357
- var BACKLOG_SCAN_FIELDS = `number,title,body,${BLOCKED_BY_COUNT_FIELD}`;
2473
+ var BACKLOG_SCAN_FIELDS = `number,title,body,labels,${BLOCKED_BY_COUNT_FIELD}`;
2358
2474
  var NUMBER_TITLE_AND_LABELS_FIELDS = "number,title,labels";
2359
2475
  var SUMMARY_FIELDS = "number,title,labels,createdAt";
2360
2476
  var PICKUP_FIELDS = `${SUMMARY_FIELDS},blockedBy,body`;
@@ -2393,6 +2509,10 @@ async function issue_list_by_label_summary(label, limit, options) {
2393
2509
  async function issue_list_by_label_in_repo(label, limit, repo) {
2394
2510
  return await issue_list2({ json_fields: SUMMARY_FIELDS, limit, label, repo });
2395
2511
  }
2512
+ var JUDGEMENT_FIELDS = "number,title,body,labels,updatedAt";
2513
+ async function issue_list_open_for_judgement(limit) {
2514
+ return await issue_list2({ json_fields: JUDGEMENT_FIELDS, limit });
2515
+ }
2396
2516
  var git_gh_issue = {
2397
2517
  ...git_gh_issue_read,
2398
2518
  ...git_gh_issue_write,
@@ -2402,24 +2522,25 @@ var git_gh_issue = {
2402
2522
  issue_list_by_label_summary,
2403
2523
  issue_search_body,
2404
2524
  issue_list_open_bodies,
2525
+ issue_list_open_for_judgement,
2405
2526
  issue_list_recently_closed
2406
2527
  };
2407
2528
 
2408
2529
  // scripts/ci/pr-classification.ts
2409
2530
  import { readFileSync as readFileSync2 } from "node:fs";
2410
2531
  import { fileURLToPath } from "node:url";
2411
- import { z as z7 } from "zod";
2532
+ import { z as z8 } from "zod";
2412
2533
  var CLASSIFICATION_SET = new Set(RELEASE_CLASSIFICATION_NAMES);
2413
2534
  var ISSUE_BUG_LABEL = "bug";
2414
2535
  var DECLARATION_PREFIX = "- \u30EA\u30EA\u30FC\u30B9\u5206\u985E: ";
2415
2536
  var DECLARATION = new RegExp(`^${DECLARATION_PREFIX}(.+)$`, "gmu");
2416
2537
  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({
2538
+ var LABEL = z8.object({ name: z8.string() });
2539
+ var USER = z8.object({ login: z8.string() });
2540
+ var PULL_REQUEST = z8.object({ number: z8.number(), user: USER });
2541
+ var EVENT = z8.object({
2421
2542
  pull_request: PULL_REQUEST,
2422
- repository: z7.object({ full_name: z7.string() })
2543
+ repository: z8.object({ full_name: z8.string() })
2423
2544
  });
2424
2545
  function classification_error(labels, author) {
2425
2546
  const legacy = labels.filter((label) => LEGACY_LABELS.has(label.toLowerCase()));
@@ -2442,7 +2563,7 @@ function release_candidates(candidates) {
2442
2563
  return candidates.filter((candidate) => candidate !== ENHANCEMENT_LABEL);
2443
2564
  }
2444
2565
  function issue_candidates(issue_json) {
2445
- const issue2 = z7.object({ labels: z7.array(LABEL), body: z7.string().nullable() }).parse(JSON.parse(issue_json));
2566
+ const issue2 = z8.object({ labels: z8.array(LABEL), body: z8.string().nullable() }).parse(JSON.parse(issue_json));
2446
2567
  const names = issue2.labels.map((label) => label.name.toLowerCase());
2447
2568
  const declared = [...(issue2.body ?? "").matchAll(DECLARATION)].map((match) => match[1] ?? "");
2448
2569
  const candidates = [...release_candidates([...names, ...declared].filter(is_classification))];
@@ -2517,30 +2638,30 @@ async function poll_until(is_done, options) {
2517
2638
  var poll = { poll_until, sleep: sleep2 };
2518
2639
 
2519
2640
  // scripts/gh/git-gh-pr.ts
2520
- import { z as z11 } from "zod";
2641
+ import { z as z12 } from "zod";
2521
2642
 
2522
2643
  // 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(),
2644
+ import { z as z9 } from "zod";
2645
+ var rest_repo_schema = z9.looseObject({ full_name: z9.string().optional() }).nullish();
2646
+ var rest_pull_side_schema = z9.looseObject({ repo: rest_repo_schema });
2647
+ var rest_pull_schema = z9.looseObject({
2648
+ number: z9.number(),
2649
+ html_url: z9.string().optional(),
2650
+ body: z9.string().nullish(),
2651
+ state: z9.string().optional(),
2652
+ merged: z9.boolean().nullish(),
2653
+ merged_at: z9.string().nullish(),
2654
+ mergeable: z9.boolean().nullish(),
2655
+ mergeable_state: z9.string().optional(),
2535
2656
  // `sha` is the head commit, which is what both halves of the merge-gate rollup are keyed by —
2536
2657
  // REST hangs the check runs and the status contexts off the commit rather than off the pull
2537
2658
  // request.
2538
- head: z8.looseObject({ ref: z8.string().optional(), sha: z8.string().optional(), repo: rest_repo_schema }).nullish(),
2659
+ head: z9.looseObject({ ref: z9.string().optional(), sha: z9.string().optional(), repo: rest_repo_schema }).nullish(),
2539
2660
  base: rest_pull_side_schema.nullish(),
2540
2661
  // `node_id` is what the GraphQL auto-merge mutation addresses a pull request by, and `auto_merge`
2541
2662
  // 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()
2663
+ node_id: z9.string().optional(),
2664
+ auto_merge: z9.looseObject({}).nullish()
2544
2665
  });
2545
2666
  var NOT_A_PULL_MESSAGE = "gh api answered something other than a pull request object";
2546
2667
  var NOT_A_PULL_LISTING_MESSAGE = "gh api answered something other than a pull request listing";
@@ -2759,14 +2880,14 @@ var git_gh_pr_read = {
2759
2880
  };
2760
2881
 
2761
2882
  // scripts/gh/git-gh-pr-review.ts
2762
- import { z as z9 } from "zod";
2883
+ import { z as z10 } from "zod";
2763
2884
  var REVIEW_APPROVED = "APPROVED";
2764
2885
  var REVIEW_CHANGES_REQUESTED = "CHANGES_REQUESTED";
2765
2886
  var REVIEW_NONE = "";
2766
2887
  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()
2888
+ var rest_review_schema = z10.looseObject({
2889
+ state: z10.string().optional(),
2890
+ user: z10.looseObject({ login: z10.string().optional() }).nullish()
2770
2891
  });
2771
2892
  var NOT_A_REVIEW_LISTING = "gh api answered something other than a review listing";
2772
2893
  function parse_rest_reviews(reviews_json) {
@@ -2799,18 +2920,18 @@ function to_review_decision(reviews_json) {
2799
2920
  var git_gh_pr_review = { to_review_decision };
2800
2921
 
2801
2922
  // scripts/gh/git-gh-pr-rollup.ts
2802
- import { z as z10 } from "zod";
2923
+ import { z as z11 } from "zod";
2803
2924
  var STATUS_CONTEXT_TYPE_NAME = "StatusContext";
2804
2925
  var TYPE_NAME_KEY = "__typename";
2805
- var rollup_element_schema = z10.looseObject({});
2806
- var check_runs_page_schema = z10.looseObject({
2926
+ var rollup_element_schema = z11.looseObject({});
2927
+ var check_runs_page_schema = z11.looseObject({
2807
2928
  // Required, not optional: GitHub always names the key, and accepting a page without one would
2808
2929
  // answer an empty rollup — which `git-pr-followup.ts` reports as "this branch has no checks".
2809
- check_runs: z10.array(rollup_element_schema)
2930
+ check_runs: z11.array(rollup_element_schema)
2810
2931
  });
2811
- var id_holder_schema = z10.object({ id: z10.number() });
2812
- var status_page_schema = z10.looseObject({
2813
- statuses: z10.array(rollup_element_schema)
2932
+ var id_holder_schema = z11.object({ id: z11.number() });
2933
+ var status_page_schema = z11.looseObject({
2934
+ statuses: z11.array(rollup_element_schema)
2814
2935
  });
2815
2936
  var NOT_A_CHECK_RUNS_LISTING = "gh api answered something other than a check run listing";
2816
2937
  var NOT_A_STATUS_LISTING = "gh api answered something other than a commit status listing";
@@ -2944,7 +3065,7 @@ var MERGE_READ_BACK_ATTEMPTS = 3;
2944
3065
  var MERGE_READ_BACK_INTERVAL_MS = 1e3;
2945
3066
  var PR_NUMBER_PATTERN = /\/pull\/([1-9]\d*)$/u;
2946
3067
  var LABELS_SEGMENT2 = "/labels";
2947
- var PR_LABELS = z11.array(z11.object({ name: z11.string() }));
3068
+ var PR_LABELS = z12.array(z12.object({ name: z12.string() }));
2948
3069
  async function add_pr_classification(number, label) {
2949
3070
  await git_gh_exec.exec_gh_api({
2950
3071
  path: `${git_gh_api_path.issue_api_path(number)}${LABELS_SEGMENT2}`,
@@ -3206,6 +3327,7 @@ async function wait_for_pr_success(options) {
3206
3327
  let carried = { next_stable_count: 0, next_failure_count: 0 };
3207
3328
  for (let attempt = 0; attempt < options.max_attempts; attempt += 1) {
3208
3329
  console.info(`Checking PR status\u2026 (${String(attempt + 1)}/${String(options.max_attempts)})`);
3330
+ await options.before_poll?.();
3209
3331
  carried = await attempt_pr_success_poll({
3210
3332
  options,
3211
3333
  stable_count: carried.next_stable_count,
@@ -3223,6 +3345,14 @@ async function default_fetch_pr_state(branch_name, should_read_review_decision =
3223
3345
  const decision = await git_gh_pr_snapshot.pr_get_review_decision(checks.pr_number);
3224
3346
  return { ...snapshot, review_decision: read_string(decision) };
3225
3347
  }
3348
+ function observed_fetcher(observe) {
3349
+ if (observe === void 0) return default_fetch_pr_state;
3350
+ return async function fetch_observed(branch_name, should_read_review_decision) {
3351
+ const snapshot = await default_fetch_pr_state(branch_name, should_read_review_decision);
3352
+ await observe(snapshot);
3353
+ return snapshot;
3354
+ };
3355
+ }
3226
3356
 
3227
3357
  // scripts/gh/git-pr-checks-watch.ts
3228
3358
  var PR_CHECKS_WATCH_TIMEOUT_MS = 12e4;
@@ -3252,10 +3382,10 @@ var CHECKS_SETTLED_EVALUATOR = {
3252
3382
  describe: describe_checks_failure,
3253
3383
  should_read_review_decision: should_never_read_review_decision
3254
3384
  };
3255
- async function watch_until_settled(branch_name) {
3385
+ async function watch_until_settled(branch_name, observe) {
3256
3386
  await wait_for_pr_success({
3257
3387
  branch_name,
3258
- fetcher: default_fetch_pr_state,
3388
+ fetcher: observed_fetcher(observe),
3259
3389
  interval_ms: CHECK_WAIT_INTERVAL_MS,
3260
3390
  max_attempts: compute_max_attempts(
3261
3391
  PR_CHECKS_WATCH_TIMEOUT_MS / SECONDS_TO_MS,
@@ -3269,9 +3399,9 @@ async function fail_when_no_checks(branch_name) {
3269
3399
  const snapshot = await default_fetch_pr_state(branch_name, should_never_read_review_decision);
3270
3400
  if (snapshot.rollup.length === 0) throw new Error(NO_CHECKS_MESSAGE);
3271
3401
  }
3272
- async function pr_checks_watch(branch_name) {
3402
+ async function pr_checks_watch(branch_name, observe) {
3273
3403
  try {
3274
- await watch_until_settled(branch_name);
3404
+ await watch_until_settled(branch_name, observe);
3275
3405
  return { timed_out: false };
3276
3406
  } catch (error) {
3277
3407
  if (!is_pr_checks_timeout(error)) throw error;
@@ -3291,15 +3421,42 @@ var git_gh_command = {
3291
3421
  ...git_gh_repo
3292
3422
  };
3293
3423
 
3424
+ // scripts/gh/gh-spawn.ts
3425
+ var NO_BUDGET = 0;
3426
+ function fetch_repo_name(timeout_ms) {
3427
+ const stdout = git_gh_exec.read_gh_api_sync({
3428
+ path: git_gh_api_path.repo_api_path(),
3429
+ jq_filter: ".full_name",
3430
+ cwd: PROJECT_ROOT,
3431
+ timeout_ms: timeout_ms ?? NO_BUDGET
3432
+ });
3433
+ const name = stdout?.trim();
3434
+ return name === "" ? void 0 : name;
3435
+ }
3436
+ function get_repo_name_with_owner() {
3437
+ return fetch_repo_name(void 0);
3438
+ }
3439
+ function get_repo_name_with_owner_within(timeout_ms) {
3440
+ return fetch_repo_name(timeout_ms);
3441
+ }
3442
+ var gh_spawn = { get_repo_name_with_owner, get_repo_name_with_owner_within };
3443
+
3294
3444
  export {
3295
3445
  bounded_pool,
3446
+ git_gh_api_path,
3447
+ read_json_listing,
3448
+ parse_json_object_or_undefined,
3449
+ has_stdout_field,
3450
+ git_gh_exec,
3451
+ git_gh_issue_read,
3452
+ issue_watch_diff,
3453
+ issue_citation,
3454
+ session_cite,
3296
3455
  shell_segments,
3297
3456
  bash_triggers,
3298
3457
  tail_commands,
3299
3458
  filing_cap,
3300
3459
  CONTEXT_CUT_THRESHOLD,
3301
- issue_citation,
3302
- session_cite,
3303
3460
  run_hold,
3304
3461
  run_cut_handoff,
3305
3462
  run_cut,
@@ -3315,12 +3472,8 @@ export {
3315
3472
  has_label_name,
3316
3473
  lane_handoff,
3317
3474
  lane_park,
3475
+ gh_spawn,
3318
3476
  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
3477
  git_gh_pr_read,
3325
3478
  git_gh_command
3326
3479
  };