@agentuity/cli 0.0.86 → 0.0.87
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/bin/cli.ts +7 -0
- package/dist/bun-path.d.ts.map +1 -1
- package/dist/bun-path.js +1 -3
- package/dist/bun-path.js.map +1 -1
- package/dist/cmd/ai/index.d.ts.map +1 -1
- package/dist/cmd/ai/index.js +1 -0
- package/dist/cmd/ai/index.js.map +1 -1
- package/dist/cmd/build/ast.d.ts.map +1 -1
- package/dist/cmd/build/ast.js +5 -0
- package/dist/cmd/build/ast.js.map +1 -1
- package/dist/cmd/build/bundler.d.ts.map +1 -1
- package/dist/cmd/build/bundler.js +10 -0
- package/dist/cmd/build/bundler.js.map +1 -1
- package/dist/cmd/build/patch/_util.js +6 -6
- package/dist/cmd/build/patch/_util.js.map +1 -1
- package/dist/cmd/build/patch/llm.js +1 -1
- package/dist/cmd/build/patch/llm.js.map +1 -1
- package/dist/cmd/build/plugin.d.ts.map +1 -1
- package/dist/cmd/build/plugin.js +21 -14
- package/dist/cmd/build/plugin.js.map +1 -1
- package/dist/cmd/build/route-discovery.d.ts +8 -4
- package/dist/cmd/build/route-discovery.d.ts.map +1 -1
- package/dist/cmd/build/route-discovery.js +10 -5
- package/dist/cmd/build/route-discovery.js.map +1 -1
- package/dist/cmd/cloud/scp/download.js +3 -3
- package/dist/cmd/cloud/scp/download.js.map +1 -1
- package/dist/cmd/cloud/scp/upload.js +3 -3
- package/dist/cmd/cloud/scp/upload.js.map +1 -1
- package/dist/cmd/cloud/ssh.js +3 -3
- package/dist/cmd/cloud/ssh.js.map +1 -1
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +5 -0
- package/dist/cmd/dev/index.js.map +1 -1
- package/dist/cmd/index.d.ts.map +1 -1
- package/dist/cmd/index.js +7 -0
- package/dist/cmd/index.js.map +1 -1
- package/dist/cmd/profile/create.d.ts.map +1 -1
- package/dist/cmd/profile/create.js +1 -0
- package/dist/cmd/profile/create.js.map +1 -1
- package/dist/cmd/upgrade/index.d.ts +20 -0
- package/dist/cmd/upgrade/index.d.ts.map +1 -0
- package/dist/cmd/upgrade/index.js +307 -0
- package/dist/cmd/upgrade/index.js.map +1 -0
- package/dist/cmd/version/index.d.ts.map +1 -1
- package/dist/cmd/version/index.js +1 -0
- package/dist/cmd/version/index.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -94
- package/dist/config.js.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +16 -0
- package/dist/tui.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/dependency-checker.d.ts +20 -0
- package/dist/utils/dependency-checker.d.ts.map +1 -0
- package/dist/utils/dependency-checker.js +161 -0
- package/dist/utils/dependency-checker.js.map +1 -0
- package/dist/version-check.d.ts +13 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +177 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +3 -3
- package/src/bun-path.ts +1 -3
- package/src/cmd/ai/index.ts +1 -0
- package/src/cmd/build/ast.ts +7 -0
- package/src/cmd/build/bundler.ts +12 -0
- package/src/cmd/build/patch/_util.ts +6 -6
- package/src/cmd/build/patch/llm.ts +1 -1
- package/src/cmd/build/plugin.ts +23 -16
- package/src/cmd/build/route-discovery.ts +10 -5
- package/src/cmd/cloud/scp/download.ts +3 -3
- package/src/cmd/cloud/scp/upload.ts +3 -3
- package/src/cmd/cloud/ssh.ts +3 -3
- package/src/cmd/dev/index.ts +11 -0
- package/src/cmd/index.ts +8 -0
- package/src/cmd/profile/create.ts +1 -0
- package/src/cmd/project/download.ts +1 -1
- package/src/cmd/upgrade/index.ts +365 -0
- package/src/cmd/version/index.ts +1 -0
- package/src/config.ts +12 -121
- package/src/git-helper.ts +4 -4
- package/src/tui.ts +19 -0
- package/src/types.ts +7 -0
- package/src/utils/dependency-checker.ts +207 -0
- package/src/version-check.ts +234 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { $ } from 'bun';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { getVersion } from '../version';
|
|
5
|
+
/**
|
|
6
|
+
* Checks if a version specifier should be upgraded
|
|
7
|
+
* @param specifier - The version specifier from package.json (e.g., "latest", "^1.0.0", "1.2.3")
|
|
8
|
+
* @returns true if the package should be upgraded
|
|
9
|
+
*/
|
|
10
|
+
export function shouldUpgradeVersion(specifier) {
|
|
11
|
+
// Always upgrade "latest" and "*"
|
|
12
|
+
if (specifier === 'latest' || specifier === '*') {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
// Skip pinned versions (exact semver like "1.2.3")
|
|
16
|
+
if (/^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/.test(specifier)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
// Upgrade ranges (^1.0.0, ~1.0.0, >=1.0.0, etc.)
|
|
20
|
+
// Check if the specifier is a range pattern
|
|
21
|
+
if (/^[~^>=<]/.test(specifier)) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
// Default to not upgrading if we can't determine
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check and upgrade @agentuity/* dependencies to match CLI version
|
|
29
|
+
* @param projectDir - Root directory of the user's project
|
|
30
|
+
* @param logger - Logger instance
|
|
31
|
+
* @returns Result of the upgrade operation
|
|
32
|
+
*/
|
|
33
|
+
export async function checkAndUpgradeDependencies(projectDir, logger) {
|
|
34
|
+
const result = {
|
|
35
|
+
upgraded: [],
|
|
36
|
+
skipped: [],
|
|
37
|
+
failed: [],
|
|
38
|
+
};
|
|
39
|
+
// Skip in CI/non-interactive environments
|
|
40
|
+
if (!process.stdin.isTTY) {
|
|
41
|
+
logger.debug('Skipping dependency check in non-interactive environment');
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
const packageJsonPath = join(projectDir, 'package.json');
|
|
45
|
+
const cliVersion = getVersion();
|
|
46
|
+
logger.debug('CLI version: %s', cliVersion);
|
|
47
|
+
// Read package.json
|
|
48
|
+
let packageJson;
|
|
49
|
+
try {
|
|
50
|
+
packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
logger.debug('Failed to read package.json: %s', error);
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
// Collect all @agentuity/* packages and their original specifiers
|
|
57
|
+
const allDeps = {
|
|
58
|
+
...packageJson.dependencies,
|
|
59
|
+
...packageJson.devDependencies,
|
|
60
|
+
};
|
|
61
|
+
const agentuitPackages = Object.entries(allDeps)
|
|
62
|
+
.filter(([name]) => name.startsWith('@agentuity/'))
|
|
63
|
+
.map(([name, specifier]) => ({ name, specifier }));
|
|
64
|
+
if (agentuitPackages.length === 0) {
|
|
65
|
+
logger.debug('No @agentuity/* packages found in package.json');
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
// Check which packages need upgrading
|
|
69
|
+
const packagesToUpgrade = agentuitPackages.filter(({ specifier }) => shouldUpgradeVersion(specifier));
|
|
70
|
+
if (packagesToUpgrade.length === 0) {
|
|
71
|
+
logger.debug('All @agentuity/* packages are pinned, skipping upgrade');
|
|
72
|
+
for (const pkg of agentuitPackages) {
|
|
73
|
+
result.skipped.push(pkg.name);
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
// Check if CLI version is different from installed packages
|
|
78
|
+
let needsUpgrade = false;
|
|
79
|
+
for (const { name } of packagesToUpgrade) {
|
|
80
|
+
try {
|
|
81
|
+
const installedPackageJson = JSON.parse(readFileSync(join(projectDir, 'node_modules', name, 'package.json'), 'utf-8'));
|
|
82
|
+
const installedVersion = installedPackageJson.version;
|
|
83
|
+
if (installedVersion !== cliVersion) {
|
|
84
|
+
logger.debug('%s: installed=%s, cli=%s (needs upgrade)', name, installedVersion, cliVersion);
|
|
85
|
+
needsUpgrade = true;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
logger.debug('%s: already at correct version %s', name, installedVersion);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Package not installed or can't read version - needs upgrade
|
|
93
|
+
logger.debug('%s: not installed or unreadable, needs upgrade', name);
|
|
94
|
+
needsUpgrade = true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (!needsUpgrade) {
|
|
98
|
+
logger.debug('All @agentuity/* packages are already at CLI version');
|
|
99
|
+
for (const pkg of packagesToUpgrade) {
|
|
100
|
+
result.skipped.push(pkg.name);
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
// Upgrade packages
|
|
105
|
+
logger.debug('Upgrading %d @agentuity/* package(s) to %s', packagesToUpgrade.length, cliVersion);
|
|
106
|
+
for (const { name } of packagesToUpgrade) {
|
|
107
|
+
try {
|
|
108
|
+
logger.debug('Installing %s@%s', name, cliVersion);
|
|
109
|
+
const installResult = await $ `bun add ${name}@${cliVersion}`
|
|
110
|
+
.cwd(projectDir)
|
|
111
|
+
.quiet()
|
|
112
|
+
.nothrow();
|
|
113
|
+
if (installResult.exitCode !== 0) {
|
|
114
|
+
logger.error('Failed to install %s@%s: %s', name, cliVersion, installResult.stderr.toString());
|
|
115
|
+
result.failed.push(name);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
logger.debug('Successfully installed %s@%s', name, cliVersion);
|
|
119
|
+
result.upgraded.push(name);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (_error) {
|
|
123
|
+
logger.error('Error installing %s: %s', name, _error);
|
|
124
|
+
result.failed.push(name);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Restore original version specifiers in package.json
|
|
128
|
+
// (bun add replaces them with specific versions)
|
|
129
|
+
if (result.upgraded.length > 0) {
|
|
130
|
+
try {
|
|
131
|
+
const updatedPackageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
132
|
+
let modified = false;
|
|
133
|
+
for (const { name, specifier } of packagesToUpgrade) {
|
|
134
|
+
// Only restore if we successfully upgraded
|
|
135
|
+
if (!result.upgraded.includes(name)) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// Check both dependencies and devDependencies
|
|
139
|
+
if (updatedPackageJson.dependencies?.[name]) {
|
|
140
|
+
updatedPackageJson.dependencies[name] = specifier;
|
|
141
|
+
modified = true;
|
|
142
|
+
logger.debug('Restored %s to "%s" in dependencies', name, specifier);
|
|
143
|
+
}
|
|
144
|
+
if (updatedPackageJson.devDependencies?.[name]) {
|
|
145
|
+
updatedPackageJson.devDependencies[name] = specifier;
|
|
146
|
+
modified = true;
|
|
147
|
+
logger.debug('Restored %s to "%s" in devDependencies', name, specifier);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (modified) {
|
|
151
|
+
writeFileSync(packageJsonPath, JSON.stringify(updatedPackageJson, null, 2) + '\n');
|
|
152
|
+
logger.debug('Restored original version specifiers in package.json');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (_error) {
|
|
156
|
+
logger.warn('Failed to restore version specifiers in package.json: %s', _error);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=dependency-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-checker.js","sourceRoot":"","sources":["../../src/utils/dependency-checker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAcxC;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACrD,kCAAkC;IAClC,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,mDAAmD;IACnD,IAAI,mCAAmC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,iDAAiD;IACjD,4CAA4C;IAC5C,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,iDAAiD;IACjD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAChD,UAAkB,EAClB,MAAc;IAEd,MAAM,MAAM,GAAkB;QAC7B,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;KACV,CAAC;IAEF,0CAA0C;IAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC;IACf,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;IAEhC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAE5C,oBAAoB;IACpB,IAAI,WAAwB,CAAC;IAC7B,IAAI,CAAC;QACJ,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,kEAAkE;IAClE,MAAM,OAAO,GAAG;QACf,GAAG,WAAW,CAAC,YAAY;QAC3B,GAAG,WAAW,CAAC,eAAe;KAC9B,CAAC;IAEF,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SAC9C,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;SAClD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAEpD,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC;IACf,CAAC;IAED,sCAAsC;IACtC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CACnE,oBAAoB,CAAC,SAAS,CAAC,CAC/B,CAAC;IAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACvE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,4DAA4D;IAC5D,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,iBAAiB,EAAE,CAAC;QAC1C,IAAI,CAAC;YACJ,MAAM,oBAAoB,GAAG,IAAI,CAAC,KAAK,CACtC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAC7E,CAAC;YACF,MAAM,gBAAgB,GAAW,oBAAoB,CAAC,OAAO,CAAC;YAC9D,IAAI,gBAAgB,KAAK,UAAU,EAAE,CAAC;gBACrC,MAAM,CAAC,KAAK,CACX,0CAA0C,EAC1C,IAAI,EACJ,gBAAgB,EAChB,UAAU,CACV,CAAC;gBACF,YAAY,GAAG,IAAI,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACP,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;YAC3E,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,8DAA8D;YAC9D,MAAM,CAAC,KAAK,CAAC,gDAAgD,EAAE,IAAI,CAAC,CAAC;YACrE,YAAY,GAAG,IAAI,CAAC;QACrB,CAAC;IACF,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACrE,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,mBAAmB;IACnB,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEjG,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,iBAAiB,EAAE,CAAC;QAC1C,IAAI,CAAC;YACJ,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACnD,MAAM,aAAa,GAAG,MAAM,CAAC,CAAA,WAAW,IAAI,IAAI,UAAU,EAAE;iBAC1D,GAAG,CAAC,UAAU,CAAC;iBACf,KAAK,EAAE;iBACP,OAAO,EAAE,CAAC;YAEZ,IAAI,aAAa,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,KAAK,CACX,6BAA6B,EAC7B,IAAI,EACJ,UAAU,EACV,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,CAC/B,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACP,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC/D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACF,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,sDAAsD;IACtD,iDAAiD;IACjD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACJ,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9E,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,KAAK,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,iBAAiB,EAAE,CAAC;gBACrD,2CAA2C;gBAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,SAAS;gBACV,CAAC;gBAED,8CAA8C;gBAC9C,IAAI,kBAAkB,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7C,kBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;oBAClD,QAAQ,GAAG,IAAI,CAAC;oBAChB,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;gBACtE,CAAC;gBACD,IAAI,kBAAkB,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChD,kBAAkB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;oBACrD,QAAQ,GAAG,IAAI,CAAC;oBAChB,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;gBACzE,CAAC;YACF,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACd,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBACnF,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;YACtE,CAAC;QACF,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,0DAA0D,EAAE,MAAM,CAAC,CAAC;QACjF,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Config, Logger, CommandDefinition } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Check for updates and optionally prompt to upgrade
|
|
4
|
+
* Should be called early in the CLI initialization, before commands execute
|
|
5
|
+
*/
|
|
6
|
+
export declare function checkForUpdates(config: Config | null, logger: Logger, options: {
|
|
7
|
+
json?: boolean;
|
|
8
|
+
quiet?: boolean;
|
|
9
|
+
validate?: boolean;
|
|
10
|
+
dryRun?: boolean;
|
|
11
|
+
skipVersionCheck?: boolean;
|
|
12
|
+
}, commandDef: CommandDefinition | undefined, args: string[]): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=version-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAqKjE;;;GAGG;AACH,wBAAsB,eAAe,CACpC,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACR,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B,EACD,UAAU,EAAE,iBAAiB,GAAG,SAAS,EACzC,IAAI,EAAE,MAAM,EAAE,GACZ,OAAO,CAAC,IAAI,CAAC,CAoDf"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { isRunningFromExecutable, fetchLatestVersion } from './cmd/upgrade';
|
|
2
|
+
import { getVersion } from './version';
|
|
3
|
+
import * as tui from './tui';
|
|
4
|
+
import { saveConfig } from './config';
|
|
5
|
+
import { $ } from 'bun';
|
|
6
|
+
const ONE_HOUR_MS = 60 * 60 * 1000;
|
|
7
|
+
/**
|
|
8
|
+
* Check if we should skip the version check based on environment and config
|
|
9
|
+
*/
|
|
10
|
+
function shouldSkipCheck(config, options, commandDef, args) {
|
|
11
|
+
// Skip if running via bun/bunx (not installed executable)
|
|
12
|
+
if (!isRunningFromExecutable()) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
// Skip if no TTY (CI, redirected output, etc.)
|
|
16
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
// Skip if any of these flags are set
|
|
20
|
+
if (options.json || options.quiet || options.validate || options.dryRun) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
// Skip if explicitly disabled via flag
|
|
24
|
+
if (options.skipVersionCheck) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
// Skip if explicitly disabled via environment variable
|
|
28
|
+
if (process.env.AGENTUITY_SKIP_VERSION_CHECK === '1') {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
// Skip if explicitly disabled via config
|
|
32
|
+
if (config?.overrides?.skip_version_check) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
// Skip if development version (0.0.x or 'dev')
|
|
36
|
+
const currentVersion = getVersion();
|
|
37
|
+
if (currentVersion.startsWith('0.0.') || currentVersion === 'dev') {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
// Skip if command explicitly opts out of upgrade check
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
42
|
+
if (commandDef && commandDef.skipUpgradeCheck === true) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
// Skip for help commands
|
|
46
|
+
const helpFlags = ['--help', '-h', 'help'];
|
|
47
|
+
if (args.some((arg) => helpFlags.includes(arg))) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if enough time has passed since last check (at least 1 hour)
|
|
54
|
+
*/
|
|
55
|
+
function shouldCheckNow(config) {
|
|
56
|
+
const lastCheck = config?.preferences?.last_update_check;
|
|
57
|
+
if (!lastCheck) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
const now = Date.now();
|
|
61
|
+
const elapsed = now - lastCheck;
|
|
62
|
+
return elapsed >= ONE_HOUR_MS;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Prompt user to upgrade to a new version
|
|
66
|
+
* Returns true if user wants to upgrade, false otherwise
|
|
67
|
+
*/
|
|
68
|
+
async function promptUpgrade(currentVersion, latestVersion) {
|
|
69
|
+
tui.newline();
|
|
70
|
+
tui.info(`${tui.bold('A new version of the CLI is available!')}`);
|
|
71
|
+
tui.info(`Current version: ${tui.muted(currentVersion)}`);
|
|
72
|
+
tui.info(`Latest version: ${tui.bold(latestVersion)}`);
|
|
73
|
+
tui.newline();
|
|
74
|
+
return await tui.confirm('Would you like to upgrade now?', true);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Update the last check timestamp in config
|
|
78
|
+
*/
|
|
79
|
+
async function updateCheckTimestamp(config, logger) {
|
|
80
|
+
if (!config) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const updatedConfig = {
|
|
84
|
+
...config,
|
|
85
|
+
preferences: {
|
|
86
|
+
...config.preferences,
|
|
87
|
+
last_update_check: Date.now(),
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
try {
|
|
91
|
+
await saveConfig(updatedConfig);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
// Non-fatal - log but continue
|
|
95
|
+
logger.debug('Failed to save config after version check: %s', error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Perform the upgrade and re-run the command
|
|
100
|
+
*/
|
|
101
|
+
async function performUpgrade(logger) {
|
|
102
|
+
try {
|
|
103
|
+
// Run upgrade command (it will validate, download, install, etc.)
|
|
104
|
+
// Use process.execPath to get the actual binary path (not Bun.main which is virtual)
|
|
105
|
+
logger.info('Starting upgrade...');
|
|
106
|
+
await $ `${process.execPath} upgrade`.quiet();
|
|
107
|
+
// If we got here, the upgrade succeeded
|
|
108
|
+
// Re-run the original command with the new binary
|
|
109
|
+
const args = process.argv.slice(2);
|
|
110
|
+
const newBinaryPath = process.execPath;
|
|
111
|
+
logger.info('Upgrade successful! Restarting with new version...');
|
|
112
|
+
tui.info('');
|
|
113
|
+
// Spawn new process with same arguments
|
|
114
|
+
const proc = Bun.spawn([newBinaryPath, ...args], {
|
|
115
|
+
stdin: 'inherit',
|
|
116
|
+
stdout: 'inherit',
|
|
117
|
+
stderr: 'inherit',
|
|
118
|
+
});
|
|
119
|
+
// Wait for the new process to complete
|
|
120
|
+
await proc.exited;
|
|
121
|
+
// Exit with the same exit code as the new process
|
|
122
|
+
process.exit(proc.exitCode ?? 0);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
// Upgrade failed - log and continue with original command
|
|
126
|
+
logger.error('Upgrade failed: %s', error instanceof Error ? error.message : 'Unknown error');
|
|
127
|
+
tui.warning('Continuing with current version...');
|
|
128
|
+
tui.info('');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Check for updates and optionally prompt to upgrade
|
|
133
|
+
* Should be called early in the CLI initialization, before commands execute
|
|
134
|
+
*/
|
|
135
|
+
export async function checkForUpdates(config, logger, options, commandDef, args) {
|
|
136
|
+
// Determine if we should skip the check
|
|
137
|
+
if (shouldSkipCheck(config, options, commandDef, args)) {
|
|
138
|
+
logger.trace('Skipping version check (disabled or not applicable)');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Check if enough time has passed
|
|
142
|
+
if (!shouldCheckNow(config)) {
|
|
143
|
+
logger.trace('Skipping version check (checked recently)');
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
// Perform the actual version check
|
|
147
|
+
logger.trace('Checking for updates...');
|
|
148
|
+
try {
|
|
149
|
+
const currentVersion = getVersion();
|
|
150
|
+
const latestVersion = await fetchLatestVersion();
|
|
151
|
+
// Update the timestamp since we successfully checked
|
|
152
|
+
await updateCheckTimestamp(config, logger);
|
|
153
|
+
// Compare versions
|
|
154
|
+
const normalizedCurrent = currentVersion.replace(/^v/, '');
|
|
155
|
+
const normalizedLatest = latestVersion.replace(/^v/, '');
|
|
156
|
+
if (normalizedCurrent === normalizedLatest) {
|
|
157
|
+
logger.trace('Already on latest version: %s', currentVersion);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// New version available - prompt user
|
|
161
|
+
const shouldUpgrade = await promptUpgrade(currentVersion, latestVersion);
|
|
162
|
+
if (!shouldUpgrade) {
|
|
163
|
+
// User declined - just continue
|
|
164
|
+
tui.info('You can upgrade later by running: agentuity upgrade');
|
|
165
|
+
tui.newline();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// User wants to upgrade - perform it
|
|
169
|
+
await performUpgrade(logger);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
// Non-fatal - if we can't fetch the latest version (network error, timeout, etc.),
|
|
173
|
+
// just log at debug level and continue without interrupting the user's command
|
|
174
|
+
logger.debug('Version check failed: %s', error instanceof Error ? error.message : 'Unknown error');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=version-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentuity/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.87",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"author": "Agentuity employees and contributors",
|
|
6
6
|
"type": "module",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"prepublishOnly": "bun run clean && bun run build"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@agentuity/core": "0.0.
|
|
39
|
-
"@agentuity/server": "0.0.
|
|
38
|
+
"@agentuity/core": "0.0.87",
|
|
39
|
+
"@agentuity/server": "0.0.87",
|
|
40
40
|
"@datasert/cronjs-parser": "^1.4.0",
|
|
41
41
|
"@terascope/fetch-github-release": "^2.2.1",
|
|
42
42
|
"acorn-loose": "^8.5.2",
|
package/src/bun-path.ts
CHANGED
|
@@ -21,8 +21,6 @@ export async function ensureBunOnPath(): Promise<void> {
|
|
|
21
21
|
// Check if bun exists in $HOME/.bun/bin
|
|
22
22
|
if (await Bun.file(bunPath).exists()) {
|
|
23
23
|
// Add to PATH for this process
|
|
24
|
-
process.env.PATH = process.env.PATH
|
|
25
|
-
? `${bunBinDir}:${process.env.PATH}`
|
|
26
|
-
: bunBinDir;
|
|
24
|
+
process.env.PATH = process.env.PATH ? `${bunBinDir}:${process.env.PATH}` : bunBinDir;
|
|
27
25
|
}
|
|
28
26
|
}
|
package/src/cmd/ai/index.ts
CHANGED
package/src/cmd/build/ast.ts
CHANGED
|
@@ -465,6 +465,13 @@ export async function parseEvalMetadata(
|
|
|
465
465
|
| 'error';
|
|
466
466
|
const logger = createLogger(logLevel);
|
|
467
467
|
logger.trace(`Parsing evals from ${filename}`);
|
|
468
|
+
|
|
469
|
+
// Quick string search optimization - skip AST parsing if no createEval call
|
|
470
|
+
if (!contents.includes('createEval')) {
|
|
471
|
+
logger.trace(`Skipping ${filename}: no createEval found`);
|
|
472
|
+
return [contents, []];
|
|
473
|
+
}
|
|
474
|
+
|
|
468
475
|
const ast = acornLoose.parse(contents, {
|
|
469
476
|
locations: true,
|
|
470
477
|
ecmaVersion: 'latest',
|
package/src/cmd/build/bundler.ts
CHANGED
|
@@ -14,6 +14,7 @@ import type { Logger } from '../../types';
|
|
|
14
14
|
import { generateWorkbenchMainTsx, generateWorkbenchIndexHtml } from './workbench';
|
|
15
15
|
import { analyzeWorkbench, type WorkbenchAnalysis } from './ast';
|
|
16
16
|
import { type DeployOptions } from '../../schemas/deploy';
|
|
17
|
+
import { checkAndUpgradeDependencies } from '../../utils/dependency-checker';
|
|
17
18
|
|
|
18
19
|
const minBunVersion = '>=1.3.3';
|
|
19
20
|
|
|
@@ -130,6 +131,14 @@ export async function bundle({
|
|
|
130
131
|
const versionOutput = await checkBunVersion();
|
|
131
132
|
output.push(...versionOutput);
|
|
132
133
|
|
|
134
|
+
// Check and upgrade @agentuity/* dependencies if needed
|
|
135
|
+
const upgradeResult = await checkAndUpgradeDependencies(rootDir, logger);
|
|
136
|
+
if (upgradeResult.failed.length > 0 && process.stdin.isTTY) {
|
|
137
|
+
throw new BuildFailedError({
|
|
138
|
+
message: `Failed to upgrade dependencies: ${upgradeResult.failed.join(', ')}`,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
133
142
|
const outDir = customOutDir ?? join(rootDir, '.agentuity');
|
|
134
143
|
const srcDir = join(rootDir, 'src');
|
|
135
144
|
|
|
@@ -376,6 +385,9 @@ export async function bundle({
|
|
|
376
385
|
}
|
|
377
386
|
}
|
|
378
387
|
|
|
388
|
+
// must always set for the template always
|
|
389
|
+
define['process.env.AGENTUITY_PUBLIC_WORKBENCH_PATH'] = JSON.stringify('');
|
|
390
|
+
|
|
379
391
|
// Analyze workbench config early to set environment variables for web build
|
|
380
392
|
if (existsSync(appFile)) {
|
|
381
393
|
if (!workbench) {
|
|
@@ -44,13 +44,13 @@ export function generateGatewayEnvGuard(
|
|
|
44
44
|
provider: string
|
|
45
45
|
): string {
|
|
46
46
|
return `{
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
50
|
-
process.env.${apikey} =
|
|
51
|
-
process.env.${apibase} =
|
|
47
|
+
const _agentuity_sdk_key = process.env.AGENTUITY_SDK_KEY;
|
|
48
|
+
const _agentuity_url = process.env.AGENTUITY_AIGATEWAY_URL || process.env.AGENTUITY_TRANSPORT_URL || (_agentuity_sdk_key ? 'https://agentuity.ai' : '');
|
|
49
|
+
if (_agentuity_url && _agentuity_sdk_key) {
|
|
50
|
+
process.env.${apikey} = _agentuity_sdk_key;
|
|
51
|
+
process.env.${apibase} = _agentuity_url + '/gateway/${provider}';
|
|
52
52
|
console.debug('Enabled Agentuity AI Gateway for ${provider}');
|
|
53
|
-
} else {
|
|
53
|
+
} else if (!process.env.${apikey}) {
|
|
54
54
|
${generateEnvWarning(apikey)}
|
|
55
55
|
}
|
|
56
56
|
}
|
package/src/cmd/build/plugin.ts
CHANGED
|
@@ -375,6 +375,8 @@ import { readFileSync, existsSync } from 'node:fs';
|
|
|
375
375
|
index += html;
|
|
376
376
|
}
|
|
377
377
|
}
|
|
378
|
+
// make paths absolute
|
|
379
|
+
index = index.replaceAll('./web/', '/web/');
|
|
378
380
|
const webstatic = serveStatic({ root: import.meta.dir + '/web' });
|
|
379
381
|
// In dev mode, serve from source; in prod, serve from build output
|
|
380
382
|
const publicRoot = ${isDevMode} ? ${JSON.stringify(join(srcDir, 'web', 'public'))} : import.meta.dir + '/web/public';
|
|
@@ -389,16 +391,8 @@ import { readFileSync, existsSync } from 'node:fs';
|
|
|
389
391
|
if (path.includes('..') || path.includes('%2e%2e')) {
|
|
390
392
|
return c.notFound();
|
|
391
393
|
}
|
|
392
|
-
//
|
|
393
|
-
|
|
394
|
-
try {
|
|
395
|
-
// serveStatic calls next() internally if file not found
|
|
396
|
-
return await publicstatic(c, next);
|
|
397
|
-
} catch (err) {
|
|
398
|
-
return next();
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
return next();
|
|
394
|
+
// serve default for any path not explicitly matched
|
|
395
|
+
return c.html(index);
|
|
402
396
|
});
|
|
403
397
|
})();`);
|
|
404
398
|
}
|
|
@@ -495,6 +489,14 @@ import { readFileSync, existsSync } from 'node:fs';
|
|
|
495
489
|
}
|
|
496
490
|
|
|
497
491
|
for (const apiFile of apiFiles) {
|
|
492
|
+
// Quick check: skip files that don't contain createRouter or Hono
|
|
493
|
+
// This avoids expensive AST parsing for utility files
|
|
494
|
+
const fileContent = await Bun.file(apiFile).text();
|
|
495
|
+
if (!fileContent.includes('createRouter') && !fileContent.includes('new Hono')) {
|
|
496
|
+
logger.trace(`Skipping ${apiFile}: no createRouter or Hono found`);
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
|
|
498
500
|
try {
|
|
499
501
|
const routes = await parseRoute(rootDir, apiFile, projectId, deploymentId);
|
|
500
502
|
|
|
@@ -574,12 +576,17 @@ import { readFileSync, existsSync } from 'node:fs';
|
|
|
574
576
|
});
|
|
575
577
|
}
|
|
576
578
|
} catch (error) {
|
|
577
|
-
// Skip files that don't have
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
579
|
+
// Skip files that don't have proper router setup despite containing createRouter/Hono
|
|
580
|
+
// (e.g., files that import but don't use them, or have syntax errors)
|
|
581
|
+
if (error instanceof Error) {
|
|
582
|
+
if (
|
|
583
|
+
error.message.includes('could not find default export') ||
|
|
584
|
+
error.message.includes('could not find an proper createRouter')
|
|
585
|
+
) {
|
|
586
|
+
logger.trace(`Skipping ${apiFile}: ${error.message}`);
|
|
587
|
+
} else {
|
|
588
|
+
throw error;
|
|
589
|
+
}
|
|
583
590
|
} else {
|
|
584
591
|
throw error;
|
|
585
592
|
}
|
|
@@ -19,17 +19,21 @@ export interface DiscoveredRouteFile {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
|
-
* Recursively discover all TypeScript
|
|
22
|
+
* Recursively discover all TypeScript files in an API directory.
|
|
23
|
+
* Any .ts file CAN be a route if it exports a router, but not all files MUST be routes.
|
|
24
|
+
* Files without router exports (utility files, types, helpers) are discovered but gracefully skipped during processing.
|
|
25
|
+
*
|
|
23
26
|
* Supports nested structures like:
|
|
24
|
-
* - src/api/index.ts (root API router)
|
|
27
|
+
* - src/api/index.ts (root API router - handled separately)
|
|
25
28
|
* - src/api/auth/route.ts -> mounted at /api/auth
|
|
29
|
+
* - src/api/auth/login.ts -> mounted at /api/auth
|
|
26
30
|
* - src/api/v1/users/route.ts -> mounted at /api/v1/users
|
|
27
|
-
* - src/api/
|
|
31
|
+
* - src/api/auth/helpers.ts -> discovered but skipped if no router export
|
|
28
32
|
*
|
|
29
33
|
* @param apiDir - Absolute path to the src/api directory
|
|
30
34
|
* @param currentDir - Current directory being scanned (used for recursion)
|
|
31
35
|
* @param results - Accumulated results (used for recursion)
|
|
32
|
-
* @returns Array of discovered
|
|
36
|
+
* @returns Array of discovered TypeScript files with mount information
|
|
33
37
|
*/
|
|
34
38
|
export function discoverRouteFiles(
|
|
35
39
|
apiDir: string,
|
|
@@ -63,8 +67,9 @@ export function discoverRouteFiles(
|
|
|
63
67
|
|
|
64
68
|
// For subdirectory files, determine mount path
|
|
65
69
|
// src/api/auth/route.ts -> /api/auth
|
|
70
|
+
// src/api/auth/login.ts -> /api/auth
|
|
66
71
|
// src/api/v1/users/route.ts -> /api/v1/users
|
|
67
|
-
// src/api/admin/
|
|
72
|
+
// src/api/admin/helpers.ts -> /api/admin (discovered but may be skipped during processing)
|
|
68
73
|
const pathParts = relativePath.split('/');
|
|
69
74
|
pathParts.pop(); // Remove filename
|
|
70
75
|
|
|
@@ -36,7 +36,7 @@ export const downloadCommand = createSubcommand({
|
|
|
36
36
|
description: 'Download multiple files',
|
|
37
37
|
},
|
|
38
38
|
],
|
|
39
|
-
requires: { apiClient: true, auth: true },
|
|
39
|
+
requires: { apiClient: true, auth: true, region: true },
|
|
40
40
|
optional: { project: true },
|
|
41
41
|
prerequisites: ['cloud deploy'],
|
|
42
42
|
schema: {
|
|
@@ -51,7 +51,7 @@ export const downloadCommand = createSubcommand({
|
|
|
51
51
|
},
|
|
52
52
|
|
|
53
53
|
async handler(ctx) {
|
|
54
|
-
const { apiClient, args, opts, project, projectDir, config } = ctx;
|
|
54
|
+
const { apiClient, args, opts, project, projectDir, config, region } = ctx;
|
|
55
55
|
|
|
56
56
|
let identifier = opts?.identifier ?? project?.projectId;
|
|
57
57
|
|
|
@@ -59,7 +59,7 @@ export const downloadCommand = createSubcommand({
|
|
|
59
59
|
identifier = await tui.showProjectList(apiClient, true);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
const hostname = getIONHost(config);
|
|
62
|
+
const hostname = getIONHost(config, region);
|
|
63
63
|
const destination = args.destination ?? projectDir;
|
|
64
64
|
|
|
65
65
|
try {
|
|
@@ -39,7 +39,7 @@ export const uploadCommand = createSubcommand({
|
|
|
39
39
|
description: 'Upload multiple files',
|
|
40
40
|
},
|
|
41
41
|
],
|
|
42
|
-
requires: { apiClient: true, auth: true },
|
|
42
|
+
requires: { apiClient: true, auth: true, region: true },
|
|
43
43
|
schema: {
|
|
44
44
|
args,
|
|
45
45
|
options,
|
|
@@ -54,7 +54,7 @@ export const uploadCommand = createSubcommand({
|
|
|
54
54
|
prerequisites: ['cloud deploy'],
|
|
55
55
|
|
|
56
56
|
async handler(ctx) {
|
|
57
|
-
const { apiClient, args, opts, project, projectDir, config } = ctx;
|
|
57
|
+
const { apiClient, args, opts, project, projectDir, config, region } = ctx;
|
|
58
58
|
|
|
59
59
|
let identifier = opts?.identifier ?? project?.projectId;
|
|
60
60
|
|
|
@@ -62,7 +62,7 @@ export const uploadCommand = createSubcommand({
|
|
|
62
62
|
identifier = await tui.showProjectList(apiClient, true);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
const hostname = getIONHost(config);
|
|
65
|
+
const hostname = getIONHost(config, region);
|
|
66
66
|
const destination = args.destination ?? '.';
|
|
67
67
|
|
|
68
68
|
try {
|