cadr-cli 0.0.1 → 1.9.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/dist/adr.d.ts +50 -0
- package/dist/adr.d.ts.map +1 -0
- package/dist/adr.js +156 -0
- package/dist/adr.js.map +1 -0
- package/dist/adr.test.d.ts +8 -0
- package/dist/adr.test.d.ts.map +1 -0
- package/dist/adr.test.js +256 -0
- package/dist/adr.test.js.map +1 -0
- package/dist/analysis.d.ts +24 -0
- package/dist/analysis.d.ts.map +1 -0
- package/dist/analysis.js +281 -0
- package/dist/analysis.js.map +1 -0
- package/dist/analysis.test.d.ts +8 -0
- package/dist/analysis.test.d.ts.map +1 -0
- package/dist/analysis.test.js +351 -0
- package/dist/analysis.test.js.map +1 -0
- package/dist/commands/analyze.d.ts +14 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +56 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +93 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +2 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +56 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +208 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +97 -0
- package/dist/config.test.js.map +1 -0
- package/dist/git.d.ts +42 -0
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +157 -0
- package/dist/git.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -62
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +51 -0
- package/dist/index.test.js.map +1 -0
- package/dist/llm.d.ts +73 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +263 -0
- package/dist/llm.js.map +1 -0
- package/dist/llm.test.d.ts +2 -0
- package/dist/llm.test.d.ts.map +1 -0
- package/dist/llm.test.js +592 -0
- package/dist/llm.test.js.map +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +5 -3
- package/dist/logger.js.map +1 -1
- package/dist/logger.test.d.ts +2 -0
- package/dist/logger.test.d.ts.map +1 -0
- package/dist/logger.test.js +78 -0
- package/dist/logger.test.js.map +1 -0
- package/dist/prompts.d.ts +49 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +195 -0
- package/dist/prompts.js.map +1 -0
- package/dist/prompts.test.d.ts +2 -0
- package/dist/prompts.test.d.ts.map +1 -0
- package/dist/prompts.test.js +427 -0
- package/dist/prompts.test.js.map +1 -0
- package/dist/providers/gemini.d.ts +3 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +39 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +3 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +25 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +4 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +16 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +12 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +5 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/version.test.d.ts +3 -0
- package/dist/version.test.d.ts.map +1 -0
- package/dist/version.test.js +25 -0
- package/dist/version.test.js.map +1 -0
- package/package.json +14 -5
- package/src/adr.test.ts +278 -0
- package/src/adr.ts +136 -0
- package/src/analysis.test.ts +396 -0
- package/src/analysis.ts +262 -0
- package/src/commands/analyze.ts +56 -0
- package/src/commands/init.test.ts +27 -0
- package/src/commands/init.ts +99 -0
- package/src/config.test.ts +79 -0
- package/src/config.ts +214 -0
- package/src/git.ts +240 -0
- package/src/index.test.ts +59 -0
- package/src/index.ts +80 -60
- package/src/llm.test.ts +701 -0
- package/src/llm.ts +344 -0
- package/src/logger.test.ts +90 -0
- package/src/logger.ts +6 -3
- package/src/prompts.test.ts +515 -0
- package/src/prompts.ts +174 -0
- package/src/providers/gemini.ts +41 -0
- package/src/providers/index.ts +1 -0
- package/src/providers/openai.ts +22 -0
- package/src/providers/registry.ts +16 -0
- package/src/providers/types.ts +14 -0
- package/src/version.test.ts +29 -0
- package/bin/cadr.js +0 -16
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const prompts_1 = require("./prompts");
|
|
37
|
+
const readline = __importStar(require("readline"));
|
|
38
|
+
// Mock readline
|
|
39
|
+
jest.mock('readline');
|
|
40
|
+
describe('Prompts Module', () => {
|
|
41
|
+
describe('ANALYSIS_PROMPT_V1', () => {
|
|
42
|
+
test('prompt template includes required placeholders', () => {
|
|
43
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('{file_paths}');
|
|
44
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('{diff_content}');
|
|
45
|
+
});
|
|
46
|
+
test('prompt template includes architectural significance instructions', () => {
|
|
47
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('architectural');
|
|
48
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('significant');
|
|
49
|
+
});
|
|
50
|
+
test('prompt template specifies JSON response format', () => {
|
|
51
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('JSON');
|
|
52
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('is_significant');
|
|
53
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('reason');
|
|
54
|
+
});
|
|
55
|
+
test('prompt template includes analysis criteria', () => {
|
|
56
|
+
const prompt = prompts_1.ANALYSIS_PROMPT_V1.toLowerCase();
|
|
57
|
+
// Should mention various architectural concerns
|
|
58
|
+
expect(prompt.includes('pattern') ||
|
|
59
|
+
prompt.includes('data model') ||
|
|
60
|
+
prompt.includes('api') ||
|
|
61
|
+
prompt.includes('security')).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
test('prompt includes all specific architectural significance criteria', () => {
|
|
64
|
+
const prompt = prompts_1.ANALYSIS_PROMPT_V1.toLowerCase();
|
|
65
|
+
// Must include all key criteria
|
|
66
|
+
expect(prompt).toContain('dependency');
|
|
67
|
+
expect(prompt).toContain('infrastructure');
|
|
68
|
+
expect(prompt).toContain('api contract');
|
|
69
|
+
expect(prompt).toContain('data schema');
|
|
70
|
+
expect(prompt).toContain('authentication');
|
|
71
|
+
expect(prompt).toContain('authorization');
|
|
72
|
+
expect(prompt).toContain('cross-cutting');
|
|
73
|
+
});
|
|
74
|
+
test('prompt specifies empty string for non-significant changes', () => {
|
|
75
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('empty string');
|
|
76
|
+
});
|
|
77
|
+
test('prompt emphasizes strict JSON output format', () => {
|
|
78
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('minified');
|
|
79
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('no preamble');
|
|
80
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('no markdown');
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('formatPrompt', () => {
|
|
84
|
+
const mockData = {
|
|
85
|
+
file_paths: ['src/auth.ts', 'src/user.ts', 'src/middleware/auth.ts'],
|
|
86
|
+
diff_content: `
|
|
87
|
+
diff --git a/src/auth.ts b/src/auth.ts
|
|
88
|
+
index 1234567..abcdefg 100644
|
|
89
|
+
--- a/src/auth.ts
|
|
90
|
+
+++ b/src/auth.ts
|
|
91
|
+
@@ -1,5 +1,10 @@
|
|
92
|
+
+import jwt from 'jsonwebtoken';
|
|
93
|
+
+
|
|
94
|
+
+export function authenticateUser(token: string) {
|
|
95
|
+
+ return jwt.verify(token, process.env.JWT_SECRET);
|
|
96
|
+
+}
|
|
97
|
+
`
|
|
98
|
+
};
|
|
99
|
+
test('replaces file_paths placeholder with formatted list', () => {
|
|
100
|
+
const formatted = (0, prompts_1.formatPrompt)(prompts_1.ANALYSIS_PROMPT_V1, mockData);
|
|
101
|
+
expect(formatted).not.toContain('{file_paths}');
|
|
102
|
+
expect(formatted).toContain('src/auth.ts');
|
|
103
|
+
expect(formatted).toContain('src/user.ts');
|
|
104
|
+
expect(formatted).toContain('src/middleware/auth.ts');
|
|
105
|
+
});
|
|
106
|
+
test('replaces diff_content placeholder with actual diff', () => {
|
|
107
|
+
const formatted = (0, prompts_1.formatPrompt)(prompts_1.ANALYSIS_PROMPT_V1, mockData);
|
|
108
|
+
expect(formatted).not.toContain('{diff_content}');
|
|
109
|
+
expect(formatted).toContain('diff --git');
|
|
110
|
+
expect(formatted).toContain('authenticateUser');
|
|
111
|
+
expect(formatted).toContain('jwt.verify');
|
|
112
|
+
});
|
|
113
|
+
test('handles empty file paths array', () => {
|
|
114
|
+
const emptyData = {
|
|
115
|
+
file_paths: [],
|
|
116
|
+
diff_content: mockData.diff_content
|
|
117
|
+
};
|
|
118
|
+
const formatted = (0, prompts_1.formatPrompt)(prompts_1.ANALYSIS_PROMPT_V1, emptyData);
|
|
119
|
+
expect(formatted).not.toContain('{file_paths}');
|
|
120
|
+
expect(formatted).toBeDefined();
|
|
121
|
+
});
|
|
122
|
+
test('handles empty diff content', () => {
|
|
123
|
+
const emptyDiff = {
|
|
124
|
+
file_paths: mockData.file_paths,
|
|
125
|
+
diff_content: ''
|
|
126
|
+
};
|
|
127
|
+
const formatted = (0, prompts_1.formatPrompt)(prompts_1.ANALYSIS_PROMPT_V1, emptyDiff);
|
|
128
|
+
expect(formatted).not.toContain('{diff_content}');
|
|
129
|
+
expect(formatted).toBeDefined();
|
|
130
|
+
});
|
|
131
|
+
test('preserves prompt structure and instructions', () => {
|
|
132
|
+
const formatted = (0, prompts_1.formatPrompt)(prompts_1.ANALYSIS_PROMPT_V1, mockData);
|
|
133
|
+
expect(formatted).toContain('architectural');
|
|
134
|
+
expect(formatted).toContain('significant');
|
|
135
|
+
expect(formatted).toContain('JSON');
|
|
136
|
+
});
|
|
137
|
+
test('formats multiple file paths readably', () => {
|
|
138
|
+
const manyFiles = {
|
|
139
|
+
file_paths: [
|
|
140
|
+
'src/auth/login.ts',
|
|
141
|
+
'src/auth/logout.ts',
|
|
142
|
+
'src/auth/session.ts',
|
|
143
|
+
'src/middleware/auth.ts',
|
|
144
|
+
'src/models/user.ts'
|
|
145
|
+
],
|
|
146
|
+
diff_content: mockData.diff_content
|
|
147
|
+
};
|
|
148
|
+
const formatted = (0, prompts_1.formatPrompt)(prompts_1.ANALYSIS_PROMPT_V1, manyFiles);
|
|
149
|
+
// Should list all files in a readable format
|
|
150
|
+
manyFiles.file_paths.forEach(filePath => {
|
|
151
|
+
expect(formatted).toContain(filePath);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
test('handles special characters in diff content', () => {
|
|
155
|
+
const specialChars = {
|
|
156
|
+
file_paths: ['src/test.ts'],
|
|
157
|
+
diff_content: `
|
|
158
|
+
diff --git a/src/test.ts b/src/test.ts
|
|
159
|
+
+const regex = /[a-z]+/gi;
|
|
160
|
+
+const template = \`Hello \${name}\`;
|
|
161
|
+
+const quote = "He said: \\"Hello\\"";
|
|
162
|
+
`
|
|
163
|
+
};
|
|
164
|
+
const formatted = (0, prompts_1.formatPrompt)(prompts_1.ANALYSIS_PROMPT_V1, specialChars);
|
|
165
|
+
expect(formatted).toContain('regex');
|
|
166
|
+
expect(formatted).toContain('template');
|
|
167
|
+
expect(formatted).toContain('quote');
|
|
168
|
+
});
|
|
169
|
+
test('returns valid prompt with all placeholders replaced', () => {
|
|
170
|
+
const formatted = (0, prompts_1.formatPrompt)(prompts_1.ANALYSIS_PROMPT_V1, mockData);
|
|
171
|
+
// Should not contain any unreplaced placeholders
|
|
172
|
+
expect(formatted).not.toMatch(/\{[a-z_]+\}/);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('Prompt Versioning', () => {
|
|
176
|
+
test('ANALYSIS_PROMPT_V1 is exported and accessible', () => {
|
|
177
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toBeDefined();
|
|
178
|
+
expect(typeof prompts_1.ANALYSIS_PROMPT_V1).toBe('string');
|
|
179
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1.length).toBeGreaterThan(0);
|
|
180
|
+
});
|
|
181
|
+
test('prompt version is clearly identifiable', () => {
|
|
182
|
+
// Future proofing: when V2 is added, we should be able to distinguish versions
|
|
183
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toBeDefined();
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('Prompt Quality', () => {
|
|
187
|
+
test('prompt is not empty or too short', () => {
|
|
188
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1.length).toBeGreaterThan(50);
|
|
189
|
+
});
|
|
190
|
+
test('prompt provides clear instructions', () => {
|
|
191
|
+
const prompt = prompts_1.ANALYSIS_PROMPT_V1.toLowerCase();
|
|
192
|
+
// Should have clear action words
|
|
193
|
+
expect(prompt.includes('analyze') ||
|
|
194
|
+
prompt.includes('determine') ||
|
|
195
|
+
prompt.includes('evaluate')).toBe(true);
|
|
196
|
+
});
|
|
197
|
+
test('prompt specifies expected output format', () => {
|
|
198
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('is_significant');
|
|
199
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toContain('reason');
|
|
200
|
+
// Should specify it's a boolean
|
|
201
|
+
const hasBoolean = prompts_1.ANALYSIS_PROMPT_V1.includes('boolean') ||
|
|
202
|
+
prompts_1.ANALYSIS_PROMPT_V1.includes('true') ||
|
|
203
|
+
prompts_1.ANALYSIS_PROMPT_V1.includes('false');
|
|
204
|
+
expect(hasBoolean).toBe(true);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('GENERATION_PROMPT_V1', () => {
|
|
208
|
+
test('prompt template includes required placeholders', () => {
|
|
209
|
+
expect(prompts_1.GENERATION_PROMPT_V1).toContain('{file_paths}');
|
|
210
|
+
expect(prompts_1.GENERATION_PROMPT_V1).toContain('{diff_content}');
|
|
211
|
+
expect(prompts_1.GENERATION_PROMPT_V1).toContain('{current_date}');
|
|
212
|
+
});
|
|
213
|
+
test('prompt includes MADR template structure', () => {
|
|
214
|
+
const prompt = prompts_1.GENERATION_PROMPT_V1.toLowerCase();
|
|
215
|
+
// Must mention MADR sections
|
|
216
|
+
expect(prompt).toContain('context and problem statement');
|
|
217
|
+
expect(prompt).toContain('decision drivers');
|
|
218
|
+
expect(prompt).toContain('considered options');
|
|
219
|
+
expect(prompt).toContain('decision outcome');
|
|
220
|
+
expect(prompt).toContain('consequences');
|
|
221
|
+
});
|
|
222
|
+
test('prompt specifies MADR format explicitly', () => {
|
|
223
|
+
expect(prompts_1.GENERATION_PROMPT_V1).toContain('MADR');
|
|
224
|
+
});
|
|
225
|
+
test('prompt includes all required MADR sections in template', () => {
|
|
226
|
+
const prompt = prompts_1.GENERATION_PROMPT_V1;
|
|
227
|
+
// Check for MADR section headings
|
|
228
|
+
expect(prompt).toContain('# ['); // Title format
|
|
229
|
+
expect(prompt).toContain('* Status:');
|
|
230
|
+
expect(prompt).toContain('* Date:');
|
|
231
|
+
expect(prompt).toContain('## Context and Problem Statement');
|
|
232
|
+
expect(prompt).toContain('## Decision Drivers');
|
|
233
|
+
expect(prompt).toContain('## Considered Options');
|
|
234
|
+
expect(prompt).toContain('## Decision Outcome');
|
|
235
|
+
expect(prompt).toContain('### Consequences');
|
|
236
|
+
expect(prompt).toContain('## More Information');
|
|
237
|
+
});
|
|
238
|
+
test('prompt instructs to use EXACT markdown structure', () => {
|
|
239
|
+
const prompt = prompts_1.GENERATION_PROMPT_V1.toUpperCase();
|
|
240
|
+
expect(prompt).toContain('EXACT');
|
|
241
|
+
});
|
|
242
|
+
test('prompt specifies response should be markdown only', () => {
|
|
243
|
+
const prompt = prompts_1.GENERATION_PROMPT_V1.toLowerCase();
|
|
244
|
+
expect(prompt).toContain('respond only');
|
|
245
|
+
expect(prompt).toContain('markdown');
|
|
246
|
+
});
|
|
247
|
+
test('prompt version is clearly identified', () => {
|
|
248
|
+
expect(prompts_1.GENERATION_PROMPT_V1).toBeDefined();
|
|
249
|
+
expect(typeof prompts_1.GENERATION_PROMPT_V1).toBe('string');
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
describe('formatGenerationPrompt', () => {
|
|
253
|
+
const mockData = {
|
|
254
|
+
file_paths: ['src/database.ts', 'src/config.ts'],
|
|
255
|
+
diff_content: `
|
|
256
|
+
diff --git a/src/database.ts b/src/database.ts
|
|
257
|
+
+import pg from 'pg';
|
|
258
|
+
+export const database = new pg.Pool();
|
|
259
|
+
`
|
|
260
|
+
};
|
|
261
|
+
test('replaces file_paths placeholder with formatted list', () => {
|
|
262
|
+
const formatted = (0, prompts_1.formatGenerationPrompt)(mockData);
|
|
263
|
+
expect(formatted).not.toContain('{file_paths}');
|
|
264
|
+
expect(formatted).toContain('src/database.ts');
|
|
265
|
+
expect(formatted).toContain('src/config.ts');
|
|
266
|
+
});
|
|
267
|
+
test('replaces diff_content placeholder with actual diff', () => {
|
|
268
|
+
const formatted = (0, prompts_1.formatGenerationPrompt)(mockData);
|
|
269
|
+
expect(formatted).not.toContain('{diff_content}');
|
|
270
|
+
expect(formatted).toContain('diff --git');
|
|
271
|
+
expect(formatted).toContain('pg.Pool');
|
|
272
|
+
});
|
|
273
|
+
test('replaces current_date placeholder with valid date', () => {
|
|
274
|
+
const formatted = (0, prompts_1.formatGenerationPrompt)(mockData);
|
|
275
|
+
expect(formatted).not.toContain('{current_date}');
|
|
276
|
+
// Check for YYYY-MM-DD format
|
|
277
|
+
expect(formatted).toMatch(/\d{4}-\d{2}-\d{2}/);
|
|
278
|
+
});
|
|
279
|
+
test('current date is today\'s date', () => {
|
|
280
|
+
const formatted = (0, prompts_1.formatGenerationPrompt)(mockData);
|
|
281
|
+
const today = new Date().toISOString().split('T')[0];
|
|
282
|
+
expect(formatted).toContain(today);
|
|
283
|
+
});
|
|
284
|
+
test('handles empty file paths array', () => {
|
|
285
|
+
const emptyData = {
|
|
286
|
+
file_paths: [],
|
|
287
|
+
diff_content: mockData.diff_content
|
|
288
|
+
};
|
|
289
|
+
const formatted = (0, prompts_1.formatGenerationPrompt)(emptyData);
|
|
290
|
+
expect(formatted).not.toContain('{file_paths}');
|
|
291
|
+
expect(formatted).toBeDefined();
|
|
292
|
+
});
|
|
293
|
+
test('preserves MADR template structure', () => {
|
|
294
|
+
const formatted = (0, prompts_1.formatGenerationPrompt)(mockData);
|
|
295
|
+
expect(formatted).toContain('Context and Problem Statement');
|
|
296
|
+
expect(formatted).toContain('Decision Drivers');
|
|
297
|
+
expect(formatted).toContain('Considered Options');
|
|
298
|
+
expect(formatted).toContain('Decision Outcome');
|
|
299
|
+
expect(formatted).toContain('Consequences');
|
|
300
|
+
});
|
|
301
|
+
test('returns valid prompt with all placeholders replaced', () => {
|
|
302
|
+
const formatted = (0, prompts_1.formatGenerationPrompt)(mockData);
|
|
303
|
+
// Should not contain any unreplaced placeholders
|
|
304
|
+
expect(formatted).not.toMatch(/\{[a-z_]+\}/);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
describe('promptForGeneration', () => {
|
|
308
|
+
let mockReadlineInterface;
|
|
309
|
+
beforeEach(() => {
|
|
310
|
+
// Reset mocks
|
|
311
|
+
jest.clearAllMocks();
|
|
312
|
+
// Setup mock readline interface
|
|
313
|
+
mockReadlineInterface = {
|
|
314
|
+
question: jest.fn(),
|
|
315
|
+
close: jest.fn()
|
|
316
|
+
};
|
|
317
|
+
readline.createInterface.mockReturnValue(mockReadlineInterface);
|
|
318
|
+
});
|
|
319
|
+
test('returns true for empty input (ENTER pressed)', async () => {
|
|
320
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
321
|
+
callback(''); // Simulate pressing ENTER
|
|
322
|
+
});
|
|
323
|
+
const result = await (0, prompts_1.promptForGeneration)('Test reason');
|
|
324
|
+
expect(result).toBe(true);
|
|
325
|
+
expect(mockReadlineInterface.close).toHaveBeenCalled();
|
|
326
|
+
});
|
|
327
|
+
test('returns true for "yes" input', async () => {
|
|
328
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
329
|
+
callback('yes');
|
|
330
|
+
});
|
|
331
|
+
const result = await (0, prompts_1.promptForGeneration)('Test reason');
|
|
332
|
+
expect(result).toBe(true);
|
|
333
|
+
});
|
|
334
|
+
test('returns true for "y" input', async () => {
|
|
335
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
336
|
+
callback('y');
|
|
337
|
+
});
|
|
338
|
+
const result = await (0, prompts_1.promptForGeneration)('Test reason');
|
|
339
|
+
expect(result).toBe(true);
|
|
340
|
+
});
|
|
341
|
+
test('returns true for "YES" input (case insensitive)', async () => {
|
|
342
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
343
|
+
callback('YES');
|
|
344
|
+
});
|
|
345
|
+
const result = await (0, prompts_1.promptForGeneration)('Test reason');
|
|
346
|
+
expect(result).toBe(true);
|
|
347
|
+
});
|
|
348
|
+
test('returns true for "Y" input (case insensitive)', async () => {
|
|
349
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
350
|
+
callback('Y');
|
|
351
|
+
});
|
|
352
|
+
const result = await (0, prompts_1.promptForGeneration)('Test reason');
|
|
353
|
+
expect(result).toBe(true);
|
|
354
|
+
});
|
|
355
|
+
test('returns false for "no" input', async () => {
|
|
356
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
357
|
+
callback('no');
|
|
358
|
+
});
|
|
359
|
+
const result = await (0, prompts_1.promptForGeneration)('Test reason');
|
|
360
|
+
expect(result).toBe(false);
|
|
361
|
+
});
|
|
362
|
+
test('returns false for "n" input', async () => {
|
|
363
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
364
|
+
callback('n');
|
|
365
|
+
});
|
|
366
|
+
const result = await (0, prompts_1.promptForGeneration)('Test reason');
|
|
367
|
+
expect(result).toBe(false);
|
|
368
|
+
});
|
|
369
|
+
test('returns false for any other input', async () => {
|
|
370
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
371
|
+
callback('maybe');
|
|
372
|
+
});
|
|
373
|
+
const result = await (0, prompts_1.promptForGeneration)('Test reason');
|
|
374
|
+
expect(result).toBe(false);
|
|
375
|
+
});
|
|
376
|
+
test('handles whitespace in input', async () => {
|
|
377
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
378
|
+
callback(' yes ');
|
|
379
|
+
});
|
|
380
|
+
const result = await (0, prompts_1.promptForGeneration)('Test reason');
|
|
381
|
+
expect(result).toBe(true);
|
|
382
|
+
});
|
|
383
|
+
test('displays the reason in the prompt', async () => {
|
|
384
|
+
const reason = 'Introduces PostgreSQL as primary datastore';
|
|
385
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
386
|
+
callback('yes');
|
|
387
|
+
});
|
|
388
|
+
await (0, prompts_1.promptForGeneration)(reason);
|
|
389
|
+
// Check that question was called
|
|
390
|
+
expect(mockReadlineInterface.question).toHaveBeenCalled();
|
|
391
|
+
});
|
|
392
|
+
test('closes readline interface after response', async () => {
|
|
393
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
394
|
+
callback('yes');
|
|
395
|
+
});
|
|
396
|
+
await (0, prompts_1.promptForGeneration)('Test reason');
|
|
397
|
+
expect(mockReadlineInterface.close).toHaveBeenCalledTimes(1);
|
|
398
|
+
});
|
|
399
|
+
test('creates readline interface with stdin and stdout', async () => {
|
|
400
|
+
mockReadlineInterface.question.mockImplementation((question, callback) => {
|
|
401
|
+
callback('yes');
|
|
402
|
+
});
|
|
403
|
+
await (0, prompts_1.promptForGeneration)('Test reason');
|
|
404
|
+
expect(readline.createInterface).toHaveBeenCalledWith({
|
|
405
|
+
input: process.stdin,
|
|
406
|
+
output: process.stdout
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
describe('Generation Prompt Quality', () => {
|
|
411
|
+
test('generation prompt is substantial', () => {
|
|
412
|
+
expect(prompts_1.GENERATION_PROMPT_V1.length).toBeGreaterThan(200);
|
|
413
|
+
});
|
|
414
|
+
test('generation prompt provides clear instructions', () => {
|
|
415
|
+
const prompt = prompts_1.GENERATION_PROMPT_V1.toLowerCase();
|
|
416
|
+
expect(prompt.includes('generate') ||
|
|
417
|
+
prompt.includes('write') ||
|
|
418
|
+
prompt.includes('create')).toBe(true);
|
|
419
|
+
});
|
|
420
|
+
test('both prompts are exported and distinct', () => {
|
|
421
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).toBeDefined();
|
|
422
|
+
expect(prompts_1.GENERATION_PROMPT_V1).toBeDefined();
|
|
423
|
+
expect(prompts_1.ANALYSIS_PROMPT_V1).not.toBe(prompts_1.GENERATION_PROMPT_V1);
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
//# sourceMappingURL=prompts.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../src/prompts.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAkD,MAAM,SAAS,CAAC;AAEtF,eAAO,MAAM,cAAc,EAAE,WAqC5B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.geminiProvider = void 0;
|
|
4
|
+
const generative_ai_1 = require("@google/generative-ai");
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
exports.geminiProvider = {
|
|
7
|
+
name: 'gemini',
|
|
8
|
+
async analyze(prompt, options) {
|
|
9
|
+
const genAI = new generative_ai_1.GoogleGenerativeAI(options.apiKey);
|
|
10
|
+
const model = genAI.getGenerativeModel({
|
|
11
|
+
model: options.model,
|
|
12
|
+
systemInstruction: 'You are an expert software architect analyzing code changes.',
|
|
13
|
+
});
|
|
14
|
+
const generatePromise = model.generateContent({
|
|
15
|
+
contents: [
|
|
16
|
+
{
|
|
17
|
+
role: 'user',
|
|
18
|
+
parts: [{ text: prompt }],
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
generationConfig: {
|
|
22
|
+
temperature: 0.3,
|
|
23
|
+
maxOutputTokens: types_1.DEFAULT_MAX_OUTPUT_TOKENS,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
27
|
+
const timer = setTimeout(() => {
|
|
28
|
+
const err = new Error('Request timeout');
|
|
29
|
+
err.code = 'ETIMEDOUT';
|
|
30
|
+
reject(err);
|
|
31
|
+
}, options.timeoutMs);
|
|
32
|
+
generatePromise.finally(() => clearTimeout(timer));
|
|
33
|
+
});
|
|
34
|
+
const result = (await Promise.race([generatePromise, timeoutPromise]));
|
|
35
|
+
const text = result?.response?.text?.();
|
|
36
|
+
return typeof text === 'string' ? text : undefined;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":";;;AAAA,yDAA2D;AAC3D,mCAAsF;AAEzE,QAAA,cAAc,GAAgB;IACzC,IAAI,EAAE,QAAQ;IACd,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAA4B;QACxD,MAAM,KAAK,GAAG,IAAI,kCAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,iBAAiB,EAAE,8DAA8D;SAClF,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;YAC5C,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iBAC1B;aACF;YACD,gBAAgB,EAAE;gBAChB,WAAW,EAAE,GAAG;gBAChB,eAAe,EAAE,iCAAyB;aAC3C;SACF,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAA6B,CAAC;gBACrE,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC;gBACvB,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,eAA+C,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAEpE,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QACxC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACrD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getProvider = void 0;
|
|
4
|
+
var registry_1 = require("./registry");
|
|
5
|
+
Object.defineProperty(exports, "getProvider", { enumerable: true, get: function () { return registry_1.getProvider; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;;AAAA,uCAAyC;AAAhC,uGAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAkD,MAAM,SAAS,CAAC;AAEtF,eAAO,MAAM,cAAc,EAAE,WAkB5B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.openAIProvider = void 0;
|
|
7
|
+
const openai_1 = __importDefault(require("openai"));
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
exports.openAIProvider = {
|
|
10
|
+
name: 'openai',
|
|
11
|
+
async analyze(prompt, options) {
|
|
12
|
+
const client = new openai_1.default({ apiKey: options.apiKey, timeout: options.timeoutMs });
|
|
13
|
+
const completion = await client.chat.completions.create({
|
|
14
|
+
model: options.model,
|
|
15
|
+
messages: [
|
|
16
|
+
{ role: 'system', content: 'You are an expert software architect analyzing code changes.' },
|
|
17
|
+
{ role: 'user', content: prompt },
|
|
18
|
+
],
|
|
19
|
+
temperature: 0.3,
|
|
20
|
+
max_tokens: types_1.DEFAULT_MAX_OUTPUT_TOKENS,
|
|
21
|
+
}, { timeout: options.timeoutMs });
|
|
22
|
+
return completion.choices[0]?.message?.content ?? undefined;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,mCAAsF;AAEzE,QAAA,cAAc,GAAgB;IACzC,IAAI,EAAE,QAAQ;IACd,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAA4B;QACxD,MAAM,MAAM,GAAG,IAAI,gBAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CACrD;YACE,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,8DAA8D,EAAE;gBAC3F,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;aAClC;YACD,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,iCAAyB;SACtC,EACD,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,CAC/B,CAAC;QACF,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS,CAAC;IAC9D,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAItC,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CASlE;AAED,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getProvider = getProvider;
|
|
4
|
+
const openai_1 = require("./openai");
|
|
5
|
+
const gemini_1 = require("./gemini");
|
|
6
|
+
function getProvider(name) {
|
|
7
|
+
switch (name) {
|
|
8
|
+
case 'openai':
|
|
9
|
+
return openai_1.openAIProvider;
|
|
10
|
+
case 'gemini':
|
|
11
|
+
return gemini_1.geminiProvider;
|
|
12
|
+
default:
|
|
13
|
+
throw new Error(`Unsupported provider: ${name}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":";;AAIA,kCASC;AAZD,qCAA0C;AAC1C,qCAA0C;AAE1C,SAAgB,WAAW,CAAC,IAAyB;IACnD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,uBAAc,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,uBAAc,CAAC;QACxB;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAc,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AnalysisConfig } from '../config';
|
|
2
|
+
export declare const DEFAULT_MAX_OUTPUT_TOKENS = 4096;
|
|
3
|
+
export interface ProviderCallOptions {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
model: string;
|
|
6
|
+
timeoutMs: number;
|
|
7
|
+
}
|
|
8
|
+
export interface LLMProvider {
|
|
9
|
+
readonly name: AnalysisConfig['provider'];
|
|
10
|
+
analyze(prompt: string, options: ProviderCallOptions): Promise<string | undefined>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACpF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":";;;AAEa,QAAA,yBAAyB,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.test.d.ts","sourceRoot":"","sources":["../src/version.test.ts"],"names":[],"mappings":"AACA,QAAA,MAAM,YAAY,UAAU,CAAC;AAC7B,QAAA,MAAM,WAAW,UAAU,CAAC"}
|