@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.
Files changed (82) hide show
  1. package/README.md +190 -5
  2. package/dist/actions/db-ask.d.ts +16 -0
  3. package/dist/actions/db-ask.js +130 -0
  4. package/dist/actions/db-ask.js.map +1 -0
  5. package/dist/actions/db-explain.d.ts +16 -0
  6. package/dist/actions/db-explain.js +123 -0
  7. package/dist/actions/db-explain.js.map +1 -0
  8. package/dist/actions/db-migrate.d.ts +17 -0
  9. package/dist/actions/db-migrate.js +124 -0
  10. package/dist/actions/db-migrate.js.map +1 -0
  11. package/dist/actions/db-schema.d.ts +11 -0
  12. package/dist/actions/db-schema.js +38 -0
  13. package/dist/actions/db-schema.js.map +1 -0
  14. package/dist/actions/upgrade-deps.d.ts +18 -0
  15. package/dist/actions/upgrade-deps.js +227 -0
  16. package/dist/actions/upgrade-deps.js.map +1 -0
  17. package/dist/actions/upgrade-prisma.d.ts +16 -0
  18. package/dist/actions/upgrade-prisma.js +177 -0
  19. package/dist/actions/upgrade-prisma.js.map +1 -0
  20. package/dist/actions.d.ts +20 -0
  21. package/dist/actions.js +105 -36
  22. package/dist/actions.js.map +1 -1
  23. package/dist/agent.js +28 -9
  24. package/dist/agent.js.map +1 -1
  25. package/dist/cli.js +102 -0
  26. package/dist/cli.js.map +1 -1
  27. package/dist/config.d.ts +16 -0
  28. package/dist/config.js +39 -0
  29. package/dist/config.js.map +1 -1
  30. package/dist/db/client-usage.d.ts +19 -0
  31. package/dist/db/client-usage.js +107 -0
  32. package/dist/db/client-usage.js.map +1 -0
  33. package/dist/db/migrate.d.ts +26 -0
  34. package/dist/db/migrate.js +59 -0
  35. package/dist/db/migrate.js.map +1 -0
  36. package/dist/db/schema.d.ts +106 -0
  37. package/dist/db/schema.js +275 -0
  38. package/dist/db/schema.js.map +1 -0
  39. package/dist/db/summary.d.ts +12 -0
  40. package/dist/db/summary.js +133 -0
  41. package/dist/db/summary.js.map +1 -0
  42. package/dist/fs-helpers.d.ts +19 -0
  43. package/dist/fs-helpers.js +92 -0
  44. package/dist/fs-helpers.js.map +1 -0
  45. package/dist/parser.d.ts +11 -0
  46. package/dist/parser.js +102 -0
  47. package/dist/parser.js.map +1 -1
  48. package/dist/prompt-loader.d.ts +9 -0
  49. package/dist/prompt-loader.js +26 -0
  50. package/dist/prompt-loader.js.map +1 -0
  51. package/dist/prompts/db_ask.md +39 -0
  52. package/dist/prompts/db_explain.md +43 -0
  53. package/dist/prompts/db_migrate.md +48 -0
  54. package/dist/prompts/upgrade_deps.md +23 -0
  55. package/dist/prompts/upgrade_prisma.md +28 -0
  56. package/dist/provider.d.ts +9 -2
  57. package/dist/provider.js +12 -39
  58. package/dist/provider.js.map +1 -1
  59. package/dist/storage.d.ts +11 -0
  60. package/dist/storage.js +36 -4
  61. package/dist/storage.js.map +1 -1
  62. package/dist/tools.d.ts +26 -0
  63. package/dist/tools.js +256 -8
  64. package/dist/tools.js.map +1 -1
  65. package/dist/upgrade/changelog.d.ts +21 -0
  66. package/dist/upgrade/changelog.js +62 -0
  67. package/dist/upgrade/changelog.js.map +1 -0
  68. package/dist/upgrade/classifier.d.ts +25 -0
  69. package/dist/upgrade/classifier.js +78 -0
  70. package/dist/upgrade/classifier.js.map +1 -0
  71. package/dist/upgrade/outdated.d.ts +17 -0
  72. package/dist/upgrade/outdated.js +138 -0
  73. package/dist/upgrade/outdated.js.map +1 -0
  74. package/dist/upgrade/prisma-upgrade.d.ts +20 -0
  75. package/dist/upgrade/prisma-upgrade.js +66 -0
  76. package/dist/upgrade/prisma-upgrade.js.map +1 -0
  77. package/package.json +7 -4
  78. package/dist/prompts/prompts/ask.md +0 -20
  79. package/dist/prompts/prompts/explore.md +0 -38
  80. package/dist/prompts/prompts/patch.md +0 -27
  81. package/dist/prompts/prompts/plan.md +0 -41
  82. 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