@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,126 @@
1
+ import { time_shell } from '#scripts/time-runtime/time-shell'
2
+ import { shell_segments } from './shell-segments'
3
+
4
+ // The rule delivered at the call that pipes a verification command (joshuafolkken/kit#1556).
5
+ //
6
+ // **A pipeline exits with its last command's status.** `pnpm josh gate 2>&1 | tail -40` therefore
7
+ // answers success on a gate that printed `✗ verification gate failed`, and the failure that was
8
+ // caught was caught by a child reading the output rather than by anything the shell reported. The
9
+ // defect is not in `josh gate`, which returns non-zero correctly — it is in how the call is written,
10
+ // and a call is composed fresh every turn.
11
+ //
12
+ // **Delivered rather than written down, and the count is what decided that.** A survey of every
13
+ // document, prompt and skill in this repository found exactly one piped verification example, and it
14
+ // was the repository's own explanation of this bug — so there were no examples to rewrite, and the
15
+ // pipe is invented each time rather than copied. The other candidate, a calling convention, had
16
+ // already been rejected in writing by `scripts/time/time-reported-failure.ts`: a convention is obeyed
17
+ // or it is not. `prompts/collaboration-workflow/output-bounds.md` is the single source for the rule.
18
+ //
19
+ // It lives beside the enumeration rather than inside it because `delivered-rules.ts` is the list —
20
+ // one row per rule — and a row's predicate and refusal text are that rule's own.
21
+
22
+ // The josh subcommands whose result means pass or fail — the whole reach of the rule, and no more.
23
+ // **The read-only answers are absent deliberately.** `latest:scope`, `review:level`,
24
+ // `review:brief` and `issue:state` print an answer rather than a verdict, and `git log | head` or
25
+ // `gh issue list | head` are not josh calls at all — narrowing a listing is the ordinary way to read
26
+ // one. A trigger wide enough to reach those would refuse on the commonest shape in the transcript,
27
+ // and the enumeration's own rule is that a hook firing on the wrong turn is worse than no hook.
28
+ //
29
+ // **Two more kinds are out, and for reasons rather than by omission.** `pre-commit-type-check` and
30
+ // `pre-push-unit` are run by lefthook rather than typed by anyone, so no call of theirs is ever
31
+ // composed here; and `e2e:retry-check` *reports* whether the preview server crashed rather than
32
+ // passing or failing on it, which puts it with the answers above.
33
+ //
34
+ // **`eval` is in, even though its verdict is the last line rather than the exit code.** Piping it to
35
+ // `tail -1` does keep that line — and throws away the scenario rows the same rule requires next, since
36
+ // a `blocked` verdict has to be attributed before it blocks a merge and a red scenario may predate the
37
+ // change. The Issue that filed this rule names `eval` for that reason.
38
+ const VERIFICATION_COMMANDS: ReadonlySet<string> = new Set([
39
+ 'check',
40
+ 'cspell',
41
+ 'cspell:dot',
42
+ 'eval',
43
+ 'gate',
44
+ 'lint',
45
+ 'lint:eslint',
46
+ 'lint:prettier',
47
+ 'lint:related',
48
+ 'overrides',
49
+ 'ranges',
50
+ 'test',
51
+ 'test:e2e',
52
+ 'test:related',
53
+ 'test:unit',
54
+ ])
55
+
56
+ // **The canonical name of each check, and both spellings still match**: `pnpm josh ga | tail` masks a
57
+ // gate exactly as the long spelling does, and since joshuafolkken/kit#1789 the alias is expanded where
58
+ // the command is read rather than by widening this set with every alias standing for one of its names
59
+ // (joshuafolkken/kit#1643 for the reading). The suite names `pnpm josh ga` for that reason: an
60
+ // expansion that regressed would show up here rather than as a guard that quietly stopped firing.
61
+ function is_verification_command(segment: string): boolean {
62
+ return shell_segments.is_josh_command(segment, VERIFICATION_COMMANDS)
63
+ }
64
+
65
+ // A pipeline reports its last command's status, so a check in any earlier segment has its verdict
66
+ // thrown away. `time_shell.discarded_commands` is what decides which segments those are — the shell
67
+ // reading is one rule kept in one place, not a second parser written here. It also decides the two
68
+ // forms this rule stands down on: a pipeline under `set -o pipefail`, which carries the check's
69
+ // status, and a command chain quoted inside a body, which is text rather than a call.
70
+ function is_masked_verification(command: string): boolean {
71
+ return time_shell.discarded_commands(command).some((segment) => is_verification_command(segment))
72
+ }
73
+
74
+ // The masking, the two ways out of it and the boundary, in the shape a refusal can carry. **The way
75
+ // out travels with the refusal rather than being named**, because a delivery saying only "do not pipe
76
+ // it" leaves the caller with the same long output and no sanctioned way to read it, which is what put
77
+ // the pipe there in the first place.
78
+ const PIPED_VERIFICATION_REASON =
79
+ "⛔ piped verification: a pipeline exits with its last command's status, so `pnpm josh gate | " +
80
+ 'tail` reports success on a gate that failed, and the verdict is discarded before anything reads ' +
81
+ 'it. Run the check without the pipe — josh prints its verdict line last, so the harness output cap ' +
82
+ 'keeps it even when the middle is elided. Where the output genuinely has to be narrowed, redirect ' +
83
+ 'it to a file and read ranges from that file, or prefix `set -o pipefail` so the pipeline carries ' +
84
+ "the check's status. Read the printed verdict either way, never the exit code alone. Read-only " +
85
+ 'listings are untouched — this fires only on a command whose result means pass or fail. The rule ' +
86
+ 'is in `prompts/collaboration-workflow/output-bounds.md`. Reissue this call with no pipe — it ' +
87
+ 'fires once per run and cannot repeat on the call in hand.'
88
+
89
+ // Every command position on the line: the chain cut `shell_segments` makes, each piece of a pipeline
90
+ // inside it taken on its own.
91
+ //
92
+ // **The quoted spans are blanked first, exactly as `time_shell.discarded_commands` blanks them.** A
93
+ // command chain quoted inside a body is text rather than a call, and this repository's issue bodies
94
+ // quote them constantly — without the blanking the two halves disagree, and
95
+ // `gh issue comment 1 --body "… | pnpm josh gate | …"` reads as a check whose verdict survived.
96
+ function command_pieces(command: string): Array<string> {
97
+ return shell_segments
98
+ .segments_of(time_shell.unquoted(command))
99
+ .flatMap((segment) => segment.split('|'))
100
+ .map((piece) => piece.trim())
101
+ }
102
+
103
+ // **The occasion this rule governs: a check whose result means pass or fail, run at all**
104
+ // (joshuafolkken/kit#1643). The trigger fires only on the masked spelling, so a run that never piped
105
+ // one would drop out of the reading entirely and the rate would be taken over runs that masked at
106
+ // least once.
107
+ function runs_verification(command: string): boolean {
108
+ return command_pieces(command).some((piece) => is_verification_command(piece))
109
+ }
110
+
111
+ // **Keeping the rule is running that check with its verdict intact** — no pipe, the last position in
112
+ // one, or `set -o pipefail` in front. Judged over the whole command, so a line that masks one check
113
+ // while running another unmasked is not credited for the half it got right.
114
+ function keeps_verdict_intact(command: string): boolean {
115
+ return runs_verification(command) && !is_masked_verification(command)
116
+ }
117
+
118
+ const piped_verification = {
119
+ PIPED_VERIFICATION_REASON,
120
+ VERIFICATION_COMMANDS,
121
+ is_masked_verification,
122
+ keeps_verdict_intact,
123
+ runs_verification,
124
+ }
125
+
126
+ export { piped_verification }
@@ -0,0 +1,125 @@
1
+ import { time_shell } from '#scripts/time-runtime/time-shell'
2
+ import { bash_triggers } from './bash-triggers'
3
+
4
+ // The trigger and the delivered text behind the `poll-loop` row of `delivered-rules.ts`
5
+ // (joshuafolkken/kit#2371). The hand-written wait loop a lane child improvises over a backgrounded
6
+ // command's output file.
7
+ //
8
+ // **The gap `early-heartbeat` left, on purpose.** joshuafolkken/kit#1570's rule refuses a bare
9
+ // `sleep` — a clock timer arming a progress report — and it stands down the moment it sees a loop
10
+ // keyword (`early-heartbeat.ts`'s `LOOP_KEYWORD`), because a loop that ends on a condition is waiting
11
+ // on a thing rather than on a clock. This is that thing: a `while`/`until` loop that sleeps between
12
+ // probes of a command's output file. It never appeared in the heartbeat reading, and it is the larger
13
+ // half of the waste — six lanes lost about 45 minutes, 13% of their wall clock, to it.
14
+ //
15
+ // **The loop does not know when the command finished.** A regex over the output file that never
16
+ // matches waits to the harness block limit; one that matches a mid-run line exits too early. Either
17
+ // way the command's *exit* is not what ends the wait, and each pass spends a full-context round trip.
18
+ // A command backgrounded with `run_in_background` re-invokes the run when it exits — the completion
19
+ // notification is what ends the wait on the task itself, which is the mechanism this row hands back,
20
+ // the same reading joshuafolkken/kit#1510 took for the foreground push (`run-tail.ts`).
21
+ //
22
+ // **It fires on every occurrence**, for the reason `git-force.ts` does: a poll loop wastes the same
23
+ // round trips each time it is armed, so refused-once-and-free-after would put every loop but the first
24
+ // back on the run's self-restraint — the thing that let these loops through in the first place.
25
+
26
+ // A `while` or `until` header, in either spelling a poll loop reaches for. The trailing whitespace is
27
+ // what separates the keyword from a path that merely begins with it (`until.txt`); a `for` loop is out
28
+ // by omission — it iterates a fixed list rather than probing a state.
29
+ const LOOP_KEYWORD = /\b(?:while|until)\s/u
30
+ // A `sleep` command with any argument — the pause between probes that makes a loop a poll rather than
31
+ // a stream reader. Read anywhere in the line rather than at a command position, because the loop body
32
+ // puts it behind a `do` keyword (`; do sleep 30; done`), which no separator precedes. The argument is
33
+ // matched as any non-space rather than a digit, so a variable duration (`sleep "$INTERVAL"`) is caught
34
+ // as a literal one is — a poll with a configurable interval is still a poll (joshuafolkken/kit#2371,
35
+ // review round 1).
36
+ const SLEEP_COMMAND = /\bsleep\s+\S/u
37
+ // **A loop with no `sleep` is still a poll — a worse one** (joshuafolkken/kit#2421). A lane child ran
38
+ // `until [ -f /tmp/gate-done ]; do if ! kill -0 %1 …; then break; fi; done` for hours: a busy-wait
39
+ // that spun a core on a marker nobody wrote, and slipped through because the rule required the
40
+ // `sleep`. Two headers make a loop a poll with or without one. An `until` header waits for a state to
41
+ // appear by definition — the keyword has no stream-reading or counting use. A `while` header whose
42
+ // condition *probes* a state — a file test, a process probe, a quiet `grep` — is the same wait
43
+ // spelled negatively. A `while` that counts or reads (`while [ "$i" -lt 5 ]`, `while read`) is not.
44
+ // Both are read at a command position only — the start of the line, after a separator, or after a
45
+ // keyword that opens a command list — because without `sleep` there is nothing else to tell a loop
46
+ // header from the word in an argument: `git log --until yesterday` is not a loop (review round 1).
47
+ const COMMAND_POSITION = String.raw`(?:^|[;&|({\n]|\b(?:do|then|else)\s)\s*`
48
+ const UNTIL_HEADER = new RegExp(String.raw`${COMMAND_POSITION}until\s`, 'u')
49
+ const WHILE_HEADER = String.raw`${COMMAND_POSITION}while\s+(?:!\s*)?`
50
+ const PROBE_HEADERS: ReadonlyArray<RegExp> = [
51
+ String.raw`\[\[?\s+(?:!\s*)?-[defs]\s`,
52
+ String.raw`test\s+(?:!\s*)?-[defs]\s`,
53
+ String.raw`(?:kill\s+-0|pgrep)\b`,
54
+ String.raw`grep\s+-[A-Za-z]*q`,
55
+ ].map((probe) => new RegExp(`${WHILE_HEADER}${probe}`, 'u'))
56
+
57
+ function is_state_wait(plain: string): boolean {
58
+ return UNTIL_HEADER.test(plain) || PROBE_HEADERS.some((header) => header.test(plain))
59
+ }
60
+
61
+ // **A `while read … done < file` is a stream reader, not a poll**, even when its body sleeps to
62
+ // throttle processing (joshuafolkken/kit#2371, review round 1). Its condition consumes input rather
63
+ // than probing for a state — a poll never reads its condition, it *tests* it (grep, wc, a file check)
64
+ // — so the completion notification this rule points to has nothing to do with it. A `while read`
65
+ // header is therefore always a stream reader; a line that also carried a separate `until` poll would
66
+ // go un-refused, which fails safe (under-refusal) and is contrived enough not to warrant the added
67
+ // regex the attempt to catch it needed (joshuafolkken/kit#2371, review round 2).
68
+ const STREAM_READER = /\bwhile\s+read\b/u
69
+
70
+ function is_stream_reader(plain: string): boolean {
71
+ return STREAM_READER.test(plain)
72
+ }
73
+
74
+ // **Quoted spans are blanked first, and here that is load-bearing rather than tidy.** This
75
+ // repository's Issue bodies and commit messages quote these very loops constantly — this Issue's own
76
+ // body does — so without the blanking `gh issue comment <N> --body "… until grep …; do sleep …; done"`
77
+ // would read as the poll loop it only describes. `time_shell.unquoted` is the one removal shared with
78
+ // every other trigger, so two readers of one command cannot disagree about a quoting form.
79
+ function is_poll_loop(command: string): boolean {
80
+ const plain = time_shell.unquoted(command)
81
+
82
+ if (is_stream_reader(plain)) return false
83
+ if (is_state_wait(plain)) return true
84
+
85
+ return LOOP_KEYWORD.test(plain) && SLEEP_COMMAND.test(plain)
86
+ }
87
+
88
+ // The instruction in the shape a refusal can carry: what the loop is about to cost, why the command's
89
+ // exit is the thing to wait on, and the one route that delivers that exit. The measurement is named
90
+ // because it is what makes the rule believable — six lanes, about 45 minutes, 13% of their wall clock.
91
+ const POLL_LOOP_REASON =
92
+ "⛔ output poll loop: this hand-writes a `while`/`until` wait loop over a command's output, a " +
93
+ 'marker file or a process — with a `sleep` or, worse, without one — and the loop does not know ' +
94
+ 'when the command finished. A regex that never matches waits to ' +
95
+ 'the harness block limit; one that matches a mid-run line exits too early — either way the ' +
96
+ 'command exit is not what ends the wait, and each pass spends a full-context round trip ' +
97
+ '(joshuafolkken/kit#2371 measured about 45 minutes, 13% of six lanes, lost to exactly this). Do ' +
98
+ 'not poll the output file. A command known to take minutes — `pnpm josh gate`, `pnpm josh ' +
99
+ 'followup`, `pnpm josh format` — is started detached from the first with `run_in_background` set, ' +
100
+ 'and the harness re-invokes you when it exits: its completion notification is what ends the wait, ' +
101
+ 'on the task exit rather than a regex or the block limit. So issue the long command in the ' +
102
+ 'background and end the turn — do not arm a loop; the wake-up brings you back. To glance at ' +
103
+ 'interim output, `Read` the output file once, never in a sleep loop. If you are waiting on CI, ' +
104
+ '`pnpm josh followup` waits on it for you. The procedure is ' +
105
+ '`.claude/skills/workflow-commands/background-commands.md`, "A command that can take minutes is ' +
106
+ 'issued in the background". **This rule fires on every occurrence, not once per run.**'
107
+
108
+ // The row itself, so `delivered-rules.ts` spreads one entry. `decide` returns true so it refuses every
109
+ // occurrence; it declares no `keeps` — waiting on the task exit is the *absence* of a loop, not a
110
+ // call, so the row is reported unmeasured rather than scored on an act that does not exist
111
+ // (`git-force.ts`).
112
+ const ROW = {
113
+ id: 'poll-loop',
114
+ is_trigger: bash_triggers.on_bash_command(is_poll_loop),
115
+ reason: POLL_LOOP_REASON,
116
+ decide: (): boolean => true,
117
+ }
118
+
119
+ const poll_loop = {
120
+ POLL_LOOP_REASON,
121
+ ROW,
122
+ is_poll_loop,
123
+ }
124
+
125
+ export { poll_loop }
@@ -0,0 +1,207 @@
1
+ import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
2
+ import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
3
+ import { lane_child_marker } from '#scripts/lane/lane-child-marker'
4
+ import { lane_paths } from '#scripts/lane/lane-paths'
5
+ import { run_cut, type RunCut } from '#scripts/run/run-cut'
6
+ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
7
+ import { bash_triggers } from './bash-triggers'
8
+ import { shell_segments } from './shell-segments'
9
+
10
+ // The pre-gate cut, delivered at the call it binds on (joshuafolkken/kit#1864).
11
+ //
12
+ // **The mechanism was there and nothing called it.** joshuafolkken/kit#1839 built the cut and
13
+ // joshuafolkken/kit#1850 measured the result: across six lane children — #1853, #1849, #1855, #1854,
14
+ // #1856 and #1847 — the cut was taken **0 times**. Four of the six issued the *entry* check
15
+ // `pnpm josh run:cut --resume <N>` and were answered `fresh`; not one issued `pnpm josh run:cut <N>`,
16
+ // the call that actually cuts. The procedure was read three to five times per run and remained one
17
+ // step of prose in the middle of it, so joshuafolkken/kit#1839's fourth acceptance condition — the
18
+ // drop in context per request — could not be judged at all.
19
+ //
20
+ // **This is the third time prose lost to a refusal.** joshuafolkken/kit#1344 measured three
21
+ // consecutive runs in which resident text about batching moved the number not at all, and
22
+ // joshuafolkken/kit#1460 measured the same for the investigation threshold; in both, a `PreToolUse`
23
+ // refusal was what finally moved it. A step a run is free to skip is a step that gets skipped under
24
+ // time pressure, and `run:hold` — the one boundary step that never gets missed — is the one that
25
+ // refuses.
26
+
27
+ const GATE_COMMANDS: ReadonlySet<string> = new Set(['gate'])
28
+ const CUT_COMMANDS: ReadonlySet<string> = new Set(['run:cut'])
29
+ // The three spellings that ask about a cut rather than take one: the fresh process's entry check, the
30
+ // teardown, and the record read. **Excluding them is the whole point** — four of the six measured
31
+ // children issued `--resume` and went straight on to the gate, so a predicate that counted any
32
+ // `run:cut` would have been silent on exactly the runs this rule exists for.
33
+ const CUT_MODE_FLAG = /(?:^|\s)--(?:resume|end|json)(?:[=\s]|$)/u
34
+ // **The one entry call the resumed half never makes** (joshuafolkken/kit#1867).
35
+ // `.claude/skills/workflow-commands/pre-gate-cut.md` sends a `fresh` verdict on to "claim the hold,
36
+ // ask the session boundary, read the issue, implement", and tells a `resume` verdict to "skip the
37
+ // title, the plan, the fresh hold claim and the implementation". So the hold claim is what a run made
38
+ // on the near side of the pre-gate boundary carries and the process the cut produced does not.
39
+ const HOLD_COMMANDS: ReadonlySet<string> = new Set(['run:hold'])
40
+ // **A release is not a claim, and the subcommand name alone cannot tell the two apart.** `run:release`
41
+ // is registered as the hold script under `--release`, so a segment naming the hold command may be
42
+ // either — the same asymmetry `CUT_MODE_FLAG` exists for one command up. Reading a release as a claim
43
+ // would put the resumed session, which releases at its merge, straight back into the denominator this
44
+ // predicate exists to keep it out of.
45
+ const HOLD_MODE_FLAG = /(?:^|\s)--release(?:[=\s]|$)/u
46
+
47
+ // **Alias-expanded rather than matched as text**, so `pnpm josh ga` and `pnpm josh rct` are the same
48
+ // calls as their canonical spellings. Segment-wise for the reason every other row here is: one shell
49
+ // line carries several commands, and a name quoted inside a body is not the command being invoked.
50
+ //
51
+ // **One reading of that question rather than one per name set.** Four predicates here differ only in
52
+ // which subcommands they look for and which mode flag turns the call into a different one, and a
53
+ // second copy of the walk is the clone `CLAUDE.md` prohibits — the copy nobody corrected would be the
54
+ // one that stops seeing an alias. `mode_flag` is optional because two of the four ask about the
55
+ // subcommand whatever mode it was invoked in.
56
+ function invokes_josh(command: string, names: ReadonlySet<string>, mode_flag?: RegExp): boolean {
57
+ return shell_segments
58
+ .segments_of(command)
59
+ .some(
60
+ (segment) =>
61
+ shell_segments.is_josh_command(segment, names) && mode_flag?.test(segment) !== true,
62
+ )
63
+ }
64
+
65
+ function runs_the_gate(command: string): boolean {
66
+ return invokes_josh(command, GATE_COMMANDS)
67
+ }
68
+
69
+ function takes_the_cut(command: string): boolean {
70
+ return invokes_josh(command, CUT_COMMANDS, CUT_MODE_FLAG)
71
+ }
72
+
73
+ // Whether this command claims the working tree, in either spelling and in neither release spelling.
74
+ function claims_the_hold(command: string): boolean {
75
+ return invokes_josh(command, HOLD_COMMANDS, HOLD_MODE_FLAG)
76
+ }
77
+
78
+ // **One half of the occasion, never the whole of it** (joshuafolkken/kit#1867). Taken alone this
79
+ // predicate enrols both processes of one obedient lane child: the cut relaunches a second session
80
+ // which issues this same entry check byte for byte and can never take a cut of its own, so the row
81
+ // read at half its true rate. `delivered-rules.ts` pairs it with `claims_the_hold`, which only the
82
+ // near half of the boundary makes.
83
+ //
84
+ // **The occasion the rule governs, as far as a transcript can answer it.** A lane child issues
85
+ // `pnpm josh run:cut --resume <N>` at its entry whatever it goes on to do, so a run that reaches for
86
+ // the command in any spelling is one this rule could have bound on. Whether a checkout *is* a lane is
87
+ // read from the working directory and appears nowhere in a transcript, so it cannot be the
88
+ // denominator — and taking the gate as the occasion instead would enrol every ordinary non-lane run,
89
+ // where the rule can never be kept, and `pnpm josh rule:value` would read the row low by
90
+ // construction. joshuafolkken/kit#1643 names exactly that failure.
91
+ function asks_about_the_cut(command: string): boolean {
92
+ return invokes_josh(command, CUT_COMMANDS)
93
+ }
94
+
95
+ // What the trigger has to know about the world, passed in so the decision itself is testable without
96
+ // a lane on disk and without a git call. `marked_issue` is the dispatch mark read from the
97
+ // environment — the fact that makes the human-or-child question mechanical rather than the model's to
98
+ // judge (joshuafolkken/kit#1904).
99
+ interface LaneCutState {
100
+ directory: string
101
+ carried: (now?: Date) => RunCut | undefined
102
+ marked_issue: string | undefined
103
+ // **The recent-window context verdict, read lazily** (joshuafolkken/kit#2312). It is a thunk, like
104
+ // `carried`, so `current_state` builds the object without pricing a session — the read happens only
105
+ // after the command and lane checks pass, off the handful of calls that actually run a lane's gate.
106
+ context_verdict: () => CostVerdict
107
+ }
108
+
109
+ function current_state(): LaneCutState {
110
+ return {
111
+ directory: process.cwd(),
112
+ carried: run_cut.carried_cut_sync,
113
+ marked_issue: lane_child_marker.marked_issue(),
114
+ context_verdict: cost_cli.session_verdict,
115
+ }
116
+ }
117
+
118
+ // **The dispatch mark is what tells a child apart from a person, and it counts only for this lane.**
119
+ // A person working in the lane carries no mark, so the rule stays silent for them — the
120
+ // human-or-child call is read from the environment, never left to the model. A mark that leaked in
121
+ // from the parent session names some other issue, so requiring it to equal this lane's issue reads
122
+ // that leak as a person too (joshuafolkken/kit#1904).
123
+ //
124
+ // **The resumed process must also stay silent, and the cut record is what says so.** After a cut,
125
+ // `adopt_cut` leaves the record in place with `is_handed_off: false`, so a carried record naming this
126
+ // issue means the process asking is the one the cut already produced. Without this half the rule
127
+ // would fire on the fresh process too — refusing a gate call on a run that had kept the rule
128
+ // perfectly, which `prompts/collaboration-workflow/rule-delivery.md` calls worse than no hook at all.
129
+ function uncut_lane_issue(state: LaneCutState): string | undefined {
130
+ const issue = lane_paths.lane_issue_of(state.directory)
131
+
132
+ if (issue === undefined) return undefined
133
+
134
+ if (state.marked_issue !== issue) return undefined
135
+
136
+ return state.carried()?.issue === issue ? undefined : issue
137
+ }
138
+
139
+ // **The cut is taken only when the recent-window context is worth its resume** (joshuafolkken/kit#2312).
140
+ // Below the shared `CONTEXT_CUT_THRESHOLD` a short lane has no accumulation a cut would drop, so the
141
+ // gate runs uncut rather than paying for a relaunch; an unmeasurable session keeps the old
142
+ // unconditional cut as the safety net joshuafolkken/kit#1933 relies on. The verdict is
143
+ // `cost_cli.session_verdict`'s, the same statistic and threshold `run:cut` and the implementation-phase
144
+ // cut read, so the guard and the command can never disagree about whether a cut was due.
145
+ function warrants_the_cut(verdict: CostVerdict): boolean {
146
+ return verdict !== cost_verdict.UNDER_VERDICT
147
+ }
148
+
149
+ // **The command test comes first and the world is consulted second.** This predicate is asked of
150
+ // every `Bash` call in the run, so the cheap string match is what keeps a git call — and, now, a
151
+ // transcript read — off all of them but the handful that actually run the gate.
152
+ function is_uncut_gate(command: string, state: LaneCutState = current_state()): boolean {
153
+ if (!runs_the_gate(command) || uncut_lane_issue(state) === undefined) return false
154
+
155
+ return warrants_the_cut(state.context_verdict())
156
+ }
157
+
158
+ // The instruction in the shape a refusal can carry: what the cut is for, what each verdict means, and
159
+ // the reissue sentence every delivery needs. **The verdicts are spelled out rather than pointed at**,
160
+ // because `cut` is the only one that ends the turn and a run told merely to "take the cut" would have
161
+ // to go and read which of the other five leave it holding the run — the same reason the WIP cap's
162
+ // delivery names its three interrupt tests instead of naming the file they live in.
163
+ const PRE_GATE_CUT_REASON =
164
+ '⛔ pre-gate cut: this checkout is a lane dispatched for this issue and the gate is the boundary to ' +
165
+ 'cut at, so take the cut before running it. `pnpm josh run:cut <N>` ends this process and ' +
166
+ 'relaunches a fresh one that resumes from the gate, dropping the thinking built up while ' +
167
+ 'implementing rather than carrying it on every later request — joshuafolkken/kit#1839 measured ' +
168
+ '176K of 204K output riding across that boundary, and joshuafolkken/kit#1864 measured the step ' +
169
+ 'itself firing 0 times in 6 lane children while it was carried as prose. Issue ' +
170
+ '`pnpm josh run:cut <N>` now, and read the verdict: on `cut`, **end the turn immediately** — the ' +
171
+ 'fresh process owns the run from there and must not be waited for; on `not-a-lane`, `unready`, ' +
172
+ '`busy`, `failed` or `unknown`, this process carries the run on and the gate is simply the next ' +
173
+ 'call. Never relaunch a second process after `busy`. This fired because the dispatch mark names ' +
174
+ 'this lane; a person working here carries no mark and sees no refusal, so there is no ' +
175
+ 'human-or-child judgement left to make. The procedure is ' +
176
+ '`.claude/skills/workflow-commands/pre-gate-cut.md`. Reissue the gate once the cut has answered — ' +
177
+ 'this fires once per run, so it cannot repeat on the call in hand.'
178
+
179
+ // **The pre-gate cut is two acts, one call apart** (joshuafolkken/kit#2034), so its `rule:value`
180
+ // denominator is only the runs that reached the boundary: a run that issues the cut's entry check and,
181
+ // somewhere in the same run, claimed the working-tree hold — the near half of the boundary a fresh
182
+ // process never makes. Read only by the offline measurement, never the live delivery path. Moved here
183
+ // from `delivered-rules.ts` so the pre-gate row lives with its rule, as `implementation-cut.ts`'s does
184
+ // (joshuafolkken/kit#2346).
185
+ function reaches_the_pre_gate_boundary(
186
+ call: GuardedCall,
187
+ _turn: ReadonlyArray<GuardedCall>,
188
+ run: ReadonlyArray<GuardedCall>,
189
+ ): boolean {
190
+ if (!bash_triggers.on_bash_command(asks_about_the_cut)(call)) return false
191
+
192
+ return run.some((issued) => bash_triggers.on_bash_command(claims_the_hold)(issued))
193
+ }
194
+
195
+ const pre_gate_cut = {
196
+ PRE_GATE_CUT_REASON,
197
+ asks_about_the_cut,
198
+ claims_the_hold,
199
+ is_uncut_gate,
200
+ reaches_the_pre_gate_boundary,
201
+ runs_the_gate,
202
+ takes_the_cut,
203
+ uncut_lane_issue,
204
+ }
205
+
206
+ export type { LaneCutState }
207
+ export { pre_gate_cut }
@@ -0,0 +1,106 @@
1
+ import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
2
+ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
3
+ import { time_shell } from '#scripts/time-runtime/time-shell'
4
+ import { tail_commands } from './tail-commands'
5
+
6
+ // The stand-down that keeps the `issue-comments` rule from refusing a body read the run has already
7
+ // earned (joshuafolkken/kit#1905). The rule exists so a run reads an Issue's comments before building
8
+ // on its body — but a run that already read them, and later reads the body again (a post-merge state
9
+ // check, a re-read), was refused a second time for a read it had already made. **The delivery path
10
+ // sees only the raw transcript tail** — `delivered-rules.ts` names the reason the run's own calls are
11
+ // not handed to it — so the earlier read is recovered by parsing that tail here, the same way
12
+ // `time-batch-guard.ts` parses it, rather than from a call array that does not reach delivery.
13
+ //
14
+ // **It reads comments in the josh spelling too.** `pnpm josh issue:read <N>` prints the body and every
15
+ // comment in one call, so a run that opened an Issue with it has read the comments as surely as one
16
+ // that passed `--comments` — and that spelling is the one the workflow itself reaches for, so leaving
17
+ // it out would refuse the reader that obeyed the rule most directly.
18
+
19
+ // The path segment `…/issues/<N>` and `…/issues/<N>/comments` both name the Issue in the same capture.
20
+ const ISSUE_PATH_NUMBER = /issues\/(\d+)/gu
21
+ // The positional after `gh issue view`, past any flags that precede it.
22
+ const ISSUE_VIEW_NUMBER = /\bissue\s+view\s+(?:-{1,2}\S+\s+)*(\d+)/u
23
+ // The run of numbers `pnpm josh issue:read` takes as its positional arguments.
24
+ const ISSUE_READ_ARGUMENTS = /\bissue:read\b([\s\d]*)/u
25
+ const A_NUMBER = /^\d+$/u
26
+
27
+ // A command that prints an Issue's comments: the comments endpoint, `gh issue view … --comments`, or
28
+ // the josh command that reads body and comments together.
29
+ const COMMENTS_ENDPOINT = /issues\/\d+\/comments\b/u
30
+ const VIEW_WITH_COMMENTS = /\bissue\s+view\b[^\n]*--comments\b/u
31
+ const ISSUE_READ_COMMAND = /\bissue:read\b/u
32
+
33
+ function add_issue_read_numbers(command: string, numbers: Set<number>): void {
34
+ const match = ISSUE_READ_ARGUMENTS.exec(command)
35
+
36
+ if (match === null) return
37
+
38
+ const tokens = (match[1] ?? '').split(/\s+/u)
39
+
40
+ for (const token of tokens) {
41
+ if (A_NUMBER.test(token)) numbers.add(Number(token))
42
+ }
43
+ }
44
+
45
+ // Every Issue number a command names, across the three read spellings the refusal covers.
46
+ function issue_numbers_of(command: string): Set<number> {
47
+ const numbers = new Set<number>()
48
+
49
+ for (const match of command.matchAll(ISSUE_PATH_NUMBER)) numbers.add(Number(match[1]))
50
+
51
+ const view = ISSUE_VIEW_NUMBER.exec(command)
52
+
53
+ if (view !== null) numbers.add(Number(view[1]))
54
+
55
+ add_issue_read_numbers(command, numbers)
56
+
57
+ return numbers
58
+ }
59
+
60
+ function fetches_comments(command: string): boolean {
61
+ return (
62
+ COMMENTS_ENDPOINT.test(command) ||
63
+ VIEW_WITH_COMMENTS.test(command) ||
64
+ ISSUE_READ_COMMAND.test(command)
65
+ )
66
+ }
67
+
68
+ function reads_target_comments(command: string, target: Set<number>): boolean {
69
+ if (!fetches_comments(command)) return false
70
+
71
+ for (const number of issue_numbers_of(command)) {
72
+ if (target.has(number)) return true
73
+ }
74
+
75
+ return false
76
+ }
77
+
78
+ // **Whether the run has already read the comments of the Issue this body read targets.** The tail is
79
+ // scanned for a prior read of the same number, so a body read that names no Issue — and a run with no
80
+ // earlier comment read — both answer false and are refused exactly as before.
81
+ function already_read_comments_for(tail: string, command: string): boolean {
82
+ const target = issue_numbers_of(command)
83
+
84
+ if (target.size === 0) return false
85
+
86
+ return tail_commands
87
+ .prior_bash_commands(tail)
88
+ .some((prior) => reads_target_comments(prior, target))
89
+ }
90
+
91
+ // The `already_satisfied` predicate wired onto the issue-comments row of `delivered-rules.ts`: this
92
+ // call's command against the tail, once the same tool-name gate `on_bash_command` applies has passed.
93
+ function already_read_for_call(tail: string, call: GuardedCall): boolean {
94
+ if (call.name !== cost_blocks.BASH_TOOL) return false
95
+
96
+ return already_read_comments_for(tail, time_shell.bash_command(call.input))
97
+ }
98
+
99
+ const prior_comment_read = {
100
+ already_read_comments_for,
101
+ already_read_for_call,
102
+ fetches_comments,
103
+ issue_numbers_of,
104
+ }
105
+
106
+ export { prior_comment_read }
@@ -0,0 +1,56 @@
1
+ import { bash_triggers } from './bash-triggers'
2
+
3
+ // The trigger and the delivered text behind the `raw-field-body` row of `delivered-rules.ts`
4
+ // (joshuafolkken/kit#2304). Its sibling `shell-body` refuses a body a run passed *inline* so the shell
5
+ // evaluates it; this one refuses a body a run passed *by path with the wrong flag*, so the path is
6
+ // posted as text.
7
+ //
8
+ // **`gh api` has two spellings of "pass this by path" and one silently breaks.** `-F` / `--field`
9
+ // reads the file when the value opens with `@`; `-f` / `--raw-field` sends the value verbatim, so
10
+ // `-f body=@<path>` posts the literal string `@<path>`. The two differ by a single character, `gh`
11
+ // exits 0 and returns a comment URL either way, and the break is invisible until a person reads the
12
+ // issue — joshuafolkken/kit#2304 recorded two park comments (`@/tmp/2294-park.md` and a decision
13
+ // record) lost exactly this way, which was the only place the reason for a stopped child was written.
14
+ //
15
+ // **The trigger is the raw-field flag with an `@`-opening body, not `@` alone.** `-F` / `--field
16
+ // body=@<path>` is the spelling the rule *asks* for and stays silent; a `-f body="plain text"` with no
17
+ // `@` is not a file reference and stays silent; a `-f 'labels[]=needs-decision'` names no body and
18
+ // stays silent. Only a raw field whose `body=` value begins with `@` is the misfire.
19
+ //
20
+ // **It fires on every occurrence** (`git-force.ts`): each misfire posts a broken comment of its own,
21
+ // so refused-once-and-free-after would let the second one through.
22
+
23
+ // A raw field flag — `-f` or `--raw-field`, never the file-reading `-F` / `--field` — carrying a
24
+ // `body=` value that opens with `@`. The flag is anchored to a word boundary so the `-f` inside
25
+ // `--field` is not mistaken for the short raw flag, and the opening quote may sit on either side of
26
+ // `body=` (`-f "body=@…"` and `-f body="@…"` are one command to the shell), matching the shapes
27
+ // `shell-body-trigger.ts` reads.
28
+ const RAW_FIELD_BODY_AT = /(?:^|\s)(?:-f|--raw-field)[\s=]+['"]?body=['"]?@/u
29
+
30
+ function posts_at_path_literally(command: string): boolean {
31
+ return RAW_FIELD_BODY_AT.test(command)
32
+ }
33
+
34
+ // The instruction in the shape a refusal can carry: what the flag is doing, the one-character trap
35
+ // that hides it, and the single command that cannot take the wrong flag. The damage is named because
36
+ // it reads as unbelievable — the call succeeds and returns a URL while posting the path as text.
37
+ const RAW_FIELD_BODY_REASON =
38
+ '⛔ literal @path body: this passes `body=@<path>` to `gh api` with a raw field flag (`-f` / ' +
39
+ '`--raw-field`), which sends the value verbatim — the string `@<path>` is posted as the comment, ' +
40
+ 'not the file it points at. `-F` / `--field` is the flag that reads the file, and the two spellings ' +
41
+ 'differ by one character while `gh` exits 0 and returns a comment URL either way, so the break is ' +
42
+ 'invisible until a person reads the issue (joshuafolkken/kit#2304 lost two park comments this way). ' +
43
+ 'Post an issue or PR comment with `pnpm josh issue:comment <N> --body-file <path>` — the one ' +
44
+ 'spelling, which cannot take the wrong flag. The rule and the safe forms are in ' +
45
+ '`prompts/collaboration-workflow/shell-body.md`. This rule fires on every occurrence, not once per run.'
46
+
47
+ const ROW = {
48
+ id: 'raw-field-body',
49
+ is_trigger: bash_triggers.on_bash_command(posts_at_path_literally),
50
+ reason: RAW_FIELD_BODY_REASON,
51
+ decide: (): boolean => true,
52
+ }
53
+
54
+ const raw_field_body = { RAW_FIELD_BODY_REASON, ROW, posts_at_path_literally }
55
+
56
+ export { raw_field_body }