@ariacode/cli 0.1.0

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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +404 -0
  3. package/dist/actions.d.ts +271 -0
  4. package/dist/actions.js +1809 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/agent.d.ts +26 -0
  7. package/dist/agent.js +182 -0
  8. package/dist/agent.js.map +1 -0
  9. package/dist/app.d.ts +14 -0
  10. package/dist/app.js +83 -0
  11. package/dist/app.js.map +1 -0
  12. package/dist/cli.d.ts +12 -0
  13. package/dist/cli.js +157 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +170 -0
  16. package/dist/config.js +291 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/context.d.ts +58 -0
  19. package/dist/context.js +44 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/parser.d.ts +39 -0
  22. package/dist/parser.js +323 -0
  23. package/dist/parser.js.map +1 -0
  24. package/dist/prompts/ask.md +20 -0
  25. package/dist/prompts/explore.md +38 -0
  26. package/dist/prompts/patch.md +27 -0
  27. package/dist/prompts/plan.md +41 -0
  28. package/dist/prompts/prompts/ask.md +20 -0
  29. package/dist/prompts/prompts/explore.md +38 -0
  30. package/dist/prompts/prompts/patch.md +27 -0
  31. package/dist/prompts/prompts/plan.md +41 -0
  32. package/dist/prompts/prompts/review.md +33 -0
  33. package/dist/prompts/review.md +33 -0
  34. package/dist/provider.d.ts +148 -0
  35. package/dist/provider.js +486 -0
  36. package/dist/provider.js.map +1 -0
  37. package/dist/repo.d.ts +22 -0
  38. package/dist/repo.js +154 -0
  39. package/dist/repo.js.map +1 -0
  40. package/dist/safety.d.ts +48 -0
  41. package/dist/safety.js +140 -0
  42. package/dist/safety.js.map +1 -0
  43. package/dist/storage.d.ts +133 -0
  44. package/dist/storage.js +300 -0
  45. package/dist/storage.js.map +1 -0
  46. package/dist/tools.d.ts +70 -0
  47. package/dist/tools.js +654 -0
  48. package/dist/tools.js.map +1 -0
  49. package/dist/ui.d.ts +203 -0
  50. package/dist/ui.js +410 -0
  51. package/dist/ui.js.map +1 -0
  52. package/package.json +73 -0
@@ -0,0 +1,148 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Provider message format
4
+ * Normalized across all providers
5
+ */
6
+ export interface ProviderMessage {
7
+ role: "user" | "assistant" | "system";
8
+ content: string;
9
+ }
10
+ /**
11
+ * Provider tool call format
12
+ * Normalized across all providers
13
+ */
14
+ export interface ProviderToolCall {
15
+ id: string;
16
+ name: string;
17
+ input: unknown;
18
+ }
19
+ /**
20
+ * Provider response format
21
+ * Normalized across all providers
22
+ */
23
+ export interface ProviderResponse {
24
+ content: string;
25
+ toolCalls: ProviderToolCall[];
26
+ stopReason: "end_turn" | "max_tokens" | "tool_use";
27
+ }
28
+ /**
29
+ * Tool definition for provider
30
+ */
31
+ export interface Tool {
32
+ name: string;
33
+ description: string;
34
+ isMutation: boolean;
35
+ inputSchema: z.ZodSchema;
36
+ }
37
+ /**
38
+ * Provider interface
39
+ * All provider adapters must implement this interface
40
+ */
41
+ export interface Provider {
42
+ name: string;
43
+ chat(messages: ProviderMessage[], tools: Tool[], options: {
44
+ model: string;
45
+ maxTokens: number;
46
+ temperature?: number;
47
+ }): Promise<ProviderResponse>;
48
+ }
49
+ /**
50
+ * Provider error with context
51
+ */
52
+ export declare class ProviderError extends Error {
53
+ readonly provider: string;
54
+ readonly cause?: unknown | undefined;
55
+ constructor(message: string, provider: string, cause?: unknown | undefined);
56
+ }
57
+ /**
58
+ * Anthropic provider adapter
59
+ * Uses @anthropic-ai/sdk
60
+ */
61
+ export declare class AnthropicProvider implements Provider {
62
+ name: string;
63
+ private client;
64
+ constructor(apiKey?: string);
65
+ chat(messages: ProviderMessage[], tools: Tool[], options: {
66
+ model: string;
67
+ maxTokens: number;
68
+ temperature?: number;
69
+ }): Promise<ProviderResponse>;
70
+ }
71
+ /**
72
+ * Base class for OpenAI-compatible providers (OpenAI, Ollama, OpenRouter).
73
+ * Eliminates duplicated fetch + parse + error handling logic.
74
+ */
75
+ declare abstract class OpenAICompatibleProvider implements Provider {
76
+ abstract name: string;
77
+ protected abstract getEndpoint(): string;
78
+ protected abstract getHeaders(): Record<string, string>;
79
+ protected abstract buildBody(messages: ProviderMessage[], tools: Tool[], options: {
80
+ model: string;
81
+ maxTokens: number;
82
+ temperature?: number;
83
+ }): Record<string, unknown>;
84
+ chat(messages: ProviderMessage[], tools: Tool[], options: {
85
+ model: string;
86
+ maxTokens: number;
87
+ temperature?: number;
88
+ }): Promise<ProviderResponse>;
89
+ }
90
+ export declare class OpenAIProvider extends OpenAICompatibleProvider {
91
+ name: string;
92
+ private apiKey;
93
+ constructor(apiKey?: string);
94
+ protected getEndpoint(): string;
95
+ protected getHeaders(): Record<string, string>;
96
+ protected buildBody(messages: ProviderMessage[], tools: Tool[], options: {
97
+ model: string;
98
+ maxTokens: number;
99
+ temperature?: number;
100
+ }): Record<string, unknown>;
101
+ }
102
+ export declare class OllamaProvider extends OpenAICompatibleProvider {
103
+ name: string;
104
+ private baseUrl;
105
+ constructor(baseUrl?: string);
106
+ protected getEndpoint(): string;
107
+ protected getHeaders(): Record<string, string>;
108
+ protected buildBody(messages: ProviderMessage[], tools: Tool[], options: {
109
+ model: string;
110
+ maxTokens: number;
111
+ temperature?: number;
112
+ }): Record<string, unknown>;
113
+ /**
114
+ * Override chat for Ollama's different response shape:
115
+ * { message: { content, tool_calls } } instead of { choices: [...] }
116
+ */
117
+ chat(messages: ProviderMessage[], tools: Tool[], options: {
118
+ model: string;
119
+ maxTokens: number;
120
+ temperature?: number;
121
+ }): Promise<ProviderResponse>;
122
+ }
123
+ export declare class OpenRouterProvider extends OpenAICompatibleProvider {
124
+ name: string;
125
+ private apiKey;
126
+ constructor(apiKey?: string);
127
+ protected getEndpoint(): string;
128
+ protected getHeaders(): Record<string, string>;
129
+ protected buildBody(messages: ProviderMessage[], tools: Tool[], options: {
130
+ model: string;
131
+ maxTokens: number;
132
+ temperature?: number;
133
+ }): Record<string, unknown>;
134
+ }
135
+ /**
136
+ * Convert Zod v4 schema to JSON Schema for tool definitions.
137
+ *
138
+ * Zod v4 uses `_def.type` (string) instead of Zod v3's `_def.typeName`.
139
+ * This converter handles both formats for compatibility.
140
+ *
141
+ * Throws on unsupported types instead of silently falling back.
142
+ */
143
+ export declare function zodToJsonSchema(schema: z.ZodSchema): Record<string, unknown>;
144
+ /**
145
+ * Create a provider instance based on configuration
146
+ */
147
+ export declare function createProvider(providerName: string): Provider;
148
+ export {};
@@ -0,0 +1,486 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ /**
3
+ * Provider error with context
4
+ */
5
+ export class ProviderError extends Error {
6
+ provider;
7
+ cause;
8
+ constructor(message, provider, cause) {
9
+ super(message);
10
+ this.provider = provider;
11
+ this.cause = cause;
12
+ this.name = "ProviderError";
13
+ }
14
+ }
15
+ // ---------------------------------------------------------------------------
16
+ // Shared helpers for OpenAI-compatible providers
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Parse tool_calls from an OpenAI-compatible response message.
20
+ * Shared by OpenAI, Ollama, and OpenRouter providers.
21
+ */
22
+ function parseOpenAIToolCalls(toolCalls) {
23
+ if (!toolCalls)
24
+ return [];
25
+ return toolCalls.map((tc) => {
26
+ let parsedInput;
27
+ try {
28
+ parsedInput = JSON.parse(tc.function.arguments);
29
+ }
30
+ catch {
31
+ parsedInput = {};
32
+ }
33
+ return {
34
+ id: tc.id || `call_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
35
+ name: tc.function.name,
36
+ input: parsedInput,
37
+ };
38
+ });
39
+ }
40
+ /**
41
+ * Map an OpenAI-compatible finish_reason to our normalized stopReason.
42
+ */
43
+ function mapFinishReason(finishReason, toolCallCount) {
44
+ if (finishReason === "stop" || finishReason === "end_turn")
45
+ return "end_turn";
46
+ if (finishReason === "length" || finishReason === "max_tokens")
47
+ return "max_tokens";
48
+ if (finishReason === "tool_calls" || finishReason === "tool_use")
49
+ return "tool_use";
50
+ // Infer from tool calls (Ollama doesn't always provide finish_reason)
51
+ return toolCallCount > 0 ? "tool_use" : "end_turn";
52
+ }
53
+ /**
54
+ * Convert tools to OpenAI-compatible function format.
55
+ * Shared by OpenAI, Ollama, and OpenRouter providers.
56
+ */
57
+ function toOpenAITools(tools) {
58
+ return tools.map((tool) => ({
59
+ type: "function",
60
+ function: {
61
+ name: tool.name,
62
+ description: tool.description,
63
+ parameters: zodToJsonSchema(tool.inputSchema),
64
+ },
65
+ }));
66
+ }
67
+ /**
68
+ * Validate that an OpenAI-compatible response has the expected structure.
69
+ * Throws a descriptive error if the response is malformed.
70
+ */
71
+ function validateOpenAIResponse(data, providerName) {
72
+ if (!data || typeof data !== "object") {
73
+ throw new Error(`Unexpected ${providerName} response: not an object`);
74
+ }
75
+ const obj = data;
76
+ const choices = obj.choices;
77
+ if (!Array.isArray(choices) || choices.length === 0) {
78
+ throw new Error(`Unexpected ${providerName} response: missing or empty choices array`);
79
+ }
80
+ const choice = choices[0];
81
+ const message = choice?.message;
82
+ if (!message || typeof message !== "object") {
83
+ throw new Error(`Unexpected ${providerName} response: missing choices[0].message`);
84
+ }
85
+ const msg = message;
86
+ return {
87
+ content: typeof msg.content === "string" ? msg.content : "",
88
+ tool_calls: Array.isArray(msg.tool_calls) ? msg.tool_calls : undefined,
89
+ finish_reason: typeof choice.finish_reason === "string" ? choice.finish_reason : undefined,
90
+ };
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Anthropic provider
94
+ // ---------------------------------------------------------------------------
95
+ /**
96
+ * Anthropic provider adapter
97
+ * Uses @anthropic-ai/sdk
98
+ */
99
+ export class AnthropicProvider {
100
+ name = "anthropic";
101
+ client;
102
+ constructor(apiKey) {
103
+ const key = apiKey || process.env.ANTHROPIC_API_KEY;
104
+ if (!key) {
105
+ throw new ProviderError("ANTHROPIC_API_KEY environment variable is required", "anthropic");
106
+ }
107
+ this.client = new Anthropic({ apiKey: key });
108
+ }
109
+ async chat(messages, tools, options) {
110
+ try {
111
+ const systemMessages = messages.filter((m) => m.role === "system");
112
+ const conversationMessages = messages.filter((m) => m.role !== "system");
113
+ const systemPrompt = systemMessages.map((m) => m.content).join("\n\n");
114
+ const anthropicTools = tools.map((tool) => {
115
+ const schema = zodToJsonSchema(tool.inputSchema);
116
+ return {
117
+ name: tool.name,
118
+ description: tool.description,
119
+ input_schema: { type: "object", ...schema },
120
+ };
121
+ });
122
+ const anthropicMessages = conversationMessages.map((m) => ({
123
+ role: m.role,
124
+ content: m.content,
125
+ }));
126
+ const response = await this.client.messages.create({
127
+ model: options.model,
128
+ max_tokens: options.maxTokens,
129
+ temperature: options.temperature,
130
+ system: systemPrompt || undefined,
131
+ messages: anthropicMessages,
132
+ tools: anthropicTools.length > 0 ? anthropicTools : undefined,
133
+ });
134
+ let content = "";
135
+ const toolCalls = [];
136
+ for (const block of response.content) {
137
+ if (block.type === "text") {
138
+ content += block.text;
139
+ }
140
+ else if (block.type === "tool_use") {
141
+ toolCalls.push({ id: block.id, name: block.name, input: block.input });
142
+ }
143
+ }
144
+ return {
145
+ content,
146
+ toolCalls,
147
+ stopReason: mapFinishReason(response.stop_reason ?? undefined, toolCalls.length),
148
+ };
149
+ }
150
+ catch (error) {
151
+ if (error instanceof ProviderError)
152
+ throw error;
153
+ throw new ProviderError(`Anthropic API error: ${error instanceof Error ? error.message : String(error)}`, "anthropic", error);
154
+ }
155
+ }
156
+ }
157
+ // ---------------------------------------------------------------------------
158
+ // OpenAI-compatible base provider
159
+ // ---------------------------------------------------------------------------
160
+ /**
161
+ * Base class for OpenAI-compatible providers (OpenAI, Ollama, OpenRouter).
162
+ * Eliminates duplicated fetch + parse + error handling logic.
163
+ */
164
+ class OpenAICompatibleProvider {
165
+ async chat(messages, tools, options) {
166
+ try {
167
+ const response = await fetch(this.getEndpoint(), {
168
+ method: "POST",
169
+ headers: this.getHeaders(),
170
+ body: JSON.stringify(this.buildBody(messages, tools, options)),
171
+ });
172
+ if (!response.ok) {
173
+ const errorData = await response.json().catch(() => ({}));
174
+ throw new Error(`${this.name} API error: ${response.status} ${response.statusText} - ${JSON.stringify(errorData)}`);
175
+ }
176
+ const data = await response.json();
177
+ const validated = validateOpenAIResponse(data, this.name);
178
+ const toolCalls = parseOpenAIToolCalls(validated.tool_calls);
179
+ return {
180
+ content: validated.content,
181
+ toolCalls,
182
+ stopReason: mapFinishReason(validated.finish_reason, toolCalls.length),
183
+ };
184
+ }
185
+ catch (error) {
186
+ if (error instanceof ProviderError)
187
+ throw error;
188
+ throw new ProviderError(`${this.name} API error: ${error instanceof Error ? error.message : String(error)}`, this.name, error);
189
+ }
190
+ }
191
+ }
192
+ // ---------------------------------------------------------------------------
193
+ // Concrete OpenAI-compatible providers
194
+ // ---------------------------------------------------------------------------
195
+ export class OpenAIProvider extends OpenAICompatibleProvider {
196
+ name = "openai";
197
+ apiKey;
198
+ constructor(apiKey) {
199
+ super();
200
+ const key = apiKey || process.env.OPENAI_API_KEY;
201
+ if (!key) {
202
+ throw new ProviderError("OPENAI_API_KEY environment variable is required", "openai");
203
+ }
204
+ this.apiKey = key;
205
+ }
206
+ getEndpoint() {
207
+ return "https://api.openai.com/v1/chat/completions";
208
+ }
209
+ getHeaders() {
210
+ return {
211
+ "Content-Type": "application/json",
212
+ Authorization: `Bearer ${this.apiKey}`,
213
+ };
214
+ }
215
+ buildBody(messages, tools, options) {
216
+ const openaiTools = toOpenAITools(tools);
217
+ return {
218
+ model: options.model,
219
+ messages: messages.map((m) => ({ role: m.role, content: m.content })),
220
+ max_tokens: options.maxTokens,
221
+ temperature: options.temperature,
222
+ tools: openaiTools.length > 0 ? openaiTools : undefined,
223
+ };
224
+ }
225
+ }
226
+ export class OllamaProvider extends OpenAICompatibleProvider {
227
+ name = "ollama";
228
+ baseUrl;
229
+ constructor(baseUrl) {
230
+ super();
231
+ this.baseUrl = baseUrl || process.env.OLLAMA_BASE_URL || "http://localhost:11434";
232
+ }
233
+ getEndpoint() {
234
+ return `${this.baseUrl}/api/chat`;
235
+ }
236
+ getHeaders() {
237
+ return { "Content-Type": "application/json" };
238
+ }
239
+ buildBody(messages, tools, options) {
240
+ const ollamaTools = toOpenAITools(tools);
241
+ return {
242
+ model: options.model,
243
+ messages: messages.map((m) => ({ role: m.role, content: m.content })),
244
+ tools: ollamaTools.length > 0 ? ollamaTools : undefined,
245
+ stream: false,
246
+ options: {
247
+ temperature: options.temperature,
248
+ num_predict: options.maxTokens,
249
+ },
250
+ };
251
+ }
252
+ /**
253
+ * Override chat for Ollama's different response shape:
254
+ * { message: { content, tool_calls } } instead of { choices: [...] }
255
+ */
256
+ async chat(messages, tools, options) {
257
+ try {
258
+ const response = await fetch(this.getEndpoint(), {
259
+ method: "POST",
260
+ headers: this.getHeaders(),
261
+ body: JSON.stringify(this.buildBody(messages, tools, options)),
262
+ });
263
+ if (!response.ok) {
264
+ const errorData = await response.json().catch(() => ({}));
265
+ throw new Error(`ollama API error: ${response.status} ${response.statusText} - ${JSON.stringify(errorData)}`);
266
+ }
267
+ const data = (await response.json());
268
+ const message = data?.message;
269
+ if (!message) {
270
+ throw new Error("Unexpected Ollama response format: missing message");
271
+ }
272
+ const content = typeof message.content === "string" ? message.content : "";
273
+ const toolCalls = parseOpenAIToolCalls(Array.isArray(message.tool_calls) ? message.tool_calls : undefined);
274
+ return {
275
+ content,
276
+ toolCalls,
277
+ stopReason: mapFinishReason(undefined, toolCalls.length),
278
+ };
279
+ }
280
+ catch (error) {
281
+ if (error instanceof ProviderError)
282
+ throw error;
283
+ throw new ProviderError(`ollama API error: ${error instanceof Error ? error.message : String(error)}`, "ollama", error);
284
+ }
285
+ }
286
+ }
287
+ export class OpenRouterProvider extends OpenAICompatibleProvider {
288
+ name = "openrouter";
289
+ apiKey;
290
+ constructor(apiKey) {
291
+ super();
292
+ const key = apiKey || process.env.OPENROUTER_API_KEY;
293
+ if (!key) {
294
+ throw new ProviderError("OPENROUTER_API_KEY environment variable is required", "openrouter");
295
+ }
296
+ this.apiKey = key;
297
+ }
298
+ getEndpoint() {
299
+ return "https://openrouter.ai/api/v1/chat/completions";
300
+ }
301
+ getHeaders() {
302
+ return {
303
+ "Content-Type": "application/json",
304
+ Authorization: `Bearer ${this.apiKey}`,
305
+ "HTTP-Referer": "https://github.com/ariacodeai/ariacode",
306
+ "X-Title": "Aria Code CLI",
307
+ };
308
+ }
309
+ buildBody(messages, tools, options) {
310
+ const openrouterTools = toOpenAITools(tools);
311
+ return {
312
+ model: options.model,
313
+ messages: messages.map((m) => ({ role: m.role, content: m.content })),
314
+ max_tokens: options.maxTokens,
315
+ temperature: options.temperature,
316
+ tools: openrouterTools.length > 0 ? openrouterTools : undefined,
317
+ };
318
+ }
319
+ }
320
+ // ---------------------------------------------------------------------------
321
+ // Ollama response validation override
322
+ // ---------------------------------------------------------------------------
323
+ // Ollama uses a different response shape: { message: { content, tool_calls } }
324
+ // Override the chat method to handle this.
325
+ OllamaProvider.prototype.chat = async function (messages, tools, options) {
326
+ try {
327
+ const response = await fetch(this.getEndpoint(), {
328
+ method: "POST",
329
+ headers: this.getHeaders(),
330
+ body: JSON.stringify(this.buildBody(messages, tools, options)),
331
+ });
332
+ if (!response.ok) {
333
+ const errorData = await response.json().catch(() => ({}));
334
+ throw new Error(`ollama API error: ${response.status} ${response.statusText} - ${JSON.stringify(errorData)}`);
335
+ }
336
+ const data = (await response.json());
337
+ const message = data?.message;
338
+ if (!message) {
339
+ throw new Error("Unexpected Ollama response format: missing message");
340
+ }
341
+ const content = typeof message.content === "string" ? message.content : "";
342
+ const toolCalls = parseOpenAIToolCalls(Array.isArray(message.tool_calls) ? message.tool_calls : undefined);
343
+ return {
344
+ content,
345
+ toolCalls,
346
+ stopReason: mapFinishReason(undefined, toolCalls.length),
347
+ };
348
+ }
349
+ catch (error) {
350
+ if (error instanceof ProviderError)
351
+ throw error;
352
+ throw new ProviderError(`ollama API error: ${error instanceof Error ? error.message : String(error)}`, "ollama", error);
353
+ }
354
+ };
355
+ // ---------------------------------------------------------------------------
356
+ // Zod → JSON Schema converter
357
+ // ---------------------------------------------------------------------------
358
+ /**
359
+ * Convert Zod v4 schema to JSON Schema for tool definitions.
360
+ *
361
+ * Zod v4 uses `_def.type` (string) instead of Zod v3's `_def.typeName`.
362
+ * This converter handles both formats for compatibility.
363
+ *
364
+ * Throws on unsupported types instead of silently falling back.
365
+ */
366
+ export function zodToJsonSchema(schema) {
367
+ const def = schema._def;
368
+ if (!def) {
369
+ return { type: "string" };
370
+ }
371
+ // Zod v3 uses typeName, Zod v4 uses type
372
+ const typeName = def.typeName ?? def.type;
373
+ switch (typeName) {
374
+ case "ZodObject":
375
+ case "object": {
376
+ const shape = typeof def.shape === "function" ? def.shape() : def.shape;
377
+ const properties = {};
378
+ const required = [];
379
+ for (const [key, value] of Object.entries(shape)) {
380
+ properties[key] = zodToJsonSchema(value);
381
+ const fieldDef = value._def;
382
+ const fieldType = fieldDef?.typeName ?? fieldDef?.type;
383
+ if (fieldType !== "ZodOptional" && fieldType !== "optional" &&
384
+ fieldType !== "ZodDefault" && fieldType !== "default") {
385
+ required.push(key);
386
+ }
387
+ }
388
+ return {
389
+ type: "object",
390
+ properties,
391
+ ...(required.length > 0 ? { required } : {}),
392
+ };
393
+ }
394
+ case "ZodString":
395
+ case "string":
396
+ return { type: "string" };
397
+ case "ZodNumber":
398
+ case "number":
399
+ return { type: "number" };
400
+ case "ZodBoolean":
401
+ case "boolean":
402
+ return { type: "boolean" };
403
+ case "ZodArray":
404
+ case "array": {
405
+ // Zod v3: def.type is the element schema; Zod v4: def.element
406
+ const element = def.element ?? def.type;
407
+ return { type: "array", items: zodToJsonSchema(element) };
408
+ }
409
+ case "ZodOptional":
410
+ case "optional":
411
+ return zodToJsonSchema(def.innerType);
412
+ case "ZodDefault":
413
+ case "default":
414
+ return zodToJsonSchema(def.innerType);
415
+ case "ZodNullable":
416
+ case "nullable": {
417
+ const inner = zodToJsonSchema(def.innerType);
418
+ return { ...inner, nullable: true };
419
+ }
420
+ case "ZodEnum":
421
+ case "enum": {
422
+ // Zod v3: def.values is an array; Zod v4: def.entries is an object
423
+ const values = def.values ?? (def.entries ? Object.keys(def.entries) : []);
424
+ return { type: "string", enum: values };
425
+ }
426
+ case "ZodLiteral":
427
+ case "literal": {
428
+ const val = def.value;
429
+ if (typeof val === "string")
430
+ return { type: "string", const: val };
431
+ if (typeof val === "number")
432
+ return { type: "number", const: val };
433
+ if (typeof val === "boolean")
434
+ return { type: "boolean", const: val };
435
+ return { const: val };
436
+ }
437
+ case "ZodUnion":
438
+ case "union": {
439
+ const options = (def.options ?? def.members).map(zodToJsonSchema);
440
+ return { anyOf: options };
441
+ }
442
+ case "ZodRecord":
443
+ case "record":
444
+ return {
445
+ type: "object",
446
+ additionalProperties: zodToJsonSchema(def.valueType),
447
+ };
448
+ case "ZodAny":
449
+ case "any":
450
+ return {};
451
+ default: {
452
+ // Fallback: Zod v4 .describe() / .uuid() etc. may strip typeName
453
+ // but the schema instance itself has a `type` property
454
+ const instanceType = schema.type;
455
+ if (instanceType === "string")
456
+ return { type: "string" };
457
+ if (instanceType === "number")
458
+ return { type: "number" };
459
+ if (instanceType === "boolean")
460
+ return { type: "boolean" };
461
+ throw new Error(`zodToJsonSchema: unsupported Zod type "${typeName}". ` +
462
+ `Add support or use a simpler schema.`);
463
+ }
464
+ }
465
+ }
466
+ // ---------------------------------------------------------------------------
467
+ // Factory
468
+ // ---------------------------------------------------------------------------
469
+ /**
470
+ * Create a provider instance based on configuration
471
+ */
472
+ export function createProvider(providerName) {
473
+ switch (providerName) {
474
+ case "anthropic":
475
+ return new AnthropicProvider();
476
+ case "openai":
477
+ return new OpenAIProvider();
478
+ case "ollama":
479
+ return new OllamaProvider();
480
+ case "openrouter":
481
+ return new OpenRouterProvider();
482
+ default:
483
+ throw new ProviderError(`Unsupported provider: ${providerName}`, providerName);
484
+ }
485
+ }
486
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
package/dist/repo.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Project type detection result
3
+ * Matches the design spec interface from design.md
4
+ */
5
+ export interface ProjectInfo {
6
+ type: "nextjs" | "nestjs" | "nodejs";
7
+ framework?: {
8
+ name: string;
9
+ version?: string;
10
+ router?: "app" | "pages";
11
+ };
12
+ hasPrisma: boolean;
13
+ prismaSchemaPath?: string;
14
+ packageJsonPath: string;
15
+ packageManager?: "npm" | "pnpm" | "yarn" | "bun";
16
+ rootPath: string;
17
+ }
18
+ /**
19
+ * Detect project type based on framework indicators
20
+ * Requirements: 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9
21
+ */
22
+ export declare function detectProjectType(rootDir?: string): ProjectInfo;