@joshuafolkken/kit 1.872.0 → 1.881.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 (256) hide show
  1. package/.github/workflows/publish.yml +39 -2
  2. package/README.md +3 -3
  3. package/dist/hooks/batch-guard.js +4 -4
  4. package/dist/hooks/{chunk-KABG6AEW.js → chunk-264QY6KS.js} +7 -0
  5. package/dist/hooks/{chunk-I4D3NVUD.js → chunk-36UE53LS.js} +2 -2
  6. package/dist/hooks/{chunk-WCYPBPJC.js → chunk-4OXFU3MK.js} +8 -8
  7. package/dist/hooks/{chunk-ABVEVV2M.js → chunk-6MQCXEEA.js} +1 -1
  8. package/dist/hooks/{chunk-46EEEHC3.js → chunk-FNFOLFFV.js} +1 -1
  9. package/dist/hooks/{chunk-5U5EZYG6.js → chunk-FRJKVSK3.js} +2 -2
  10. package/dist/hooks/{chunk-2RUPMGGV.js → chunk-PRDCNGA6.js} +4 -4
  11. package/dist/hooks/{chunk-WMN4TSVF.js → chunk-VGYSA2NT.js} +2 -2
  12. package/dist/hooks/{chunk-A5YJ3H7E.js → chunk-Y5OYCU2F.js} +3 -3
  13. package/dist/hooks/{chunk-4QHBNAI4.js → chunk-ZBK4XRAS.js} +3 -3
  14. package/dist/hooks/codex-hook-adapter.js +10 -10
  15. package/dist/hooks/duplicate-read-guard.js +5 -5
  16. package/dist/hooks/format-edited.js +2 -2
  17. package/dist/hooks/investigation-guard.js +5 -5
  18. package/dist/hooks/pretool-guard.js +9 -9
  19. package/dist/hooks/stop-guard.js +3 -3
  20. package/dist/josh.js +7 -0
  21. package/package.json +6 -2
  22. package/scripts/init/distributed-paths.ts +14 -11
  23. package/scripts/init/hook-command-bootstrap.ts +51 -0
  24. package/scripts/init/hook-command-rewrite.ts +9 -1
  25. package/scripts/init/init-logic.ts +2 -8
  26. package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +10 -0
  27. package/scripts/josh/josh-command-map.ts +1 -0
  28. package/scripts/josh/josh-commands-project.ts +6 -0
  29. package/scripts/registry-migration/migrate-logic.ts +229 -0
  30. package/scripts/registry-migration/migrate.ts +280 -0
  31. package/scripts/registry-migration/user-npmrc.ts +15 -0
  32. package/templates/workflows/ci.yml +6 -2
  33. package/dist/hooks/chunk-25JL6FMS.js +0 -4970
  34. package/dist/hooks/chunk-2ANGT3XM.js +0 -375
  35. package/dist/hooks/chunk-2EI5GBSW.js +0 -42
  36. package/dist/hooks/chunk-2OT5XE2N.js +0 -5014
  37. package/dist/hooks/chunk-2XIGZQMQ.js +0 -3299
  38. package/dist/hooks/chunk-33ELOKEV.js +0 -910
  39. package/dist/hooks/chunk-33YRTKM7.js +0 -230
  40. package/dist/hooks/chunk-36JQU5NN.js +0 -77
  41. package/dist/hooks/chunk-3EJBTWVS.js +0 -1769
  42. package/dist/hooks/chunk-3FK5SFAC.js +0 -432
  43. package/dist/hooks/chunk-3PWPYDD2.js +0 -240
  44. package/dist/hooks/chunk-3TQU7TDH.js +0 -375
  45. package/dist/hooks/chunk-3TVLSFZ6.js +0 -432
  46. package/dist/hooks/chunk-3VXYCB4E.js +0 -77
  47. package/dist/hooks/chunk-44M6JXGV.js +0 -3398
  48. package/dist/hooks/chunk-4A7UVP2P.js +0 -364
  49. package/dist/hooks/chunk-4LFQEZS4.js +0 -137
  50. package/dist/hooks/chunk-4OCX3V2T.js +0 -469
  51. package/dist/hooks/chunk-4OHA5DE7.js +0 -49
  52. package/dist/hooks/chunk-4PMDW3YD.js +0 -68
  53. package/dist/hooks/chunk-4SSB3FEE.js +0 -3273
  54. package/dist/hooks/chunk-5A2WQ2CQ.js +0 -5390
  55. package/dist/hooks/chunk-5EVA2JQB.js +0 -5390
  56. package/dist/hooks/chunk-5P7VF5VE.js +0 -3230
  57. package/dist/hooks/chunk-5QWJGGZP.js +0 -49
  58. package/dist/hooks/chunk-5VUUF3ZV.js +0 -240
  59. package/dist/hooks/chunk-5WA7UBT3.js +0 -374
  60. package/dist/hooks/chunk-6EBGRQ3Q.js +0 -301
  61. package/dist/hooks/chunk-6TVHWMD3.js +0 -432
  62. package/dist/hooks/chunk-6VAGLEMB.js +0 -68
  63. package/dist/hooks/chunk-75BTXKFJ.js +0 -3424
  64. package/dist/hooks/chunk-75RHN67S.js +0 -137
  65. package/dist/hooks/chunk-76KC3BDD.js +0 -3414
  66. package/dist/hooks/chunk-76SLS7CZ.js +0 -898
  67. package/dist/hooks/chunk-7DHZ4DWT.js +0 -5015
  68. package/dist/hooks/chunk-7INSJDGE.js +0 -458
  69. package/dist/hooks/chunk-7VJ4FTDX.js +0 -268
  70. package/dist/hooks/chunk-7XCYNHQK.js +0 -77
  71. package/dist/hooks/chunk-AAEXXUUL.js +0 -268
  72. package/dist/hooks/chunk-ACN3YXFL.js +0 -68
  73. package/dist/hooks/chunk-AD3XE3QZ.js +0 -397
  74. package/dist/hooks/chunk-AENFZPZH.js +0 -230
  75. package/dist/hooks/chunk-AFKRFQ6W.js +0 -68
  76. package/dist/hooks/chunk-AHD5IPWI.js +0 -375
  77. package/dist/hooks/chunk-AMK5JGV7.js +0 -77
  78. package/dist/hooks/chunk-ARN7NCQI.js +0 -425
  79. package/dist/hooks/chunk-AUFY653N.js +0 -3425
  80. package/dist/hooks/chunk-AXQBNFEF.js +0 -375
  81. package/dist/hooks/chunk-AYC7R6U4.js +0 -3316
  82. package/dist/hooks/chunk-AYEA2FJ7.js +0 -5015
  83. package/dist/hooks/chunk-B2LIXYFL.js +0 -77
  84. package/dist/hooks/chunk-B4HPNY2I.js +0 -375
  85. package/dist/hooks/chunk-B4YNCUGB.js +0 -469
  86. package/dist/hooks/chunk-B57S3VWT.js +0 -922
  87. package/dist/hooks/chunk-BINZ3PLI.js +0 -364
  88. package/dist/hooks/chunk-BIWLABFK.js +0 -432
  89. package/dist/hooks/chunk-BODUSXKK.js +0 -410
  90. package/dist/hooks/chunk-BQBAT2YK.js +0 -375
  91. package/dist/hooks/chunk-BUJEBW75.js +0 -391
  92. package/dist/hooks/chunk-BVNWORKA.js +0 -72
  93. package/dist/hooks/chunk-BWI47LQS.js +0 -5205
  94. package/dist/hooks/chunk-C25HRMJX.js +0 -137
  95. package/dist/hooks/chunk-CBFZNC74.js +0 -375
  96. package/dist/hooks/chunk-CECYXS4Y.js +0 -3424
  97. package/dist/hooks/chunk-CELGUP5F.js +0 -49
  98. package/dist/hooks/chunk-CMHANU3F.js +0 -3442
  99. package/dist/hooks/chunk-CMN372LI.js +0 -68
  100. package/dist/hooks/chunk-CPGZLMMK.js +0 -3299
  101. package/dist/hooks/chunk-CTQKXDC7.js +0 -268
  102. package/dist/hooks/chunk-CYAT4RIT.js +0 -68
  103. package/dist/hooks/chunk-CYTWYCH2.js +0 -5014
  104. package/dist/hooks/chunk-CZSOLRBA.js +0 -77
  105. package/dist/hooks/chunk-D2PIDYJR.js +0 -3438
  106. package/dist/hooks/chunk-DE57HI6T.js +0 -137
  107. package/dist/hooks/chunk-DGXDGAPG.js +0 -5306
  108. package/dist/hooks/chunk-DNYRSYQG.js +0 -5014
  109. package/dist/hooks/chunk-DTAXH2A2.js +0 -240
  110. package/dist/hooks/chunk-E2IZUWI5.js +0 -375
  111. package/dist/hooks/chunk-E4L2K2BL.js +0 -397
  112. package/dist/hooks/chunk-E55NKX5F.js +0 -68
  113. package/dist/hooks/chunk-ECXVCCVD.js +0 -3079
  114. package/dist/hooks/chunk-EPHO443D.js +0 -68
  115. package/dist/hooks/chunk-EUFK2BI2.js +0 -375
  116. package/dist/hooks/chunk-EYCD5ZAV.js +0 -137
  117. package/dist/hooks/chunk-F2SDYJU4.js +0 -240
  118. package/dist/hooks/chunk-F4B5D5TF.js +0 -68
  119. package/dist/hooks/chunk-FGEO3NDX.js +0 -432
  120. package/dist/hooks/chunk-FJYI52RE.js +0 -137
  121. package/dist/hooks/chunk-FYTZHIY4.js +0 -3085
  122. package/dist/hooks/chunk-G7JL2A5K.js +0 -375
  123. package/dist/hooks/chunk-GA3ITDBW.js +0 -42
  124. package/dist/hooks/chunk-GDR4H4SV.js +0 -469
  125. package/dist/hooks/chunk-GFKDXPSM.js +0 -2855
  126. package/dist/hooks/chunk-GIMRTKFU.js +0 -566
  127. package/dist/hooks/chunk-GOPHRLGO.js +0 -240
  128. package/dist/hooks/chunk-GX4HO7SJ.js +0 -230
  129. package/dist/hooks/chunk-GXKKK23T.js +0 -240
  130. package/dist/hooks/chunk-GZ6FUVIK.js +0 -566
  131. package/dist/hooks/chunk-H5HPY5M5.js +0 -2869
  132. package/dist/hooks/chunk-HCF3OGEE.js +0 -1829
  133. package/dist/hooks/chunk-HDEXAOUM.js +0 -469
  134. package/dist/hooks/chunk-HM2TY3TN.js +0 -469
  135. package/dist/hooks/chunk-HOA7NXA2.js +0 -55
  136. package/dist/hooks/chunk-HOFEWH6H.js +0 -240
  137. package/dist/hooks/chunk-HUUI6S5J.js +0 -2669
  138. package/dist/hooks/chunk-I4Q6WAJE.js +0 -68
  139. package/dist/hooks/chunk-IB6N4CR2.js +0 -432
  140. package/dist/hooks/chunk-IFLDYJMD.js +0 -469
  141. package/dist/hooks/chunk-IGU466YD.js +0 -77
  142. package/dist/hooks/chunk-IJCQUHKY.js +0 -375
  143. package/dist/hooks/chunk-IKUMBDJB.js +0 -230
  144. package/dist/hooks/chunk-IM3BDIBJ.js +0 -5005
  145. package/dist/hooks/chunk-IMYMAODK.js +0 -3431
  146. package/dist/hooks/chunk-IN2ZVGXA.js +0 -5005
  147. package/dist/hooks/chunk-ITVJ2MKQ.js +0 -18
  148. package/dist/hooks/chunk-J5RIJYTM.js +0 -2669
  149. package/dist/hooks/chunk-JFLMH4K5.js +0 -3460
  150. package/dist/hooks/chunk-JR25IFML.js +0 -77
  151. package/dist/hooks/chunk-JT5AUXFI.js +0 -432
  152. package/dist/hooks/chunk-JY5YVN6N.js +0 -3234
  153. package/dist/hooks/chunk-K5Q4ETVI.js +0 -391
  154. package/dist/hooks/chunk-K67V2F24.js +0 -137
  155. package/dist/hooks/chunk-KATZESEC.js +0 -3273
  156. package/dist/hooks/chunk-KFH4H7W7.js +0 -469
  157. package/dist/hooks/chunk-KMUEI6RX.js +0 -910
  158. package/dist/hooks/chunk-KMV4OY77.js +0 -3438
  159. package/dist/hooks/chunk-KQAZNWEY.js +0 -137
  160. package/dist/hooks/chunk-KZZR6JER.js +0 -5015
  161. package/dist/hooks/chunk-LAR6DREP.js +0 -77
  162. package/dist/hooks/chunk-LNCJWEZD.js +0 -5015
  163. package/dist/hooks/chunk-LRYD2GLM.js +0 -6
  164. package/dist/hooks/chunk-LXBKYHDV.js +0 -77
  165. package/dist/hooks/chunk-LYLKIUNE.js +0 -5024
  166. package/dist/hooks/chunk-LZKCFOVC.js +0 -432
  167. package/dist/hooks/chunk-M4FCIYRI.js +0 -77
  168. package/dist/hooks/chunk-M5M7327Q.js +0 -3425
  169. package/dist/hooks/chunk-MF72MHSX.js +0 -3455
  170. package/dist/hooks/chunk-MK56LKDO.js +0 -397
  171. package/dist/hooks/chunk-N3MJADY7.js +0 -240
  172. package/dist/hooks/chunk-NFQSUDBN.js +0 -458
  173. package/dist/hooks/chunk-NHREKY45.js +0 -137
  174. package/dist/hooks/chunk-NP5TTAAW.js +0 -375
  175. package/dist/hooks/chunk-NQTLTKTJ.js +0 -2993
  176. package/dist/hooks/chunk-NVRCZPBZ.js +0 -391
  177. package/dist/hooks/chunk-O46HMMLJ.js +0 -469
  178. package/dist/hooks/chunk-OFJGH2L4.js +0 -240
  179. package/dist/hooks/chunk-OLFMCZH5.js +0 -240
  180. package/dist/hooks/chunk-OMCZS46I.js +0 -49
  181. package/dist/hooks/chunk-OQZEZW5G.js +0 -469
  182. package/dist/hooks/chunk-P2MDAT2Y.js +0 -1897
  183. package/dist/hooks/chunk-P3M2JJIF.js +0 -68
  184. package/dist/hooks/chunk-PDVHQITQ.js +0 -3453
  185. package/dist/hooks/chunk-PNT2AMDH.js +0 -391
  186. package/dist/hooks/chunk-PR2LVSY6.js +0 -3445
  187. package/dist/hooks/chunk-PRR5R4JK.js +0 -137
  188. package/dist/hooks/chunk-PXT44QVN.js +0 -566
  189. package/dist/hooks/chunk-PZLWJLAP.js +0 -469
  190. package/dist/hooks/chunk-Q2FEAZJ2.js +0 -77
  191. package/dist/hooks/chunk-Q32WETDO.js +0 -3265
  192. package/dist/hooks/chunk-Q45DUBLE.js +0 -3600
  193. package/dist/hooks/chunk-Q7NZSWQ5.js +0 -240
  194. package/dist/hooks/chunk-QH2JNAMK.js +0 -3085
  195. package/dist/hooks/chunk-QNNWYQ2R.js +0 -375
  196. package/dist/hooks/chunk-QPU5H2OS.js +0 -68
  197. package/dist/hooks/chunk-QRAHZ5TO.js +0 -1829
  198. package/dist/hooks/chunk-QUZ5HPIE.js +0 -469
  199. package/dist/hooks/chunk-QVCRG34O.js +0 -2893
  200. package/dist/hooks/chunk-R3MY4E3S.js +0 -1675
  201. package/dist/hooks/chunk-R6TXJJXP.js +0 -77
  202. package/dist/hooks/chunk-REJU6VT7.js +0 -1829
  203. package/dist/hooks/chunk-REQAQLRC.js +0 -2993
  204. package/dist/hooks/chunk-RFCXPAHH.js +0 -391
  205. package/dist/hooks/chunk-RHI6Y22X.js +0 -137
  206. package/dist/hooks/chunk-RKZVOBBS.js +0 -469
  207. package/dist/hooks/chunk-RL57TT2Y.js +0 -566
  208. package/dist/hooks/chunk-RORDOD4S.js +0 -3321
  209. package/dist/hooks/chunk-RZKYW5P2.js +0 -77
  210. package/dist/hooks/chunk-SJPJ6VSI.js +0 -391
  211. package/dist/hooks/chunk-SKSIJQQQ.js +0 -432
  212. package/dist/hooks/chunk-SSQDZKXG.js +0 -268
  213. package/dist/hooks/chunk-SYHFKE4C.js +0 -77
  214. package/dist/hooks/chunk-TCGNI2ZY.js +0 -42
  215. package/dist/hooks/chunk-TG3WXJF5.js +0 -137
  216. package/dist/hooks/chunk-TH7IJAY5.js +0 -77
  217. package/dist/hooks/chunk-TLZ27PCY.js +0 -240
  218. package/dist/hooks/chunk-U652FXTN.js +0 -566
  219. package/dist/hooks/chunk-UEK47YUF.js +0 -268
  220. package/dist/hooks/chunk-UIO45H3O.js +0 -432
  221. package/dist/hooks/chunk-UNLZEEVH.js +0 -5005
  222. package/dist/hooks/chunk-UNRVF3SZ.js +0 -432
  223. package/dist/hooks/chunk-USLFAFOI.js +0 -3453
  224. package/dist/hooks/chunk-VAEELMLL.js +0 -442
  225. package/dist/hooks/chunk-VALSWLDQ.js +0 -3453
  226. package/dist/hooks/chunk-VC5JEPNY.js +0 -3398
  227. package/dist/hooks/chunk-VEZVK6C7.js +0 -230
  228. package/dist/hooks/chunk-VK5JKFAR.js +0 -49
  229. package/dist/hooks/chunk-VNF2KP7Z.js +0 -469
  230. package/dist/hooks/chunk-VWWCUMW6.js +0 -2669
  231. package/dist/hooks/chunk-W4JARUQV.js +0 -137
  232. package/dist/hooks/chunk-WEOBMNJG.js +0 -2993
  233. package/dist/hooks/chunk-WKJU3J5Y.js +0 -5390
  234. package/dist/hooks/chunk-WNON54PT.js +0 -3469
  235. package/dist/hooks/chunk-WOVKBPPX.js +0 -137
  236. package/dist/hooks/chunk-WRVFORYJ.js +0 -432
  237. package/dist/hooks/chunk-WUBVYGQZ.js +0 -240
  238. package/dist/hooks/chunk-WWULTUOM.js +0 -68
  239. package/dist/hooks/chunk-WXHKKB45.js +0 -4962
  240. package/dist/hooks/chunk-XAI3YTHJ.js +0 -469
  241. package/dist/hooks/chunk-XFZH6JZJ.js +0 -77
  242. package/dist/hooks/chunk-XGPWX6IA.js +0 -137
  243. package/dist/hooks/chunk-XIXXIVGY.js +0 -566
  244. package/dist/hooks/chunk-XKDOYJGA.js +0 -922
  245. package/dist/hooks/chunk-YALTVBHM.js +0 -432
  246. package/dist/hooks/chunk-YEBEPBFK.js +0 -5014
  247. package/dist/hooks/chunk-YI2BQ3DK.js +0 -3441
  248. package/dist/hooks/chunk-YVNBCFGG.js +0 -1829
  249. package/dist/hooks/chunk-YXBN3RGG.js +0 -432
  250. package/dist/hooks/chunk-Z2OOJSW3.js +0 -3163
  251. package/dist/hooks/chunk-ZA3HVBOY.js +0 -2644
  252. package/dist/hooks/chunk-ZKID46U3.js +0 -137
  253. package/dist/hooks/chunk-ZPMU2JV6.js +0 -49
  254. package/dist/hooks/chunk-ZRKY4W7O.js +0 -432
  255. package/dist/hooks/chunk-ZTMRB7LJ.js +0 -268
  256. package/dist/hooks/chunk-ZVPPBQ3L.js +0 -3413
@@ -1,77 +0,0 @@
1
- import {
2
- lane_guard_policy,
3
- time_batch_guard
4
- } from "./chunk-OQZEZW5G.js";
5
- import {
6
- hook_decision
7
- } from "./chunk-F2SDYJU4.js";
8
-
9
- // scripts/hooks/batch-guard.ts
10
- import { text } from "node:stream/consumers";
11
- import { fileURLToPath } from "node:url";
12
- var SWITCH_ENV_KEY = "JOSH_BATCH_GUARD";
13
- function is_batch_candidate(call) {
14
- return time_batch_guard.is_guarded_call(call) || time_batch_guard.is_notice_call(call);
15
- }
16
- function batching_mode() {
17
- return lane_guard_policy.mode_here("batching");
18
- }
19
- function is_candidate(call) {
20
- return is_batch_candidate(call) && batching_mode() !== "off";
21
- }
22
- function should_block_here(tail, call, refused_at_ms) {
23
- if (batching_mode() !== "refuse") return false;
24
- return time_batch_guard.should_block(tail, call, refused_at_ms);
25
- }
26
- function should_notify_here(tail, call, notified_at_ms) {
27
- if (time_batch_guard.should_notify(tail, call, notified_at_ms)) return true;
28
- if (batching_mode() !== "notice") return false;
29
- return time_batch_guard.should_block(
30
- tail,
31
- call,
32
- notified_at_ms,
33
- time_batch_guard.NOTICE_REFIRE_EVERY
34
- );
35
- }
36
- function notice_text(call, tail) {
37
- const base = time_batch_guard.is_notice_call(call) ? time_batch_guard.NOTICE : time_batch_guard.LANE_NOTICE;
38
- return `${base}${time_batch_guard.recent_candidates(tail)}`;
39
- }
40
- var GUARD = hook_decision.create_transcript_guard({
41
- prefix: time_batch_guard.STAMP_PREFIX,
42
- switch_key: SWITCH_ENV_KEY,
43
- is_candidate,
44
- should_block: should_block_here,
45
- reason: time_batch_guard.REASON,
46
- // The whole-file write is notified rather than refused, on a record of its own so it never spends
47
- // the refusal's stamp (joshuafolkken/kit#1848); the lane-child refusable-call notice kit#2164 added
48
- // here fires again since kit#2276 restored batching to `notice` in a lane child.
49
- notify: {
50
- prefix: time_batch_guard.NOTICE_STAMP_PREFIX,
51
- should_notify: should_notify_here,
52
- text: notice_text
53
- }
54
- });
55
- var batch_refusal = GUARD.refusal;
56
- var batch_outcome = GUARD.outcome;
57
- var { is_enabled, refusal_path } = GUARD;
58
- var notice_refusal_path = hook_decision.create_refusal_stamp(
59
- time_batch_guard.NOTICE_STAMP_PREFIX
60
- ).path;
61
- var { deny_envelope, load_environment_file, DISABLED_VALUES } = hook_decision;
62
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
63
- if (process.stdin.isTTY) hook_decision.report_no_payload("batch:guard");
64
- else hook_decision.write_outcome(await text(process.stdin), batch_outcome);
65
- }
66
-
67
- export {
68
- SWITCH_ENV_KEY,
69
- batch_refusal,
70
- batch_outcome,
71
- is_enabled,
72
- refusal_path,
73
- notice_refusal_path,
74
- deny_envelope,
75
- load_environment_file,
76
- DISABLED_VALUES
77
- };
@@ -1,432 +0,0 @@
1
- import {
2
- ESLINT_EDIT_CACHE_FLAGS,
3
- time_density_hook
4
- } from "./chunk-AYC7R6U4.js";
5
-
6
- // scripts/hooks/format-edited-file.ts
7
- import { existsSync as existsSync3 } from "node:fs";
8
- import path3 from "node:path";
9
- import { text } from "node:stream/consumers";
10
- import { fileURLToPath } from "node:url";
11
-
12
- // scripts/build/local-bin.ts
13
- import { existsSync, readFileSync } from "node:fs";
14
- import { createRequire } from "node:module";
15
- import path from "node:path";
16
-
17
- // scripts/lib/schemas.ts
18
- import { z } from "zod";
19
- var overrides_snapshot_schema = z.record(z.string(), z.string());
20
- var package_version_schema = z.object({ version: z.string() });
21
- var package_named_version_schema = z.looseObject({ name: z.string(), version: z.string() });
22
- var package_with_version_schema = z.looseObject({ version: z.string() });
23
- var ls_global_dependency_schema = z.looseObject({ version: z.string() });
24
- var ls_global_dependencies_schema = z.record(z.string(), ls_global_dependency_schema).optional();
25
- var pnpm_ls_global_schema = z.array(
26
- z.looseObject({
27
- dependencies: ls_global_dependencies_schema
28
- })
29
- );
30
- var vscode_settings_schema = z.record(z.string(), z.unknown());
31
- var with_scripts_schema = z.looseObject({
32
- scripts: z.record(z.string(), z.string()).optional()
33
- });
34
- var with_development_deps_schema = z.looseObject({
35
- devDependencies: z.record(z.string(), z.string()).optional()
36
- });
37
- var with_package_manager_schema = z.looseObject({
38
- packageManager: z.string().optional()
39
- });
40
- var with_development_engine_schema = z.looseObject({
41
- devEngines: z.record(z.string(), z.unknown()).optional()
42
- });
43
- var bin_entry_schema = z.union([z.string(), z.record(z.string(), z.string())]).optional();
44
- var package_bin_schema = z.looseObject({ bin: bin_entry_schema });
45
- var json_object_schema = z.record(z.string(), z.unknown());
46
- var string_array_schema = z.array(z.string());
47
- var string_record_schema = z.record(z.string(), z.string());
48
-
49
- // scripts/build/local-bin.ts
50
- var NODE_MODULES = "node_modules";
51
- var BIN_DIR = ".bin";
52
- var WINDOWS_PLATFORM = "win32";
53
- var WINDOWS_SHIM_SUFFIX = ".cmd";
54
- var PACKAGE_JSON = "package.json";
55
- function resolve_local_bin(project_root, bin_name) {
56
- const shim = process.platform === WINDOWS_PLATFORM ? `${bin_name}${WINDOWS_SHIM_SUFFIX}` : bin_name;
57
- return path.join(project_root, NODE_MODULES, BIN_DIR, shim);
58
- }
59
- function read_bin_entry(manifest_path, package_name, bin_name) {
60
- const { bin } = package_bin_schema.parse(JSON.parse(readFileSync(manifest_path, "utf8")));
61
- if (typeof bin === "string") return bin_name === path.basename(package_name) ? bin : void 0;
62
- return bin?.[bin_name];
63
- }
64
- function resolve_package_bin(base_directory, package_name, bin_name) {
65
- try {
66
- const resolve_from = createRequire(path.join(base_directory, PACKAGE_JSON));
67
- const manifest_path = resolve_from.resolve(`${package_name}/${PACKAGE_JSON}`);
68
- const bin_entry = read_bin_entry(manifest_path, package_name, bin_name);
69
- if (bin_entry === void 0) return void 0;
70
- const cli_entry = path.join(path.dirname(manifest_path), bin_entry);
71
- return existsSync(cli_entry) ? cli_entry : void 0;
72
- } catch {
73
- return void 0;
74
- }
75
- }
76
-
77
- // scripts/hooks/format-edited-file.ts
78
- import { execa as execa2 } from "execa";
79
- import { z as z2 } from "zod";
80
-
81
- // scripts/hooks/edited-cspell.ts
82
- import { existsSync as existsSync2 } from "node:fs";
83
- import path2 from "node:path";
84
- import { execa } from "execa";
85
- var CSPELL_EXTENSIONS = /* @__PURE__ */ new Set([
86
- ".ts",
87
- ".tsx",
88
- ".js",
89
- ".jsx",
90
- ".mjs",
91
- ".cjs",
92
- ".svelte",
93
- ".md",
94
- ".mdx",
95
- ".txt",
96
- ".json",
97
- ".jsonc",
98
- ".yml",
99
- ".yaml",
100
- ".html",
101
- ".css"
102
- ]);
103
- var CSPELL_ARGS = [
104
- "exec",
105
- "cspell",
106
- "lint",
107
- "--words-only",
108
- "--unique",
109
- "--no-progress",
110
- "--no-summary"
111
- ];
112
- var PNPM = "pnpm";
113
- var PROCESS_TIMEOUT_MS = 15e3;
114
- var HEADER = "The edit hook found words cspell does not know; fix them or add them to `cspell.config.yaml` now rather than at the gate:";
115
- var MAX_DIAGNOSTIC_CHARS = 4e3;
116
- var TRUNCATION_NOTICE = "\n\u2026(unknown words truncated)";
117
- function is_checkable(file_path, project_root) {
118
- if (!existsSync2(file_path) || !CSPELL_EXTENSIONS.has(path2.extname(file_path).toLowerCase())) {
119
- return false;
120
- }
121
- const relative = path2.relative(path2.resolve(project_root), path2.resolve(file_path));
122
- return relative !== "" && !relative.startsWith("..") && !path2.isAbsolute(relative);
123
- }
124
- async function run_cspell(file_path, project_root) {
125
- const result = await execa(PNPM, [...CSPELL_ARGS, file_path], {
126
- reject: false,
127
- cwd: project_root,
128
- stdout: "pipe",
129
- stderr: "ignore",
130
- timeout: PROCESS_TIMEOUT_MS
131
- });
132
- return result.stdout;
133
- }
134
- function format_unknown_words(stdout) {
135
- const words = stdout.split("\n").map((word) => word.trim()).filter((word) => word.length > 0);
136
- if (words.length === 0) return void 0;
137
- const joined = words.join("\n");
138
- const body = joined.length > MAX_DIAGNOSTIC_CHARS ? `${joined.slice(0, MAX_DIAGNOSTIC_CHARS)}${TRUNCATION_NOTICE}` : joined;
139
- return `${HEADER}
140
- ${body}`;
141
- }
142
- async function spelling_diagnostics(file_path, project_root, runner = run_cspell) {
143
- if (file_path === void 0 || !is_checkable(file_path, project_root)) return void 0;
144
- try {
145
- return format_unknown_words(await runner(file_path, project_root));
146
- } catch {
147
- return void 0;
148
- }
149
- }
150
- var edited_cspell = { format_unknown_words, is_checkable, spelling_diagnostics };
151
-
152
- // scripts/hooks/format-rewrite-notice.ts
153
- import { readFileSync as readFileSync2 } from "node:fs";
154
- var MAX_REWRITE_CHARS = 1200;
155
- var REWRITE_TRUNCATION_NOTICE = "\n\u2026(rewrite preview truncated)";
156
- var REWRITE_HEADER = "The format hook rewrote this file after your edit, so your in-memory copy is now stale \u2014 re-read it before the next Edit or the match will miss.";
157
- var REWRITE_RANGE_PREFIX = "Changed around lines ";
158
- var LINE_SEPARATOR = "\n";
159
- var FIRST_LINE = 1;
160
- function common_prefix_length(before, after) {
161
- const limit = Math.min(before.length, after.length);
162
- let index = 0;
163
- while (index < limit && before[index] === after[index]) index += 1;
164
- return index;
165
- }
166
- function common_suffix_length(before, after, prefix) {
167
- const limit = Math.min(before.length, after.length) - prefix;
168
- let index = 0;
169
- while (index < limit && before.at(-1 - index) === after.at(-1 - index)) index += 1;
170
- return index;
171
- }
172
- function changed_range(before, after) {
173
- const before_lines = before.split(LINE_SEPARATOR);
174
- const after_lines = after.split(LINE_SEPARATOR);
175
- const prefix = common_prefix_length(before_lines, after_lines);
176
- const last = after_lines.length - common_suffix_length(before_lines, after_lines, prefix);
177
- return {
178
- start_line: prefix + FIRST_LINE,
179
- end_line: Math.max(prefix + FIRST_LINE, last),
180
- body: after_lines.slice(prefix, last).join(LINE_SEPARATOR)
181
- };
182
- }
183
- function cap_body(body) {
184
- if (body.length <= MAX_REWRITE_CHARS) return body;
185
- return `${body.slice(0, MAX_REWRITE_CHARS)}${REWRITE_TRUNCATION_NOTICE}`;
186
- }
187
- function build(before, after) {
188
- if (before === after) return void 0;
189
- const range = changed_range(before, after);
190
- const location = `${REWRITE_RANGE_PREFIX}${String(range.start_line)}-${String(range.end_line)}:`;
191
- return `${REWRITE_HEADER}
192
- ${location}
193
- ${cap_body(range.body)}`;
194
- }
195
- function read_text(file_path) {
196
- if (file_path === void 0) return "";
197
- try {
198
- return readFileSync2(file_path, "utf8");
199
- } catch {
200
- return "";
201
- }
202
- }
203
- var rewrite_notice = { build, read_text };
204
-
205
- // scripts/hooks/format-edited-file.ts
206
- var hook_payload_schema = z2.object({
207
- tool_input: z2.object({ file_path: z2.string().min(1) }).optional()
208
- });
209
- var PRETTIER_EXTENSIONS = /* @__PURE__ */ new Set([
210
- ".ts",
211
- ".tsx",
212
- ".js",
213
- ".jsx",
214
- ".mjs",
215
- ".cjs",
216
- ".svelte",
217
- ".json",
218
- ".jsonc",
219
- ".md",
220
- ".yml",
221
- ".yaml",
222
- ".css",
223
- ".html"
224
- ]);
225
- var ESLINT_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".svelte"]);
226
- var EXCLUDED_ANYWHERE = /* @__PURE__ */ new Set(["node_modules", ".git"]);
227
- var EXCLUDED_AT_ROOT = /* @__PURE__ */ new Set(["dist", "build"]);
228
- var PARENT_SEGMENT = "..";
229
- var PNPM2 = "pnpm";
230
- var PRETTIER_BIN = "prettier";
231
- var PRETTIER_ARGUMENTS = ["--write", "--ignore-unknown"];
232
- var ESLINT_BIN = "eslint";
233
- var ESLINT_ARGUMENTS = [
234
- "--fix",
235
- "--no-error-on-unmatched-pattern",
236
- ...ESLINT_EDIT_CACHE_FLAGS
237
- ];
238
- var ESLINT_DAEMON = "eslint_d";
239
- var DAEMON_RESTART = "restart";
240
- var ESLINT_CONFIG_DIR = "eslint";
241
- var ESLINT_CONFIG_ENTRY = /^eslint\.config\.[cm]?[jt]s$/u;
242
- var PROCESS_TIMEOUT_MS2 = 15e3;
243
- var DIAGNOSTIC_HEADER = "The edit hook could not auto-fix these lint problems; address them now rather than at the gate:";
244
- var MAX_DIAGNOSTIC_CHARS2 = 4e3;
245
- var DIAGNOSTIC_TRUNCATION_NOTICE = "\n\u2026(diagnostics truncated)";
246
- var SECTION_SEPARATOR = "\n\n";
247
- var MODULE_DIRECTORY = path3.dirname(fileURLToPath(import.meta.url));
248
- function parse_edited_path(raw_payload) {
249
- try {
250
- const result = hook_payload_schema.safeParse(JSON.parse(raw_payload));
251
- return result.success ? result.data.tool_input?.file_path : void 0;
252
- } catch {
253
- return void 0;
254
- }
255
- }
256
- function is_excluded(relative_path) {
257
- const segments = relative_path.split(path3.sep);
258
- return segments.some((segment) => EXCLUDED_ANYWHERE.has(segment)) || EXCLUDED_AT_ROOT.has(segments[0] ?? "");
259
- }
260
- function relative_to_root(project_root, file_path) {
261
- const relative = path3.relative(path3.resolve(project_root), path3.resolve(file_path));
262
- const is_inside_root = relative !== "" && relative.split(path3.sep)[0] !== PARENT_SEGMENT && !path3.isAbsolute(relative);
263
- return is_inside_root ? relative : void 0;
264
- }
265
- function is_formattable(file_path, project_root) {
266
- const relative = relative_to_root(project_root, file_path);
267
- return relative !== void 0 && !is_excluded(relative) && existsSync3(file_path);
268
- }
269
- function plan_commands(file_path, project_root) {
270
- if (!is_formattable(file_path, project_root)) return [];
271
- const extension = path3.extname(file_path).toLowerCase();
272
- const commands = [];
273
- if (ESLINT_EXTENSIONS.has(extension)) {
274
- commands.push({ bin: ESLINT_BIN, command_arguments: [...ESLINT_ARGUMENTS, file_path] });
275
- }
276
- if (PRETTIER_EXTENSIONS.has(extension)) {
277
- commands.push({ bin: PRETTIER_BIN, command_arguments: [...PRETTIER_ARGUMENTS, file_path] });
278
- }
279
- return commands;
280
- }
281
- function select_invocation(command, routes) {
282
- if (routes.daemon_cli !== void 0) {
283
- return {
284
- bin: process.execPath,
285
- command_arguments: [routes.daemon_cli, ...command.command_arguments]
286
- };
287
- }
288
- if (routes.shim !== void 0) {
289
- return { bin: routes.shim, command_arguments: command.command_arguments };
290
- }
291
- return { bin: PNPM2, command_arguments: ["exec", command.bin, ...command.command_arguments] };
292
- }
293
- var DAEMON_BINS = /* @__PURE__ */ new Set([ESLINT_BIN, ESLINT_DAEMON]);
294
- function resolve_daemon_cli(bin, project_root) {
295
- if (!DAEMON_BINS.has(bin)) return void 0;
296
- return resolve_package_bin(MODULE_DIRECTORY, ESLINT_DAEMON, ESLINT_DAEMON) ?? resolve_package_bin(project_root, ESLINT_DAEMON, ESLINT_DAEMON);
297
- }
298
- function is_eslint_config_input(relative_path) {
299
- return relative_path.split(path3.sep)[0] === ESLINT_CONFIG_DIR || ESLINT_CONFIG_ENTRY.test(relative_path);
300
- }
301
- function plan_daemon_restart(file_path, project_root) {
302
- const relative = relative_to_root(project_root, file_path);
303
- if (relative === void 0 || !is_eslint_config_input(relative)) return [];
304
- if (resolve_daemon_cli(ESLINT_DAEMON, project_root) === void 0) return [];
305
- return [{ bin: ESLINT_DAEMON, command_arguments: [DAEMON_RESTART] }];
306
- }
307
- function resolve_invocations(command, project_root) {
308
- const shim = resolve_local_bin(project_root, command.bin);
309
- const routes = {
310
- daemon_cli: resolve_daemon_cli(command.bin, project_root),
311
- shim: existsSync3(shim) ? shim : void 0
312
- };
313
- const without_daemon = select_invocation(command, { ...routes, daemon_cli: void 0 });
314
- if (routes.daemon_cli === void 0) return [without_daemon];
315
- return [select_invocation(command, routes), without_daemon];
316
- }
317
- function is_start_failure(outcome) {
318
- return outcome.exit_code !== 0 && outcome.stdout.length === 0;
319
- }
320
- async function spawn_invocation(invocation, project_root) {
321
- const result = await execa2(invocation.bin, [...invocation.command_arguments], {
322
- reject: false,
323
- cwd: project_root,
324
- env: { ESLINT_D_MISS: "fail" },
325
- stdout: "pipe",
326
- stderr: "ignore",
327
- timeout: PROCESS_TIMEOUT_MS2
328
- });
329
- return { exit_code: result.exitCode ?? 1, stdout: result.stdout };
330
- }
331
- async function run_command(command, project_root) {
332
- let outcome = { exit_code: 0, stdout: "" };
333
- for (const invocation of resolve_invocations(command, project_root)) {
334
- outcome = await spawn_invocation(invocation, project_root);
335
- if (!is_start_failure(outcome)) return outcome;
336
- }
337
- return outcome;
338
- }
339
- function eslint_unfixed(command, outcome) {
340
- if (command.bin !== ESLINT_BIN) return void 0;
341
- if (outcome.exit_code === 0 || outcome.stdout.length === 0) return void 0;
342
- return outcome.stdout;
343
- }
344
- function format_diagnostics(unfixed) {
345
- if (unfixed === void 0) return void 0;
346
- const is_over = unfixed.length > MAX_DIAGNOSTIC_CHARS2;
347
- const body = is_over ? `${unfixed.slice(0, MAX_DIAGNOSTIC_CHARS2)}${DIAGNOSTIC_TRUNCATION_NOTICE}` : unfixed;
348
- return `${DIAGNOSTIC_HEADER}
349
- ${body}`;
350
- }
351
- async function collect_unfixed(plan, runner, project_root) {
352
- let unfixed = "";
353
- for (const command of plan) {
354
- try {
355
- unfixed = eslint_unfixed(command, await runner(command, project_root)) ?? unfixed;
356
- } catch {
357
- continue;
358
- }
359
- }
360
- return unfixed;
361
- }
362
- async function format_edited_file(raw_payload, runner, project_root) {
363
- const file_path = parse_edited_path(raw_payload);
364
- if (file_path === void 0) return void 0;
365
- const plan = [
366
- ...plan_commands(file_path, project_root),
367
- ...plan_daemon_restart(file_path, project_root)
368
- ];
369
- const unfixed = await collect_unfixed(plan, runner, project_root);
370
- return format_diagnostics(unfixed === "" ? void 0 : unfixed);
371
- }
372
- async function format_edited_payload(raw_payload, project_root) {
373
- return await format_edited_file(raw_payload, run_command, project_root);
374
- }
375
- var HOOK_EVENT_NAME = "PostToolUse";
376
- function build_envelope(additional_context) {
377
- return JSON.stringify({
378
- hookSpecificOutput: { hookEventName: HOOK_EVENT_NAME, additionalContext: additional_context }
379
- });
380
- }
381
- function density_envelope(raw_payload) {
382
- const notice = time_density_hook.density_notice(raw_payload);
383
- return notice === void 0 ? void 0 : build_envelope(notice);
384
- }
385
- function compose_context(notice, diagnostics) {
386
- const sections = [notice, diagnostics].filter(
387
- (section) => section !== void 0
388
- );
389
- return sections.length === 0 ? void 0 : sections.join(SECTION_SEPARATOR);
390
- }
391
- function report_no_payload() {
392
- process.stderr.write(
393
- "format:edited reads a Claude Code PostToolUse payload on stdin; it is not run by hand.\n"
394
- );
395
- }
396
- async function run_hook(payload) {
397
- const notice = time_density_hook.density_notice(payload);
398
- const file_path = parse_edited_path(payload);
399
- const before = rewrite_notice.read_text(file_path);
400
- const lint = await format_edited_payload(payload, process.cwd());
401
- const rewrite = rewrite_notice.build(before, rewrite_notice.read_text(file_path));
402
- const spelling = await edited_cspell.spelling_diagnostics(file_path, process.cwd());
403
- const parts = compose_context(rewrite, compose_context(lint, spelling));
404
- const context = compose_context(notice, parts);
405
- if (context !== void 0) process.stdout.write(`${build_envelope(context)}
406
- `);
407
- }
408
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
409
- if (process.stdin.isTTY) {
410
- report_no_payload();
411
- } else {
412
- await run_hook(await text(process.stdin));
413
- }
414
- }
415
-
416
- export {
417
- ESLINT_DAEMON,
418
- PROCESS_TIMEOUT_MS2 as PROCESS_TIMEOUT_MS,
419
- MAX_DIAGNOSTIC_CHARS2 as MAX_DIAGNOSTIC_CHARS,
420
- parse_edited_path,
421
- relative_to_root,
422
- plan_commands,
423
- select_invocation,
424
- plan_daemon_restart,
425
- resolve_invocations,
426
- is_start_failure,
427
- format_edited_file,
428
- format_edited_payload,
429
- build_envelope,
430
- density_envelope,
431
- compose_context
432
- };