@agentuity/cli 0.1.13 → 0.1.15

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 (173) hide show
  1. package/dist/auth.d.ts +1 -1
  2. package/dist/auth.d.ts.map +1 -1
  3. package/dist/auth.js +12 -7
  4. package/dist/auth.js.map +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +94 -97
  7. package/dist/cli.js.map +1 -1
  8. package/dist/cmd/ai/index.d.ts.map +1 -1
  9. package/dist/cmd/ai/index.js +6 -1
  10. package/dist/cmd/ai/index.js.map +1 -1
  11. package/dist/cmd/ai/opencode/index.d.ts +3 -0
  12. package/dist/cmd/ai/opencode/index.d.ts.map +1 -0
  13. package/dist/cmd/ai/opencode/index.js +27 -0
  14. package/dist/cmd/ai/opencode/index.js.map +1 -0
  15. package/dist/cmd/ai/opencode/install.d.ts +3 -0
  16. package/dist/cmd/ai/opencode/install.d.ts.map +1 -0
  17. package/dist/cmd/ai/opencode/install.js +102 -0
  18. package/dist/cmd/ai/opencode/install.js.map +1 -0
  19. package/dist/cmd/ai/opencode/run.d.ts +3 -0
  20. package/dist/cmd/ai/opencode/run.d.ts.map +1 -0
  21. package/dist/cmd/ai/opencode/run.js +88 -0
  22. package/dist/cmd/ai/opencode/run.js.map +1 -0
  23. package/dist/cmd/ai/opencode/uninstall.d.ts +3 -0
  24. package/dist/cmd/ai/opencode/uninstall.d.ts.map +1 -0
  25. package/dist/cmd/ai/opencode/uninstall.js +82 -0
  26. package/dist/cmd/ai/opencode/uninstall.js.map +1 -0
  27. package/dist/cmd/auth/index.d.ts.map +1 -1
  28. package/dist/cmd/auth/index.js +3 -0
  29. package/dist/cmd/auth/index.js.map +1 -1
  30. package/dist/cmd/auth/org/index.d.ts +2 -0
  31. package/dist/cmd/auth/org/index.d.ts.map +1 -0
  32. package/dist/cmd/auth/org/index.js +121 -0
  33. package/dist/cmd/auth/org/index.js.map +1 -0
  34. package/dist/cmd/build/vite/beacon-plugin.d.ts +19 -0
  35. package/dist/cmd/build/vite/beacon-plugin.d.ts.map +1 -0
  36. package/dist/cmd/build/vite/beacon-plugin.js +137 -0
  37. package/dist/cmd/build/vite/beacon-plugin.js.map +1 -0
  38. package/dist/cmd/build/vite/vite-builder.d.ts +2 -0
  39. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
  40. package/dist/cmd/build/vite/vite-builder.js +12 -2
  41. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  42. package/dist/cmd/build/webanalytics-generator.js +25 -9
  43. package/dist/cmd/build/webanalytics-generator.js.map +1 -1
  44. package/dist/cmd/cloud/db/get.d.ts.map +1 -1
  45. package/dist/cmd/cloud/db/get.js +7 -0
  46. package/dist/cmd/cloud/db/get.js.map +1 -1
  47. package/dist/cmd/cloud/db/list.d.ts.map +1 -1
  48. package/dist/cmd/cloud/db/list.js +19 -6
  49. package/dist/cmd/cloud/db/list.js.map +1 -1
  50. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  51. package/dist/cmd/cloud/deploy.js +24 -1
  52. package/dist/cmd/cloud/deploy.js.map +1 -1
  53. package/dist/cmd/cloud/deployment/show.d.ts.map +1 -1
  54. package/dist/cmd/cloud/deployment/show.js +5 -0
  55. package/dist/cmd/cloud/deployment/show.js.map +1 -1
  56. package/dist/cmd/cloud/index.d.ts.map +1 -1
  57. package/dist/cmd/cloud/index.js +3 -0
  58. package/dist/cmd/cloud/index.js.map +1 -1
  59. package/dist/cmd/cloud/region/index.d.ts +2 -0
  60. package/dist/cmd/cloud/region/index.d.ts.map +1 -0
  61. package/dist/cmd/cloud/region/index.js +136 -0
  62. package/dist/cmd/cloud/region/index.js.map +1 -0
  63. package/dist/cmd/cloud/sandbox/snapshot/build.d.ts.map +1 -1
  64. package/dist/cmd/cloud/sandbox/snapshot/build.js +35 -5
  65. package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
  66. package/dist/cmd/cloud/scp/download.d.ts.map +1 -1
  67. package/dist/cmd/cloud/scp/download.js +4 -2
  68. package/dist/cmd/cloud/scp/download.js.map +1 -1
  69. package/dist/cmd/cloud/scp/upload.d.ts.map +1 -1
  70. package/dist/cmd/cloud/scp/upload.js +4 -2
  71. package/dist/cmd/cloud/scp/upload.js.map +1 -1
  72. package/dist/cmd/cloud/ssh.d.ts.map +1 -1
  73. package/dist/cmd/cloud/ssh.js +3 -1
  74. package/dist/cmd/cloud/ssh.js.map +1 -1
  75. package/dist/cmd/cloud/storage/get.d.ts.map +1 -1
  76. package/dist/cmd/cloud/storage/get.js +12 -5
  77. package/dist/cmd/cloud/storage/get.js.map +1 -1
  78. package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
  79. package/dist/cmd/cloud/storage/list.js +10 -0
  80. package/dist/cmd/cloud/storage/list.js.map +1 -1
  81. package/dist/cmd/dev/index.d.ts.map +1 -1
  82. package/dist/cmd/dev/index.js +62 -5
  83. package/dist/cmd/dev/index.js.map +1 -1
  84. package/dist/cmd/help/index.d.ts.map +1 -1
  85. package/dist/cmd/help/index.js +8 -18
  86. package/dist/cmd/help/index.js.map +1 -1
  87. package/dist/cmd/project/create.d.ts.map +1 -1
  88. package/dist/cmd/project/create.js +18 -9
  89. package/dist/cmd/project/create.js.map +1 -1
  90. package/dist/cmd/project/download.d.ts +3 -1
  91. package/dist/cmd/project/download.d.ts.map +1 -1
  92. package/dist/cmd/project/download.js +5 -0
  93. package/dist/cmd/project/download.js.map +1 -1
  94. package/dist/cmd/project/import.d.ts +2 -0
  95. package/dist/cmd/project/import.d.ts.map +1 -0
  96. package/dist/cmd/project/import.js +88 -0
  97. package/dist/cmd/project/import.js.map +1 -0
  98. package/dist/cmd/project/index.d.ts.map +1 -1
  99. package/dist/cmd/project/index.js +3 -0
  100. package/dist/cmd/project/index.js.map +1 -1
  101. package/dist/cmd/project/reconcile.d.ts +67 -0
  102. package/dist/cmd/project/reconcile.d.ts.map +1 -0
  103. package/dist/cmd/project/reconcile.js +458 -0
  104. package/dist/cmd/project/reconcile.js.map +1 -0
  105. package/dist/cmd/project/template-flow.d.ts +13 -1
  106. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  107. package/dist/cmd/project/template-flow.js +56 -18
  108. package/dist/cmd/project/template-flow.js.map +1 -1
  109. package/dist/config.d.ts +8 -3
  110. package/dist/config.d.ts.map +1 -1
  111. package/dist/config.js +50 -21
  112. package/dist/config.js.map +1 -1
  113. package/dist/legacy-check.d.ts.map +1 -1
  114. package/dist/legacy-check.js +8 -0
  115. package/dist/legacy-check.js.map +1 -1
  116. package/dist/program-ref.d.ts +4 -0
  117. package/dist/program-ref.d.ts.map +1 -0
  118. package/dist/program-ref.js +8 -0
  119. package/dist/program-ref.js.map +1 -0
  120. package/dist/regions.d.ts +8 -0
  121. package/dist/regions.d.ts.map +1 -0
  122. package/dist/regions.js +77 -0
  123. package/dist/regions.js.map +1 -0
  124. package/dist/tui/prompt.d.ts.map +1 -1
  125. package/dist/tui/prompt.js +7 -1
  126. package/dist/tui/prompt.js.map +1 -1
  127. package/dist/tui.d.ts.map +1 -1
  128. package/dist/tui.js +79 -25
  129. package/dist/tui.js.map +1 -1
  130. package/dist/types.d.ts +1 -0
  131. package/dist/types.d.ts.map +1 -1
  132. package/dist/types.js +1 -0
  133. package/dist/types.js.map +1 -1
  134. package/package.json +7 -7
  135. package/src/auth.ts +14 -13
  136. package/src/cli.ts +118 -114
  137. package/src/cmd/ai/index.ts +6 -1
  138. package/src/cmd/ai/opencode/index.ts +28 -0
  139. package/src/cmd/ai/opencode/install.ts +120 -0
  140. package/src/cmd/ai/opencode/run.ts +103 -0
  141. package/src/cmd/ai/opencode/uninstall.ts +90 -0
  142. package/src/cmd/auth/index.ts +3 -0
  143. package/src/cmd/auth/org/index.ts +142 -0
  144. package/src/cmd/build/vite/beacon-plugin.ts +164 -0
  145. package/src/cmd/build/vite/vite-builder.ts +19 -2
  146. package/src/cmd/build/webanalytics-generator.ts +25 -9
  147. package/src/cmd/cloud/db/get.ts +7 -0
  148. package/src/cmd/cloud/db/list.ts +20 -6
  149. package/src/cmd/cloud/deploy.ts +32 -1
  150. package/src/cmd/cloud/deployment/show.ts +5 -0
  151. package/src/cmd/cloud/index.ts +3 -0
  152. package/src/cmd/cloud/region/index.ts +157 -0
  153. package/src/cmd/cloud/sandbox/snapshot/build.ts +42 -5
  154. package/src/cmd/cloud/scp/download.ts +6 -2
  155. package/src/cmd/cloud/scp/upload.ts +6 -2
  156. package/src/cmd/cloud/ssh.ts +5 -1
  157. package/src/cmd/cloud/storage/get.ts +12 -5
  158. package/src/cmd/cloud/storage/list.ts +11 -0
  159. package/src/cmd/dev/index.ts +62 -5
  160. package/src/cmd/help/index.ts +8 -22
  161. package/src/cmd/project/create.ts +19 -9
  162. package/src/cmd/project/download.ts +7 -1
  163. package/src/cmd/project/import.ts +98 -0
  164. package/src/cmd/project/index.ts +3 -0
  165. package/src/cmd/project/reconcile.ts +606 -0
  166. package/src/cmd/project/template-flow.ts +69 -18
  167. package/src/config.ts +58 -22
  168. package/src/legacy-check.ts +10 -0
  169. package/src/program-ref.ts +11 -0
  170. package/src/regions.ts +95 -0
  171. package/src/tui/prompt.ts +10 -3
  172. package/src/tui.ts +82 -26
  173. package/src/types.ts +2 -0
@@ -175,8 +175,8 @@ export const command = createCommand({
175
175
  optional: { project: true },
176
176
 
177
177
  async handler(ctx) {
178
- const { opts, logger, project, projectDir } = ctx;
179
- let { config } = ctx;
178
+ const { opts, logger, projectDir } = ctx;
179
+ let { config, project } = ctx;
180
180
 
181
181
  // Get auth state - we handle auth ourselves based on project state
182
182
  let auth = await getAuth();
@@ -227,7 +227,9 @@ export const command = createCommand({
227
227
  tui.newline();
228
228
 
229
229
  const shouldLogin = await tui.confirm(
230
- hasProfile ? 'Would you like to login now?' : 'Would you like to login or create an account?',
230
+ hasProfile
231
+ ? 'Would you like to login now?'
232
+ : 'Would you like to login or create an account?',
231
233
  true
232
234
  );
233
235
 
@@ -272,9 +274,63 @@ export const command = createCommand({
272
274
  );
273
275
  }
274
276
  }
277
+
278
+ // After auth is established, verify project access
279
+ if (auth && config) {
280
+ const { reconcileProject } = await import('../project/reconcile');
281
+ const apiClient = new APIClient(getAPIBaseURL(config), logger, auth.apiKey, config);
282
+
283
+ const result = await reconcileProject({
284
+ dir: rootDir,
285
+ auth,
286
+ apiClient,
287
+ config,
288
+ logger,
289
+ interactive: isTTY(),
290
+ });
291
+
292
+ if (result.status === 'error') {
293
+ tui.fatal(result.message!, ErrorCode.PROJECT_NOT_FOUND);
294
+ } else if (result.status === 'imported' && result.project) {
295
+ // Project was re-imported to user's org
296
+ project = result.project;
297
+ tui.newline();
298
+ } else if (result.status === 'skipped') {
299
+ // User declined import - can't continue with cloud features
300
+ tui.warning('Continuing in local-only mode.');
301
+ project = undefined;
302
+ }
303
+ }
275
304
  } else {
276
- // No agentuity.json - local-only mode, ignore auth state
277
- tui.showLocalOnlyWarning();
305
+ // No agentuity.json - check if this is a valid project that needs importing
306
+ if (auth && config) {
307
+ const { reconcileProject } = await import('../project/reconcile');
308
+ const apiClient = new APIClient(getAPIBaseURL(config), logger, auth.apiKey, config);
309
+
310
+ const result = await reconcileProject({
311
+ dir: rootDir,
312
+ auth,
313
+ apiClient,
314
+ config,
315
+ logger,
316
+ interactive: isTTY(),
317
+ });
318
+
319
+ if (result.status === 'error') {
320
+ // Not a valid project - show local-only warning
321
+ tui.showLocalOnlyWarning();
322
+ } else if (result.status === 'imported' && result.project) {
323
+ // Project was imported - reload project config
324
+ project = result.project;
325
+ tui.newline();
326
+ } else if (result.status === 'skipped') {
327
+ // User declined import - continue in local-only mode
328
+ tui.showLocalOnlyWarning();
329
+ }
330
+ } else {
331
+ // Not authenticated - local-only mode
332
+ tui.showLocalOnlyWarning();
333
+ }
278
334
  }
279
335
 
280
336
  // Prepare dev lock: cleans up stale processes from previous sessions
@@ -924,6 +980,7 @@ export const command = createCommand({
924
980
  }
925
981
 
926
982
  process.env.AGENTUITY_SDK_DEV_MODE = 'true';
983
+ process.env.AGENTUITY_RUNTIME = 'yes';
927
984
  process.env.AGENTUITY_ENV = 'development';
928
985
  process.env.NODE_ENV = 'development';
929
986
  process.env.AGENTUITY_PROJECT_DIR = rootDir;
@@ -1,5 +1,6 @@
1
1
  import { createCommand } from '../../types';
2
2
  import { getCommand } from '../../command-prefix';
3
+ import { getProgram } from '../../program-ref';
3
4
 
4
5
  export const command = createCommand({
5
6
  name: 'help',
@@ -13,28 +14,13 @@ export const command = createCommand({
13
14
  idempotent: true,
14
15
 
15
16
  async handler() {
16
- // Spawn the CLI with no arguments to show help
17
- let spawnArgs: string[];
18
-
19
- if (process.env.AGENTUITY_CLI_VERSION) {
20
- // Compiled binary: spawn only the binary executable with no additional args
21
- spawnArgs = [process.argv[0]];
22
- } else {
23
- // Script mode: spawn runtime and script, omitting the 'help' argument
24
- spawnArgs = [process.argv[0], ...(process.argv.length > 1 ? [process.argv[1]] : [])];
25
- }
26
-
27
- const proc = Bun.spawn(spawnArgs, {
28
- stdio: ['inherit', 'inherit', 'inherit'],
29
- env: process.env,
30
- });
31
-
32
- const exitCode = await proc.exited;
33
-
34
- if (exitCode !== 0) {
35
- throw new Error(`Help command exited with code ${exitCode}`);
17
+ // Get the root program and display its help
18
+ // This avoids spawning a subprocess which doesn't work reliably
19
+ // with Bun compiled binaries
20
+ const program = getProgram();
21
+ if (program) {
22
+ program.outputHelp();
36
23
  }
37
-
38
- return undefined;
24
+ process.exit(0);
39
25
  },
40
26
  });
@@ -6,9 +6,11 @@ import type { APIClient as APIClientType } from '../../api';
6
6
 
7
7
  const ProjectCreateResponseSchema = z.object({
8
8
  success: z.boolean().describe('Whether the operation succeeded'),
9
+ error: z.string().optional().describe('Error message if setup failed'),
9
10
  name: z.string().describe('Project name'),
10
11
  path: z.string().describe('Project directory path'),
11
12
  projectId: z.string().optional().describe('Project ID if registered'),
13
+ orgId: z.string().optional().describe('Organization ID if registered'),
12
14
  template: z.string().describe('Template used'),
13
15
  installed: z.boolean().describe('Whether dependencies were installed'),
14
16
  built: z.boolean().describe('Whether the project was built'),
@@ -72,7 +74,7 @@ export const createProjectSubcommand = createSubcommand({
72
74
  },
73
75
 
74
76
  async handler(ctx) {
75
- const { logger, opts, auth, config, apiClient, region } = ctx;
77
+ const { logger, opts, auth, config, apiClient, region, options } = ctx;
76
78
 
77
79
  // Only get org if registering
78
80
  let orgId: string | undefined;
@@ -83,7 +85,7 @@ export const createProjectSubcommand = createSubcommand({
83
85
  );
84
86
  }
85
87
 
86
- await runCreateFlow({
88
+ const result = await runCreateFlow({
87
89
  projectName: opts.name,
88
90
  dir: opts.dir,
89
91
  domains: opts.domains,
@@ -101,14 +103,22 @@ export const createProjectSubcommand = createSubcommand({
101
103
  region,
102
104
  });
103
105
 
104
- // Return best-effort response (runCreateFlow doesn't return values)
106
+ // Exit with error code if setup failed and not in JSON mode
107
+ if (!result.success && !options.json) {
108
+ process.exitCode = 1;
109
+ }
110
+
105
111
  return {
106
- success: true,
107
- name: opts.name || 'project',
108
- path: opts.dir || process.cwd(),
109
- template: opts.template || 'default',
110
- installed: opts.install !== false,
111
- built: opts.build !== false,
112
+ success: result.success,
113
+ error: result.error,
114
+ name: result.name,
115
+ path: result.path,
116
+ projectId: result.projectId,
117
+ orgId: result.orgId,
118
+ template: result.template,
119
+ installed: result.installed,
120
+ built: result.built,
121
+ domains: result.domains,
112
122
  };
113
123
  },
114
124
  });
@@ -328,8 +328,9 @@ export async function downloadTemplate(options: DownloadOptions): Promise<void>
328
328
  }
329
329
  }
330
330
 
331
- export async function setupProject(options: SetupOptions): Promise<void> {
331
+ export async function setupProject(options: SetupOptions): Promise<{ success: boolean }> {
332
332
  const { dest, projectName, dirName, noInstall, noBuild, logger } = options;
333
+ let hasError = false;
333
334
 
334
335
  // Replace {{PROJECT_NAME}} in files
335
336
  tui.info(`🔧 Setting up ${projectName}...`);
@@ -345,6 +346,7 @@ export async function setupProject(options: SetupOptions): Promise<void> {
345
346
  });
346
347
  if (exitCode !== 0) {
347
348
  logger.error('Failed to install dependencies');
349
+ hasError = true;
348
350
  }
349
351
  }
350
352
 
@@ -361,6 +363,7 @@ export async function setupProject(options: SetupOptions): Promise<void> {
361
363
  });
362
364
  if (exitCode !== 0) {
363
365
  logger.error('Template setup script failed');
366
+ hasError = true;
364
367
  }
365
368
  } finally {
366
369
  // Always delete the setup script after running (or attempting to run)
@@ -382,12 +385,15 @@ export async function setupProject(options: SetupOptions): Promise<void> {
382
385
  });
383
386
  if (exitCode !== 0) {
384
387
  logger.error('Failed to build project');
388
+ hasError = true;
385
389
  }
386
390
  }
387
391
 
388
392
  // Generate and write AGENTS.md files for the CLI and source folders
389
393
  // Always overwrite during project setup to ensure fresh content
390
394
  await writeAgentsDocs(dest);
395
+
396
+ return { success: !hasError };
391
397
  }
392
398
 
393
399
  export async function initGitRepo(dest: string): Promise<void> {
@@ -0,0 +1,98 @@
1
+ import { z } from 'zod';
2
+ import { resolve } from 'node:path';
3
+ import { createSubcommand } from '../../types';
4
+ import { getCommand } from '../../command-prefix';
5
+ import { runProjectImport } from './reconcile';
6
+ import * as tui from '../../tui';
7
+ import { ErrorCode } from '../../errors';
8
+ import { isTTY } from '../../auth';
9
+
10
+ const ProjectImportResponseSchema = z.object({
11
+ success: z.boolean().describe('Whether the import succeeded'),
12
+ projectId: z.string().optional().describe('Project ID if imported'),
13
+ orgId: z.string().optional().describe('Organization ID'),
14
+ region: z.string().optional().describe('Region'),
15
+ status: z
16
+ .enum(['valid', 'imported', 'skipped', 'error'])
17
+ .describe('The result status of the import'),
18
+ message: z.string().optional().describe('Status message'),
19
+ });
20
+
21
+ export const importSubcommand = createSubcommand({
22
+ name: 'import',
23
+ description: 'Import or register a local project with Agentuity Cloud',
24
+ tags: ['mutating', 'creates-resource', 'requires-auth'],
25
+ examples: [
26
+ { command: getCommand('project import'), description: 'Import project in current directory' },
27
+ {
28
+ command: getCommand('project import --dir ./my-agent'),
29
+ description: 'Import project from specified directory',
30
+ },
31
+ ],
32
+ requires: { auth: true, apiClient: true },
33
+ optional: { region: true },
34
+ schema: {
35
+ options: z.object({
36
+ dir: z
37
+ .string()
38
+ .optional()
39
+ .describe('Directory containing the project (default: current directory)'),
40
+ validateOnly: z
41
+ .boolean()
42
+ .optional()
43
+ .describe('Only validate the project structure without prompting'),
44
+ }),
45
+ response: ProjectImportResponseSchema,
46
+ },
47
+
48
+ async handler(ctx) {
49
+ const { opts, auth, apiClient, config, logger } = ctx;
50
+
51
+ if (!config) {
52
+ tui.fatal('Configuration not loaded. Please try again.', ErrorCode.CONFIG_INVALID);
53
+ }
54
+
55
+ const dir = opts.dir ? resolve(opts.dir) : process.cwd();
56
+ const validateOnly = opts.validateOnly ?? false;
57
+
58
+ const result = await runProjectImport({
59
+ dir,
60
+ auth,
61
+ apiClient,
62
+ config,
63
+ logger,
64
+ interactive: validateOnly ? false : isTTY(),
65
+ validateOnly,
66
+ });
67
+
68
+ if (result.status === 'error') {
69
+ tui.fatal(result.message ?? 'Failed to import project', ErrorCode.PROJECT_NOT_FOUND);
70
+ }
71
+
72
+ if (result.status === 'skipped') {
73
+ tui.info(result.message || 'Import cancelled.');
74
+ return {
75
+ success: false,
76
+ status: result.status,
77
+ message: result.message,
78
+ };
79
+ }
80
+
81
+ // Show success message for validateOnly mode
82
+ if (validateOnly && result.status === 'valid' && !result.project) {
83
+ tui.success(result.message || 'Project structure is valid.');
84
+ }
85
+
86
+ return {
87
+ success: result.status === 'valid' || result.status === 'imported',
88
+ projectId: result.project?.projectId,
89
+ orgId: result.project?.orgId,
90
+ region: result.project?.region,
91
+ status: result.status,
92
+ message:
93
+ result.status === 'imported'
94
+ ? 'Project imported successfully'
95
+ : result.message || 'Project is already registered',
96
+ };
97
+ },
98
+ });
@@ -1,5 +1,6 @@
1
1
  import { createCommand } from '../../types';
2
2
  import { createProjectSubcommand } from './create';
3
+ import { importSubcommand } from './import';
3
4
  import { listSubcommand } from './list';
4
5
  import { deleteSubcommand } from './delete';
5
6
  import { showSubcommand } from './show';
@@ -12,11 +13,13 @@ export const command = createCommand({
12
13
  tags: ['fast', 'requires-auth'],
13
14
  examples: [
14
15
  { command: getCommand('project create my-agent'), description: 'Create a new project' },
16
+ { command: getCommand('project import'), description: 'Import an existing project' },
15
17
  { command: getCommand('project list'), description: 'List all projects' },
16
18
  { command: getCommand('project auth init'), description: 'Set up Agentuity Auth' },
17
19
  ],
18
20
  subcommands: [
19
21
  createProjectSubcommand,
22
+ importSubcommand,
20
23
  listSubcommand,
21
24
  deleteSubcommand,
22
25
  showSubcommand,