@ariacode/cli 0.1.0 → 0.2.2
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/README.md +190 -5
- package/dist/actions/db-ask.d.ts +16 -0
- package/dist/actions/db-ask.js +130 -0
- package/dist/actions/db-ask.js.map +1 -0
- package/dist/actions/db-explain.d.ts +16 -0
- package/dist/actions/db-explain.js +123 -0
- package/dist/actions/db-explain.js.map +1 -0
- package/dist/actions/db-migrate.d.ts +17 -0
- package/dist/actions/db-migrate.js +124 -0
- package/dist/actions/db-migrate.js.map +1 -0
- package/dist/actions/db-schema.d.ts +11 -0
- package/dist/actions/db-schema.js +38 -0
- package/dist/actions/db-schema.js.map +1 -0
- package/dist/actions/upgrade-deps.d.ts +18 -0
- package/dist/actions/upgrade-deps.js +227 -0
- package/dist/actions/upgrade-deps.js.map +1 -0
- package/dist/actions/upgrade-prisma.d.ts +16 -0
- package/dist/actions/upgrade-prisma.js +177 -0
- package/dist/actions/upgrade-prisma.js.map +1 -0
- package/dist/actions.d.ts +20 -0
- package/dist/actions.js +105 -36
- package/dist/actions.js.map +1 -1
- package/dist/agent.js +28 -9
- package/dist/agent.js.map +1 -1
- package/dist/cli.js +102 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -1
- package/dist/db/client-usage.d.ts +19 -0
- package/dist/db/client-usage.js +107 -0
- package/dist/db/client-usage.js.map +1 -0
- package/dist/db/migrate.d.ts +26 -0
- package/dist/db/migrate.js +59 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema.d.ts +106 -0
- package/dist/db/schema.js +275 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/summary.d.ts +12 -0
- package/dist/db/summary.js +133 -0
- package/dist/db/summary.js.map +1 -0
- package/dist/fs-helpers.d.ts +19 -0
- package/dist/fs-helpers.js +92 -0
- package/dist/fs-helpers.js.map +1 -0
- package/dist/parser.d.ts +11 -0
- package/dist/parser.js +102 -0
- package/dist/parser.js.map +1 -1
- package/dist/prompt-loader.d.ts +9 -0
- package/dist/prompt-loader.js +26 -0
- package/dist/prompt-loader.js.map +1 -0
- package/dist/prompts/db_ask.md +39 -0
- package/dist/prompts/db_explain.md +43 -0
- package/dist/prompts/db_migrate.md +48 -0
- package/dist/prompts/upgrade_deps.md +23 -0
- package/dist/prompts/upgrade_prisma.md +28 -0
- package/dist/provider.d.ts +9 -2
- package/dist/provider.js +12 -39
- package/dist/provider.js.map +1 -1
- package/dist/storage.d.ts +11 -0
- package/dist/storage.js +36 -4
- package/dist/storage.js.map +1 -1
- package/dist/tools.d.ts +26 -0
- package/dist/tools.js +256 -8
- package/dist/tools.js.map +1 -1
- package/dist/upgrade/changelog.d.ts +21 -0
- package/dist/upgrade/changelog.js +62 -0
- package/dist/upgrade/changelog.js.map +1 -0
- package/dist/upgrade/classifier.d.ts +25 -0
- package/dist/upgrade/classifier.js +78 -0
- package/dist/upgrade/classifier.js.map +1 -0
- package/dist/upgrade/outdated.d.ts +17 -0
- package/dist/upgrade/outdated.js +138 -0
- package/dist/upgrade/outdated.js.map +1 -0
- package/dist/upgrade/prisma-upgrade.d.ts +20 -0
- package/dist/upgrade/prisma-upgrade.js +66 -0
- package/dist/upgrade/prisma-upgrade.js.map +1 -0
- package/package.json +7 -4
- package/dist/prompts/prompts/ask.md +0 -20
- package/dist/prompts/prompts/explore.md +0 -38
- package/dist/prompts/prompts/patch.md +0 -27
- package/dist/prompts/prompts/plan.md +0 -41
- package/dist/prompts/prompts/review.md +0 -33
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aria db migrate — propose changes to schema.prisma only.
|
|
3
|
+
* NEVER executes prisma migrate commands. User runs those manually.
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
import { getConfig } from '../config.js';
|
|
8
|
+
import { parsePrismaSchema, findSchemaPath } from '../db/schema.js';
|
|
9
|
+
import { manualMigrationInstructions } from '../db/migrate.js';
|
|
10
|
+
import { detectProjectType } from '../repo.js';
|
|
11
|
+
import { createProvider } from '../provider.js';
|
|
12
|
+
import { initializeDatabase, resolveOrCreateSession, updateSessionStatus, logMessage, logMutation } from '../storage.js';
|
|
13
|
+
import { validateFileSize } from '../safety.js';
|
|
14
|
+
import { readFileTool, searchCodeTool, readPrismaSchemaParserTool, findPrismaUsageTool, proposeSchemaChangeTool, applySchemaChangeTool, } from '../tools.js';
|
|
15
|
+
import { agentLoop, UserCancelledError } from '../agent.js';
|
|
16
|
+
import { initUI, info, error as uiError, yellow, green, bold, ConfirmCancelledError, } from '../ui.js';
|
|
17
|
+
import { loadPromptTemplate } from '../prompt-loader.js';
|
|
18
|
+
const DB_MIGRATE_TOOLS = [
|
|
19
|
+
readPrismaSchemaParserTool,
|
|
20
|
+
findPrismaUsageTool,
|
|
21
|
+
readFileTool,
|
|
22
|
+
searchCodeTool,
|
|
23
|
+
proposeSchemaChangeTool,
|
|
24
|
+
applySchemaChangeTool,
|
|
25
|
+
];
|
|
26
|
+
export async function runDbMigrate(options) {
|
|
27
|
+
const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
|
|
28
|
+
const config = getConfig(projectRoot, { quiet: options.quiet, provider: options.provider, model: options.model });
|
|
29
|
+
initUI(config.ui.color, config.ui.quiet || Boolean(options.quiet));
|
|
30
|
+
const schemaInfo = parsePrismaSchema(projectRoot);
|
|
31
|
+
if (!schemaInfo) {
|
|
32
|
+
uiError('No schema.prisma found. aria db migrate requires a Prisma project.');
|
|
33
|
+
process.exit(5);
|
|
34
|
+
}
|
|
35
|
+
const schemaAbsPath = findSchemaPath(projectRoot);
|
|
36
|
+
if (!schemaAbsPath) {
|
|
37
|
+
uiError('Schema file disappeared between checks. Please try again.');
|
|
38
|
+
process.exit(5);
|
|
39
|
+
}
|
|
40
|
+
// Validate schema file size before reading
|
|
41
|
+
validateFileSize(schemaAbsPath, config.safety.maxFileSizeKb);
|
|
42
|
+
const schemaContent = fs.readFileSync(schemaAbsPath, 'utf-8');
|
|
43
|
+
const project = detectProjectType(projectRoot);
|
|
44
|
+
const db = initializeDatabase();
|
|
45
|
+
const sessionId = resolveOrCreateSession(db, {
|
|
46
|
+
sessionId: options.session,
|
|
47
|
+
command: 'db migrate',
|
|
48
|
+
projectRoot,
|
|
49
|
+
provider: config.provider.default,
|
|
50
|
+
model: config.provider.model,
|
|
51
|
+
});
|
|
52
|
+
let provider;
|
|
53
|
+
try {
|
|
54
|
+
provider = createProvider(config.provider.default, config.provider);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
uiError(err instanceof Error ? err.message : String(err));
|
|
58
|
+
updateSessionStatus(db, sessionId, 'failed', String(err));
|
|
59
|
+
process.exit(4);
|
|
60
|
+
}
|
|
61
|
+
const ctx = {
|
|
62
|
+
projectRoot,
|
|
63
|
+
sessionId,
|
|
64
|
+
provider: config.provider.default,
|
|
65
|
+
model: config.provider.model,
|
|
66
|
+
mode: 'build',
|
|
67
|
+
dryRun: Boolean(options.dryRun),
|
|
68
|
+
assumeYes: Boolean(options.yes),
|
|
69
|
+
maxIterations: config.agent.maxIterations,
|
|
70
|
+
timeoutSeconds: config.agent.timeoutSeconds,
|
|
71
|
+
};
|
|
72
|
+
const systemPrompt = buildDbMigratePrompt({
|
|
73
|
+
projectType: project.type,
|
|
74
|
+
schemaPath: schemaInfo.path,
|
|
75
|
+
datasourceProvider: schemaInfo.datasourceProvider ?? 'unknown',
|
|
76
|
+
schemaContent,
|
|
77
|
+
});
|
|
78
|
+
logMessage(db, sessionId, 'system', systemPrompt);
|
|
79
|
+
if (options.dryRun) {
|
|
80
|
+
info(bold('Dry-run mode — schema.prisma will not be modified.'));
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
await agentLoop(ctx, options.description, DB_MIGRATE_TOOLS, provider, config, 'db migrate', db, systemPrompt);
|
|
84
|
+
if (!options.dryRun) {
|
|
85
|
+
// Log the mutation
|
|
86
|
+
logMutation(db, sessionId, {
|
|
87
|
+
action: 'db_migrate_schema',
|
|
88
|
+
affectedFiles: [schemaInfo.path],
|
|
89
|
+
riskLevel: 'high',
|
|
90
|
+
reversible: true,
|
|
91
|
+
rollbackHints: [`git checkout -- ${schemaInfo.path}`],
|
|
92
|
+
});
|
|
93
|
+
info('');
|
|
94
|
+
info(green(`✓ Schema updated: ${schemaInfo.path}`));
|
|
95
|
+
info(manualMigrationInstructions(project.packageManager ?? 'npx'));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
info('');
|
|
99
|
+
info(yellow('Dry-run complete — schema.prisma was not modified.'));
|
|
100
|
+
}
|
|
101
|
+
updateSessionStatus(db, sessionId, 'completed');
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
if (err instanceof UserCancelledError || err instanceof ConfirmCancelledError) {
|
|
105
|
+
info(yellow('Operation cancelled.'));
|
|
106
|
+
updateSessionStatus(db, sessionId, 'cancelled');
|
|
107
|
+
process.exit(130);
|
|
108
|
+
}
|
|
109
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
110
|
+
uiError(message);
|
|
111
|
+
updateSessionStatus(db, sessionId, 'failed', message);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function buildDbMigratePrompt(opts) {
|
|
116
|
+
const template = loadPromptTemplate('db_migrate', 'You are Aria Code\'s schema migration assistant. Current schema:\n\n{{schemaContent}}');
|
|
117
|
+
// Use function replacer for schemaContent to avoid $& / $1 injection from schema text
|
|
118
|
+
return template
|
|
119
|
+
.replace(/\{\{projectType\}\}/g, opts.projectType)
|
|
120
|
+
.replace(/\{\{schemaPath\}\}/g, opts.schemaPath)
|
|
121
|
+
.replace(/\{\{datasourceProvider\}\}/g, opts.datasourceProvider)
|
|
122
|
+
.replace(/\{\{schemaContent\}\}/g, () => opts.schemaContent);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=db-migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-migrate.js","sourceRoot":"","sources":["../../src/actions/db-migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aria db schema — parse and render schema.prisma content.
|
|
3
|
+
* No LLM call: pure parsing + rendering. Instant and free.
|
|
4
|
+
*/
|
|
5
|
+
export interface DbSchemaOptions {
|
|
6
|
+
json?: boolean;
|
|
7
|
+
prismaModel?: string;
|
|
8
|
+
quiet?: boolean;
|
|
9
|
+
projectRoot?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function runDbSchema(options: DbSchemaOptions): Promise<void>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aria db schema — parse and render schema.prisma content.
|
|
3
|
+
* No LLM call: pure parsing + rendering. Instant and free.
|
|
4
|
+
*/
|
|
5
|
+
import { parsePrismaSchema } from '../db/schema.js';
|
|
6
|
+
import { renderSchemaSummary, renderModelSummary } from '../db/summary.js';
|
|
7
|
+
import { initUI, info, error as uiError } from '../ui.js';
|
|
8
|
+
import { getConfig } from '../config.js';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
export async function runDbSchema(options) {
|
|
11
|
+
const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
|
|
12
|
+
const config = getConfig(projectRoot, { quiet: options.quiet });
|
|
13
|
+
initUI(config.ui.color, config.ui.quiet || Boolean(options.quiet));
|
|
14
|
+
const schemaInfo = parsePrismaSchema(projectRoot);
|
|
15
|
+
if (!schemaInfo) {
|
|
16
|
+
uiError('No schema.prisma found in project. Run `prisma init` to create one.');
|
|
17
|
+
process.exit(5);
|
|
18
|
+
}
|
|
19
|
+
// --json: output raw JSON
|
|
20
|
+
if (options.json) {
|
|
21
|
+
process.stdout.write(JSON.stringify(schemaInfo, null, 2) + '\n');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// --model <name>: filter to single model
|
|
25
|
+
if (options.prismaModel) {
|
|
26
|
+
const model = schemaInfo.models.find((m) => m.name.toLowerCase() === options.prismaModel.toLowerCase());
|
|
27
|
+
if (!model) {
|
|
28
|
+
uiError(`Model "${options.prismaModel}" not found in schema. Available: ${schemaInfo.models.map((m) => m.name).join(', ')}`);
|
|
29
|
+
process.exit(2);
|
|
30
|
+
}
|
|
31
|
+
const colorEnabled = config.ui.color !== 'never';
|
|
32
|
+
info(renderModelSummary(model, colorEnabled));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const colorEnabled = config.ui.color !== 'never';
|
|
36
|
+
info(renderSchemaSummary(schemaInfo, colorEnabled));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=db-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-schema.js","sourceRoot":"","sources":["../../src/actions/db-schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AASlC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAwB;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnE,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,qEAAqE,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,yCAAyC;IACzC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAY,CAAC,WAAW,EAAE,CACnE,CAAC;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,UAAU,OAAO,CAAC,WAAW,qCAAqC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC;QACjD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC;IACjD,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aria upgrade deps — analyze outdated dependencies, propose upgrades grouped by risk.
|
|
3
|
+
* Modifies package.json only. Never runs install commands.
|
|
4
|
+
*/
|
|
5
|
+
export interface UpgradeDepsOptions {
|
|
6
|
+
dryRun?: boolean;
|
|
7
|
+
yes?: boolean;
|
|
8
|
+
risk?: 'patch' | 'minor' | 'major' | 'all';
|
|
9
|
+
dev?: boolean;
|
|
10
|
+
session?: string;
|
|
11
|
+
quiet?: boolean;
|
|
12
|
+
projectRoot?: string;
|
|
13
|
+
/** Override provider (v0.2.2) */
|
|
14
|
+
provider?: string;
|
|
15
|
+
/** Override LLM model (v0.2.2) */
|
|
16
|
+
model?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function runUpgradeDeps(options: UpgradeDepsOptions): Promise<void>;
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aria upgrade deps — analyze outdated dependencies, propose upgrades grouped by risk.
|
|
3
|
+
* Modifies package.json only. Never runs install commands.
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { getConfig } from '../config.js';
|
|
7
|
+
import { detectProjectType } from '../repo.js';
|
|
8
|
+
import { createProvider } from '../provider.js';
|
|
9
|
+
import { initializeDatabase, resolveOrCreateSession, updateSessionStatus, logMessage, logMutation, } from '../storage.js';
|
|
10
|
+
import { initUI, info, success, warn, error as uiError, bold, dim, green, yellow, red, cyan, printTable, confirm, ConfirmCancelledError, createSpinner, } from '../ui.js';
|
|
11
|
+
import { getOutdatedPackages } from '../upgrade/outdated.js';
|
|
12
|
+
import { classifyAll, } from '../upgrade/classifier.js';
|
|
13
|
+
import { fetchChangelogInfo } from '../upgrade/changelog.js';
|
|
14
|
+
import { readJsonFile, writeFileAtomic } from '../fs-helpers.js';
|
|
15
|
+
import { loadPromptTemplate } from '../prompt-loader.js';
|
|
16
|
+
export async function runUpgradeDeps(options) {
|
|
17
|
+
const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
|
|
18
|
+
const config = getConfig(projectRoot, { quiet: options.quiet, provider: options.provider, model: options.model });
|
|
19
|
+
initUI(config.ui.color, config.ui.quiet || Boolean(options.quiet));
|
|
20
|
+
const project = detectProjectType(projectRoot);
|
|
21
|
+
const pm = project.packageManager ?? 'npm';
|
|
22
|
+
// 1. Fetch outdated packages
|
|
23
|
+
const spinner = createSpinner('Checking for outdated packages...');
|
|
24
|
+
spinner.start();
|
|
25
|
+
let outdated;
|
|
26
|
+
try {
|
|
27
|
+
outdated = await getOutdatedPackages(projectRoot, pm);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
spinner.fail('Failed to check outdated packages');
|
|
31
|
+
uiError(err instanceof Error ? err.message : String(err));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
if (outdated.length === 0) {
|
|
35
|
+
spinner.succeed('All dependencies up to date');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
spinner.succeed(`Found ${outdated.length} outdated package(s)`);
|
|
39
|
+
// 2. Classify by risk
|
|
40
|
+
const classified = classifyAll(outdated);
|
|
41
|
+
// 3. Filter by --risk flag (default: patch + minor)
|
|
42
|
+
const riskFilter = options.risk ?? 'minor';
|
|
43
|
+
const filtered = filterByRisk(classified, riskFilter);
|
|
44
|
+
if (filtered.length === 0) {
|
|
45
|
+
info(`No upgrades matching risk level "${riskFilter}". Use --risk all to see everything.`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// 4. Render upgrade preview table
|
|
49
|
+
renderUpgradeTable(filtered);
|
|
50
|
+
// 5. For major upgrades, use LLM to summarize breaking changes
|
|
51
|
+
const majors = filtered.filter((u) => u.risk === 'major');
|
|
52
|
+
if (majors.length > 0) {
|
|
53
|
+
await summarizeMajorUpgrades(majors, project.type, projectRoot, config);
|
|
54
|
+
}
|
|
55
|
+
// 6. Build MutationSummary
|
|
56
|
+
const highestRisk = getHighestRisk(filtered);
|
|
57
|
+
const summary = {
|
|
58
|
+
action: 'upgrade_deps',
|
|
59
|
+
affectedFiles: ['package.json'],
|
|
60
|
+
commandsToRun: [`${pm} install`],
|
|
61
|
+
migrations: [],
|
|
62
|
+
riskLevel: riskToLevel(highestRisk),
|
|
63
|
+
reversible: true,
|
|
64
|
+
rollbackHints: ['git checkout -- package.json', `${pm} install`],
|
|
65
|
+
};
|
|
66
|
+
info('');
|
|
67
|
+
info(dim(`Risk: ${summary.riskLevel} | Files: package.json | Reversible: yes`));
|
|
68
|
+
// 7. Handle dry-run / confirmation
|
|
69
|
+
if (options.dryRun) {
|
|
70
|
+
warn('Dry-run mode — package.json will not be modified.');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (!options.yes) {
|
|
74
|
+
const ok = await confirm(`Apply ${filtered.length} upgrade(s) to package.json?`);
|
|
75
|
+
if (!ok)
|
|
76
|
+
throw new ConfirmCancelledError();
|
|
77
|
+
}
|
|
78
|
+
// 8. Apply changes to package.json (atomic write)
|
|
79
|
+
applyUpgrades(projectRoot, filtered);
|
|
80
|
+
// 9. Log mutation (with session existence check)
|
|
81
|
+
const db = initializeDatabase();
|
|
82
|
+
const sessionId = resolveOrCreateSession(db, {
|
|
83
|
+
sessionId: options.session,
|
|
84
|
+
command: 'upgrade deps',
|
|
85
|
+
projectRoot,
|
|
86
|
+
provider: config.provider.default,
|
|
87
|
+
model: config.provider.model,
|
|
88
|
+
});
|
|
89
|
+
logMutation(db, sessionId, {
|
|
90
|
+
action: 'upgrade_deps',
|
|
91
|
+
affectedFiles: ['package.json'],
|
|
92
|
+
riskLevel: riskToLevel(highestRisk),
|
|
93
|
+
reversible: true,
|
|
94
|
+
rollbackHints: ['git checkout -- package.json', `${pm} install`],
|
|
95
|
+
});
|
|
96
|
+
updateSessionStatus(db, sessionId, 'completed');
|
|
97
|
+
// 10. Print next steps
|
|
98
|
+
info('');
|
|
99
|
+
success(`Updated package.json with ${filtered.length} dependency upgrade(s)`);
|
|
100
|
+
info('');
|
|
101
|
+
info('To install the new versions, run:');
|
|
102
|
+
info(` ${pm} install`);
|
|
103
|
+
info('');
|
|
104
|
+
info('Then verify:');
|
|
105
|
+
info(` ${pm} test`);
|
|
106
|
+
info(` ${pm} run build`);
|
|
107
|
+
}
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// Helpers
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
function filterByRisk(upgrades, risk) {
|
|
112
|
+
switch (risk) {
|
|
113
|
+
case 'patch':
|
|
114
|
+
return upgrades.filter((u) => u.risk === 'patch');
|
|
115
|
+
case 'minor':
|
|
116
|
+
return upgrades.filter((u) => u.risk === 'patch' || u.risk === 'minor');
|
|
117
|
+
case 'major':
|
|
118
|
+
case 'all':
|
|
119
|
+
return upgrades;
|
|
120
|
+
default:
|
|
121
|
+
return upgrades.filter((u) => u.risk === 'patch' || u.risk === 'minor');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function renderUpgradeTable(upgrades) {
|
|
125
|
+
const riskColor = (risk) => {
|
|
126
|
+
switch (risk) {
|
|
127
|
+
case 'patch':
|
|
128
|
+
return green(risk);
|
|
129
|
+
case 'minor':
|
|
130
|
+
return yellow(risk);
|
|
131
|
+
case 'major':
|
|
132
|
+
return red(risk);
|
|
133
|
+
case 'prerelease':
|
|
134
|
+
return cyan(risk);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
info('');
|
|
138
|
+
info(bold('Dependency Upgrades:'));
|
|
139
|
+
printTable({
|
|
140
|
+
head: ['Package', 'Current', 'Target', 'Risk', 'Type'],
|
|
141
|
+
colWidths: [30, 12, 12, 14, 18],
|
|
142
|
+
}, upgrades.map((u) => [u.name, u.current, u.target, riskColor(u.risk), u.type]));
|
|
143
|
+
}
|
|
144
|
+
function getHighestRisk(upgrades) {
|
|
145
|
+
if (upgrades.some((u) => u.risk === 'major'))
|
|
146
|
+
return 'major';
|
|
147
|
+
if (upgrades.some((u) => u.risk === 'minor'))
|
|
148
|
+
return 'minor';
|
|
149
|
+
if (upgrades.some((u) => u.risk === 'prerelease'))
|
|
150
|
+
return 'prerelease';
|
|
151
|
+
return 'patch';
|
|
152
|
+
}
|
|
153
|
+
function riskToLevel(risk) {
|
|
154
|
+
switch (risk) {
|
|
155
|
+
case 'major':
|
|
156
|
+
return 'high';
|
|
157
|
+
case 'minor':
|
|
158
|
+
case 'prerelease':
|
|
159
|
+
return 'medium';
|
|
160
|
+
case 'patch':
|
|
161
|
+
return 'low';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Modify package.json in-place (atomic write), updating version ranges for each upgrade.
|
|
166
|
+
*/
|
|
167
|
+
function applyUpgrades(projectRoot, upgrades) {
|
|
168
|
+
const pkgPath = path.join(projectRoot, 'package.json');
|
|
169
|
+
const pkg = readJsonFile(pkgPath);
|
|
170
|
+
for (const u of upgrades) {
|
|
171
|
+
const section = pkg[u.type];
|
|
172
|
+
if (section && section[u.name] !== undefined) {
|
|
173
|
+
const existing = section[u.name];
|
|
174
|
+
const prefix = existing.match(/^[\^~>=<]+/)?.[0] ?? '^';
|
|
175
|
+
section[u.name] = `${prefix}${u.target}`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
writeFileAtomic(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Use LLM to summarize breaking changes for major upgrades.
|
|
182
|
+
*/
|
|
183
|
+
async function summarizeMajorUpgrades(majors, projectType, projectRoot, config) {
|
|
184
|
+
const changelogInfos = await fetchChangelogInfo(majors.map((m) => ({ name: m.name, current: m.current, target: m.target })));
|
|
185
|
+
const majorSummary = majors
|
|
186
|
+
.map((m) => {
|
|
187
|
+
const cl = changelogInfos.find((c) => c.name === m.name);
|
|
188
|
+
const repoLine = cl?.releaseNotesUrl ? ` Release notes: ${cl.releaseNotesUrl}` : '';
|
|
189
|
+
return `- ${m.name}: ${m.current} → ${m.target}${repoLine}`;
|
|
190
|
+
})
|
|
191
|
+
.join('\n');
|
|
192
|
+
const template = loadPromptTemplate('upgrade_deps', 'Summarize breaking changes for:\n{{ major_upgrades }}');
|
|
193
|
+
const systemPrompt = template
|
|
194
|
+
.replace(/\{\{ major_upgrades \}\}/g, majorSummary)
|
|
195
|
+
.replace(/\{\{ project_type \}\}/g, projectType);
|
|
196
|
+
info('');
|
|
197
|
+
info(bold('Major upgrade analysis:'));
|
|
198
|
+
try {
|
|
199
|
+
const provider = createProvider(config.provider.default, config.provider);
|
|
200
|
+
const db = initializeDatabase();
|
|
201
|
+
const sessionId = resolveOrCreateSession(db, {
|
|
202
|
+
command: 'upgrade deps analysis',
|
|
203
|
+
projectRoot,
|
|
204
|
+
provider: config.provider.default,
|
|
205
|
+
model: config.provider.model,
|
|
206
|
+
});
|
|
207
|
+
logMessage(db, sessionId, 'system', systemPrompt);
|
|
208
|
+
// Use provider.chat directly instead of agentLoop with empty tools —
|
|
209
|
+
// no tools needed for changelog summarization, avoids wasted tokens.
|
|
210
|
+
const response = await provider.chat([
|
|
211
|
+
{ role: 'system', content: systemPrompt },
|
|
212
|
+
{
|
|
213
|
+
role: 'user',
|
|
214
|
+
content: `Analyze these major dependency upgrades and summarize breaking changes:\n${majorSummary}`,
|
|
215
|
+
},
|
|
216
|
+
], [], { model: config.provider.model, maxTokens: config.provider.maxTokens });
|
|
217
|
+
if (response.content) {
|
|
218
|
+
info(response.content);
|
|
219
|
+
}
|
|
220
|
+
logMessage(db, sessionId, 'assistant', response.content);
|
|
221
|
+
updateSessionStatus(db, sessionId, 'completed');
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
warn('Could not generate AI analysis for major upgrades. Proceeding without it.');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=upgrade-deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-deps.js","sourceRoot":"","sources":["../../src/actions/upgrade-deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aria upgrade prisma — Prisma-specific upgrade with migration guidance.
|
|
3
|
+
* Updates package.json only. Never runs install or migrate commands.
|
|
4
|
+
*/
|
|
5
|
+
export interface UpgradePrismaOptions {
|
|
6
|
+
dryRun?: boolean;
|
|
7
|
+
yes?: boolean;
|
|
8
|
+
session?: string;
|
|
9
|
+
quiet?: boolean;
|
|
10
|
+
projectRoot?: string;
|
|
11
|
+
/** Override provider (v0.2.2) */
|
|
12
|
+
provider?: string;
|
|
13
|
+
/** Override LLM model (v0.2.2) */
|
|
14
|
+
model?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function runUpgradePrisma(options: UpgradePrismaOptions): Promise<void>;
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aria upgrade prisma — Prisma-specific upgrade with migration guidance.
|
|
3
|
+
* Updates package.json only. Never runs install or migrate commands.
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { getConfig } from '../config.js';
|
|
7
|
+
import { detectProjectType } from '../repo.js';
|
|
8
|
+
import { parsePrismaSchema } from '../db/schema.js';
|
|
9
|
+
import { createProvider } from '../provider.js';
|
|
10
|
+
import { initializeDatabase, resolveOrCreateSession, updateSessionStatus, logMessage, logMutation, } from '../storage.js';
|
|
11
|
+
import { initUI, info, success, warn, error as uiError, bold, dim, confirm, ConfirmCancelledError, createSpinner, } from '../ui.js';
|
|
12
|
+
import { getPrismaVersionInfo } from '../upgrade/prisma-upgrade.js';
|
|
13
|
+
import { readJsonFile, writeFileAtomic } from '../fs-helpers.js';
|
|
14
|
+
import { loadPromptTemplate } from '../prompt-loader.js';
|
|
15
|
+
export async function runUpgradePrisma(options) {
|
|
16
|
+
const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
|
|
17
|
+
const config = getConfig(projectRoot, { quiet: options.quiet, provider: options.provider, model: options.model });
|
|
18
|
+
initUI(config.ui.color, config.ui.quiet || Boolean(options.quiet));
|
|
19
|
+
const project = detectProjectType(projectRoot);
|
|
20
|
+
const pm = project.packageManager ?? 'npm';
|
|
21
|
+
// 1. Check if project has Prisma
|
|
22
|
+
const versionInfo = await getPrismaVersionInfo(projectRoot);
|
|
23
|
+
if (!versionInfo.hasPrisma) {
|
|
24
|
+
uiError('Prisma not detected in this project');
|
|
25
|
+
process.exit(5);
|
|
26
|
+
}
|
|
27
|
+
const current = versionInfo.currentPrisma || versionInfo.currentClient;
|
|
28
|
+
if (!current) {
|
|
29
|
+
uiError('Could not determine current Prisma version from package.json');
|
|
30
|
+
process.exit(5);
|
|
31
|
+
}
|
|
32
|
+
// 2. Fetch latest version
|
|
33
|
+
const spinner = createSpinner('Checking latest Prisma version...');
|
|
34
|
+
spinner.start();
|
|
35
|
+
if (!versionInfo.latestVersion) {
|
|
36
|
+
spinner.fail('Could not fetch latest Prisma version');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
if (current === versionInfo.latestVersion) {
|
|
40
|
+
spinner.succeed(`Prisma is up to date (${current})`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
spinner.succeed(`Prisma upgrade available: ${current} → ${versionInfo.latestVersion} (${versionInfo.risk})`);
|
|
44
|
+
// 3. For major upgrades, use LLM for migration guidance
|
|
45
|
+
const affectedFiles = ['package.json'];
|
|
46
|
+
if (versionInfo.risk === 'major' && project.prismaSchemaPath) {
|
|
47
|
+
affectedFiles.push(project.prismaSchemaPath);
|
|
48
|
+
await generateMigrationGuidance(current, versionInfo.latestVersion, projectRoot, config);
|
|
49
|
+
}
|
|
50
|
+
// 4. Show risk info
|
|
51
|
+
info('');
|
|
52
|
+
info(dim(`Risk: high | Files: ${affectedFiles.join(', ')} | Reversible: yes`));
|
|
53
|
+
// 5. Handle dry-run / confirmation
|
|
54
|
+
if (options.dryRun) {
|
|
55
|
+
warn('Dry-run mode — package.json will not be modified.');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (!options.yes) {
|
|
59
|
+
const ok = await confirm('Apply Prisma upgrade to package.json?');
|
|
60
|
+
if (!ok)
|
|
61
|
+
throw new ConfirmCancelledError();
|
|
62
|
+
}
|
|
63
|
+
// 6. Update package.json (atomic write)
|
|
64
|
+
applyPrismaUpgrade(projectRoot, versionInfo.latestVersion);
|
|
65
|
+
// 7. Log mutation (with session existence check)
|
|
66
|
+
const db = initializeDatabase();
|
|
67
|
+
const sessionId = resolveOrCreateSession(db, {
|
|
68
|
+
sessionId: options.session,
|
|
69
|
+
command: 'upgrade prisma',
|
|
70
|
+
projectRoot,
|
|
71
|
+
provider: config.provider.default,
|
|
72
|
+
model: config.provider.model,
|
|
73
|
+
});
|
|
74
|
+
logMutation(db, sessionId, {
|
|
75
|
+
action: 'upgrade_prisma',
|
|
76
|
+
affectedFiles,
|
|
77
|
+
riskLevel: 'high',
|
|
78
|
+
reversible: true,
|
|
79
|
+
rollbackHints: ['git checkout -- package.json', `${pm} install`],
|
|
80
|
+
});
|
|
81
|
+
updateSessionStatus(db, sessionId, 'completed');
|
|
82
|
+
// 8. Print next steps
|
|
83
|
+
const prismaCmd = pm === 'npm' ? 'npx' : pm;
|
|
84
|
+
const releaseUrl = `https://github.com/prisma/prisma/releases/tag/${versionInfo.latestVersion}`;
|
|
85
|
+
info('');
|
|
86
|
+
success('Updated Prisma versions in package.json:');
|
|
87
|
+
if (versionInfo.currentPrisma) {
|
|
88
|
+
info(` prisma: ${versionInfo.currentPrisma} → ${versionInfo.latestVersion}`);
|
|
89
|
+
}
|
|
90
|
+
if (versionInfo.currentClient) {
|
|
91
|
+
info(` @prisma/client: ${versionInfo.currentClient} → ${versionInfo.latestVersion}`);
|
|
92
|
+
}
|
|
93
|
+
info('');
|
|
94
|
+
info('Next steps (run in order):');
|
|
95
|
+
info('');
|
|
96
|
+
info('1. Install updated dependencies:');
|
|
97
|
+
info(` ${pm} install`);
|
|
98
|
+
info('');
|
|
99
|
+
info('2. Regenerate Prisma Client:');
|
|
100
|
+
info(` ${prismaCmd} prisma generate`);
|
|
101
|
+
info('');
|
|
102
|
+
info('3. Review breaking changes:');
|
|
103
|
+
info(` ${releaseUrl}`);
|
|
104
|
+
info('');
|
|
105
|
+
info('4. Run your test suite:');
|
|
106
|
+
info(` ${pm} test`);
|
|
107
|
+
info('');
|
|
108
|
+
info('Aria has updated package.json only.');
|
|
109
|
+
info('Migration commands must be run manually.');
|
|
110
|
+
}
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// Helpers
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
/**
|
|
115
|
+
* Update prisma and @prisma/client versions in package.json (atomic write).
|
|
116
|
+
*/
|
|
117
|
+
function applyPrismaUpgrade(projectRoot, targetVersion) {
|
|
118
|
+
const pkgPath = path.join(projectRoot, 'package.json');
|
|
119
|
+
const pkg = readJsonFile(pkgPath);
|
|
120
|
+
const updateSection = (section, name) => {
|
|
121
|
+
if (!section || section[name] === undefined)
|
|
122
|
+
return;
|
|
123
|
+
const existing = section[name];
|
|
124
|
+
const prefix = existing.match(/^[\^~>=<]+/)?.[0] ?? '^';
|
|
125
|
+
section[name] = `${prefix}${targetVersion}`;
|
|
126
|
+
};
|
|
127
|
+
updateSection(pkg.dependencies, 'prisma');
|
|
128
|
+
updateSection(pkg.dependencies, '@prisma/client');
|
|
129
|
+
updateSection(pkg.devDependencies, 'prisma');
|
|
130
|
+
updateSection(pkg.devDependencies, '@prisma/client');
|
|
131
|
+
writeFileAtomic(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Use LLM to generate Prisma-specific migration guidance for major upgrades.
|
|
135
|
+
* Uses provider.chat directly — no tools needed for analysis.
|
|
136
|
+
*/
|
|
137
|
+
async function generateMigrationGuidance(currentVersion, targetVersion, projectRoot, config) {
|
|
138
|
+
const schemaInfo = parsePrismaSchema(projectRoot);
|
|
139
|
+
const schemaSummary = schemaInfo
|
|
140
|
+
? `Models: ${schemaInfo.models.map((m) => m.name).join(', ')}\nProvider: ${schemaInfo.datasourceProvider ?? 'unknown'}`
|
|
141
|
+
: 'No schema.prisma found';
|
|
142
|
+
const template = loadPromptTemplate('upgrade_prisma', 'Analyze Prisma upgrade from {{ current_version }} to {{ target_version }}.\nSchema: {{ schema_summary }}');
|
|
143
|
+
const systemPrompt = template
|
|
144
|
+
.replace(/\{\{ current_version \}\}/g, currentVersion)
|
|
145
|
+
.replace(/\{\{ target_version \}\}/g, targetVersion)
|
|
146
|
+
.replace(/\{\{ schema_summary \}\}/g, schemaSummary);
|
|
147
|
+
info('');
|
|
148
|
+
info(bold('Prisma upgrade analysis:'));
|
|
149
|
+
try {
|
|
150
|
+
const provider = createProvider(config.provider.default, config.provider);
|
|
151
|
+
const db = initializeDatabase();
|
|
152
|
+
const sessionId = resolveOrCreateSession(db, {
|
|
153
|
+
command: 'upgrade prisma analysis',
|
|
154
|
+
projectRoot,
|
|
155
|
+
provider: config.provider.default,
|
|
156
|
+
model: config.provider.model,
|
|
157
|
+
});
|
|
158
|
+
logMessage(db, sessionId, 'system', systemPrompt);
|
|
159
|
+
// Use provider.chat directly instead of agentLoop with empty tools
|
|
160
|
+
const response = await provider.chat([
|
|
161
|
+
{ role: 'system', content: systemPrompt },
|
|
162
|
+
{
|
|
163
|
+
role: 'user',
|
|
164
|
+
content: `Analyze the Prisma upgrade from ${currentVersion} to ${targetVersion} and provide migration guidance.`,
|
|
165
|
+
},
|
|
166
|
+
], [], { model: config.provider.model, maxTokens: config.provider.maxTokens });
|
|
167
|
+
if (response.content) {
|
|
168
|
+
info(response.content);
|
|
169
|
+
}
|
|
170
|
+
logMessage(db, sessionId, 'assistant', response.content);
|
|
171
|
+
updateSessionStatus(db, sessionId, 'completed');
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
warn('Could not generate AI analysis for Prisma upgrade. Proceeding without it.');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=upgrade-prisma.js.map
|