@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,275 @@
1
+ /**
2
+ * Prisma schema parser — wraps @mrleebo/prisma-ast to provide a clean typed interface.
3
+ * Schema-aware only: no database connections, no DATABASE_URL parsing.
4
+ */
5
+ import { z } from 'zod';
6
+ import { getSchema } from '@mrleebo/prisma-ast';
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ // ---------------------------------------------------------------------------
10
+ // Zod schemas & types
11
+ // ---------------------------------------------------------------------------
12
+ export const PrismaFieldSchema = z.object({
13
+ name: z.string(),
14
+ type: z.string(),
15
+ isList: z.boolean(),
16
+ isOptional: z.boolean(),
17
+ isId: z.boolean(),
18
+ isUnique: z.boolean(),
19
+ isRelation: z.boolean(),
20
+ relationName: z.string().nullable(),
21
+ relationFields: z.array(z.string()).default([]),
22
+ relationReferences: z.array(z.string()).default([]),
23
+ defaultValue: z.string().nullable(),
24
+ attributes: z.array(z.string()).default([]),
25
+ });
26
+ export const PrismaModelSchema = z.object({
27
+ name: z.string(),
28
+ fields: z.array(PrismaFieldSchema),
29
+ indexes: z
30
+ .array(z.object({
31
+ fields: z.array(z.string()),
32
+ type: z.enum(['index', 'unique', 'fulltext']),
33
+ name: z.string().nullable(),
34
+ }))
35
+ .default([]),
36
+ documentation: z.string().nullable(),
37
+ });
38
+ export const PrismaEnumSchema = z.object({
39
+ name: z.string(),
40
+ values: z.array(z.string()),
41
+ documentation: z.string().nullable(),
42
+ });
43
+ export const PrismaSchemaInfoSchema = z.object({
44
+ path: z.string(),
45
+ datasourceProvider: z.string().nullable(),
46
+ models: z.array(PrismaModelSchema),
47
+ enums: z.array(PrismaEnumSchema),
48
+ generators: z
49
+ .array(z.object({
50
+ name: z.string(),
51
+ provider: z.string(),
52
+ }))
53
+ .default([]),
54
+ });
55
+ // ---------------------------------------------------------------------------
56
+ // Schema path resolution
57
+ // ---------------------------------------------------------------------------
58
+ export function findSchemaPath(projectRoot) {
59
+ const resolvedRoot = path.resolve(projectRoot);
60
+ const candidates = [
61
+ path.join(resolvedRoot, 'prisma', 'schema.prisma'),
62
+ path.join(resolvedRoot, 'schema.prisma'),
63
+ ];
64
+ // Verify candidates are within project root (defense in depth)
65
+ return candidates.find((p) => p.startsWith(resolvedRoot) && fs.existsSync(p)) ?? null;
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // AST extraction helpers
69
+ // ---------------------------------------------------------------------------
70
+ function extractDatasourceProvider(ast) {
71
+ const ds = ast.list.find((n) => n.type === 'datasource');
72
+ if (!ds)
73
+ return null;
74
+ const providerAssignment = ds.assignments?.find((a) => a.key === 'provider');
75
+ if (!providerAssignment)
76
+ return null;
77
+ const raw = providerAssignment.value;
78
+ if (typeof raw === 'string')
79
+ return raw.replace(/^"|"$/g, '');
80
+ return null;
81
+ }
82
+ function extractGenerators(ast) {
83
+ return ast.list
84
+ .filter((n) => n.type === 'generator')
85
+ .map((gen) => {
86
+ const providerAssignment = gen.assignments?.find((a) => a.key === 'provider');
87
+ const raw = providerAssignment?.value ?? '';
88
+ const provider = typeof raw === 'string' ? raw.replace(/^"|"$/g, '') : String(raw);
89
+ return { name: gen.name, provider };
90
+ });
91
+ }
92
+ function extractDefaultValue(attr) {
93
+ if (!attr?.args?.length)
94
+ return null;
95
+ const arg = attr.args[0];
96
+ const val = arg?.value;
97
+ if (!val)
98
+ return null;
99
+ if (typeof val === 'string')
100
+ return val.replace(/^"|"$/g, '');
101
+ if (val.type === 'function') {
102
+ const params = val.params?.map((p) => (typeof p === 'string' ? p.replace(/^"|"$/g, '') : String(p))).join(', ') ?? '';
103
+ return params ? `${val.name}(${params})` : `${val.name}()`;
104
+ }
105
+ return String(val);
106
+ }
107
+ function extractRelationArgs(attr) {
108
+ const result = { fields: [], references: [], name: null };
109
+ if (!attr?.args)
110
+ return result;
111
+ for (const arg of attr.args) {
112
+ const kv = arg?.value;
113
+ if (!kv)
114
+ continue;
115
+ if (kv.type === 'keyValue') {
116
+ if (kv.key === 'fields' && kv.value?.type === 'array') {
117
+ result.fields = (kv.value.args ?? []).map((a) => typeof a === 'string' ? a : String(a));
118
+ }
119
+ else if (kv.key === 'references' && kv.value?.type === 'array') {
120
+ result.references = (kv.value.args ?? []).map((a) => typeof a === 'string' ? a : String(a));
121
+ }
122
+ else if (kv.key === 'name') {
123
+ result.name = typeof kv.value === 'string' ? kv.value.replace(/^"|"$/g, '') : null;
124
+ }
125
+ }
126
+ else if (typeof kv === 'string') {
127
+ // positional name argument
128
+ result.name = kv.replace(/^"|"$/g, '');
129
+ }
130
+ }
131
+ return result;
132
+ }
133
+ function extractField(prop, modelNames) {
134
+ const attrs = [];
135
+ let isId = false;
136
+ let isUnique = false;
137
+ let isRelation = false;
138
+ let relationName = null;
139
+ let relationFields = [];
140
+ let relationReferences = [];
141
+ let defaultValue = null;
142
+ for (const attr of prop.attributes ?? []) {
143
+ if (attr.type !== 'attribute')
144
+ continue;
145
+ const name = attr.name;
146
+ attrs.push(name);
147
+ if (name === 'id')
148
+ isId = true;
149
+ if (name === 'unique')
150
+ isUnique = true;
151
+ if (name === 'default')
152
+ defaultValue = extractDefaultValue(attr);
153
+ if (name === 'relation') {
154
+ const rel = extractRelationArgs(attr);
155
+ relationName = rel.name;
156
+ relationFields = rel.fields;
157
+ relationReferences = rel.references;
158
+ }
159
+ }
160
+ // A field is a relation if its type is a known model name
161
+ const fieldType = typeof prop.fieldType === 'string' ? prop.fieldType : String(prop.fieldType ?? '');
162
+ if (modelNames.has(fieldType)) {
163
+ isRelation = true;
164
+ }
165
+ return {
166
+ name: prop.name,
167
+ type: fieldType,
168
+ isList: Boolean(prop.array),
169
+ isOptional: Boolean(prop.optional),
170
+ isId,
171
+ isUnique,
172
+ isRelation,
173
+ relationName,
174
+ relationFields,
175
+ relationReferences,
176
+ defaultValue,
177
+ attributes: attrs,
178
+ };
179
+ }
180
+ function extractIndexes(properties) {
181
+ const indexes = [];
182
+ for (const prop of properties) {
183
+ if (prop.type !== 'attribute' || prop.kind !== 'object')
184
+ continue;
185
+ const name = prop.name;
186
+ if (name !== 'index' && name !== 'unique' && name !== 'fulltext')
187
+ continue;
188
+ let fields = [];
189
+ let indexName = null;
190
+ for (const arg of prop.args ?? []) {
191
+ const val = arg?.value;
192
+ if (!val)
193
+ continue;
194
+ if (val.type === 'array') {
195
+ fields = (val.args ?? []).map((a) => typeof a === 'string' ? a : String(a));
196
+ }
197
+ else if (val.type === 'keyValue') {
198
+ if (val.key === 'fields' && val.value?.type === 'array') {
199
+ fields = (val.value.args ?? []).map((a) => typeof a === 'string' ? a : String(a));
200
+ }
201
+ else if (val.key === 'name') {
202
+ indexName = typeof val.value === 'string' ? val.value.replace(/^"|"$/g, '') : null;
203
+ }
204
+ }
205
+ }
206
+ indexes.push({ fields, type: name, name: indexName });
207
+ }
208
+ return indexes;
209
+ }
210
+ function extractModels(ast) {
211
+ const modelNodes = ast.list.filter((n) => n.type === 'model');
212
+ const modelNames = new Set(modelNodes.map((m) => m.name));
213
+ return modelNodes.map((model) => {
214
+ const properties = model.properties ?? [];
215
+ const fields = properties
216
+ .filter((p) => p.type === 'field')
217
+ .map((p) => extractField(p, modelNames));
218
+ const indexes = extractIndexes(properties);
219
+ // Extract documentation (/// comments stored as comment nodes before the model)
220
+ const docNode = properties.find((p) => p.type === 'comment' && p.text?.startsWith('///'));
221
+ const documentation = docNode ? docNode.text.replace(/^\/\/\/\s?/, '').trim() : null;
222
+ return { name: model.name, fields, indexes, documentation };
223
+ });
224
+ }
225
+ function extractEnums(ast) {
226
+ return ast.list
227
+ .filter((n) => n.type === 'enum')
228
+ .map((enumNode) => {
229
+ const values = (enumNode.enumerators ?? [])
230
+ .filter((e) => e.type === 'enumerator')
231
+ .map((e) => e.name);
232
+ return { name: enumNode.name, values, documentation: null };
233
+ });
234
+ }
235
+ // ---------------------------------------------------------------------------
236
+ // Public API
237
+ // ---------------------------------------------------------------------------
238
+ /**
239
+ * Parse schema.prisma file into structured format.
240
+ * Returns null if no schema found.
241
+ * Throws on parse errors so callers can distinguish "no schema" from "bad schema".
242
+ */
243
+ export function parsePrismaSchema(projectRoot) {
244
+ const schemaPath = findSchemaPath(projectRoot);
245
+ if (!schemaPath)
246
+ return null;
247
+ const content = fs.readFileSync(schemaPath, 'utf-8');
248
+ try {
249
+ const ast = getSchema(content);
250
+ return {
251
+ path: path.relative(projectRoot, schemaPath),
252
+ datasourceProvider: extractDatasourceProvider(ast),
253
+ models: extractModels(ast),
254
+ enums: extractEnums(ast),
255
+ generators: extractGenerators(ast),
256
+ };
257
+ }
258
+ catch (err) {
259
+ throw new Error(`Failed to parse ${path.relative(projectRoot, schemaPath)}: ${err instanceof Error ? err.message : String(err)}`);
260
+ }
261
+ }
262
+ /**
263
+ * Parse schema.prisma from raw content string (for testing / propose_schema_change).
264
+ */
265
+ export function parsePrismaSchemaContent(content) {
266
+ const ast = getSchema(content);
267
+ return {
268
+ path: 'schema.prisma',
269
+ datasourceProvider: extractDatasourceProvider(ast),
270
+ models: extractModels(ast),
271
+ enums: extractEnums(ast),
272
+ generators: extractGenerators(ast),
273
+ };
274
+ }
275
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Human-readable terminal rendering of a parsed Prisma schema.
3
+ */
4
+ import type { PrismaSchemaInfo, PrismaModel } from './schema.js';
5
+ /**
6
+ * Render a full schema summary to a string for terminal output.
7
+ */
8
+ export declare function renderSchemaSummary(info: PrismaSchemaInfo, colorEnabled?: boolean): string;
9
+ /**
10
+ * Render a single model summary (for --model filter).
11
+ */
12
+ export declare function renderModelSummary(model: PrismaModel, colorEnabled?: boolean): string;
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Human-readable terminal rendering of a parsed Prisma schema.
3
+ */
4
+ import pc from 'picocolors';
5
+ import Table from 'cli-table3';
6
+ // ---------------------------------------------------------------------------
7
+ // Field rendering helpers
8
+ // ---------------------------------------------------------------------------
9
+ function fieldTypeLabel(field) {
10
+ const base = field.type;
11
+ const suffix = field.isList ? '[]' : field.isOptional ? '?' : '';
12
+ return base + suffix;
13
+ }
14
+ function fieldModifiers(field) {
15
+ const mods = [];
16
+ if (field.isId)
17
+ mods.push('@id');
18
+ if (field.isUnique)
19
+ mods.push('@unique');
20
+ if (field.defaultValue !== null)
21
+ mods.push(`@default(${field.defaultValue})`);
22
+ if (field.isRelation)
23
+ mods.push('relation');
24
+ return mods.join(' ');
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // Model rendering
28
+ // ---------------------------------------------------------------------------
29
+ function renderModel(model, colorEnabled) {
30
+ const lines = [];
31
+ const name = colorEnabled ? pc.bold(pc.cyan(model.name)) : model.name;
32
+ lines.push(` ${name}`);
33
+ if (model.documentation) {
34
+ lines.push(` ${colorEnabled ? pc.dim(model.documentation) : model.documentation}`);
35
+ }
36
+ // Fields table
37
+ const table = new Table({
38
+ head: ['Field', 'Type', 'Modifiers'].map((h) => (colorEnabled ? pc.bold(h) : h)),
39
+ style: { head: [], border: [] },
40
+ chars: {
41
+ top: '─',
42
+ 'top-mid': '┬',
43
+ 'top-left': '┌',
44
+ 'top-right': '┐',
45
+ bottom: '─',
46
+ 'bottom-mid': '┴',
47
+ 'bottom-left': '└',
48
+ 'bottom-right': '┘',
49
+ left: '│',
50
+ 'left-mid': '├',
51
+ mid: '─',
52
+ 'mid-mid': '┼',
53
+ right: '│',
54
+ 'right-mid': '┤',
55
+ middle: '│',
56
+ },
57
+ });
58
+ for (const field of model.fields) {
59
+ const typeStr = fieldTypeLabel(field);
60
+ const mods = fieldModifiers(field);
61
+ table.push([
62
+ colorEnabled && field.isId ? pc.yellow(field.name) : field.name,
63
+ colorEnabled && field.isRelation ? pc.magenta(typeStr) : typeStr,
64
+ colorEnabled ? pc.dim(mods) : mods,
65
+ ]);
66
+ }
67
+ // Indent table lines
68
+ const tableStr = table.toString();
69
+ for (const line of tableStr.split('\n')) {
70
+ lines.push(' ' + line);
71
+ }
72
+ // Indexes
73
+ if (model.indexes.length > 0) {
74
+ const indexStr = model.indexes
75
+ .map((idx) => {
76
+ const label = idx.type === 'unique' ? '@@unique' : idx.type === 'fulltext' ? '@@fulltext' : '@@index';
77
+ return `${label}([${idx.fields.join(', ')}])${idx.name ? ` "${idx.name}"` : ''}`;
78
+ })
79
+ .join(', ');
80
+ const prefix = colorEnabled ? pc.dim('Indexes:') : 'Indexes:';
81
+ lines.push(` ${prefix} ${indexStr}`);
82
+ }
83
+ return lines.join('\n');
84
+ }
85
+ // ---------------------------------------------------------------------------
86
+ // Public API
87
+ // ---------------------------------------------------------------------------
88
+ /**
89
+ * Render a full schema summary to a string for terminal output.
90
+ */
91
+ export function renderSchemaSummary(info, colorEnabled = true) {
92
+ const lines = [];
93
+ const header = colorEnabled
94
+ ? pc.bold(`Prisma Schema: ${info.path}`)
95
+ : `Prisma Schema: ${info.path}`;
96
+ lines.push(header);
97
+ if (info.datasourceProvider) {
98
+ const providerLine = colorEnabled
99
+ ? pc.dim(`Provider: ${info.datasourceProvider}`)
100
+ : `Provider: ${info.datasourceProvider}`;
101
+ lines.push(providerLine);
102
+ }
103
+ lines.push('');
104
+ // Models
105
+ const modelsHeader = colorEnabled
106
+ ? pc.bold(`Models (${info.models.length})`)
107
+ : `Models (${info.models.length})`;
108
+ lines.push(modelsHeader);
109
+ for (const model of info.models) {
110
+ lines.push('');
111
+ lines.push(renderModel(model, colorEnabled));
112
+ }
113
+ // Enums
114
+ if (info.enums.length > 0) {
115
+ lines.push('');
116
+ const enumsHeader = colorEnabled
117
+ ? pc.bold(`Enums (${info.enums.length})`)
118
+ : `Enums (${info.enums.length})`;
119
+ lines.push(enumsHeader);
120
+ for (const enumDef of info.enums) {
121
+ const enumName = colorEnabled ? pc.cyan(enumDef.name) : enumDef.name;
122
+ lines.push(` ${enumName}: ${enumDef.values.join(', ')}`);
123
+ }
124
+ }
125
+ return lines.join('\n');
126
+ }
127
+ /**
128
+ * Render a single model summary (for --model filter).
129
+ */
130
+ export function renderModelSummary(model, colorEnabled = true) {
131
+ return renderModel(model, colorEnabled);
132
+ }
133
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/db/summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared filesystem helpers — atomic writes, safe JSON parsing.
3
+ */
4
+ /**
5
+ * Atomically write a file by writing to a temp file first, then renaming.
6
+ * - Uses fsync to ensure data is flushed to disk before rename.
7
+ * - Preserves original file permissions (important for 0600 config files).
8
+ * - Temp file is named with the target basename for easy orphan attribution.
9
+ */
10
+ export declare function writeFileAtomic(filePath: string, content: string): void;
11
+ /**
12
+ * Safely read and parse a JSON file. Throws a descriptive error on failure.
13
+ */
14
+ export declare function readJsonFile(filePath: string): unknown;
15
+ /**
16
+ * Detect the user's shell rc file based on $SHELL.
17
+ * macOS bash uses .bash_profile (not .bashrc). Linux bash uses .bashrc.
18
+ */
19
+ export declare function getShellRcPath(): string;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Shared filesystem helpers — atomic writes, safe JSON parsing.
3
+ */
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+ import * as os from 'node:os';
7
+ import { randomUUID } from 'node:crypto';
8
+ /**
9
+ * Atomically write a file by writing to a temp file first, then renaming.
10
+ * - Uses fsync to ensure data is flushed to disk before rename.
11
+ * - Preserves original file permissions (important for 0600 config files).
12
+ * - Temp file is named with the target basename for easy orphan attribution.
13
+ */
14
+ export function writeFileAtomic(filePath, content) {
15
+ const dir = path.dirname(filePath);
16
+ const base = path.basename(filePath);
17
+ const tmpPath = path.join(dir, `.${base}.tmp-${randomUUID().slice(0, 8)}`);
18
+ // Capture original permissions before writing (if file exists).
19
+ // Mask off file-type bits (S_IFMT) — we only want the permission bits.
20
+ let originalMode = null;
21
+ try {
22
+ originalMode = fs.statSync(filePath).mode & 0o7777;
23
+ }
24
+ catch {
25
+ // File doesn't exist yet — no permissions to preserve
26
+ }
27
+ // For new files, default to 0o644. Callers that need stricter permissions
28
+ // (e.g. 0o600 for config.toml) should chmod after writeFileAtomic returns,
29
+ // or the file should already exist with the desired mode.
30
+ const mode = originalMode ?? 0o644;
31
+ try {
32
+ // Write to temp file
33
+ const fd = fs.openSync(tmpPath, 'w', mode);
34
+ try {
35
+ fs.writeSync(fd, content);
36
+ fs.fsyncSync(fd);
37
+ }
38
+ finally {
39
+ fs.closeSync(fd);
40
+ }
41
+ // Ensure permissions match regardless of umask
42
+ fs.chmodSync(tmpPath, mode);
43
+ // Atomic rename
44
+ fs.renameSync(tmpPath, filePath);
45
+ }
46
+ catch (err) {
47
+ // Clean up temp file on failure
48
+ try {
49
+ fs.unlinkSync(tmpPath);
50
+ }
51
+ catch {
52
+ // ignore cleanup errors
53
+ }
54
+ throw err;
55
+ }
56
+ }
57
+ /**
58
+ * Safely read and parse a JSON file. Throws a descriptive error on failure.
59
+ */
60
+ export function readJsonFile(filePath) {
61
+ let raw;
62
+ try {
63
+ raw = fs.readFileSync(filePath, 'utf-8');
64
+ }
65
+ catch (err) {
66
+ throw new Error(`Cannot read ${path.basename(filePath)}: ${err instanceof Error ? err.message : String(err)}`);
67
+ }
68
+ try {
69
+ return JSON.parse(raw);
70
+ }
71
+ catch (err) {
72
+ throw new Error(`Invalid JSON in ${path.basename(filePath)}: ${err instanceof Error ? err.message : String(err)}`);
73
+ }
74
+ }
75
+ /**
76
+ * Detect the user's shell rc file based on $SHELL.
77
+ * macOS bash uses .bash_profile (not .bashrc). Linux bash uses .bashrc.
78
+ */
79
+ export function getShellRcPath() {
80
+ const shell = process.env['SHELL'] ?? '';
81
+ if (shell.endsWith('/zsh'))
82
+ return path.join(os.homedir(), '.zshrc');
83
+ if (shell.endsWith('/bash')) {
84
+ // macOS bash sources .bash_profile, not .bashrc
85
+ return path.join(os.homedir(), process.platform === 'darwin' ? '.bash_profile' : '.bashrc');
86
+ }
87
+ if (shell.endsWith('/fish'))
88
+ return path.join(os.homedir(), '.config', 'fish', 'config.fish');
89
+ // Default: zsh on macOS, bash on Linux
90
+ return path.join(os.homedir(), process.platform === 'darwin' ? '.zshrc' : '.bashrc');
91
+ }
92
+ //# sourceMappingURL=fs-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-helpers.js","sourceRoot":"","sources":["../src/fs-helpers.ts"],"names":[],"mappings":"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"}
package/dist/parser.d.ts CHANGED
@@ -12,6 +12,8 @@ export interface ParsedArgs {
12
12
  session?: string;
13
13
  quiet: boolean;
14
14
  format: "text" | "json";
15
+ provider?: string;
16
+ model?: string;
15
17
  maxTokens?: number;
16
18
  output?: string;
17
19
  unstaged?: boolean;
@@ -23,6 +25,15 @@ export interface ParsedArgs {
23
25
  configSubcommand?: "get" | "set" | "path" | "init";
24
26
  configKey?: string;
25
27
  configValue?: string;
28
+ dbSubcommand?: "schema" | "ask" | "explain" | "migrate";
29
+ dbQuestion?: string;
30
+ dbDescription?: string;
31
+ dbModel?: string;
32
+ dbFile?: string;
33
+ dbJson?: boolean;
34
+ upgradeSubcommand?: "deps" | "prisma";
35
+ upgradeRisk?: "patch" | "minor" | "major" | "all";
36
+ upgradeDev?: boolean;
26
37
  }
27
38
  export declare const GLOBAL_USAGE: string;
28
39
  export declare const COMMAND_USAGE: Record<string, string>;