@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,242 @@
1
+ // The bare-`#N` predicate behind the `issue-citation` row of the stop guard (joshuafolkken/kit#2121),
2
+ // and the printing-side formatter that keeps a bare `#N` out of session-facing output in the first
3
+ // place (joshuafolkken/kit#2329).
4
+ //
5
+ // **Session-facing output cites an Issue as a number-link, never a bare `#N`.** `CLAUDE.md` and
6
+ // `prompts/collaboration-workflow/issue-citation.md` require `[#<N>](https://github.com/<owner>/<repo>/issues/<N>) — <short summary>`
7
+ // in what the person reads: a bare `#123` is not clickable and does not say which repository's Issue
8
+ // it is. The stop guard reads `last_assistant_message` — the turn's session-facing text — and this
9
+ // predicate answers whether a bare number slipped into it.
10
+ //
11
+ // **It blocks the stop, so a false positive costs a wasted turn** (joshuafolkken/kit#2247). The nudge
12
+ // now reaches the model rather than the person, so the detection is tightened to what is genuinely a
13
+ // bare citation: a `#N` inside a fenced code block, inside an inline-code span, on a quote line, or
14
+ // right after `PR` / `pull request` is not a citation slip and is skipped. The scan is line-based so
15
+ // each exclusion is decided from the one line the mention sits on.
16
+ //
17
+ // **`linkify` runs that same scan the other way** (joshuafolkken/kit#2329): a command whose stdout a
18
+ // run copies into its reply passes the text through it, and every bare `#N` the predicate would flag
19
+ // is rewritten to `[#N](url)` — which the predicate then reads as linked, so the material that fed the
20
+ // duplicate reply is fixed where it is printed rather than scolded after it reaches the screen. The
21
+ // same exclusions hold, so a `#N` in a fenced example or an already-linked reference is left untouched.
22
+
23
+ import { issue_cite } from '#scripts/issue/issue-cite'
24
+
25
+ // An Issue number: `#` and its digits. One quantifier, no backtracking — the `#N` alone locates the
26
+ // mention, and any `owner/repo` prefix is read off the surrounding text (`repo_prefix`) rather than
27
+ // folded into the pattern, so the scan never carries two variable-length segments (sonar super-linear).
28
+ const ISSUE_NUMBER = /#\d+/gu
29
+ // The characters that bound an `owner/repo` prefix: whitespace, another `#`, and the brackets a
30
+ // citation or prose wraps a reference in. Tested one character at a time by the prefix scan, so that
31
+ // scan stays linear.
32
+ const REFERENCE_BOUNDARY = /[\s#()[\]<>|]/u
33
+ // A well-formed `owner/repo`: exactly one slash between two non-empty segments — the same shape
34
+ // `issue:cite`'s parser accepts. A path-like run (`src/lib`, `a/b/c`) is not one, so it is not emitted
35
+ // as a prefix that would make the suggested `issue:cite` call refuse the very reference it names.
36
+ const OWNER_REPO = /^[^\s/#]+\/[^\s/#]+$/u
37
+ // A markdown link, with its text captured as group 1: `[text](target)`. Each class excludes *both*
38
+ // of its delimiters — no `[`/`]` in the text, no `(`/`)` in the target — so neither star is ambiguous
39
+ // against a nested bracket and there is nothing to backtrack.
40
+ const MARKDOWN_LINK = /\[([^[\]]*)\]\([^()]*\)/gu
41
+ // A fenced-code delimiter line: three or more backticks or tildes after optional indentation — both
42
+ // delimiters CommonMark allows. Toggling on each one brackets the fenced block, so a `closes #N` shown
43
+ // in a `gh api` example never reads as a slip whichever fence the reply drew it with.
44
+ const FENCE_MARKER = /^\s*(?:`{3,}|~{3,})/u
45
+ // A quote line: a `>` after optional indentation. An Issue body quoted back carries its own `#N`, and
46
+ // a quote is not the run's own citation.
47
+ const QUOTE_LINE = /^\s*>/u
48
+ // A `#N` written as a PR reference: `PR` or `pull request` (word-bounded) right before it. `#N` alone
49
+ // cannot tell an Issue from a PR, but the preceding word can, and reading it needs no network round
50
+ // trip inside the hook.
51
+ const PR_PREFIX = /\b(?:pr|pull request)\s*$/iu
52
+ // Two backticks bracket one inline-code span, so an odd count of them before an index means the index
53
+ // sits inside a span.
54
+ const BACKTICK_PAIR = 2
55
+
56
+ // Whether a markdown link's *text* span — between the `[` and the `]`, never its `(target)` — covers
57
+ // `index`. A `#N` inside the text is the approved `[#N](url)` citation; one in the target is not
58
+ // reachable, since an issues URL carries no `#N`.
59
+ function text_span_covers(link: RegExpMatchArray, index: number): boolean {
60
+ const start = (link.index ?? 0) + 1
61
+ const end = start + (link[1] ?? '').length
62
+
63
+ return index >= start && index < end
64
+ }
65
+
66
+ // The line is searched for a link whose text span covers this index, so `see [#12](url) and #34`
67
+ // reads the first as linked and the second as bare. The scan is line-based (`is_bare_at` passes one
68
+ // line), so a link and the `#N` it wraps must sit on the same line — which they always do.
69
+ function is_linked_at(line: string, index: number): boolean {
70
+ for (const link of line.matchAll(MARKDOWN_LINK)) {
71
+ if (text_span_covers(link, index)) return true
72
+ }
73
+
74
+ return false
75
+ }
76
+
77
+ // **The message text alone, never a GitHub-bound artifact.** An Issue body or comment is passed to
78
+ // `gh` as a `Bash` argument, not spoken in `last_assistant_message`, so those never reach here — which
79
+ // is exactly the "silent on GitHub-bound artifacts" behavior the issue asks for, obtained by what the
80
+ // stop guard reads rather than by a second exclusion here.
81
+ //
82
+ // The `owner/repo` written immediately before a `#N`, or '' when the mention is bare — the run of
83
+ // non-boundary characters ending at the `#`, kept only when it holds a `/`. Read backwards a
84
+ // character at a time so a repository name of any length costs its own length and no more.
85
+ function repo_prefix(message: string, hash_index: number): string {
86
+ let start = hash_index
87
+ while (start > 0 && !REFERENCE_BOUNDARY.test(message.charAt(start - 1))) start -= 1
88
+
89
+ const token = message.slice(start, hash_index)
90
+
91
+ return OWNER_REPO.test(token) ? token : ''
92
+ }
93
+
94
+ // Whether the index sits inside an inline-code span: an odd number of backticks precede it on the line.
95
+ function is_inline_code_at(line: string, index: number): boolean {
96
+ const backticks = line.slice(0, index).split('`').length - 1
97
+
98
+ return backticks % BACKTICK_PAIR === 1
99
+ }
100
+
101
+ // Whether the `#N` at this index on the line is a real bare citation rather than an excluded mention —
102
+ // a linked reference, an inline-code span, or a PR reference read off the word before it.
103
+ function is_bare_at(line: string, index: number): boolean {
104
+ if (is_linked_at(line, index) || is_inline_code_at(line, index)) return false
105
+
106
+ return !PR_PREFIX.test(line.slice(0, index))
107
+ }
108
+
109
+ // One bare reference and where it sits on its line: the `#N` text, the index its `#` starts at, and
110
+ // the `owner/repo` prefix that precedes it (or ''). Shared so the collector and `linkify` read the
111
+ // line the same way and cannot drift about what counts as bare.
112
+ interface LineReference {
113
+ index: number
114
+ prefix: string
115
+ text: string
116
+ }
117
+
118
+ // The bare references on one line, in order — the excluded mentions (linked, inline-code, PR) already
119
+ // dropped by `is_bare_at`, so a caller acts on citations alone.
120
+ function line_references(line: string): ReadonlyArray<LineReference> {
121
+ const references: Array<LineReference> = []
122
+
123
+ for (const match of line.matchAll(ISSUE_NUMBER)) {
124
+ const { index } = match
125
+
126
+ if (is_bare_at(line, index)) {
127
+ references.push({ index, prefix: repo_prefix(line, index), text: match[0] })
128
+ }
129
+ }
130
+
131
+ return references
132
+ }
133
+
134
+ // The bare references on one non-excluded line are appended in order, each carrying its `owner/repo`
135
+ // prefix when it had one.
136
+ function collect_line_references(line: string, found: Array<string>): void {
137
+ for (const reference of line_references(line)) found.push(`${reference.prefix}${reference.text}`)
138
+ }
139
+
140
+ // The message lines that sit outside every fenced-code block, with the fence delimiter lines
141
+ // themselves dropped: toggling on each delimiter brackets the block, so a `#N` shown in an example is
142
+ // never scanned.
143
+ function lines_outside_fences(message: string): ReadonlyArray<string> {
144
+ const lines: Array<string> = []
145
+ let is_in_fence = false
146
+
147
+ for (const line of message.split('\n')) {
148
+ if (FENCE_MARKER.test(line)) is_in_fence = !is_in_fence
149
+ else if (!is_in_fence) lines.push(line)
150
+ }
151
+
152
+ return lines
153
+ }
154
+
155
+ // The run's own prose: the lines outside every fenced-code block and off every quote line. Shared with
156
+ // the filing-offer row of the stop guard (joshuafolkken/kit#2422), which asks the same "is this the
157
+ // run speaking, not an example or a quote" question of the same reply.
158
+ function prose_lines(message: string): ReadonlyArray<string> {
159
+ return lines_outside_fences(message).filter((line) => !QUOTE_LINE.test(line))
160
+ }
161
+
162
+ // The bare references in the message, in the order they appear and de-duplicated: the block reason
163
+ // names them and turns them into `issue:cite` arguments, so a reference cited twice is not nudged
164
+ // about twice. Fenced-code blocks and quote lines are skipped, so a `#N` shown in an example or quoted
165
+ // from an Issue body is not read as the run's own citation.
166
+ function bare_references(message: string): ReadonlyArray<string> {
167
+ const found: Array<string> = []
168
+
169
+ for (const line of prose_lines(message)) collect_line_references(line, found)
170
+
171
+ return [...new Set(found)]
172
+ }
173
+
174
+ function has_bare_reference(message: string): boolean {
175
+ return bare_references(message).length > 0
176
+ }
177
+
178
+ // The token `issue:cite` takes for one reference: a qualified `owner/repo#N` is passed as-is, a bare
179
+ // `#N` loses its `#` so the command reads `issue:cite 123` rather than `issue:cite #123`.
180
+ function cite_argument(reference: string): string {
181
+ return reference.startsWith('#') ? reference.slice(1) : reference
182
+ }
183
+
184
+ function cite_arguments(references: ReadonlyArray<string>): ReadonlyArray<string> {
185
+ return references.map((reference) => cite_argument(reference))
186
+ }
187
+
188
+ // One bare reference rewritten as a number-link: `[#N](url)` for a same-repo mention, or
189
+ // `[owner/repo#N](url)` for a qualified one — the label is the reference exactly as it was written, so
190
+ // the reader sees the number they would have, now clickable. The URL is `issue-cite`'s own assembly,
191
+ // reused rather than restated so the two agree on the shape of a link.
192
+ function reference_link(reference: LineReference, default_slug: string): string {
193
+ const slug = reference.prefix === '' ? default_slug : reference.prefix
194
+ const number = reference.text.slice(1)
195
+
196
+ return `[${reference.prefix}${reference.text}](${issue_cite.issue_url(slug, number)})`
197
+ }
198
+
199
+ // One eligible line with every bare reference rewritten, left to right: a reference spans its
200
+ // `owner/repo` prefix through its `#N`, so the slice before it ends where the prefix begins and the
201
+ // cursor resumes after the `#N`.
202
+ function linkify_line(line: string, slug: string): string {
203
+ let result = ''
204
+ let cursor = 0
205
+
206
+ for (const reference of line_references(line)) {
207
+ const start = reference.index - reference.prefix.length
208
+
209
+ result += line.slice(cursor, start) + reference_link(reference, slug)
210
+ cursor = reference.index + reference.text.length
211
+ }
212
+
213
+ return result + line.slice(cursor)
214
+ }
215
+
216
+ // A line is rewritten only outside a fenced block and off a quote line, and never the fence delimiter
217
+ // itself — the same three exclusions `bare_references` reads, so what `linkify` leaves bare is exactly
218
+ // what the predicate would not have flagged.
219
+ function rewrite_line(line: string, slug: string, is_in_fence: boolean): string {
220
+ if (is_in_fence || FENCE_MARKER.test(line) || QUOTE_LINE.test(line)) return line
221
+
222
+ return linkify_line(line, slug)
223
+ }
224
+
225
+ // Session-facing text with every bare `#N` rewritten to a number-link against `slug` (`owner/repo`),
226
+ // so a command's stdout a run copies into its reply carries links rather than the bare references that
227
+ // fed the duplicate reply. Fence state is carried across lines, since a fenced block spans them.
228
+ function linkify(message: string, slug: string): string {
229
+ const out: Array<string> = []
230
+ let is_in_fence = false
231
+
232
+ for (const line of message.split('\n')) {
233
+ if (FENCE_MARKER.test(line)) is_in_fence = !is_in_fence
234
+ out.push(rewrite_line(line, slug, is_in_fence))
235
+ }
236
+
237
+ return out.join('\n')
238
+ }
239
+
240
+ const issue_citation = { bare_references, cite_arguments, has_bare_reference, linkify, prose_lines }
241
+
242
+ export { issue_citation }
@@ -0,0 +1,73 @@
1
+ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
2
+ import { bash_triggers } from './bash-triggers'
3
+ import { filing_cap } from './filing-cap'
4
+ import { shell_segments } from './shell-segments'
5
+ import { tail_commands } from './tail-commands'
6
+
7
+ // The trigger and the delivered text behind the `issue-fold` row of `delivered-rules.ts`
8
+ // (joshuafolkken/kit#2213).
9
+ //
10
+ // **A second filing in one run with no `pnpm josh issue:fold` in front of it, refused at that second
11
+ // filing.** A run that files several findings from one session should first ask whether they fold
12
+ // into one Issue — the filing-time counterpart to the split assessment. The **first** filing asks
13
+ // nothing: there is nothing yet to fold it with, which is why the rule stands down when no earlier
14
+ // filing is on the tail. From the second on the run holds two or more findings and the fold question
15
+ // binds. The input is mechanical — has the run filed before, did it fold — so it is a delivered rule
16
+ // rather than resident prose.
17
+ //
18
+ // **It is `issue-scout`'s shape, not `filing-cap`'s.** Once per run with an `already_satisfied`
19
+ // stand-down read off the tail: a filing with no prior filing is stood down (nothing to fold), and so
20
+ // is one the run has already folded. The refusal hands over the command rather than asking the run to
21
+ // "fold first". **No new predicate**: the filing trigger is `bash_triggers.is_issue_filing`, and the
22
+ // prior-filing count is `filing_cap.prior_filing_count`, both reused verbatim.
23
+
24
+ // `pnpm josh issue:fold`, the one act the rule asks for. The alias `isf` is expanded where the command
25
+ // is read, so the canonical name matches both spellings.
26
+ const FOLD_NAMES: ReadonlySet<string> = new Set(['issue:fold'])
27
+
28
+ // Keeping the rule: a call that runs the fold. Segment-wise, so a spelling quoted inside a filing's
29
+ // own body is not read as the fold that filing skipped.
30
+ function runs_the_fold(command: string): boolean {
31
+ return shell_segments
32
+ .segments_of(command)
33
+ .some((segment) => shell_segments.is_josh_command(segment, FOLD_NAMES))
34
+ }
35
+
36
+ // The `already_satisfied` stand-down. Two runs ask nothing new: one with no earlier filing — the first
37
+ // filing has nothing to fold with — and one that has already folded. Only the second-or-later filing
38
+ // of an unfolded run is left for the delivery. `prior_filing_count` counts real filings, excluding a
39
+ // guard-refused one, exactly as `filing-cap` reads it (no clones).
40
+ function already_folded(tail: string, _call: GuardedCall): boolean {
41
+ if (filing_cap.prior_filing_count(tail) === 0) return true
42
+
43
+ return tail_commands.prior_bash_commands(tail).some((command) => runs_the_fold(command))
44
+ }
45
+
46
+ // The instruction in the shape a refusal can carry: what the call skipped, the criterion it reuses,
47
+ // and the command that fixes it. The default is named because it is the half that makes the rule
48
+ // believable — fold is what a session's several findings do unless the size clearly forbids it.
49
+ const ISSUE_FOLD_REASON =
50
+ '⛔ issue fold: this run has filed an Issue before and is filing another with no `pnpm josh ' +
51
+ 'issue:fold` between them. Several findings from one session fold into one Issue by default — the ' +
52
+ 'filing-time counterpart to the split assessment, whose two questions it reuses: are the findings ' +
53
+ 'separable, and does the whole clearly exceed one verification gate (the size half is ' +
54
+ '`split:assess`, called not recomputed). Reissue after folding: `pnpm josh issue:fold "<title>" ' +
55
+ '"<title>" …` — `fold` means file one Issue covering them, `separate` means file them apart ' +
56
+ '(separable findings whose combined size clears the split guide), and the default is `fold`. Add ' +
57
+ '`--not-separable` when they are really one deliverable. The procedure is ' +
58
+ '`.claude/skills/workflow-commands/split-assessment.md` → "The question". It fires once per run ' +
59
+ 'and cannot repeat on the call in hand.'
60
+
61
+ // The enumeration row itself, so `delivered-rules.ts` spreads one entry rather than restating the
62
+ // trigger and reason it already single-sources here. Once per run with the stand-down above.
63
+ const ROW = {
64
+ id: 'issue-fold',
65
+ is_trigger: bash_triggers.on_bash_command(bash_triggers.is_issue_filing),
66
+ reason: ISSUE_FOLD_REASON,
67
+ already_satisfied: already_folded,
68
+ keeps: bash_triggers.on_bash_command(runs_the_fold),
69
+ }
70
+
71
+ const issue_fold = { ISSUE_FOLD_REASON, ROW, already_folded, runs_the_fold }
72
+
73
+ export { issue_fold }
@@ -0,0 +1,64 @@
1
+ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
2
+ import { bash_triggers } from './bash-triggers'
3
+ import { shell_segments } from './shell-segments'
4
+ import { tail_commands } from './tail-commands'
5
+
6
+ // The trigger and the delivered text behind the `issue-scout` row of `delivered-rules.ts`
7
+ // (joshuafolkken/kit#2119).
8
+ //
9
+ // **A filing without `pnpm josh issue:scout` in front of it, refused at the filing itself.** §2e
10
+ // requires the scout before every `gh api … issues` call, and a duplicate is likeliest for the work
11
+ // that just finished — the one case self-restraint is least able to catch. The input is mechanical —
12
+ // did the run already run the scout — so it is a delivered rule rather than resident prose.
13
+ //
14
+ // **It is `issue-comments`'s shape, not the WIP cap's.** Like that row it is once per run with an
15
+ // `already_satisfied` stand-down read off the tail, and the refusal hands over the command rather than
16
+ // asking the run to "scout first" — a body-only read is refused so the reissue makes the comments
17
+ // present, and here a scout-less filing is refused so the reissue makes the scout present. **No new
18
+ // delivery path**: the trigger is `bash_triggers.is_issue_filing`, reused verbatim.
19
+
20
+ // `pnpm josh issue:scout`, the one act the rule asks for. The alias `isc` is expanded where the
21
+ // command is read, so the canonical name matches both spellings (joshuafolkken/kit#1789).
22
+ const SCOUT_NAMES: ReadonlySet<string> = new Set(['issue:scout'])
23
+
24
+ // Keeping the rule: a call that runs the scout. Segment-wise, so a spelling quoted inside a filing's
25
+ // own body is not read as the scout that filing skipped.
26
+ function runs_the_scout(command: string): boolean {
27
+ return shell_segments
28
+ .segments_of(command)
29
+ .some((segment) => shell_segments.is_josh_command(segment, SCOUT_NAMES))
30
+ }
31
+
32
+ // The `already_satisfied` stand-down: the run has already scouted, so this filing asks for nothing new.
33
+ // The tool-name gate the row's trigger applies has already passed, so `call` only marks the shape; the
34
+ // answer is entirely in the tail.
35
+ function already_scouted(tail: string, _call: GuardedCall): boolean {
36
+ return tail_commands.prior_bash_commands(tail).some((command) => runs_the_scout(command))
37
+ }
38
+
39
+ // The instruction in the shape a refusal can carry: what the call skipped, why it matters most here,
40
+ // and the command that fixes it. The duplicate risk is named because it is the half that makes the
41
+ // rule believable — the filing most likely to duplicate is the one about work that just finished.
42
+ const ISSUE_SCOUT_REASON =
43
+ '⛔ issue scout: this files an Issue with no `pnpm josh issue:scout` earlier in the run. A ' +
44
+ 'duplicate is likeliest for the work that just finished, which is exactly where self-restraint is ' +
45
+ 'weakest. Reissue after scouting: `pnpm josh issue:scout "<title>"` (add `--body "<one-line ' +
46
+ 'summary, citing #N where the work follows one>"` so the epic half can answer), then read its ' +
47
+ '`Duplicates:` — an **open** candidate covering the same work stops the run rather than filing a ' +
48
+ 'second Issue, and a `(closed)` one means the work is already done — before reissuing this filing. ' +
49
+ 'The procedure is `.claude/skills/workflow-commands/SKILL.md` → §2e. It fires once per run and ' +
50
+ 'cannot repeat on the call in hand.'
51
+
52
+ // The enumeration row itself, so `delivered-rules.ts` spreads one entry rather than restating the
53
+ // trigger and reason it already single-sources here. Once per run with the stand-down above.
54
+ const ROW = {
55
+ id: 'issue-scout',
56
+ is_trigger: bash_triggers.on_bash_command(bash_triggers.is_issue_filing),
57
+ reason: ISSUE_SCOUT_REASON,
58
+ already_satisfied: already_scouted,
59
+ keeps: bash_triggers.on_bash_command(runs_the_scout),
60
+ }
61
+
62
+ const issue_scout = { ISSUE_SCOUT_REASON, ROW, already_scouted, runs_the_scout }
63
+
64
+ export { issue_scout }
@@ -0,0 +1,80 @@
1
+ import { time_shell } from '#scripts/time-runtime/time-shell'
2
+ import { bash_triggers } from './bash-triggers'
3
+ import { shell_segments } from './shell-segments'
4
+
5
+ // The trigger and the delivered text behind the `josh-git-bare` row of `delivered-rules.ts`
6
+ // (joshuafolkken/kit#2297): a `pnpm josh git` issued without `-y` / `--yes`.
7
+ //
8
+ // **A bare `pnpm josh git` cannot succeed from an agent, and it wastes the time it takes to fail.** The
9
+ // command prompts to confirm the staging, and with no TTY the prompt falls to its cancel branch —
10
+ // `Checking unstaged files... Found` → `Operation cancelled.` — so the run throws the time away and then
11
+ // reissues with `-y` (about 31 seconds in one measured lane). The confirmation flag is what makes it the
12
+ // run's own unattended commit-push-PR step rather than a person's interactive invocation.
13
+ //
14
+ // **It is not `run-tail`.** That row governs a `pnpm josh git -y` push already carrying the flag, issued
15
+ // in the *foreground* rather than backgrounded; this one governs a push that carries *no* flag at all.
16
+ // The two triggers are disjoint by the flag — `run-tail` requires it, this refuses its absence — so no
17
+ // two rows claim one command, which `delivered-rules-bash.test.ts` pins.
18
+ //
19
+ // **The stop is one shell call, so the rule is delivered rather than resident**
20
+ // (`prompts/collaboration-workflow/rule-delivery.md`). It fires on every occurrence: a bare invocation
21
+ // wastes the same time every time it is issued, so refused-once-and-free-after would put the next one
22
+ // back on the run's self-restraint — the disposition `git-force.ts` takes for the same reason.
23
+
24
+ // The `josh git` subcommand, in canonical form. `shell_segments.is_josh_command` canonicalizes an alias
25
+ // (`g`) before the match, so `pnpm josh g` arrives as `git`.
26
+ const GIT_COMMAND: ReadonlySet<string> = new Set(['git'])
27
+
28
+ // The confirmation flags that make the invocation unattended. Either spelling is enough; the recovery
29
+ // form `pnpm josh git -y --skip-commit --skip-push` carries `-y` and so is not bare.
30
+ const CONFIRM_FLAGS: ReadonlySet<string> = new Set(['-y', '--yes'])
31
+
32
+ function has_confirm_flag(args: ReadonlyArray<string>): boolean {
33
+ return args.some((argument) => CONFIRM_FLAGS.has(argument))
34
+ }
35
+
36
+ // A segment that invokes `pnpm josh git` with no confirmation flag. The command test comes first, so the
37
+ // argument read runs only on a `josh git` segment. Segment-wise and alias-expanded for the reason every
38
+ // command predicate in this directory is: one shell line carries several commands, and a name quoted
39
+ // inside a body is not the command being invoked.
40
+ function is_bare_segment(segment: string): boolean {
41
+ if (!shell_segments.is_josh_command(segment, GIT_COMMAND)) return false
42
+
43
+ return !has_confirm_flag(time_shell.josh_arguments(segment))
44
+ }
45
+
46
+ function is_bare_josh_git(command: string): boolean {
47
+ return shell_segments.segments_of(command).some((segment) => is_bare_segment(segment))
48
+ }
49
+
50
+ // The instruction in the shape a refusal can carry: what the bare call does, why it fails, and the one
51
+ // form that works. Apostrophes are avoided so the single-quoted literal needs no escaping, as the
52
+ // sibling reasons do.
53
+ const JOSH_GIT_BARE_REASON =
54
+ '⛔ bare `pnpm josh git`: this prompts to confirm the staging, and with no TTY the prompt falls to ' +
55
+ 'its cancel branch — `Checking unstaged files... Found` then `Operation cancelled.` — so the call ' +
56
+ 'throws away the time it takes to fail (about 31 seconds in one measured lane) and you reissue it ' +
57
+ 'with `-y` anyway (joshuafolkken/kit#2297). Run it unattended from the start: ' +
58
+ '`pnpm josh git -y "<title> #<N>"`. The recovery form that opens the PR for a push that already ' +
59
+ 'landed is `pnpm josh git -y --skip-commit --skip-push`. This rule fires on every occurrence, not ' +
60
+ 'once per run.'
61
+
62
+ // The row itself, so `delivered-rules.ts` spreads one entry. `is_trigger` reads the input through
63
+ // `on_bash_command` — the `Bash` tool-name gate every command row shares — and `decide` returns true so
64
+ // it refuses every occurrence. It declares no `keeps`: the corrected call is `pnpm josh git -y`, which is
65
+ // `run-tail`'s push step and scored there, so this row is reported unmeasured rather than double-counting
66
+ // it (`git-force.ts`).
67
+ const ROW = {
68
+ id: 'josh-git-bare',
69
+ is_trigger: bash_triggers.on_bash_command(is_bare_josh_git),
70
+ reason: JOSH_GIT_BARE_REASON,
71
+ decide: (): boolean => true,
72
+ }
73
+
74
+ const josh_git_bare = {
75
+ JOSH_GIT_BARE_REASON,
76
+ ROW,
77
+ is_bare_josh_git,
78
+ }
79
+
80
+ export { josh_git_bare }
@@ -0,0 +1,96 @@
1
+ import { lane_child_marker } from '#scripts/lane/lane-child-marker'
2
+ import { bash_triggers } from './bash-triggers'
3
+ import { shell_segments } from './shell-segments'
4
+
5
+ // A dispatched lane child is stopped from running its parent's budget commands, and told the live
6
+ // carry record is its parent's rather than a competing run (joshuafolkken/kit#2267).
7
+ //
8
+ // **A child read its own parent as a competitor and refused to implement.** On 2026-09-21, inside
9
+ // `backlogrun #2252`, a lane launched for #2258 stopped before touching a line: the child ran
10
+ // `pnpm josh run:merge`, was answered `busy`, and read that as another session holding the run budget
11
+ // over the same Issue. It parked #2258 with `needs-decision` and exited. **The "other session" was the
12
+ // parent that launched it** — the parent holds the repository's one carry budget, and every lane
13
+ // shares the common git directory that budget is keyed on, so the live owner a lane child reads is
14
+ // always its parent. `run:merge` and `run:carry` are the parent's own budget/ownership commands; a
15
+ // child has no business running either, and the `busy` it gets back is never a competitor.
16
+ //
17
+ // **The judgement material already exists.** `JOSH_LANE_CHILD` (`lane-child-marker.ts`) is the same
18
+ // mechanical human-or-child fact the pre-gate cut and the interactive-ask refusal already read: a
19
+ // person working in a lane carries no mark and sees no refusal, and a mark naming a *different* issue
20
+ // leaked in from a parent session and is read as absent. The budget/ownership path reads it here so
21
+ // the parent's record is resolved as the child's own parent, not a conflict.
22
+ //
23
+ // **The stop is one shell call, so the rule is delivered rather than resident** — a lane child is
24
+ // always a `claude -p` process, so this leaves residency entirely
25
+ // (`prompts/collaboration-workflow/rule-delivery.md`). It fires on every occurrence, not once per run:
26
+ // a child must never run these commands, so the route is always "continue implementing", never a
27
+ // reissue — the disposition `git-force.ts` and `lane-interactive-ask.ts` take for the same
28
+ // "must never happen" reason.
29
+
30
+ // The parent backlogrun budget/ownership commands. A child never runs either: `run:carry` begins and
31
+ // advances the run budget the parent owns, and `run:merge` counts a returned child into it. Named in
32
+ // canonical form only — `shell_segments.is_josh_command` canonicalizes an alias (`rc`, `rmg`) before
33
+ // the match, so `pnpm josh rmg` arrives as `run:merge`.
34
+ const RUN_BUDGET_COMMANDS: ReadonlySet<string> = new Set(['run:merge', 'run:carry'])
35
+
36
+ // A segment that invokes one of the parent's budget commands. Segment-wise and alias-expanded for the
37
+ // reason every command predicate in this directory is: one shell line carries several commands, and a
38
+ // name quoted inside a body is not the command being invoked.
39
+ function invokes_budget_command(command: string): boolean {
40
+ return shell_segments
41
+ .segments_of(command)
42
+ .some((segment) => shell_segments.is_josh_command(segment, RUN_BUDGET_COMMANDS))
43
+ }
44
+
45
+ // **The command test comes first and the world is consulted second**, so the `is_child_of` read — the
46
+ // dispatch mark against this checkout's own issue — runs only on the handful of calls that invoke a
47
+ // budget command, not on every `Bash` call in the run. A person working in a lane carries no mark and
48
+ // sees no refusal, exactly as `lane-park.ts` and `lane-interactive-ask.ts` gate their own reads.
49
+ function is_carry_conflict(
50
+ command: string,
51
+ is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
52
+ ): boolean {
53
+ if (!invokes_budget_command(command)) return false
54
+
55
+ return is_lane_child
56
+ }
57
+
58
+ // The instruction in the shape a refusal can carry: what the child cannot do, why the record is not a
59
+ // conflict, and the mechanical branch to take instead — continue, never park or ask. **The procedure
60
+ // is named, not restated** — its single sources are `pre-gate-cut.md` and `backlogrun-progress.md` →
61
+ // "The hand-off", and a second copy here would be the clone `CLAUDE.md` prohibits. Apostrophes are
62
+ // avoided so the single-quoted literal needs no escaping, as the sibling reasons do.
63
+ const LANE_CARRY_CONFLICT_REASON =
64
+ '⛔ lane child carry conflict: this session is a dispatched lane child, and ' +
65
+ '`pnpm josh run:merge` / `pnpm josh run:carry` are the parent backlogrun budget commands — a child ' +
66
+ 'must never run them. The live carry record here belongs to the parent that launched this child, ' +
67
+ 'not to a competing run: the parent holds the one run budget for the repository, and every lane ' +
68
+ 'shares the common git directory it is keyed on, so a live owner a lane child reads is always its ' +
69
+ 'parent (joshuafolkken/kit#2267, measured 2026-09-21 in backlogrun #2252 — a child read run:merge ' +
70
+ '`busy` as a competitor and parked #2258 unimplemented). Do not run this command, and do not treat ' +
71
+ 'it as a conflict: no `needs-decision`, no `confirmation` Telegram, no question to a person — a ' +
72
+ 'dispatched child cannot ask, and there is nothing to decide. Continue implementing this Issue; the ' +
73
+ 'parent owns the budget and counts the outcome at the return. The procedure is ' +
74
+ '`.claude/skills/workflow-commands/pre-gate-cut.md` and `backlogrun-progress.md` → "The hand-off". ' +
75
+ 'This rule fires on every occurrence, not once per run.'
76
+
77
+ // The row itself, so `delivered-rules.ts` spreads one entry. `is_trigger` reads the input through
78
+ // `on_bash_command` — the `Bash` tool-name gate every command row shares — and `decide` returns true
79
+ // so it refuses every occurrence. It declares no `keeps`: continuing is the absence of a call, not a
80
+ // call, so the row is reported unmeasured rather than scored on an act that does not exist
81
+ // (`git-force.ts`).
82
+ const ROW = {
83
+ id: 'lane-carry-conflict',
84
+ is_trigger: bash_triggers.on_bash_command(is_carry_conflict),
85
+ reason: LANE_CARRY_CONFLICT_REASON,
86
+ decide: (): boolean => true,
87
+ }
88
+
89
+ const lane_carry_conflict = {
90
+ LANE_CARRY_CONFLICT_REASON,
91
+ ROW,
92
+ invokes_budget_command,
93
+ is_carry_conflict,
94
+ }
95
+
96
+ export { lane_carry_conflict }
@@ -0,0 +1,71 @@
1
+ import { interactive_ask } from '#scripts/agent/interactive-ask'
2
+ import { lane_child_marker } from '#scripts/lane/lane-child-marker'
3
+ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
4
+
5
+ // A dispatched lane child's interactive ask is refused and routed to the park procedure, delivered at
6
+ // the call it binds on (joshuafolkken/kit#2201).
7
+ //
8
+ // **This is joshuafolkken/kit#2034's rule, moved one tool-call earlier.** #2034 gave a lane child that
9
+ // stops for a decision the right instruction — park the question on the Issue before it notifies — but
10
+ // wired it to the `confirmation` notify. A child that reaches for `AskUserQuestion` never gets that
11
+ // far: the ask is refused by the harness, the turn ends there, and #2034's guard never fires. Measured
12
+ // on 2026-09-20 inside `backlogrun #2163 --only`: #2178's child hit a Tier B branch, called
13
+ // `AskUserQuestion`, was refused, and died with the question stranded in its exit record's
14
+ // `permission_denials`. So the trigger is the ask itself, not the stop that a routed child would have
15
+ // reached afterward.
16
+ //
17
+ // **A hook denial is guidance, where the harness's own denial is death.** The harness refuses an
18
+ // interactive ask in a headless session by ending the turn; this rule refuses the same call with a
19
+ // `PreToolUse` deny, which returns to the model with the park procedure — so the refusal becomes an
20
+ // instruction the child can act on rather than the end of its run. That is the same shape
21
+ // `prompts/collaboration-workflow/rule-delivery.md` names: a rule whose trigger is one tool call is
22
+ // delivered by a hook that refuses it and states the rule.
23
+ //
24
+ // **It fires on every occurrence, not once per run.** An interactive ask must never succeed in a lane
25
+ // child, so refused-once-and-free-after would put the second ask back on the harness's fatal denial —
26
+ // the disposition `git-force.ts` takes for the same "must never happen" reason. The child's route is
27
+ // always the park, never a reissue of the ask.
28
+ //
29
+ // **The world is consulted after the tool name, never on every call.** `is_child_of` reads the
30
+ // dispatch mark against this checkout's own issue; the tool-name test runs first, so a run that never
31
+ // asks pays nothing for it, and a person working in a lane carries no mark and sees no refusal.
32
+
33
+ function is_interactive_ask(
34
+ call: GuardedCall,
35
+ is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
36
+ ): boolean {
37
+ if (!interactive_ask.is_interactive_tool(call.name)) return false
38
+
39
+ return is_lane_child
40
+ }
41
+
42
+ // The instruction in the shape a refusal can carry: what the child cannot do, what to do instead, and
43
+ // the pointer to the procedure. **The park is named, not restated** — its single source is
44
+ // `backlogrun-park.md` → "park and continue", and a second copy here would be the clone `CLAUDE.md`
45
+ // prohibits. The one command is spelled so the child is not left to reconstruct it from a doc read.
46
+ const LANE_INTERACTIVE_ASK_REASON =
47
+ '⛔ lane child interactive ask: this session is a dispatched lane child and cannot ask a person, so ' +
48
+ 'this call is refused. Left to run it would end the turn with nothing on the Issue — the parent then ' +
49
+ 'finds an OPEN Issue with `in-progress` and no question (joshuafolkken/kit#2201; joshuafolkken/kit#2034 ' +
50
+ 'placed the same rule one tool-call too late). Do not ask: park the decision instead. Apply ' +
51
+ '`needs-decision` and post a comment carrying the question, the options and whether work was stashed — ' +
52
+ "`gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=needs-decision'` then " +
53
+ '`pnpm josh issue:comment <N> --body-file <path>` — then send the ' +
54
+ '`confirmation` Telegram and stop. The procedure is ' +
55
+ '`.claude/skills/workflow-commands/pre-gate-cut.md` → "A lane child records its park before it stops", ' +
56
+ 'and the park itself is `backlogrun-park.md` → "park and continue". This rule fires on every ' +
57
+ 'occurrence, not once per run.'
58
+
59
+ // The row itself, so `delivered-rules.ts` spreads one entry. `decide` returns true so it refuses every
60
+ // occurrence; it declares no `keeps` — not asking is the absence of a call, not a call, so the row is
61
+ // reported unmeasured rather than scored on an act that does not exist (`git-force.ts`).
62
+ const ROW = {
63
+ id: 'lane-interactive-ask',
64
+ is_trigger: is_interactive_ask,
65
+ reason: LANE_INTERACTIVE_ASK_REASON,
66
+ decide: (): boolean => true,
67
+ }
68
+
69
+ const lane_interactive_ask = { LANE_INTERACTIVE_ASK_REASON, ROW, is_interactive_ask }
70
+
71
+ export { lane_interactive_ask }