convex 1.48.0 → 1.49.0-alpha.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 (248) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/bundler/context.js +7 -5
  5. package/dist/cjs/bundler/context.js.map +2 -2
  6. package/dist/cjs/bundler/fs.js +47 -6
  7. package/dist/cjs/bundler/fs.js.map +2 -2
  8. package/dist/cjs/cli/account.js +237 -0
  9. package/dist/cjs/cli/account.js.map +7 -0
  10. package/dist/cjs/cli/configure.js +15 -2
  11. package/dist/cjs/cli/configure.js.map +2 -2
  12. package/dist/cjs/cli/lib/accountManagement.js +196 -0
  13. package/dist/cjs/cli/lib/accountManagement.js.map +7 -0
  14. package/dist/cjs/cli/lib/accounts.js +334 -0
  15. package/dist/cjs/cli/lib/accounts.js.map +7 -0
  16. package/dist/cjs/cli/lib/deployKeyWarning.js +43 -0
  17. package/dist/cjs/cli/lib/deployKeyWarning.js.map +7 -0
  18. package/dist/cjs/cli/lib/deployment.js +2 -0
  19. package/dist/cjs/cli/lib/deployment.js.map +2 -2
  20. package/dist/cjs/cli/lib/deploymentSelection.js +27 -18
  21. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  22. package/dist/cjs/cli/lib/envvars.js +32 -0
  23. package/dist/cjs/cli/lib/envvars.js.map +2 -2
  24. package/dist/cjs/cli/lib/fsUtils.js +1 -1
  25. package/dist/cjs/cli/lib/fsUtils.js.map +2 -2
  26. package/dist/cjs/cli/lib/generateDocs.js +1 -1
  27. package/dist/cjs/cli/lib/generateDocs.js.map +1 -1
  28. package/dist/cjs/cli/lib/login.js +42 -4
  29. package/dist/cjs/cli/lib/login.js.map +3 -3
  30. package/dist/cjs/cli/lib/mcp/requestContext.js +5 -1
  31. package/dist/cjs/cli/lib/mcp/requestContext.js.map +2 -2
  32. package/dist/cjs/cli/lib/plugins/claudeCode.js +188 -0
  33. package/dist/cjs/cli/lib/plugins/claudeCode.js.map +7 -0
  34. package/dist/cjs/cli/lib/plugins/codex.js +167 -0
  35. package/dist/cjs/cli/lib/plugins/codex.js.map +7 -0
  36. package/dist/cjs/cli/lib/plugins/harness.js +50 -0
  37. package/dist/cjs/cli/lib/plugins/harness.js.map +7 -0
  38. package/dist/cjs/cli/lib/plugins/marketplaces.js +76 -0
  39. package/dist/cjs/cli/lib/plugins/marketplaces.js.map +7 -0
  40. package/dist/cjs/cli/lib/plugins/skills.js +98 -0
  41. package/dist/cjs/cli/lib/plugins/skills.js.map +7 -0
  42. package/dist/cjs/cli/lib/plugins/utils.js +125 -0
  43. package/dist/cjs/cli/lib/plugins/utils.js.map +7 -0
  44. package/dist/cjs/cli/lib/utils/utils.js +18 -9
  45. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  46. package/dist/cjs/cli/login.js +213 -114
  47. package/dist/cjs/cli/login.js.map +3 -3
  48. package/dist/cjs/cli/logout.js +113 -12
  49. package/dist/cjs/cli/logout.js.map +3 -3
  50. package/dist/cjs/cli/mcp.js +43 -10
  51. package/dist/cjs/cli/mcp.js.map +3 -3
  52. package/dist/cjs/cli/plugins.js +114 -0
  53. package/dist/cjs/cli/plugins.js.map +7 -0
  54. package/dist/cjs/cli/program.js +3 -1
  55. package/dist/cjs/cli/program.js.map +2 -2
  56. package/dist/cjs/index.js +1 -1
  57. package/dist/cjs/index.js.map +1 -1
  58. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  59. package/dist/cjs-types/bundler/context.d.ts +5 -0
  60. package/dist/cjs-types/bundler/context.d.ts.map +1 -1
  61. package/dist/cjs-types/bundler/fs.d.ts +7 -2
  62. package/dist/cjs-types/bundler/fs.d.ts.map +1 -1
  63. package/dist/cjs-types/cli/account.d.ts +6 -0
  64. package/dist/cjs-types/cli/account.d.ts.map +1 -0
  65. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  66. package/dist/cjs-types/cli/lib/accountManagement.d.ts +10 -0
  67. package/dist/cjs-types/cli/lib/accountManagement.d.ts.map +1 -0
  68. package/dist/cjs-types/cli/lib/accounts.d.ts +59 -0
  69. package/dist/cjs-types/cli/lib/accounts.d.ts.map +1 -0
  70. package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts +3 -0
  71. package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
  72. package/dist/cjs-types/cli/lib/deployment.d.ts +2 -0
  73. package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
  74. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +2 -1
  75. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  76. package/dist/cjs-types/cli/lib/envvars.d.ts +6 -0
  77. package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
  78. package/dist/cjs-types/cli/lib/fsUtils.d.ts +1 -0
  79. package/dist/cjs-types/cli/lib/fsUtils.d.ts.map +1 -1
  80. package/dist/cjs-types/cli/lib/login.d.ts +3 -1
  81. package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
  82. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
  83. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  84. package/dist/cjs-types/cli/lib/plugins/claudeCode.d.ts +25 -0
  85. package/dist/cjs-types/cli/lib/plugins/claudeCode.d.ts.map +1 -0
  86. package/dist/cjs-types/cli/lib/plugins/codex.d.ts +25 -0
  87. package/dist/cjs-types/cli/lib/plugins/codex.d.ts.map +1 -0
  88. package/dist/cjs-types/cli/lib/plugins/harness.d.ts +33 -0
  89. package/dist/cjs-types/cli/lib/plugins/harness.d.ts.map +1 -0
  90. package/dist/cjs-types/cli/lib/plugins/marketplaces.d.ts +40 -0
  91. package/dist/cjs-types/cli/lib/plugins/marketplaces.d.ts.map +1 -0
  92. package/dist/cjs-types/cli/lib/plugins/skills.d.ts +18 -0
  93. package/dist/cjs-types/cli/lib/plugins/skills.d.ts.map +1 -0
  94. package/dist/cjs-types/cli/lib/plugins/utils.d.ts +21 -0
  95. package/dist/cjs-types/cli/lib/plugins/utils.d.ts.map +1 -0
  96. package/dist/cjs-types/cli/lib/utils/utils.d.ts +5 -0
  97. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  98. package/dist/cjs-types/cli/login.d.ts +21 -0
  99. package/dist/cjs-types/cli/login.d.ts.map +1 -1
  100. package/dist/cjs-types/cli/logout.d.ts +8 -1
  101. package/dist/cjs-types/cli/logout.d.ts.map +1 -1
  102. package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
  103. package/dist/cjs-types/cli/plugins.d.ts +3 -0
  104. package/dist/cjs-types/cli/plugins.d.ts.map +1 -0
  105. package/dist/cjs-types/cli/program.d.ts.map +1 -1
  106. package/dist/cjs-types/index.d.ts +1 -1
  107. package/dist/cjs-types/index.d.ts.map +1 -1
  108. package/dist/cjs-types/server/impl/actions_impl.d.ts +3 -2
  109. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  110. package/dist/cli.bundle.cjs +10059 -7094
  111. package/dist/cli.bundle.cjs.map +4 -4
  112. package/dist/esm/bundler/context.js +7 -5
  113. package/dist/esm/bundler/context.js.map +2 -2
  114. package/dist/esm/bundler/fs.js +47 -6
  115. package/dist/esm/bundler/fs.js.map +2 -2
  116. package/dist/esm/cli/account.js +221 -0
  117. package/dist/esm/cli/account.js.map +7 -0
  118. package/dist/esm/cli/configure.js +15 -2
  119. package/dist/esm/cli/configure.js.map +2 -2
  120. package/dist/esm/cli/lib/accountManagement.js +179 -0
  121. package/dist/esm/cli/lib/accountManagement.js.map +7 -0
  122. package/dist/esm/cli/lib/accounts.js +289 -0
  123. package/dist/esm/cli/lib/accounts.js.map +7 -0
  124. package/dist/esm/cli/lib/deployKeyWarning.js +27 -0
  125. package/dist/esm/cli/lib/deployKeyWarning.js.map +7 -0
  126. package/dist/esm/cli/lib/deployment.js +2 -2
  127. package/dist/esm/cli/lib/deployment.js.map +2 -2
  128. package/dist/esm/cli/lib/deploymentSelection.js +35 -20
  129. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  130. package/dist/esm/cli/lib/envvars.js +35 -1
  131. package/dist/esm/cli/lib/envvars.js.map +2 -2
  132. package/dist/esm/cli/lib/fsUtils.js +1 -1
  133. package/dist/esm/cli/lib/fsUtils.js.map +2 -2
  134. package/dist/esm/cli/lib/generateDocs.js +1 -1
  135. package/dist/esm/cli/lib/generateDocs.js.map +1 -1
  136. package/dist/esm/cli/lib/login.js +52 -4
  137. package/dist/esm/cli/lib/login.js.map +3 -3
  138. package/dist/esm/cli/lib/mcp/requestContext.js +5 -1
  139. package/dist/esm/cli/lib/mcp/requestContext.js.map +2 -2
  140. package/dist/esm/cli/lib/plugins/claudeCode.js +160 -0
  141. package/dist/esm/cli/lib/plugins/claudeCode.js.map +7 -0
  142. package/dist/esm/cli/lib/plugins/codex.js +140 -0
  143. package/dist/esm/cli/lib/plugins/codex.js.map +7 -0
  144. package/dist/esm/cli/lib/plugins/harness.js +17 -0
  145. package/dist/esm/cli/lib/plugins/harness.js.map +7 -0
  146. package/dist/esm/cli/lib/plugins/marketplaces.js +53 -0
  147. package/dist/esm/cli/lib/plugins/marketplaces.js.map +7 -0
  148. package/dist/esm/cli/lib/plugins/skills.js +65 -0
  149. package/dist/esm/cli/lib/plugins/skills.js.map +7 -0
  150. package/dist/esm/cli/lib/plugins/utils.js +86 -0
  151. package/dist/esm/cli/lib/plugins/utils.js.map +7 -0
  152. package/dist/esm/cli/lib/utils/utils.js +16 -9
  153. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  154. package/dist/esm/cli/login.js +225 -112
  155. package/dist/esm/cli/login.js.map +3 -3
  156. package/dist/esm/cli/logout.js +110 -13
  157. package/dist/esm/cli/logout.js.map +2 -2
  158. package/dist/esm/cli/mcp.js +34 -10
  159. package/dist/esm/cli/mcp.js.map +2 -2
  160. package/dist/esm/cli/plugins.js +99 -0
  161. package/dist/esm/cli/plugins.js.map +7 -0
  162. package/dist/esm/cli/program.js +3 -1
  163. package/dist/esm/cli/program.js.map +2 -2
  164. package/dist/esm/index.js +1 -1
  165. package/dist/esm/index.js.map +1 -1
  166. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  167. package/dist/esm-types/bundler/context.d.ts +5 -0
  168. package/dist/esm-types/bundler/context.d.ts.map +1 -1
  169. package/dist/esm-types/bundler/fs.d.ts +7 -2
  170. package/dist/esm-types/bundler/fs.d.ts.map +1 -1
  171. package/dist/esm-types/cli/account.d.ts +6 -0
  172. package/dist/esm-types/cli/account.d.ts.map +1 -0
  173. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  174. package/dist/esm-types/cli/lib/accountManagement.d.ts +10 -0
  175. package/dist/esm-types/cli/lib/accountManagement.d.ts.map +1 -0
  176. package/dist/esm-types/cli/lib/accounts.d.ts +59 -0
  177. package/dist/esm-types/cli/lib/accounts.d.ts.map +1 -0
  178. package/dist/esm-types/cli/lib/deployKeyWarning.d.ts +3 -0
  179. package/dist/esm-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
  180. package/dist/esm-types/cli/lib/deployment.d.ts +2 -0
  181. package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
  182. package/dist/esm-types/cli/lib/deploymentSelection.d.ts +2 -1
  183. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  184. package/dist/esm-types/cli/lib/envvars.d.ts +6 -0
  185. package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
  186. package/dist/esm-types/cli/lib/fsUtils.d.ts +1 -0
  187. package/dist/esm-types/cli/lib/fsUtils.d.ts.map +1 -1
  188. package/dist/esm-types/cli/lib/login.d.ts +3 -1
  189. package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
  190. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
  191. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  192. package/dist/esm-types/cli/lib/plugins/claudeCode.d.ts +25 -0
  193. package/dist/esm-types/cli/lib/plugins/claudeCode.d.ts.map +1 -0
  194. package/dist/esm-types/cli/lib/plugins/codex.d.ts +25 -0
  195. package/dist/esm-types/cli/lib/plugins/codex.d.ts.map +1 -0
  196. package/dist/esm-types/cli/lib/plugins/harness.d.ts +33 -0
  197. package/dist/esm-types/cli/lib/plugins/harness.d.ts.map +1 -0
  198. package/dist/esm-types/cli/lib/plugins/marketplaces.d.ts +40 -0
  199. package/dist/esm-types/cli/lib/plugins/marketplaces.d.ts.map +1 -0
  200. package/dist/esm-types/cli/lib/plugins/skills.d.ts +18 -0
  201. package/dist/esm-types/cli/lib/plugins/skills.d.ts.map +1 -0
  202. package/dist/esm-types/cli/lib/plugins/utils.d.ts +21 -0
  203. package/dist/esm-types/cli/lib/plugins/utils.d.ts.map +1 -0
  204. package/dist/esm-types/cli/lib/utils/utils.d.ts +5 -0
  205. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  206. package/dist/esm-types/cli/login.d.ts +21 -0
  207. package/dist/esm-types/cli/login.d.ts.map +1 -1
  208. package/dist/esm-types/cli/logout.d.ts +8 -1
  209. package/dist/esm-types/cli/logout.d.ts.map +1 -1
  210. package/dist/esm-types/cli/mcp.d.ts.map +1 -1
  211. package/dist/esm-types/cli/plugins.d.ts +3 -0
  212. package/dist/esm-types/cli/plugins.d.ts.map +1 -0
  213. package/dist/esm-types/cli/program.d.ts.map +1 -1
  214. package/dist/esm-types/index.d.ts +1 -1
  215. package/dist/esm-types/index.d.ts.map +1 -1
  216. package/dist/esm-types/server/impl/actions_impl.d.ts +3 -2
  217. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  218. package/dist/react.bundle.js +1 -1
  219. package/dist/react.bundle.js.map +1 -1
  220. package/package.json +2 -2
  221. package/src/bundler/context.ts +9 -5
  222. package/src/bundler/fs.ts +54 -5
  223. package/src/cli/account.ts +320 -0
  224. package/src/cli/configure.ts +18 -2
  225. package/src/cli/lib/accountManagement.ts +262 -0
  226. package/src/cli/lib/accounts.ts +400 -0
  227. package/src/cli/lib/deployKeyWarning.ts +43 -0
  228. package/src/cli/lib/deployment.ts +2 -2
  229. package/src/cli/lib/deploymentSelection.ts +37 -18
  230. package/src/cli/lib/envvars.ts +43 -1
  231. package/src/cli/lib/fsUtils.ts +5 -2
  232. package/src/cli/lib/generateDocs.ts +1 -1
  233. package/src/cli/lib/login.ts +64 -3
  234. package/src/cli/lib/mcp/requestContext.ts +7 -1
  235. package/src/cli/lib/plugins/claudeCode.ts +201 -0
  236. package/src/cli/lib/plugins/codex.ts +177 -0
  237. package/src/cli/lib/plugins/harness.ts +49 -0
  238. package/src/cli/lib/plugins/marketplaces.ts +94 -0
  239. package/src/cli/lib/plugins/skills.ts +101 -0
  240. package/src/cli/lib/plugins/utils.ts +121 -0
  241. package/src/cli/lib/utils/utils.ts +19 -15
  242. package/src/cli/login.ts +293 -168
  243. package/src/cli/logout.ts +142 -17
  244. package/src/cli/mcp.ts +48 -11
  245. package/src/cli/plugins.ts +154 -0
  246. package/src/cli/program.ts +4 -0
  247. package/src/index.ts +1 -1
  248. package/src/server/impl/actions_impl.ts +3 -2
package/src/cli/mcp.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import path from "path";
1
2
  import { Command, Option } from "@commander-js/extra-typings";
2
3
  import { oneoffContext } from "../bundler/context.js";
3
4
  import { logError } from "../bundler/log.js";
@@ -6,6 +7,7 @@ import { serveStdio } from "@modelcontextprotocol/server/stdio";
6
7
  import { actionDescription } from "./lib/command.js";
7
8
  import { checkAuthorization } from "./lib/login.js";
8
9
  import {
10
+ encodeDeploymentSelector,
9
11
  McpOptions,
10
12
  RequestContext,
11
13
  RequestCrash,
@@ -115,6 +117,14 @@ function enabledTools(
115
117
  export function makeServer(options: McpOptions) {
116
118
  const enabledToolsByName = enabledTools(options);
117
119
  const mutex = new Mutex();
120
+ const serverDirectory = process.cwd();
121
+ options = {
122
+ ...options,
123
+ envFile:
124
+ options.envFile === undefined
125
+ ? undefined
126
+ : path.resolve(serverDirectory, options.envFile),
127
+ };
118
128
  const server = new Server(
119
129
  {
120
130
  name: "Convex MCP Server",
@@ -128,17 +138,7 @@ export function makeServer(options: McpOptions) {
128
138
  );
129
139
  server.setRequestHandler("tools/call", async (request: CallToolRequest) => {
130
140
  const ctx = new RequestContext(options);
131
- await initializeBigBrainAuth(ctx, options);
132
141
  try {
133
- const authorized = await checkAuthorization(ctx, false);
134
- if (!authorized) {
135
- await ctx.crash({
136
- exitCode: 1,
137
- errorType: "fatal",
138
- printedMessage:
139
- "Not Authorized: Run `npx convex dev` to login to your Convex project.",
140
- });
141
- }
142
142
  if (!request.params.arguments) {
143
143
  await ctx.crash({
144
144
  exitCode: 1,
@@ -158,7 +158,44 @@ export function makeServer(options: McpOptions) {
158
158
 
159
159
  // Serialize tool handlers since they're mutating the current working directory.
160
160
  const result = await mutex.runExclusive(async () => {
161
- return await convexTool.handler(ctx, input);
161
+ const projectDir =
162
+ "deploymentSelector" in input
163
+ ? ctx.decodeDeploymentSelectorUnchecked(input.deploymentSelector)
164
+ .projectDir
165
+ : (("projectDir" in input ? input.projectDir : undefined) ??
166
+ options.projectDir);
167
+ const previousDirectory = process.cwd();
168
+ try {
169
+ if (projectDir !== undefined)
170
+ process.chdir(path.resolve(serverDirectory, projectDir));
171
+ await initializeBigBrainAuth(ctx, options);
172
+ if (!(await checkAuthorization(ctx, false))) {
173
+ await ctx.crash({
174
+ exitCode: 1,
175
+ errorType: "fatal",
176
+ printedMessage:
177
+ "Not Authorized: Run `npx convex dev` to login to your Convex project.",
178
+ });
179
+ }
180
+ const absoluteDirectory = process.cwd();
181
+ const resolvedInput =
182
+ "deploymentSelector" in input
183
+ ? {
184
+ ...input,
185
+ deploymentSelector: encodeDeploymentSelector(
186
+ absoluteDirectory,
187
+ ctx.decodeDeploymentSelectorUnchecked(
188
+ input.deploymentSelector,
189
+ ).deployment,
190
+ ),
191
+ }
192
+ : projectDir === undefined
193
+ ? input
194
+ : { ...input, projectDir: absoluteDirectory };
195
+ return await convexTool.handler(ctx, resolvedInput);
196
+ } finally {
197
+ process.chdir(previousDirectory);
198
+ }
162
199
  });
163
200
  return {
164
201
  content: [
@@ -0,0 +1,154 @@
1
+ import { Command } from "@commander-js/extra-typings";
2
+ import { chalkStderr } from "chalk";
3
+ import { oneoffContext } from "../bundler/context.js";
4
+ import {
5
+ logFailure,
6
+ logFinishedStep,
7
+ logMessage,
8
+ logOutput,
9
+ logWarning,
10
+ showSpinner,
11
+ } from "../bundler/log.js";
12
+ import { claudeCode } from "./lib/plugins/claudeCode.js";
13
+ import { codex } from "./lib/plugins/codex.js";
14
+ import { getNewestHarnessLocations } from "./lib/plugins/harness.js";
15
+ import { logMarketplaces } from "./lib/plugins/marketplaces.js";
16
+ import { logConvexSkills } from "./lib/plugins/skills.js";
17
+ import { capture, run } from "./lib/plugins/utils.js";
18
+
19
+ const harnesses = [claudeCode, codex];
20
+
21
+ /**
22
+ * Puts the latest Convex plugin in each harness on this machine, so the
23
+ * harness knows Convex the next time it starts. It works through each
24
+ * harness's own CLI and never edits the harnesses' files.
25
+ *
26
+ * Supported harnesses, on macOS and Linux:
27
+ * - Claude Code: terminal, desktop app (macOS), VS Code extension.
28
+ * - Codex: terminal, ChatGPT desktop app (macOS), VS Code extension.
29
+ *
30
+ * Windows is currently not supported.
31
+ *
32
+ * Success, exits 0:
33
+ * - The harness has the latest Convex plugin: prints the version.
34
+ * - The harness isn't installed: says so.
35
+ *
36
+ * Failure, exits 1:
37
+ * - The install failed: says why and what to do.
38
+ * - The machine runs Windows: says it isn't supported yet.
39
+ */
40
+ const pluginsInstall = new Command("install")
41
+ .summary("Install or upgrade the Convex plugin for Claude Code and Codex")
42
+ .description(
43
+ "Installs or upgrades the Convex plugin for Claude Code and Codex, in the\n" +
44
+ "terminal, the desktop app and the VS Code extension:\n" +
45
+ harnesses.map((h) => ` - ${h.name}: ${h.plugin}\n`).join("") +
46
+ "\nClaude Code or Codex is skipped when it isn't installed. Windows isn't\n" +
47
+ "supported yet.",
48
+ )
49
+ .allowExcessArguments(false)
50
+ .action(async () => {
51
+ const ctx = await oneoffContext({});
52
+ if (process.platform === "win32") {
53
+ return await ctx.crash({
54
+ exitCode: 1,
55
+ errorType: "fatal",
56
+ printedMessage:
57
+ "`npx convex plugins install` doesn't support Windows yet.",
58
+ });
59
+ }
60
+ const locations = await getNewestHarnessLocations();
61
+ let failed = false;
62
+ for (const {
63
+ id,
64
+ name,
65
+ plugin,
66
+ upgradeStep,
67
+ installSteps,
68
+ plugins,
69
+ } of harnesses) {
70
+ const cli = locations[id]?.path;
71
+ if (cli === undefined) {
72
+ logWarning(`${chalkStderr.yellow("⚠")} ${name}: not installed`);
73
+ continue;
74
+ }
75
+ showSpinner(`Installing the Convex plugin for ${name}…`);
76
+ let output = "";
77
+ let upgraded = true;
78
+ for (const args of installSteps) {
79
+ const step = await run(cli, args);
80
+ output += step.output;
81
+ // Only the upgrade step's failure matters. Others can fail harmlessly,
82
+ // like adding a marketplace that's already added from another source.
83
+ if (args === upgradeStep && !step.ok) upgraded = false;
84
+ }
85
+ const list = await capture(cli, ["plugin", "list", "--json"]);
86
+ const version =
87
+ list === null
88
+ ? undefined
89
+ : plugins(list)?.find((p) => `${p.name}@${p.marketplace}` === plugin)
90
+ ?.version;
91
+ if (version === undefined || !upgraded) {
92
+ failed = true;
93
+ logFailure(`${name}: couldn't install the Convex plugin`);
94
+ // The last lines of the harness's own output say why.
95
+ const tail = output.trim().split(/\r?\n/).slice(-10).join("\n");
96
+ if (tail !== "") logMessage(chalkStderr.gray(tail));
97
+ logMessage(
98
+ "Run `npx convex plugins install` again after fixing the error above.",
99
+ );
100
+ } else {
101
+ logFinishedStep(`${name}: Convex plugin ${version}`);
102
+ }
103
+ }
104
+ if (failed) {
105
+ return await ctx.crash({
106
+ exitCode: 1,
107
+ errorType: "fatal",
108
+ printedMessage: null,
109
+ });
110
+ }
111
+ });
112
+
113
+ // When status is picked up again, check it against install. Install now
114
+ // upgrades the plugin and reports the harnesses it didn't find.
115
+ const pluginsStatus = new Command("status")
116
+ .summary("Show the Convex plugins and skills installed")
117
+ .description(
118
+ "Lists the Convex setup your coding agents load:\n" +
119
+ " - Convex skills in the hidden folders of your home folder and this folder\n" +
120
+ " - Convex marketplaces and plugins in Codex and Claude Code\n\n" +
121
+ "It only reads, and changes nothing.",
122
+ )
123
+ .allowExcessArguments(false)
124
+ .action(async () => {
125
+ await logConvexSkills();
126
+
127
+ const locations = await getNewestHarnessLocations();
128
+ for (const harness of harnesses) {
129
+ const cli = locations[harness.id]?.path;
130
+ const marketplaceList =
131
+ cli === undefined
132
+ ? null
133
+ : await capture(cli, ["plugin", "marketplace", "list", "--json"]);
134
+ const pluginList =
135
+ cli === undefined
136
+ ? null
137
+ : await capture(cli, ["plugin", "list", "--json"]);
138
+ if (marketplaceList === null || pluginList === null) {
139
+ logOutput(`${harness.name}: not installed`);
140
+ continue;
141
+ }
142
+ const marketplaces = harness.marketplaces(marketplaceList, pluginList);
143
+ if (marketplaces === null) {
144
+ logOutput(`${harness.name}: couldn't read its plugin lists`);
145
+ continue;
146
+ }
147
+ logMarketplaces(harness.name, marketplaces, await harness.latest());
148
+ }
149
+ });
150
+
151
+ export const plugins = new Command("plugins")
152
+ .summary("Manage Convex plugins for coding agents")
153
+ .addCommand(pluginsInstall)
154
+ .addCommand(pluginsStatus, { hidden: true });
@@ -1,5 +1,6 @@
1
1
  import { Command } from "@commander-js/extra-typings";
2
2
  import { aiFiles } from "./aiFiles.js";
3
+ import { account } from "./account.js";
3
4
  import { auth } from "./auth.js";
4
5
  import { codegen } from "./codegen.js";
5
6
  import { convexExport } from "./convexExport.js";
@@ -21,6 +22,7 @@ import { logout } from "./logout.js";
21
22
  import { logs } from "./logs.js";
22
23
  import { mcp } from "./mcp.js";
23
24
  import { networkTest } from "./network_test.js";
25
+ import { plugins } from "./plugins.js";
24
26
  import { project } from "./project.js";
25
27
  import { reinit } from "./reinit.js";
26
28
  import { run } from "./run.js";
@@ -56,12 +58,14 @@ export function buildProgram() {
56
58
  .addCommand(codegen)
57
59
  .addCommand(update)
58
60
  .addCommand(logout)
61
+ .addCommand(account)
59
62
  .addCommand(networkTest, { hidden: true })
60
63
  .addCommand(integration, { hidden: true })
61
64
  .addCommand(functionSpec)
62
65
  .addCommand(insights)
63
66
  .addCommand(mcp)
64
67
  .addCommand(aiFiles)
68
+ .addCommand(plugins)
65
69
  .helpCommand("help <command>", "Show help for given <command>")
66
70
  .version(version)
67
71
  // Hide version and help so they don't clutter
package/src/index.ts CHANGED
@@ -1 +1 @@
1
- export const version = "1.48.0";
1
+ export const version = "1.49.0-alpha.0";
@@ -75,8 +75,9 @@ export type ServiceName = "ai-gateway";
75
75
  *
76
76
  * This function can only be called while an action is running. The credential
77
77
  * is scoped to the current deployment and should be sent as a bearer token.
78
- * The action runtime caches and refreshes credentials as needed, so call
79
- * this function whenever making a service request.
78
+ * Credentials expire a few minutes after they're issued. The action runtime
79
+ * caches and refreshes them as needed, so call this function whenever making
80
+ * a service request rather than reusing one credential for a long action.
80
81
  *
81
82
  * @param service - The service the credential may access.
82
83
  * @returns A JWT to send as `Authorization: Bearer <token>`. Keep it inside