convex 1.40.0 → 1.41.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 (290) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/cli/aiFiles.js +2 -2
  5. package/dist/cjs/cli/aiFiles.js.map +1 -1
  6. package/dist/cjs/cli/configure.js +1 -4
  7. package/dist/cjs/cli/configure.js.map +2 -2
  8. package/dist/cjs/cli/convexExport.js +3 -3
  9. package/dist/cjs/cli/convexExport.js.map +1 -1
  10. package/dist/cjs/cli/convexImport.js +2 -2
  11. package/dist/cjs/cli/convexImport.js.map +1 -1
  12. package/dist/cjs/cli/dashboard.js +19 -6
  13. package/dist/cjs/cli/dashboard.js.map +3 -3
  14. package/dist/cjs/cli/data.js +2 -2
  15. package/dist/cjs/cli/data.js.map +1 -1
  16. package/dist/cjs/cli/deploy.js +5 -5
  17. package/dist/cjs/cli/deploy.js.map +2 -2
  18. package/dist/cjs/cli/deploymentCreate.js +11 -5
  19. package/dist/cjs/cli/deploymentCreate.js.map +2 -2
  20. package/dist/cjs/cli/deploymentSelect.js +5 -5
  21. package/dist/cjs/cli/deploymentSelect.js.map +1 -1
  22. package/dist/cjs/cli/deploymentTokenCreate.js +5 -13
  23. package/dist/cjs/cli/deploymentTokenCreate.js.map +2 -2
  24. package/dist/cjs/cli/deploymentTokenDelete.js +4 -11
  25. package/dist/cjs/cli/deploymentTokenDelete.js.map +2 -2
  26. package/dist/cjs/cli/dev.js +6 -5
  27. package/dist/cjs/cli/dev.js.map +2 -2
  28. package/dist/cjs/cli/env.js +16 -16
  29. package/dist/cjs/cli/env.js.map +2 -2
  30. package/dist/cjs/cli/envDefault.js +10 -10
  31. package/dist/cjs/cli/envDefault.js.map +1 -1
  32. package/dist/cjs/cli/insights.js +3 -3
  33. package/dist/cjs/cli/insights.js.map +1 -1
  34. package/dist/cjs/cli/lib/aiFiles/skills.js +2 -2
  35. package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
  36. package/dist/cjs/cli/lib/command.js +1 -1
  37. package/dist/cjs/cli/lib/command.js.map +1 -1
  38. package/dist/cjs/cli/lib/deployment.js.map +1 -1
  39. package/dist/cjs/cli/lib/deploymentSelection.js +39 -0
  40. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  41. package/dist/cjs/cli/lib/dev.js +31 -0
  42. package/dist/cjs/cli/lib/dev.js.map +2 -2
  43. package/dist/cjs/cli/lib/generateDocs.js +256 -0
  44. package/dist/cjs/cli/lib/generateDocs.js.map +7 -0
  45. package/dist/cjs/cli/lib/localDeployment/anonymous.js +24 -49
  46. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +3 -3
  47. package/dist/cjs/cli/lib/localDeployment/bigBrain.js +0 -9
  48. package/dist/cjs/cli/lib/localDeployment/bigBrain.js.map +2 -2
  49. package/dist/cjs/cli/lib/localDeployment/dashboard.js +30 -68
  50. package/dist/cjs/cli/lib/localDeployment/dashboard.js.map +2 -2
  51. package/dist/cjs/cli/lib/localDeployment/download.js +14 -1
  52. package/dist/cjs/cli/lib/localDeployment/download.js.map +2 -2
  53. package/dist/cjs/cli/lib/localDeployment/filePaths.js +33 -4
  54. package/dist/cjs/cli/lib/localDeployment/filePaths.js.map +2 -2
  55. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +37 -126
  56. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +3 -3
  57. package/dist/cjs/cli/lib/localDeployment/secrets.js +91 -0
  58. package/dist/cjs/cli/lib/localDeployment/secrets.js.map +7 -0
  59. package/dist/cjs/cli/lib/localDeployment/upgrade.js +43 -28
  60. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +3 -3
  61. package/dist/cjs/cli/lib/localDeployment/utils.js +0 -19
  62. package/dist/cjs/cli/lib/localDeployment/utils.js.map +3 -3
  63. package/dist/cjs/cli/lib/runTestFunction.js +3 -3
  64. package/dist/cjs/cli/lib/runTestFunction.js.map +1 -1
  65. package/dist/cjs/cli/run.js +5 -5
  66. package/dist/cjs/cli/run.js.map +1 -1
  67. package/dist/cjs/index.js +1 -1
  68. package/dist/cjs/index.js.map +1 -1
  69. package/dist/cjs/server/impl/registration_impl.js +0 -1
  70. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  71. package/dist/cjs/server/index.js.map +2 -2
  72. package/dist/cjs/server/meta.js.map +1 -1
  73. package/dist/cjs/server/registration.js.map +1 -1
  74. package/dist/cjs-types/cli/configure.d.ts +3 -2
  75. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  76. package/dist/cjs-types/cli/dashboard.d.ts.map +1 -1
  77. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  78. package/dist/cjs-types/cli/deploymentTokenCreate.d.ts.map +1 -1
  79. package/dist/cjs-types/cli/deploymentTokenDelete.d.ts.map +1 -1
  80. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  81. package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
  82. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +16 -16
  83. package/dist/cjs-types/cli/lib/deployment.d.ts +0 -2
  84. package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
  85. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +7 -0
  86. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  87. package/dist/cjs-types/cli/lib/dev.d.ts +2 -1
  88. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  89. package/dist/cjs-types/cli/lib/generateDocs.d.ts +20 -0
  90. package/dist/cjs-types/cli/lib/generateDocs.d.ts.map +1 -0
  91. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts +2 -0
  92. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts.map +1 -0
  93. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
  94. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  95. package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
  96. package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
  97. package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
  98. package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
  99. package/dist/cjs-types/cli/lib/localDeployment/download.d.ts +11 -1
  100. package/dist/cjs-types/cli/lib/localDeployment/download.d.ts.map +1 -1
  101. package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
  102. package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
  103. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
  104. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  105. package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts +31 -0
  106. package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
  107. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
  108. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
  109. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
  110. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  111. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +0 -2
  112. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  113. package/dist/cjs-types/cli/lib/versionApi.d.ts +2 -2
  114. package/dist/cjs-types/index.d.ts +1 -1
  115. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  116. package/dist/cjs-types/server/index.d.ts +1 -1
  117. package/dist/cjs-types/server/index.d.ts.map +1 -1
  118. package/dist/cjs-types/server/meta.d.ts +16 -0
  119. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  120. package/dist/cjs-types/server/registration.d.ts +11 -5
  121. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  122. package/dist/cli.bundle.cjs +66405 -67923
  123. package/dist/cli.bundle.cjs.map +4 -4
  124. package/dist/esm/cli/aiFiles.js +2 -2
  125. package/dist/esm/cli/aiFiles.js.map +1 -1
  126. package/dist/esm/cli/configure.js +1 -4
  127. package/dist/esm/cli/configure.js.map +2 -2
  128. package/dist/esm/cli/convexExport.js +3 -3
  129. package/dist/esm/cli/convexExport.js.map +1 -1
  130. package/dist/esm/cli/convexImport.js +2 -2
  131. package/dist/esm/cli/convexImport.js.map +1 -1
  132. package/dist/esm/cli/dashboard.js +16 -3
  133. package/dist/esm/cli/dashboard.js.map +2 -2
  134. package/dist/esm/cli/data.js +2 -2
  135. package/dist/esm/cli/data.js.map +1 -1
  136. package/dist/esm/cli/deploy.js +5 -5
  137. package/dist/esm/cli/deploy.js.map +2 -2
  138. package/dist/esm/cli/deploymentCreate.js +13 -9
  139. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  140. package/dist/esm/cli/deploymentSelect.js +5 -5
  141. package/dist/esm/cli/deploymentSelect.js.map +1 -1
  142. package/dist/esm/cli/deploymentTokenCreate.js +9 -15
  143. package/dist/esm/cli/deploymentTokenCreate.js.map +2 -2
  144. package/dist/esm/cli/deploymentTokenDelete.js +8 -16
  145. package/dist/esm/cli/deploymentTokenDelete.js.map +2 -2
  146. package/dist/esm/cli/dev.js +6 -5
  147. package/dist/esm/cli/dev.js.map +2 -2
  148. package/dist/esm/cli/env.js +16 -16
  149. package/dist/esm/cli/env.js.map +2 -2
  150. package/dist/esm/cli/envDefault.js +10 -10
  151. package/dist/esm/cli/envDefault.js.map +1 -1
  152. package/dist/esm/cli/insights.js +3 -3
  153. package/dist/esm/cli/insights.js.map +1 -1
  154. package/dist/esm/cli/lib/aiFiles/skills.js +2 -2
  155. package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
  156. package/dist/esm/cli/lib/command.js +1 -1
  157. package/dist/esm/cli/lib/command.js.map +1 -1
  158. package/dist/esm/cli/lib/deployment.js.map +1 -1
  159. package/dist/esm/cli/lib/deploymentSelection.js +38 -0
  160. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  161. package/dist/esm/cli/lib/dev.js +31 -0
  162. package/dist/esm/cli/lib/dev.js.map +2 -2
  163. package/dist/esm/cli/lib/generateDocs.js +233 -0
  164. package/dist/esm/cli/lib/generateDocs.js.map +7 -0
  165. package/dist/esm/cli/lib/localDeployment/anonymous.js +30 -61
  166. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +3 -3
  167. package/dist/esm/cli/lib/localDeployment/bigBrain.js +0 -8
  168. package/dist/esm/cli/lib/localDeployment/bigBrain.js.map +2 -2
  169. package/dist/esm/cli/lib/localDeployment/dashboard.js +36 -69
  170. package/dist/esm/cli/lib/localDeployment/dashboard.js.map +2 -2
  171. package/dist/esm/cli/lib/localDeployment/download.js +15 -2
  172. package/dist/esm/cli/lib/localDeployment/download.js.map +2 -2
  173. package/dist/esm/cli/lib/localDeployment/filePaths.js +29 -2
  174. package/dist/esm/cli/lib/localDeployment/filePaths.js.map +2 -2
  175. package/dist/esm/cli/lib/localDeployment/localDeployment.js +40 -134
  176. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +3 -3
  177. package/dist/esm/cli/lib/localDeployment/secrets.js +57 -0
  178. package/dist/esm/cli/lib/localDeployment/secrets.js.map +7 -0
  179. package/dist/esm/cli/lib/localDeployment/upgrade.js +45 -28
  180. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +3 -3
  181. package/dist/esm/cli/lib/localDeployment/utils.js +0 -7
  182. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  183. package/dist/esm/cli/lib/runTestFunction.js +3 -3
  184. package/dist/esm/cli/lib/runTestFunction.js.map +1 -1
  185. package/dist/esm/cli/run.js +5 -5
  186. package/dist/esm/cli/run.js.map +1 -1
  187. package/dist/esm/index.js +1 -1
  188. package/dist/esm/index.js.map +1 -1
  189. package/dist/esm/server/impl/registration_impl.js +0 -1
  190. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  191. package/dist/esm/server/index.js.map +2 -2
  192. package/dist/esm-types/cli/configure.d.ts +3 -2
  193. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  194. package/dist/esm-types/cli/dashboard.d.ts.map +1 -1
  195. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  196. package/dist/esm-types/cli/deploymentTokenCreate.d.ts.map +1 -1
  197. package/dist/esm-types/cli/deploymentTokenDelete.d.ts.map +1 -1
  198. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  199. package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
  200. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +16 -16
  201. package/dist/esm-types/cli/lib/deployment.d.ts +0 -2
  202. package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
  203. package/dist/esm-types/cli/lib/deploymentSelection.d.ts +7 -0
  204. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  205. package/dist/esm-types/cli/lib/dev.d.ts +2 -1
  206. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  207. package/dist/esm-types/cli/lib/generateDocs.d.ts +20 -0
  208. package/dist/esm-types/cli/lib/generateDocs.d.ts.map +1 -0
  209. package/dist/esm-types/cli/lib/generateDocs.test.d.ts +2 -0
  210. package/dist/esm-types/cli/lib/generateDocs.test.d.ts.map +1 -0
  211. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
  212. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  213. package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
  214. package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
  215. package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
  216. package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
  217. package/dist/esm-types/cli/lib/localDeployment/download.d.ts +11 -1
  218. package/dist/esm-types/cli/lib/localDeployment/download.d.ts.map +1 -1
  219. package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
  220. package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
  221. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
  222. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  223. package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts +31 -0
  224. package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
  225. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
  226. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
  227. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
  228. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  229. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +0 -2
  230. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  231. package/dist/esm-types/cli/lib/versionApi.d.ts +2 -2
  232. package/dist/esm-types/index.d.ts +1 -1
  233. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  234. package/dist/esm-types/server/index.d.ts +1 -1
  235. package/dist/esm-types/server/index.d.ts.map +1 -1
  236. package/dist/esm-types/server/meta.d.ts +16 -0
  237. package/dist/esm-types/server/meta.d.ts.map +1 -1
  238. package/dist/esm-types/server/registration.d.ts +11 -5
  239. package/dist/esm-types/server/registration.d.ts.map +1 -1
  240. package/dist/react.bundle.js +1 -1
  241. package/dist/react.bundle.js.map +1 -1
  242. package/package.json +4 -2
  243. package/src/browser/sync/request_manager.test.ts +2 -2
  244. package/src/cli/aiFiles.ts +2 -2
  245. package/src/cli/configure.ts +4 -6
  246. package/src/cli/convexExport.ts +3 -3
  247. package/src/cli/convexImport.ts +2 -2
  248. package/src/cli/dashboard.ts +29 -3
  249. package/src/cli/data.ts +2 -2
  250. package/src/cli/deploy.ts +5 -5
  251. package/src/cli/deploymentCreate.test.ts +151 -24
  252. package/src/cli/deploymentCreate.ts +21 -11
  253. package/src/cli/deploymentSelect.ts +5 -5
  254. package/src/cli/deploymentSelection.test.ts +0 -3
  255. package/src/cli/deploymentToken.test.ts +34 -23
  256. package/src/cli/deploymentTokenCreate.ts +9 -21
  257. package/src/cli/deploymentTokenDelete.ts +8 -23
  258. package/src/cli/dev.ts +5 -4
  259. package/src/cli/env.ts +16 -16
  260. package/src/cli/envDefault.ts +10 -10
  261. package/src/cli/insights.ts +3 -3
  262. package/src/cli/lib/aiFiles/integration.test.ts +2 -0
  263. package/src/cli/lib/aiFiles/skills.ts +3 -3
  264. package/src/cli/lib/command.ts +2 -2
  265. package/src/cli/lib/deployment.ts +0 -5
  266. package/src/cli/lib/deploymentSelection.ts +67 -0
  267. package/src/cli/lib/dev.ts +39 -0
  268. package/src/cli/lib/generateDocs.test.ts +326 -0
  269. package/src/cli/lib/generateDocs.ts +393 -0
  270. package/src/cli/lib/localDeployment/anonymous.ts +48 -72
  271. package/src/cli/lib/localDeployment/bigBrain.ts +7 -15
  272. package/src/cli/lib/localDeployment/dashboard.ts +48 -80
  273. package/src/cli/lib/localDeployment/download.ts +34 -3
  274. package/src/cli/lib/localDeployment/filePaths.ts +66 -6
  275. package/src/cli/lib/localDeployment/localDeployment.ts +46 -184
  276. package/src/cli/lib/localDeployment/run.test.ts +6 -6
  277. package/src/cli/lib/localDeployment/secrets.test.ts +53 -0
  278. package/src/cli/lib/localDeployment/secrets.ts +93 -0
  279. package/src/cli/lib/localDeployment/tests/keygenFailure.mjs +9 -0
  280. package/src/cli/lib/localDeployment/tests/keygenSuccess.mjs +31 -0
  281. package/src/cli/lib/localDeployment/upgrade.ts +52 -38
  282. package/src/cli/lib/localDeployment/utils.ts +0 -10
  283. package/src/cli/lib/runTestFunction.ts +3 -3
  284. package/src/cli/run.ts +5 -5
  285. package/src/index.ts +1 -1
  286. package/src/server/impl/registration_impl.ts +0 -2
  287. package/src/server/index.ts +1 -0
  288. package/src/server/meta.ts +17 -0
  289. package/src/server/registration.test.ts +2 -35
  290. package/src/server/registration.ts +10 -19
@@ -187,20 +187,23 @@ afterEach(() => {
187
187
  });
188
188
 
189
189
  describe("deployment token create", () => {
190
- test("crashes when not authed with a personal access token", async () => {
191
- setAuthKind("deploymentKey");
192
- mockSelectedDeployment("joyful-capybara-123", "dev");
193
-
194
- await expect(
195
- deploymentTokenCreate.parseAsync(["my-token"], { from: "user" }),
196
- ).rejects.toThrow();
197
- expect(process.stderr.write).toHaveBeenCalledWith(
198
- expect.stringContaining(
199
- "requires being logged in with a personal access token",
200
- ),
201
- );
202
- expect(mockPlatformPost).not.toHaveBeenCalled();
203
- });
190
+ test.each(["deploymentKey", "projectKey", "previewDeployKey"] as const)(
191
+ "crashes when authed with a %s instead of a personal access token",
192
+ async (kind) => {
193
+ setAuthKind(kind);
194
+ mockSelectedDeployment("joyful-capybara-123", "dev");
195
+
196
+ await expect(
197
+ deploymentTokenCreate.parseAsync(["my-token"], { from: "user" }),
198
+ ).rejects.toThrow();
199
+ expect(process.stderr.write).toHaveBeenCalledWith(
200
+ expect.stringContaining(
201
+ "requires being logged in with a personal access token",
202
+ ),
203
+ );
204
+ expect(mockPlatformPost).not.toHaveBeenCalled();
205
+ },
206
+ );
204
207
 
205
208
  test("crashes when no auth is configured at all", async () => {
206
209
  setNoAuth();
@@ -311,15 +314,23 @@ describe("deployment token create", () => {
311
314
  });
312
315
 
313
316
  describe("deployment token delete", () => {
314
- test("crashes when not authed with a personal access token", async () => {
315
- setAuthKind("deploymentKey");
316
- mockSelectedDeployment("joyful-capybara-123", "dev");
317
-
318
- await expect(
319
- deploymentTokenDelete.parseAsync(["my-token"], { from: "user" }),
320
- ).rejects.toThrow();
321
- expect(mockPlatformPost).not.toHaveBeenCalled();
322
- });
317
+ test.each(["deploymentKey", "projectKey", "previewDeployKey"] as const)(
318
+ "crashes when authed with a %s instead of a personal access token",
319
+ async (kind) => {
320
+ setAuthKind(kind);
321
+ mockSelectedDeployment("joyful-capybara-123", "dev");
322
+
323
+ await expect(
324
+ deploymentTokenDelete.parseAsync(["my-token"], { from: "user" }),
325
+ ).rejects.toThrow();
326
+ expect(process.stderr.write).toHaveBeenCalledWith(
327
+ expect.stringContaining(
328
+ "requires being logged in with a personal access token",
329
+ ),
330
+ );
331
+ expect(mockPlatformPost).not.toHaveBeenCalled();
332
+ },
333
+ );
323
334
 
324
335
  test("sends the friendly name as-is when no `|` is present", async () => {
325
336
  setAuthKind("accessToken");
@@ -1,13 +1,14 @@
1
1
  import { Command } from "@commander-js/extra-typings";
2
- import { chalkStderr } from "chalk";
3
2
  import { oneoffContext } from "../bundler/context.js";
4
3
  import { logFinishedStep, logOutput, showSpinner } from "../bundler/log.js";
5
4
  import { loadSelectedDeploymentCredentials } from "./lib/api.js";
6
5
  import { actionDescription } from "./lib/command.js";
7
- import { getDeploymentSelection } from "./lib/deploymentSelection.js";
6
+ import {
7
+ ensureLoggedInWithAccessToken,
8
+ getDeploymentSelection,
9
+ } from "./lib/deploymentSelection.js";
8
10
  import { changedEnvVarFile } from "./lib/envvars.js";
9
11
  import {
10
- CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,
11
12
  CONVEX_DEPLOY_KEY_ENV_VAR_NAME,
12
13
  ENV_VAR_FILE_PATH,
13
14
  typedPlatformClient,
@@ -19,10 +20,10 @@ export const deploymentTokenCreate = new Command("create")
19
20
  [
20
21
  `Creates a deploy key that, when set as \`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\`, scopes all commands to the target deployment.`,
21
22
  "",
22
- "- Print a new deploy key to stdout: `npx convex deployment token create my-token`",
23
- `- Save a new deploy key in \`${ENV_VAR_FILE_PATH}\`: \`npx convex deployment token create my-token --save-env\``,
24
- "- Save a new deploy key in a custom env file: `npx convex deployment token create ci-token --save-env .env.production`",
25
- "- Create a key for the project's prod: `npx convex deployment token create ci-token --deployment prod`",
23
+ " Print a new deploy key to stdout: `npx convex deployment token create my-token`",
24
+ `• Save a new deploy key in \`${ENV_VAR_FILE_PATH}\`: \`npx convex deployment token create my-token --save-env\``,
25
+ " Save a new deploy key in a custom env file: `npx convex deployment token create ci-token --save-env .env.production`",
26
+ " Create a key for the project's prod: `npx convex deployment token create ci-token --deployment prod`",
26
27
  ].join("\n"),
27
28
  )
28
29
  .argument("<name>", "Name for the new deploy key")
@@ -36,20 +37,7 @@ export const deploymentTokenCreate = new Command("create")
36
37
  .action(async (name, options) => {
37
38
  const ctx = await oneoffContext(options);
38
39
 
39
- const auth = ctx.bigBrainAuth();
40
- if (auth === null || auth.kind !== "accessToken") {
41
- return await ctx.crash({
42
- exitCode: 1,
43
- errorType: "fatal",
44
- printedMessage: `Creating a deploy key currently requires being logged in with a personal access token. ${
45
- process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]
46
- ? `Unset ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}`
47
- : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME]
48
- ? `Unset ${CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME}`
49
- : `Run ${chalkStderr.bold("npx convex login")}`
50
- } and try again.`,
51
- });
52
- }
40
+ await ensureLoggedInWithAccessToken(ctx, "Creating a deploy key");
53
41
 
54
42
  const deploymentSelection = await getDeploymentSelection(ctx, options);
55
43
  const deployment = await loadSelectedDeploymentCredentials(
@@ -4,12 +4,11 @@ import { oneoffContext } from "../bundler/context.js";
4
4
  import { logFinishedStep, showSpinner } from "../bundler/log.js";
5
5
  import { loadSelectedDeploymentCredentials } from "./lib/api.js";
6
6
  import { actionDescription } from "./lib/command.js";
7
- import { getDeploymentSelection } from "./lib/deploymentSelection.js";
8
7
  import {
9
- CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,
10
- CONVEX_DEPLOY_KEY_ENV_VAR_NAME,
11
- typedPlatformClient,
12
- } from "./lib/utils/utils.js";
8
+ ensureLoggedInWithAccessToken,
9
+ getDeploymentSelection,
10
+ } from "./lib/deploymentSelection.js";
11
+ import { typedPlatformClient } from "./lib/utils/utils.js";
13
12
 
14
13
  export const deploymentTokenDelete = new Command("delete")
15
14
  .summary("Delete an access token")
@@ -19,9 +18,9 @@ export const deploymentTokenDelete = new Command("delete")
19
18
  "",
20
19
  "The positional `<nameOrToken>` can be the unique name of the deploy key (as passed to `token create`) or the deploy key value itself. The target deployment defaults to the currently-selected one; pass `--deployment` to target a different deployment.",
21
20
  "",
22
- "- Delete by name: `npx convex deployment token delete my-token`",
23
- "- Delete by value: `npx convex deployment token delete 'dev:happy-animal-123|ey...'`",
24
- "- Target prod: `npx convex deployment token delete ci-token --deployment prod`",
21
+ " Delete by name: `npx convex deployment token delete my-token`",
22
+ " Delete by value: `npx convex deployment token delete 'dev:happy-animal-123|ey...'`",
23
+ " Target prod: `npx convex deployment token delete ci-token --deployment prod`",
25
24
  ].join("\n"),
26
25
  )
27
26
  .argument(
@@ -34,21 +33,7 @@ export const deploymentTokenDelete = new Command("delete")
34
33
  .action(async (nameOrToken, options) => {
35
34
  const ctx = await oneoffContext(options);
36
35
 
37
- const auth = ctx.bigBrainAuth();
38
- if (auth === null || auth.kind !== "accessToken") {
39
- return await ctx.crash({
40
- exitCode: 1,
41
- errorType: "fatal",
42
- printedMessage: `Deleting a deploy key requires being logged in with a personal access token. ${
43
- auth === null
44
- ? "Run "
45
- : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME] &&
46
- !process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]
47
- ? `Unset ${CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME} and run `
48
- : `Unset ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} and run `
49
- }${chalkStderr.bold("npx convex login")} and try again.`,
50
- });
51
- }
36
+ await ensureLoggedInWithAccessToken(ctx, "Deleting a deploy key");
52
37
 
53
38
  const deploymentSelection = await getDeploymentSelection(ctx, options);
54
39
  const deployment = await loadSelectedDeploymentCredentials(
package/src/cli/dev.ts CHANGED
@@ -66,7 +66,7 @@ export const dev = new Command("dev")
66
66
  .addOption(
67
67
  new Option(
68
68
  "--start <command>",
69
- "Start a long-running command alongside `convex dev`, like a frontend " +
69
+ "Start a long-running command alongside `npx convex dev`, like a frontend " +
70
70
  "dev server. The command inherits stdin/stdout so you can interact " +
71
71
  "with it directly. Example: npx convex dev --start 'vite --open'",
72
72
  ).conflicts(["--run", "--run-sh"]),
@@ -93,9 +93,9 @@ export const dev = new Command("dev")
93
93
  "--tail-logs [mode]",
94
94
  [
95
95
  "Choose whether to tail Convex function logs in this terminal: ",
96
- "- `always` shows logs continuously",
97
- "- `pause-on-deploy` (the default) pauses logs during deploys so you can spot sync issues",
98
- "- `disable` hides logs while developing.",
96
+ " `always` shows logs continuously",
97
+ " `pause-on-deploy` (the default) pauses logs during deploys so you can spot sync issues",
98
+ " `disable` hides logs while developing.",
99
99
  ].join("\n"),
100
100
  )
101
101
  .choices(["always", "pause-on-deploy", "disable"] as const)
@@ -280,6 +280,7 @@ Same format as .env.local or .env files, and overrides them.`,
280
280
  credentials.deploymentFields.deploymentType,
281
281
  }
282
282
  : {}),
283
+ backendVersion: localOptions.backendVersion,
283
284
  },
284
285
  devOptions,
285
286
  ),
package/src/cli/env.ts CHANGED
@@ -32,16 +32,16 @@ const envSetCmd = new Command("set")
32
32
  [
33
33
  "Set environment variables on your deployment.",
34
34
  "",
35
- "- `npx convex env set NAME 'value'`",
36
- "- `npx convex env set NAME # omit a value to set one interactively`",
37
- "- `npx convex env set NAME --from-file value.txt`",
38
- "- `npx convex env set --from-file .env.defaults`",
35
+ " `npx convex env set NAME 'value'`",
36
+ " `npx convex env set NAME # omit a value to set one interactively`",
37
+ " `npx convex env set NAME --from-file value.txt`",
38
+ " `npx convex env set --from-file .env.defaults`",
39
39
  "",
40
40
  "When setting multiple values, it will refuse all changes if any variables are already set to different values by default. Pass --force to overwrite the provided values.",
41
41
  "",
42
42
  "To keep secrets out of your shell history, omit the value to pipe it in via stdin, for instance:",
43
- "- `pbpaste | npx convex env set API_KEY` (macOS)",
44
- "- `Get-Clipboard | npx convex env set API_KEY` (Windows PowerShell)",
43
+ " `pbpaste | npx convex env set API_KEY` (macOS)",
44
+ " `Get-Clipboard | npx convex env set API_KEY` (Windows PowerShell)",
45
45
  "",
46
46
  "To update many variables at once, save them with `npx convex env list > .env.convex`, edit the file, then reapply the changes with `npx convex env set --force < .env.convex`.",
47
47
  ].join("\n"),
@@ -164,12 +164,12 @@ const envRemoveCmd = new Command("remove")
164
164
  });
165
165
 
166
166
  const envListCmd = new Command("list")
167
- .summary("List all variables")
167
+ .summary("List all variables and their values")
168
168
  .description(
169
169
  [
170
- "- List all variables: `npx convex env list`",
171
- "- Save all variables to a file: `npx convex env list > .env.convex`",
172
- "- Append to a file: `npx convex env list >> .env.convex`",
170
+ " List all variables: `npx convex env list`",
171
+ " Save all variables to a file: `npx convex env list > .env.convex`",
172
+ " Append to a file: `npx convex env list >> .env.convex`",
173
173
  ].join("\n"),
174
174
  )
175
175
  .configureHelp({ showGlobalOptions: true })
@@ -194,12 +194,12 @@ export const env = new Command("env")
194
194
  [
195
195
  "Set and view environment variables on your deployment",
196
196
  "",
197
- "- Set a variable: `npx convex env set NAME 'value'`",
198
- "- Set interactively: `npx convex env set NAME`",
199
- "- Set multiple from file: `npx convex env set --from-file .env`",
200
- "- Unset a variable: `npx convex env remove NAME`",
201
- "- List all variables: `npx convex env list`",
202
- "- Print a variable's value: `npx convex env get NAME`",
197
+ " Set a variable: `npx convex env set NAME 'value'`",
198
+ " Set interactively: `npx convex env set NAME`",
199
+ " Set multiple from file: `npx convex env set --from-file .env`",
200
+ " Unset a variable: `npx convex env remove NAME`",
201
+ " List all variables: `npx convex env list`",
202
+ " Print a variable's value: `npx convex env get NAME`",
203
203
  "",
204
204
  "By default, this sets and views variables on your dev deployment.",
205
205
  "",
@@ -52,10 +52,10 @@ const envDefaultSet = addEnvDefaultOptions(
52
52
  [
53
53
  "Set default environment variables for your project's deployment type.",
54
54
  "",
55
- "- `npx convex env default set NAME 'value'`",
56
- "- `npx convex env default set NAME # omit a value to set one interactively`",
57
- "- `npx convex env default set NAME --from-file value.txt`",
58
- "- `npx convex env default set --from-file .env.defaults`",
55
+ " `npx convex env default set NAME 'value'`",
56
+ " `npx convex env default set NAME # omit a value to set one interactively`",
57
+ " `npx convex env default set NAME --from-file value.txt`",
58
+ " `npx convex env default set --from-file .env.defaults`",
59
59
  "",
60
60
  "When setting multiple values, it will refuse all changes if any variables are already set to different values by default. Pass --force to overwrite the provided values.",
61
61
  "",
@@ -122,7 +122,7 @@ const envDefaultRemove = addEnvDefaultOptions(
122
122
  [
123
123
  "Unset a default variable.",
124
124
  "",
125
- "- `npx convex env default remove NAME`",
125
+ " `npx convex env default remove NAME`",
126
126
  "",
127
127
  "If the variable doesn't exist, the command doesn't do anything and succeeds.",
128
128
  "",
@@ -146,7 +146,7 @@ const envDefaultList = addEnvDefaultOptions(
146
146
  [
147
147
  "List all default variables.",
148
148
  "",
149
- "- `npx convex env default list`",
149
+ " `npx convex env default list`",
150
150
  "",
151
151
  "The deployment type is determined by the current deployment (local maps to dev), or by --type if provided.",
152
152
  ].join("\n"),
@@ -169,10 +169,10 @@ export const envDefault = new Command("default")
169
169
  "",
170
170
  "The default environment variables read and written to by this command are the ones for the deployment type of the current deployment (i.e. dev in most cases), unless --type is provided.",
171
171
  "",
172
- "- Set a default variable: `npx convex env default set NAME 'value'`",
173
- "- Unset a default variable: `npx convex env default remove NAME`",
174
- "- List all default variables: `npx convex env default list`",
175
- "- Print a default variable's value: `npx convex env default get NAME`",
172
+ " Set a default variable: `npx convex env default set NAME 'value'`",
173
+ " Unset a default variable: `npx convex env default remove NAME`",
174
+ " List all default variables: `npx convex env default list`",
175
+ " Print a default variable's value: `npx convex env default get NAME`",
176
176
  ].join("\n"),
177
177
  )
178
178
  .addCommand(envDefaultSet)
@@ -92,9 +92,9 @@ export const insights = new Command("insights")
92
92
  "Show health insights for a Convex deployment over the last 72 hours.",
93
93
  "Displays OCC conflicts and resource limit issues that may indicate performance problems.",
94
94
  "",
95
- "- Show insights: `npx convex insights`",
96
- "- Include recent events for each insight: `npx convex insights --details`",
97
- "- Check the production deployment: `npx convex insights --prod`",
95
+ " Show insights: `npx convex insights`",
96
+ " Include recent events for each insight: `npx convex insights --details`",
97
+ " Check the production deployment: `npx convex insights --prod`",
98
98
  "",
99
99
  "This command is only available for Convex cloud deployments when logged in as a user.",
100
100
  ].join("\n"),
@@ -151,6 +151,7 @@ describe("ai-files integration with default convex/ directory", () => {
151
151
  "add",
152
152
  "get-convex/agent-skills",
153
153
  "--yes",
154
+ "--copy",
154
155
  "--agent",
155
156
  "claude-code",
156
157
  "--agent",
@@ -173,6 +174,7 @@ describe("ai-files integration with default convex/ directory", () => {
173
174
  "add",
174
175
  "get-convex/agent-skills",
175
176
  "--yes",
177
+ "--copy",
176
178
  "--agent",
177
179
  "cursor",
178
180
  "--agent",
@@ -23,11 +23,11 @@ function configuredSkillAgents(
23
23
  }
24
24
 
25
25
  /**
26
- * Runs `npx skills add get-convex/agent-skills --yes` in the given directory.
26
+ * Runs `npx skills add get-convex/agent-skills --yes --copy` in the given directory.
27
27
  * Returns true on success, false if the process fails or cannot be started.
28
28
  */
29
29
  function runSkillsAdd(cwd: string, agents: string[]): Promise<boolean> {
30
- const args = ["add", "get-convex/agent-skills", "--yes"];
30
+ const args = ["add", "get-convex/agent-skills", "--yes", "--copy"];
31
31
  for (const agent of agents) {
32
32
  args.push("--agent", agent);
33
33
  }
@@ -135,7 +135,7 @@ export async function installSkills({
135
135
  if (!skillsOk) {
136
136
  logMessage(
137
137
  chalkStderr.yellow(
138
- "Could not install agent skills. You can retry manually with: npx skills add get-convex/agent-skills",
138
+ "Could not install agent skills. You can retry manually with: npx skills add get-convex/agent-skills --copy",
139
139
  ),
140
140
  );
141
141
  return;
@@ -495,8 +495,8 @@ Command.prototype.addImportOptions = function () {
495
495
  new Option(
496
496
  "--replace-all",
497
497
  "Replace all existing data in the deployment with the imported tables,\n" +
498
- " deleting tables that don't appear in the import file or the schema,\n" +
499
- " and clearing tables that appear in the schema but not in the import file",
498
+ "deleting tables that don't appear in the import file or the schema,\n" +
499
+ "and clearing tables that appear in the schema but not in the import file",
500
500
  )
501
501
  .conflicts("--append")
502
502
  .conflicts("--replace"),
@@ -255,10 +255,6 @@ export async function getTeamAndProjectFromPreviewAdminKey(
255
255
  return { teamSlug, projectSlug };
256
256
  }
257
257
 
258
- export type OnDeploymentActivityFunc = (
259
- isOffline: boolean,
260
- wasOffline: boolean,
261
- ) => Promise<void>;
262
258
  export type CleanupDeploymentFunc = () => Promise<void>;
263
259
  export type DeploymentDetails = {
264
260
  deploymentName: string;
@@ -266,5 +262,4 @@ export type DeploymentDetails = {
266
262
  adminKey: string;
267
263
  reference: string | null;
268
264
  isDefault: boolean;
269
- onActivity: OnDeploymentActivityFunc | null;
270
265
  };
@@ -35,6 +35,7 @@ import { getBuildEnvironment } from "./envvars.js";
35
35
  import { readGlobalConfig } from "./utils/globalConfig.js";
36
36
  import {
37
37
  CONVEX_DEPLOYMENT_ENV_VAR_NAME,
38
+ CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,
38
39
  CONVEX_DEPLOY_KEY_ENV_VAR_NAME,
39
40
  CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,
40
41
  CONVEX_SELF_HOSTED_URL_VAR_NAME,
@@ -217,6 +218,72 @@ function getBigBrainAuth(
217
218
  return null;
218
219
  }
219
220
 
221
+ // These guards mirror the management API's auth rules client-side so we can
222
+ // fail with a clear message instead of an opaque 401; the server stays
223
+ // authoritative. Creating a deployment also allows project keys, while the
224
+ // deploy-key commands stay personal-access-token only.
225
+
226
+ /** Crashes unless logged in with a personal access token (not a deploy key). */
227
+ export async function ensureLoggedInWithAccessToken(
228
+ ctx: Context,
229
+ action: string,
230
+ ): Promise<void> {
231
+ const auth = ctx.bigBrainAuth();
232
+ if (auth !== null && auth.kind === "accessToken") {
233
+ return;
234
+ }
235
+ // Name whichever deploy-key env var is in effect (CONVEX_DEPLOY_KEY wins).
236
+ const prefix =
237
+ auth === null
238
+ ? "Run "
239
+ : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME] &&
240
+ !process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]
241
+ ? `Unset ${CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME} and run `
242
+ : `Unset ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} and run `;
243
+ return await ctx.crash({
244
+ exitCode: 1,
245
+ errorType: "fatal",
246
+ printedMessage: `${action} requires being logged in with a personal access token. ${prefix}${chalkStderr.bold(
247
+ "npx convex login",
248
+ )} and try again.`,
249
+ });
250
+ }
251
+
252
+ /**
253
+ * Crashes unless the auth can create a deployment: personal access tokens and
254
+ * project keys are accepted, deploy keys are not.
255
+ */
256
+ export async function ensureAuthCanCreateDeployment(
257
+ ctx: Context,
258
+ ): Promise<void> {
259
+ const auth = ctx.bigBrainAuth();
260
+ if (
261
+ auth !== null &&
262
+ (auth.kind === "accessToken" || auth.kind === "projectKey")
263
+ ) {
264
+ return;
265
+ }
266
+ if (auth === null) {
267
+ return await ctx.crash({
268
+ exitCode: 1,
269
+ errorType: "fatal",
270
+ printedMessage: `Creating a deployment requires logging in. Run ${chalkStderr.bold(
271
+ "npx convex login",
272
+ )} and try again.`,
273
+ });
274
+ }
275
+ const envVar = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]
276
+ ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME
277
+ : CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME;
278
+ return await ctx.crash({
279
+ exitCode: 1,
280
+ errorType: "fatal",
281
+ printedMessage: `Creating a deployment isn't supported with a deploy key (${envVar}). Run ${chalkStderr.bold(
282
+ "npx convex login",
283
+ )} (or use a project key) and try again.`,
284
+ });
285
+ }
286
+
220
287
  // ----------------------------------------------------------------------------
221
288
  // Deployment Selection
222
289
  // ----------------------------------------------------------------------------
@@ -30,6 +30,9 @@ import {
30
30
  syncAuthKitConfigAfterPush,
31
31
  ensureAuthKitProvisionedBeforeBuild,
32
32
  } from "./workos/workos.js";
33
+ import { handleDashboard } from "./localDeployment/dashboard.js";
34
+ import { loadDeploymentConfig } from "./localDeployment/filePaths.js";
35
+ import { LocalDeploymentError } from "./localDeployment/errors.js";
33
36
 
34
37
  export async function devAgainstDeployment(
35
38
  ctx: OneoffCtx,
@@ -38,6 +41,7 @@ export async function devAgainstDeployment(
38
41
  adminKey: string;
39
42
  deploymentName: string | null;
40
43
  deploymentType?: DeploymentType;
44
+ backendVersion?: string | undefined;
41
45
  },
42
46
  devOptions: {
43
47
  verbose: boolean;
@@ -82,6 +86,41 @@ export async function devAgainstDeployment(
82
86
  }
83
87
  }
84
88
 
89
+ // Anonymous mode starts a local dashboard server alongside long-running `npx convex dev` commands.
90
+ if (
91
+ !devOptions.once &&
92
+ !devOptions.untilSuccess &&
93
+ credentials.deploymentType === "anonymous" &&
94
+ credentials.deploymentName !== null
95
+ ) {
96
+ const deploymentConfig = loadDeploymentConfig(
97
+ ctx,
98
+ "anonymous",
99
+ credentials.deploymentName,
100
+ );
101
+ if (deploymentConfig === null) {
102
+ return await ctx.crash({
103
+ exitCode: 1,
104
+ errorType: "fatal",
105
+ printedMessage: `Could not find local deployment config. This is a bug in Convex.`,
106
+ errForSentry: new LocalDeploymentError(
107
+ `Could not find local deployment config to start the anonymous dashboard.`,
108
+ ),
109
+ });
110
+ }
111
+ await handleDashboard(
112
+ ctx,
113
+ {
114
+ name: credentials.deploymentName,
115
+ cloudPort: deploymentConfig.ports.cloud,
116
+ adminKey: deploymentConfig.adminKey,
117
+ },
118
+ {
119
+ backendVersion: credentials.backendVersion,
120
+ },
121
+ );
122
+ }
123
+
85
124
  const promises = [];
86
125
  if (devOptions.tailLogs !== "disable") {
87
126
  promises.push(