@agentuity/cli 0.1.12 → 0.1.14

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 (140) hide show
  1. package/dist/auth.d.ts +1 -1
  2. package/dist/auth.d.ts.map +1 -1
  3. package/dist/auth.js +6 -2
  4. package/dist/auth.js.map +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +44 -91
  7. package/dist/cli.js.map +1 -1
  8. package/dist/cmd/auth/index.d.ts.map +1 -1
  9. package/dist/cmd/auth/index.js +3 -0
  10. package/dist/cmd/auth/index.js.map +1 -1
  11. package/dist/cmd/auth/org/index.d.ts +2 -0
  12. package/dist/cmd/auth/org/index.d.ts.map +1 -0
  13. package/dist/cmd/auth/org/index.js +121 -0
  14. package/dist/cmd/auth/org/index.js.map +1 -0
  15. package/dist/cmd/build/vite/beacon-plugin.d.ts +19 -0
  16. package/dist/cmd/build/vite/beacon-plugin.d.ts.map +1 -0
  17. package/dist/cmd/build/vite/beacon-plugin.js +137 -0
  18. package/dist/cmd/build/vite/beacon-plugin.js.map +1 -0
  19. package/dist/cmd/build/vite/vite-builder.d.ts +2 -0
  20. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
  21. package/dist/cmd/build/vite/vite-builder.js +12 -2
  22. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  23. package/dist/cmd/build/webanalytics-generator.js +25 -9
  24. package/dist/cmd/build/webanalytics-generator.js.map +1 -1
  25. package/dist/cmd/cloud/db/get.d.ts.map +1 -1
  26. package/dist/cmd/cloud/db/get.js +7 -0
  27. package/dist/cmd/cloud/db/get.js.map +1 -1
  28. package/dist/cmd/cloud/db/list.d.ts.map +1 -1
  29. package/dist/cmd/cloud/db/list.js +19 -6
  30. package/dist/cmd/cloud/db/list.js.map +1 -1
  31. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  32. package/dist/cmd/cloud/deploy.js +24 -1
  33. package/dist/cmd/cloud/deploy.js.map +1 -1
  34. package/dist/cmd/cloud/deployment/show.d.ts.map +1 -1
  35. package/dist/cmd/cloud/deployment/show.js +5 -0
  36. package/dist/cmd/cloud/deployment/show.js.map +1 -1
  37. package/dist/cmd/cloud/index.d.ts.map +1 -1
  38. package/dist/cmd/cloud/index.js +3 -0
  39. package/dist/cmd/cloud/index.js.map +1 -1
  40. package/dist/cmd/cloud/region/index.d.ts +2 -0
  41. package/dist/cmd/cloud/region/index.d.ts.map +1 -0
  42. package/dist/cmd/cloud/region/index.js +136 -0
  43. package/dist/cmd/cloud/region/index.js.map +1 -0
  44. package/dist/cmd/cloud/sandbox/snapshot/build.d.ts.map +1 -1
  45. package/dist/cmd/cloud/sandbox/snapshot/build.js +35 -5
  46. package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
  47. package/dist/cmd/cloud/scp/download.d.ts.map +1 -1
  48. package/dist/cmd/cloud/scp/download.js +4 -2
  49. package/dist/cmd/cloud/scp/download.js.map +1 -1
  50. package/dist/cmd/cloud/scp/upload.d.ts.map +1 -1
  51. package/dist/cmd/cloud/scp/upload.js +4 -2
  52. package/dist/cmd/cloud/scp/upload.js.map +1 -1
  53. package/dist/cmd/cloud/ssh.d.ts.map +1 -1
  54. package/dist/cmd/cloud/ssh.js +3 -1
  55. package/dist/cmd/cloud/ssh.js.map +1 -1
  56. package/dist/cmd/cloud/storage/get.d.ts.map +1 -1
  57. package/dist/cmd/cloud/storage/get.js +12 -5
  58. package/dist/cmd/cloud/storage/get.js.map +1 -1
  59. package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
  60. package/dist/cmd/cloud/storage/list.js +10 -0
  61. package/dist/cmd/cloud/storage/list.js.map +1 -1
  62. package/dist/cmd/dev/index.d.ts.map +1 -1
  63. package/dist/cmd/dev/index.js +62 -5
  64. package/dist/cmd/dev/index.js.map +1 -1
  65. package/dist/cmd/help/index.d.ts.map +1 -1
  66. package/dist/cmd/help/index.js +8 -18
  67. package/dist/cmd/help/index.js.map +1 -1
  68. package/dist/cmd/project/create.d.ts.map +1 -1
  69. package/dist/cmd/project/create.js +10 -7
  70. package/dist/cmd/project/create.js.map +1 -1
  71. package/dist/cmd/project/import.d.ts +2 -0
  72. package/dist/cmd/project/import.d.ts.map +1 -0
  73. package/dist/cmd/project/import.js +88 -0
  74. package/dist/cmd/project/import.js.map +1 -0
  75. package/dist/cmd/project/index.d.ts.map +1 -1
  76. package/dist/cmd/project/index.js +3 -0
  77. package/dist/cmd/project/index.js.map +1 -1
  78. package/dist/cmd/project/reconcile.d.ts +67 -0
  79. package/dist/cmd/project/reconcile.d.ts.map +1 -0
  80. package/dist/cmd/project/reconcile.js +458 -0
  81. package/dist/cmd/project/reconcile.js.map +1 -0
  82. package/dist/cmd/project/template-flow.d.ts +11 -1
  83. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  84. package/dist/cmd/project/template-flow.js +25 -7
  85. package/dist/cmd/project/template-flow.js.map +1 -1
  86. package/dist/config.d.ts +8 -3
  87. package/dist/config.d.ts.map +1 -1
  88. package/dist/config.js +50 -21
  89. package/dist/config.js.map +1 -1
  90. package/dist/legacy-check.d.ts.map +1 -1
  91. package/dist/legacy-check.js +8 -0
  92. package/dist/legacy-check.js.map +1 -1
  93. package/dist/program-ref.d.ts +4 -0
  94. package/dist/program-ref.d.ts.map +1 -0
  95. package/dist/program-ref.js +8 -0
  96. package/dist/program-ref.js.map +1 -0
  97. package/dist/regions.d.ts +8 -0
  98. package/dist/regions.d.ts.map +1 -0
  99. package/dist/regions.js +77 -0
  100. package/dist/regions.js.map +1 -0
  101. package/dist/tui.d.ts.map +1 -1
  102. package/dist/tui.js +5 -4
  103. package/dist/tui.js.map +1 -1
  104. package/dist/types.d.ts +1 -0
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/types.js +1 -0
  107. package/dist/types.js.map +1 -1
  108. package/package.json +6 -6
  109. package/src/auth.ts +8 -8
  110. package/src/cli.ts +52 -108
  111. package/src/cmd/auth/index.ts +3 -0
  112. package/src/cmd/auth/org/index.ts +142 -0
  113. package/src/cmd/build/vite/beacon-plugin.ts +162 -0
  114. package/src/cmd/build/vite/vite-builder.ts +15 -2
  115. package/src/cmd/build/webanalytics-generator.ts +25 -9
  116. package/src/cmd/cloud/db/get.ts +7 -0
  117. package/src/cmd/cloud/db/list.ts +20 -6
  118. package/src/cmd/cloud/deploy.ts +32 -1
  119. package/src/cmd/cloud/deployment/show.ts +5 -0
  120. package/src/cmd/cloud/index.ts +3 -0
  121. package/src/cmd/cloud/region/index.ts +157 -0
  122. package/src/cmd/cloud/sandbox/snapshot/build.ts +42 -5
  123. package/src/cmd/cloud/scp/download.ts +6 -2
  124. package/src/cmd/cloud/scp/upload.ts +6 -2
  125. package/src/cmd/cloud/ssh.ts +5 -1
  126. package/src/cmd/cloud/storage/get.ts +12 -5
  127. package/src/cmd/cloud/storage/list.ts +11 -0
  128. package/src/cmd/dev/index.ts +62 -5
  129. package/src/cmd/help/index.ts +8 -22
  130. package/src/cmd/project/create.ts +10 -7
  131. package/src/cmd/project/import.ts +98 -0
  132. package/src/cmd/project/index.ts +3 -0
  133. package/src/cmd/project/reconcile.ts +606 -0
  134. package/src/cmd/project/template-flow.ts +37 -7
  135. package/src/config.ts +58 -22
  136. package/src/legacy-check.ts +10 -0
  137. package/src/program-ref.ts +11 -0
  138. package/src/regions.ts +95 -0
  139. package/src/tui.ts +6 -4
  140. package/src/types.ts +1 -0
@@ -0,0 +1,458 @@
1
+ import { join, basename } from 'node:path';
2
+ import { existsSync, statSync } from 'node:fs';
3
+ import { projectGet, projectCreate, projectEnvUpdate, listOrganizations, } from '@agentuity/server';
4
+ import { loadProjectConfig, createProjectConfig } from '../../config';
5
+ import * as tui from '../../tui';
6
+ import { createPrompt } from '../../tui';
7
+ import { isTTY } from '../../auth';
8
+ import { findExistingEnvFile, readEnvFile, writeEnvFile, filterAgentuitySdkKeys, splitEnvAndSecrets, } from '../../env-util';
9
+ import { fetchRegionsWithCache } from '../../regions';
10
+ const defaultDeps = {
11
+ projectGet,
12
+ projectCreate,
13
+ projectEnvUpdate,
14
+ listOrganizations,
15
+ loadProjectConfig,
16
+ createProjectConfig,
17
+ isTTY,
18
+ confirm: tui.confirm,
19
+ selectOrganization: tui.selectOrganization,
20
+ };
21
+ /**
22
+ * Try to load project config, returning null if not found or invalid
23
+ * @internal Exported for testing
24
+ */
25
+ export async function tryLoadProjectConfig(dir, config, deps = defaultDeps) {
26
+ try {
27
+ return await deps.loadProjectConfig(dir, config);
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ /**
34
+ * Get the default project name from package.json or directory name
35
+ * @internal Exported for testing
36
+ */
37
+ export async function getDefaultProjectName(dir) {
38
+ const pkgPath = join(dir, 'package.json');
39
+ if (await Bun.file(pkgPath).exists()) {
40
+ try {
41
+ const pkg = await Bun.file(pkgPath).json();
42
+ if (pkg.name && typeof pkg.name === 'string' && pkg.name.trim()) {
43
+ // Strip org scope if present (e.g., @myorg/project-name -> project-name)
44
+ return pkg.name.replace(/^@[^/]+\//, '').trim();
45
+ }
46
+ }
47
+ catch {
48
+ // Fall through to directory name
49
+ }
50
+ }
51
+ return basename(dir);
52
+ }
53
+ /**
54
+ * Check if a directory contains a valid Agentuity project structure
55
+ * @internal Exported for testing
56
+ */
57
+ export async function isValidProjectStructure(dir) {
58
+ // Check 1: package.json with @agentuity/runtime and agentuity.config.ts
59
+ const pkgPath = join(dir, 'package.json');
60
+ const configPath = join(dir, 'agentuity.config.ts');
61
+ if (await Bun.file(pkgPath).exists()) {
62
+ try {
63
+ const pkg = await Bun.file(pkgPath).json();
64
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
65
+ if (deps['@agentuity/runtime'] && (await Bun.file(configPath).exists())) {
66
+ return true;
67
+ }
68
+ }
69
+ catch {
70
+ // Fall through to check child project
71
+ }
72
+ }
73
+ // Check 2: ./agentuity/ subdirectory exists with valid structure (parent project with child)
74
+ const agentuityDir = join(dir, 'agentuity');
75
+ if (existsSync(agentuityDir) && statSync(agentuityDir).isDirectory()) {
76
+ const childPkgPath = join(agentuityDir, 'package.json');
77
+ const childConfigPath = join(agentuityDir, 'agentuity.config.ts');
78
+ if (await Bun.file(childPkgPath).exists()) {
79
+ try {
80
+ const childPkg = await Bun.file(childPkgPath).json();
81
+ const childDeps = { ...childPkg.dependencies, ...childPkg.devDependencies };
82
+ if (childDeps['@agentuity/runtime'] && (await Bun.file(childConfigPath).exists())) {
83
+ return true;
84
+ }
85
+ }
86
+ catch {
87
+ // Invalid package.json in child - fall through
88
+ }
89
+ }
90
+ }
91
+ return false;
92
+ }
93
+ /**
94
+ * Update or create .env file with new SDK key
95
+ */
96
+ async function updateSdkKeyInEnv(dir, sdkKey) {
97
+ const envPath = join(dir, '.env');
98
+ const envFile = Bun.file(envPath);
99
+ if (await envFile.exists()) {
100
+ // Update existing .env - read, modify, write
101
+ const existing = await readEnvFile(envPath);
102
+ existing.AGENTUITY_SDK_KEY = sdkKey;
103
+ await writeEnvFile(envPath, existing);
104
+ }
105
+ else {
106
+ // Create new .env
107
+ const comment = '# AGENTUITY_SDK_KEY is a sensitive value and should not be committed to version control.';
108
+ const content = `${comment}\nAGENTUITY_SDK_KEY=${sdkKey}\n`;
109
+ await Bun.write(envPath, content);
110
+ }
111
+ }
112
+ /**
113
+ * Sync existing environment variables to the new project
114
+ */
115
+ async function syncEnvToProject(dir, projectId, apiClient, logger) {
116
+ try {
117
+ const envFilePath = await findExistingEnvFile(dir);
118
+ const localEnv = await readEnvFile(envFilePath);
119
+ const filteredEnv = filterAgentuitySdkKeys(localEnv);
120
+ if (Object.keys(filteredEnv).length > 0) {
121
+ const { env, secrets } = splitEnvAndSecrets(filteredEnv);
122
+ await projectEnvUpdate(apiClient, {
123
+ id: projectId,
124
+ env,
125
+ secrets,
126
+ });
127
+ logger.debug(`Synced ${Object.keys(filteredEnv).length} environment variables to cloud`);
128
+ }
129
+ }
130
+ catch (error) {
131
+ // Non-fatal: just log the error
132
+ logger.debug('Failed to sync environment variables:', error);
133
+ }
134
+ }
135
+ /**
136
+ * Prompt user to select an organization
137
+ */
138
+ async function selectOrg(orgs, config, defaultOrgId) {
139
+ return tui.selectOrganization(orgs, defaultOrgId ?? config.preferences?.orgId);
140
+ }
141
+ /**
142
+ * Prompt user to select a region from the available regions
143
+ */
144
+ async function selectRegion(regions, defaultRegion) {
145
+ if (regions.length === 0) {
146
+ throw new Error('No cloud regions available');
147
+ }
148
+ if (regions.length === 1) {
149
+ return regions[0].region;
150
+ }
151
+ // Build options from API regions
152
+ const options = regions.map((r) => ({
153
+ value: r.region,
154
+ label: `${r.description} (${r.region})`,
155
+ }));
156
+ // Move default to top if found
157
+ const defaultValue = defaultRegion ?? regions[0].region;
158
+ const defaultIndex = options.findIndex((r) => r.value === defaultValue);
159
+ if (defaultIndex > 0) {
160
+ const [defaultItem] = options.splice(defaultIndex, 1);
161
+ options.unshift(defaultItem);
162
+ }
163
+ const prompt = createPrompt();
164
+ return prompt.select({
165
+ message: 'Select a region:',
166
+ options,
167
+ initial: options[0].value,
168
+ });
169
+ }
170
+ /**
171
+ * Prompt user for text input with validation
172
+ */
173
+ async function textPrompt(options) {
174
+ const prompt = createPrompt();
175
+ return prompt.text({
176
+ message: options.message,
177
+ initial: options.initial,
178
+ hint: options.initial ? `(default: ${options.initial})` : undefined,
179
+ validate: options.validate,
180
+ });
181
+ }
182
+ /**
183
+ * Import an existing project (with invalid/inaccessible agentuity.json) to user's org
184
+ */
185
+ async function importExistingProject(opts, existingConfig, orgs) {
186
+ const { dir, apiClient, config, logger } = opts;
187
+ tui.warning("You don't have access to this project. It may have been deleted or transferred to another organization.");
188
+ tui.newline();
189
+ const shouldImport = await tui.confirm('Would you like to import this project to your organization?', true);
190
+ if (!shouldImport) {
191
+ return { status: 'skipped', message: 'Project import cancelled.' };
192
+ }
193
+ tui.newline();
194
+ // Select org
195
+ const orgId = await selectOrg(orgs, config, existingConfig.orgId);
196
+ // Fetch regions and select
197
+ const regions = await tui.spinner({
198
+ message: 'Fetching regions',
199
+ clearOnSuccess: true,
200
+ callback: () => fetchRegionsWithCache(config.name, apiClient, logger),
201
+ });
202
+ const region = await selectRegion(regions, existingConfig.region);
203
+ // Get project name
204
+ const defaultName = await getDefaultProjectName(dir);
205
+ const projectName = await textPrompt({
206
+ message: 'Project name:',
207
+ initial: defaultName,
208
+ validate: (value) => {
209
+ if (!value || value.trim().length === 0) {
210
+ return 'Project name is required';
211
+ }
212
+ return true;
213
+ },
214
+ });
215
+ // Create the project
216
+ const newProject = await tui.spinner({
217
+ message: 'Registering project',
218
+ clearOnSuccess: true,
219
+ callback: async () => {
220
+ return projectCreate(apiClient, {
221
+ name: projectName,
222
+ orgId,
223
+ cloudRegion: region,
224
+ });
225
+ },
226
+ });
227
+ // Update .env with new SDK key
228
+ await updateSdkKeyInEnv(dir, newProject.sdkKey);
229
+ tui.success('Updated AGENTUITY_SDK_KEY in .env');
230
+ // Create new agentuity.json
231
+ await createProjectConfig(dir, {
232
+ projectId: newProject.id,
233
+ orgId,
234
+ sdkKey: newProject.sdkKey,
235
+ region,
236
+ });
237
+ tui.success('Updated agentuity.json');
238
+ // Sync env vars
239
+ await tui.spinner({
240
+ message: 'Syncing environment variables',
241
+ clearOnSuccess: true,
242
+ callback: () => syncEnvToProject(dir, newProject.id, apiClient, logger),
243
+ });
244
+ const project = {
245
+ projectId: newProject.id,
246
+ orgId,
247
+ region,
248
+ };
249
+ tui.success('Project imported successfully!');
250
+ return { status: 'imported', project };
251
+ }
252
+ /**
253
+ * Create a new project from an unregistered local project
254
+ */
255
+ async function createNewProject(opts) {
256
+ const { dir, apiClient, config, logger } = opts;
257
+ tui.warning('This project is not registered with Agentuity Cloud.');
258
+ tui.newline();
259
+ const shouldCreate = await tui.confirm('Would you like to register it now?', true);
260
+ if (!shouldCreate) {
261
+ return { status: 'skipped', message: 'Project registration cancelled.' };
262
+ }
263
+ tui.newline();
264
+ // Fetch user's orgs
265
+ const orgs = await tui.spinner({
266
+ message: 'Fetching organizations',
267
+ clearOnSuccess: true,
268
+ callback: () => listOrganizations(apiClient),
269
+ });
270
+ if (orgs.length === 0) {
271
+ return { status: 'error', message: 'No organizations found for your account.' };
272
+ }
273
+ // Select org
274
+ const orgId = await selectOrg(orgs, config);
275
+ // Fetch regions and select
276
+ const regions = await tui.spinner({
277
+ message: 'Fetching regions',
278
+ clearOnSuccess: true,
279
+ callback: () => fetchRegionsWithCache(config.name, apiClient, logger),
280
+ });
281
+ const region = await selectRegion(regions);
282
+ // Get project name from package.json or prompt
283
+ const defaultName = await getDefaultProjectName(dir);
284
+ const projectName = await textPrompt({
285
+ message: 'Project name:',
286
+ initial: defaultName,
287
+ validate: (value) => {
288
+ if (!value || value.trim().length === 0) {
289
+ return 'Project name is required';
290
+ }
291
+ return true;
292
+ },
293
+ });
294
+ // Create the project
295
+ const newProject = await tui.spinner({
296
+ message: 'Registering project',
297
+ clearOnSuccess: true,
298
+ callback: async () => {
299
+ return projectCreate(apiClient, {
300
+ name: projectName,
301
+ orgId,
302
+ cloudRegion: region,
303
+ });
304
+ },
305
+ });
306
+ // Update/create .env with SDK key
307
+ await updateSdkKeyInEnv(dir, newProject.sdkKey);
308
+ tui.success('Updated AGENTUITY_SDK_KEY in .env');
309
+ // Create agentuity.json
310
+ await createProjectConfig(dir, {
311
+ projectId: newProject.id,
312
+ orgId,
313
+ sdkKey: newProject.sdkKey,
314
+ region,
315
+ });
316
+ tui.success('Created agentuity.json');
317
+ // Sync env vars
318
+ await tui.spinner({
319
+ message: 'Syncing environment variables',
320
+ clearOnSuccess: true,
321
+ callback: () => syncEnvToProject(dir, newProject.id, apiClient, logger),
322
+ });
323
+ const project = {
324
+ projectId: newProject.id,
325
+ orgId,
326
+ region,
327
+ };
328
+ tui.success('Project registered successfully!');
329
+ return { status: 'imported', project };
330
+ }
331
+ /**
332
+ * Reconcile a project - validate access or import if needed
333
+ *
334
+ * This function checks if the current directory has a valid agentuity.json
335
+ * and if the user has access to the project. If not, it offers to import
336
+ * the project to the user's organization.
337
+ *
338
+ * For directories without agentuity.json, it validates the project structure
339
+ * and offers to register the project with Agentuity Cloud.
340
+ */
341
+ export async function reconcileProject(opts) {
342
+ const { dir, apiClient, config, logger, interactive = isTTY(), validateOnly } = opts;
343
+ // 1. Check if agentuity.json exists
344
+ const projectConfig = await tryLoadProjectConfig(dir, config);
345
+ if (projectConfig) {
346
+ // 2. Validate access to existing project
347
+ try {
348
+ const project = await projectGet(apiClient, { id: projectConfig.projectId, keys: false });
349
+ // 3. Check if orgId matches user's orgs
350
+ const userOrgs = await listOrganizations(apiClient);
351
+ const hasAccess = userOrgs.some((org) => org.id === project.orgId);
352
+ if (hasAccess) {
353
+ return { status: 'valid', project: projectConfig };
354
+ }
355
+ // User doesn't have access - offer to import
356
+ if (!interactive || validateOnly) {
357
+ return {
358
+ status: 'error',
359
+ message: "You don't have access to this project. Run interactively to import it to your organization.",
360
+ };
361
+ }
362
+ return await importExistingProject(opts, projectConfig, userOrgs);
363
+ }
364
+ catch (err) {
365
+ // Project not found or access denied
366
+ logger.debug('Failed to get project:', err);
367
+ if (!interactive || validateOnly) {
368
+ return {
369
+ status: 'error',
370
+ message: 'Project not found or access denied. Run interactively to import it to your organization.',
371
+ };
372
+ }
373
+ const userOrgs = await listOrganizations(apiClient);
374
+ return await importExistingProject(opts, projectConfig, userOrgs);
375
+ }
376
+ }
377
+ // 4. No agentuity.json - validate project structure
378
+ const isValid = await isValidProjectStructure(dir);
379
+ if (!isValid) {
380
+ return {
381
+ status: 'error',
382
+ message: 'This directory does not appear to be a valid Agentuity project. ' +
383
+ 'Expected agentuity.config.ts and @agentuity/runtime dependency, ' +
384
+ 'or an agentuity/ subdirectory.',
385
+ };
386
+ }
387
+ if (!interactive || validateOnly) {
388
+ return {
389
+ status: 'error',
390
+ message: 'Project must be registered with Agentuity Cloud. ' +
391
+ 'Run interactively or use "agentuity project import".',
392
+ };
393
+ }
394
+ // 5. Prompt to create new project
395
+ return await createNewProject(opts);
396
+ }
397
+ /**
398
+ * Run project import directly (for the import command)
399
+ */
400
+ export async function runProjectImport(opts) {
401
+ const { dir, apiClient, config, interactive = true, validateOnly = false } = opts;
402
+ // Check if agentuity.json already exists and is valid
403
+ const projectConfig = await tryLoadProjectConfig(dir, config);
404
+ if (projectConfig) {
405
+ try {
406
+ const project = await projectGet(apiClient, { id: projectConfig.projectId, keys: false });
407
+ const userOrgs = await listOrganizations(apiClient);
408
+ const hasAccess = userOrgs.some((org) => org.id === project.orgId);
409
+ if (hasAccess) {
410
+ tui.info('This project is already registered and you have access to it.');
411
+ return { status: 'valid', project: projectConfig };
412
+ }
413
+ // Has agentuity.json but no access - offer to import
414
+ if (!interactive) {
415
+ return {
416
+ status: 'error',
417
+ message: "You don't have access to this project. Run interactively to import it to your organization.",
418
+ };
419
+ }
420
+ return await importExistingProject(opts, projectConfig, userOrgs);
421
+ }
422
+ catch {
423
+ // Project doesn't exist - offer to import
424
+ if (!interactive) {
425
+ return {
426
+ status: 'error',
427
+ message: 'Project not found. Run interactively to import it to your organization.',
428
+ };
429
+ }
430
+ const userOrgs = await listOrganizations(apiClient);
431
+ return await importExistingProject(opts, projectConfig, userOrgs);
432
+ }
433
+ }
434
+ // No agentuity.json - validate structure and create new project
435
+ const isValid = await isValidProjectStructure(dir);
436
+ if (!isValid) {
437
+ return {
438
+ status: 'error',
439
+ message: 'This directory does not appear to be a valid Agentuity project. ' +
440
+ 'Expected agentuity.config.ts and @agentuity/runtime dependency, ' +
441
+ 'or an agentuity/ subdirectory.',
442
+ };
443
+ }
444
+ if (validateOnly) {
445
+ return {
446
+ status: 'valid',
447
+ message: 'Project structure is valid and ready to import.',
448
+ };
449
+ }
450
+ if (!interactive) {
451
+ return {
452
+ status: 'error',
453
+ message: 'Project import requires interactive mode.',
454
+ };
455
+ }
456
+ return await createNewProject(opts);
457
+ }
458
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../../src/cmd/project/reconcile.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,16 @@ interface CreateFlowOptions {
18
18
  region?: string;
19
19
  apiClient?: APIClient;
20
20
  }
21
- export declare function runCreateFlow(options: CreateFlowOptions): Promise<void>;
21
+ export interface CreateFlowResult {
22
+ projectId?: string;
23
+ orgId?: string;
24
+ name: string;
25
+ path: string;
26
+ template: string;
27
+ installed: boolean;
28
+ built: boolean;
29
+ domains?: string[];
30
+ }
31
+ export declare function runCreateFlow(options: CreateFlowOptions): Promise<CreateFlowResult>;
22
32
  export {};
23
33
  //# sourceMappingURL=template-flow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-flow.d.ts","sourceRoot":"","sources":["../../../src/cmd/project/template-flow.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAM9C,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAmB3C,UAAU,iBAAiB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgjB7E"}
1
+ {"version":3,"file":"template-flow.d.ts","sourceRoot":"","sources":["../../../src/cmd/project/template-flow.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAM9C,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAmB3C,UAAU,iBAAiB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkkBzF"}
@@ -2,7 +2,7 @@ import { basename, resolve } from 'node:path';
2
2
  import { existsSync, readdirSync, rmSync, statSync } from 'node:fs';
3
3
  import { cwd } from 'node:process';
4
4
  import { homedir } from 'node:os';
5
- import { projectCreate, projectExists, listResources, projectEnvUpdate, getServiceUrls, APIClient as ServerAPIClient, createResources, } from '@agentuity/server';
5
+ import { projectCreate, projectExists, listResources, projectEnvUpdate, getServiceUrls, APIClient as ServerAPIClient, createResources, validateDatabaseName, } from '@agentuity/server';
6
6
  import * as tui from '../../tui';
7
7
  import { createPrompt, note } from '../../tui';
8
8
  import { playSound } from '../../sound';
@@ -97,7 +97,7 @@ export async function runCreateFlow(options) {
97
97
  const home = homedir();
98
98
  if (dest === '/' || dest === home) {
99
99
  logger.fatal(`Refusing to delete protected path: ${dest}`, ErrorCode.VALIDATION_FAILED);
100
- return;
100
+ return undefined;
101
101
  }
102
102
  rmSync(dest, { recursive: true, force: true });
103
103
  tui.success(`Deleted ${dest}`);
@@ -116,7 +116,7 @@ export async function runCreateFlow(options) {
116
116
  .map((t) => ` - ${t.id.padEnd(20)} ${t.description}`)
117
117
  .join('\n');
118
118
  logger.fatal(`Template "${initialTemplate}" not found\n\nAvailable templates:\n${availableTemplates}`, ErrorCode.RESOURCE_NOT_FOUND);
119
- return;
119
+ return undefined;
120
120
  }
121
121
  selectedTemplate = found;
122
122
  }
@@ -146,7 +146,7 @@ export async function runCreateFlow(options) {
146
146
  const found = templates.find((t) => t.id === templateId);
147
147
  if (!found) {
148
148
  logger.fatal('Template selection failed', ErrorCode.USER_CANCELLED);
149
- return;
149
+ return undefined;
150
150
  }
151
151
  selectedTemplate = found;
152
152
  }
@@ -253,10 +253,18 @@ export async function runCreateFlow(options) {
253
253
  }
254
254
  switch (choices.db_action) {
255
255
  case 'Create New': {
256
- const dbName = await prompt.text({
256
+ const dbNameInput = await prompt.text({
257
257
  message: 'Database name',
258
- hint: 'Optional - press Enter to auto-generate',
258
+ hint: 'Optional - lowercase letters, digits, underscores only',
259
+ validate: (value) => {
260
+ const trimmed = value.trim();
261
+ if (trimmed === '')
262
+ return true;
263
+ const result = validateDatabaseName(trimmed);
264
+ return result.valid ? true : result.error;
265
+ },
259
266
  });
267
+ const dbName = dbNameInput.trim() || undefined;
260
268
  const dbDescription = await prompt.text({
261
269
  message: 'Database description',
262
270
  hint: 'Optional - press Enter to skip',
@@ -268,7 +276,7 @@ export async function runCreateFlow(options) {
268
276
  return createResources(catalystClient, orgId, region, [
269
277
  {
270
278
  type: 'db',
271
- name: dbName || undefined,
279
+ name: dbName,
272
280
  description: dbDescription || undefined,
273
281
  },
274
282
  ]);
@@ -493,6 +501,16 @@ export async function runCreateFlow(options) {
493
501
  if (authEnabled && !templateHasAuth) {
494
502
  printIntegrationExamples();
495
503
  }
504
+ return {
505
+ projectId,
506
+ orgId,
507
+ name: projectName,
508
+ path: dest,
509
+ template: selectedTemplate.id,
510
+ installed: !options.noInstall,
511
+ built: !options.noBuild,
512
+ domains: _domains,
513
+ };
496
514
  }
497
515
  /**
498
516
  * Sanitize a project name to create a safe directory/package name