@joshuafolkken/kit 1.872.0 → 1.879.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 (232) hide show
  1. package/.github/workflows/publish.yml +39 -2
  2. package/README.md +3 -3
  3. package/package.json +6 -2
  4. package/scripts/init/distributed-paths.ts +14 -11
  5. package/scripts/init/hook-command-bootstrap.ts +51 -0
  6. package/scripts/init/hook-command-rewrite.ts +9 -1
  7. package/scripts/init/init-logic.ts +2 -8
  8. package/templates/workflows/ci.yml +6 -2
  9. package/dist/hooks/chunk-25JL6FMS.js +0 -4970
  10. package/dist/hooks/chunk-2ANGT3XM.js +0 -375
  11. package/dist/hooks/chunk-2EI5GBSW.js +0 -42
  12. package/dist/hooks/chunk-2OT5XE2N.js +0 -5014
  13. package/dist/hooks/chunk-33ELOKEV.js +0 -910
  14. package/dist/hooks/chunk-33YRTKM7.js +0 -230
  15. package/dist/hooks/chunk-36JQU5NN.js +0 -77
  16. package/dist/hooks/chunk-3EJBTWVS.js +0 -1769
  17. package/dist/hooks/chunk-3FK5SFAC.js +0 -432
  18. package/dist/hooks/chunk-3PWPYDD2.js +0 -240
  19. package/dist/hooks/chunk-3TQU7TDH.js +0 -375
  20. package/dist/hooks/chunk-3TVLSFZ6.js +0 -432
  21. package/dist/hooks/chunk-3VXYCB4E.js +0 -77
  22. package/dist/hooks/chunk-44M6JXGV.js +0 -3398
  23. package/dist/hooks/chunk-46EEEHC3.js +0 -240
  24. package/dist/hooks/chunk-4A7UVP2P.js +0 -364
  25. package/dist/hooks/chunk-4LFQEZS4.js +0 -137
  26. package/dist/hooks/chunk-4OCX3V2T.js +0 -469
  27. package/dist/hooks/chunk-4OHA5DE7.js +0 -49
  28. package/dist/hooks/chunk-4PMDW3YD.js +0 -68
  29. package/dist/hooks/chunk-4QHBNAI4.js +0 -68
  30. package/dist/hooks/chunk-4SSB3FEE.js +0 -3273
  31. package/dist/hooks/chunk-5A2WQ2CQ.js +0 -5390
  32. package/dist/hooks/chunk-5EVA2JQB.js +0 -5390
  33. package/dist/hooks/chunk-5P7VF5VE.js +0 -3230
  34. package/dist/hooks/chunk-5QWJGGZP.js +0 -49
  35. package/dist/hooks/chunk-5U5EZYG6.js +0 -77
  36. package/dist/hooks/chunk-5VUUF3ZV.js +0 -240
  37. package/dist/hooks/chunk-5WA7UBT3.js +0 -374
  38. package/dist/hooks/chunk-6EBGRQ3Q.js +0 -301
  39. package/dist/hooks/chunk-6TVHWMD3.js +0 -432
  40. package/dist/hooks/chunk-6VAGLEMB.js +0 -68
  41. package/dist/hooks/chunk-75BTXKFJ.js +0 -3424
  42. package/dist/hooks/chunk-75RHN67S.js +0 -137
  43. package/dist/hooks/chunk-76KC3BDD.js +0 -3414
  44. package/dist/hooks/chunk-76SLS7CZ.js +0 -898
  45. package/dist/hooks/chunk-7DHZ4DWT.js +0 -5015
  46. package/dist/hooks/chunk-7INSJDGE.js +0 -458
  47. package/dist/hooks/chunk-7VJ4FTDX.js +0 -268
  48. package/dist/hooks/chunk-7XCYNHQK.js +0 -77
  49. package/dist/hooks/chunk-A5YJ3H7E.js +0 -375
  50. package/dist/hooks/chunk-AAEXXUUL.js +0 -268
  51. package/dist/hooks/chunk-ABVEVV2M.js +0 -432
  52. package/dist/hooks/chunk-ACN3YXFL.js +0 -68
  53. package/dist/hooks/chunk-AD3XE3QZ.js +0 -397
  54. package/dist/hooks/chunk-AENFZPZH.js +0 -230
  55. package/dist/hooks/chunk-AFKRFQ6W.js +0 -68
  56. package/dist/hooks/chunk-AHD5IPWI.js +0 -375
  57. package/dist/hooks/chunk-AMK5JGV7.js +0 -77
  58. package/dist/hooks/chunk-ARN7NCQI.js +0 -425
  59. package/dist/hooks/chunk-AUFY653N.js +0 -3425
  60. package/dist/hooks/chunk-AXQBNFEF.js +0 -375
  61. package/dist/hooks/chunk-AYC7R6U4.js +0 -3316
  62. package/dist/hooks/chunk-AYEA2FJ7.js +0 -5015
  63. package/dist/hooks/chunk-B4HPNY2I.js +0 -375
  64. package/dist/hooks/chunk-B57S3VWT.js +0 -922
  65. package/dist/hooks/chunk-BINZ3PLI.js +0 -364
  66. package/dist/hooks/chunk-BODUSXKK.js +0 -410
  67. package/dist/hooks/chunk-BQBAT2YK.js +0 -375
  68. package/dist/hooks/chunk-BUJEBW75.js +0 -391
  69. package/dist/hooks/chunk-BVNWORKA.js +0 -72
  70. package/dist/hooks/chunk-BWI47LQS.js +0 -5205
  71. package/dist/hooks/chunk-C25HRMJX.js +0 -137
  72. package/dist/hooks/chunk-CBFZNC74.js +0 -375
  73. package/dist/hooks/chunk-CECYXS4Y.js +0 -3424
  74. package/dist/hooks/chunk-CELGUP5F.js +0 -49
  75. package/dist/hooks/chunk-CMHANU3F.js +0 -3442
  76. package/dist/hooks/chunk-CMN372LI.js +0 -68
  77. package/dist/hooks/chunk-CPGZLMMK.js +0 -3299
  78. package/dist/hooks/chunk-CTQKXDC7.js +0 -268
  79. package/dist/hooks/chunk-CYAT4RIT.js +0 -68
  80. package/dist/hooks/chunk-CYTWYCH2.js +0 -5014
  81. package/dist/hooks/chunk-CZSOLRBA.js +0 -77
  82. package/dist/hooks/chunk-D2PIDYJR.js +0 -3438
  83. package/dist/hooks/chunk-DE57HI6T.js +0 -137
  84. package/dist/hooks/chunk-DGXDGAPG.js +0 -5306
  85. package/dist/hooks/chunk-DNYRSYQG.js +0 -5014
  86. package/dist/hooks/chunk-DTAXH2A2.js +0 -240
  87. package/dist/hooks/chunk-E2IZUWI5.js +0 -375
  88. package/dist/hooks/chunk-E4L2K2BL.js +0 -397
  89. package/dist/hooks/chunk-ECXVCCVD.js +0 -3079
  90. package/dist/hooks/chunk-EPHO443D.js +0 -68
  91. package/dist/hooks/chunk-EUFK2BI2.js +0 -375
  92. package/dist/hooks/chunk-EYCD5ZAV.js +0 -137
  93. package/dist/hooks/chunk-F2SDYJU4.js +0 -240
  94. package/dist/hooks/chunk-F4B5D5TF.js +0 -68
  95. package/dist/hooks/chunk-FGEO3NDX.js +0 -432
  96. package/dist/hooks/chunk-FJYI52RE.js +0 -137
  97. package/dist/hooks/chunk-FYTZHIY4.js +0 -3085
  98. package/dist/hooks/chunk-G7JL2A5K.js +0 -375
  99. package/dist/hooks/chunk-GA3ITDBW.js +0 -42
  100. package/dist/hooks/chunk-GDR4H4SV.js +0 -469
  101. package/dist/hooks/chunk-GFKDXPSM.js +0 -2855
  102. package/dist/hooks/chunk-GIMRTKFU.js +0 -566
  103. package/dist/hooks/chunk-GOPHRLGO.js +0 -240
  104. package/dist/hooks/chunk-GX4HO7SJ.js +0 -230
  105. package/dist/hooks/chunk-GZ6FUVIK.js +0 -566
  106. package/dist/hooks/chunk-H5HPY5M5.js +0 -2869
  107. package/dist/hooks/chunk-HCF3OGEE.js +0 -1829
  108. package/dist/hooks/chunk-HDEXAOUM.js +0 -469
  109. package/dist/hooks/chunk-HM2TY3TN.js +0 -469
  110. package/dist/hooks/chunk-HOA7NXA2.js +0 -55
  111. package/dist/hooks/chunk-HOFEWH6H.js +0 -240
  112. package/dist/hooks/chunk-HUUI6S5J.js +0 -2669
  113. package/dist/hooks/chunk-I4D3NVUD.js +0 -469
  114. package/dist/hooks/chunk-I4Q6WAJE.js +0 -68
  115. package/dist/hooks/chunk-IB6N4CR2.js +0 -432
  116. package/dist/hooks/chunk-IFLDYJMD.js +0 -469
  117. package/dist/hooks/chunk-IGU466YD.js +0 -77
  118. package/dist/hooks/chunk-IJCQUHKY.js +0 -375
  119. package/dist/hooks/chunk-IKUMBDJB.js +0 -230
  120. package/dist/hooks/chunk-IM3BDIBJ.js +0 -5005
  121. package/dist/hooks/chunk-IMYMAODK.js +0 -3431
  122. package/dist/hooks/chunk-IN2ZVGXA.js +0 -5005
  123. package/dist/hooks/chunk-ITVJ2MKQ.js +0 -18
  124. package/dist/hooks/chunk-J5RIJYTM.js +0 -2669
  125. package/dist/hooks/chunk-JFLMH4K5.js +0 -3460
  126. package/dist/hooks/chunk-JR25IFML.js +0 -77
  127. package/dist/hooks/chunk-JT5AUXFI.js +0 -432
  128. package/dist/hooks/chunk-JY5YVN6N.js +0 -3234
  129. package/dist/hooks/chunk-K5Q4ETVI.js +0 -391
  130. package/dist/hooks/chunk-K67V2F24.js +0 -137
  131. package/dist/hooks/chunk-KATZESEC.js +0 -3273
  132. package/dist/hooks/chunk-KFH4H7W7.js +0 -469
  133. package/dist/hooks/chunk-KMUEI6RX.js +0 -910
  134. package/dist/hooks/chunk-KMV4OY77.js +0 -3438
  135. package/dist/hooks/chunk-KQAZNWEY.js +0 -137
  136. package/dist/hooks/chunk-KZZR6JER.js +0 -5015
  137. package/dist/hooks/chunk-LAR6DREP.js +0 -77
  138. package/dist/hooks/chunk-LNCJWEZD.js +0 -5015
  139. package/dist/hooks/chunk-LRYD2GLM.js +0 -6
  140. package/dist/hooks/chunk-LXBKYHDV.js +0 -77
  141. package/dist/hooks/chunk-LYLKIUNE.js +0 -5024
  142. package/dist/hooks/chunk-LZKCFOVC.js +0 -432
  143. package/dist/hooks/chunk-M4FCIYRI.js +0 -77
  144. package/dist/hooks/chunk-M5M7327Q.js +0 -3425
  145. package/dist/hooks/chunk-MF72MHSX.js +0 -3455
  146. package/dist/hooks/chunk-MK56LKDO.js +0 -397
  147. package/dist/hooks/chunk-N3MJADY7.js +0 -240
  148. package/dist/hooks/chunk-NFQSUDBN.js +0 -458
  149. package/dist/hooks/chunk-NHREKY45.js +0 -137
  150. package/dist/hooks/chunk-NP5TTAAW.js +0 -375
  151. package/dist/hooks/chunk-NQTLTKTJ.js +0 -2993
  152. package/dist/hooks/chunk-NVRCZPBZ.js +0 -391
  153. package/dist/hooks/chunk-O46HMMLJ.js +0 -469
  154. package/dist/hooks/chunk-OFJGH2L4.js +0 -240
  155. package/dist/hooks/chunk-OLFMCZH5.js +0 -240
  156. package/dist/hooks/chunk-OMCZS46I.js +0 -49
  157. package/dist/hooks/chunk-OQZEZW5G.js +0 -469
  158. package/dist/hooks/chunk-P2MDAT2Y.js +0 -1897
  159. package/dist/hooks/chunk-P3M2JJIF.js +0 -68
  160. package/dist/hooks/chunk-PDVHQITQ.js +0 -3453
  161. package/dist/hooks/chunk-PNT2AMDH.js +0 -391
  162. package/dist/hooks/chunk-PR2LVSY6.js +0 -3445
  163. package/dist/hooks/chunk-PRR5R4JK.js +0 -137
  164. package/dist/hooks/chunk-PXT44QVN.js +0 -566
  165. package/dist/hooks/chunk-PZLWJLAP.js +0 -469
  166. package/dist/hooks/chunk-Q2FEAZJ2.js +0 -77
  167. package/dist/hooks/chunk-Q32WETDO.js +0 -3265
  168. package/dist/hooks/chunk-Q45DUBLE.js +0 -3600
  169. package/dist/hooks/chunk-Q7NZSWQ5.js +0 -240
  170. package/dist/hooks/chunk-QH2JNAMK.js +0 -3085
  171. package/dist/hooks/chunk-QPU5H2OS.js +0 -68
  172. package/dist/hooks/chunk-QRAHZ5TO.js +0 -1829
  173. package/dist/hooks/chunk-QUZ5HPIE.js +0 -469
  174. package/dist/hooks/chunk-QVCRG34O.js +0 -2893
  175. package/dist/hooks/chunk-R3MY4E3S.js +0 -1675
  176. package/dist/hooks/chunk-R6TXJJXP.js +0 -77
  177. package/dist/hooks/chunk-REJU6VT7.js +0 -1829
  178. package/dist/hooks/chunk-REQAQLRC.js +0 -2993
  179. package/dist/hooks/chunk-RFCXPAHH.js +0 -391
  180. package/dist/hooks/chunk-RHI6Y22X.js +0 -137
  181. package/dist/hooks/chunk-RKZVOBBS.js +0 -469
  182. package/dist/hooks/chunk-RL57TT2Y.js +0 -566
  183. package/dist/hooks/chunk-RORDOD4S.js +0 -3321
  184. package/dist/hooks/chunk-RZKYW5P2.js +0 -77
  185. package/dist/hooks/chunk-SJPJ6VSI.js +0 -391
  186. package/dist/hooks/chunk-SKSIJQQQ.js +0 -432
  187. package/dist/hooks/chunk-SSQDZKXG.js +0 -268
  188. package/dist/hooks/chunk-SYHFKE4C.js +0 -77
  189. package/dist/hooks/chunk-TCGNI2ZY.js +0 -42
  190. package/dist/hooks/chunk-TG3WXJF5.js +0 -137
  191. package/dist/hooks/chunk-TH7IJAY5.js +0 -77
  192. package/dist/hooks/chunk-TLZ27PCY.js +0 -240
  193. package/dist/hooks/chunk-U652FXTN.js +0 -566
  194. package/dist/hooks/chunk-UEK47YUF.js +0 -268
  195. package/dist/hooks/chunk-UIO45H3O.js +0 -432
  196. package/dist/hooks/chunk-UNLZEEVH.js +0 -5005
  197. package/dist/hooks/chunk-UNRVF3SZ.js +0 -432
  198. package/dist/hooks/chunk-USLFAFOI.js +0 -3453
  199. package/dist/hooks/chunk-VAEELMLL.js +0 -442
  200. package/dist/hooks/chunk-VALSWLDQ.js +0 -3453
  201. package/dist/hooks/chunk-VC5JEPNY.js +0 -3398
  202. package/dist/hooks/chunk-VEZVK6C7.js +0 -230
  203. package/dist/hooks/chunk-VK5JKFAR.js +0 -49
  204. package/dist/hooks/chunk-VNF2KP7Z.js +0 -469
  205. package/dist/hooks/chunk-VWWCUMW6.js +0 -2669
  206. package/dist/hooks/chunk-W4JARUQV.js +0 -137
  207. package/dist/hooks/chunk-WEOBMNJG.js +0 -2993
  208. package/dist/hooks/chunk-WKJU3J5Y.js +0 -5390
  209. package/dist/hooks/chunk-WMN4TSVF.js +0 -3299
  210. package/dist/hooks/chunk-WNON54PT.js +0 -3469
  211. package/dist/hooks/chunk-WOVKBPPX.js +0 -137
  212. package/dist/hooks/chunk-WRVFORYJ.js +0 -432
  213. package/dist/hooks/chunk-WUBVYGQZ.js +0 -240
  214. package/dist/hooks/chunk-WWULTUOM.js +0 -68
  215. package/dist/hooks/chunk-WXHKKB45.js +0 -4962
  216. package/dist/hooks/chunk-XAI3YTHJ.js +0 -469
  217. package/dist/hooks/chunk-XFZH6JZJ.js +0 -77
  218. package/dist/hooks/chunk-XGPWX6IA.js +0 -137
  219. package/dist/hooks/chunk-XIXXIVGY.js +0 -566
  220. package/dist/hooks/chunk-XKDOYJGA.js +0 -922
  221. package/dist/hooks/chunk-YALTVBHM.js +0 -432
  222. package/dist/hooks/chunk-YEBEPBFK.js +0 -5014
  223. package/dist/hooks/chunk-YI2BQ3DK.js +0 -3441
  224. package/dist/hooks/chunk-YVNBCFGG.js +0 -1829
  225. package/dist/hooks/chunk-YXBN3RGG.js +0 -432
  226. package/dist/hooks/chunk-Z2OOJSW3.js +0 -3163
  227. package/dist/hooks/chunk-ZA3HVBOY.js +0 -2644
  228. package/dist/hooks/chunk-ZKID46U3.js +0 -137
  229. package/dist/hooks/chunk-ZPMU2JV6.js +0 -49
  230. package/dist/hooks/chunk-ZRKY4W7O.js +0 -432
  231. package/dist/hooks/chunk-ZTMRB7LJ.js +0 -268
  232. package/dist/hooks/chunk-ZVPPBQ3L.js +0 -3413
@@ -5,7 +5,7 @@ on:
5
5
  types: [new-tag-created]
6
6
 
7
7
  jobs:
8
- publish:
8
+ publish-github:
9
9
  runs-on: ubuntu-latest
10
10
  timeout-minutes: 10
11
11
  permissions:
@@ -13,6 +13,8 @@ jobs:
13
13
  packages: write
14
14
  steps:
15
15
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
16
+ with:
17
+ ref: ${{ github.event.client_payload.tag }}
16
18
 
17
19
  - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
18
20
  with:
@@ -34,6 +36,41 @@ jobs:
34
36
 
35
37
  - run: pnpm install --frozen-lockfile --ignore-scripts
36
38
 
37
- - run: pnpm publish --no-git-checks --tag latest
39
+ - run: pnpm publish --no-git-checks --tag latest --registry https://npm.pkg.github.com
38
40
  env:
39
41
  NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
42
+
43
+ publish-npm:
44
+ runs-on: ubuntu-latest
45
+ timeout-minutes: 10
46
+ permissions:
47
+ contents: read
48
+ id-token: write
49
+ steps:
50
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
51
+ with:
52
+ ref: ${{ github.event.client_payload.tag }}
53
+
54
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
55
+ with:
56
+ node-version: 24
57
+ registry-url: 'https://registry.npmjs.org'
58
+
59
+ - name: Resolve pnpm version
60
+ id: pnpm-version
61
+ run: |
62
+ version=$(node -p "const m = require('./package.json'); m.packageManager?.match(/^pnpm@([^+]+)/)?.[1] ?? (m.devEngines?.packageManager?.name === 'pnpm' ? m.devEngines.packageManager.version?.split('+')[0] : 'latest') ?? 'latest'")
63
+ test -n "$version"
64
+ echo "version=$version" >> "$GITHUB_OUTPUT"
65
+
66
+ - uses: pnpm/setup@fbda4c85fc2e1e08721cd8763afea8f48d60f024 # v3.0.0
67
+ with:
68
+ version: ${{ steps.pnpm-version.outputs.version }}
69
+ install: false
70
+
71
+ - run: pnpm install --frozen-lockfile --ignore-scripts
72
+
73
+ - run: pnpm pack --out "$RUNNER_TEMP/kit.tgz"
74
+
75
+ - name: Publish to npm
76
+ run: cd "$RUNNER_TEMP" && npm publish kit.tgz --access public --tag latest --registry https://registry.npmjs.org --userconfig /dev/null
package/README.md CHANGED
@@ -8,12 +8,11 @@ Shared toolchain config and CLI for TypeScript projects — ESLint, Prettier, Ty
8
8
  ## Prerequisites
9
9
 
10
10
  - [Node.js](https://nodejs.org/) with [pnpm](https://pnpm.io/)
11
- - [gh CLI](https://cli.github.com/) — required for GitHub Packages authentication. Install via `brew install gh` (macOS), `winget install GitHub.cli` (Windows), or see the [gh installation docs](https://github.com/cli/cli#installation).
11
+ - [gh CLI](https://cli.github.com/) for `josh version` and existing GitHub Packages consumers. It is not required to install kit from public npm; see [authentication.md](./docs/authentication.md) for setup when needed.
12
12
 
13
13
  ## Quick start
14
14
 
15
15
  ```bash
16
- gh auth login --scopes read:packages # see docs/authentication.md for the full setup
17
16
  pnpm add -g @joshuafolkken/kit # install the josh CLI globally
18
17
  josh help
19
18
  ```
@@ -25,9 +24,10 @@ Using the kit inside a project? See [docs/package.md](./docs/package.md).
25
24
  | Guide | What it covers |
26
25
  | ----------------------------------------------- | -------------------------------------------------------------------------------- |
27
26
  | [why.md](./docs/why.md) | Why kit exists — the AI-development problems it solves, for practitioners |
28
- | [authentication.md](./docs/authentication.md) | One-time GitHub Packages auth — `gh` token, `NODE_AUTH_TOKEN`, `.npmrc` |
27
+ | [authentication.md](./docs/authentication.md) | GitHub Packages auth for existing projects |
29
28
  | [cli.md](./docs/cli.md) | Install and use the global `josh` CLI |
30
29
  | [package.md](./docs/package.md) | Use the kit as a project devDependency — configs, prompts, scripts, `josh init` |
30
+ | [publishing.md](./docs/publishing.md) | First public npm release and trusted publishing setup |
31
31
  | [josh-commands.md](./docs/josh-commands.md) | Full `josh` CLI command reference |
32
32
  | [overview.md](./docs/overview.md) | What the kit provides and how it works |
33
33
  | [troubleshooting.md](./docs/troubleshooting.md) | `401`/`404` auth errors, `josh: command not found`, stale shim, version mismatch |
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
- "version": "1.872.0",
2
+ "version": "1.879.0",
3
3
  "name": "@joshuafolkken/kit",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/joshuafolkken/kit.git"
9
+ },
6
10
  "engines": {
7
11
  "node": ">=22.19.0"
8
12
  },
@@ -166,4 +170,4 @@
166
170
  "build": "tsx scripts/build/build-bin.ts && tsx scripts/build/build-hooks.ts && tsx scripts/build/build-version.ts && tsx scripts/build/build-config-merge.ts && tsx scripts/build/build-managed-marker.ts && tsx scripts/build/build-self-sync-guard.ts && tsx scripts/build/build-claude-md.ts",
167
171
  "josh": "tsx scripts/josh/josh.ts"
168
172
  }
169
- }
173
+ }
@@ -17,11 +17,11 @@ const ESLINT_PACKAGE_PREFIX = `${KIT_PACKAGE_PATH_PREFIX}eslint/`
17
17
  const GITHUB_REPO_BLOB_BASE = 'https://github.com/joshuafolkken/kit/blob/main/'
18
18
  const GITHUB_REPO_TREE_BASE = 'https://github.com/joshuafolkken/kit/tree/main/'
19
19
 
20
- // The single line a consumer's CLAUDE.md carries: an import of kit's published, already
21
- // path-transformed rules. The consumer's own additions sit below it. Distributed at publish time via
22
- // dist/CLAUDE.md (build-claude-md.ts) rather than byte-copied at sync time, so a package update alone
23
- // keeps the rules current (joshuafolkken/kit#1878).
20
+ // The consumer imports kit's published, already path-transformed rules. A tracked bootstrap note
21
+ // remains readable before installation, while the rule body stays in the package (kit#1878).
24
22
  const CLAUDE_MD_IMPORT_LINE = '@node_modules/@joshuafolkken/kit/dist/CLAUDE.md'
23
+ const CLAUDE_MD_BOOTSTRAP =
24
+ '> Fresh checkout: if kit is not installed, run `pnpm install` first, then reread this file before doing any other work.'
25
25
 
26
26
  // A span containing `*` is excluded: it is a **glob**, not a reference to a file a consumer can
27
27
  // open. A distributed document that writes a directory set as `prompts/**` means "anything beneath
@@ -79,15 +79,18 @@ function transform_distributed_paths(content: string): string {
79
79
  return transform_documentation_paths(with_tests)
80
80
  }
81
81
 
82
- // The consumer CLAUDE.md is one @import of kit's published rules plus whatever the project adds below
83
- // it. Ensure the import line is present without disturbing those additions: an absent file becomes
84
- // the line alone, a file already carrying it is returned untouched, and any other file keeps all its
85
- // content with the import prepended. The substring check makes it idempotent.
82
+ // Keep the bootstrap note ahead of the import so an agent can read it in a fresh checkout. Preserve
83
+ // project additions and update older one-line files without duplicating either line.
86
84
  function ensure_claude_md_import(existing: string | undefined): string {
87
- if (existing === undefined) return `${CLAUDE_MD_IMPORT_LINE}\n`
88
- if (existing.includes(CLAUDE_MD_IMPORT_LINE)) return existing
85
+ if (existing === undefined) return `${CLAUDE_MD_BOOTSTRAP}\n\n${CLAUDE_MD_IMPORT_LINE}\n`
89
86
 
90
- return `${CLAUDE_MD_IMPORT_LINE}\n\n${existing}`
87
+ if (existing.includes(CLAUDE_MD_IMPORT_LINE)) {
88
+ if (existing.includes(CLAUDE_MD_BOOTSTRAP)) return existing
89
+
90
+ return `${CLAUDE_MD_BOOTSTRAP}\n\n${existing}`
91
+ }
92
+
93
+ return `${CLAUDE_MD_BOOTSTRAP}\n\n${CLAUDE_MD_IMPORT_LINE}\n\n${existing}`
91
94
  }
92
95
 
93
96
  const distributed_paths = {
@@ -0,0 +1,51 @@
1
+ import { spawnSync } from 'node:child_process'
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
3
+ import { tmpdir } from 'node:os'
4
+ import path from 'node:path'
5
+ import { git_location_environment } from '#scripts/git/git-location-environment'
6
+
7
+ interface HookResult {
8
+ status: number | null
9
+ stdout: string
10
+ stderr: string
11
+ }
12
+
13
+ function create_partial_install(temporary_root: string): void {
14
+ const package_root = path.join(temporary_root, 'node_modules/@joshuafolkken/kit')
15
+ const hook_path = path.join(package_root, 'dist/hooks/pretool-guard.js')
16
+
17
+ mkdirSync(path.dirname(hook_path), { recursive: true })
18
+ writeFileSync(path.join(package_root, 'package.json'), '{}')
19
+ writeFileSync(hook_path, "process.stdout.write('guard ran')")
20
+ }
21
+
22
+ function run_in_temporary_checkout(command: string, is_partial_install = false): HookResult {
23
+ const temporary_root = mkdtempSync(path.join(tmpdir(), 'kit-hook-bootstrap-'))
24
+ const git_environment = {
25
+ ...process.env,
26
+ ...git_location_environment.location_free_environment(),
27
+ }
28
+
29
+ try {
30
+ spawnSync('git', ['init', '-q'], {
31
+ cwd: temporary_root,
32
+ env: git_environment,
33
+ })
34
+
35
+ if (is_partial_install) create_partial_install(temporary_root)
36
+
37
+ const { status, stdout, stderr } = spawnSync('sh', ['-c', command], {
38
+ cwd: temporary_root,
39
+ encoding: 'utf8',
40
+ env: git_environment,
41
+ })
42
+
43
+ return { status, stdout, stderr }
44
+ } finally {
45
+ rmSync(temporary_root, { recursive: true, force: true })
46
+ }
47
+ }
48
+
49
+ const hook_command_bootstrap = { run_in_temporary_checkout }
50
+
51
+ export { hook_command_bootstrap }
@@ -21,6 +21,9 @@ const BUNDLE_INVOCATION = `node ${claude_plugin_config.MARKETPLACE_PATH}/dist/jo
21
21
  // The per-hook bundle directory a fresh clone builds, and where it lives inside the installed package.
22
22
  const HOOK_BUNDLE_DIR = `${hook_launch.HOOK_DIST_DIR}/`
23
23
  const CONSUMER_HOOK_BUNDLE_DIR = `${claude_plugin_config.MARKETPLACE_PATH}/${HOOK_BUNDLE_DIR}`
24
+ const CONSUMER_PACKAGE_MANIFEST = `${claude_plugin_config.MARKETPLACE_PATH}/package.json`
25
+ const MISSING_INSTALL_NOTICE = 'kit hooks inactive: run pnpm install, then reread CLAUDE.md'
26
+ const MISSING_INSTALL_GUARD = `if [ ! -f ${CONSUMER_PACKAGE_MANIFEST} ]; then echo '${MISSING_INSTALL_NOTICE}' >&2; exit 0; fi; `
24
27
  const CODEX_ADAPTER_BUNDLE = `node ${CONSUMER_HOOK_BUNDLE_DIR}codex-hook-adapter.js`
25
28
  const CODEX_HOOKS_DESTINATION = '.codex/hooks.json'
26
29
  const CODEX_ROOT_PREFIX = String.raw`cd \"$(git rev-parse --show-toplevel)\" && `
@@ -43,11 +46,16 @@ function rebase_bundle_directory(value: string): string {
43
46
  // independent whichever order they run. The fallback rewrite is idempotent too (`BUNDLE_INVOCATION`
44
47
  // holds no `pnpm josh `), so the whole rewrite is safe to run more than once.
45
48
  function rewrite_command_value(value: string): string {
46
- return rebase_bundle_directory(value)
49
+ const rewritten = rebase_bundle_directory(value)
47
50
  .split(PNPM_JOSH_PREFIX)
48
51
  .join(BUNDLE_INVOCATION)
49
52
  .split(CODEX_ADAPTER_SOURCE)
50
53
  .join(CODEX_ADAPTER_BUNDLE)
54
+
55
+ if (!rewritten.includes(claude_plugin_config.MARKETPLACE_PATH)) return rewritten
56
+ if (rewritten.includes(MISSING_INSTALL_GUARD)) return rewritten
57
+
58
+ return `${MISSING_INSTALL_GUARD}${rewritten}`
51
59
  }
52
60
 
53
61
  function rewrite_hook_commands(content: string, is_codex = false): string {
@@ -13,15 +13,9 @@ const DEV_ENGINES_VALUE = {
13
13
  packageManager: { name: 'pnpm', version: '>=12.1.0', onFail: 'error' },
14
14
  }
15
15
 
16
- // The `@joshuafolkken:registry` mapping stays — it is a registry mapping, not a credential,
17
- // and pnpm honors it from a project .npmrc unconditionally. The matching `_authToken` line is
18
- // deliberately absent: by default pnpm >= 11.6 refuses to expand environment variables in
19
- // credentials read from a project .npmrc (the file is committed, so expansion could leak the
20
- // token to an attacker-controlled registry), so distributing the line would only add an
21
- // `Ignored project-level auth setting` warning on every command. Not distributing it is not the
22
- // same as removing it — see merge_npmrc.
16
+ // New projects resolve kit from public npm. Existing registry and auth lines remain untouched
17
+ // by merge_npmrc so consumers of other GitHub Packages can migrate separately.
23
18
  const NPMRC_LINES: ReadonlyArray<string> = [
24
- '@joshuafolkken:registry=https://npm.pkg.github.com',
25
19
  'engine-strict=true',
26
20
  'minimum-release-age=1440',
27
21
  'confirmModulesPurge=false',
@@ -118,7 +118,9 @@ jobs:
118
118
  uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
119
119
  with:
120
120
  node-version: '24'
121
- registry-url: 'https://npm.pkg.github.com'
121
+
122
+ - name: Configure GitHub Packages authentication for existing projects
123
+ run: printf '//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}\n' >> "$HOME/.npmrc"
122
124
 
123
125
  - name: Resolve pnpm version
124
126
  id: pnpm-version
@@ -358,7 +360,9 @@ jobs:
358
360
  uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
359
361
  with:
360
362
  node-version: '24'
361
- registry-url: 'https://npm.pkg.github.com'
363
+
364
+ - name: Configure GitHub Packages authentication for existing projects
365
+ run: printf '//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}\n' >> "$HOME/.npmrc"
362
366
 
363
367
  - name: Resolve pnpm version
364
368
  id: pnpm-version