void 0.10.5 → 0.10.7

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 (216) hide show
  1. package/dist/agents-Bmr5tFFb.mjs +1454 -0
  2. package/dist/{auth-cmd-UoCwfDQv.mjs → auth-cmd-DlgNwByu.mjs} +10 -10
  3. package/dist/{better-auth-shared-D0Mbmx5V.mjs → better-auth-shared-BQooDxbw.mjs} +1 -1
  4. package/dist/{better-auth-shared-jkksALri.d.mts → better-auth-shared-BvnM9px6.d.mts} +2 -2
  5. package/dist/{build-cmd-CVyuBHjP.mjs → build-cmd-Br8qL0rA.mjs} +15 -17
  6. package/dist/{cache-ACORQCIq.mjs → cache-wH-mP8UE.mjs} +10 -12
  7. package/dist/{cancel-deploy-Gi8zmoZC.mjs → cancel-deploy-BEBOEgtu.mjs} +16 -18
  8. package/dist/cli/cli.mjs +47 -49
  9. package/dist/{client-BlbnA92X.mjs → client-Cj96iiBH.mjs} +74 -8
  10. package/dist/{config-8dLIngKW.mjs → config-1twldYCW.mjs} +10 -10
  11. package/dist/{config-CbJS4Krx.mjs → config-BdUctCZD.mjs} +4 -4
  12. package/dist/{create-project-LjvkYziS.mjs → create-project-DD9n8Ho-.mjs} +28 -23
  13. package/dist/{db-C00yjN01.mjs → db-DjKE2-A-.mjs} +147 -149
  14. package/dist/{delete-CplfvTgU.mjs → delete-D2kr3Kmk.mjs} +13 -15
  15. package/dist/{deploy-CISNL5uK.mjs → deploy-C4PbkFyE.mjs} +97 -100
  16. package/dist/{discover-ZWuBvt22.mjs → discover-BuVVSAum.mjs} +3 -3
  17. package/dist/{dist-5cGIJHQQ.mjs → dist-BuiRJkTd.mjs} +59 -27
  18. package/dist/{domain-B4HpcgNG.mjs → domain-_luIsM_B.mjs} +14 -16
  19. package/dist/{env-DNMJpeVF.mjs → env-CO5XAS9t.mjs} +23 -25
  20. package/dist/{env-helpers-B_ks681T.d.mts → env-helpers-z4stu8uc.d.mts} +1 -1
  21. package/dist/{env-types-BS8cZead.mjs → env-types-D51bnR-c.mjs} +3 -3
  22. package/dist/{env-validation-BxbtBbjh.mjs → env-validation-CeC2FL66.mjs} +4 -4
  23. package/dist/{fetch-error-C6qffTl2.mjs → fetch-error-Dj3crt0e.mjs} +3 -3
  24. package/dist/{gen-C0pV2gRQ.mjs → gen-Cf79J4aw.mjs} +42 -44
  25. package/dist/{github-cmd-CwtLD1yI.mjs → github-cmd-DnqxyOsb.mjs} +88 -90
  26. package/dist/{handler-B7rCOy21.d.mts → handler-imD0UVDT.d.mts} +4 -5
  27. package/dist/{headers-BNWymgnH.mjs → headers-BwvFGhkx.mjs} +3 -3
  28. package/dist/index.d.mts +3 -3
  29. package/dist/index.mjs +102 -83
  30. package/dist/{init-D58GxCtt.mjs → init-KirOzVDs.mjs} +132 -134
  31. package/dist/link-CUmiosyb.mjs +45 -0
  32. package/dist/{list-CbNNjXTm.mjs → list-3GEw7b6m.mjs} +10 -12
  33. package/dist/{login-CvxxF_9z.mjs → login-DJReaT_Q.mjs} +14 -15
  34. package/dist/{logs-BDZ9AuhM.mjs → logs-D-rQ56Lq.mjs} +9 -11
  35. package/dist/{magic-string.es-C1Fb0uxq.mjs → magic-string.es-ZQjdJFFn.mjs} +3 -3
  36. package/dist/{mcp-C8BjRt_z.mjs → mcp-D7yc0dXY.mjs} +2 -3
  37. package/dist/{node-B07cZs0d.mjs → node-yFFk626c.mjs} +6 -6
  38. package/dist/{package-json-Bg_GJdJB.mjs → package-json-B0NuUWGd.mjs} +1 -1
  39. package/dist/pages/client.d.mts +1 -1
  40. package/dist/pages/client.mjs +2 -1
  41. package/dist/pages/head-client.d.mts +1 -1
  42. package/dist/pages/head.d.mts +1 -1
  43. package/dist/pages/index.d.mts +2 -2
  44. package/dist/pages/index.mjs +5 -5
  45. package/dist/pages/islands-plugin.d.mts +1 -1
  46. package/dist/pages/islands-plugin.mjs +3 -3
  47. package/dist/pages/protocol.d.mts +2 -2
  48. package/dist/pages/protocol.mjs +5 -2
  49. package/dist/{plugin-inference-D04iL1mW.mjs → plugin-inference-CJxi_fWI.mjs} +3 -3
  50. package/dist/{prepare-DUo9q8cM.mjs → prepare-C_cVurhP.mjs} +15 -18
  51. package/dist/{preset-D0My64KQ.mjs → preset-CVvwCeIy.mjs} +4 -4
  52. package/dist/{project-cmd-Dd1gNRdd.mjs → project-cmd-DnU7u9QF.mjs} +13 -14
  53. package/dist/{project-paths-CCMrHYQm.mjs → project-paths-tpdR1mJR.mjs} +2 -2
  54. package/dist/{project-tsconfig-DMBV55K2.mjs → project-tsconfig-D9uSVVpA.mjs} +2 -2
  55. package/dist/{protocol-6UZCowS1.d.mts → protocol-6hTJ04T1.d.mts} +3 -3
  56. package/dist/{resolve-project-D4O1_fZz.mjs → resolve-project-D2HI3TrG.mjs} +2 -2
  57. package/dist/{rollback-DzmCCrFg.mjs → rollback-Yh7bCKob.mjs} +21 -23
  58. package/dist/{route-types-BpSJEW20.mjs → route-types-CfKfhbIg.mjs} +234 -3
  59. package/dist/{runner-BQyKUqAL.mjs → runner-h272wcPj.mjs} +4 -5
  60. package/dist/{runner-pg-EuhrFW3D.mjs → runner-pg-waxJOnBb.mjs} +1 -1
  61. package/dist/runtime/ai.mjs +2 -2
  62. package/dist/runtime/auth.d.mts +1 -1
  63. package/dist/runtime/better-auth-pg.d.mts +1 -1
  64. package/dist/runtime/better-auth-pg.mjs +3 -3
  65. package/dist/runtime/better-auth.d.mts +1 -1
  66. package/dist/runtime/better-auth.mjs +2 -2
  67. package/dist/runtime/client-react.d.mts +2 -2
  68. package/dist/runtime/client-react.mjs +1 -1
  69. package/dist/runtime/client-solid.d.mts +2 -2
  70. package/dist/runtime/client-solid.mjs +1 -1
  71. package/dist/runtime/client-svelte.d.mts +2 -2
  72. package/dist/runtime/client-svelte.mjs +1 -1
  73. package/dist/runtime/client-vue.d.mts +2 -2
  74. package/dist/runtime/client-vue.mjs +1 -1
  75. package/dist/runtime/client.d.mts +2 -2
  76. package/dist/runtime/client.mjs +1 -1
  77. package/dist/runtime/db-pg.d.mts +1 -1
  78. package/dist/runtime/env-helpers.d.mts +1 -1
  79. package/dist/runtime/env-public-client.d.mts +1 -1
  80. package/dist/runtime/env-public-client.mjs +2 -0
  81. package/dist/runtime/env-public.d.mts +3 -4
  82. package/dist/runtime/env-public.mjs +3 -1
  83. package/dist/runtime/env.mjs +1 -1
  84. package/dist/runtime/fetch-stream.d.mts +1 -1
  85. package/dist/runtime/fetch-stream.mjs +1 -1
  86. package/dist/runtime/fetch.d.mts +1 -1
  87. package/dist/runtime/fetch.mjs +1 -1
  88. package/dist/runtime/handler.d.mts +2 -2
  89. package/dist/runtime/handler.mjs +1 -1
  90. package/dist/runtime/isr.mjs +1 -1
  91. package/dist/runtime/live-server.mjs +2 -0
  92. package/dist/runtime/live.d.mts +2 -2
  93. package/dist/runtime/live.mjs +3 -1
  94. package/dist/runtime/migration-handler-pg.mjs +1 -1
  95. package/dist/runtime/migration-handler.mjs +1 -1
  96. package/dist/runtime/remote/index.mjs +11 -1
  97. package/dist/runtime/sandbox.d.mts +1 -4
  98. package/dist/runtime/sandbox.mjs +1 -1
  99. package/dist/runtime/validator.d.mts +1 -1
  100. package/dist/runtime/ws-server.d.mts +2 -2
  101. package/dist/runtime/ws-server.mjs +2 -0
  102. package/dist/runtime/ws.d.mts +3 -3
  103. package/dist/runtime/ws.mjs +2 -0
  104. package/dist/{scan-VCAM1oh3.mjs → scan-Dp_Gyzs3.mjs} +3 -3
  105. package/dist/{scan---8wfN58.mjs → scan-i7Yz54fv.mjs} +26 -8
  106. package/dist/{secret-CMLYWkE-.mjs → secret-u7FRvg8d.mjs} +22 -24
  107. package/dist/{skills-Dl3u05da.mjs → skills-DsdNDtX3.mjs} +6 -7
  108. package/dist/{subcommand-prompt-B8ng0FTS.mjs → subcommand-prompt-DtES-oP6.mjs} +34 -35
  109. package/dist/sveltekit.mjs +1 -1
  110. package/dist/validate-DT7nFMlf.mjs +504 -0
  111. package/dist/{yarn-pnp-WLW2IHUY.mjs → yarn-pnp-CW8LB6g_.mjs} +1 -1
  112. package/package.json +19 -19
  113. package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/CHANGELOG.md +94 -0
  114. package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/README.md +32 -11
  115. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/sandbox/README.md +45 -0
  116. package/skills/void/docs/node_modules/void/node_modules/@electric-sql/pglite/README.md +5 -5
  117. package/skills/void/docs/node_modules/void/node_modules/@types/node/README.md +1 -1
  118. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@types/node/README.md +1 -1
  119. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-exit/README.md +4 -1
  120. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tinyglobby/README.md +1 -1
  121. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/AGENTS.md +1 -0
  122. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/README.md +18 -6
  123. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/build.md +1 -1
  124. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/check.md +35 -0
  125. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/create.md +70 -0
  126. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/fmt.md +3 -1
  127. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/index.md +11 -7
  128. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/lint.md +3 -1
  129. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/pack.md +1 -1
  130. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/run.md +141 -26
  131. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/staged.md +1 -1
  132. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/test.md +1 -1
  133. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +145 -0
  134. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/cache.md +16 -28
  135. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/check.md +16 -0
  136. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ci.md +15 -17
  137. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/commit-hooks.md +9 -0
  138. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/create.md +255 -2
  139. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/docker.md +175 -0
  140. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/env.md +70 -5
  141. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/github-actions-cache.md +165 -0
  142. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ide-integration.md +2 -2
  143. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/index.md +9 -3
  144. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/install.md +63 -11
  145. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate-rules.md +347 -0
  146. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate.md +27 -3
  147. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/monorepo.md +176 -0
  148. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/pack.md +8 -0
  149. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/run.md +36 -4
  150. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/troubleshooting.md +11 -35
  151. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/upgrade.md +65 -13
  152. package/skills/void/docs/node_modules/void/node_modules/es-module-lexer/README.md +403 -390
  153. package/skills/void/docs/node_modules/void/node_modules/pg/README.md +2 -1
  154. package/skills/void/docs/node_modules/void/node_modules/tinyglobby/README.md +1 -1
  155. package/skills/void/docs/node_modules/void/node_modules/vite-plus/AGENTS.md +1 -0
  156. package/skills/void/docs/node_modules/void/node_modules/vite-plus/README.md +18 -6
  157. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/build.md +1 -1
  158. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/check.md +35 -0
  159. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/create.md +70 -0
  160. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/fmt.md +3 -1
  161. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/index.md +11 -7
  162. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/lint.md +3 -1
  163. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/pack.md +1 -1
  164. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/run.md +141 -26
  165. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/staged.md +1 -1
  166. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/test.md +1 -1
  167. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +145 -0
  168. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/cache.md +16 -28
  169. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/check.md +16 -0
  170. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ci.md +15 -17
  171. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/commit-hooks.md +9 -0
  172. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/create.md +255 -2
  173. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/docker.md +175 -0
  174. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/env.md +70 -5
  175. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/github-actions-cache.md +165 -0
  176. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ide-integration.md +2 -2
  177. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/index.md +9 -3
  178. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/install.md +63 -11
  179. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate-rules.md +347 -0
  180. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate.md +27 -3
  181. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/monorepo.md +176 -0
  182. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/pack.md +8 -0
  183. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/run.md +36 -4
  184. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/troubleshooting.md +11 -35
  185. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/upgrade.md +65 -13
  186. package/skills/void/docs/reference/cli.md +5 -1
  187. package/dist/agents-MhSzNMiC.mjs +0 -151
  188. package/dist/collect-9rO3JFNM.mjs +0 -55
  189. package/dist/config-hhMYPVRT.mjs +0 -21
  190. package/dist/dist-abzUneor.mjs +0 -1287
  191. package/dist/drizzle-DqstQTGq.mjs +0 -232
  192. package/dist/link-ZFmboqY3.mjs +0 -47
  193. package/dist/output-DeiS4oEX.mjs +0 -139
  194. package/dist/plan-aD3wRDqF.mjs +0 -271
  195. package/dist/project-CH9pdo16.mjs +0 -72
  196. package/dist/project-slug-rX3kTOfY.mjs +0 -10
  197. package/dist/validate-CNWm-PsL.mjs +0 -186
  198. /package/dist/{auth-migrations-BP-hMzYl.mjs → auth-migrations-BTZ-ATvQ.mjs} +0 -0
  199. /package/dist/{auth-Dz2CCn4T.d.mts → auth-qgMlYp7Z.d.mts} +0 -0
  200. /package/dist/{canonical-json-CEyQaVDa.mjs → canonical-json-DuDiiUsQ.mjs} +0 -0
  201. /package/dist/{cf-access-DKDsgwOU.mjs → cf-access-Bqw81xAf.mjs} +0 -0
  202. /package/dist/{defer-C-bdSM_b.mjs → defer-YsYDUoii.mjs} +0 -0
  203. /package/dist/{dotenv-lS94ymhM.mjs → dotenv-D_UbC_vc.mjs} +0 -0
  204. /package/dist/{env-raw-Dtj1UAoK.mjs → env-raw-CoS20LHP.mjs} +0 -0
  205. /package/dist/{fetch-error-B6RaJ-eZ.d.mts → fetch-error-Sp1R4mZv.d.mts} +0 -0
  206. /package/dist/{git-metadata-Ce0AtSZL.mjs → git-metadata-CBKaL0v5.mjs} +0 -0
  207. /package/dist/{head-eOUCWUNy.d.mts → head-nmvOgFjd.d.mts} +0 -0
  208. /package/dist/{log-BdD_Fpms.mjs → log-ChfPKsVd.mjs} +0 -0
  209. /package/dist/{pathe.M-eThtNZ-BrPhGF_K.mjs → pathe.M-eThtNZ-CQzLbt4c.mjs} +0 -0
  210. /package/dist/{pg-CempqvEJ.mjs → pg-J2HbZIkX.mjs} +0 -0
  211. /package/dist/{providers-BJIoduK9.d.mts → providers-BNKRacMr.d.mts} +0 -0
  212. /package/dist/{providers-BwPbdHdi.mjs → providers-CJlNS3kT.mjs} +0 -0
  213. /package/dist/{proxy-M3pxItg2.mjs → proxy-D-3_D-Gl.mjs} +0 -0
  214. /package/dist/{chunk-DJd-R1mw.mjs → rolldown-runtime-DJK8HYOj.mjs} +0 -0
  215. /package/dist/{standard-schema-Cy0lfeWv.d.mts → standard-schema-DJ0HW7QP.d.mts} +0 -0
  216. /package/dist/{types-BodZGegX.d.mts → types-lLjNE9Qp.d.mts} +0 -0
@@ -22,8 +22,17 @@ If you use [`vp create`](/guide/create) or [`vp migrate`](/guide/migrate), Vite+
22
22
  ```bash
23
23
  vp config
24
24
  vp config --hooks-dir .vite-hooks
25
+ vp config --no-hooks
26
+ vp config --no-agent
25
27
  ```
26
28
 
29
+ Use `--no-hooks` when you want `vp config` to leave existing Git hook setup unchanged. Use
30
+ `--no-agent` when you want it to skip updates to existing coding agent instruction files. You
31
+ can pass both flags when you want `vp config` to skip both setup steps.
32
+
33
+ You can also set `VITE_GIT_HOOKS=0` to disable hook installation from lifecycle scripts such as
34
+ `prepare` or `postinstall`.
35
+
27
36
  ### `vp staged`
28
37
 
29
38
  `vp staged` runs staged-file checks using the `staged` config from `vite.config.ts`. If you set up Vite+ to handle your commit hooks, it will automatically run when you commit your local changes.
@@ -27,7 +27,7 @@ Vite+ ships with these built-in templates:
27
27
  - `vite:monorepo` creates a new monorepo
28
28
  - `vite:application` creates a new application
29
29
  - `vite:library` creates a new library
30
- - `vite:generator` creates a new generator
30
+ - `vite:generator` creates a new code generator (monorepo only, see [Code Generators](#code-generators))
31
31
 
32
32
  ## Template Sources
33
33
 
@@ -35,7 +35,7 @@ Vite+ ships with these built-in templates:
35
35
 
36
36
  - Use shorthand templates like `vite`, `@tanstack/start`, `svelte`, `next-app`, `nuxt`, `react-router`, and `vue`
37
37
  - Use full package names like `create-vite` or `create-next-app`
38
- - Use local templates such as `./tools/create-ui-component` or `@acme/generator-*`
38
+ - Use local monorepo templates declared in [`create.templates`](#code-generators) (for example an internal component or service generator)
39
39
  - Use remote templates such as `github:user/repo` or `https://github.com/user/template-repo`
40
40
 
41
41
  Run `vp create --list` to see the built-in templates and the common shorthand templates Vite+ recognizes.
@@ -44,13 +44,29 @@ Run `vp create --list` to see the built-in templates and the common shorthand te
44
44
 
45
45
  - `--directory <dir>` writes the generated project into a specific target directory
46
46
  - `--agent <name>` creates agent instructions files during scaffolding
47
+ - `--no-agent` skips agent instruction setup
47
48
  - `--editor <name>` writes editor config files
49
+ - `--no-editor` skips editor config setup
50
+ - `--git` initialize a git repository
51
+ - `--no-git` skips git repository initialization
48
52
  - `--hooks` enables pre-commit hook setup
49
53
  - `--no-hooks` skips hook setup
54
+ - `--package-manager <name>` uses a specified package manager (`pnpm`, `npm`, `yarn`, or `bun`)
55
+ - `--approve-builds` approves and runs gated dependency build scripts without prompting
50
56
  - `--no-interactive` runs without prompts
51
57
  - `--verbose` shows detailed scaffolding output
52
58
  - `--list` prints the available built-in and popular templates
53
59
 
60
+ ### Dependency build scripts
61
+
62
+ For security, pnpm, bun, and yarn (Berry) do not run a dependency's build scripts (`install` / `postinstall`, e.g. native builds like `better-sqlite3`) until you approve them. When a template adds such a dependency directly, `vp create` surfaces it after installing instead of leaving the project in a half-built state:
63
+
64
+ - Interactive: you are asked which of those dependencies to approve and build (nothing is selected by default).
65
+ - Non-interactive: a note lists them and points at `vp pm approve-builds`.
66
+ - `--approve-builds`: approves and builds them automatically, so non-interactive runs (CI) can produce a ready-to-use project.
67
+
68
+ Approval is recorded the way each package manager expects: pnpm's `allowBuilds`, bun's `trustedDependencies`, or yarn's `dependenciesMeta.<pkg>.built` (in the workspace root manifest). Transitive build scripts you did not choose (e.g. `esbuild` pulled in by Vite) are left at the package manager's defaults and are not surfaced. npm runs build scripts by default, so there is nothing to approve there.
69
+
54
70
  ## Template Options
55
71
 
56
72
  Arguments after `--` are passed directly to the selected template.
@@ -86,3 +102,240 @@ vp create create-next-app
86
102
  vp create github:user/repo
87
103
  vp create https://github.com/user/template-repo
88
104
  ```
105
+
106
+ ## Code Generators
107
+
108
+ Monorepos often need to scaffold their own building blocks: a UI component, a service, or an internal package that follows house conventions. Vite+ supports this through generator packages powered by [Bingo](https://www.create.bingo/) templates.
109
+
110
+ ### Scaffold a generator
111
+
112
+ Inside a Vite+ monorepo, run:
113
+
114
+ ```bash
115
+ vp create vite:generator
116
+ ```
117
+
118
+ This requires a monorepo workspace. If you don't have one yet, create it first with `vp create vite:monorepo`.
119
+
120
+ The scaffolded generator package contains:
121
+
122
+ - `src/template.ts` defines the template using `createTemplate` from `bingo`: an options schema built with [Zod](https://zod.dev/) and a `produce()` function that returns the files to generate
123
+ - `bin/index.ts` is the CLI entry, powered by Bingo's `runTemplateCLI`
124
+
125
+ If the monorepo has a parent directory matching `generators` or `tools`, the new package is placed there by default.
126
+
127
+ ### Registration
128
+
129
+ Local generators are declared in [`create.templates`](/config/create#create-templates) in the monorepo's `vite.config.ts`. This is the source of truth: only registered templates appear in the `vp create` picker.
130
+
131
+ `vp create vite:generator` registers the generator for you, adding an entry to `create.templates` in the root `vite.config.ts`:
132
+
133
+ ```ts
134
+ import { defineConfig } from 'vite-plus';
135
+
136
+ export default defineConfig({
137
+ create: {
138
+ templates: [
139
+ { name: 'my-generator', description: 'Generate new components', template: 'my-generator' },
140
+ ],
141
+ },
142
+ });
143
+ ```
144
+
145
+ Re-running is idempotent (no duplicate entries), and an existing `create.defaultTemplate` is preserved. You can also add entries by hand, for example to register a template you didn't scaffold this way. The `template` value is the generator's workspace package name, or a relative `./path` to it.
146
+
147
+ ### Run a generator
148
+
149
+ Inside the monorepo, run `vp create` and pick the generator from the template list, or pass its entry `name` directly:
150
+
151
+ ```bash
152
+ # Interactive mode lists registered local templates alongside the built-ins
153
+ vp create
154
+
155
+ # Run a registered template by its name
156
+ vp create component
157
+
158
+ # Pass options to the generator after --
159
+ vp create component -- --name @your-org/button
160
+ ```
161
+
162
+ When the generator depends on `bingo`, Vite+ appends `--skip-requests` automatically so it skips Bingo's outbound network requests (such as GitHub API calls).
163
+
164
+ After the generator runs, the created package goes through the regular monorepo integration: workspace registration, dependency installation, and formatting.
165
+
166
+ ### Customize a generator
167
+
168
+ Edit `src/template.ts` to define the options and the files to produce:
169
+
170
+ ```ts
171
+ import { createTemplate } from 'bingo';
172
+ import { z } from 'zod';
173
+
174
+ export default createTemplate({
175
+ options: {
176
+ name: z.string().describe('Package name'),
177
+ },
178
+ async produce({ options }) {
179
+ return {
180
+ files: {
181
+ 'package.json': JSON.stringify({ name: options.name, version: '0.0.0' }, null, 2),
182
+ src: {
183
+ 'index.ts': `export const name = '${options.name}';\n`,
184
+ },
185
+ },
186
+ };
187
+ },
188
+ });
189
+ ```
190
+
191
+ - `options` defines the generator's prompts and flags using Zod schemas
192
+ - `produce()` returns the [files](https://www.create.bingo/build/concepts/creations#files) to create, plus optional [scripts](https://www.create.bingo/build/concepts/creations#scripts) to run after generation and [suggestions](https://www.create.bingo/build/concepts/creations#suggestions) to print for the user
193
+
194
+ See the [Bingo documentation](https://www.create.bingo/) for the full template API.
195
+
196
+ ## Organization Templates
197
+
198
+ An organization can publish a curated set of templates under a single npm scope by shipping an `@org/create` package whose `package.json` carries a `createConfig.templates` manifest. Once published, `vp create @org` opens an interactive picker over those templates.
199
+
200
+ ### Pick from an org
201
+
202
+ ```bash
203
+ # Open an interactive picker over @your-org/create's manifest
204
+ vp create @your-org
205
+
206
+ # Run a specific manifest entry directly
207
+ vp create @your-org:web
208
+
209
+ # Pin to an exact version or a dist-tag
210
+ vp create @your-org@1.2.3
211
+ vp create @your-org:web@next
212
+
213
+ # Set the org as the default for a repo (see create.defaultTemplate config)
214
+ vp create
215
+ ```
216
+
217
+ Behind the scenes, `vp create @org` maps to `@org/create` (the existing npm `create-*` convention). If that package has no `createConfig.templates` field, Vite+ falls back to running the package normally — so adopting the manifest is zero-risk for orgs that already publish `@org/create`.
218
+
219
+ Private registries work automatically: Vite+ reads `.npmrc` files from the project root and `~/`, honoring `@your-org:registry=...` scope mappings and `//host/:_authToken=...` credentials.
220
+
221
+ ### Authoring `@org/create`
222
+
223
+ There are two common layouts. Pick the one that matches the org's template count and release cadence.
224
+
225
+ **Bundled (recommended for most orgs).** All templates live as subdirectories of `@org/create` itself. Manifest entries use relative `./path` values. One repo, one publish, one versioning story — the same pattern used by `create-vite` and `create-next-app`.
226
+
227
+ ```
228
+ @your-org/create/
229
+ ├── package.json # "createConfig": { "templates": [{ "template": "./templates/web" }, ...] }
230
+ ├── templates/
231
+ │ ├── web/
232
+ │ │ ├── package.json
233
+ │ │ └── src/...
234
+ │ └── library/...
235
+ └── README.md
236
+ ```
237
+
238
+ **Manifest-only.** When the org already publishes independent `@org/template-*` packages (or hosts them on GitHub), `@org/create` stays a thin index.
239
+
240
+ ```
241
+ @your-org/create/
242
+ ├── package.json # "createConfig": { "templates": [{ "template": "@your-org/template-web" }, ...] }
243
+ └── README.md
244
+ ```
245
+
246
+ The two layouts can be mixed — a manifest can point most entries at external packages and keep a few as bundled subdirectories.
247
+
248
+ Optionally, provide a `bin` script so `npm create @org` (the legacy path) keeps working for non-Vite+ users. `vp create @org` reads the manifest directly and never runs the `bin`.
249
+
250
+ ### Manifest schema
251
+
252
+ The manifest lives at `createConfig.templates` in `@org/create`'s `package.json`:
253
+
254
+ ```json
255
+ {
256
+ "name": "@your-org/create",
257
+ "version": "1.0.0",
258
+ "createConfig": {
259
+ "templates": [
260
+ {
261
+ "name": "monorepo",
262
+ "description": "Monorepo",
263
+ "template": "@your-org/template-monorepo",
264
+ "monorepo": true
265
+ },
266
+ {
267
+ "name": "web",
268
+ "description": "Web app template (Vite + React)",
269
+ "template": "@your-org/template-web"
270
+ },
271
+ {
272
+ "name": "demo",
273
+ "description": "Bundled demo template",
274
+ "template": "./templates/demo"
275
+ }
276
+ ]
277
+ }
278
+ }
279
+ ```
280
+
281
+ Each entry supports:
282
+
283
+ | Field | Required | Notes |
284
+ | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
285
+ | `name` | yes | Kebab-case identifier. Used by `vp create @org:<name>` for direct selection. Must be unique within the array. |
286
+ | `description` | yes | One-line description shown in the picker. |
287
+ | `template` | yes | An npm specifier (`@org/template-foo`, optionally `@version`), a GitHub URL (`github:user/repo`), a `vite:*` builtin, a local workspace package name, or a relative path (`./templates/foo`) that resolves against the `@org/create` root. |
288
+ | `monorepo` | no | If `true`, marks this entry as a monorepo-creating template. Hidden from the picker when `vp create` runs inside an existing monorepo, mirroring the built-in `vite:monorepo` filter. |
289
+
290
+ An invalid manifest is a hard error, not a silent fall-through — a maintainer who shipped a manifest should hear about the offending field, e.g. `@your-org/create: createConfig.templates[2].template must be a non-empty string`.
291
+
292
+ ### Bundled subdirectory templates
293
+
294
+ Relative `./...` paths resolve against the enclosing `@org/create` package root — **not** the user's cwd. The referenced directory is copied into the target project as-is (no template-engine processing); the only exception is that a small set of underscore-prefixed scaffold files (`_gitignore`, `_npmrc`, `_yarnrc.yml`) are renamed to their dotfile equivalents. Paths that escape the package root are rejected.
295
+
296
+ ### Make the org the default in a repo
297
+
298
+ Commit this in `vite.config.ts` at the project root:
299
+
300
+ ```ts
301
+ import { defineConfig } from 'vite-plus';
302
+
303
+ export default defineConfig({
304
+ create: { defaultTemplate: '@your-org' },
305
+ });
306
+ ```
307
+
308
+ Now `vp create` (with no argument) drops straight into the `@your-org` picker. See [`create.defaultTemplate`](/config/create) for details.
309
+
310
+ The picker always appends a trailing **Vite+ built-in templates** entry so `vite:monorepo` / `vite:application` / `vite:library` / `vite:generator` stay reachable from the picker — selecting it routes to the standard built-in flow. For scripts and CI, explicit specifiers (`vp create vite:library`) bypass the configured default.
311
+
312
+ ### Non-interactive inspection
313
+
314
+ `vp create @org --no-interactive` prints the manifest as a table and exits 1:
315
+
316
+ ```
317
+ A template name is required when running `vp create @your-org` in non-interactive mode.
318
+
319
+ Available templates in @your-org/create:
320
+
321
+ NAME DESCRIPTION TEMPLATE
322
+ web Web app template (Vite + React) @your-org/template-web
323
+ library TypeScript library template @your-org/template-library
324
+ demo Bundled demo template ./templates/demo
325
+
326
+ Examples:
327
+ # Scaffold a specific template from the org
328
+ vp create @your-org:web --no-interactive
329
+
330
+ # Or use a Vite+ built-in template
331
+ vp create vite:application --no-interactive
332
+ ```
333
+
334
+ ### Publishing checklist
335
+
336
+ 1. Create `@org/create` (scoped npm package) if you don't already have one.
337
+ 2. Add a `createConfig.templates` array to `package.json`. (Bundle the templates under `./templates/...` or point at external packages.)
338
+ 3. (Optional) Provide a `bin` launcher for `npm create @org` compatibility.
339
+ 4. Publish.
340
+ 5. Verify: `vp create @org --no-interactive` prints the manifest table; `vp create @org` opens the picker.
341
+ 6. (Optional) Commit `create: { defaultTemplate: '@org' }` in your internal template repos.
@@ -0,0 +1,175 @@
1
+ # Docker
2
+
3
+ Vite+ publishes an official Docker image with the `vp` CLI preinstalled:
4
+
5
+ ```bash
6
+ ghcr.io/voidzero-dev/vite-plus
7
+ ```
8
+
9
+ Use it for builds, CI, and devcontainers. It is not intended as a production
10
+ runtime image.
11
+
12
+ `vp` resolves the Node.js version from your project (`.node-version`,
13
+ `devEngines.runtime`, or `engines.node`) and downloads that exact version during
14
+ install/build. This means the image does not need Node-version-specific tags.
15
+
16
+ For production, use a multi-stage build: build the app with the Vite+ image, then
17
+ copy only the resolved Node.js binary, build output, and production dependencies
18
+ into a smaller runtime image.
19
+
20
+ ## Image tags
21
+
22
+ Tags track the `vp` version:
23
+
24
+ | Tag | Meaning |
25
+ | -------------------------------------------------------- | -------------- |
26
+ | `ghcr.io/voidzero-dev/vite-plus:latest` | Latest release |
27
+ | `ghcr.io/voidzero-dev/vite-plus:<major>` | Latest major |
28
+ | `ghcr.io/voidzero-dev/vite-plus:<major>.<minor>` | Latest minor |
29
+ | `ghcr.io/voidzero-dev/vite-plus:<major>.<minor>.<patch>` | Exact version |
30
+
31
+ The examples use `:latest` to track the newest release; pin an exact tag or a
32
+ digest if you need reproducible builds. The image is published for `linux/amd64`
33
+ and `linux/arm64` and runs as a non-root user by default.
34
+
35
+ Browse all published versions and digests on the [GitHub package page](https://github.com/voidzero-dev/vite-plus/pkgs/container/vite-plus).
36
+
37
+ ## Production: SSR / Node.js server app
38
+
39
+ For apps that run Node.js in production (SvelteKit, Nuxt, a custom Vite SSR
40
+ server, and so on), build with the toolchain image and copy the resolved Node.js
41
+ and the built app into a slim runtime stage:
42
+
43
+ ```dockerfile [Dockerfile]
44
+ # syntax=docker/dockerfile:1
45
+
46
+ # --- build stage: the official Vite+ toolchain image ---
47
+ FROM ghcr.io/voidzero-dev/vite-plus:latest AS build
48
+ WORKDIR /app
49
+
50
+ # Install dependencies first so this layer is cached across source changes.
51
+ COPY --chown=vp:vp package.json pnpm-lock.yaml .node-version* ./
52
+ RUN vp install --frozen-lockfile
53
+
54
+ # Build. vp reads .node-version and provisions that exact Node.js automatically.
55
+ COPY --chown=vp:vp . .
56
+ RUN vp build
57
+
58
+ # Export the exact resolved Node.js binary for the runtime stage.
59
+ RUN cp "$(vp env which node | head -1)" /tmp/node
60
+
61
+ # --- deps stage: production-only dependencies ---
62
+ # A separate, fresh `--prod` install so devDependencies (including the vite-plus
63
+ # toolchain) are excluded. Running `--prod` over the full install above would not
64
+ # prune the already-installed devDependencies.
65
+ FROM ghcr.io/voidzero-dev/vite-plus:latest AS deps
66
+ WORKDIR /app
67
+ COPY --chown=vp:vp package.json pnpm-lock.yaml .node-version* ./
68
+ RUN vp install --frozen-lockfile --prod
69
+
70
+ # --- runtime stage: small, glibc, no vp ---
71
+ FROM debian:bookworm-slim AS runtime
72
+ WORKDIR /app
73
+ ENV NODE_ENV=production
74
+
75
+ # The exact Node.js from .node-version (official, signature-verified build).
76
+ COPY --from=build /tmp/node /usr/local/bin/node
77
+
78
+ COPY --from=build /app/dist ./dist
79
+ COPY --from=deps /app/node_modules ./node_modules
80
+ COPY --from=build /app/package.json ./
81
+
82
+ USER nobody
83
+ EXPOSE 3000
84
+ CMD ["node", "dist/server.js"]
85
+ ```
86
+
87
+ The deployed image contains only Node.js plus your app and production
88
+ dependencies, and matches `.node-version` exactly. It is much smaller than the
89
+ default `node:*` image; see the distroless tip below for the smallest result.
90
+
91
+ ::: warning Prune production dependencies in a separate stage
92
+ Install production dependencies in their own `deps` stage as shown. Running
93
+ `vp install --prod` after a full `vp install` in the same stage does not remove
94
+ the already-installed devDependencies, so the `vite-plus` toolchain would be
95
+ copied into the runtime image. If your server bundle is fully self-contained (no
96
+ un-bundled runtime dependencies), you can skip copying `node_modules` entirely.
97
+ :::
98
+
99
+ ::: tip Smaller still
100
+ For a shell-less, minimal-CVE runtime, swap the runtime base for distroless
101
+ (`gcr.io/distroless/cc`) and keep an `ENTRYPOINT` in vector form. It is glibc
102
+ based, so the copied Node.js binary remains compatible.
103
+ :::
104
+
105
+ ## Production: static SPA / SSG
106
+
107
+ A static site needs no Node.js at runtime; serve the build output with any static
108
+ server:
109
+
110
+ ```dockerfile [Dockerfile]
111
+ FROM ghcr.io/voidzero-dev/vite-plus:latest AS build
112
+ WORKDIR /app
113
+ COPY --chown=vp:vp package.json pnpm-lock.yaml .node-version* ./
114
+ RUN vp install --frozen-lockfile
115
+ COPY --chown=vp:vp . .
116
+ RUN vp build
117
+
118
+ FROM nginx:alpine AS runtime
119
+ COPY --from=build /app/dist /usr/share/nginx/html
120
+ ```
121
+
122
+ ## Continuous integration
123
+
124
+ Use the image directly in container-based CI (GitLab CI, Buildkite, CircleCI,
125
+ Jenkins, and others):
126
+
127
+ ```yaml [.gitlab-ci.yml]
128
+ build:
129
+ image: ghcr.io/voidzero-dev/vite-plus:latest
130
+ script:
131
+ - vp install --frozen-lockfile
132
+ - vp check
133
+ - vp test
134
+ - vp build
135
+ ```
136
+
137
+ On GitHub Actions, prefer [`setup-vp`](./ci) instead of the image.
138
+
139
+ ## Devcontainers
140
+
141
+ Use the image as a ready-to-go development container with the toolchain
142
+ preinstalled:
143
+
144
+ ```jsonc [.devcontainer/devcontainer.json]
145
+ {
146
+ "image": "ghcr.io/voidzero-dev/vite-plus:latest",
147
+ }
148
+ ```
149
+
150
+ ## Ad-hoc usage
151
+
152
+ Run any `vp` command against a project without installing vp on your machine:
153
+
154
+ ```bash
155
+ docker run --rm -it -v "$PWD:/app" -w /app ghcr.io/voidzero-dev/vite-plus vp build
156
+ ```
157
+
158
+ ## Notes
159
+
160
+ - **Node.js version**: provisioned from `.node-version`, `engines.node`, or
161
+ `devEngines.runtime` at build time, so there is no Node.js-specific image tag. The
162
+ dependency `COPY` uses a `.node-version*` glob so the file is optional: projects
163
+ that pin via `engines.node`/`devEngines.runtime` need no `.node-version`, and
164
+ those that use one have it available in every stage.
165
+ - **Non-root user**: the image runs as the non-root `vp` user, so copy sources
166
+ with `COPY --chown=vp:vp ...` as shown. Without it, `COPY` writes root-owned
167
+ files that `vp install` cannot update (permission denied).
168
+ - **Native addons**: the image includes a C/C++ build toolchain (`build-essential`,
169
+ `python3`), so native dependencies such as `better-sqlite3` compile during
170
+ `vp install`.
171
+ - **glibc**: the image is glibc based so it uses the official, signature-verified
172
+ Node.js builds.
173
+ - **Custom base image**: to add `vp` to your own base image instead, run the
174
+ installer: `curl -fsSL https://vite.plus | bash` (set `VP_VERSION` to pin a
175
+ version).
@@ -6,6 +6,17 @@
6
6
 
7
7
  Managed mode is on by default, so `node`, `npm`, and related shims resolve through Vite+ and pick the right Node.js version for the current project.
8
8
 
9
+ The project Node.js version is resolved from these sources, in priority order:
10
+
11
+ 1. `.node-version` file (current or parent directories)
12
+ 2. `devEngines.runtime` in `package.json` (the [devEngines standard](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#devengines))
13
+ 3. `engines.node` in `package.json`
14
+ 4. The global default (`vp env default`), then the latest LTS
15
+
16
+ `devEngines.runtime` ranks above `engines.node` because it declares the development-environment requirement, while `engines.node` is a consumer-facing support range. `vp env doctor` warns when declared sources conflict.
17
+
18
+ When a project declares `packageManager` (or `devEngines.packageManager`) in `package.json`, matching package-manager shims also use that package-manager version. For example, `packageManager: "npm@10.9.4"` makes both `npm` and `npx` run through npm 10.9.4. Alias pairs follow the installed package-manager shims: `npm`/`npx`, `pnpm`/`pnpx`, `yarn`/`yarnpkg`, and `bun`/`bunx`. Vite+ does not translate mismatched commands, so a project pinned to `pnpm` still lets `npm` fall back to the npm that comes with the resolved Node.js runtime.
19
+
9
20
  By default, Vite+ stores its managed runtime and related files in `~/.vite-plus`. If needed, you can override that location with `VP_HOME`.
10
21
 
11
22
  If you want to keep that behavior, run:
@@ -28,16 +39,38 @@ This switches to system-first mode, where the shims prefer your system Node.js a
28
39
 
29
40
  ### Setup
30
41
 
31
- - `vp env setup` creates or updates shims in `VP_HOME/bin`
42
+ - `vp env setup` creates or updates shims in `VP_HOME/bin` (and writes the per-shell setup scripts under `~/.vite-plus/`)
32
43
  - `vp env on` enables managed mode so shims always use Vite+-managed Node.js
33
44
  - `vp env off` enables system-first mode so shims prefer system Node.js first
34
45
  - `vp env print` prints the shell snippet for the current session
35
46
 
47
+ PowerShell needs to dot-source the generated setup script in the current shell before `vp env use` can affect only that shell session:
48
+
49
+ ```powershell
50
+ . "$env:USERPROFILE\.vite-plus\env.ps1"
51
+ ```
52
+
53
+ Add that line to the end of your PowerShell `$PROFILE` to apply it automatically in new shells. It does not require elevated privileges.
54
+
55
+ Create the profile file if it does not already exist:
56
+
57
+ ```powershell
58
+ if (-not (Test-Path $PROFILE)) { New-Item $PROFILE -Force }
59
+ ```
60
+
61
+ Open the profile file for editing:
62
+
63
+ ```powershell
64
+ Invoke-Item $PROFILE
65
+ ```
66
+
67
+ In CI, `vp env use` can still run without shell initialization. It writes a temporary session file under `VP_HOME` so later shim calls in the same job can resolve the selected Node.js version.
68
+
36
69
  ### Manage
37
70
 
38
71
  - `vp env default` sets or shows the global default Node.js version
39
- - `vp env pin` pins a Node.js version in the current directory
40
- - `vp env unpin` removes `.node-version` from the current directory
72
+ - `vp env pin` pins a Node.js version in the current directory: an existing `.node-version` keeps being updated; otherwise the pin is written to `package.json#devEngines.runtime`; `.node-version` is only created when the directory has no `package.json`. Use `--target node-version` or `--target dev-engines` to choose explicitly. An existing `engines.node` is never modified.
73
+ - `vp env unpin` removes the pin from the same source `vp env pin` would write
41
74
  - `vp env use` sets a Node.js version for the current shell session
42
75
  - `vp env install` installs a Node.js version
43
76
  - `vp env uninstall` removes an installed Node.js version
@@ -54,7 +87,7 @@ This switches to system-first mode, where the shims prefer your system Node.js a
54
87
 
55
88
  ## Project Setup
56
89
 
57
- - Pin a project version with `.node-version`
90
+ - Pin a project version with `vp env pin`
58
91
  - Use `vp install`, `vp dev`, and `vp build` normally
59
92
  - Let Vite+ pick the right runtime for the project
60
93
 
@@ -62,7 +95,7 @@ This switches to system-first mode, where the shims prefer your system Node.js a
62
95
 
63
96
  ```bash
64
97
  # Setup
65
- vp env setup # Create shims for node, npm, npx
98
+ vp env setup # Create shims for node, npm, npx, corepack
66
99
  vp env on # Use Vite+ managed Node.js
67
100
  vp env print # Print shell snippet for this session
68
101
 
@@ -77,6 +110,7 @@ vp env use --unset # Remove the session override
77
110
  vp env current # Show current resolved environment
78
111
  vp env current --json # JSON output for automation
79
112
  vp env which node # Show which node binary will be used
113
+ vp env which npx # Show pinned package-manager alias when packageManager matches
80
114
  vp env list-remote --lts # List only LTS versions
81
115
 
82
116
  # Execute
@@ -86,6 +120,25 @@ vp node script.js # Shorthand: run a Node.js script with the resolve
86
120
  vp node -e "console.log(1+1)" # Shorthand: forward any node flag or argument
87
121
  ```
88
122
 
123
+ ## Corepack
124
+
125
+ Vite+ creates a `corepack` shim by default, so corepack works without a system Node.js installation:
126
+
127
+ - On Node.js 24 and earlier, the shim runs the corepack bundled with the resolved Node.js version.
128
+ - On Node.js 25 and later, where corepack is no longer bundled, Vite+ installs corepack as a managed global package on first use. Only the `corepack` binary is linked; run `vp install -g corepack` yourself if you also want the package's pnpm/yarn launchers exposed directly.
129
+ - If you install corepack explicitly with `vp install -g corepack`, that installation is always preferred.
130
+
131
+ `corepack enable` normally creates `pnpm`/`yarn` launchers next to the corepack binary, which under Vite+ would not be on `PATH`. The shim fixes this by defaulting `--install-directory` to `VP_HOME/bin`, so after `corepack enable` the launchers are available everywhere and still resolve the project's Node.js and package-manager versions:
132
+
133
+ ```bash
134
+ corepack enable # pnpm and yarn now resolve via corepack
135
+ corepack disable # Remove the pnpm/yarn launchers again
136
+ ```
137
+
138
+ The launchers reference the corepack copy that created them. If that copy is later removed (for example by uninstalling the Node.js version it shipped with), rerun `corepack enable` to recreate them.
139
+
140
+ Shims owned by Vite+ (`npm`, `npx`, and binaries installed with `vp install -g`) are protected: if corepack removes or replaces them, Vite+ restores them and prints a warning.
141
+
89
142
  ## Custom Node.js Mirror
90
143
 
91
144
  By default, Vite+ downloads Node.js from `https://nodejs.org/dist`. If you're behind a corporate proxy or need to use an internal mirror (e.g., Artifactory), set the `VP_NODE_DIST_MIRROR` environment variable:
@@ -100,3 +153,15 @@ VP_NODE_DIST_MIRROR=https://my-mirror.example.com/nodejs/dist vp env default lts
100
153
  # Set it permanently in your shell profile (.bashrc, .zshrc, etc.)
101
154
  echo 'export VP_NODE_DIST_MIRROR=https://my-mirror.example.com/nodejs/dist' >> ~/.zshrc
102
155
  ```
156
+
157
+ ## Node.js Signature Verification
158
+
159
+ When installing Node.js from the official `nodejs.org` distribution, Vite+ downloads the PGP-signed `SHASUMS256.txt.asc` and verifies it against the bundled Node.js release keys before trusting any checksum. This protects against a tampered `SHASUMS256.txt` paired with a matching malicious archive. The SHA-256 checksum of the downloaded archive is always verified afterward.
160
+
161
+ Custom mirrors (`VP_NODE_DIST_MIRROR`) that publish only the plain `SHASUMS256.txt` fall back to checksum-only verification. A mirror that does publish a `.asc` still has its signature verified, and an invalid signature is a hard error.
162
+
163
+ If a future keyring or certificate issue blocks downloads, set `VP_NODE_SKIP_SIGNATURE_VERIFY` to temporarily bypass PGP verification. The SHA-256 checksum is still verified, and Vite+ prints a warning when the signature check is skipped:
164
+
165
+ ```bash
166
+ VP_NODE_SKIP_SIGNATURE_VERIFY=1 vp env install 22
167
+ ```