@agentuity/migrate 2.0.11 → 3.0.0-alpha.1
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/migrate.ts +93 -10
- package/dist/detect-v3.d.ts +92 -0
- package/dist/detect-v3.d.ts.map +1 -0
- package/dist/detect-v3.js +675 -0
- package/dist/detect-v3.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/migrate-v3.d.ts +38 -0
- package/dist/migrate-v3.d.ts.map +1 -0
- package/dist/migrate-v3.js +448 -0
- package/dist/migrate-v3.js.map +1 -0
- package/dist/report.d.ts +3 -0
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +64 -0
- package/dist/report.js.map +1 -1
- package/dist/transforms/v3/agents.d.ts +33 -0
- package/dist/transforms/v3/agents.d.ts.map +1 -0
- package/dist/transforms/v3/agents.js +335 -0
- package/dist/transforms/v3/agents.js.map +1 -0
- package/dist/transforms/v3/dev-setup.d.ts +27 -0
- package/dist/transforms/v3/dev-setup.d.ts.map +1 -0
- package/dist/transforms/v3/dev-setup.js +103 -0
- package/dist/transforms/v3/dev-setup.js.map +1 -0
- package/dist/transforms/v3/entry-point.d.ts +23 -0
- package/dist/transforms/v3/entry-point.d.ts.map +1 -0
- package/dist/transforms/v3/entry-point.js +67 -0
- package/dist/transforms/v3/entry-point.js.map +1 -0
- package/dist/transforms/v3/package-json.d.ts +28 -0
- package/dist/transforms/v3/package-json.d.ts.map +1 -0
- package/dist/transforms/v3/package-json.js +151 -0
- package/dist/transforms/v3/package-json.js.map +1 -0
- package/dist/transforms/v3/routes.d.ts +37 -0
- package/dist/transforms/v3/routes.d.ts.map +1 -0
- package/dist/transforms/v3/routes.js +146 -0
- package/dist/transforms/v3/routes.js.map +1 -0
- package/dist/transforms/v3/services.d.ts +19 -0
- package/dist/transforms/v3/services.d.ts.map +1 -0
- package/dist/transforms/v3/services.js +61 -0
- package/dist/transforms/v3/services.js.map +1 -0
- package/package.json +10 -5
- package/src/detect-v3.ts +867 -0
- package/src/index.ts +13 -0
- package/src/migrate-v3.ts +539 -0
- package/src/report.ts +86 -0
- package/src/transforms/v3/agents.ts +434 -0
- package/src/transforms/v3/dev-setup.ts +137 -0
- package/src/transforms/v3/entry-point.ts +90 -0
- package/src/transforms/v3/package-json.ts +183 -0
- package/src/transforms/v3/routes.ts +185 -0
- package/src/transforms/v3/services.ts +76 -0
package/bin/migrate.ts
CHANGED
|
@@ -9,14 +9,18 @@
|
|
|
9
9
|
* Options:
|
|
10
10
|
* --yes, -y Skip interactive confirmation prompts
|
|
11
11
|
* --dry-run Print migration report without modifying any files
|
|
12
|
+
* --v1-to-v2 Force v1 → v2 migration mode
|
|
13
|
+
* --v2-to-v3 Force v2 → v3 migration mode
|
|
12
14
|
* --help, -h Show this help message
|
|
13
15
|
*/
|
|
14
16
|
|
|
17
|
+
export {};
|
|
18
|
+
|
|
15
19
|
const args = process.argv.slice(2);
|
|
16
20
|
|
|
17
21
|
if (args.includes('--help') || args.includes('-h')) {
|
|
18
22
|
console.log(`
|
|
19
|
-
${'\x1b[1m'}@agentuity/migrate${'\x1b[0m'} — Migrate
|
|
23
|
+
${'\x1b[1m'}@agentuity/migrate${'\x1b[0m'} — Migrate Agentuity SDK projects
|
|
20
24
|
|
|
21
25
|
${'\x1b[2m'}Usage:${'\x1b[0m'}
|
|
22
26
|
npx @agentuity/migrate [project-dir] [options]
|
|
@@ -27,17 +31,29 @@ if (args.includes('--help') || args.includes('-h')) {
|
|
|
27
31
|
${'\x1b[2m'}Options:${'\x1b[0m'}
|
|
28
32
|
--yes, -y Skip interactive confirmation prompts
|
|
29
33
|
--dry-run Print the migration report without modifying any files
|
|
34
|
+
--v1-to-v2 Force v1 → v2 migration mode
|
|
35
|
+
--v2-to-v3 Force v2 → v3 migration mode
|
|
30
36
|
--help, -h Show this help message
|
|
31
37
|
|
|
32
|
-
${'\x1b[2m'}
|
|
33
|
-
|
|
34
|
-
•
|
|
35
|
-
•
|
|
38
|
+
${'\x1b[2m'}Auto-detection:${'\x1b[0m'}
|
|
39
|
+
The tool reads package.json and picks the right migration automatically:
|
|
40
|
+
• @agentuity/runtime ^1.x → runs v1 → v2 migration
|
|
41
|
+
• @agentuity/runtime ^2.x → runs v2 → v3 migration
|
|
42
|
+
• Use --v1-to-v2 or --v2-to-v3 to override detection
|
|
43
|
+
|
|
44
|
+
${'\x1b[2m'}v1 → v2 migration:${'\x1b[0m'}
|
|
36
45
|
• Rewrites route files to chained new Hono<Env>() style
|
|
37
46
|
• Generates src/api/index.ts and src/agent/index.ts barrel files
|
|
38
47
|
• Removes src/generated/ directory
|
|
39
|
-
•
|
|
40
|
-
|
|
48
|
+
• Updates @agentuity/* packages to ^2.0.0
|
|
49
|
+
|
|
50
|
+
${'\x1b[2m'}v2 → v3 migration:${'\x1b[0m'}
|
|
51
|
+
• Replaces createApp() with plain Hono app + @agentuity/hono middleware
|
|
52
|
+
• Converts simple agents to plain exported functions
|
|
53
|
+
• Generates src/services.ts with singleton service clients
|
|
54
|
+
• Rewrites c.var.*/ctx.* service access to direct imports
|
|
55
|
+
• Moves entry point from app.ts → src/index.ts
|
|
56
|
+
• Removes @agentuity/runtime, adds hono + service packages
|
|
41
57
|
|
|
42
58
|
${'\x1b[2m'}Safety:${'\x1b[0m'}
|
|
43
59
|
The tool checks that your git worktree is clean before making any changes,
|
|
@@ -49,12 +65,79 @@ if (args.includes('--help') || args.includes('-h')) {
|
|
|
49
65
|
// Parse flags
|
|
50
66
|
const yes = args.includes('--yes') || args.includes('-y');
|
|
51
67
|
const dryRun = args.includes('--dry-run');
|
|
68
|
+
const forceV1toV2 = args.includes('--v1-to-v2');
|
|
69
|
+
const forceV2toV3 = args.includes('--v2-to-v3');
|
|
52
70
|
|
|
53
71
|
// First non-flag argument is the project dir
|
|
54
72
|
const projectDir = args.find((a) => !a.startsWith('-')) ?? process.cwd();
|
|
55
73
|
|
|
56
|
-
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// Auto-detect migration mode from package.json
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
|
|
78
|
+
async function detectMigrationMode(dir: string): Promise<'v1-to-v2' | 'v2-to-v3' | null> {
|
|
79
|
+
try {
|
|
80
|
+
const pkgPath = `${dir}/package.json`;
|
|
81
|
+
const file = Bun.file(pkgPath);
|
|
82
|
+
if (!(await file.exists())) return null;
|
|
83
|
+
|
|
84
|
+
const pkg = JSON.parse(await file.text());
|
|
85
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
86
|
+
const runtimeVersion = deps['@agentuity/runtime'];
|
|
87
|
+
|
|
88
|
+
if (!runtimeVersion) return null;
|
|
89
|
+
|
|
90
|
+
// ^1.x or 1.x → v1 to v2
|
|
91
|
+
if (/^[~^]?1\./.test(runtimeVersion) || runtimeVersion === '1') {
|
|
92
|
+
return 'v1-to-v2';
|
|
93
|
+
}
|
|
57
94
|
|
|
58
|
-
|
|
95
|
+
// ^2.x or 2.x or latest or * or workspace:* → v2 to v3
|
|
96
|
+
if (
|
|
97
|
+
/^[~^]?2\./.test(runtimeVersion) ||
|
|
98
|
+
runtimeVersion === 'latest' ||
|
|
99
|
+
runtimeVersion === '*' ||
|
|
100
|
+
runtimeVersion.startsWith('workspace:')
|
|
101
|
+
) {
|
|
102
|
+
return 'v2-to-v3';
|
|
103
|
+
}
|
|
59
104
|
|
|
60
|
-
|
|
105
|
+
return null;
|
|
106
|
+
} catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Determine which migration to run
|
|
112
|
+
let mode: 'v1-to-v2' | 'v2-to-v3';
|
|
113
|
+
|
|
114
|
+
if (forceV1toV2) {
|
|
115
|
+
mode = 'v1-to-v2';
|
|
116
|
+
} else if (forceV2toV3) {
|
|
117
|
+
mode = 'v2-to-v3';
|
|
118
|
+
} else {
|
|
119
|
+
const detected = await detectMigrationMode(projectDir);
|
|
120
|
+
if (!detected) {
|
|
121
|
+
console.error(
|
|
122
|
+
'\n \x1b[31m✗\x1b[0m Could not detect migration mode.\n\n' +
|
|
123
|
+
' No @agentuity/runtime found in package.json, or version is not\n' +
|
|
124
|
+
' recognized as v1.x or v2.x.\n\n' +
|
|
125
|
+
' Use --v1-to-v2 or --v2-to-v3 to specify the migration explicitly.\n'
|
|
126
|
+
);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
mode = detected;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Run the appropriate migration
|
|
133
|
+
if (mode === 'v1-to-v2') {
|
|
134
|
+
console.log('\n \x1b[36mℹ\x1b[0m Detected v1 project — running v1 → v2 migration\n');
|
|
135
|
+
const { migrate } = await import('../src/migrate');
|
|
136
|
+
const result = await migrate({ projectDir, yes, dryRun });
|
|
137
|
+
process.exit(result.ok ? 0 : 1);
|
|
138
|
+
} else {
|
|
139
|
+
console.log('\n \x1b[36mℹ\x1b[0m Detected v2 project — running v2 → v3 migration\n');
|
|
140
|
+
const { migrateV3 } = await import('../src/migrate-v3');
|
|
141
|
+
const result = await migrateV3({ projectDir, yes, dryRun });
|
|
142
|
+
process.exit(result.ok ? 0 : 1);
|
|
143
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V2 → V3 pattern detection.
|
|
3
|
+
*
|
|
4
|
+
* Analyses a project directory and returns a structured report of every v2
|
|
5
|
+
* artefact that needs to be migrated to v3 (framework-agnostic Hono).
|
|
6
|
+
* No files are modified here.
|
|
7
|
+
*/
|
|
8
|
+
export type Severity = 'auto' | 'guided' | 'manual';
|
|
9
|
+
export interface V3Finding {
|
|
10
|
+
id: string;
|
|
11
|
+
severity: Severity;
|
|
12
|
+
message: string;
|
|
13
|
+
file?: string;
|
|
14
|
+
hint?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Classification of agent complexity */
|
|
17
|
+
export type AgentComplexity = 'simple' | 'complex';
|
|
18
|
+
/** Detected agent file */
|
|
19
|
+
export interface AgentFile {
|
|
20
|
+
/** Absolute path */
|
|
21
|
+
path: string;
|
|
22
|
+
/** Relative path from project root */
|
|
23
|
+
relativePath: string;
|
|
24
|
+
/** Agent name passed to createAgent() */
|
|
25
|
+
name: string;
|
|
26
|
+
/** Whether the agent is simple (handler+schema only) or complex */
|
|
27
|
+
complexity: AgentComplexity;
|
|
28
|
+
/** Reason for complexity classification (if complex) */
|
|
29
|
+
complexityReason?: string;
|
|
30
|
+
/** Whether the agent uses schema validation */
|
|
31
|
+
hasSchema: boolean;
|
|
32
|
+
/** Services accessed via ctx.* */
|
|
33
|
+
ctxServices: string[];
|
|
34
|
+
}
|
|
35
|
+
/** Detected service usage in a file */
|
|
36
|
+
export interface ServiceUsage {
|
|
37
|
+
/** Absolute path */
|
|
38
|
+
path: string;
|
|
39
|
+
/** Relative path from project root */
|
|
40
|
+
relativePath: string;
|
|
41
|
+
/** Services used: 'kv' | 'vector' | 'stream' | 'queue' | 'email' | 'task' | 'schedule' | 'sandbox' | 'logger' */
|
|
42
|
+
services: string[];
|
|
43
|
+
/** Access pattern: 'ctx' (agent context) | 'c.var' (Hono context) */
|
|
44
|
+
accessPattern: 'ctx' | 'c.var';
|
|
45
|
+
}
|
|
46
|
+
/** Outdated package that needs version update */
|
|
47
|
+
export interface V3OutdatedPackage {
|
|
48
|
+
name: string;
|
|
49
|
+
currentVersion: string;
|
|
50
|
+
section: 'dependencies' | 'devDependencies';
|
|
51
|
+
}
|
|
52
|
+
export interface V3DetectionResult {
|
|
53
|
+
projectDir: string;
|
|
54
|
+
findings: V3Finding[];
|
|
55
|
+
/** Whether the project has @agentuity/runtime in package.json */
|
|
56
|
+
hasRuntimeDep: boolean;
|
|
57
|
+
/** Version of @agentuity/runtime if found */
|
|
58
|
+
runtimeVersion?: string;
|
|
59
|
+
/** Absolute path to app.ts, if found */
|
|
60
|
+
appTsPath?: string;
|
|
61
|
+
/** Whether app.ts uses createApp from @agentuity/runtime */
|
|
62
|
+
hasCreateApp: boolean;
|
|
63
|
+
/** Properties passed to createApp() */
|
|
64
|
+
createAppProps: string[];
|
|
65
|
+
/** Detected agent files */
|
|
66
|
+
agentFiles: AgentFile[];
|
|
67
|
+
/** Whether src/agent/index.ts barrel exists */
|
|
68
|
+
hasAgentBarrel: boolean;
|
|
69
|
+
/** Service usage across all scanned files */
|
|
70
|
+
serviceUsages: ServiceUsage[];
|
|
71
|
+
/** Deduplicated set of all services used anywhere */
|
|
72
|
+
allServicesUsed: string[];
|
|
73
|
+
/** Whether src/web/ exists (SPA) */
|
|
74
|
+
hasFrontend: boolean;
|
|
75
|
+
/** Whether agentuity.config.ts exists */
|
|
76
|
+
hasAgentuityConfig: boolean;
|
|
77
|
+
/** Whether vite.config.ts exists */
|
|
78
|
+
hasViteConfig: boolean;
|
|
79
|
+
/** @agentuity/* packages that need version upgrade */
|
|
80
|
+
outdatedPackages: V3OutdatedPackage[];
|
|
81
|
+
/** Whether @agentuity/react is used */
|
|
82
|
+
hasReactPackage: boolean;
|
|
83
|
+
/** Whether @agentuity/frontend is used */
|
|
84
|
+
hasFrontendPackage: boolean;
|
|
85
|
+
}
|
|
86
|
+
/** Map from service name to package */
|
|
87
|
+
export declare const SERVICE_PACKAGE_MAP: Record<string, {
|
|
88
|
+
pkg: string;
|
|
89
|
+
client: string;
|
|
90
|
+
}>;
|
|
91
|
+
export declare function detectV3(projectDir: string): Promise<V3DetectionResult>;
|
|
92
|
+
//# sourceMappingURL=detect-v3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-v3.d.ts","sourceRoot":"","sources":["../src/detect-v3.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEpD,MAAM,WAAW,SAAS;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,yCAAyC;AACzC,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEnD,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACzB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,UAAU,EAAE,eAAe,CAAC;IAC5B,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,WAAW,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC5B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,iHAAiH;IACjH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,qEAAqE;IACrE,aAAa,EAAE,KAAK,GAAG,OAAO,CAAC;CAC/B;AAED,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,cAAc,GAAG,iBAAiB,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAiB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,EAAE,CAAC;IAEtB,iEAAiE;IACjE,aAAa,EAAE,OAAO,CAAC;IACvB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,YAAY,EAAE,OAAO,CAAC;IACtB,uCAAuC;IACvC,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB,2BAA2B;IAC3B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,+CAA+C;IAC/C,cAAc,EAAE,OAAO,CAAC;IAExB,6CAA6C;IAC7C,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,qDAAqD;IACrD,eAAe,EAAE,MAAM,EAAE,CAAC;IAE1B,oCAAoC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,yCAAyC;IACzC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oCAAoC;IACpC,aAAa,EAAE,OAAO,CAAC;IAEvB,sDAAsD;IACtD,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IAEtC,uCAAuC;IACvC,eAAe,EAAE,OAAO,CAAC;IACzB,0CAA0C;IAC1C,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAoBD,uCAAuC;AACvC,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAS/E,CAAC;AA0UF,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgZ7E"}
|