@agentuity/cli 0.1.13 → 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.
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +6 -2
- package/dist/auth.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +44 -91
- package/dist/cli.js.map +1 -1
- package/dist/cmd/auth/index.d.ts.map +1 -1
- package/dist/cmd/auth/index.js +3 -0
- package/dist/cmd/auth/index.js.map +1 -1
- package/dist/cmd/auth/org/index.d.ts +2 -0
- package/dist/cmd/auth/org/index.d.ts.map +1 -0
- package/dist/cmd/auth/org/index.js +121 -0
- package/dist/cmd/auth/org/index.js.map +1 -0
- package/dist/cmd/build/vite/beacon-plugin.d.ts +19 -0
- package/dist/cmd/build/vite/beacon-plugin.d.ts.map +1 -0
- package/dist/cmd/build/vite/beacon-plugin.js +137 -0
- package/dist/cmd/build/vite/beacon-plugin.js.map +1 -0
- package/dist/cmd/build/vite/vite-builder.d.ts +2 -0
- package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-builder.js +12 -2
- package/dist/cmd/build/vite/vite-builder.js.map +1 -1
- package/dist/cmd/build/webanalytics-generator.js +25 -9
- package/dist/cmd/build/webanalytics-generator.js.map +1 -1
- package/dist/cmd/cloud/db/get.d.ts.map +1 -1
- package/dist/cmd/cloud/db/get.js +7 -0
- package/dist/cmd/cloud/db/get.js.map +1 -1
- package/dist/cmd/cloud/db/list.d.ts.map +1 -1
- package/dist/cmd/cloud/db/list.js +19 -6
- package/dist/cmd/cloud/db/list.js.map +1 -1
- package/dist/cmd/cloud/deploy.d.ts.map +1 -1
- package/dist/cmd/cloud/deploy.js +24 -1
- package/dist/cmd/cloud/deploy.js.map +1 -1
- package/dist/cmd/cloud/deployment/show.d.ts.map +1 -1
- package/dist/cmd/cloud/deployment/show.js +5 -0
- package/dist/cmd/cloud/deployment/show.js.map +1 -1
- package/dist/cmd/cloud/index.d.ts.map +1 -1
- package/dist/cmd/cloud/index.js +3 -0
- package/dist/cmd/cloud/index.js.map +1 -1
- package/dist/cmd/cloud/region/index.d.ts +2 -0
- package/dist/cmd/cloud/region/index.d.ts.map +1 -0
- package/dist/cmd/cloud/region/index.js +136 -0
- package/dist/cmd/cloud/region/index.js.map +1 -0
- package/dist/cmd/cloud/sandbox/snapshot/build.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/build.js +35 -5
- package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
- package/dist/cmd/cloud/scp/download.d.ts.map +1 -1
- package/dist/cmd/cloud/scp/download.js +4 -2
- package/dist/cmd/cloud/scp/download.js.map +1 -1
- package/dist/cmd/cloud/scp/upload.d.ts.map +1 -1
- package/dist/cmd/cloud/scp/upload.js +4 -2
- package/dist/cmd/cloud/scp/upload.js.map +1 -1
- package/dist/cmd/cloud/ssh.d.ts.map +1 -1
- package/dist/cmd/cloud/ssh.js +3 -1
- package/dist/cmd/cloud/ssh.js.map +1 -1
- package/dist/cmd/cloud/storage/get.d.ts.map +1 -1
- package/dist/cmd/cloud/storage/get.js +12 -5
- package/dist/cmd/cloud/storage/get.js.map +1 -1
- package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
- package/dist/cmd/cloud/storage/list.js +10 -0
- package/dist/cmd/cloud/storage/list.js.map +1 -1
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +62 -5
- package/dist/cmd/dev/index.js.map +1 -1
- package/dist/cmd/help/index.d.ts.map +1 -1
- package/dist/cmd/help/index.js +8 -18
- package/dist/cmd/help/index.js.map +1 -1
- package/dist/cmd/project/create.d.ts.map +1 -1
- package/dist/cmd/project/create.js +10 -7
- package/dist/cmd/project/create.js.map +1 -1
- package/dist/cmd/project/import.d.ts +2 -0
- package/dist/cmd/project/import.d.ts.map +1 -0
- package/dist/cmd/project/import.js +88 -0
- package/dist/cmd/project/import.js.map +1 -0
- package/dist/cmd/project/index.d.ts.map +1 -1
- package/dist/cmd/project/index.js +3 -0
- package/dist/cmd/project/index.js.map +1 -1
- package/dist/cmd/project/reconcile.d.ts +67 -0
- package/dist/cmd/project/reconcile.d.ts.map +1 -0
- package/dist/cmd/project/reconcile.js +458 -0
- package/dist/cmd/project/reconcile.js.map +1 -0
- package/dist/cmd/project/template-flow.d.ts +11 -1
- package/dist/cmd/project/template-flow.d.ts.map +1 -1
- package/dist/cmd/project/template-flow.js +25 -7
- package/dist/cmd/project/template-flow.js.map +1 -1
- package/dist/config.d.ts +8 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +50 -21
- package/dist/config.js.map +1 -1
- package/dist/legacy-check.d.ts.map +1 -1
- package/dist/legacy-check.js +8 -0
- package/dist/legacy-check.js.map +1 -1
- package/dist/program-ref.d.ts +4 -0
- package/dist/program-ref.d.ts.map +1 -0
- package/dist/program-ref.js +8 -0
- package/dist/program-ref.js.map +1 -0
- package/dist/regions.d.ts +8 -0
- package/dist/regions.d.ts.map +1 -0
- package/dist/regions.js +77 -0
- package/dist/regions.js.map +1 -0
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +5 -4
- package/dist/tui.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/package.json +6 -6
- package/src/auth.ts +8 -8
- package/src/cli.ts +52 -108
- package/src/cmd/auth/index.ts +3 -0
- package/src/cmd/auth/org/index.ts +142 -0
- package/src/cmd/build/vite/beacon-plugin.ts +162 -0
- package/src/cmd/build/vite/vite-builder.ts +15 -2
- package/src/cmd/build/webanalytics-generator.ts +25 -9
- package/src/cmd/cloud/db/get.ts +7 -0
- package/src/cmd/cloud/db/list.ts +20 -6
- package/src/cmd/cloud/deploy.ts +32 -1
- package/src/cmd/cloud/deployment/show.ts +5 -0
- package/src/cmd/cloud/index.ts +3 -0
- package/src/cmd/cloud/region/index.ts +157 -0
- package/src/cmd/cloud/sandbox/snapshot/build.ts +42 -5
- package/src/cmd/cloud/scp/download.ts +6 -2
- package/src/cmd/cloud/scp/upload.ts +6 -2
- package/src/cmd/cloud/ssh.ts +5 -1
- package/src/cmd/cloud/storage/get.ts +12 -5
- package/src/cmd/cloud/storage/list.ts +11 -0
- package/src/cmd/dev/index.ts +62 -5
- package/src/cmd/help/index.ts +8 -22
- package/src/cmd/project/create.ts +10 -7
- package/src/cmd/project/import.ts +98 -0
- package/src/cmd/project/index.ts +3 -0
- package/src/cmd/project/reconcile.ts +606 -0
- package/src/cmd/project/template-flow.ts +37 -7
- package/src/config.ts +58 -22
- package/src/legacy-check.ts +10 -0
- package/src/program-ref.ts +11 -0
- package/src/regions.ts +95 -0
- package/src/tui.ts +6 -4
- 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":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,EACN,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GAGjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EACN,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAkCtD,MAAM,WAAW,GAAkB;IAClC,UAAU;IACV,aAAa;IACb,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;IACnB,KAAK;IACL,OAAO,EAAE,GAAG,CAAC,OAAO;IACpB,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;CAC1C,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,GAAW,EACX,MAAqB,EACrB,OAAiD,WAAW;IAE5D,IAAI,CAAC;QACJ,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjE,yEAAyE;gBACzE,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,iCAAiC;QAClC,CAAC;IACF,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,GAAW;IACxD,wEAAwE;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IAEpD,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;YAC7D,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBACzE,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,sCAAsC;QACvC,CAAC;IACF,CAAC;IAED,6FAA6F;IAC7F,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACtE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;QAElE,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACJ,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrD,MAAM,SAAS,GAAG,EAAE,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;gBAC5E,IAAI,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;oBACnF,OAAO,IAAI,CAAC;gBACb,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,+CAA+C;YAChD,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,MAAc;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5B,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5C,QAAQ,CAAC,iBAAiB,GAAG,MAAM,CAAC;QACpC,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACP,kBAAkB;QAClB,MAAM,OAAO,GACZ,0FAA0F,CAAC;QAC5F,MAAM,OAAO,GAAG,GAAG,OAAO,uBAAuB,MAAM,IAAI,CAAC;QAC5D,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;AACF,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC9B,GAAW,EACX,SAAiB,EACjB,SAAoB,EACpB,MAAc;IAEd,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAErD,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACzD,MAAM,gBAAgB,CAAC,SAAS,EAAE;gBACjC,EAAE,EAAE,SAAS;gBACb,GAAG;gBACH,OAAO;aACP,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,iCAAiC,CAAC,CAAC;QAC1F,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,gCAAgC;QAChC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;AACF,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CACvB,IAAsB,EACtB,MAAc,EACd,YAAqB;IAErB,OAAO,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,YAAY,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAChF,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,OAAmB,EAAE,aAAsB;IACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,iCAAiC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,KAAK,EAAE,CAAC,CAAC,MAAM;QACf,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,MAAM,GAAG;KACvC,CAAC,CAAC,CAAC;IAEJ,+BAA+B;IAC/B,MAAM,YAAY,GAAG,aAAa,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC;IACxE,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,kBAAkB;QAC3B,OAAO;QACP,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK;KACzB,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,OAIzB;IACA,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS;QACnE,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC1B,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,qBAAqB,CACnC,IAAsB,EACtB,cAAuB,EACvB,IAAsB;IAEtB,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEhD,GAAG,CAAC,OAAO,CACV,yGAAyG,CACzG,CAAC;IACF,GAAG,CAAC,OAAO,EAAE,CAAC;IAEd,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,OAAO,CACrC,6DAA6D,EAC7D,IAAI,CACJ,CAAC;IAEF,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC;IACpE,CAAC;IAED,GAAG,CAAC,OAAO,EAAE,CAAC;IAEd,aAAa;IACb,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IAElE,2BAA2B;IAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;QACjC,OAAO,EAAE,kBAAkB;QAC3B,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC;KACrE,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAElE,mBAAmB;IACnB,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC;QACpC,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;YAC3B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,0BAA0B,CAAC;YACnC,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;KACD,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;QACpC,OAAO,EAAE,qBAAqB;QAC9B,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,KAAK,IAAI,EAAE;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE;gBAC/B,IAAI,EAAE,WAAW;gBACjB,KAAK;gBACL,WAAW,EAAE,MAAM;aACnB,CAAC,CAAC;QACJ,CAAC;KACD,CAAC,CAAC;IAEH,+BAA+B;IAC/B,MAAM,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAChD,GAAG,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;IAEjD,4BAA4B;IAC5B,MAAM,mBAAmB,CAAC,GAAG,EAAE;QAC9B,SAAS,EAAE,UAAU,CAAC,EAAE;QACxB,KAAK;QACL,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,MAAM;KACN,CAAC,CAAC;IACH,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEtC,gBAAgB;IAChB,MAAM,GAAG,CAAC,OAAO,CAAC;QACjB,OAAO,EAAE,+BAA+B;QACxC,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC;KACvE,CAAC,CAAC;IAEH,MAAM,OAAO,GAAY;QACxB,SAAS,EAAE,UAAU,CAAC,EAAE;QACxB,KAAK;QACL,MAAM;KACN,CAAC;IAEF,GAAG,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAE9C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,IAAsB;IACrD,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEhD,GAAG,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC;IACpE,GAAG,CAAC,OAAO,EAAE,CAAC;IAEd,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,oCAAoC,EAAE,IAAI,CAAC,CAAC;IAEnF,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC;IAC1E,CAAC;IAED,GAAG,CAAC,OAAO,EAAE,CAAC;IAEd,oBAAoB;IACpB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;QAC9B,OAAO,EAAE,wBAAwB;QACjC,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KAC5C,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC;IACjF,CAAC;IAED,aAAa;IACb,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE5C,2BAA2B;IAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;QACjC,OAAO,EAAE,kBAAkB;QAC3B,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC;KACrE,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAE3C,+CAA+C;IAC/C,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC;QACpC,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;YAC3B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,0BAA0B,CAAC;YACnC,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;KACD,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;QACpC,OAAO,EAAE,qBAAqB;QAC9B,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,KAAK,IAAI,EAAE;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE;gBAC/B,IAAI,EAAE,WAAW;gBACjB,KAAK;gBACL,WAAW,EAAE,MAAM;aACnB,CAAC,CAAC;QACJ,CAAC;KACD,CAAC,CAAC;IAEH,kCAAkC;IAClC,MAAM,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAChD,GAAG,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;IAEjD,wBAAwB;IACxB,MAAM,mBAAmB,CAAC,GAAG,EAAE;QAC9B,SAAS,EAAE,UAAU,CAAC,EAAE;QACxB,KAAK;QACL,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,MAAM;KACN,CAAC,CAAC;IACH,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEtC,gBAAgB;IAChB,MAAM,GAAG,CAAC,OAAO,CAAC;QACjB,OAAO,EAAE,+BAA+B;QACxC,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC;KACvE,CAAC,CAAC;IAEH,MAAM,OAAO,GAAY;QACxB,SAAS,EAAE,UAAU,CAAC,EAAE;QACxB,KAAK;QACL,MAAM;KACN,CAAC;IAEF,GAAG,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAEhD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAsB;IAC5D,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAErF,oCAAoC;IACpC,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAE9D,IAAI,aAAa,EAAE,CAAC;QACnB,yCAAyC;QACzC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE1F,wCAAwC;YACxC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;YAEnE,IAAI,SAAS,EAAE,CAAC;gBACf,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACpD,CAAC;YAED,6CAA6C;YAC7C,IAAI,CAAC,WAAW,IAAI,YAAY,EAAE,CAAC;gBAClC,OAAO;oBACN,MAAM,EAAE,OAAO;oBACf,OAAO,EACN,6FAA6F;iBAC9F,CAAC;YACH,CAAC;YAED,OAAO,MAAM,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,qCAAqC;YACrC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YAE5C,IAAI,CAAC,WAAW,IAAI,YAAY,EAAE,CAAC;gBAClC,OAAO;oBACN,MAAM,EAAE,OAAO;oBACf,OAAO,EACN,0FAA0F;iBAC3F,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACpD,OAAO,MAAM,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;IACF,CAAC;IAED,oDAAoD;IACpD,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAEnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO;YACN,MAAM,EAAE,OAAO;YACf,OAAO,EACN,kEAAkE;gBAClE,kEAAkE;gBAClE,gCAAgC;SACjC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,YAAY,EAAE,CAAC;QAClC,OAAO;YACN,MAAM,EAAE,OAAO;YACf,OAAO,EACN,mDAAmD;gBACnD,sDAAsD;SACvD,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,OAAO,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAsB;IAC5D,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IAElF,sDAAsD;IACtD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAE9D,IAAI,aAAa,EAAE,CAAC;QACnB,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1F,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;YAEnE,IAAI,SAAS,EAAE,CAAC;gBACf,GAAG,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;gBAC1E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACpD,CAAC;YAED,qDAAqD;YACrD,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClB,OAAO;oBACN,MAAM,EAAE,OAAO;oBACf,OAAO,EACN,6FAA6F;iBAC9F,CAAC;YACH,CAAC;YAED,OAAO,MAAM,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACR,0CAA0C;YAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClB,OAAO;oBACN,MAAM,EAAE,OAAO;oBACf,OAAO,EAAE,yEAAyE;iBAClF,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACpD,OAAO,MAAM,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;IACF,CAAC;IAED,gEAAgE;IAChE,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAEnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO;YACN,MAAM,EAAE,OAAO;YACf,OAAO,EACN,kEAAkE;gBAClE,kEAAkE;gBAClE,gCAAgC;SACjC,CAAC;IACH,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO;YACN,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,iDAAiD;SAC1D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO;YACN,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,2CAA2C;SACpD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -18,6 +18,16 @@ interface CreateFlowOptions {
|
|
|
18
18
|
region?: string;
|
|
19
19
|
apiClient?: APIClient;
|
|
20
20
|
}
|
|
21
|
-
export
|
|
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":"
|
|
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
|
|
256
|
+
const dbNameInput = await prompt.text({
|
|
257
257
|
message: 'Database name',
|
|
258
|
-
hint: 'Optional -
|
|
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
|
|
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
|