@joshuafolkken/kit 1.872.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 (1108) hide show
  1. package/.claude/.claude-plugin/plugin.json +11 -0
  2. package/.claude/settings.json +110 -0
  3. package/.claude/skills/dependency-update/SKILL.md +76 -0
  4. package/.claude/skills/epic-commands/SKILL.md +463 -0
  5. package/.claude/skills/verify-ui/SKILL.md +96 -0
  6. package/.claude/skills/workflow-commands/SKILL.md +265 -0
  7. package/.claude/skills/workflow-commands/background-commands.md +130 -0
  8. package/.claude/skills/workflow-commands/backlogrun-child.md +364 -0
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +345 -0
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +179 -0
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +600 -0
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +604 -0
  13. package/.claude/skills/workflow-commands/backlogrun.md +109 -0
  14. package/.claude/skills/workflow-commands/chain-rule.md +98 -0
  15. package/.claude/skills/workflow-commands/delegation.md +52 -0
  16. package/.claude/skills/workflow-commands/followup-reference.md +118 -0
  17. package/.claude/skills/workflow-commands/followup.md +222 -0
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +93 -0
  19. package/.claude/skills/workflow-commands/fullrun.md +82 -0
  20. package/.claude/skills/workflow-commands/halfrun.md +73 -0
  21. package/.claude/skills/workflow-commands/into-target.md +48 -0
  22. package/.claude/skills/workflow-commands/issue-comments.md +109 -0
  23. package/.claude/skills/workflow-commands/issue-fold-existing.md +27 -0
  24. package/.claude/skills/workflow-commands/issue-scout.md +45 -0
  25. package/.claude/skills/workflow-commands/kickoff.md +82 -0
  26. package/.claude/skills/workflow-commands/latest-gate.md +85 -0
  27. package/.claude/skills/workflow-commands/needs-human-review.md +64 -0
  28. package/.claude/skills/workflow-commands/observation-filing.md +349 -0
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +340 -0
  30. package/.claude/skills/workflow-commands/prerequisite.md +62 -0
  31. package/.claude/skills/workflow-commands/retrospective.md +81 -0
  32. package/.claude/skills/workflow-commands/rule-residency.md +267 -0
  33. package/.claude/skills/workflow-commands/split-assessment.md +130 -0
  34. package/.claude/skills/workflow-commands/target-repository.md +58 -0
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +66 -0
  36. package/.claude-plugin/marketplace.json +15 -0
  37. package/.coderabbit.yaml +50 -0
  38. package/.codex/config.toml +8 -0
  39. package/.codex/hooks.json +71 -0
  40. package/.cursorrules +45 -0
  41. package/.gitattributes +7 -0
  42. package/.github/dependabot.yml +19 -0
  43. package/.github/pull_request_template.md +1 -0
  44. package/.github/release.yml +18 -0
  45. package/.github/workflows/auto-tag.yml +111 -0
  46. package/.github/workflows/ci.yml +681 -0
  47. package/.github/workflows/dependabot-auto-merge.yml +55 -0
  48. package/.github/workflows/production.yml +47 -0
  49. package/.github/workflows/publish.yml +39 -0
  50. package/.github/workflows/sonar-qube.yml +34 -0
  51. package/.mcp.json +8 -0
  52. package/.ncurc.json +3 -0
  53. package/.prettierignore +20 -0
  54. package/.vscode/extensions.json +21 -0
  55. package/.vscode/settings.json +41 -0
  56. package/AGENTS.md +29 -0
  57. package/CLAUDE.md +207 -0
  58. package/CODE_OF_CONDUCT.md +132 -0
  59. package/GEMINI.md +30 -0
  60. package/LICENSE +21 -0
  61. package/README.md +41 -0
  62. package/SECURITY.md +34 -0
  63. package/cspell/index.yaml +177 -0
  64. package/dist/CLAUDE.md +207 -0
  65. package/dist/config-merge/index.d.ts +29 -0
  66. package/dist/config-merge/index.js +459 -0
  67. package/dist/hooks/batch-guard.js +28 -0
  68. package/dist/hooks/chunk-25JL6FMS.js +4970 -0
  69. package/dist/hooks/chunk-2ANGT3XM.js +375 -0
  70. package/dist/hooks/chunk-2EI5GBSW.js +42 -0
  71. package/dist/hooks/chunk-2OT5XE2N.js +5014 -0
  72. package/dist/hooks/chunk-2RUPMGGV.js +137 -0
  73. package/dist/hooks/chunk-2XIGZQMQ.js +3299 -0
  74. package/dist/hooks/chunk-33ELOKEV.js +910 -0
  75. package/dist/hooks/chunk-33YRTKM7.js +230 -0
  76. package/dist/hooks/chunk-36JQU5NN.js +77 -0
  77. package/dist/hooks/chunk-3EJBTWVS.js +1769 -0
  78. package/dist/hooks/chunk-3FK5SFAC.js +432 -0
  79. package/dist/hooks/chunk-3PWPYDD2.js +240 -0
  80. package/dist/hooks/chunk-3TQU7TDH.js +375 -0
  81. package/dist/hooks/chunk-3TVLSFZ6.js +432 -0
  82. package/dist/hooks/chunk-3VXYCB4E.js +77 -0
  83. package/dist/hooks/chunk-44M6JXGV.js +3398 -0
  84. package/dist/hooks/chunk-46EEEHC3.js +240 -0
  85. package/dist/hooks/chunk-4A7UVP2P.js +364 -0
  86. package/dist/hooks/chunk-4LFQEZS4.js +137 -0
  87. package/dist/hooks/chunk-4OCX3V2T.js +469 -0
  88. package/dist/hooks/chunk-4OHA5DE7.js +49 -0
  89. package/dist/hooks/chunk-4PMDW3YD.js +68 -0
  90. package/dist/hooks/chunk-4QHBNAI4.js +68 -0
  91. package/dist/hooks/chunk-4SSB3FEE.js +3273 -0
  92. package/dist/hooks/chunk-5A2WQ2CQ.js +5390 -0
  93. package/dist/hooks/chunk-5EVA2JQB.js +5390 -0
  94. package/dist/hooks/chunk-5P7VF5VE.js +3230 -0
  95. package/dist/hooks/chunk-5QWJGGZP.js +49 -0
  96. package/dist/hooks/chunk-5U5EZYG6.js +77 -0
  97. package/dist/hooks/chunk-5VUUF3ZV.js +240 -0
  98. package/dist/hooks/chunk-5WA7UBT3.js +374 -0
  99. package/dist/hooks/chunk-6EBGRQ3Q.js +301 -0
  100. package/dist/hooks/chunk-6TVHWMD3.js +432 -0
  101. package/dist/hooks/chunk-6V5OPIUU.js +13 -0
  102. package/dist/hooks/chunk-6VAGLEMB.js +68 -0
  103. package/dist/hooks/chunk-75BTXKFJ.js +3424 -0
  104. package/dist/hooks/chunk-75RHN67S.js +137 -0
  105. package/dist/hooks/chunk-76KC3BDD.js +3414 -0
  106. package/dist/hooks/chunk-76SLS7CZ.js +898 -0
  107. package/dist/hooks/chunk-7DHZ4DWT.js +5015 -0
  108. package/dist/hooks/chunk-7INSJDGE.js +458 -0
  109. package/dist/hooks/chunk-7VJ4FTDX.js +268 -0
  110. package/dist/hooks/chunk-7XCYNHQK.js +77 -0
  111. package/dist/hooks/chunk-A5YJ3H7E.js +375 -0
  112. package/dist/hooks/chunk-AAEXXUUL.js +268 -0
  113. package/dist/hooks/chunk-ABVEVV2M.js +432 -0
  114. package/dist/hooks/chunk-ACN3YXFL.js +68 -0
  115. package/dist/hooks/chunk-AD3XE3QZ.js +397 -0
  116. package/dist/hooks/chunk-AENFZPZH.js +230 -0
  117. package/dist/hooks/chunk-AFKRFQ6W.js +68 -0
  118. package/dist/hooks/chunk-AHD5IPWI.js +375 -0
  119. package/dist/hooks/chunk-AMK5JGV7.js +77 -0
  120. package/dist/hooks/chunk-ARN7NCQI.js +425 -0
  121. package/dist/hooks/chunk-AUFY653N.js +3425 -0
  122. package/dist/hooks/chunk-AXQBNFEF.js +375 -0
  123. package/dist/hooks/chunk-AYC7R6U4.js +3316 -0
  124. package/dist/hooks/chunk-AYEA2FJ7.js +5015 -0
  125. package/dist/hooks/chunk-B2LIXYFL.js +77 -0
  126. package/dist/hooks/chunk-B4HPNY2I.js +375 -0
  127. package/dist/hooks/chunk-B4YNCUGB.js +469 -0
  128. package/dist/hooks/chunk-B57S3VWT.js +922 -0
  129. package/dist/hooks/chunk-BINZ3PLI.js +364 -0
  130. package/dist/hooks/chunk-BIWLABFK.js +432 -0
  131. package/dist/hooks/chunk-BODUSXKK.js +410 -0
  132. package/dist/hooks/chunk-BQBAT2YK.js +375 -0
  133. package/dist/hooks/chunk-BUJEBW75.js +391 -0
  134. package/dist/hooks/chunk-BVNWORKA.js +72 -0
  135. package/dist/hooks/chunk-BWI47LQS.js +5205 -0
  136. package/dist/hooks/chunk-C25HRMJX.js +137 -0
  137. package/dist/hooks/chunk-CBFZNC74.js +375 -0
  138. package/dist/hooks/chunk-CECYXS4Y.js +3424 -0
  139. package/dist/hooks/chunk-CELGUP5F.js +49 -0
  140. package/dist/hooks/chunk-CMHANU3F.js +3442 -0
  141. package/dist/hooks/chunk-CMN372LI.js +68 -0
  142. package/dist/hooks/chunk-CPGZLMMK.js +3299 -0
  143. package/dist/hooks/chunk-CTQKXDC7.js +268 -0
  144. package/dist/hooks/chunk-CYAT4RIT.js +68 -0
  145. package/dist/hooks/chunk-CYTWYCH2.js +5014 -0
  146. package/dist/hooks/chunk-CZSOLRBA.js +77 -0
  147. package/dist/hooks/chunk-D2PIDYJR.js +3438 -0
  148. package/dist/hooks/chunk-DE57HI6T.js +137 -0
  149. package/dist/hooks/chunk-DGXDGAPG.js +5306 -0
  150. package/dist/hooks/chunk-DNYRSYQG.js +5014 -0
  151. package/dist/hooks/chunk-DTAXH2A2.js +240 -0
  152. package/dist/hooks/chunk-E2IZUWI5.js +375 -0
  153. package/dist/hooks/chunk-E4L2K2BL.js +397 -0
  154. package/dist/hooks/chunk-E55NKX5F.js +68 -0
  155. package/dist/hooks/chunk-ECXVCCVD.js +3079 -0
  156. package/dist/hooks/chunk-EPHO443D.js +68 -0
  157. package/dist/hooks/chunk-EUFK2BI2.js +375 -0
  158. package/dist/hooks/chunk-EYCD5ZAV.js +137 -0
  159. package/dist/hooks/chunk-F2SDYJU4.js +240 -0
  160. package/dist/hooks/chunk-F4B5D5TF.js +68 -0
  161. package/dist/hooks/chunk-FGEO3NDX.js +432 -0
  162. package/dist/hooks/chunk-FJYI52RE.js +137 -0
  163. package/dist/hooks/chunk-FXAKJKTB.js +18 -0
  164. package/dist/hooks/chunk-FYTZHIY4.js +3085 -0
  165. package/dist/hooks/chunk-G7JL2A5K.js +375 -0
  166. package/dist/hooks/chunk-GA3ITDBW.js +42 -0
  167. package/dist/hooks/chunk-GDR4H4SV.js +469 -0
  168. package/dist/hooks/chunk-GFKDXPSM.js +2855 -0
  169. package/dist/hooks/chunk-GIMRTKFU.js +566 -0
  170. package/dist/hooks/chunk-GOPHRLGO.js +240 -0
  171. package/dist/hooks/chunk-GX4HO7SJ.js +230 -0
  172. package/dist/hooks/chunk-GXKKK23T.js +240 -0
  173. package/dist/hooks/chunk-GZ6FUVIK.js +566 -0
  174. package/dist/hooks/chunk-H5HPY5M5.js +2869 -0
  175. package/dist/hooks/chunk-HCF3OGEE.js +1829 -0
  176. package/dist/hooks/chunk-HDEXAOUM.js +469 -0
  177. package/dist/hooks/chunk-HM2TY3TN.js +469 -0
  178. package/dist/hooks/chunk-HOA7NXA2.js +55 -0
  179. package/dist/hooks/chunk-HOFEWH6H.js +240 -0
  180. package/dist/hooks/chunk-HUUI6S5J.js +2669 -0
  181. package/dist/hooks/chunk-I4D3NVUD.js +469 -0
  182. package/dist/hooks/chunk-I4Q6WAJE.js +68 -0
  183. package/dist/hooks/chunk-IB6N4CR2.js +432 -0
  184. package/dist/hooks/chunk-IFLDYJMD.js +469 -0
  185. package/dist/hooks/chunk-IGU466YD.js +77 -0
  186. package/dist/hooks/chunk-IJCQUHKY.js +375 -0
  187. package/dist/hooks/chunk-IKUMBDJB.js +230 -0
  188. package/dist/hooks/chunk-IM3BDIBJ.js +5005 -0
  189. package/dist/hooks/chunk-IMYMAODK.js +3431 -0
  190. package/dist/hooks/chunk-IN2ZVGXA.js +5005 -0
  191. package/dist/hooks/chunk-ITVJ2MKQ.js +18 -0
  192. package/dist/hooks/chunk-J5RIJYTM.js +2669 -0
  193. package/dist/hooks/chunk-JFLMH4K5.js +3460 -0
  194. package/dist/hooks/chunk-JR25IFML.js +77 -0
  195. package/dist/hooks/chunk-JT5AUXFI.js +432 -0
  196. package/dist/hooks/chunk-JY5YVN6N.js +3234 -0
  197. package/dist/hooks/chunk-K5Q4ETVI.js +391 -0
  198. package/dist/hooks/chunk-K67V2F24.js +137 -0
  199. package/dist/hooks/chunk-KABG6AEW.js +3460 -0
  200. package/dist/hooks/chunk-KATZESEC.js +3273 -0
  201. package/dist/hooks/chunk-KFH4H7W7.js +469 -0
  202. package/dist/hooks/chunk-KMUEI6RX.js +910 -0
  203. package/dist/hooks/chunk-KMV4OY77.js +3438 -0
  204. package/dist/hooks/chunk-KQAZNWEY.js +137 -0
  205. package/dist/hooks/chunk-KZZR6JER.js +5015 -0
  206. package/dist/hooks/chunk-LAR6DREP.js +77 -0
  207. package/dist/hooks/chunk-LNCJWEZD.js +5015 -0
  208. package/dist/hooks/chunk-LRYD2GLM.js +6 -0
  209. package/dist/hooks/chunk-LXBKYHDV.js +77 -0
  210. package/dist/hooks/chunk-LYLKIUNE.js +5024 -0
  211. package/dist/hooks/chunk-LZKCFOVC.js +432 -0
  212. package/dist/hooks/chunk-M4FCIYRI.js +77 -0
  213. package/dist/hooks/chunk-M5M7327Q.js +3425 -0
  214. package/dist/hooks/chunk-MF72MHSX.js +3455 -0
  215. package/dist/hooks/chunk-MK56LKDO.js +397 -0
  216. package/dist/hooks/chunk-N3MJADY7.js +240 -0
  217. package/dist/hooks/chunk-NFQSUDBN.js +458 -0
  218. package/dist/hooks/chunk-NHREKY45.js +137 -0
  219. package/dist/hooks/chunk-NP5TTAAW.js +375 -0
  220. package/dist/hooks/chunk-NQTLTKTJ.js +2993 -0
  221. package/dist/hooks/chunk-NVRCZPBZ.js +391 -0
  222. package/dist/hooks/chunk-O46HMMLJ.js +469 -0
  223. package/dist/hooks/chunk-OFJGH2L4.js +240 -0
  224. package/dist/hooks/chunk-OLFMCZH5.js +240 -0
  225. package/dist/hooks/chunk-OMCZS46I.js +49 -0
  226. package/dist/hooks/chunk-OQZEZW5G.js +469 -0
  227. package/dist/hooks/chunk-P2MDAT2Y.js +1897 -0
  228. package/dist/hooks/chunk-P3M2JJIF.js +68 -0
  229. package/dist/hooks/chunk-PDVHQITQ.js +3453 -0
  230. package/dist/hooks/chunk-PNT2AMDH.js +391 -0
  231. package/dist/hooks/chunk-PR2LVSY6.js +3445 -0
  232. package/dist/hooks/chunk-PRR5R4JK.js +137 -0
  233. package/dist/hooks/chunk-PXT44QVN.js +566 -0
  234. package/dist/hooks/chunk-PZLWJLAP.js +469 -0
  235. package/dist/hooks/chunk-Q2FEAZJ2.js +77 -0
  236. package/dist/hooks/chunk-Q32WETDO.js +3265 -0
  237. package/dist/hooks/chunk-Q45DUBLE.js +3600 -0
  238. package/dist/hooks/chunk-Q7NZSWQ5.js +240 -0
  239. package/dist/hooks/chunk-QH2JNAMK.js +3085 -0
  240. package/dist/hooks/chunk-QNNWYQ2R.js +375 -0
  241. package/dist/hooks/chunk-QPU5H2OS.js +68 -0
  242. package/dist/hooks/chunk-QRAHZ5TO.js +1829 -0
  243. package/dist/hooks/chunk-QUZ5HPIE.js +469 -0
  244. package/dist/hooks/chunk-QVCRG34O.js +2893 -0
  245. package/dist/hooks/chunk-R3MY4E3S.js +1675 -0
  246. package/dist/hooks/chunk-R6TXJJXP.js +77 -0
  247. package/dist/hooks/chunk-REJU6VT7.js +1829 -0
  248. package/dist/hooks/chunk-REQAQLRC.js +2993 -0
  249. package/dist/hooks/chunk-RFCXPAHH.js +391 -0
  250. package/dist/hooks/chunk-RHI6Y22X.js +137 -0
  251. package/dist/hooks/chunk-RKZVOBBS.js +469 -0
  252. package/dist/hooks/chunk-RL57TT2Y.js +566 -0
  253. package/dist/hooks/chunk-RORDOD4S.js +3321 -0
  254. package/dist/hooks/chunk-RZKYW5P2.js +77 -0
  255. package/dist/hooks/chunk-SJPJ6VSI.js +391 -0
  256. package/dist/hooks/chunk-SKSIJQQQ.js +432 -0
  257. package/dist/hooks/chunk-SSQDZKXG.js +268 -0
  258. package/dist/hooks/chunk-SSX23SJ2.js +89 -0
  259. package/dist/hooks/chunk-SYHFKE4C.js +77 -0
  260. package/dist/hooks/chunk-TCGNI2ZY.js +42 -0
  261. package/dist/hooks/chunk-TG3WXJF5.js +137 -0
  262. package/dist/hooks/chunk-TH7IJAY5.js +77 -0
  263. package/dist/hooks/chunk-TLZ27PCY.js +240 -0
  264. package/dist/hooks/chunk-U652FXTN.js +566 -0
  265. package/dist/hooks/chunk-UEK47YUF.js +268 -0
  266. package/dist/hooks/chunk-UIO45H3O.js +432 -0
  267. package/dist/hooks/chunk-UNLZEEVH.js +5005 -0
  268. package/dist/hooks/chunk-UNRVF3SZ.js +432 -0
  269. package/dist/hooks/chunk-USLFAFOI.js +3453 -0
  270. package/dist/hooks/chunk-VAEELMLL.js +442 -0
  271. package/dist/hooks/chunk-VALSWLDQ.js +3453 -0
  272. package/dist/hooks/chunk-VC5JEPNY.js +3398 -0
  273. package/dist/hooks/chunk-VEZVK6C7.js +230 -0
  274. package/dist/hooks/chunk-VK5JKFAR.js +49 -0
  275. package/dist/hooks/chunk-VNF2KP7Z.js +469 -0
  276. package/dist/hooks/chunk-VWWCUMW6.js +2669 -0
  277. package/dist/hooks/chunk-W4JARUQV.js +137 -0
  278. package/dist/hooks/chunk-WCYPBPJC.js +5014 -0
  279. package/dist/hooks/chunk-WEOBMNJG.js +2993 -0
  280. package/dist/hooks/chunk-WKJU3J5Y.js +5390 -0
  281. package/dist/hooks/chunk-WMN4TSVF.js +3299 -0
  282. package/dist/hooks/chunk-WNON54PT.js +3469 -0
  283. package/dist/hooks/chunk-WOVKBPPX.js +137 -0
  284. package/dist/hooks/chunk-WRVFORYJ.js +432 -0
  285. package/dist/hooks/chunk-WUBVYGQZ.js +240 -0
  286. package/dist/hooks/chunk-WWULTUOM.js +68 -0
  287. package/dist/hooks/chunk-WXHKKB45.js +4962 -0
  288. package/dist/hooks/chunk-XAI3YTHJ.js +469 -0
  289. package/dist/hooks/chunk-XFZH6JZJ.js +77 -0
  290. package/dist/hooks/chunk-XGPWX6IA.js +137 -0
  291. package/dist/hooks/chunk-XIXXIVGY.js +566 -0
  292. package/dist/hooks/chunk-XKDOYJGA.js +922 -0
  293. package/dist/hooks/chunk-YALTVBHM.js +432 -0
  294. package/dist/hooks/chunk-YEBEPBFK.js +5014 -0
  295. package/dist/hooks/chunk-YI2BQ3DK.js +3441 -0
  296. package/dist/hooks/chunk-YVNBCFGG.js +1829 -0
  297. package/dist/hooks/chunk-YXBN3RGG.js +432 -0
  298. package/dist/hooks/chunk-Z2OOJSW3.js +3163 -0
  299. package/dist/hooks/chunk-ZA3HVBOY.js +2644 -0
  300. package/dist/hooks/chunk-ZKID46U3.js +137 -0
  301. package/dist/hooks/chunk-ZPMU2JV6.js +49 -0
  302. package/dist/hooks/chunk-ZRKY4W7O.js +432 -0
  303. package/dist/hooks/chunk-ZTMRB7LJ.js +268 -0
  304. package/dist/hooks/chunk-ZVPPBQ3L.js +3413 -0
  305. package/dist/hooks/codex-hook-adapter.js +164 -0
  306. package/dist/hooks/duplicate-read-guard.js +29 -0
  307. package/dist/hooks/format-edited.js +37 -0
  308. package/dist/hooks/investigation-guard.js +31 -0
  309. package/dist/hooks/pretool-guard.js +21 -0
  310. package/dist/hooks/session-lang.js +34 -0
  311. package/dist/hooks/stop-guard.js +1597 -0
  312. package/dist/josh.js +1795 -0
  313. package/dist/managed-marker/index.d.ts +10 -0
  314. package/dist/managed-marker/index.js +32 -0
  315. package/dist/self-sync-guard/index.d.ts +10 -0
  316. package/dist/self-sync-guard/index.js +49 -0
  317. package/dist/version/index.d.ts +93 -0
  318. package/dist/version/index.js +1024 -0
  319. package/env/index.d.ts +7 -0
  320. package/env/index.js +62 -0
  321. package/eslint/base.js +233 -0
  322. package/eslint/checkout-rooted-parser.js +34 -0
  323. package/eslint/config-fingerprint.js +103 -0
  324. package/eslint/rules/code-quality.js +292 -0
  325. package/eslint/rules/english-only-prose.js +135 -0
  326. package/eslint/rules/formatting.js +44 -0
  327. package/eslint/rules/import.js +83 -0
  328. package/eslint/rules/namespace-object-export.js +107 -0
  329. package/eslint/rules/naming-convention.js +109 -0
  330. package/eslint/rules/promise.js +17 -0
  331. package/eslint/rules/sonarjs.js +45 -0
  332. package/eslint/rules/test-filename.js +91 -0
  333. package/eslint/rules/typescript.js +186 -0
  334. package/eslint/rules/unicorn.js +191 -0
  335. package/eslint/vanilla.js +1 -0
  336. package/evals/scenarios/consult-not-execute.json +20 -0
  337. package/evals/scenarios/no-implicit-workflow.json +26 -0
  338. package/evals/scenarios/overrides-both-locations.json +29 -0
  339. package/evals/scenarios/upstream-interrupt.json +23 -0
  340. package/evals/scenarios/workflow-skill-loaded.json +16 -0
  341. package/lefthook/base.yml +131 -0
  342. package/lefthook/vanilla.yml +7 -0
  343. package/package.json +169 -0
  344. package/playwright.config.ts +160 -0
  345. package/pnpm-workspace.yaml +41 -0
  346. package/ports/index.d.ts +17 -0
  347. package/ports/index.js +256 -0
  348. package/prettier/index.d.ts +3 -0
  349. package/prettier/index.js +31 -0
  350. package/prompts/agent-lint-protocol.json +79 -0
  351. package/prompts/agent-rules.md +63 -0
  352. package/prompts/coding-standards.md +382 -0
  353. package/prompts/collaboration-workflow/consultation-vs-execution.md +8 -0
  354. package/prompts/collaboration-workflow/cross-repo-epic.md +54 -0
  355. package/prompts/collaboration-workflow/distributed-docs.md +7 -0
  356. package/prompts/collaboration-workflow/durable-rules.md +24 -0
  357. package/prompts/collaboration-workflow/epic-audit.md +56 -0
  358. package/prompts/collaboration-workflow/epic-bundle.md +109 -0
  359. package/prompts/collaboration-workflow/file-edits.md +124 -0
  360. package/prompts/collaboration-workflow/gh-rest.md +57 -0
  361. package/prompts/collaboration-workflow/issue-citation.md +38 -0
  362. package/prompts/collaboration-workflow/issue-template.md +190 -0
  363. package/prompts/collaboration-workflow/latest-first.md +14 -0
  364. package/prompts/collaboration-workflow/no-clones.md +11 -0
  365. package/prompts/collaboration-workflow/operating-rules.md +123 -0
  366. package/prompts/collaboration-workflow/output-bounds.md +107 -0
  367. package/prompts/collaboration-workflow/overview.md +35 -0
  368. package/prompts/collaboration-workflow/plan-comment.md +85 -0
  369. package/prompts/collaboration-workflow/proposal-request.md +23 -0
  370. package/prompts/collaboration-workflow/report-format.md +206 -0
  371. package/prompts/collaboration-workflow/residency.md +94 -0
  372. package/prompts/collaboration-workflow/rule-delivery.md +146 -0
  373. package/prompts/collaboration-workflow/shell-body.md +82 -0
  374. package/prompts/collaboration-workflow/simplicity-first.md +9 -0
  375. package/prompts/collaboration-workflow/single-source-rules.md +13 -0
  376. package/prompts/collaboration-workflow/turn-batching.md +137 -0
  377. package/prompts/collaboration-workflow/upstream-interrupt.md +51 -0
  378. package/prompts/collaboration-workflow/wip-cap.md +118 -0
  379. package/prompts/collaboration-workflow.md +52 -0
  380. package/prompts/refactoring.md +103 -0
  381. package/prompts/review-rubric.md +338 -0
  382. package/prompts/review.md +217 -0
  383. package/prompts/sonar-hotspot-handling.md +77 -0
  384. package/prompts/testing-guide.md +277 -0
  385. package/scripts/adopt/adopt-logic.ts +107 -0
  386. package/scripts/adopt/adopt-toolkits.ts +181 -0
  387. package/scripts/adopt/adopt.ts +171 -0
  388. package/scripts/agent/agent-argv.ts +140 -0
  389. package/scripts/agent/agent-diagnostics.ts +120 -0
  390. package/scripts/agent/agent-event.ts +173 -0
  391. package/scripts/agent/agent-exit-record.ts +32 -0
  392. package/scripts/agent/agent-launch-environment.ts +71 -0
  393. package/scripts/agent/agent-role-profile.ts +329 -0
  394. package/scripts/agent/api-outage.ts +51 -0
  395. package/scripts/agent/claude-agent-argv.ts +151 -0
  396. package/scripts/agent/claude-result-event.ts +98 -0
  397. package/scripts/agent/codex-agent-argv.ts +94 -0
  398. package/scripts/agent/codex-home-source.ts +11 -0
  399. package/scripts/agent/interactive-ask.ts +91 -0
  400. package/scripts/auto-ok/auto-ok-cli.ts +516 -0
  401. package/scripts/backlog/backlog-arrival.ts +147 -0
  402. package/scripts/backlog/backlog-budget-cli.ts +220 -0
  403. package/scripts/backlog/backlog-budget.ts +284 -0
  404. package/scripts/backlog/backlog-defect-priority.ts +77 -0
  405. package/scripts/backlog/backlog-drive-cli.ts +377 -0
  406. package/scripts/backlog/backlog-drive-finish.ts +23 -0
  407. package/scripts/backlog/backlog-drive-named-offer.ts +81 -0
  408. package/scripts/backlog/backlog-drive-named.ts +101 -0
  409. package/scripts/backlog/backlog-drive-offer-argv.ts +29 -0
  410. package/scripts/backlog/backlog-drive-owner.ts +22 -0
  411. package/scripts/backlog/backlog-drive-restore.ts +67 -0
  412. package/scripts/backlog/backlog-drive.ts +322 -0
  413. package/scripts/backlog/backlog-named.ts +164 -0
  414. package/scripts/backlog/backlog-next.ts +376 -0
  415. package/scripts/backlog/backlog-offer-cli.ts +279 -0
  416. package/scripts/backlog/backlog-offer.ts +93 -0
  417. package/scripts/backlog/backlog-plan-cli.ts +235 -0
  418. package/scripts/backlog/backlog-plan.ts +231 -0
  419. package/scripts/backlog/backlog-pool.ts +322 -0
  420. package/scripts/backlog/backlog-ready.ts +146 -0
  421. package/scripts/backlog/backlog-scope.ts +144 -0
  422. package/scripts/backlog/backlog-stalled-cli.ts +30 -0
  423. package/scripts/backlog/backlog-stalled-detect.ts +143 -0
  424. package/scripts/backlog/backlog-stalled.ts +118 -0
  425. package/scripts/behavior/behavior-assertion.ts +87 -0
  426. package/scripts/behavior/behavior-cli.ts +88 -0
  427. package/scripts/behavior/behavior-rules.ts +128 -0
  428. package/scripts/build/build-bin.ts +36 -0
  429. package/scripts/build/build-claude-md.ts +42 -0
  430. package/scripts/build/build-config-merge.ts +26 -0
  431. package/scripts/build/build-hooks.ts +79 -0
  432. package/scripts/build/build-library.ts +83 -0
  433. package/scripts/build/build-managed-marker.ts +26 -0
  434. package/scripts/build/build-self-sync-guard.ts +26 -0
  435. package/scripts/build/build-version.ts +25 -0
  436. package/scripts/build/local-bin.ts +97 -0
  437. package/scripts/build/shim-shell.ts +25 -0
  438. package/scripts/bytes/bytes-command.ts +181 -0
  439. package/scripts/cases/cases-cli.ts +48 -0
  440. package/scripts/cases/cases-logic.ts +100 -0
  441. package/scripts/claude/skill-meta.ts +37 -0
  442. package/scripts/claude/workflow-destination.ts +13 -0
  443. package/scripts/clone/clone-aggregate.ts +76 -0
  444. package/scripts/clone/clone-fingerprint.ts +96 -0
  445. package/scripts/clone/clone-scan-cli.ts +39 -0
  446. package/scripts/clone/clone-scan.ts +158 -0
  447. package/scripts/config-merge/index.ts +19 -0
  448. package/scripts/config-merge/json-format.ts +128 -0
  449. package/scripts/config-merge/list-patch.ts +61 -0
  450. package/scripts/config-merge/parse-jsonc.ts +14 -0
  451. package/scripts/config-merge/patch-json-key.ts +439 -0
  452. package/scripts/config-merge/patch-json-list.ts +38 -0
  453. package/scripts/config-merge/patch-yaml-list.ts +107 -0
  454. package/scripts/cost-runtime/codex-usage.ts +119 -0
  455. package/scripts/cost-runtime/context-cut-payback.ts +77 -0
  456. package/scripts/cost-runtime/context-cut-threshold.ts +21 -0
  457. package/scripts/cost-runtime/cost-attribute.ts +168 -0
  458. package/scripts/cost-runtime/cost-blocks.ts +149 -0
  459. package/scripts/cost-runtime/cost-cli.ts +318 -0
  460. package/scripts/cost-runtime/cost-corpus.ts +278 -0
  461. package/scripts/cost-runtime/cost-format.ts +32 -0
  462. package/scripts/cost-runtime/cost-pricing.ts +176 -0
  463. package/scripts/cost-runtime/cost-tokens.ts +84 -0
  464. package/scripts/cost-runtime/cost-transcript.ts +531 -0
  465. package/scripts/cost-runtime/cost-usage.ts +287 -0
  466. package/scripts/cost-runtime/cost-verdict.ts +89 -0
  467. package/scripts/cost-runtime/own-session.ts +58 -0
  468. package/scripts/cost-runtime/transcript-cwd.ts +14 -0
  469. package/scripts/delegation/delegation-cli.ts +91 -0
  470. package/scripts/delegation/delegation-policy.ts +178 -0
  471. package/scripts/delegation/duplicate-read-guard.ts +244 -0
  472. package/scripts/delegation/fanout-cli.ts +61 -0
  473. package/scripts/delegation/fanout.ts +95 -0
  474. package/scripts/delegation/investigation-guard.ts +131 -0
  475. package/scripts/delegation/investigation-reads.ts +637 -0
  476. package/scripts/discovery/repo-discovery.ts +166 -0
  477. package/scripts/discovery/repo-map-logic.ts +102 -0
  478. package/scripts/discovery/repo-origin.ts +153 -0
  479. package/scripts/discovery/repo-party-cli.ts +69 -0
  480. package/scripts/discovery/repo-party.ts +46 -0
  481. package/scripts/doctor/doctor-consumer.ts +181 -0
  482. package/scripts/doctor/doctor-io.ts +210 -0
  483. package/scripts/doctor/doctor-logic.ts +122 -0
  484. package/scripts/doctor/doctor-ports.ts +117 -0
  485. package/scripts/doctor/doctor.ts +232 -0
  486. package/scripts/document/backlogrun-parent-read-set.ts +48 -0
  487. package/scripts/document/bash-output-cap.ts +45 -0
  488. package/scripts/document/document-byte-budget.ts +183 -0
  489. package/scripts/document/document-byte-check.ts +131 -0
  490. package/scripts/document/document-reachability.ts +131 -0
  491. package/scripts/document/document-read-cli.ts +82 -0
  492. package/scripts/document/document-scan.ts +108 -0
  493. package/scripts/document/document-section-cli.ts +101 -0
  494. package/scripts/document/document-section.ts +156 -0
  495. package/scripts/document/edit-files-cli.ts +280 -0
  496. package/scripts/document/entry-read-budget.ts +154 -0
  497. package/scripts/document/entry-read-set.ts +471 -0
  498. package/scripts/document/generate-catalog.ts +69 -0
  499. package/scripts/document/lane-child-read-set.ts +88 -0
  500. package/scripts/document/read-files-cli.ts +135 -0
  501. package/scripts/document/read-set-cli.ts +295 -0
  502. package/scripts/document/read-set-point-of-use.ts +89 -0
  503. package/scripts/document/read-set-pricing.ts +52 -0
  504. package/scripts/document/read-set-trim.ts +78 -0
  505. package/scripts/document/retired-phrases.ts +143 -0
  506. package/scripts/document/review-agent-type.ts +46 -0
  507. package/scripts/document/single-source.ts +73 -0
  508. package/scripts/epic/epic-audit-checks.ts +452 -0
  509. package/scripts/epic/epic-audit-cli.ts +374 -0
  510. package/scripts/epic/epic-audit-orphans.ts +142 -0
  511. package/scripts/epic/epic-audit-rationale.ts +191 -0
  512. package/scripts/epic/epic-audit-report.ts +101 -0
  513. package/scripts/epic/epic-audit.ts +240 -0
  514. package/scripts/epic/epic-bundle-cli.ts +472 -0
  515. package/scripts/epic/epic-bundle-evidence.ts +147 -0
  516. package/scripts/epic/epic-bundle-gaps.ts +86 -0
  517. package/scripts/epic/epic-bundle-referenced.ts +195 -0
  518. package/scripts/epic/epic-bundle.ts +309 -0
  519. package/scripts/epic/epic-busy.ts +204 -0
  520. package/scripts/epic/epic-candidate-confirm.ts +279 -0
  521. package/scripts/epic/epic-classify.ts +294 -0
  522. package/scripts/epic/epic-cross-repo.ts +366 -0
  523. package/scripts/epic/epic-fetch.ts +370 -0
  524. package/scripts/epic/epic-graph.ts +279 -0
  525. package/scripts/epic/epic-index.ts +209 -0
  526. package/scripts/epic/epic-issue.ts +172 -0
  527. package/scripts/epic/epic-lane-offer.ts +207 -0
  528. package/scripts/epic/epic-nested.ts +37 -0
  529. package/scripts/epic/epic-next-read.ts +141 -0
  530. package/scripts/epic/epic-next-views.ts +144 -0
  531. package/scripts/epic/epic-next.ts +477 -0
  532. package/scripts/epic/epic-outside-blocker.ts +113 -0
  533. package/scripts/epic/epic-relation-recheck.ts +108 -0
  534. package/scripts/epic/epic-report.ts +200 -0
  535. package/scripts/gate/core-budget.ts +292 -0
  536. package/scripts/gate/gate-log.ts +95 -0
  537. package/scripts/gate/gate-plan.ts +356 -0
  538. package/scripts/gate/gate-report.ts +207 -0
  539. package/scripts/gate/gate-skip.ts +123 -0
  540. package/scripts/gate/gate-tree.ts +49 -0
  541. package/scripts/gate/hook-gate-reuse.ts +130 -0
  542. package/scripts/gate/pre-commit-type-check.ts +187 -0
  543. package/scripts/gate/scoped-green.ts +260 -0
  544. package/scripts/gate/type-check-step.ts +90 -0
  545. package/scripts/gate/verification-gate.ts +531 -0
  546. package/scripts/gh/fix-gh-packages-logic.ts +232 -0
  547. package/scripts/gh/fix-gh-packages.ts +129 -0
  548. package/scripts/gh/gh-cli-token.ts +18 -0
  549. package/scripts/gh/gh-spawn.ts +44 -0
  550. package/scripts/git/animation-helpers.ts +81 -0
  551. package/scripts/git/change-base.ts +26 -0
  552. package/scripts/git/changed-file-scope.ts +209 -0
  553. package/scripts/git/changed-paths.ts +30 -0
  554. package/scripts/git/constants.ts +41 -0
  555. package/scripts/git/git-ai-review-scan.ts +154 -0
  556. package/scripts/git/git-animation.ts +41 -0
  557. package/scripts/git/git-branch.ts +127 -0
  558. package/scripts/git/git-command.ts +587 -0
  559. package/scripts/git/git-commit.ts +27 -0
  560. package/scripts/git/git-common-directory.ts +38 -0
  561. package/scripts/git/git-epic-add-body.ts +365 -0
  562. package/scripts/git/git-epic-add-plan.ts +421 -0
  563. package/scripts/git/git-epic-add.ts +249 -0
  564. package/scripts/git/git-epic-body.ts +150 -0
  565. package/scripts/git/git-epic-chains.ts +411 -0
  566. package/scripts/git/git-epic-close-comment.ts +199 -0
  567. package/scripts/git/git-epic-close.ts +393 -0
  568. package/scripts/git/git-epic-decision.ts +171 -0
  569. package/scripts/git/git-epic-parse.ts +351 -0
  570. package/scripts/git/git-epic-promote.ts +102 -0
  571. package/scripts/git/git-epic-read.ts +73 -0
  572. package/scripts/git/git-epic-reconcile.ts +246 -0
  573. package/scripts/git/git-epic-reference.ts +98 -0
  574. package/scripts/git/git-epic-relations.ts +78 -0
  575. package/scripts/git/git-epic-remove-plan.ts +152 -0
  576. package/scripts/git/git-epic-remove.ts +101 -0
  577. package/scripts/git/git-epic-run.ts +223 -0
  578. package/scripts/git/git-epic-sections.ts +98 -0
  579. package/scripts/git/git-epic-shape.ts +81 -0
  580. package/scripts/git/git-epic-validate.ts +155 -0
  581. package/scripts/git/git-error.ts +78 -0
  582. package/scripts/git/git-execa-error.ts +35 -0
  583. package/scripts/git/git-fixture-workspace.ts +88 -0
  584. package/scripts/git/git-followup-cleanup.ts +88 -0
  585. package/scripts/git/git-followup-flush.ts +63 -0
  586. package/scripts/git/git-followup-label.ts +67 -0
  587. package/scripts/git/git-followup-pending.ts +95 -0
  588. package/scripts/git/git-followup-stages.ts +149 -0
  589. package/scripts/git/git-gh-api-path.ts +118 -0
  590. package/scripts/git/git-gh-check.ts +21 -0
  591. package/scripts/git/git-gh-command.ts +17 -0
  592. package/scripts/git/git-gh-exec.ts +344 -0
  593. package/scripts/git/git-gh-failure.ts +103 -0
  594. package/scripts/git/git-gh-helpers.ts +44 -0
  595. package/scripts/git/git-gh-issue-list.ts +257 -0
  596. package/scripts/git/git-gh-issue-read.ts +457 -0
  597. package/scripts/git/git-gh-issue-rest.ts +238 -0
  598. package/scripts/git/git-gh-issue-write.ts +285 -0
  599. package/scripts/git/git-gh-issue.ts +161 -0
  600. package/scripts/git/git-gh-pr-auto-merge.ts +85 -0
  601. package/scripts/git/git-gh-pr-read.ts +322 -0
  602. package/scripts/git/git-gh-pr-rest.ts +172 -0
  603. package/scripts/git/git-gh-pr-review.ts +103 -0
  604. package/scripts/git/git-gh-pr-rollup.ts +91 -0
  605. package/scripts/git/git-gh-pr-snapshot.ts +138 -0
  606. package/scripts/git/git-gh-pr.ts +219 -0
  607. package/scripts/git/git-gh-reachability.ts +56 -0
  608. package/scripts/git/git-gh-repo.ts +37 -0
  609. package/scripts/git/git-gh-rest-state.ts +14 -0
  610. package/scripts/git/git-issue.ts +168 -0
  611. package/scripts/git/git-location-environment.ts +62 -0
  612. package/scripts/git/git-ls-remote.ts +28 -0
  613. package/scripts/git/git-next-issues.ts +98 -0
  614. package/scripts/git/git-notify.ts +104 -0
  615. package/scripts/git/git-pr-ai-review.ts +180 -0
  616. package/scripts/git/git-pr-checks-eval.ts +265 -0
  617. package/scripts/git/git-pr-checks-parse.ts +153 -0
  618. package/scripts/git/git-pr-checks-watch.ts +184 -0
  619. package/scripts/git/git-pr-checks.ts +387 -0
  620. package/scripts/git/git-pr-coderabbit.ts +129 -0
  621. package/scripts/git/git-pr-confirmation.ts +64 -0
  622. package/scripts/git/git-pr-error.ts +25 -0
  623. package/scripts/git/git-pr-followup-wrapup.ts +225 -0
  624. package/scripts/git/git-pr-followup.ts +436 -0
  625. package/scripts/git/git-pr-managed-config.ts +69 -0
  626. package/scripts/git/git-pr-messages.ts +37 -0
  627. package/scripts/git/git-pr.ts +181 -0
  628. package/scripts/git/git-prompt-display.ts +22 -0
  629. package/scripts/git/git-prompt.ts +207 -0
  630. package/scripts/git/git-push-transport.ts +173 -0
  631. package/scripts/git/git-push.ts +27 -0
  632. package/scripts/git/git-remote-branch.ts +40 -0
  633. package/scripts/git/git-spawn.ts +47 -0
  634. package/scripts/git/git-staging.ts +128 -0
  635. package/scripts/git/git-stash.ts +124 -0
  636. package/scripts/git/git-status.ts +198 -0
  637. package/scripts/git/git-worktree.ts +110 -0
  638. package/scripts/git/github-issue-url.ts +105 -0
  639. package/scripts/git/gone-branch.ts +113 -0
  640. package/scripts/git/issue-labels.ts +279 -0
  641. package/scripts/git/listing-cutoff.ts +51 -0
  642. package/scripts/git/main-merge-guard.ts +134 -0
  643. package/scripts/git/main-merge.ts +120 -0
  644. package/scripts/git/main-sync.ts +121 -0
  645. package/scripts/git/parse-json-array.ts +102 -0
  646. package/scripts/git/schemas.ts +166 -0
  647. package/scripts/git/stash-orphans.ts +91 -0
  648. package/scripts/git/stash-pop-args.ts +59 -0
  649. package/scripts/git/stash-pop-cli.ts +105 -0
  650. package/scripts/git/telegram-notify.ts +404 -0
  651. package/scripts/hooks/batch-guard.ts +144 -0
  652. package/scripts/hooks/check-commit-message.ts +134 -0
  653. package/scripts/hooks/codex-hook-adapter.ts +155 -0
  654. package/scripts/hooks/edited-cspell.ts +128 -0
  655. package/scripts/hooks/format-edited-file-fixtures.ts +109 -0
  656. package/scripts/hooks/format-edited-file.ts +510 -0
  657. package/scripts/hooks/format-rewrite-notice.ts +99 -0
  658. package/scripts/hooks/pre-push-unit.ts +146 -0
  659. package/scripts/hooks/pretool-guard.ts +96 -0
  660. package/scripts/hooks/prevent-main-commit.ts +38 -0
  661. package/scripts/hooks/prompt-hooks.ts +38 -0
  662. package/scripts/hooks/reserved-run.ts +90 -0
  663. package/scripts/hooks/stop-guard.ts +135 -0
  664. package/scripts/init/claude-plugin-config.ts +51 -0
  665. package/scripts/init/distributed-paths.ts +100 -0
  666. package/scripts/init/hook-command-rewrite.ts +85 -0
  667. package/scripts/init/hook-launch.ts +31 -0
  668. package/scripts/init/init-actions.ts +147 -0
  669. package/scripts/init/init-ai-copy.ts +235 -0
  670. package/scripts/init/init-copy-content.ts +50 -0
  671. package/scripts/init/init-logic-deploy-vps.ts +43 -0
  672. package/scripts/init/init-logic-json-merge.ts +340 -0
  673. package/scripts/init/init-logic-migrate.ts +62 -0
  674. package/scripts/init/init-logic-package-key-order.ts +50 -0
  675. package/scripts/init/init-logic-secretlint.ts +36 -0
  676. package/scripts/init/init-logic-sonar.ts +197 -0
  677. package/scripts/init/init-logic-templates.ts +142 -0
  678. package/scripts/init/init-logic-workspace.ts +59 -0
  679. package/scripts/init/init-logic-yaml-merge.ts +57 -0
  680. package/scripts/init/init-logic.ts +474 -0
  681. package/scripts/init/init-paths.ts +11 -0
  682. package/scripts/init/init-sonar.ts +32 -0
  683. package/scripts/init/init.ts +219 -0
  684. package/scripts/init/kit-base-preset.ts +60 -0
  685. package/scripts/init/plugin-install-hint.ts +47 -0
  686. package/scripts/init/tsconfig-preset-migration.ts +67 -0
  687. package/scripts/issue/baseline-measure.ts +105 -0
  688. package/scripts/issue/behavior-change-lint.ts +122 -0
  689. package/scripts/issue/defect-rate-cli.ts +167 -0
  690. package/scripts/issue/defect-rate.ts +145 -0
  691. package/scripts/issue/issue-backlinks-cli.ts +97 -0
  692. package/scripts/issue/issue-backlinks.ts +164 -0
  693. package/scripts/issue/issue-cite-cli.ts +158 -0
  694. package/scripts/issue/issue-cite.ts +102 -0
  695. package/scripts/issue/issue-comment-cli.ts +95 -0
  696. package/scripts/issue/issue-fold-cli.ts +104 -0
  697. package/scripts/issue/issue-fold-existing-cli.ts +81 -0
  698. package/scripts/issue/issue-fold-existing.ts +73 -0
  699. package/scripts/issue/issue-fold.ts +42 -0
  700. package/scripts/issue/issue-lint-cli.ts +60 -0
  701. package/scripts/issue/issue-lint.ts +26 -0
  702. package/scripts/issue/issue-logic.ts +50 -0
  703. package/scripts/issue/issue-read-cli.ts +190 -0
  704. package/scripts/issue/issue-read.ts +145 -0
  705. package/scripts/issue/issue-scout-cli.ts +482 -0
  706. package/scripts/issue/issue-scout.ts +244 -0
  707. package/scripts/issue/issue-state-cli.ts +260 -0
  708. package/scripts/issue/issue-state.ts +109 -0
  709. package/scripts/issue/markdown-section.ts +39 -0
  710. package/scripts/issue/measure-rerun-cli.ts +98 -0
  711. package/scripts/issue/reproduction-measure.ts +59 -0
  712. package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +1171 -0
  713. package/scripts/josh/agent-session-environment.ts +188 -0
  714. package/scripts/josh/cli-body.ts +96 -0
  715. package/scripts/josh/command-suggest.ts +57 -0
  716. package/scripts/josh/file-map-stamp.ts +264 -0
  717. package/scripts/josh/hook-decision.ts +479 -0
  718. package/scripts/josh/josh-command-map.ts +196 -0
  719. package/scripts/josh/josh-command-types.ts +226 -0
  720. package/scripts/josh/josh-commands-ai.ts +327 -0
  721. package/scripts/josh/josh-commands-backlog.ts +54 -0
  722. package/scripts/josh/josh-commands-clone.ts +18 -0
  723. package/scripts/josh/josh-commands-development.ts +206 -0
  724. package/scripts/josh/josh-commands-document.ts +45 -0
  725. package/scripts/josh/josh-commands-guard.ts +38 -0
  726. package/scripts/josh/josh-commands-hooks.ts +42 -0
  727. package/scripts/josh/josh-commands-issue.ts +69 -0
  728. package/scripts/josh/josh-commands-lane.ts +75 -0
  729. package/scripts/josh/josh-commands-lint.ts +37 -0
  730. package/scripts/josh/josh-commands-maintenance.ts +80 -0
  731. package/scripts/josh/josh-commands-project.ts +53 -0
  732. package/scripts/josh/josh-commands-split.ts +20 -0
  733. package/scripts/josh/josh-commands-versioning.ts +48 -0
  734. package/scripts/josh/josh-commands-workflow.ts +116 -0
  735. package/scripts/josh/josh-composite-arguments.ts +55 -0
  736. package/scripts/josh/josh-environment-file.ts +31 -0
  737. package/scripts/josh/josh-in-process.ts +80 -0
  738. package/scripts/josh/josh-logic.ts +308 -0
  739. package/scripts/josh/josh-run.ts +53 -0
  740. package/scripts/josh/josh-script-reader.ts +11 -0
  741. package/scripts/josh/josh-verdict.ts +111 -0
  742. package/scripts/josh/josh.ts +60 -0
  743. package/scripts/josh/kit-only.ts +33 -0
  744. package/scripts/josh/path-decision.ts +104 -0
  745. package/scripts/josh/platform-temporary.ts +66 -0
  746. package/scripts/josh/process-identity.ts +335 -0
  747. package/scripts/josh/session-language-cli.ts +51 -0
  748. package/scripts/josh/session-language.ts +30 -0
  749. package/scripts/josh/stamp-file.ts +194 -0
  750. package/scripts/lane/lane-await.ts +165 -0
  751. package/scripts/lane/lane-cache-run.ts +39 -0
  752. package/scripts/lane/lane-cache.ts +135 -0
  753. package/scripts/lane/lane-capacity.ts +69 -0
  754. package/scripts/lane/lane-child-invocation.ts +73 -0
  755. package/scripts/lane/lane-child-marker.ts +58 -0
  756. package/scripts/lane/lane-cli.ts +410 -0
  757. package/scripts/lane/lane-close.ts +197 -0
  758. package/scripts/lane/lane-dispatch-log.ts +13 -0
  759. package/scripts/lane/lane-dispatch.ts +458 -0
  760. package/scripts/lane/lane-environment.ts +253 -0
  761. package/scripts/lane/lane-guard-policy.ts +136 -0
  762. package/scripts/lane/lane-install.ts +94 -0
  763. package/scripts/lane/lane-launch-cli.ts +133 -0
  764. package/scripts/lane/lane-occupancy.ts +112 -0
  765. package/scripts/lane/lane-open.ts +275 -0
  766. package/scripts/lane/lane-output.ts +124 -0
  767. package/scripts/lane/lane-paths.ts +96 -0
  768. package/scripts/lane/lane-reap.ts +137 -0
  769. package/scripts/lane/lane-registry.ts +261 -0
  770. package/scripts/lane/lane-relaunch.ts +68 -0
  771. package/scripts/lane/lane-report.ts +95 -0
  772. package/scripts/lane/lane-resume.ts +61 -0
  773. package/scripts/lane/lane-seed.ts +44 -0
  774. package/scripts/lane/lane-start-point.ts +175 -0
  775. package/scripts/lane/openai-lane-supervisor-cli.ts +32 -0
  776. package/scripts/lane/openai-lane-supervisor-decision.ts +63 -0
  777. package/scripts/lane/openai-lane-supervisor.ts +337 -0
  778. package/scripts/lib/bounded-pool.ts +109 -0
  779. package/scripts/lib/buffered-process.ts +82 -0
  780. package/scripts/lib/caddy-logs.sh +45 -0
  781. package/scripts/lib/cli-flags.ts +19 -0
  782. package/scripts/lib/json-value.ts +24 -0
  783. package/scripts/lib/poll.ts +57 -0
  784. package/scripts/lib/read-file.ts +16 -0
  785. package/scripts/lib/schemas.ts +67 -0
  786. package/scripts/lib/spawn-exit.ts +45 -0
  787. package/scripts/lib/status-icons.ts +24 -0
  788. package/scripts/lines/effective-limit.ts +156 -0
  789. package/scripts/lines/line-budget.ts +404 -0
  790. package/scripts/lines/line-targets.ts +80 -0
  791. package/scripts/lines/lines-command.ts +174 -0
  792. package/scripts/lint/cspell-cached.ts +41 -0
  793. package/scripts/lint/lint-parallel.ts +72 -0
  794. package/scripts/lint/lint-related-scope.ts +128 -0
  795. package/scripts/lint/lint-related.ts +104 -0
  796. package/scripts/managed-marker/index.ts +5 -0
  797. package/scripts/managed-marker/managed-marker-logic.ts +67 -0
  798. package/scripts/observations/observation-ledger-home.ts +32 -0
  799. package/scripts/observations/observation-ledger-line.ts +93 -0
  800. package/scripts/observations/observation-ledger.ts +35 -0
  801. package/scripts/observations/observations-flush-cli.ts +42 -0
  802. package/scripts/observations/observations-flush-landing.ts +97 -0
  803. package/scripts/observations/observations-flush.ts +420 -0
  804. package/scripts/overrides/lockfile-overrides.ts +105 -0
  805. package/scripts/overrides/overrides-check.ts +84 -0
  806. package/scripts/overrides/overrides-files.ts +19 -0
  807. package/scripts/overrides/overrides-logic.ts +211 -0
  808. package/scripts/overrides/schemas.ts +49 -0
  809. package/scripts/package/package-scout-cli.ts +195 -0
  810. package/scripts/package/package-scout-format.ts +151 -0
  811. package/scripts/package/package-scout.ts +121 -0
  812. package/scripts/ports/port-command.ts +87 -0
  813. package/scripts/propagate/propagate-git-failure.ts +191 -0
  814. package/scripts/propagate/propagate-git.ts +224 -0
  815. package/scripts/propagate/propagate-publish.ts +181 -0
  816. package/scripts/propagate/propagate-run.ts +201 -0
  817. package/scripts/propagate/propagate-steps.ts +421 -0
  818. package/scripts/propagate/propagate-targets.ts +160 -0
  819. package/scripts/propagate/propagate.ts +216 -0
  820. package/scripts/refactor/import-graph.ts +187 -0
  821. package/scripts/refactor/refactor-lint.ts +250 -0
  822. package/scripts/refactor/refactor-scan-cli.ts +10 -0
  823. package/scripts/refactor/refactor-scan.ts +124 -0
  824. package/scripts/refactor/refactor-targets.ts +103 -0
  825. package/scripts/release/release-cli.ts +88 -0
  826. package/scripts/release/release-history.ts +132 -0
  827. package/scripts/release/release-plan.ts +130 -0
  828. package/scripts/release/release-publish.ts +152 -0
  829. package/scripts/release/release-scope-cli.ts +103 -0
  830. package/scripts/release/release-tag.ts +93 -0
  831. package/scripts/release/release-worktree.ts +71 -0
  832. package/scripts/repo/auto-merge-setting-logic.ts +100 -0
  833. package/scripts/repo/auto-merge-setting.ts +37 -0
  834. package/scripts/repo/repo-setting.ts +112 -0
  835. package/scripts/report/report-lint-cli.ts +49 -0
  836. package/scripts/report/report-lint.ts +250 -0
  837. package/scripts/retrospective/retrospective-cli.ts +97 -0
  838. package/scripts/retrospective/retrospective.ts +127 -0
  839. package/scripts/review/disposition-cli.ts +44 -0
  840. package/scripts/review/disposition-logic.ts +45 -0
  841. package/scripts/review/live-evidence.ts +62 -0
  842. package/scripts/review/review-attest-cli.ts +115 -0
  843. package/scripts/review/review-attest.ts +319 -0
  844. package/scripts/review/review-brief-cli.ts +290 -0
  845. package/scripts/review/review-brief.ts +440 -0
  846. package/scripts/review/review-checkout.ts +56 -0
  847. package/scripts/review/review-finding-ledger.ts +167 -0
  848. package/scripts/review/review-findings-cli.ts +57 -0
  849. package/scripts/review/review-level.ts +86 -0
  850. package/scripts/review/review-record-cli.ts +196 -0
  851. package/scripts/review/review-record.ts +74 -0
  852. package/scripts/review/review-round2-cli.ts +84 -0
  853. package/scripts/review/review-round2.ts +139 -0
  854. package/scripts/review/review-stamps.ts +113 -0
  855. package/scripts/review/review-tree.ts +58 -0
  856. package/scripts/rules/bash-triggers.ts +44 -0
  857. package/scripts/rules/decision-oracle.ts +342 -0
  858. package/scripts/rules/delivered-rules-harness.ts +72 -0
  859. package/scripts/rules/delivered-rules.ts +793 -0
  860. package/scripts/rules/early-heartbeat.ts +241 -0
  861. package/scripts/rules/file-body.ts +150 -0
  862. package/scripts/rules/filing-cap.ts +133 -0
  863. package/scripts/rules/filing-offer.ts +81 -0
  864. package/scripts/rules/firing-point.ts +63 -0
  865. package/scripts/rules/gh-api.ts +65 -0
  866. package/scripts/rules/git-argv.ts +129 -0
  867. package/scripts/rules/git-force.ts +104 -0
  868. package/scripts/rules/implementation-cut-verdict.ts +84 -0
  869. package/scripts/rules/implementation-cut.ts +202 -0
  870. package/scripts/rules/issue-citation.ts +242 -0
  871. package/scripts/rules/issue-fold.ts +73 -0
  872. package/scripts/rules/issue-scout.ts +64 -0
  873. package/scripts/rules/josh-git-bare.ts +80 -0
  874. package/scripts/rules/lane-carry-conflict.ts +96 -0
  875. package/scripts/rules/lane-interactive-ask.ts +71 -0
  876. package/scripts/rules/lane-park.ts +122 -0
  877. package/scripts/rules/lane-switch-main.ts +139 -0
  878. package/scripts/rules/oracle-consulted.ts +81 -0
  879. package/scripts/rules/oracle-firing.ts +151 -0
  880. package/scripts/rules/oracle-list-cli.ts +81 -0
  881. package/scripts/rules/piped-verification.ts +126 -0
  882. package/scripts/rules/poll-loop.ts +125 -0
  883. package/scripts/rules/pre-gate-cut.ts +207 -0
  884. package/scripts/rules/prior-comment-read.ts +106 -0
  885. package/scripts/rules/raw-field-body.ts +56 -0
  886. package/scripts/rules/reply-language.ts +116 -0
  887. package/scripts/rules/rule-body-guard.ts +206 -0
  888. package/scripts/rules/rule-guard.ts +23 -0
  889. package/scripts/rules/rule-value-cli.ts +129 -0
  890. package/scripts/rules/rule-value.ts +397 -0
  891. package/scripts/rules/run-tail.ts +178 -0
  892. package/scripts/rules/shell-body-trigger.ts +204 -0
  893. package/scripts/rules/shell-segments.ts +45 -0
  894. package/scripts/rules/stop-rules.ts +329 -0
  895. package/scripts/rules/tail-commands.ts +35 -0
  896. package/scripts/rules/test-declared-commit.ts +51 -0
  897. package/scripts/rules/third-party-write.ts +90 -0
  898. package/scripts/rules/top-level-scripts-guard.ts +47 -0
  899. package/scripts/rules/worktree-guard.ts +130 -0
  900. package/scripts/run/detached-launch.ts +360 -0
  901. package/scripts/run/run-carry-args.ts +264 -0
  902. package/scripts/run/run-carry-change.ts +69 -0
  903. package/scripts/run/run-carry-cli.ts +441 -0
  904. package/scripts/run/run-carry-flush.ts +63 -0
  905. package/scripts/run/run-carry-stash.ts +71 -0
  906. package/scripts/run/run-carry-streak.ts +113 -0
  907. package/scripts/run/run-carry.ts +550 -0
  908. package/scripts/run/run-cut-args.ts +132 -0
  909. package/scripts/run/run-cut-cli.ts +461 -0
  910. package/scripts/run/run-cut-handoff.ts +126 -0
  911. package/scripts/run/run-cut.ts +531 -0
  912. package/scripts/run/run-ending-cli.ts +111 -0
  913. package/scripts/run/run-ending.ts +239 -0
  914. package/scripts/run/run-entry-cli.ts +135 -0
  915. package/scripts/run/run-entry.ts +95 -0
  916. package/scripts/run/run-event-cli.ts +210 -0
  917. package/scripts/run/run-event-follow.ts +65 -0
  918. package/scripts/run/run-event-render.ts +75 -0
  919. package/scripts/run/run-event-scope.ts +127 -0
  920. package/scripts/run/run-event-stream-emit.ts +140 -0
  921. package/scripts/run/run-event-stream.ts +258 -0
  922. package/scripts/run/run-event-watch.ts +37 -0
  923. package/scripts/run/run-headless.ts +105 -0
  924. package/scripts/run/run-hold-cli.ts +310 -0
  925. package/scripts/run/run-hold.ts +264 -0
  926. package/scripts/run/run-invocation.ts +237 -0
  927. package/scripts/run/run-issue-number.ts +19 -0
  928. package/scripts/run/run-liveness-cli.ts +169 -0
  929. package/scripts/run/run-liveness.ts +424 -0
  930. package/scripts/run/run-merge-cli.ts +385 -0
  931. package/scripts/run/run-merge-steps.ts +326 -0
  932. package/scripts/run/run-merge.ts +158 -0
  933. package/scripts/run/run-next-cli.ts +48 -0
  934. package/scripts/run/run-next.ts +80 -0
  935. package/scripts/run/run-preflight.ts +337 -0
  936. package/scripts/run/run-prep-cli.ts +151 -0
  937. package/scripts/run/run-prep.ts +84 -0
  938. package/scripts/run/run-progress-args.ts +65 -0
  939. package/scripts/run/run-progress-cli.ts +508 -0
  940. package/scripts/run/run-progress-clock.ts +320 -0
  941. package/scripts/run/run-progress-config.ts +119 -0
  942. package/scripts/run/run-progress-read.ts +199 -0
  943. package/scripts/run/run-progress.ts +366 -0
  944. package/scripts/run/run-report-cli.ts +71 -0
  945. package/scripts/run/run-report.ts +78 -0
  946. package/scripts/run/run-review-cli.ts +130 -0
  947. package/scripts/run/run-review-steps.ts +161 -0
  948. package/scripts/run/run-review.ts +121 -0
  949. package/scripts/run/run-ship-cli.ts +431 -0
  950. package/scripts/run/run-ship-detach.ts +200 -0
  951. package/scripts/run/run-ship-probe.ts +103 -0
  952. package/scripts/run/run-ship-return.ts +75 -0
  953. package/scripts/run/run-ship-review-steps.ts +227 -0
  954. package/scripts/run/run-ship-review.ts +177 -0
  955. package/scripts/run/run-ship-stage.ts +150 -0
  956. package/scripts/run/run-ship.ts +78 -0
  957. package/scripts/run/run-status-cli.ts +175 -0
  958. package/scripts/run/run-status.ts +77 -0
  959. package/scripts/run/run-step-cli.ts +111 -0
  960. package/scripts/run/run-step.ts +292 -0
  961. package/scripts/run/run-stop-notify.ts +52 -0
  962. package/scripts/run/run-stranded-cli.ts +31 -0
  963. package/scripts/run/run-stranded-detect.ts +134 -0
  964. package/scripts/run/run-stranded.ts +120 -0
  965. package/scripts/run/run-tail-cli.ts +105 -0
  966. package/scripts/run/run-tail.ts +61 -0
  967. package/scripts/run/run-transcript.golden.txt +57 -0
  968. package/scripts/run/run-wake-cli.ts +428 -0
  969. package/scripts/run/run-wake-describe.ts +97 -0
  970. package/scripts/run/run-wake-driver.ts +80 -0
  971. package/scripts/run/run-wake-handoff.ts +29 -0
  972. package/scripts/run/run-wake-loop.ts +223 -0
  973. package/scripts/run/run-wake-session.ts +150 -0
  974. package/scripts/run/run-wake-work.ts +104 -0
  975. package/scripts/run/run-wake.ts +607 -0
  976. package/scripts/run/run-watcher-guard-cli.ts +37 -0
  977. package/scripts/run/run-watcher-guard.ts +59 -0
  978. package/scripts/run/run-watcher-hook.ts +86 -0
  979. package/scripts/security/secretlint-scan.ts +86 -0
  980. package/scripts/security/security-audit-logic.ts +51 -0
  981. package/scripts/security/security-audit-provision-logic.ts +217 -0
  982. package/scripts/security/security-audit-provision.ts +186 -0
  983. package/scripts/security/security-audit.ts +132 -0
  984. package/scripts/security/security-updates-logic.ts +131 -0
  985. package/scripts/security/security-updates.ts +38 -0
  986. package/scripts/security/sonar-file.ts +44 -0
  987. package/scripts/self-sync-guard/index.ts +5 -0
  988. package/scripts/self-sync-guard/self-sync-guard-logic.ts +98 -0
  989. package/scripts/self-sync-guard/self-sync-refusal.ts +22 -0
  990. package/scripts/sonar/sonar-hotspots-cli.ts +149 -0
  991. package/scripts/sonar/sonar-hotspots.ts +111 -0
  992. package/scripts/split/split-assess-cli.ts +52 -0
  993. package/scripts/split/split-assess.ts +124 -0
  994. package/scripts/sync/dependabot-pin-logic.ts +135 -0
  995. package/scripts/sync/directory-copy-guard.ts +187 -0
  996. package/scripts/sync/file-content.ts +49 -0
  997. package/scripts/sync/managed-config-scope-cli.ts +64 -0
  998. package/scripts/sync/managed-config-scope.ts +123 -0
  999. package/scripts/sync/plugin-skill-directories.ts +15 -0
  1000. package/scripts/sync/reconcile-templates.ts +53 -0
  1001. package/scripts/sync/removed-skill-manifest.ts +27 -0
  1002. package/scripts/sync/skill-migration.ts +192 -0
  1003. package/scripts/sync/sync-configs.ts +156 -0
  1004. package/scripts/sync/sync-hook-safety.ts +82 -0
  1005. package/scripts/sync/sync.ts +417 -0
  1006. package/scripts/sync/synced-paths.ts +52 -0
  1007. package/scripts/sync/template-source-logic.ts +122 -0
  1008. package/scripts/sync/workflow-pin-logic.ts +240 -0
  1009. package/scripts/test/classify-isolation.ts +149 -0
  1010. package/scripts/test/e2e-retry-check.ts +150 -0
  1011. package/scripts/test/http-fault-injection.ts +79 -0
  1012. package/scripts/test/josh-harness-environment.ts +260 -0
  1013. package/scripts/test/josh-harness.ts +96 -0
  1014. package/scripts/test/pilot-files.ts +457 -0
  1015. package/scripts/test/pilot-measure.ts +78 -0
  1016. package/scripts/test/test-declared-changed.ts +99 -0
  1017. package/scripts/test/test-declared-logic.ts +91 -0
  1018. package/scripts/test/test-declared-match.ts +106 -0
  1019. package/scripts/test/test-declared.ts +180 -0
  1020. package/scripts/test/test-e2e-guard.ts +86 -0
  1021. package/scripts/test/test-network-guard.ts +453 -0
  1022. package/scripts/test/test-red-commit.ts +51 -0
  1023. package/scripts/test/test-red-logic.ts +76 -0
  1024. package/scripts/test/test-red.ts +154 -0
  1025. package/scripts/test/test-related-scope.ts +115 -0
  1026. package/scripts/test/test-related.ts +73 -0
  1027. package/scripts/test/test-repository-guard.ts +317 -0
  1028. package/scripts/test/test-state-guard.ts +85 -0
  1029. package/scripts/test/test-stdout-guard.ts +54 -0
  1030. package/scripts/test/test-telegram-guard.ts +90 -0
  1031. package/scripts/test/test-type-logic.ts +31 -0
  1032. package/scripts/test/test-unit-guard.ts +185 -0
  1033. package/scripts/test/unit-guard-environment.ts +12 -0
  1034. package/scripts/test/unit-projects.ts +139 -0
  1035. package/scripts/test/unit-worker-share.ts +251 -0
  1036. package/scripts/test/vitest-include-globs.ts +12 -0
  1037. package/scripts/time-runtime/time-agent-bundles.ts +128 -0
  1038. package/scripts/time-runtime/time-background.ts +300 -0
  1039. package/scripts/time-runtime/time-batch-guard-fixtures.ts +66 -0
  1040. package/scripts/time-runtime/time-batch-guard.ts +529 -0
  1041. package/scripts/time-runtime/time-bundle-call.ts +575 -0
  1042. package/scripts/time-runtime/time-bundles.ts +536 -0
  1043. package/scripts/time-runtime/time-call-identity.ts +37 -0
  1044. package/scripts/time-runtime/time-command-key.ts +35 -0
  1045. package/scripts/time-runtime/time-density-hook.ts +166 -0
  1046. package/scripts/time-runtime/time-density.ts +147 -0
  1047. package/scripts/time-runtime/time-followup-stage.ts +107 -0
  1048. package/scripts/time-runtime/time-format.ts +186 -0
  1049. package/scripts/time-runtime/time-hook-transcript.ts +82 -0
  1050. package/scripts/time-runtime/time-instant.ts +20 -0
  1051. package/scripts/time-runtime/time-markers.ts +228 -0
  1052. package/scripts/time-runtime/time-phase-names.ts +123 -0
  1053. package/scripts/time-runtime/time-reported-failure.ts +227 -0
  1054. package/scripts/time-runtime/time-round-trips.ts +279 -0
  1055. package/scripts/time-runtime/time-shell.ts +286 -0
  1056. package/scripts/time-runtime/time-single-check.ts +65 -0
  1057. package/scripts/time-runtime/time-spans.ts +545 -0
  1058. package/scripts/time-runtime/time-transcript-line.ts +253 -0
  1059. package/scripts/time-runtime/time-writes.ts +71 -0
  1060. package/scripts/ui/ui-routes-cli.ts +122 -0
  1061. package/scripts/ui/ui-routes.ts +102 -0
  1062. package/scripts/version/bump-version.ts +71 -0
  1063. package/scripts/version/effective-upstream.ts +93 -0
  1064. package/scripts/version/index.ts +25 -0
  1065. package/scripts/version/kit-descriptor.ts +10 -0
  1066. package/scripts/version/kit-version-config.ts +30 -0
  1067. package/scripts/version/latest-corepack.ts +404 -0
  1068. package/scripts/version/latest-lane-guard.ts +49 -0
  1069. package/scripts/version/latest-regression.ts +93 -0
  1070. package/scripts/version/latest-scope-cli.ts +147 -0
  1071. package/scripts/version/latest-stamp.ts +107 -0
  1072. package/scripts/version/latest-update.ts +198 -0
  1073. package/scripts/version/package-manager-version.ts +95 -0
  1074. package/scripts/version/parse-json.ts +13 -0
  1075. package/scripts/version/preinstall-version-update.ts +84 -0
  1076. package/scripts/version/publishable-range-check.ts +74 -0
  1077. package/scripts/version/publishable-range.ts +123 -0
  1078. package/scripts/version/release-age.ts +146 -0
  1079. package/scripts/version/release-hold.ts +142 -0
  1080. package/scripts/version/running-binary.ts +42 -0
  1081. package/scripts/version/upgrade-command-guard.ts +49 -0
  1082. package/scripts/version/upgrade-shell-command.ts +30 -0
  1083. package/scripts/version/version-check-logic.ts +333 -0
  1084. package/scripts/version/version-check.ts +14 -0
  1085. package/scripts/version/version-command-config.ts +177 -0
  1086. package/scripts/version/version-commands.ts +296 -0
  1087. package/scripts/version/version-remote.ts +86 -0
  1088. package/scripts/version/version-targets.ts +81 -0
  1089. package/scripts/yaml/yaml-document.ts +46 -0
  1090. package/scripts-ai/completion-gate.ts +13 -0
  1091. package/scripts-ai/environment-loader.ts +9 -0
  1092. package/scripts-ai/epic-check.ts +34 -0
  1093. package/scripts-ai/epic-cli-argv.ts +77 -0
  1094. package/scripts-ai/epic-cli-remove.ts +71 -0
  1095. package/scripts-ai/epic-cli.ts +413 -0
  1096. package/scripts-ai/epic.ts +192 -0
  1097. package/scripts-ai/followup-issue-number.ts +31 -0
  1098. package/scripts-ai/git-followup-finish.ts +217 -0
  1099. package/scripts-ai/git-followup-workflow.ts +252 -0
  1100. package/scripts-ai/git-workflow.ts +246 -0
  1101. package/scripts-ai/telegram-test-logic.ts +88 -0
  1102. package/scripts-ai/telegram-test.ts +130 -0
  1103. package/templates/gitignore +76 -0
  1104. package/templates/sonar-project.properties +52 -0
  1105. package/templates/workflows/ci.yml +639 -0
  1106. package/templates/workflows/dependabot-auto-merge.yml +428 -0
  1107. package/tsconfig/base.json +50 -0
  1108. package/tsconfig.sonar.json +34 -0
@@ -0,0 +1,113 @@
1
+ // The pure streak arithmetic behind `run-carry.ts` → `apply_change`, relocated here so the record's
2
+ // file stays under its line bound and the outage fold has a test of its own (joshuafolkken/kit#2317).
3
+ // It owns the two consecutive-streak counters — the failure streak and the API-outage streak — and the
4
+ // one timestamp the outage fold reads. Nothing here touches disk: it is arithmetic over the values a
5
+ // change carries and the counters already on the record.
6
+ //
7
+ // The input types are named narrowly rather than imported from `run-carry.ts`, so this module does not
8
+ // import back from the file that imports it. `RunCarry` and `CarryChange` are structurally compatible
9
+ // with them, so the caller passes them through unchanged.
10
+
11
+ const NO_INCREMENT = 0
12
+
13
+ // Two minutes. **A single network drop reaches every in-flight lane child at once**, and the parent
14
+ // books each returning child's outage within a burst of merge events seconds to tens of seconds apart;
15
+ // two minutes covers that burst with room to spare. **A genuinely dead API is different**: an outage
16
+ // child is re-dispatched and spends its ten connection retries before the next child returns, so two
17
+ // consecutive *real* outages land minutes apart — outside this window — and still accumulate toward the
18
+ // environment guard. Measured on 2026-09-22 (joshuafolkken/kit#2317): one network event booked four
19
+ // outages within seconds, tripping the limit of three in a single stroke though the API was alive.
20
+ const OUTAGE_FOLD_WINDOW_MS = 120_000
21
+
22
+ interface StreakCarry {
23
+ failures: number
24
+ outages: number
25
+ last_outage_at?: string | undefined
26
+ }
27
+
28
+ interface StreakChange {
29
+ merged?: number
30
+ failures?: number
31
+ outages?: number
32
+ }
33
+
34
+ interface StreakState {
35
+ failures: number
36
+ outages: number
37
+ last_outage_at: string | undefined
38
+ }
39
+
40
+ interface OutageState {
41
+ outages: number
42
+ last_outage_at: string | undefined
43
+ }
44
+
45
+ function has_increment(value: number | undefined): boolean {
46
+ return (value ?? NO_INCREMENT) > NO_INCREMENT
47
+ }
48
+
49
+ // **A merge resets the streak; every other change adds to it.** The consecutive-failure guard trips on
50
+ // children failing one after another, so a child that merged in between is what breaks the run — the
51
+ // reset lives with the increment rather than in a caller that could forget it (joshuafolkken/kit#2024).
52
+ function next_failures(carry: StreakCarry, change: StreakChange): number {
53
+ if (has_increment(change.merged)) return NO_INCREMENT
54
+
55
+ return carry.failures + (change.failures ?? NO_INCREMENT)
56
+ }
57
+
58
+ // Whether this outage lands inside the fold window of the last counted one, so it is the same network
59
+ // event rather than a fresh one. An absent or unparsable timestamp is read as "no recent outage", so
60
+ // the outage counts rather than folding into a window that cannot be measured.
61
+ function is_within_fold_window(last_outage_at: string | undefined, now: Date): boolean {
62
+ if (last_outage_at === undefined) return false
63
+
64
+ const last = Date.parse(last_outage_at)
65
+
66
+ if (Number.isNaN(last)) return false
67
+
68
+ return now.getTime() - last <= OUTAGE_FOLD_WINDOW_MS
69
+ }
70
+
71
+ // A folded outage leaves the streak and its timestamp where they stood — the window is **not** slid
72
+ // forward, so a run of genuinely continuous outages cannot fold forever: only outages inside the first
73
+ // one's window fold, and the next one outside it counts.
74
+ function folded_outage(carry: StreakCarry): OutageState {
75
+ return { outages: carry.outages, last_outage_at: carry.last_outage_at }
76
+ }
77
+
78
+ function counted_outage(carry: StreakCarry, change: StreakChange, now: Date): OutageState {
79
+ const outages = carry.outages + (change.outages ?? NO_INCREMENT)
80
+
81
+ return { outages, last_outage_at: now.toISOString() }
82
+ }
83
+
84
+ // **An outage adds to the streak unless it folds; a merge or a genuine child failure resets it**
85
+ // (joshuafolkken/kit#2240, fold added by joshuafolkken/kit#2317). Anything that proves the API *was*
86
+ // reachable — a merge, or a child that failed on its own after reaching it — breaks the run and clears
87
+ // the fold timestamp. A change that touches none of the three leaves the streak untouched.
88
+ function next_outage(carry: StreakCarry, change: StreakChange, now: Date): OutageState {
89
+ if (has_increment(change.outages)) {
90
+ return is_within_fold_window(carry.last_outage_at, now)
91
+ ? folded_outage(carry)
92
+ : counted_outage(carry, change, now)
93
+ }
94
+
95
+ const is_reachable = has_increment(change.merged) || has_increment(change.failures)
96
+
97
+ return is_reachable ? { outages: NO_INCREMENT, last_outage_at: undefined } : folded_outage(carry)
98
+ }
99
+
100
+ function next_state(carry: StreakCarry, change: StreakChange, now: Date): StreakState {
101
+ const outage = next_outage(carry, change, now)
102
+
103
+ return {
104
+ failures: next_failures(carry, change),
105
+ outages: outage.outages,
106
+ last_outage_at: outage.last_outage_at,
107
+ }
108
+ }
109
+
110
+ const run_carry_streak = { OUTAGE_FOLD_WINDOW_MS, next_state }
111
+
112
+ export type { StreakCarry, StreakChange, StreakState }
113
+ export { run_carry_streak }
@@ -0,0 +1,550 @@
1
+ import { backlog_budget } from '#scripts/backlog/backlog-budget'
2
+ import { git_command } from '#scripts/git/git-command'
3
+ import { process_identity } from '#scripts/josh/process-identity'
4
+ import { stamp_file } from '#scripts/josh/stamp-file'
5
+ import { z } from 'zod'
6
+ import { run_carry_change } from './run-carry-change'
7
+ import { run_invocation } from './run-invocation'
8
+
9
+ // joshuafolkken/kit#1714: a `backlogrun` declares a budget — `--max`, `--idle` and the 8-hour
10
+ // whole-run bound — and then loses all of it at the session cut, because the cut ends the session and
11
+ // the next one starts from nothing. The decision recorded on that issue is that **the cut is an
12
+ // execution detail of the same authorization**, so the budget has to survive it. Nothing in this
13
+ // repository persisted a run across sessions before: `backlogrun-progress.md` → "What carries over" reads its
14
+ // state back off GitHub, and there is no epic to read it off when the run began from the backlog.
15
+ //
16
+ // **The unit is the repository, not the working tree.** `run-hold.ts` keys on the work tree's own git
17
+ // directory because what it guards is one branch, one index and one diff. What this record guards is
18
+ // one *invocation's* budget, and that invocation opens lanes — each a work tree of its own — so the
19
+ // key is the common git directory, which every lane of one repository shares.
20
+ //
21
+ // **The 8-hour bound is the record's expiry.** Held as an age rather than as prose, the bound is
22
+ // decided the same way `backlog:budget` decides the other two: the command answers, and the run
23
+ // obeys. A run that reads `expired` has spent the bound whatever any count says.
24
+ //
25
+ // **Whose record it is, is decided by liveness and by a declared hand-off — never by the invocation
26
+ // text** (joshuafolkken/kit#1722). Comparing the `invocation` string was the first answer, and it
27
+ // walks straight through the case that happens most: a run dies, a person retypes the same command,
28
+ // and the string matches, so the fresh session inherits the dead run's counters and a `started_at`
29
+ // hours old. Two things replace it. The record names the **long-lived process spending the budget**
30
+ // — `owner_pid` with the start time that tells a reused pid apart, the identity pair
31
+ // `process-identity.ts` already keeps for every other record — so a second parent asking for a
32
+ // record whose owner is still running is refused rather than told it may count into it. And a
33
+ // **session cut declares itself**: `--cut` marks the record as handed off, which a crash never
34
+ // reaches, so only a cut the run itself took is carried without anyone deciding. Everything else is
35
+ // an explicit carry-or-discard: `--resume` adopts the standing record, `--end` discards it.
36
+
37
+ const CARRY_PREFIX = 'josh-run-carry-'
38
+ const REPOSITORY_DIRECTORY_INDEX = 1
39
+ // **The whole-run bound is `backlog-budget.ts`'s, imported rather than restated.** `backlogrun.md` →
40
+ // "Waiting, and never waiting forever" states the figure and that module applies it; a second copy
41
+ // here would drift, and the drift is silent in exactly the direction that matters — raised there and
42
+ // still 8 here, this record answers `expired`, `--begin` replaces it, and the budget restarts at
43
+ // zero, which is the defect joshuafolkken/kit#1714 exists to prevent.
44
+ const CARRY_MAX_AGE_HOURS = backlog_budget.WHOLE_RUN_BUDGET_HOURS
45
+ const CARRY_MAX_AGE_MS = backlog_budget.WHOLE_RUN_BUDGET_MS
46
+ const NO_INCREMENT = 0
47
+
48
+ // The most session cuts one invocation may take (joshuafolkken/kit#2346). This bounds `cuts`, which
49
+ // only `run:carry --cut` increments — a `backlogrun`'s session hand-off at a child's merge (~one per
50
+ // 50 minutes over the 8-hour whole-run budget), not the `run:cut` phase cuts a lane child takes. Each
51
+ // cut drops the context it accumulated but pays a cold preamble to resume, so past a point the
52
+ // re-establishment costs more than the accumulation it sheds; six sits well under the ~10 an 8-hour run
53
+ // could otherwise take and refuses a run that has begun to churn. `is_at_cut_cap` reads it, and the
54
+ // `--cut` count is refused at it rather than incrementing past it.
55
+ const MAX_CUTS = 6
56
+
57
+ const END_COMMAND = 'pnpm josh run:carry --end'
58
+ const RESUME_COMMAND = 'pnpm josh run:carry --resume'
59
+ const READ_COMMAND = 'pnpm josh run:carry --json'
60
+ // The shell variable that names the parent loop's own long-lived process, quoted so the reader can
61
+ // paste the printed command as it stands.
62
+ const OWNER_ARGUMENT = '--owner "$PPID"'
63
+
64
+ interface RunCarry {
65
+ // The invocation as the person typed it, so a resumed session runs the same command rather than
66
+ // one it inferred. `CLAUDE.md` → "Explicit invocation required" forbids inferring; naming the
67
+ // invocation is what leaves nothing to infer. **It is not the ownership test** — that is
68
+ // `classify_claim` below, for the reason the header gives.
69
+ invocation: string
70
+ started_at: string
71
+ merged: number
72
+ // Issue numbers counted as merges by this invocation. Kept with the count so a restarted
73
+ // run cannot count a child twice if it stopped before writing the merge event.
74
+ merged_issues?: ReadonlyArray<number> | undefined
75
+ filed: number
76
+ cuts: number
77
+ // The consecutive-failure streak (joshuafolkken/kit#2024). It is the count the stopped-unit guard
78
+ // leans on to notice the environment is at fault, and it lived only in the epic progress comment
79
+ // before this — the second place a counter was kept. Folded into the record so the record is the
80
+ // single source and the comment is generated from it. **A merge resets it to zero**: three failures
81
+ // in a row stop the run, and a child that merged in between breaks the streak. Read through
82
+ // `apply_change`, never bumped from outside, so the reset stays with the increment.
83
+ failures: number
84
+ // The consecutive-API-outage streak (joshuafolkken/kit#2240). It is kept apart from `failures`
85
+ // because a child that could not reach the API is not a child that failed: an outage is not counted
86
+ // against the consecutive-failure guard, and this streak is its own environment-broken guard — a run
87
+ // of outages stops the run rather than re-dispatching into a dead API forever. **A merge or a genuine
88
+ // child failure resets it**, because both prove the API was reachable; only a further outage adds to
89
+ // it. Defaulted to zero so a record written before this field existed still parses.
90
+ outages: number
91
+ // When the last *counted* outage was booked, so a burst of outages from one network event folds into
92
+ // a single streak step rather than several (joshuafolkken/kit#2317). Read by `run-carry-streak.ts`
93
+ // against its fold window; set only when an outage counts, cleared when the API proves reachable.
94
+ // Optional and `| undefined` for the same disk round-trip reason the owner fields carry.
95
+ last_outage_at?: string | undefined
96
+ // The process spending the budget, as the caller declared it with `--owner`. `run-hold.ts` records
97
+ // a pid it explicitly does not read back, because the process that claims a work tree is the
98
+ // short-lived `josh run:hold` itself; here the owner is the parent loop's own session, which
99
+ // outlives every command it issues, so the pid is what a second parent is refused against. Both
100
+ // halves are optional: a record written before this field existed, or by a caller that named no
101
+ // owner, is simply not provably live.
102
+ //
103
+ // **`| undefined` explicitly, rather than the bare optional `exactOptionalPropertyTypes` prefers.**
104
+ // The record round-trips through `JSON.stringify`, which drops a property whose value is
105
+ // `undefined`, so absent and explicitly-undefined are the *same* record on disk — a type that told
106
+ // them apart would be asserting a distinction nothing here can observe.
107
+ owner_pid?: number | undefined
108
+ owner_start?: string | undefined
109
+ // Set by `--cut`, and by nothing else. A crash never reaches `--cut`, which is what makes a
110
+ // declared cut the only standing record carried without a person deciding.
111
+ is_handed_off?: boolean | undefined
112
+ // The issues this invocation has already finished, as `--done <N>` recorded them
113
+ // (joshuafolkken/kit#1774; folded into `backlogrun` by joshuafolkken/kit#1984). **It exists because
114
+ // a named-issue invocation must not shrink.** The obvious way to resume
115
+ // `backlogrun #1762 #1749 #1759` after #1762 merged is to begin again as `backlogrun #1749 #1759` —
116
+ // and `classify_claim` compares the invocation character for character, so that answers `mismatch`
117
+ // and the run stops. Pinning the string to the opening list and keeping the progress here leaves
118
+ // that comparison, and joshuafolkken/kit#1722's single-writer guarantee with it, exactly as it was.
119
+ // `merged` cannot serve: it is a count of merges rather than a set of issues, so a child that ended
120
+ // without one — `already-done`, or a park — would shift every remaining position by one.
121
+ done?: ReadonlyArray<number> | undefined
122
+ // Whether this invocation's end-of-run retrospective has already run (joshuafolkken/kit#2328). It
123
+ // is the state the two run-ending points hold so `run:step` prints the retrospective exactly once:
124
+ // the record is one per invocation and survives every session cut, so a run cannot repeat it after a
125
+ // resume, and `--end` removes the record so it cannot leak into the next invocation. Set by
126
+ // `--retrospective`, and carried across a hand-off like `done`. Optional and `| undefined` for the
127
+ // same disk round-trip reason the owner fields carry.
128
+ retrospective?: boolean | undefined
129
+ }
130
+
131
+ // The identity of a process, as `process-identity.ts` keeps it: the pid plus an opaque start-time
132
+ // token, so a reissued pid is never mistaken for the process that wrote the record.
133
+ interface CarryOwner {
134
+ pid?: number | undefined
135
+ start?: string | undefined
136
+ }
137
+
138
+ // **`resume` is the only one of the four that establishes anything.** The other three are refusals,
139
+ // and they are three rather than one because what the reader has to do differs: wait, retype the
140
+ // invocation, or decide between carrying and discarding.
141
+ type CarryClaim = 'resume' | 'busy' | 'mismatch' | 'standing'
142
+
143
+ interface CarryClaimRequest {
144
+ invocation: string
145
+ owner: CarryOwner
146
+ // `--resume` rather than `--begin`: the caller has decided to adopt a standing record, which is
147
+ // the carry half of the answer `standing` asks for.
148
+ is_adoption: boolean
149
+ }
150
+
151
+ // Every counter is an increment rather than a total: a run that sent a total would be sending an
152
+ // arithmetic it had done in its head, which is the one-shot judgement joshuafolkken/kit#1460
153
+ // measured a run walking past.
154
+ interface CarryChange {
155
+ merged?: number
156
+ merged_issue?: number
157
+ filed?: number
158
+ cuts?: number
159
+ // One failed child to add to the streak (joshuafolkken/kit#2024). It is never sent in the same
160
+ // change as `merged` — a child either merged or it did not — and a change that carries `merged`
161
+ // resets the streak regardless of this field.
162
+ failures?: number
163
+ // One API-outage child to add to the outage streak (joshuafolkken/kit#2240). Never sent with
164
+ // `merged` or `failures` — a child either merged, failed, or could not reach the API — and both of
165
+ // those reset this streak.
166
+ outages?: number
167
+ // One issue number to add to `done`, not a count. It is the one field of a change that names a
168
+ // thing rather than an amount, because what a resumed named-issue run needs is *which* issues are
169
+ // finished.
170
+ done?: number
171
+ // Marks the end-of-run retrospective as run (joshuafolkken/kit#2328). It only ever sets the flag,
172
+ // never clears it: a retrospective that has run stays run for the rest of the invocation.
173
+ retrospective?: boolean
174
+ }
175
+
176
+ type CarryRead =
177
+ | { kind: 'none' }
178
+ | { kind: 'carried'; carry: RunCarry }
179
+ | { kind: 'expired'; carry: RunCarry }
180
+ | { kind: 'unreadable' }
181
+
182
+ const NONE_READ: CarryRead = { kind: 'none' }
183
+ const UNREADABLE_READ: CarryRead = { kind: 'unreadable' }
184
+ const NO_OWNER: CarryOwner = {}
185
+
186
+ const run_carry_schema = z.object({
187
+ invocation: z.string(),
188
+ started_at: z.string(),
189
+ merged: z.number(),
190
+ merged_issues: z.array(z.number()).optional(),
191
+ filed: z.number(),
192
+ cuts: z.number(),
193
+ // Defaulted, so a record written before this field existed parses with a zero streak rather than
194
+ // failing to read — the same backward-compatibility the optional owner fields below carry.
195
+ failures: z.number().default(0),
196
+ // Defaulted for the same backward-compatibility as `failures` (joshuafolkken/kit#2240).
197
+ outages: z.number().default(0),
198
+ // Optional, so a record written before the outage fold existed still parses (joshuafolkken/kit#2317).
199
+ last_outage_at: z.string().optional(),
200
+ // Optional, so a record written by the previous shape still parses. Read as "no owner declared",
201
+ // which is the not-provably-live answer rather than a live one.
202
+ owner_pid: z.number().optional(),
203
+ owner_start: z.string().optional(),
204
+ is_handed_off: z.boolean().optional(),
205
+ done: z.array(z.number()).optional(),
206
+ // Optional, so a record written before the retrospective existed still parses (joshuafolkken/kit#2328).
207
+ retrospective: z.boolean().optional(),
208
+ })
209
+
210
+ function carry_path(git_directory: string): string {
211
+ return stamp_file.stamp_path(CARRY_PREFIX, git_directory)
212
+ }
213
+
214
+ // The common git directory: `.git` in the main work tree and the same `.git` from inside a lane, so
215
+ // one invocation keys alike wherever its commands run.
216
+ async function repository_directory(): Promise<string | undefined> {
217
+ const directories = await git_command.git_directories()
218
+
219
+ return directories[REPOSITORY_DIRECTORY_INDEX]
220
+ }
221
+
222
+ function parse_carry(raw: string): RunCarry | undefined {
223
+ try {
224
+ const parsed = run_carry_schema.safeParse(JSON.parse(raw))
225
+
226
+ return parsed.success ? parsed.data : undefined
227
+ } catch {
228
+ return undefined
229
+ }
230
+ }
231
+
232
+ // A `started_at` that is not a date is read as expired rather than as current, for the reason
233
+ // `run-hold.ts` reads an unparsable `taken_at` that way: a record nothing can ever expire is the one
234
+ // state the bound exists to make impossible.
235
+ function is_expired(carry: RunCarry, now: Date): boolean {
236
+ const started = Date.parse(carry.started_at)
237
+
238
+ if (Number.isNaN(started)) return true
239
+
240
+ return now.getTime() - started > CARRY_MAX_AGE_MS
241
+ }
242
+
243
+ function classify(raw: string | undefined, now: Date): CarryRead {
244
+ if (raw === undefined) return NONE_READ
245
+
246
+ const carry = parse_carry(raw)
247
+
248
+ if (carry === undefined) return UNREADABLE_READ
249
+
250
+ return { kind: is_expired(carry, now) ? 'expired' : 'carried', carry }
251
+ }
252
+
253
+ function read_carry(target: string, now: Date = new Date()): CarryRead {
254
+ return classify(stamp_file.read_stamp_text(target), now)
255
+ }
256
+
257
+ // The identity to record for a pid the caller declared. `read_start` is what makes the pair an
258
+ // identity rather than a number; injected in tests so the sandbox branch is exercised without
259
+ // changing the machine's process capabilities.
260
+ function owner_of(
261
+ pid: number,
262
+ read: (owner_pid: number) => string | undefined = process_identity.read_start,
263
+ ): CarryOwner {
264
+ return { pid, start: read(pid) }
265
+ }
266
+
267
+ function fresh_carry(invocation: string, owner: CarryOwner, now: Date): RunCarry {
268
+ return {
269
+ invocation,
270
+ started_at: now.toISOString(),
271
+ merged: NO_INCREMENT,
272
+ filed: NO_INCREMENT,
273
+ cuts: NO_INCREMENT,
274
+ failures: NO_INCREMENT,
275
+ outages: NO_INCREMENT,
276
+ owner_pid: owner.pid,
277
+ owner_start: owner.start,
278
+ }
279
+ }
280
+
281
+ // **Create-exclusively, exactly as `run-hold.ts` claims a work tree.** Two sessions that both read
282
+ // `none` in the same instant would both be told they had begun a run, and the second one's write
283
+ // would erase the first one's ownership — so the write is the ownership assertion and `undefined` is
284
+ // losing that race, never an error.
285
+ function begin_carry(
286
+ target: string,
287
+ invocation: string,
288
+ owner: CarryOwner = NO_OWNER,
289
+ now: Date = new Date(),
290
+ ): RunCarry | undefined {
291
+ const carry = fresh_carry(invocation, owner, now)
292
+
293
+ return stamp_file.create_stamp(target, carry) ? carry : undefined
294
+ }
295
+
296
+ // Replacing a record whose bound is spent. It removes and then creates exclusively rather than
297
+ // writing over the old bytes, for the reason `run-hold.ts` replaces a stale hold the same way: a
298
+ // plain write would put the race back one branch over.
299
+ function replace_carry(
300
+ target: string,
301
+ invocation: string,
302
+ owner: CarryOwner = NO_OWNER,
303
+ now: Date = new Date(),
304
+ ): RunCarry | undefined {
305
+ stamp_file.remove_stamp(target)
306
+
307
+ return begin_carry(target, invocation, owner, now)
308
+ }
309
+
310
+ // Taking over a standing record: the counters and `started_at` are the run's and stay, the owner
311
+ // becomes this session, and the hand-off is spent. **`cuts` is not incremented here** — `--cut`
312
+ // counts the cut, and a record adopted after a crash crossed no cut at all.
313
+ //
314
+ // **It creates exclusively, like every other claim here.** Two sessions reading one handed-off record
315
+ // would both classify `resume`, and a plain write would tell both of them they had taken it over;
316
+ // `undefined` is losing that race. The write window itself is `stamp-file.ts`'s and is unchanged —
317
+ // what this closes is the silent second winner.
318
+ function adopt_carry(
319
+ target: string,
320
+ carry: RunCarry,
321
+ owner: CarryOwner = NO_OWNER,
322
+ ): RunCarry | undefined {
323
+ // The run's own fields carry across untouched — the counters, the outage fold timestamp
324
+ // (joshuafolkken/kit#2317), `done` so the successor does not re-run what the cut session finished,
325
+ // and `retrospective` so a run resumed after a cut does not repeat its retrospective. Only the three
326
+ // ownership fields are overridden: the new owner replaces the old — a caller that declared none
327
+ // writes `undefined`, so the previous owner cannot survive — and the declared hand-off is spent.
328
+ const next: RunCarry = {
329
+ ...carry,
330
+ owner_pid: owner.pid,
331
+ owner_start: owner.start,
332
+ is_handed_off: false,
333
+ }
334
+
335
+ stamp_file.remove_stamp(target)
336
+
337
+ return stamp_file.create_stamp(target, next) ? next : undefined
338
+ }
339
+
340
+ // A live pid with no readable start token is conservatively held rather than replaced. The command
341
+ // cannot prove its generation inside that sandbox, but a false `busy` stops for a person while a
342
+ // false `standing` can put two parents on one budget. A record with no pid still resolves false.
343
+ function is_owner_live(carry: RunCarry): boolean {
344
+ return process_identity.is_same_process(carry.owner_pid, carry.owner_start) !== false
345
+ }
346
+
347
+ function is_owned_by(carry: RunCarry, owner: CarryOwner): boolean {
348
+ return carry.owner_pid === owner.pid && carry.owner_start === owner.start
349
+ }
350
+
351
+ // The one case that is not this caller's to touch: the record's owner is still running and it is
352
+ // somebody else. **The invocation text is not consulted** — a live owner holds the budget whatever
353
+ // either command line says, which is the whole of joshuafolkken/kit#1722.
354
+ function is_foreign_live_owner(carry: RunCarry, owner: CarryOwner): boolean {
355
+ return is_owner_live(carry) && !is_owned_by(carry, owner)
356
+ }
357
+
358
+ function is_handed_off_to(carry: RunCarry, invocation: string): boolean {
359
+ return carry.is_handed_off === true && carry.invocation === invocation
360
+ }
361
+
362
+ // **The order is the rule, and a declared hand-off comes first** (joshuafolkken/kit#1935). Liveness
363
+ // used to be checked ahead of it, on the assumption that the cutting process dies right after `--cut`,
364
+ // so a live owner over a handed-off record could only be a second parent racing in. That assumption
365
+ // fails twice: a `backlogrun` cut from an interactive session never ends its process, and a lane child
366
+ // cut before the gate can be woken again by a background task's notification — and in both the live
367
+ // owner *is* the session that cut, so liveness-first answered `busy` forever and no successor could
368
+ // ever take over. Reading the hand-off first hands the record to exactly one successor regardless of
369
+ // whether the cutting process is still alive, and it is safe because a hand-off requires the explicit
370
+ // `--cut` flag a crash never reaches, so the cross-run inheritance joshuafolkken/kit#1722 removes still
371
+ // cannot arise: a retyped command over a crashed record has no hand-off to match. Uniqueness is
372
+ // `adopt_carry`'s — it spends `is_handed_off` and rewrites the owner, so the *second* would-be
373
+ // successor reads a record no longer handed off, owned by a live foreign process, and is answered
374
+ // `busy`. Then: a live foreign owner over a record no cut handed off is refused, a different invocation
375
+ // is named as such, and what is left — the same command retyped over a record no cut handed off — is
376
+ // `standing`, which is the one answer that used to read `resumed`.
377
+ function classify_claim(carry: RunCarry, request: CarryClaimRequest): CarryClaim {
378
+ if (is_handed_off_to(carry, request.invocation)) return 'resume'
379
+
380
+ if (is_foreign_live_owner(carry, request.owner)) return 'busy'
381
+
382
+ if (carry.invocation !== request.invocation) return 'mismatch'
383
+
384
+ return request.is_adoption ? 'resume' : 'standing'
385
+ }
386
+
387
+ // **A budget count is refused unless this session is the record's live owner**
388
+ // (joshuafolkken/kit#1935). Two records reach here that are not this session's to advance: one the
389
+ // cutting session handed off but no successor has adopted yet — `is_handed_off` still set, so a stray
390
+ // count from the cutting session would spend the hand-off back to `false` and strand the successor —
391
+ // and one a successor has already adopted, now owned by a live foreign process, whose budget is that
392
+ // successor's. Both keep joshuafolkken/kit#1722's single writer: only the owner advances the counters.
393
+ // The hand-off is read first because a cut does not change the owner, so the cutting session is still
394
+ // its *own* owner between the cut and the adoption, and the foreign check would let it through.
395
+ function is_count_refused(carry: RunCarry, owner: CarryOwner): boolean {
396
+ return carry.is_handed_off === true || is_foreign_live_owner(carry, owner)
397
+ }
398
+
399
+ // Whether the invocation has already taken its maximum cuts (joshuafolkken/kit#2346). Read by the CLI
400
+ // before a `--cut` count so a run that has begun to churn is refused another cut rather than paying a
401
+ // cold preamble the accumulation it sheds no longer covers.
402
+ function is_at_cut_cap(carry: RunCarry): boolean {
403
+ return carry.cuts >= MAX_CUTS
404
+ }
405
+
406
+ function end_carry(target: string): void {
407
+ stamp_file.remove_stamp(target)
408
+ }
409
+
410
+ // Whether the read record marks its retrospective as already run (joshuafolkken/kit#2328). A read with
411
+ // no record — `none` or `unreadable` — is not a run whose retrospective has run, so it answers `false`;
412
+ // `run:step` reads it to decide whether the stop position still owes a retrospective.
413
+ function retrospective_done_of(read: CarryRead): boolean {
414
+ if (read.kind !== 'carried' && read.kind !== 'expired') return false
415
+
416
+ return read.carry.retrospective === true
417
+ }
418
+
419
+ // **What the resumed session has to be told, computed rather than stored.** A stored remainder would
420
+ // be a second copy of a subtraction the record already determines, free to disagree with it; computed
421
+ // here, `--json` answers the successor's one question — which issues are left, in the order they were
422
+ // declared — so nothing downstream has to subtract two lists by hand. An invocation that named no
423
+ // issues answers `undefined`, which `JSON.stringify` drops: a budget-only `backlogrun` record is
424
+ // unchanged by this.
425
+ function remaining_of(carry: RunCarry | undefined): ReadonlyArray<number> | undefined {
426
+ if (carry === undefined) return undefined
427
+
428
+ const declared = run_invocation.issue_numbers(carry.invocation)
429
+
430
+ if (declared === undefined) return undefined
431
+
432
+ const done = carry.done ?? []
433
+
434
+ return declared.filter((issue) => !done.includes(issue))
435
+ }
436
+
437
+ // The finished issues are named rather than counted, because the reader of a `busy` or `standing`
438
+ // message about a named-issue run has to know which ones are already merged before deciding anything.
439
+ function done_note(carry: RunCarry): string {
440
+ const done = carry.done ?? []
441
+
442
+ return done.length === 0 ? '' : `, issues ${done.join(', ')} done`
443
+ }
444
+
445
+ function describe_carry(carry: RunCarry): string {
446
+ return `${carry.invocation} started ${carry.started_at}; ${String(carry.merged)} merged, ${String(carry.filed)} filed, ${String(carry.failures)} failed in a row, ${String(carry.outages)} outage(s) in a row, ${String(carry.cuts)} cut(s) crossed${done_note(carry)}`
447
+ }
448
+
449
+ function expired_message(carry: RunCarry): string {
450
+ return `The ${String(CARRY_MAX_AGE_HOURS)}-hour whole-run bound is spent: ${describe_carry(carry)}. Clear it with \`${END_COMMAND}\`.`
451
+ }
452
+
453
+ // A record left standing by a run that never reached `--end`. Naming both invocations is the point:
454
+ // the reader has to see that the budget in the way belongs to something else before deciding whether
455
+ // that run is over.
456
+ function mismatch_message(carry: RunCarry, invocation: string): string {
457
+ return `A different invocation is carried here — ${describe_carry(carry)}. This one is \`${invocation}\`. End the standing record with \`${END_COMMAND}\` once you know its run is over, then begin again.`
458
+ }
459
+
460
+ // The owner process is still running, so this budget is being spent by something else right now. The
461
+ // message says so rather than offering `--resume`: adopting a live run's record is the two-parents
462
+ // case, not a recovery.
463
+ function busy_message(carry: RunCarry): string {
464
+ return `A live run holds this budget — ${describe_carry(carry)}, owner pid ${String(carry.owner_pid)} still running. Nothing was established. Wait for that run, or end its record with \`${END_COMMAND}\` once you know it is over.`
465
+ }
466
+
467
+ // The record's owner is gone and no cut handed it off — the crashed run, and the same command
468
+ // retyped over it. Both ways out are named, because which one is right is the reader's to say and
469
+ // not this command's to guess.
470
+ // **`--owner "$PPID"` is part of the command it prints, not an optional extra.** An adoption made
471
+ // without it leaves the record declaring no owner, and from then on every second parent reads it as
472
+ // not provably live and is answered `standing` rather than `busy` — the ownership defense degrading
473
+ // silently through the very message that recommends the command.
474
+ function standing_message(carry: RunCarry): string {
475
+ return `A run record is standing here that no cut handed off — ${describe_carry(carry)}. Nothing was established. Carry that budget with \`${RESUME_COMMAND} "${carry.invocation}" ${OWNER_ARGUMENT}\`, or discard it with \`${END_COMMAND}\` and begin again.`
476
+ }
477
+
478
+ // The count refusal reads differently by cause: a record awaiting its successor, or one a successor
479
+ // already holds. Both say nothing was counted, so a loop that believed it was advancing a budget stops
480
+ // rather than keeping its own tally over a record it does not own (joshuafolkken/kit#1935).
481
+ function count_refused_message(carry: RunCarry): string {
482
+ if (carry.is_handed_off === true) {
483
+ return `This budget was handed off at a cut and is waiting for its successor — ${describe_carry(carry)}. Nothing was counted; the cutting session must not advance a handed-off budget.`
484
+ }
485
+
486
+ return `A live run owns this budget — ${describe_carry(carry)}, owner pid ${String(carry.owner_pid)} still running. Nothing was counted; only its owner advances the budget.`
487
+ }
488
+
489
+ // The exclusive create lost: another process established the record between this one's read and its
490
+ // write. That is `busy` by definition, and it is said without re-reading a record this caller does
491
+ // not own.
492
+ function lost_message(): string {
493
+ return `Another process established a run record here first, so nothing was established. Read it with \`${READ_COMMAND}\`.`
494
+ }
495
+
496
+ // A `--resume` against a repository with nothing carried. The reader asked to adopt a budget that is
497
+ // not there, so beginning one silently would be this command inventing the answer it exists to give.
498
+ function nothing_to_resume_message(): string {
499
+ return `Nothing is carried here, so there is no budget to resume. Begin one with \`pnpm josh run:carry --begin "<invocation>"\`.`
500
+ }
501
+
502
+ function unreadable_message(): string {
503
+ return `A run record is here but could not be read; clear it with \`${END_COMMAND}\` once you know no run is using it.`
504
+ }
505
+
506
+ function unknown_message(): string {
507
+ return 'This repository’s git directory could not be read, so no run record was established.'
508
+ }
509
+
510
+ const run_carry = {
511
+ CARRY_MAX_AGE_HOURS,
512
+ CARRY_MAX_AGE_MS,
513
+ END_COMMAND,
514
+ MAX_CUTS,
515
+ NO_OWNER,
516
+ RESUME_COMMAND,
517
+ adopt_carry,
518
+ apply_change: run_carry_change.apply_change,
519
+ begin_carry,
520
+ busy_message,
521
+ carry_path,
522
+ classify,
523
+ classify_claim,
524
+ count_refused_message,
525
+ is_at_cut_cap,
526
+ describe_carry,
527
+ end_carry,
528
+ expired_message,
529
+ mismatch_message,
530
+ fresh_carry,
531
+ is_count_refused,
532
+ is_expired,
533
+ is_foreign_live_owner,
534
+ is_owner_live,
535
+ lost_message,
536
+ nothing_to_resume_message,
537
+ owner_of,
538
+ parse_carry,
539
+ read_carry,
540
+ remaining_of,
541
+ replace_carry,
542
+ repository_directory,
543
+ retrospective_done_of,
544
+ standing_message,
545
+ unknown_message,
546
+ unreadable_message,
547
+ }
548
+
549
+ export type { CarryChange, CarryClaim, CarryClaimRequest, CarryOwner, CarryRead, RunCarry }
550
+ export { run_carry }