@gadgetinc/ggt 1.7.4 → 2.2.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 (154) hide show
  1. package/README.md +142 -31
  2. package/dist/{add-KJLV4API.js → add-TWLGKL2T.js} +8 -7
  3. package/dist/add-TWLGKL2T.js.map +7 -0
  4. package/dist/agent-plugin-TN24O7FB.js +10 -0
  5. package/dist/agent-plugin-TN24O7FB.js.map +7 -0
  6. package/dist/chunk-2742UPMB.js +10 -0
  7. package/dist/chunk-2742UPMB.js.map +7 -0
  8. package/dist/chunk-3OM5WM7E.js +2 -0
  9. package/dist/chunk-3OM5WM7E.js.map +7 -0
  10. package/dist/chunk-442CSROP.js +66 -0
  11. package/dist/chunk-442CSROP.js.map +7 -0
  12. package/dist/chunk-DR4CXBD6.js +11 -0
  13. package/dist/chunk-DR4CXBD6.js.map +7 -0
  14. package/dist/chunk-F255O64V.js +2 -0
  15. package/dist/chunk-F255O64V.js.map +7 -0
  16. package/dist/chunk-GJGBTM5Y.js +2 -0
  17. package/dist/chunk-GJGBTM5Y.js.map +7 -0
  18. package/dist/chunk-HCULGPBH.js +2 -0
  19. package/dist/chunk-HCULGPBH.js.map +7 -0
  20. package/dist/chunk-J232VCIM.js +2 -0
  21. package/dist/chunk-J232VCIM.js.map +7 -0
  22. package/dist/chunk-JG2QCDK2.js +118 -0
  23. package/dist/chunk-JG2QCDK2.js.map +7 -0
  24. package/dist/chunk-JKZNSRLU.js +8 -0
  25. package/dist/chunk-JKZNSRLU.js.map +7 -0
  26. package/dist/chunk-JYE5LLIF.js +9 -0
  27. package/dist/chunk-JYE5LLIF.js.map +7 -0
  28. package/dist/{chunk-SX5LO3XQ.js → chunk-KKIL22RY.js} +1 -1
  29. package/dist/{chunk-SX5LO3XQ.js.map → chunk-KKIL22RY.js.map} +1 -1
  30. package/dist/chunk-L2XBSR7G.js +2 -0
  31. package/dist/chunk-L2XBSR7G.js.map +7 -0
  32. package/dist/chunk-MW6MXMSN.js +2 -0
  33. package/dist/chunk-MW6MXMSN.js.map +7 -0
  34. package/dist/chunk-OUIZQC4D.js +12 -0
  35. package/dist/chunk-OUIZQC4D.js.map +7 -0
  36. package/dist/chunk-R6KJLEKY.js +28 -0
  37. package/dist/chunk-R6KJLEKY.js.map +7 -0
  38. package/dist/chunk-SIR6HLN3.js +69 -0
  39. package/dist/chunk-SIR6HLN3.js.map +7 -0
  40. package/dist/chunk-SVWK2NXG.js +2 -0
  41. package/dist/chunk-SVWK2NXG.js.map +7 -0
  42. package/dist/chunk-T6UHSWMT.js +2 -0
  43. package/dist/{chunk-J2OYMAMD.js.map → chunk-T6UHSWMT.js.map} +2 -2
  44. package/dist/{chunk-JSGXXXFU.js → chunk-WB6O2V5D.js} +6 -6
  45. package/dist/{chunk-JSGXXXFU.js.map → chunk-WB6O2V5D.js.map} +3 -3
  46. package/dist/chunk-XC4F2TLW.js +113 -0
  47. package/dist/chunk-XC4F2TLW.js.map +7 -0
  48. package/dist/chunk-YFUOXDPK.js +10 -0
  49. package/dist/chunk-YFUOXDPK.js.map +7 -0
  50. package/dist/chunk-ZSREFZXV.js +211 -0
  51. package/dist/chunk-ZSREFZXV.js.map +7 -0
  52. package/dist/chunk-ZYDMXS5R.js +6 -0
  53. package/dist/chunk-ZYDMXS5R.js.map +7 -0
  54. package/dist/{configure-CXY6JQB7.js → configure-UJS7V2JX.js} +2 -2
  55. package/dist/configure-UJS7V2JX.js.map +7 -0
  56. package/dist/debugger-QN2MCLBL.js +41 -0
  57. package/dist/debugger-QN2MCLBL.js.map +7 -0
  58. package/dist/deploy-J74PHPQA.js +25 -0
  59. package/dist/deploy-J74PHPQA.js.map +7 -0
  60. package/dist/dev-GGUSOOYP.js +59 -0
  61. package/dist/dev-GGUSOOYP.js.map +7 -0
  62. package/dist/esm-D77XRR65.js +38 -0
  63. package/dist/esm-D77XRR65.js.map +7 -0
  64. package/dist/eval-L6WHUFLU.js +54 -0
  65. package/dist/eval-L6WHUFLU.js.map +7 -0
  66. package/dist/getMachineId-bsd-QUXN4NKS.js +2 -0
  67. package/dist/getMachineId-bsd-QUXN4NKS.js.map +7 -0
  68. package/dist/getMachineId-darwin-TCXBAX22.js +3 -0
  69. package/dist/getMachineId-darwin-TCXBAX22.js.map +7 -0
  70. package/dist/getMachineId-linux-IJ3LYIOX.js +2 -0
  71. package/dist/getMachineId-linux-IJ3LYIOX.js.map +7 -0
  72. package/dist/getMachineId-unsupported-IKXBUCYY.js +2 -0
  73. package/dist/getMachineId-unsupported-IKXBUCYY.js.map +7 -0
  74. package/dist/getMachineId-win-6CX7VSFF.js +2 -0
  75. package/dist/getMachineId-win-6CX7VSFF.js.map +7 -0
  76. package/dist/ggt-5XNRJZSW.js +44 -0
  77. package/dist/ggt-5XNRJZSW.js.map +7 -0
  78. package/dist/{list-3QZTSHQV.js → list-756D46N5.js} +2 -2
  79. package/dist/list-756D46N5.js.map +7 -0
  80. package/dist/login-GMWQRH7V.js +2 -0
  81. package/dist/{logout-SWWGI27Q.js → logout-LQABTJFD.js} +2 -2
  82. package/dist/logout-LQABTJFD.js.map +7 -0
  83. package/dist/logs-AQZB272X.js +28 -0
  84. package/dist/logs-AQZB272X.js.map +7 -0
  85. package/dist/main.js +1 -43
  86. package/dist/main.js.map +4 -4
  87. package/dist/{open-J2ZVNVJ6.js → open-OMZWPQ66.js} +11 -11
  88. package/dist/open-OMZWPQ66.js.map +7 -0
  89. package/dist/problems-FZJKH52E.js +14 -0
  90. package/dist/problems-FZJKH52E.js.map +7 -0
  91. package/dist/pull-XYCYN7QN.js +28 -0
  92. package/dist/pull-XYCYN7QN.js.map +7 -0
  93. package/dist/push-3QM7ZFTC.js +2 -0
  94. package/dist/status-PWAXNK5G.js +14 -0
  95. package/dist/status-PWAXNK5G.js.map +7 -0
  96. package/dist/update-QIQFJFRQ.js +2 -0
  97. package/dist/update-QIQFJFRQ.js.map +7 -0
  98. package/dist/var-N4WGGJXZ.js +159 -0
  99. package/dist/var-N4WGGJXZ.js.map +7 -0
  100. package/dist/{version-NZHW3VLV.js → version-AJKSJJDC.js} +2 -2
  101. package/dist/version-AJKSJJDC.js.map +7 -0
  102. package/dist/{whoami-MIJFO4MW.js → whoami-KJYDSQSD.js} +2 -2
  103. package/dist/whoami-KJYDSQSD.js.map +7 -0
  104. package/package.json +64 -74
  105. package/dist/add-KJLV4API.js.map +0 -7
  106. package/dist/chunk-24OT7GHO.js +0 -65
  107. package/dist/chunk-24OT7GHO.js.map +0 -7
  108. package/dist/chunk-HN3YKQ3C.js +0 -6
  109. package/dist/chunk-HN3YKQ3C.js.map +0 -7
  110. package/dist/chunk-J2OYMAMD.js +0 -2
  111. package/dist/chunk-JBY5A44K.js +0 -7
  112. package/dist/chunk-JBY5A44K.js.map +0 -7
  113. package/dist/chunk-L5H5T2T6.js +0 -66
  114. package/dist/chunk-L5H5T2T6.js.map +0 -7
  115. package/dist/chunk-M6L2X3GX.js +0 -194
  116. package/dist/chunk-M6L2X3GX.js.map +0 -7
  117. package/dist/chunk-MHTXRD5G.js +0 -2
  118. package/dist/chunk-MHTXRD5G.js.map +0 -7
  119. package/dist/chunk-OIVNACS7.js +0 -12
  120. package/dist/chunk-OIVNACS7.js.map +0 -7
  121. package/dist/chunk-QXWICGG6.js +0 -2
  122. package/dist/chunk-QXWICGG6.js.map +0 -7
  123. package/dist/chunk-WNAYBYSG.js +0 -8
  124. package/dist/chunk-WNAYBYSG.js.map +0 -7
  125. package/dist/chunk-X47UA3VR.js +0 -2
  126. package/dist/chunk-X47UA3VR.js.map +0 -7
  127. package/dist/chunk-XGQQOMPO.js +0 -2
  128. package/dist/chunk-XGQQOMPO.js.map +0 -7
  129. package/dist/chunk-XKYYKHP4.js +0 -28
  130. package/dist/chunk-XKYYKHP4.js.map +0 -7
  131. package/dist/chunk-YU6P3ESA.js +0 -121
  132. package/dist/chunk-YU6P3ESA.js.map +0 -7
  133. package/dist/configure-CXY6JQB7.js.map +0 -7
  134. package/dist/deploy-XFZBJJWP.js +0 -25
  135. package/dist/deploy-XFZBJJWP.js.map +0 -7
  136. package/dist/dev-GG6TU3DJ.js +0 -59
  137. package/dist/dev-GG6TU3DJ.js.map +0 -7
  138. package/dist/esm-PLVGBDRY.js +0 -38
  139. package/dist/esm-PLVGBDRY.js.map +0 -7
  140. package/dist/list-3QZTSHQV.js.map +0 -7
  141. package/dist/login-HKGCVIWO.js +0 -2
  142. package/dist/logout-SWWGI27Q.js.map +0 -7
  143. package/dist/logs-DW4PH3U6.js +0 -28
  144. package/dist/logs-DW4PH3U6.js.map +0 -7
  145. package/dist/open-J2ZVNVJ6.js.map +0 -7
  146. package/dist/pull-ORNQFSFG.js +0 -28
  147. package/dist/pull-ORNQFSFG.js.map +0 -7
  148. package/dist/push-KMZZ6JJL.js +0 -2
  149. package/dist/status-JAREJZ4X.js +0 -14
  150. package/dist/status-JAREJZ4X.js.map +0 -7
  151. package/dist/version-NZHW3VLV.js.map +0 -7
  152. package/dist/whoami-MIJFO4MW.js.map +0 -7
  153. /package/dist/{login-HKGCVIWO.js.map → login-GMWQRH7V.js.map} +0 -0
  154. /package/dist/{push-KMZZ6JJL.js.map → push-3QM7ZFTC.js.map} +0 -0
package/README.md CHANGED
@@ -5,15 +5,9 @@
5
5
  <br>
6
6
  <br>
7
7
 
8
- <a href="https://github.com/gadget-inc/ggt/actions/workflows/ci.yml?query=branch%3Amain">
9
- <img alt="ci workflow status" src="https://img.shields.io/github/actions/workflow/status/gadget-inc/ggt/ci.yml?branch=main&label=ci">
10
- </a>
11
- <a href="https://www.npmjs.com/package/ggt">
12
- <img alt="npm version" src="https://img.shields.io/npm/v/ggt">
13
- </a>
14
- <a href="https://discord.gg/nAfNKMdwKh">
15
- <img alt="discord chat" src="https://img.shields.io/discord/836317518595096598">
16
- </a>
8
+ [![ci/cd workflow status](https://github.com/gadget-inc/ggt/actions/workflows/cd.yml/badge.svg)](https://github.com/gadget-inc/ggt/actions/workflows/cd.yml)
9
+ [![npm version](https://img.shields.io/npm/v/ggt)](https://www.npmjs.com/package/ggt)
10
+ [![discord server](https://img.shields.io/discord/836317518595096598)](https://discord.gg/9d7wjGBZ6M)
17
11
 
18
12
  <br>
19
13
  <br>
@@ -29,16 +23,21 @@
29
23
  - [`ggt dev`](#ggt-dev)
30
24
  - [`ggt deploy`](#ggt-deploy)
31
25
  - [`ggt status`](#ggt-status)
26
+ - [`ggt problems`](#ggt-problems)
32
27
  - [`ggt push`](#ggt-push)
33
28
  - [`ggt pull`](#ggt-pull)
29
+ - [`ggt var`](#ggt-var)
34
30
  - [`ggt add`](#ggt-add)
35
31
  - [`ggt open`](#ggt-open)
36
32
  - [`ggt list`](#ggt-list)
37
33
  - [`ggt login`](#ggt-login)
38
34
  - [`ggt logout`](#ggt-logout)
39
35
  - [`ggt logs`](#ggt-logs)
36
+ - [`ggt debugger`](#ggt-debugger)
40
37
  - [`ggt whoami`](#ggt-whoami)
41
38
  - [`ggt configure`](#ggt-configure)
39
+ - [`ggt agent-plugin`](#ggt-agent-plugin)
40
+ - [`ggt eval`](#ggt-eval)
42
41
  - [`ggt version`](#ggt-version)
43
42
 
44
43
  ## Intro
@@ -71,14 +70,17 @@ Commands
71
70
  status Show your local and environment's file changes
72
71
  push Push your local files to your environment
73
72
  pull Pull your environment's files to your local computer
74
- add Add models, fields, actions and routes to your app
73
+ var Manage environment variables
74
+ add Add models, fields, actions, routes and environments to your app
75
75
  open Open a Gadget location in your browser
76
76
  list List your available applications
77
77
  login Log in to your account
78
78
  logout Log out of your account
79
79
  logs Stream your environment's logs
80
+ debugger Connect to the debugger for your environment
80
81
  whoami Print the currently logged in account
81
82
  configure Configure default execution options
83
+ agent-plugin Install Gadget agent plugins (AGENTS.md + skills)
82
84
  version Print this version of ggt
83
85
 
84
86
  Flags
@@ -86,6 +88,10 @@ Flags
86
88
  -v, --verbose Print more verbose output
87
89
  --telemetry Enable telemetry
88
90
 
91
+ Agent plugins
92
+ Install AGENTS.md and Gadget agent skills for your coding agent:
93
+ ggt agent-plugin install
94
+
89
95
  Run "ggt [COMMAND] -h" for more information about a specific command.
90
96
  ```
91
97
 
@@ -108,11 +114,11 @@ Usage
108
114
  DIRECTORY: The directory to sync files to (default: the current directory)
109
115
 
110
116
  Options
111
- -a, --app <app_name> Selects the app to sync files with. Default set on ".gadget/sync.json"
112
- -e, --env <env_name> Selects the environment to sync files with. Default set on ".gadget/sync.json"
117
+ -a, --app <app_name> Selects the app to sync files with. Defaults to the app synced to the current directory, if there is one.
118
+ -e, --env <env_name> Selects the environment to sync files with. Defaults to the environment synced to the current directory, if there is one.
113
119
  --prefer <source> Auto-select changes from 'local' or 'environment' source on conflict
114
- --allow-unknown-directory Syncs to any local directory with existing files, even if the ".gadget/sync.json" file is missing
115
- --allow-different-app Syncs with a different app using the --app command, instead of the one specified in the .gadget/sync.json file
120
+ --allow-unknown-directory Syncs to any local directory with existing files, even if the directory hasn't been synced before
121
+ --allow-different-app Syncs with a different app using the --app command, instead of the most recently synced one in the current directory
116
122
  --log-level <level> Sets the log level for incoming application logs (default: info)
117
123
  --no-logs Disables outputting application logs to the console
118
124
  --my-logs Only outputs user sourced logs
@@ -157,11 +163,11 @@ Usage
157
163
  $ ggt deploy [options]
158
164
 
159
165
  Options
160
- -a, --app <app_name> Selects a specific app to deploy. Default set on ".gadget/sync.json"
161
- --from, -e, --env <env_name> Selects a specific environment to sync and deploy from. Default set on ".gadget/sync.json"
166
+ -a, --app <app_name> Selects a specific app to deploy. Defaults to the app synced to the current directory, if there is one.
167
+ --from, -e, --env <env_name> Selects a specific environment to sync and deploy from. Defaults to the environment synced to the current directory, if there is one.
162
168
  --force Deploys by discarding any changes made to the environment directory since last sync
163
- --allow-different-directory Deploys from any local directory with existing files, even if the ".gadget/sync.json" file is missing
164
- --allow-different-app Deploys a different app using the --app command, instead of the one specified in the “.gadget/sync.json” file
169
+ --allow-different-directory Deploys from any local directory with existing files, even if the directory hasn't been synced before
170
+ --allow-different-app Deploys a different app using the --app command, instead of the most recently synced one in the current directory
165
171
  --allow-problems Deploys despite any existing issues found in the app (gelly errors, typescript errors etc.)
166
172
  --allow-data-delete Deploys even if it results in the deletion of data in production
167
173
  --allow-charges Deploys even if it results in additional charges to your plan
@@ -181,6 +187,16 @@ Usage
181
187
  ggt status
182
188
  ```
183
189
 
190
+ ### `ggt problems`
191
+
192
+ ```sh-session
193
+ $ ggt problems -h
194
+ Shows any problems (errors, warnings) found in your Gadget application.
195
+
196
+ Usage
197
+ ggt problems
198
+ ```
199
+
184
200
  ### `ggt push`
185
201
 
186
202
  ```sh-session
@@ -194,11 +210,11 @@ Usage
194
210
  ggt push [options]
195
211
 
196
212
  Options
197
- -a, --app <app_name> Selects the app to push local changes to. Default set on ".gadget/sync.json"
198
- -e, --env, --to <env_name> Selects the environment to push local changes to. Default set on ".gadget/sync.json"
213
+ -a, --app <app_name> Selects the app to push local changes to. Defaults to the app synced to the current directory, if there is one.
214
+ -e, --env, --to <env_name> Selects the environment to push local changes to. Defaults to the environment synced to the current directory, if there is one.
199
215
  --force Forces a push by discarding any changes made on your environment directory since last sync
200
- --allow-different-directory Pushes changes from any local directory with existing files, even if the ".gadget/sync.json" file is missing
201
- --allow-different-app Pushes changes to an app using --app command, instead of the one in the “.gadget/sync.json” file
216
+ --allow-different-directory Pushes changes from any local directory with existing files, even if the directory hasn't been synced before
217
+ --allow-different-app Pushes changes to an app using --app command, instead of the most recently synced one in the current directory
202
218
 
203
219
  Examples
204
220
  Push all local changes to the main environment by discarding any changes made on main
@@ -218,17 +234,40 @@ Usage
218
234
  ggt pull [options]
219
235
 
220
236
  Options
221
- -a, --app <app_name> Selects the app to pull your environment changes from. Default set on ".gadget/sync.json"
222
- -e, --env, --from <env_name> Selects the environment to pull changes from. Default set on ".gadget/sync.json"
237
+ -a, --app <app_name> Selects the app to pull your environment changes from. Defaults to the app synced to the current directory, if there is one.
238
+ -e, --env, --from <env_name> Selects the environment to pull changes from. Defaults to the environment synced to the current directory, if there is one.
223
239
  --force Forces a pull by discarding any changes made on your local directory since last sync
224
- --allow-different-directory Pulls changes from any environment directory, even if the ".gadget/sync.json" file is missing
225
- --allow-different-app Pulls changes to a different app using --app command, instead of the one in the “.gadget/sync.json” file
240
+ --allow-different-directory Pulls changes from any environment directory, even if the directory hasn't been synced before
241
+ --allow-different-app Pulls changes to a different app using --app command, instead of the most recently synced one in the current directory
226
242
 
227
243
  Examples
228
244
  Pull all development environment changes by discarding any changes made locally
229
245
  $ ggt pull --env development --force
230
246
  ```
231
247
 
248
+ ### `ggt var`
249
+
250
+ ```sh-session
251
+ $ ggt var -h
252
+ Manage environment variables for your Gadget application.
253
+
254
+ Usage
255
+ ggt var <command> [options]
256
+
257
+ Commands
258
+ list List all environment variables
259
+ get <key> Get the value of an environment variable
260
+ set <key=value> Set one or more environment variables
261
+ delete <key> Delete one or more environment variables
262
+ import Import environment variables from another environment or file
263
+
264
+ Options
265
+ -a, --app <app_name> Selects the application
266
+ -e, --env <env_name> Selects the environment
267
+
268
+ Run "ggt var <command> -h" for more information about a specific command.
269
+ ```
270
+
232
271
  ### `ggt add`
233
272
 
234
273
  ```sh-session
@@ -249,7 +288,8 @@ Usage
249
288
  ggt add field <model_path>/<field_name>:<field_type>
250
289
 
251
290
  Options
252
- -e, --env <env_name> Selects the environment to add to. Default set on ".gadget/sync.json"
291
+ -a, --app <app_name> Selects the app to add to. Defaults to the app synced to the current directory, if there is one.
292
+ -e, --env <env_name> Selects the environment to add to. Defaults to the environment synced to the current directory, if there is one.
253
293
 
254
294
  Examples
255
295
  Add a new model 'post' with out fields:
@@ -293,8 +333,8 @@ Usage
293
333
  + schema Opens schema editor for a specific model
294
334
 
295
335
  Options
296
- -a, --app <app_name> Selects the application to open in your browser. Default set on ".gadget/sync.json"
297
- -e, --env <env_name> Selects the environment to open in your browser. Default set on ".gadget/sync.json"
336
+ -a, --app <app_name> Selects the application to open in your browser. Defaults to the app synced to the current directory, if there is one.
337
+ -e, --env <env_name> Selects the environment to open in your browser. Defaults to the environment synced to the current directory, if there is one.
298
338
  --show-all Shows all schema, or data options by listing your available models
299
339
 
300
340
  Examples
@@ -366,8 +406,8 @@ Options
366
406
  -ll, --log-level <level> Sets the log level for incoming application logs (default: info)
367
407
  --my-logs Only outputs user sourced logs and exclude logs from the Gadget framework
368
408
  --json Output logs in JSON format
369
- -a, --app <app_name> Selects the app to pull your environment changes from. Default set on ".gadget/sync.json"
370
- -e, --env, --from <env_name> Selects the environment to pull changes from. Default set on ".gadget/sync.json"
409
+ -a, --app <app_name> Selects the app to pull your environment changes from. Defaults to the app synced to the current directory, if there is one.
410
+ -e, --env, --from <env_name> Selects the environment to pull changes from. Defaults to the environment synced to the current directory, if there is one.
371
411
 
372
412
  Examples
373
413
  Stream all user logs from your development environment
@@ -377,6 +417,39 @@ Examples
377
417
  $ ggt logs --env production --json
378
418
  ```
379
419
 
420
+ ### `ggt debugger`
421
+
422
+ ```sh-session
423
+ $ ggt debugger -h
424
+ Start a Chrome DevTools Protocol proxy server that connects to the Gadget debugger.
425
+ This allows you to debug your Gadget app using VS Code, Chrome DevTools, or any other
426
+ CDP-compatible debugger client.
427
+
428
+ Usage
429
+ $ ggt debugger [DIRECTORY] [options]
430
+
431
+ DIRECTORY: The directory containing your Gadget app (default: current directory)
432
+
433
+ Options
434
+ -a, --app <app_name> Selects the app to debug. Defaults to the app synced to the current directory, if there is one.
435
+ -e, --env <env_name> Selects the environment to debug. Defaults to the environment synced to the current directory, if there is one.
436
+ -p, --port <port> Local port for the inspector proxy (default: 9229)
437
+ --configure <editor> Configure debugger for vscode, cursor
438
+
439
+ Examples
440
+ start debugger proxy for current environment
441
+ $ ggt debugger
442
+
443
+ use a custom port
444
+ $ ggt debugger --port 9230
445
+
446
+ debug a specific app and environment
447
+ $ ggt debugger --app myApp --env development
448
+
449
+ configure VS Code debugger
450
+ $ ggt debugger --configure vscode
451
+ ```
452
+
380
453
  ### `ggt whoami`
381
454
 
382
455
  ```sh-session
@@ -402,6 +475,44 @@ Usage
402
475
  ggt configure clear
403
476
  ```
404
477
 
478
+ ### `ggt agent-plugin`
479
+
480
+ ```sh-session
481
+ $ ggt agent-plugin -h
482
+ Install Gadget agent plugins (AGENTS.md + skills) into the current project.
483
+
484
+ Usage
485
+ ggt agent-plugin install [--force]
486
+
487
+ Flags
488
+ --force Overwrite/reinstall even if already present
489
+ ```
490
+
491
+ ### `ggt eval`
492
+
493
+ ```sh-session
494
+ $ ggt eval -h
495
+ Evaluates a JavaScript snippet against a Gadget app's API client.
496
+
497
+ The snippet receives an api variable (a pre-constructed Gadget API client
498
+ authenticated as the developer). Results are formatted like Node.js REPL output.
499
+ Writes are disallowed by default; use --allow-writes to enable them.
500
+
501
+ Usage
502
+ $ ggt eval [options] <snippet>
503
+
504
+ Options
505
+ -a, --app <app_name> Selects a specific app. Defaults to the app synced to the current directory, if there is one.
506
+ -e, --env <env_name> Selects a specific environment. Defaults to the environment synced to the current directory, if there is one.
507
+ -w, --allow-writes Allow write operations (default is read-only)
508
+ --json Output result as JSON instead of Node.js inspect format (root flag)
509
+
510
+ Examples
511
+ $ ggt eval 'api.user.findMany()'
512
+ $ ggt eval --app my-app --env staging 'api.user.findFirst()'
513
+ $ ggt eval -a my-app -w 'api.user.delete("123")'
514
+ ```
515
+
405
516
  ### `ggt version`
406
517
 
407
518
  ```sh-session
@@ -1,4 +1,4 @@
1
- import{f as O,g as R,h as M,i as j,j as k,k as P,p as b}from"./chunk-M6L2X3GX.js";import{g as N,m as D,n as _,o as E}from"./chunk-YU6P3ESA.js";import"./chunk-JSGXXXFU.js";import"./chunk-WNAYBYSG.js";import{c as f}from"./chunk-J2OYMAMD.js";import{a as J}from"./chunk-JBY5A44K.js";import"./chunk-HN3YKQ3C.js";import{B as U,C as L,a as T,e as C,f as S,l as B,n as y}from"./chunk-L5H5T2T6.js";import"./chunk-X47UA3VR.js";import{b as w}from"./chunk-XGQQOMPO.js";import"./chunk-OIVNACS7.js";import{b as m,ha as d,ja as p,n as F}from"./chunk-24OT7GHO.js";import"./chunk-GFQYFEEH.js";import{a as g,h as $}from"./chunk-7DYQUG5M.js";$();var h=class extends S{static{g(this,"AddClientError")}isBug=C.NO;constructor(o){let i="";if(F(o.cause)){let a=B(o.cause.map(e=>e.message));i=d` • ${a.map(e=>e.split(`
1
+ import{e as j,j as b}from"./chunk-SIR6HLN3.js";import"./chunk-JKZNSRLU.js";import"./chunk-WB6O2V5D.js";import"./chunk-L2XBSR7G.js";import{h as O,i as R,j as M,k,l as J}from"./chunk-ZSREFZXV.js";import{g as N,p as D,q as _,r as E}from"./chunk-XC4F2TLW.js";import{c as f}from"./chunk-T6UHSWMT.js";import{a as P}from"./chunk-DR4CXBD6.js";import"./chunk-ZYDMXS5R.js";import{F as U,G as L,a as T,e as C,f as S,l as B,n as y}from"./chunk-442CSROP.js";import"./chunk-F255O64V.js";import{c as w}from"./chunk-HCULGPBH.js";import"./chunk-OUIZQC4D.js";import{b as m,o as F,ra as d,ta as p}from"./chunk-JG2QCDK2.js";import"./chunk-GFQYFEEH.js";import{a as g,h as $}from"./chunk-7DYQUG5M.js";$();var h=class extends S{static{g(this,"AddClientError")}isBug=C.NO;constructor(o){let i="";if(F(o.cause)){let a=B(o.cause.map(e=>e.message));i=d` • ${a.map(e=>e.split(`
2
2
  `).join(`
3
3
  \u200E \u2022 `)).join(`
4
4
  `)}`}else i=d`${o.cause}`;super(i)}render(){return`${m.redBright(w.cross)} Failed to add:
@@ -19,7 +19,8 @@ import{f as O,g as R,h as M,i as j,j as k,k as P,p as b}from"./chunk-M6L2X3GX.js
19
19
  ggt add field <model_path>/<field_name>:<field_type>
20
20
 
21
21
  {gray Options}
22
- -e, --env <env_name> Selects the environment to add to. Default set on ".gadget/sync.json"
22
+ -a, --app <app_name> Selects the app to add to. Defaults to the app synced to the current directory, if there is one.
23
+ -e, --env <env_name> Selects the environment to add to. Defaults to the environment synced to the current directory, if there is one.
23
24
 
24
25
  {gray Examples}
25
26
  Add a new model 'post' with out fields:
@@ -42,7 +43,7 @@ import{f as O,g as R,h as M,i as j,j as k,k as P,p as b}from"./chunk-M6L2X3GX.js
42
43
 
43
44
  Clone the \`development\` environment into a new \`staging\` environment
44
45
  {cyanBright ggt add environment staging --environment development}
45
- `,"usage"),fe=g(async(t,o)=>{let i=await E(process.cwd()),a=await _.load(t,{command:"add",args:o,directory:i});if(!a)throw new N({command:"add",args:o,directory:i});let e=new b(a),r=await e.hashes(t,{silent:!0});switch(r.inSync||await e.merge(t,{hashes:r,printEnvironmentChangesOptions:{limit:5},printLocalChangesOptions:{limit:5},silent:!0}),p({ensureEmptyLineAbove:!0,content:`${m.greenBright(w.tick)} Sync completed ${P()}`}),o._[0]){case"model":await H(t,{args:o,filesync:e});break;case"action":await X(t,{args:o,filesync:e});break;case"route":await z(t,{args:o,filesync:e});break;case"field":await q(t,{args:o,filesync:e});break;case"environment":case"env":await Q(t,{args:o,filesync:e});break;default:p(G(t));return}},"run"),I=g(t=>{let o=[],i=[];return t.forEach(a=>{let e=/^(.*):+(.*)$/.exec(a);!e||e.length!==3||!e[1]||!e[2]?o.push(d`${a} is not a valid field definition`):i.push({name:e[1].replace(/:+/g,""),fieldType:e[2]})}),[i,o]},"parseFieldValues"),H=g(async(t,{args:o,filesync:i})=>{let a=i.syncJson,e=o._[1];if(!e)throw new f(d`Failed to add model, missing model path
46
+ `,"usage"),fe=g(async(t,o)=>{let i=await E(process.cwd()),a=await _.load(t,{command:"add",args:o,directory:i});if(!a)throw new N({command:"add",args:o,directory:i});let e=new b(a),r=await e.hashes(t,{silent:!0});switch(r.inSync||await e.merge(t,{hashes:r,printEnvironmentChangesOptions:{limit:5},printLocalChangesOptions:{limit:5},silent:!0}),p({ensureEmptyLineAbove:!0,content:`${m.greenBright(w.tick)} Sync completed ${j()}`}),o._[0]){case"model":await H(t,{args:o,filesync:e});break;case"action":await X(t,{args:o,filesync:e});break;case"route":await z(t,{args:o,filesync:e});break;case"field":await q(t,{args:o,filesync:e});break;case"environment":case"env":await Q(t,{args:o,filesync:e});break;default:p(G(t));return}},"run"),I=g(t=>{let o=[],i=[];return t.forEach(a=>{let e=/^(.*):+(.*)$/.exec(a);!e||e.length!==3||!e[1]||!e[2]?o.push(d`${a} is not a valid field definition`):i.push({name:e[1].replace(/:+/g,""),fieldType:e[2]})}),[i,o]},"parseFieldValues"),H=g(async(t,{args:o,filesync:i})=>{let a=i.syncJson,e=o._[1];if(!e)throw new f(d`Failed to add model, missing model path
46
47
 
47
48
  {gray Usage}
48
49
  {cyanBright ggt add model <model_name> [field_name:field_type ...]}`);let r=[];if(o._.length>2){let[c,u]=I(o._.slice(2));if(u.length>0)throw new f(d`
@@ -55,7 +56,7 @@ import{f as O,g as R,h as M,i as j,j as k,k as P,p as b}from"./chunk-M6L2X3GX.js
55
56
 
56
57
  {gray Usage}
57
58
  {cyanBright ggt add action [CONTEXT]/<action_name>
58
- CONTEXT:Specifies the kind of action. Use "model" for model actions otherwise use "action".}`);let r=await U(t,a.environment),n=await L(t,a.environment),s=e.split("/"),c,u=s.length>1?s.slice(0,s.length-1):s,A=s[s.length-1],V=r.find(l=>{let v=u[u.length-1];return l.apiIdentifier.toUpperCase()===v?.toUpperCase()&&l.namespace?.join("/")===u.slice(0,u.length-1).join("/")}),x=n.find(l=>l.namespace?.join("/")===u.join("/"));if(V&&x){let l=u.join("/");c=await J({choices:["models","actions"],content:d`
59
+ CONTEXT:Specifies the kind of action. Use "model" for model actions otherwise use "action".}`);let r=await U(t,a.environment),n=await L(t,a.environment),s=e.split("/"),c,u=s.length>1?s.slice(0,s.length-1):s,A=s[s.length-1],V=r.find(l=>{let v=u[u.length-1];return l.apiIdentifier.toUpperCase()===v.toUpperCase()&&l.namespace?.join("/")===u.slice(0,u.length-1).join("/")}),x=n.find(l=>l.namespace?.join("/")===u.join("/"));if(V&&x){let l=u.join("/");c=await P({choices:["models","actions"],content:d`
59
60
  {bold Namespace Conflict:} The action '${A}.js' cannot be automatically added due to a namespace conflict.
60
61
 
61
62
  How would you like to proceed?:
@@ -65,7 +66,7 @@ import{f as O,g as R,h as M,i as j,j as k,k as P,p as b}from"./chunk-M6L2X3GX.js
65
66
  {cyanBright ggt add route <HTTP_METHOD> <route_path>}`);if(!r)throw new f(d`Failed to add route, missing route path
66
67
 
67
68
  {gray Usage}
68
- {cyanBright ggt add route ${e} <route_path>}`);try{let n=(await a.edit.mutate({mutation:M,variables:{method:e,path:r}})).createRoute;await i.writeToLocalFilesystem(t,{filesVersion:n.remoteFilesVersion,files:n.changed,delete:[]})}catch(n){throw n instanceof y?new h(n):n}p({ensureEmptyLineAbove:!0,content:`Route ${m.cyanBright(r)} added successfully.`})},"routeSubCommand"),q=g(async(t,{args:o,filesync:i})=>{let a=i.syncJson,e=o._[1]?.split("/");if(!e)throw new f(d`Failed to add field, invalid field path definition
69
+ {cyanBright ggt add route ${e} <route_path>}`);try{let n=(await a.edit.mutate({mutation:M,variables:{method:e,path:r}})).createRoute;await i.writeToLocalFilesystem(t,{filesVersion:n.remoteFilesVersion,files:n.changed,delete:[]})}catch(n){throw n instanceof y?new h(n):n}p({ensureEmptyLineAbove:!0,content:`Route ${m.cyanBright(r)} added successfully.`})},"routeSubCommand"),q=g(async(t,{args:o,filesync:i})=>{let a=i.syncJson,e=o._.at(1)?.split("/");if(!e)throw new f(d`Failed to add field, invalid field path definition
69
70
 
70
71
  {gray Usage}
71
72
  {cyanBright ggt add field <model_path>/<field_name>:<field_type>}`);let r=[];if(e[1]){let[n,s]=I([e[1]]);if(s.length>0)throw new f(d`
@@ -77,5 +78,5 @@ import{f as O,g as R,h as M,i as j,j as k,k as P,p as b}from"./chunk-M6L2X3GX.js
77
78
  {cyanBright ggt add field ${e[0]}/<field_name>:<field_type>}`);r.push(...n)}else throw new f(d`Failed to add field, invalid field definition
78
79
 
79
80
  {gray Usage}
80
- {cyanBright ggt add field ${e[0]}/<field_name>:<field_type>}`);try{let n=(await a.edit.mutate({mutation:j,variables:{path:e[0],fields:r.map(s=>({name:s.name,fieldType:s.fieldType}))}})).createModelFields;await i.writeToLocalFilesystem(t,{filesVersion:n.remoteFilesVersion,files:n.changed,delete:[]})}catch(n){throw n instanceof y?new h(n):n}p({ensureEmptyLineAbove:!0,content:`Field ${m.cyanBright(r[0]?.name)} added successfully.`})},"fieldSubCommand"),Q=g(async(t,{args:o,filesync:i})=>{let a=i.syncJson,e=o._[1]??Y();try{await a.edit.mutate({mutation:k,variables:{environment:{slug:e,sourceSlug:a.environment.name}}})}catch(n){throw n instanceof y?new h(n):n}if(p({ensureEmptyLineAbove:!0,content:`Environment ${m.cyanBright(e)} added successfully.`}),await _.load(t,{command:"pull",args:{_:[],"--app":void 0,"--allow-unknown-directory":void 0,"--allow-different-app":void 0,"--env":e},directory:await E(process.cwd())})){let n=new b(a),s=await n.hashes(t);if(s.environmentChangesToPull.size===0){p({ensureEmptyLineAbove:!0,content:"Nothing to pull."});return}s.localChangesToPush.size>0&&await n.print(t,{hashes:s}),await n.pull(t,{hashes:s,force:!0})}},"envSubCommand"),Y=g(()=>{let t=new Date;return`env-${t.toISOString().slice(0,10).replace(/-/g,"")}-${t.toLocaleTimeString("en-US",{hour12:!1}).replace(/:/g,"")}`},"makeDefaultEnvName");export{h as AddClientError,ue as args,fe as run,G as usage};
81
- //# sourceMappingURL=add-KJLV4API.js.map
81
+ {cyanBright ggt add field ${e[0]}/<field_name>:<field_type>}`);try{let n=(await a.edit.mutate({mutation:k,variables:{path:e[0],fields:r.map(s=>({name:s.name,fieldType:s.fieldType}))}})).createModelFields;await i.writeToLocalFilesystem(t,{filesVersion:n.remoteFilesVersion,files:n.changed,delete:[]})}catch(n){throw n instanceof y?new h(n):n}p({ensureEmptyLineAbove:!0,content:`Field ${m.cyanBright(r[0]?.name)} added successfully.`})},"fieldSubCommand"),Q=g(async(t,{args:o,filesync:i})=>{let a=i.syncJson,e=o._[1]??Y();try{await a.edit.mutate({mutation:J,variables:{environment:{slug:e,sourceSlug:a.environment.name}}})}catch(n){throw n instanceof y?new h(n):n}if(p({ensureEmptyLineAbove:!0,content:`Environment ${m.cyanBright(e)} added successfully.`}),await _.load(t,{command:"pull",args:{_:[],"--app":void 0,"--allow-unknown-directory":void 0,"--allow-different-app":void 0,"--env":e},directory:await E(process.cwd())})){let n=new b(a),s=await n.hashes(t);if(s.environmentChangesToPull.size===0){p({ensureEmptyLineAbove:!0,content:"Nothing to pull."});return}s.localChangesToPush.size>0&&await n.print(t,{hashes:s}),await n.pull(t,{hashes:s,force:!0})}},"envSubCommand"),Y=g(()=>{let t=new Date;return`env-${t.toISOString().slice(0,10).replace(/-/g,"")}-${t.toLocaleTimeString("en-US",{hour12:!1}).replace(/:/g,"")}`},"makeDefaultEnvName");export{h as AddClientError,ue as args,fe as run,G as usage};
82
+ //# sourceMappingURL=add-TWLGKL2T.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/add.ts"],
4
+ "sourcesContent": ["import chalk from \"chalk\";\nimport terminalLink from \"terminal-link\";\n\nimport type { Run, Usage } from \"../services/command/command.js\";\nimport type { Context } from \"../services/command/context.js\";\n\nimport { getGlobalActions, getModels } from \"../services/app/app.js\";\nimport {\n CREATE_ACTION_MUTATION,\n CREATE_ENVIRONMENT_MUTATION,\n CREATE_MODEL_FIELDS_MUTATION,\n CREATE_MODEL_MUTATION,\n CREATE_ROUTE_MUTATION,\n} from \"../services/app/edit/operation.js\";\nimport { ClientError } from \"../services/app/error.js\";\nimport { ArgError, type ArgsDefinitionResult } from \"../services/command/arg.js\";\nimport { UnknownDirectoryError } from \"../services/filesync/error.js\";\nimport { FileSync } from \"../services/filesync/filesync.js\";\nimport { SyncJson, SyncJsonArgs, loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { println } from \"../services/output/print.js\";\nimport { GGTError, IsBug } from \"../services/output/report.js\";\nimport { select } from \"../services/output/select.js\";\nimport { sprint } from \"../services/output/sprint.js\";\nimport { symbol } from \"../services/output/symbols.js\";\nimport { ts } from \"../services/output/timestamp.js\";\nimport { uniq } from \"../services/util/collection.js\";\nimport { isGraphQLErrors } from \"../services/util/is.js\";\n\nexport class AddClientError extends GGTError {\n isBug = IsBug.NO;\n\n constructor(error: ClientError) {\n let template = \"\";\n\n if (isGraphQLErrors(error.cause)) {\n const errors = uniq(error.cause.map((x) => x.message));\n\n template = sprint` \u2022 ${errors.map((e) => e.split(\"\\n\").join(\"\\n\u200E \u2022 \")).join(\"\\n\")}`; // Why in gods name do I have to put an empty character for the tab to work?\n } else {\n template = sprint`${error.cause}`;\n }\n\n super(template);\n }\n\n protected override render(): string {\n return `${chalk.redBright(symbol.cross)} Failed to add:\\n ` + this.message;\n }\n}\n\nexport type AddArgs = typeof args;\nexport type AddArgsResult = ArgsDefinitionResult<AddArgs>;\n\nexport const args = { ...SyncJsonArgs };\n\nexport const usage: Usage = () => {\n return sprint`\n Adds models, fields, actions and routes to your app.\n\n This command first performs a sync to ensure that your local and environment directories match, changes are tracked since last sync.\n If any conflicts are detected, they must be resolved before adding models, fields, actions or routes.\n\n {gray Usage}\n ggt add model <model_name> [field_name:field_type ...]\n\n ggt add action [CONTEXT]/<action_name>\n CONTEXT:Specifies the kind of action. Use \"model\" for model actions otherwise use \"action\".\n\n ggt add route <HTTP_METHOD> <route_path>\n\n ggt add field <model_path>/<field_name>:<field_type>\n\n {gray Options}\n -a, --app <app_name> Selects the app to add to. Defaults to the app synced to the current directory, if there is one.\n -e, --env <env_name> Selects the environment to add to. Defaults to the environment synced to the current directory, if there is one.\n\n {gray Examples}\n Add a new model 'post' with out fields:\n {cyanBright $ ggt add model modelA}\n\n Add a new model 'post' with 2 new 'string' type fields 'title' and 'body':\n {cyanBright $ ggt add model post title:string body:string}\n\n Add a new 'boolean' type field 'published' to an existing model\n {cyanBright ggt add field post/published:boolean}\n\n Add new action 'publish' to the 'post' model:\n {cyanBright ggt add action model/post/publish}\n\n Add a new action 'audit'\n {cyanBright ggt add action action/audit}\n\n Add a new route 'howdy'\n {cyanBright ggt add route GET howdy}\n\n Clone the \\`development\\` environment into a new \\`staging\\` environment\n {cyanBright ggt add environment staging --environment development}\n `;\n};\n\nexport const run: Run<AddArgs> = async (ctx, args) => {\n const directory = await loadSyncJsonDirectory(process.cwd());\n const syncJson = await SyncJson.load(ctx, { command: \"add\", args, directory });\n if (!syncJson) {\n throw new UnknownDirectoryError({ command: \"add\", args, directory });\n }\n\n const filesync = new FileSync(syncJson);\n const hashes = await filesync.hashes(ctx, { silent: true });\n\n if (!hashes.inSync) {\n await filesync.merge(ctx, {\n hashes,\n printEnvironmentChangesOptions: { limit: 5 },\n printLocalChangesOptions: { limit: 5 },\n silent: true,\n });\n }\n\n println({ ensureEmptyLineAbove: true, content: `${chalk.greenBright(symbol.tick)} Sync completed ${ts()}` });\n\n switch (args._[0]) {\n case \"model\":\n await modelSubCommand(ctx, { args, filesync });\n break;\n case \"action\":\n await actionSubCommand(ctx, { args, filesync });\n break;\n case \"route\":\n await routeSubCommand(ctx, { args, filesync });\n break;\n case \"field\":\n await fieldSubCommand(ctx, { args, filesync });\n break;\n case \"environment\":\n case \"env\":\n await envSubCommand(ctx, { args, filesync });\n break;\n default:\n println(usage(ctx));\n return;\n }\n};\n\nconst parseFieldValues = (fields: string[]): [{ name: string; fieldType: string }[], problems: string[]] => {\n const problems: string[] = [];\n const modelFields: { name: string; fieldType: string }[] = [];\n\n fields.forEach((field) => {\n const matches = /^(.*):+(.*)$/.exec(field);\n if (!matches || matches.length !== 3 || !matches[1] || !matches[2]) {\n problems.push(sprint`${field} is not a valid field definition`);\n } else {\n modelFields.push({ name: matches[1].replace(/:+/g, \"\"), fieldType: matches[2] });\n }\n });\n\n return [modelFields, problems];\n};\n\nconst modelSubCommand = async (ctx: Context, { args, filesync }: { args: AddArgsResult; filesync: FileSync }): Promise<void> => {\n const syncJson = filesync.syncJson;\n const modelApiIdentifier = args._[1];\n\n if (!modelApiIdentifier) {\n throw new ArgError(sprint`Failed to add model, missing model path\n\n {gray Usage}\n {cyanBright ggt add model <model_name> [field_name:field_type ...]}`);\n }\n\n const modelFieldsList: { name: string; fieldType: string }[] = [];\n if (args._.length > 2) {\n const [modelFields, problems] = parseFieldValues(args._.slice(2));\n\n if (problems.length > 0) {\n throw new ArgError(sprint`\n Failed to add model:\n \u2022 ${problems.join(\"\\n \u2022 \")}\n\n {gray Usage}\n {cyanBright ggt add model ${modelApiIdentifier} [field_name:field_type ...]}`);\n }\n\n modelFieldsList.push(...modelFields);\n }\n\n let result;\n\n try {\n result = (\n await syncJson.edit.mutate({\n mutation: CREATE_MODEL_MUTATION,\n variables: {\n path: modelApiIdentifier,\n fields: modelFieldsList.map((fields) => ({ name: fields.name, fieldType: fields.fieldType })),\n },\n })\n ).createModel;\n } catch (error) {\n if (error instanceof ClientError) {\n throw new AddClientError(error);\n } else {\n throw error;\n }\n }\n\n println({ ensureEmptyLineAbove: true, content: chalk.gray(\"New model created in environment.\") });\n\n await filesync.writeToLocalFilesystem(ctx, { filesVersion: result.remoteFilesVersion, files: result.changed, delete: [] });\n\n const modelPrintout = terminalLink.isSupported\n ? terminalLink(\n modelApiIdentifier,\n `https://${syncJson.environment.application.primaryDomain}/edit/${syncJson.environment.name}/model/${modelApiIdentifier}/schema`,\n )\n : modelApiIdentifier;\n\n println({\n ensureEmptyLineAbove: true,\n content: `${chalk.greenBright(symbol.tick)} Model ${chalk.cyanBright(modelPrintout)} added successfully.`,\n });\n};\n\nconst actionSubCommand = async (ctx: Context, { args, filesync }: { args: AddArgsResult; filesync: FileSync }): Promise<void> => {\n const syncJson = filesync.syncJson;\n const path = args._[1];\n\n if (!path) {\n throw new ArgError(sprint`Failed to add action, missing action path\n\n {gray Usage}\n {cyanBright ggt add action [CONTEXT]/<action_name>\n CONTEXT:Specifies the kind of action. Use \"model\" for model actions otherwise use \"action\".}`);\n }\n\n const models = await getModels(ctx, syncJson.environment);\n const globalActions = await getGlobalActions(ctx, syncJson.environment);\n const splitPath = path.split(\"/\");\n\n let overrideContextAction: \"models\" | \"actions\" | undefined;\n\n const parsedPaths = splitPath.length > 1 ? splitPath.slice(0, splitPath.length - 1) : splitPath;\n const parsedAction = splitPath[splitPath.length - 1];\n\n const conflictingModel = models.find((model) => {\n const modelName = parsedPaths[parsedPaths.length - 1];\n\n return (\n model.apiIdentifier.toUpperCase() === modelName.toUpperCase() &&\n model.namespace?.join(\"/\") === parsedPaths.slice(0, parsedPaths.length - 1).join(\"/\")\n );\n });\n\n const conflictingActionNamespace = globalActions.find((action) => {\n return action.namespace?.join(\"/\") === parsedPaths.join(\"/\");\n });\n\n if (conflictingModel && conflictingActionNamespace) {\n const joinedParsedPaths = parsedPaths.join(\"/\");\n overrideContextAction = await select({\n choices: [\"models\", \"actions\"] as const,\n content: sprint`\n {bold Namespace Conflict:} The action '${parsedAction}.js' cannot be automatically added due to a namespace conflict.\n\n How would you like to proceed?:\n `,\n formatChoice: (choice) => {\n switch (choice) {\n case \"models\": {\n return `As a Model action in ${chalk.gray(`models/${joinedParsedPaths}/${parsedAction}.js`)}`;\n }\n case \"actions\": {\n return `As an Action in ${chalk.gray(`actions/${joinedParsedPaths}/${parsedAction}.js`)}`;\n }\n }\n },\n });\n\n println({\n ensureEmptyLineAbove: true,\n content: sprint`${chalk.yellowBright(symbol.info)} You can override the context of the action by specifying the context in the path. For example: {gray ggt add action ${overrideContextAction}/${path}}`,\n });\n }\n\n try {\n const result = (\n await syncJson.edit.mutate({\n mutation: CREATE_ACTION_MUTATION,\n variables: { path: overrideContextAction ? `${overrideContextAction}/` + path : path },\n })\n ).createAction;\n\n await filesync.writeToLocalFilesystem(ctx, { filesVersion: result.remoteFilesVersion, files: result.changed, delete: [] });\n } catch (error) {\n if (error instanceof ClientError) {\n throw new AddClientError(error);\n } else {\n throw error;\n }\n }\n\n println({ ensureEmptyLineAbove: true, content: `Action ${chalk.cyanBright(path)} added successfully.` });\n};\n\nconst routeSubCommand = async (ctx: Context, { args, filesync }: { args: AddArgsResult; filesync: FileSync }): Promise<void> => {\n const syncJson = filesync.syncJson;\n const routeMethod = args._[1];\n const routePath = args._[2];\n\n if (!routeMethod) {\n throw new ArgError(sprint`Failed to add route, missing route method\n\n {gray Usage}\n {cyanBright ggt add route <HTTP_METHOD> <route_path>}`);\n }\n\n if (!routePath) {\n throw new ArgError(sprint`Failed to add route, missing route path\n\n {gray Usage}\n {cyanBright ggt add route ${routeMethod} <route_path>}`);\n }\n\n try {\n const result = (await syncJson.edit.mutate({ mutation: CREATE_ROUTE_MUTATION, variables: { method: routeMethod, path: routePath } }))\n .createRoute;\n\n await filesync.writeToLocalFilesystem(ctx, { filesVersion: result.remoteFilesVersion, files: result.changed, delete: [] });\n } catch (error) {\n if (error instanceof ClientError) {\n throw new AddClientError(error);\n } else {\n throw error;\n }\n }\n\n println({ ensureEmptyLineAbove: true, content: `Route ${chalk.cyanBright(routePath)} added successfully.` });\n};\n\nconst fieldSubCommand = async (ctx: Context, { args, filesync }: { args: AddArgsResult; filesync: FileSync }): Promise<void> => {\n const syncJson = filesync.syncJson;\n\n const splitPathAndField = args._.at(1)?.split(\"/\");\n\n if (!splitPathAndField) {\n throw new ArgError(sprint`Failed to add field, invalid field path definition\n\n {gray Usage}\n {cyanBright ggt add field <model_path>/<field_name>:<field_type>}`);\n }\n\n const modelFieldsList: { name: string; fieldType: string }[] = [];\n\n if (splitPathAndField[1]) {\n const [modelFields, problems] = parseFieldValues([splitPathAndField[1]]);\n\n if (problems.length > 0) {\n throw new ArgError(sprint`\n Failed to add field:\n \u2022 ${problems.join(\"\\n \u2022\")}\n\n {gray Usage}\n {cyanBright ggt add field ${splitPathAndField[0]}/<field_name>:<field_type>}`);\n }\n\n modelFieldsList.push(...modelFields);\n } else {\n throw new ArgError(sprint`Failed to add field, invalid field definition\n\n {gray Usage}\n {cyanBright ggt add field ${splitPathAndField[0]}/<field_name>:<field_type>}`);\n }\n\n try {\n const result = (\n await syncJson.edit.mutate({\n mutation: CREATE_MODEL_FIELDS_MUTATION,\n variables: {\n // oxlint-disable-next-line no-non-null-assertion\n path: splitPathAndField[0]!,\n fields: modelFieldsList.map((field) => ({ name: field.name, fieldType: field.fieldType })),\n },\n })\n ).createModelFields;\n\n await filesync.writeToLocalFilesystem(ctx, { filesVersion: result.remoteFilesVersion, files: result.changed, delete: [] });\n } catch (error) {\n if (error instanceof ClientError) {\n throw new AddClientError(error);\n } else {\n throw error;\n }\n }\n\n println({ ensureEmptyLineAbove: true, content: `Field ${chalk.cyanBright(modelFieldsList[0]?.name)} added successfully.` });\n};\n\nconst envSubCommand = async (ctx: Context, { args, filesync }: { args: AddArgsResult; filesync: FileSync }): Promise<void> => {\n const syncJson = filesync.syncJson;\n const newEnvName = args._[1] ?? makeDefaultEnvName();\n\n try {\n await syncJson.edit.mutate({\n mutation: CREATE_ENVIRONMENT_MUTATION,\n variables: { environment: { slug: newEnvName, sourceSlug: syncJson.environment.name } },\n });\n } catch (error) {\n if (error instanceof ClientError) {\n throw new AddClientError(error);\n } else {\n throw error;\n }\n }\n\n println({ ensureEmptyLineAbove: true, content: `Environment ${chalk.cyanBright(newEnvName)} added successfully.` });\n\n // Try to switch to newly made env\n const pullFromNewEnvSyncJson = await SyncJson.load(ctx, {\n command: \"pull\",\n args: { _: [], \"--app\": undefined, \"--allow-unknown-directory\": undefined, \"--allow-different-app\": undefined, \"--env\": newEnvName },\n directory: await loadSyncJsonDirectory(process.cwd()),\n });\n if (pullFromNewEnvSyncJson) {\n const filesync = new FileSync(syncJson);\n const hashes = await filesync.hashes(ctx);\n if (hashes.environmentChangesToPull.size === 0) {\n println({ ensureEmptyLineAbove: true, content: \"Nothing to pull.\" });\n return;\n }\n if (hashes.localChangesToPush.size > 0) {\n // show them the local changes they will discard\n await filesync.print(ctx, { hashes });\n }\n await filesync.pull(ctx, { hashes, force: true });\n }\n};\n\n/**\n * Creates a default environment name based on the current date and time.\n */\nconst makeDefaultEnvName = (): string => {\n const currentDate = new Date();\n return `env-${currentDate.toISOString().slice(0, 10).replace(/-/g, \"\")}-${currentDate.toLocaleTimeString(\"en-US\", { hour12: false }).replace(/:/g, \"\")}`;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["init_cjs", "AddClientError", "GGTError", "__name", "IsBug", "error", "template", "isGraphQLErrors", "errors", "uniq", "x", "sprint", "source_default", "symbol", "args", "SyncJsonArgs", "usage", "run", "ctx", "directory", "loadSyncJsonDirectory", "syncJson", "SyncJson", "UnknownDirectoryError", "filesync", "FileSync", "hashes", "println", "ts", "modelSubCommand", "actionSubCommand", "routeSubCommand", "fieldSubCommand", "envSubCommand", "parseFieldValues", "fields", "problems", "modelFields", "field", "matches", "modelApiIdentifier", "ArgError", "modelFieldsList", "result", "CREATE_MODEL_MUTATION", "ClientError", "modelPrintout", "terminalLink", "path", "models", "getModels", "globalActions", "getGlobalActions", "splitPath", "overrideContextAction", "parsedPaths", "parsedAction", "conflictingModel", "model", "modelName", "conflictingActionNamespace", "action", "joinedParsedPaths", "select", "choice", "CREATE_ACTION_MUTATION", "routeMethod", "routePath", "CREATE_ROUTE_MUTATION", "splitPathAndField", "CREATE_MODEL_FIELDS_MUTATION", "newEnvName", "makeDefaultEnvName", "CREATE_ENVIRONMENT_MUTATION", "currentDate"]
7
+ }
@@ -0,0 +1,10 @@
1
+ import{a as f,c as g}from"./chunk-YFUOXDPK.js";import"./chunk-L2XBSR7G.js";import"./chunk-442CSROP.js";import"./chunk-F255O64V.js";import"./chunk-HCULGPBH.js";import{a as m}from"./chunk-OUIZQC4D.js";import{J as c,ra as p,ta as l}from"./chunk-JG2QCDK2.js";import"./chunk-GFQYFEEH.js";import{a as o,h as a}from"./chunk-7DYQUG5M.js";a();import y from"node:path";var D={"--force":{type:Boolean}},u=o(()=>p`
2
+ Install Gadget agent plugins (AGENTS.md + skills) into the current project.
3
+
4
+ {gray Usage}
5
+ ggt agent-plugin install [--force]
6
+
7
+ {gray Flags}
8
+ --force Overwrite/reinstall even if already present
9
+ `,"usage"),G=o(async(t,r)=>{if(r._[0]!=="install"){l(u(t));return}let e=process.cwd(),n=await c(".gadget/sync.json",{cwd:e}),d=n?y.join(n,"../.."):e,s=await m.init(d),i=r["--force"]??!1;await f({ctx:t,directory:s,force:i}),await g({ctx:t,directory:s,force:i})},"run");export{D as args,G as run,u as usage};
10
+ //# sourceMappingURL=agent-plugin-TN24O7FB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/agent-plugin.ts"],
4
+ "sourcesContent": ["import { findUp } from \"find-up\";\nimport path from \"node:path\";\n\nimport type { ArgsDefinition } from \"../services/command/arg.js\";\nimport type { Run, Usage } from \"../services/command/command.js\";\n\nimport { Directory } from \"../services/filesync/directory.js\";\nimport { installAgentsMdScaffold, installGadgetSkillsIntoProject } from \"../services/output/agent-plugin.js\";\nimport { println } from \"../services/output/print.js\";\nimport { sprint } from \"../services/output/sprint.js\";\n\nexport const args = {\n \"--force\": { type: Boolean },\n} satisfies ArgsDefinition;\n\nexport const usage: Usage = () => {\n return sprint`\n Install Gadget agent plugins (AGENTS.md + skills) into the current project.\n\n {gray Usage}\n ggt agent-plugin install [--force]\n\n {gray Flags}\n --force Overwrite/reinstall even if already present\n `;\n};\n\nexport const run: Run<typeof args> = async (ctx, args): Promise<void> => {\n if (args._[0] !== \"install\") {\n println(usage(ctx));\n return;\n }\n\n const cwd = process.cwd();\n const syncJsonPath = await findUp(\".gadget/sync.json\", { cwd });\n const projectRoot = syncJsonPath ? path.join(syncJsonPath, \"../..\") : cwd;\n const directory = await Directory.init(projectRoot);\n const force = args[\"--force\"] ?? false;\n\n await installAgentsMdScaffold({ ctx, directory, force });\n await installGadgetSkillsIntoProject({ ctx, directory, force });\n};\n"],
5
+ "mappings": "0UAAAA,IACA,OAAOC,MAAU,YAUV,IAAMC,EAAO,CAClB,UAAW,CAAE,KAAM,OAAQ,CAC7B,EAEaC,EAAeC,EAAA,IACnBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IADmB,SAYfC,EAAwBF,EAAA,MAAOG,EAAKL,IAAwB,CACvE,GAAIA,EAAK,EAAE,CAAC,IAAM,UAAW,CAC3BM,EAAQL,EAAMI,CAAG,CAAC,EAClB,MACF,CAEA,IAAME,EAAM,QAAQ,IAAI,EAClBC,EAAe,MAAMC,EAAO,oBAAqB,CAAE,IAAAF,CAAI,CAAC,EACxDG,EAAcF,EAAeG,EAAK,KAAKH,EAAc,OAAO,EAAID,EAChEK,EAAY,MAAMC,EAAU,KAAKH,CAAW,EAC5CI,EAAQd,EAAK,SAAS,GAAK,GAEjC,MAAMe,EAAwB,CAAE,IAAAV,EAAK,UAAAO,EAAW,MAAAE,CAAM,CAAC,EACvD,MAAME,EAA+B,CAAE,IAAAX,EAAK,UAAAO,EAAW,MAAAE,CAAM,CAAC,CAChE,EAdqC",
6
+ "names": ["init_cjs", "path", "args", "usage", "__name", "sprint", "run", "ctx", "println", "cwd", "syncJsonPath", "findUp", "projectRoot", "path", "directory", "Directory", "force", "installAgentsMdScaffold", "installGadgetSkillsIntoProject"]
7
+ }
@@ -0,0 +1,10 @@
1
+ import{e as l,f}from"./chunk-442CSROP.js";import{K as w,e as i,ra as g}from"./chunk-JG2QCDK2.js";import{a as r,f as m,h as u}from"./chunk-7DYQUG5M.js";u();var o=m(w(),1);var h=i.object({pid:i.number(),startedAt:i.string()}),a=class extends f{constructor(n){super(`Another ggt dev process is already running (PID ${n.pid})`);this.details=n}static{r(this,"DevAlreadyRunningError")}isBug=l.NO;render(){return g`
2
+ Another "ggt dev" process is already running in this directory:
3
+
4
+ ${this.details.directory}
5
+
6
+ The existing process has PID ${String(this.details.pid)}.
7
+
8
+ Stop the other process first, or use a different directory.
9
+ `}},c=r(t=>t.absolute(".gadget/dev-lock.json"),"devLockPath"),D=r(t=>{try{return process.kill(t,0),!0}catch{return!1}},"isProcessAlive"),y=r(async t=>{try{let e=await o.default.readJSON(c(t)),n=h.safeParse(e);return n.success?n.data:void 0}catch{return}},"readDevLock"),L=r(async t=>{let e=c(t),n={pid:process.pid,startedAt:new Date().toISOString()},d=JSON.stringify(n,null,2);await o.default.ensureDir(t.absolute(".gadget"));try{await o.default.writeFile(e,d,{flag:"wx"})}catch(p){if(p.code!=="EEXIST")throw p;let s=await y(t);if(s&&D(s.pid))throw new a({pid:s.pid,directory:t.path});await o.default.remove(e),await o.default.writeFile(e,d,{flag:"wx"})}},"acquireDevLock"),v=r(async t=>{try{await o.default.remove(c(t))}catch{}},"releaseDevLock"),S=r(async t=>{let e=await y(t);return e?D(e.pid)?{running:!0,pid:e.pid,startedAt:e.startedAt}:(await v(t),{running:!1}):{running:!1}},"getDevStatus");export{L as a,v as b,S as c};
10
+ //# sourceMappingURL=chunk-2742UPMB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/services/filesync/dev-lock.ts"],
4
+ "sourcesContent": ["import fs from \"fs-extra\";\nimport { z } from \"zod\";\n\nimport type { Directory } from \"./directory.js\";\n\nimport { GGTError, IsBug } from \"../output/report.js\";\nimport { sprint } from \"../output/sprint.js\";\n\n/**\n * The data stored in the dev lock file.\n */\nexport const DevLockData = z.object({\n pid: z.number(),\n startedAt: z.string(),\n});\n\nexport type DevLockData = z.infer<typeof DevLockData>;\n\n/**\n * Error thrown when another `ggt dev` process is already running in the same directory.\n */\nexport class DevAlreadyRunningError extends GGTError {\n isBug = IsBug.NO;\n\n constructor(readonly details: { pid: number; directory: string }) {\n super(`Another ggt dev process is already running (PID ${details.pid})`);\n }\n\n protected render(): string {\n return sprint`\n Another \"ggt dev\" process is already running in this directory:\n\n ${this.details.directory}\n\n The existing process has PID ${String(this.details.pid)}.\n\n Stop the other process first, or use a different directory.\n `;\n }\n}\n\n/**\n * Returns the path to the dev lock file for the given directory.\n */\nexport const devLockPath = (directory: Directory): string => {\n return directory.absolute(\".gadget/dev-lock.json\");\n};\n\n/**\n * Checks whether a process with the given PID is alive.\n */\nexport const isProcessAlive = (pid: number): boolean => {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Reads and parses the dev lock file. Returns undefined if missing or malformed.\n */\nexport const readDevLock = async (directory: Directory): Promise<DevLockData | undefined> => {\n try {\n const data: unknown = await fs.readJSON(devLockPath(directory));\n const result = DevLockData.safeParse(data);\n return result.success ? result.data : undefined;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Atomically acquires the dev lock for the given directory.\n *\n * Uses `wx` flag for exclusive creation to prevent race conditions.\n * If a stale lock (dead PID) is found, it is removed and re-acquired.\n *\n * @throws {DevAlreadyRunningError} if another live process holds the lock.\n */\nexport const acquireDevLock = async (directory: Directory): Promise<void> => {\n const lockPath = devLockPath(directory);\n const lockData: DevLockData = {\n pid: process.pid,\n startedAt: new Date().toISOString(),\n };\n const content = JSON.stringify(lockData, null, 2);\n\n await fs.ensureDir(directory.absolute(\".gadget\"));\n\n try {\n await fs.writeFile(lockPath, content, { flag: \"wx\" });\n } catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n\n // Lock file already exists - check if the holding process is still alive\n const existing = await readDevLock(directory);\n if (existing && isProcessAlive(existing.pid)) {\n throw new DevAlreadyRunningError({ pid: existing.pid, directory: directory.path });\n }\n\n // Stale or malformed lock - remove and retry\n await fs.remove(lockPath);\n await fs.writeFile(lockPath, content, { flag: \"wx\" });\n }\n};\n\n/**\n * Releases the dev lock for the given directory. Ignores errors.\n */\nexport const releaseDevLock = async (directory: Directory): Promise<void> => {\n try {\n await fs.remove(devLockPath(directory));\n } catch {\n // ignore errors during cleanup\n }\n};\n\n/**\n * Returns the current dev status for the given directory.\n * Cleans up stale locks as a side effect.\n */\nexport const getDevStatus = async (\n directory: Directory,\n): Promise<{ running: false } | { running: true; pid: number; startedAt: string }> => {\n const lock = await readDevLock(directory);\n if (!lock) {\n return { running: false };\n }\n\n if (!isProcessAlive(lock.pid)) {\n // Stale lock - clean it up\n await releaseDevLock(directory);\n return { running: false };\n }\n\n return { running: true, pid: lock.pid, startedAt: lock.startedAt };\n};\n"],
5
+ "mappings": "uJAAAA,IAAA,IAAAC,EAAe,SAWR,IAAMC,EAAcC,EAAE,OAAO,CAClC,IAAKA,EAAE,OAAO,EACd,UAAWA,EAAE,OAAO,CACtB,CAAC,EAOYC,EAAN,cAAqCC,CAAS,CAGnD,YAAqBC,EAA6C,CAChE,MAAM,mDAAmDA,EAAQ,GAAG,GAAG,EADpD,aAAAA,CAErB,CA1BF,MAqBqD,CAAAC,EAAA,+BACnD,MAAQC,EAAM,GAMJ,QAAiB,CACzB,OAAOC;AAAA;AAAA;AAAA,UAGD,KAAK,QAAQ,SAAS;AAAA;AAAA,qCAEK,OAAO,KAAK,QAAQ,GAAG,CAAC;AAAA;AAAA;AAAA,KAI3D,CACF,EAKaC,EAAcH,EAACI,GACnBA,EAAU,SAAS,uBAAuB,EADxB,eAOdC,EAAiBL,EAACM,GAAyB,CACtD,GAAI,CACF,eAAQ,KAAKA,EAAK,CAAC,EACZ,EACT,MAAQ,CACN,MAAO,EACT,CACF,EAP8B,kBAYjBC,EAAcP,EAAA,MAAOI,GAA2D,CAC3F,GAAI,CACF,IAAMI,EAAgB,MAAM,EAAAC,QAAG,SAASN,EAAYC,CAAS,CAAC,EACxDM,EAASf,EAAY,UAAUa,CAAI,EACzC,OAAOE,EAAO,QAAUA,EAAO,KAAO,MACxC,MAAQ,CACN,MACF,CACF,EAR2B,eAkBdC,EAAiBX,EAAA,MAAOI,GAAwC,CAC3E,IAAMQ,EAAWT,EAAYC,CAAS,EAChCS,EAAwB,CAC5B,IAAK,QAAQ,IACb,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,EACMC,EAAU,KAAK,UAAUD,EAAU,KAAM,CAAC,EAEhD,MAAM,EAAAJ,QAAG,UAAUL,EAAU,SAAS,SAAS,CAAC,EAEhD,GAAI,CACF,MAAM,EAAAK,QAAG,UAAUG,EAAUE,EAAS,CAAE,KAAM,IAAK,CAAC,CACtD,OAASC,EAAgB,CACvB,GAAKA,EAAgC,OAAS,SAC5C,MAAMA,EAIR,IAAMC,EAAW,MAAMT,EAAYH,CAAS,EAC5C,GAAIY,GAAYX,EAAeW,EAAS,GAAG,EACzC,MAAM,IAAInB,EAAuB,CAAE,IAAKmB,EAAS,IAAK,UAAWZ,EAAU,IAAK,CAAC,EAInF,MAAM,EAAAK,QAAG,OAAOG,CAAQ,EACxB,MAAM,EAAAH,QAAG,UAAUG,EAAUE,EAAS,CAAE,KAAM,IAAK,CAAC,CACtD,CACF,EA3B8B,kBAgCjBG,EAAiBjB,EAAA,MAAOI,GAAwC,CAC3E,GAAI,CACF,MAAM,EAAAK,QAAG,OAAON,EAAYC,CAAS,CAAC,CACxC,MAAQ,CAER,CACF,EAN8B,kBAYjBc,EAAelB,EAAA,MAC1BI,GACoF,CACpF,IAAMe,EAAO,MAAMZ,EAAYH,CAAS,EACxC,OAAKe,EAIAd,EAAec,EAAK,GAAG,EAMrB,CAAE,QAAS,GAAM,IAAKA,EAAK,IAAK,UAAWA,EAAK,SAAU,GAJ/D,MAAMF,EAAeb,CAAS,EACvB,CAAE,QAAS,EAAM,GANjB,CAAE,QAAS,EAAM,CAU5B,EAf4B",
6
+ "names": ["init_cjs", "import_fs_extra", "DevLockData", "external_exports", "DevAlreadyRunningError", "GGTError", "details", "__name", "IsBug", "sprint", "devLockPath", "directory", "isProcessAlive", "pid", "readDevLock", "data", "fs", "result", "acquireDevLock", "lockPath", "lockData", "content", "error", "existing", "releaseDevLock", "getDevStatus", "lock"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{L as b,M,N as C,O as ee,P as Cr,Q as R,R as A,S as Ar,T as Lr}from"./chunk-JG2QCDK2.js";import{a as o,d as q,h as c}from"./chunk-7DYQUG5M.js";var se=q((si,te)=>{"use strict";c();var re=R(),Vr=o((t,e,r,s,n)=>{typeof r=="string"&&(n=s,s=r,r=void 0);try{return new re(t instanceof re?t.version:t,r).inc(e,s,n).version}catch{return null}},"inc");te.exports=Vr});var oe=q((oi,ne)=>{"use strict";c();var ie=A(),jr=o((t,e)=>{let r=ie(t,null,!0),s=ie(e,null,!0),n=r.compare(s);if(n===0)return null;let i=n>0,l=i?r:s,u=i?s:r,a=!!l.prerelease.length;if(!!u.prerelease.length&&!a){if(!u.patch&&!u.minor)return"major";if(u.compareMain(l)===0)return u.minor&&!u.patch?"minor":"patch"}let m=a?"pre":"";return r.major!==s.major?m+"major":r.minor!==s.minor?m+"minor":r.patch!==s.patch?m+"patch":"prerelease"},"diff");ne.exports=jr});var ce=q((ui,le)=>{"use strict";c();var Ir=R(),Nr=o((t,e)=>new Ir(t,e).major,"major");le.exports=Nr});var ae=q((hi,ue)=>{"use strict";c();var Gr=R(),Wr=o((t,e)=>new Gr(t,e).minor,"minor");ue.exports=Wr});var he=q((qi,fe)=>{"use strict";c();var Dr=R(),Yr=o((t,e)=>new Dr(t,e).patch,"patch");fe.exports=Yr});var me=q((wi,pe)=>{"use strict";c();var Hr=A(),Xr=o((t,e)=>{let r=Hr(t,e);return r&&r.prerelease.length?r.prerelease:null},"prerelease");pe.exports=Xr});var E=q((Ri,$e)=>{"use strict";c();var qe=R(),Br=o((t,e,r)=>new qe(t,r).compare(new qe(e,r)),"compare");$e.exports=Br});var we=q((xi,de)=>{"use strict";c();var kr=E(),Ur=o((t,e,r)=>kr(e,t,r),"rcompare");de.exports=Ur});var ge=q((Pi,ve)=>{"use strict";c();var _r=E(),zr=o((t,e)=>_r(t,e,!0),"compareLoose");ve.exports=zr});var L=q((Ai,Ee)=>{"use strict";c();var Re=R(),Fr=o((t,e,r)=>{let s=new Re(t,r),n=new Re(e,r);return s.compare(n)||s.compareBuild(n)},"compareBuild");Ee.exports=Fr});var xe=q((ji,Se)=>{"use strict";c();var Kr=L(),Jr=o((t,e)=>t.sort((r,s)=>Kr(r,s,e)),"sort");Se.exports=Jr});var ye=q((Gi,Te)=>{"use strict";c();var Qr=L(),Zr=o((t,e)=>t.sort((r,s)=>Qr(s,r,e)),"rsort");Te.exports=Zr});var x=q((Yi,Pe)=>{"use strict";c();var br=E(),Mr=o((t,e,r)=>br(t,e,r)>0,"gt");Pe.exports=Mr});var V=q((Bi,Oe)=>{"use strict";c();var et=E(),rt=o((t,e,r)=>et(t,e,r)<0,"lt");Oe.exports=rt});var D=q((_i,Ce)=>{"use strict";c();var tt=E(),st=o((t,e,r)=>tt(t,e,r)===0,"eq");Ce.exports=st});var Y=q((Ki,Ae)=>{"use strict";c();var it=E(),nt=o((t,e,r)=>it(t,e,r)!==0,"neq");Ae.exports=nt});var j=q((Zi,Le)=>{"use strict";c();var ot=E(),lt=o((t,e,r)=>ot(t,e,r)>=0,"gte");Le.exports=lt});var I=q((en,Ve)=>{"use strict";c();var ct=E(),ut=o((t,e,r)=>ct(t,e,r)<=0,"lte");Ve.exports=ut});var H=q((sn,je)=>{"use strict";c();var at=D(),ft=Y(),ht=x(),pt=j(),mt=V(),qt=I(),$t=o((t,e,r,s)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return at(t,r,s);case"!=":return ft(t,r,s);case">":return ht(t,r,s);case">=":return pt(t,r,s);case"<":return mt(t,r,s);case"<=":return qt(t,r,s);default:throw new TypeError(`Invalid operator: ${e}`)}},"cmp");je.exports=$t});var Ne=q((ln,Ie)=>{"use strict";c();var dt=R(),wt=A(),{safeRe:N,t:G}=C(),vt=o((t,e)=>{if(t instanceof dt)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(e.includePrerelease?N[G.COERCEFULL]:N[G.COERCE]);else{let a=e.includePrerelease?N[G.COERCERTLFULL]:N[G.COERCERTL],p;for(;(p=a.exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||p.index+p[0].length!==r.index+r[0].length)&&(r=p),a.lastIndex=p.index+p[1].length+p[2].length;a.lastIndex=-1}if(r===null)return null;let s=r[2],n=r[3]||"0",i=r[4]||"0",l=e.includePrerelease&&r[5]?`-${r[5]}`:"",u=e.includePrerelease&&r[6]?`+${r[6]}`:"";return wt(`${s}.${n}.${i}${l}${u}`,e)},"coerce");Ie.exports=vt});var We=q((an,Ge)=>{"use strict";c();var X=class{static{o(this,"LRUCache")}constructor(){this.max=1e3,this.map=new Map}get(e){let r=this.map.get(e);if(r!==void 0)return this.map.delete(e),this.map.set(e,r),r}delete(e){return this.map.delete(e)}set(e,r){if(!this.delete(e)&&r!==void 0){if(this.map.size>=this.max){let n=this.map.keys().next().value;this.delete(n)}this.map.set(e,r)}return this}};Ge.exports=X});var S=q((pn,Xe)=>{"use strict";c();var gt=/\s+/g,B=class t{static{o(this,"Range")}constructor(e,r){if(r=Et(r),e instanceof t)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new t(e.raw,r);if(e instanceof k)return this.raw=e.value,this.set=[[e]],this.formatted=void 0,this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e.trim().replace(gt," "),this.set=this.raw.split("||").map(s=>this.parseRange(s.trim())).filter(s=>s.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let s=this.set[0];if(this.set=this.set.filter(n=>!Ye(n[0])),this.set.length===0)this.set=[s];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&Ct(n[0])){this.set=[n];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let e=0;e<this.set.length;e++){e>0&&(this.formatted+="||");let r=this.set[e];for(let s=0;s<r.length;s++)s>0&&(this.formatted+=" "),this.formatted+=r[s].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){let s=((this.options.includePrerelease&&Pt)|(this.options.loose&&Ot))+":"+e,n=De.get(s);if(n)return n;let i=this.options.loose,l=i?v[w.HYPHENRANGELOOSE]:v[w.HYPHENRANGE];e=e.replace(l,Yt(this.options.includePrerelease)),$("hyphen replace",e),e=e.replace(v[w.COMPARATORTRIM],xt),$("comparator trim",e),e=e.replace(v[w.TILDETRIM],Tt),$("tilde trim",e),e=e.replace(v[w.CARETTRIM],yt),$("caret trim",e);let u=e.split(" ").map(f=>At(f,this.options)).join(" ").split(/\s+/).map(f=>Dt(f,this.options));i&&(u=u.filter(f=>($("loose invalid filter",f,this.options),!!f.match(v[w.COMPARATORLOOSE])))),$("range list",u);let a=new Map,p=u.map(f=>new k(f,this.options));for(let f of p){if(Ye(f))return[f];a.set(f.value,f)}a.size>1&&a.has("")&&a.delete("");let m=[...a.values()];return De.set(s,m),m}intersects(e,r){if(!(e instanceof t))throw new TypeError("a Range is required");return this.set.some(s=>He(s,r)&&e.set.some(n=>He(n,r)&&s.every(i=>n.every(l=>i.intersects(l,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new St(e,this.options)}catch{return!1}for(let r=0;r<this.set.length;r++)if(Ht(this.set[r],e,this.options))return!0;return!1}};Xe.exports=B;var Rt=We(),De=new Rt,Et=ee(),k=T(),$=b(),St=R(),{safeRe:v,t:w,comparatorTrimReplace:xt,tildeTrimReplace:Tt,caretTrimReplace:yt}=C(),{FLAG_INCLUDE_PRERELEASE:Pt,FLAG_LOOSE:Ot}=M(),Ye=o(t=>t.value==="<0.0.0-0","isNullSet"),Ct=o(t=>t.value==="","isAny"),He=o((t,e)=>{let r=!0,s=t.slice(),n=s.pop();for(;r&&s.length;)r=s.every(i=>n.intersects(i,e)),n=s.pop();return r},"isSatisfiable"),At=o((t,e)=>(t=t.replace(v[w.BUILD],""),$("comp",t,e),t=jt(t,e),$("caret",t),t=Lt(t,e),$("tildes",t),t=Nt(t,e),$("xrange",t),t=Wt(t,e),$("stars",t),t),"parseComparator"),g=o(t=>!t||t.toLowerCase()==="x"||t==="*","isX"),Lt=o((t,e)=>t.trim().split(/\s+/).map(r=>Vt(r,e)).join(" "),"replaceTildes"),Vt=o((t,e)=>{let r=e.loose?v[w.TILDELOOSE]:v[w.TILDE];return t.replace(r,(s,n,i,l,u)=>{$("tilde",t,s,n,i,l,u);let a;return g(n)?a="":g(i)?a=`>=${n}.0.0 <${+n+1}.0.0-0`:g(l)?a=`>=${n}.${i}.0 <${n}.${+i+1}.0-0`:u?($("replaceTilde pr",u),a=`>=${n}.${i}.${l}-${u} <${n}.${+i+1}.0-0`):a=`>=${n}.${i}.${l} <${n}.${+i+1}.0-0`,$("tilde return",a),a})},"replaceTilde"),jt=o((t,e)=>t.trim().split(/\s+/).map(r=>It(r,e)).join(" "),"replaceCarets"),It=o((t,e)=>{$("caret",t,e);let r=e.loose?v[w.CARETLOOSE]:v[w.CARET],s=e.includePrerelease?"-0":"";return t.replace(r,(n,i,l,u,a)=>{$("caret",t,n,i,l,u,a);let p;return g(i)?p="":g(l)?p=`>=${i}.0.0${s} <${+i+1}.0.0-0`:g(u)?i==="0"?p=`>=${i}.${l}.0${s} <${i}.${+l+1}.0-0`:p=`>=${i}.${l}.0${s} <${+i+1}.0.0-0`:a?($("replaceCaret pr",a),i==="0"?l==="0"?p=`>=${i}.${l}.${u}-${a} <${i}.${l}.${+u+1}-0`:p=`>=${i}.${l}.${u}-${a} <${i}.${+l+1}.0-0`:p=`>=${i}.${l}.${u}-${a} <${+i+1}.0.0-0`):($("no pr"),i==="0"?l==="0"?p=`>=${i}.${l}.${u}${s} <${i}.${l}.${+u+1}-0`:p=`>=${i}.${l}.${u}${s} <${i}.${+l+1}.0-0`:p=`>=${i}.${l}.${u} <${+i+1}.0.0-0`),$("caret return",p),p})},"replaceCaret"),Nt=o((t,e)=>($("replaceXRanges",t,e),t.split(/\s+/).map(r=>Gt(r,e)).join(" ")),"replaceXRanges"),Gt=o((t,e)=>{t=t.trim();let r=e.loose?v[w.XRANGELOOSE]:v[w.XRANGE];return t.replace(r,(s,n,i,l,u,a)=>{$("xRange",t,s,n,i,l,u,a);let p=g(i),m=p||g(l),f=m||g(u),d=f;return n==="="&&d&&(n=""),a=e.includePrerelease?"-0":"",p?n===">"||n==="<"?s="<0.0.0-0":s="*":n&&d?(m&&(l=0),u=0,n===">"?(n=">=",m?(i=+i+1,l=0,u=0):(l=+l+1,u=0)):n==="<="&&(n="<",m?i=+i+1:l=+l+1),n==="<"&&(a="-0"),s=`${n+i}.${l}.${u}${a}`):m?s=`>=${i}.0.0${a} <${+i+1}.0.0-0`:f&&(s=`>=${i}.${l}.0${a} <${i}.${+l+1}.0-0`),$("xRange return",s),s})},"replaceXRange"),Wt=o((t,e)=>($("replaceStars",t,e),t.trim().replace(v[w.STAR],"")),"replaceStars"),Dt=o((t,e)=>($("replaceGTE0",t,e),t.trim().replace(v[e.includePrerelease?w.GTE0PRE:w.GTE0],"")),"replaceGTE0"),Yt=o(t=>(e,r,s,n,i,l,u,a,p,m,f,d)=>(g(s)?r="":g(n)?r=`>=${s}.0.0${t?"-0":""}`:g(i)?r=`>=${s}.${n}.0${t?"-0":""}`:l?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,g(p)?a="":g(m)?a=`<${+p+1}.0.0-0`:g(f)?a=`<${p}.${+m+1}.0-0`:d?a=`<=${p}.${m}.${f}-${d}`:t?a=`<${p}.${m}.${+f+1}-0`:a=`<=${a}`,`${r} ${a}`.trim()),"hyphenReplace"),Ht=o((t,e,r)=>{for(let s=0;s<t.length;s++)if(!t[s].test(e))return!1;if(e.prerelease.length&&!r.includePrerelease){for(let s=0;s<t.length;s++)if($(t[s].semver),t[s].semver!==k.ANY&&t[s].semver.prerelease.length>0){let n=t[s].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0},"testSet")});var T=q(($n,Fe)=>{"use strict";c();var y=Symbol("SemVer ANY"),z=class t{static{o(this,"Comparator")}static get ANY(){return y}constructor(e,r){if(r=Be(r),e instanceof t){if(e.loose===!!r.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),_("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===y?this.value="":this.value=this.operator+this.semver.version,_("comp",this)}parse(e){let r=this.options.loose?ke[Ue.COMPARATORLOOSE]:ke[Ue.COMPARATOR],s=e.match(r);if(!s)throw new TypeError(`Invalid comparator: ${e}`);this.operator=s[1]!==void 0?s[1]:"",this.operator==="="&&(this.operator=""),s[2]?this.semver=new _e(s[2],this.options.loose):this.semver=y}toString(){return this.value}test(e){if(_("Comparator.test",e,this.options.loose),this.semver===y||e===y)return!0;if(typeof e=="string")try{e=new _e(e,this.options)}catch{return!1}return U(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof t))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new ze(e.value,r).test(this.value):e.operator===""?e.value===""?!0:new ze(this.value,r).test(e.semver):(r=Be(r),r.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!r.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||U(this.semver,"<",e.semver,r)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||U(this.semver,">",e.semver,r)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Fe.exports=z;var Be=ee(),{safeRe:ke,t:Ue}=C(),U=H(),_=b(),_e=R(),ze=S()});var P=q((vn,Ke)=>{"use strict";c();var Xt=S(),Bt=o((t,e,r)=>{try{e=new Xt(e,r)}catch{return!1}return e.test(t)},"satisfies");Ke.exports=Bt});var Qe=q((En,Je)=>{"use strict";c();var kt=S(),Ut=o((t,e)=>new kt(t,e).set.map(r=>r.map(s=>s.value).join(" ").trim().split(" ")),"toComparators");Je.exports=Ut});var be=q((Tn,Ze)=>{"use strict";c();var _t=R(),zt=S(),Ft=o((t,e,r)=>{let s=null,n=null,i=null;try{i=new zt(e,r)}catch{return null}return t.forEach(l=>{i.test(l)&&(!s||n.compare(l)===-1)&&(s=l,n=new _t(s,r))}),s},"maxSatisfying");Ze.exports=Ft});var er=q((On,Me)=>{"use strict";c();var Kt=R(),Jt=S(),Qt=o((t,e,r)=>{let s=null,n=null,i=null;try{i=new Jt(e,r)}catch{return null}return t.forEach(l=>{i.test(l)&&(!s||n.compare(l)===1)&&(s=l,n=new Kt(s,r))}),s},"minSatisfying");Me.exports=Qt});var sr=q((Ln,tr)=>{"use strict";c();var F=R(),Zt=S(),rr=x(),bt=o((t,e)=>{t=new Zt(t,e);let r=new F("0.0.0");if(t.test(r)||(r=new F("0.0.0-0"),t.test(r)))return r;r=null;for(let s=0;s<t.set.length;++s){let n=t.set[s],i=null;n.forEach(l=>{let u=new F(l.semver.version);switch(l.operator){case">":u.prerelease.length===0?u.patch++:u.prerelease.push(0),u.raw=u.format();case"":case">=":(!i||rr(u,i))&&(i=u);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${l.operator}`)}}),i&&(!r||rr(r,i))&&(r=i)}return r&&t.test(r)?r:null},"minVersion");tr.exports=bt});var nr=q((In,ir)=>{"use strict";c();var Mt=S(),es=o((t,e)=>{try{return new Mt(t,e).range||"*"}catch{return null}},"validRange");ir.exports=es});var W=q((Wn,ur)=>{"use strict";c();var rs=R(),cr=T(),{ANY:ts}=cr,ss=S(),is=P(),or=x(),lr=V(),ns=I(),os=j(),ls=o((t,e,r,s)=>{t=new rs(t,s),e=new ss(e,s);let n,i,l,u,a;switch(r){case">":n=or,i=ns,l=lr,u=">",a=">=";break;case"<":n=lr,i=os,l=or,u="<",a="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(is(t,e,s))return!1;for(let p=0;p<e.set.length;++p){let m=e.set[p],f=null,d=null;if(m.forEach(h=>{h.semver===ts&&(h=new cr(">=0.0.0")),f=f||h,d=d||h,n(h.semver,f.semver,s)?f=h:l(h.semver,d.semver,s)&&(d=h)}),f.operator===u||f.operator===a||(!d.operator||d.operator===u)&&i(t,d.semver))return!1;if(d.operator===a&&l(t,d.semver))return!1}return!0},"outside");ur.exports=ls});var fr=q((Hn,ar)=>{"use strict";c();var cs=W(),us=o((t,e,r)=>cs(t,e,">",r),"gtr");ar.exports=us});var pr=q((kn,hr)=>{"use strict";c();var as=W(),fs=o((t,e,r)=>as(t,e,"<",r),"ltr");hr.exports=fs});var $r=q((zn,qr)=>{"use strict";c();var mr=S(),hs=o((t,e,r)=>(t=new mr(t,r),e=new mr(e,r),t.intersects(e,r)),"intersects");qr.exports=hs});var wr=q((Jn,dr)=>{"use strict";c();var ps=P(),ms=E();dr.exports=(t,e,r)=>{let s=[],n=null,i=null,l=t.sort((m,f)=>ms(m,f,r));for(let m of l)ps(m,e,r)?(i=m,n||(n=m)):(i&&s.push([n,i]),i=null,n=null);n&&s.push([n,null]);let u=[];for(let[m,f]of s)m===f?u.push(m):!f&&m===l[0]?u.push("*"):f?m===l[0]?u.push(`<=${f}`):u.push(`${m} - ${f}`):u.push(`>=${m}`);let a=u.join(" || "),p=typeof e.raw=="string"?e.raw:String(e);return a.length<p.length?a:e}});var xr=q((Zn,Sr)=>{"use strict";c();var vr=S(),J=T(),{ANY:K}=J,O=P(),Q=E(),qs=o((t,e,r={})=>{if(t===e)return!0;t=new vr(t,r),e=new vr(e,r);let s=!1;e:for(let n of t.set){for(let i of e.set){let l=ds(n,i,r);if(s=s||l!==null,l)continue e}if(s)return!1}return!0},"subset"),$s=[new J(">=0.0.0-0")],gr=[new J(">=0.0.0")],ds=o((t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===K){if(e.length===1&&e[0].semver===K)return!0;r.includePrerelease?t=$s:t=gr}if(e.length===1&&e[0].semver===K){if(r.includePrerelease)return!0;e=gr}let s=new Set,n,i;for(let h of t)h.operator===">"||h.operator===">="?n=Rr(n,h,r):h.operator==="<"||h.operator==="<="?i=Er(i,h,r):s.add(h.semver);if(s.size>1)return null;let l;if(n&&i){if(l=Q(n.semver,i.semver,r),l>0)return null;if(l===0&&(n.operator!==">="||i.operator!=="<="))return null}for(let h of s){if(n&&!O(h,String(n),r)||i&&!O(h,String(i),r))return null;for(let Or of e)if(!O(h,String(Or),r))return!1;return!0}let u,a,p,m,f=i&&!r.includePrerelease&&i.semver.prerelease.length?i.semver:!1,d=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1;f&&f.prerelease.length===1&&i.operator==="<"&&f.prerelease[0]===0&&(f=!1);for(let h of e){if(m=m||h.operator===">"||h.operator===">=",p=p||h.operator==="<"||h.operator==="<=",n){if(d&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===d.major&&h.semver.minor===d.minor&&h.semver.patch===d.patch&&(d=!1),h.operator===">"||h.operator===">="){if(u=Rr(n,h,r),u===h&&u!==n)return!1}else if(n.operator===">="&&!O(n.semver,String(h),r))return!1}if(i){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator==="<"||h.operator==="<="){if(a=Er(i,h,r),a===h&&a!==i)return!1}else if(i.operator==="<="&&!O(i.semver,String(h),r))return!1}if(!h.operator&&(i||n)&&l!==0)return!1}return!(n&&p&&!i&&l!==0||i&&m&&!n&&l!==0||d||f)},"simpleSubset"),Rr=o((t,e,r)=>{if(!t)return e;let s=Q(t.semver,e.semver,r);return s>0?t:s<0||e.operator===">"&&t.operator===">="?e:t},"higherGT"),Er=o((t,e,r)=>{if(!t)return e;let s=Q(t.semver,e.semver,r);return s<0?t:s>0||e.operator==="<"&&t.operator==="<="?e:t},"lowerLT");Sr.exports=qs});var ti=q((eo,Pr)=>{"use strict";c();var Z=C(),Tr=M(),ws=R(),yr=Cr(),vs=A(),gs=Ar(),Rs=Lr(),Es=se(),Ss=oe(),xs=ce(),Ts=ae(),ys=he(),Ps=me(),Os=E(),Cs=we(),As=ge(),Ls=L(),Vs=xe(),js=ye(),Is=x(),Ns=V(),Gs=D(),Ws=Y(),Ds=j(),Ys=I(),Hs=H(),Xs=Ne(),Bs=T(),ks=S(),Us=P(),_s=Qe(),zs=be(),Fs=er(),Ks=sr(),Js=nr(),Qs=W(),Zs=fr(),bs=pr(),Ms=$r(),ei=wr(),ri=xr();Pr.exports={parse:vs,valid:gs,clean:Rs,inc:Es,diff:Ss,major:xs,minor:Ts,patch:ys,prerelease:Ps,compare:Os,rcompare:Cs,compareLoose:As,compareBuild:Ls,sort:Vs,rsort:js,gt:Is,lt:Ns,eq:Gs,neq:Ws,gte:Ds,lte:Ys,cmp:Hs,coerce:Xs,Comparator:Bs,Range:ks,satisfies:Us,toComparators:_s,maxSatisfying:zs,minSatisfying:Fs,minVersion:Ks,validRange:Js,outside:Qs,gtr:Zs,ltr:bs,intersects:Ms,simplifyRange:ei,subset:ri,SemVer:ws,re:Z.re,src:Z.src,tokens:Z.t,SEMVER_SPEC_VERSION:Tr.SEMVER_SPEC_VERSION,RELEASE_TYPES:Tr.RELEASE_TYPES,compareIdentifiers:yr.compareIdentifiers,rcompareIdentifiers:yr.rcompareIdentifiers}});export{ti as a};
2
+ //# sourceMappingURL=chunk-3OM5WM7E.js.map