cadr-cli 2.0.0 → 2.0.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 (153) hide show
  1. package/dist/adr/adr.d.ts +17 -0
  2. package/dist/adr/adr.d.ts.map +1 -0
  3. package/dist/{adr.js → adr/adr.js} +4 -44
  4. package/dist/adr/adr.js.map +1 -0
  5. package/dist/adr/adr.test.d.ts +5 -0
  6. package/dist/{adr.test.d.ts.map → adr/adr.test.d.ts.map} +1 -1
  7. package/dist/{adr.test.js → adr/adr.test.js} +0 -14
  8. package/dist/adr/adr.test.js.map +1 -0
  9. package/dist/adr/index.d.ts +2 -0
  10. package/dist/adr/index.d.ts.map +1 -0
  11. package/dist/adr/index.js +18 -0
  12. package/dist/adr/index.js.map +1 -0
  13. package/dist/analysis/analysis.orchestrator.d.ts +14 -0
  14. package/dist/analysis/analysis.orchestrator.d.ts.map +1 -0
  15. package/dist/analysis/analysis.orchestrator.js +175 -0
  16. package/dist/analysis/analysis.orchestrator.js.map +1 -0
  17. package/dist/analysis/analysis.orchestrator.test.d.ts +2 -0
  18. package/dist/analysis/analysis.orchestrator.test.d.ts.map +1 -0
  19. package/dist/analysis/analysis.orchestrator.test.js +177 -0
  20. package/dist/analysis/analysis.orchestrator.test.js.map +1 -0
  21. package/dist/analysis/strategies/git-strategy.d.ts +22 -0
  22. package/dist/analysis/strategies/git-strategy.d.ts.map +1 -0
  23. package/dist/analysis/strategies/git-strategy.js +114 -0
  24. package/dist/analysis/strategies/git-strategy.js.map +1 -0
  25. package/dist/analysis/strategies/git-strategy.test.d.ts +2 -0
  26. package/dist/analysis/strategies/git-strategy.test.d.ts.map +1 -0
  27. package/dist/analysis/strategies/git-strategy.test.js +147 -0
  28. package/dist/analysis/strategies/git-strategy.test.js.map +1 -0
  29. package/dist/commands/analyze.js +3 -3
  30. package/dist/commands/analyze.js.map +1 -1
  31. package/dist/commands/analyze.test.d.ts +2 -0
  32. package/dist/commands/analyze.test.d.ts.map +1 -0
  33. package/dist/commands/analyze.test.js +70 -0
  34. package/dist/commands/analyze.test.js.map +1 -0
  35. package/dist/commands/init.test.js +128 -2
  36. package/dist/commands/init.test.js.map +1 -1
  37. package/dist/config.test.js +167 -0
  38. package/dist/config.test.js.map +1 -1
  39. package/dist/git/git.errors.d.ts +6 -0
  40. package/dist/git/git.errors.d.ts.map +1 -0
  41. package/dist/git/git.errors.js +15 -0
  42. package/dist/git/git.errors.js.map +1 -0
  43. package/dist/git/git.errors.test.d.ts +2 -0
  44. package/dist/git/git.errors.test.d.ts.map +1 -0
  45. package/dist/git/git.errors.test.js +34 -0
  46. package/dist/git/git.errors.test.js.map +1 -0
  47. package/dist/git/git.operations.d.ts +12 -0
  48. package/dist/git/git.operations.d.ts.map +1 -0
  49. package/dist/git/git.operations.js +64 -0
  50. package/dist/git/git.operations.js.map +1 -0
  51. package/dist/git/git.operations.test.d.ts +2 -0
  52. package/dist/git/git.operations.test.d.ts.map +1 -0
  53. package/dist/git/git.operations.test.js +164 -0
  54. package/dist/git/git.operations.test.js.map +1 -0
  55. package/dist/git/index.d.ts +4 -0
  56. package/dist/git/index.d.ts.map +1 -0
  57. package/dist/git/index.js +19 -0
  58. package/dist/git/index.js.map +1 -0
  59. package/dist/llm/index.d.ts +3 -0
  60. package/dist/llm/index.d.ts.map +1 -0
  61. package/dist/llm/index.js +19 -0
  62. package/dist/llm/index.js.map +1 -0
  63. package/dist/llm/llm.d.ts +35 -0
  64. package/dist/llm/llm.d.ts.map +1 -0
  65. package/dist/{llm.js → llm/llm.js} +16 -58
  66. package/dist/llm/llm.js.map +1 -0
  67. package/dist/{llm.test.d.ts.map → llm/llm.test.d.ts.map} +1 -1
  68. package/dist/llm/llm.test.js +224 -0
  69. package/dist/llm/llm.test.js.map +1 -0
  70. package/dist/{prompts.d.ts → llm/prompts.d.ts} +1 -38
  71. package/dist/llm/prompts.d.ts.map +1 -0
  72. package/dist/{prompts.js → llm/prompts.js} +9 -54
  73. package/dist/llm/prompts.js.map +1 -0
  74. package/dist/llm/response-parser.d.ts +9 -0
  75. package/dist/llm/response-parser.d.ts.map +1 -0
  76. package/dist/llm/response-parser.js +67 -0
  77. package/dist/llm/response-parser.js.map +1 -0
  78. package/dist/llm/response-parser.test.d.ts +2 -0
  79. package/dist/llm/response-parser.test.d.ts.map +1 -0
  80. package/dist/llm/response-parser.test.js +134 -0
  81. package/dist/llm/response-parser.test.js.map +1 -0
  82. package/dist/presenters/console-presenter.d.ts +35 -0
  83. package/dist/presenters/console-presenter.d.ts.map +1 -0
  84. package/dist/presenters/console-presenter.js +114 -0
  85. package/dist/presenters/console-presenter.js.map +1 -0
  86. package/dist/presenters/console-presenter.test.d.ts +2 -0
  87. package/dist/presenters/console-presenter.test.d.ts.map +1 -0
  88. package/dist/presenters/console-presenter.test.js +227 -0
  89. package/dist/presenters/console-presenter.test.js.map +1 -0
  90. package/dist/version.test.d.ts +1 -2
  91. package/dist/version.test.d.ts.map +1 -1
  92. package/dist/version.test.js +29 -16
  93. package/dist/version.test.js.map +1 -1
  94. package/package.json +1 -1
  95. package/src/{adr.test.ts → adr/adr.test.ts} +10 -23
  96. package/src/{adr.ts → adr/adr.ts} +7 -48
  97. package/src/adr/index.ts +1 -0
  98. package/src/analysis/analysis.orchestrator.test.ts +237 -0
  99. package/src/analysis/analysis.orchestrator.ts +175 -0
  100. package/src/analysis/strategies/git-strategy.test.ts +210 -0
  101. package/src/analysis/strategies/git-strategy.ts +106 -0
  102. package/src/commands/analyze.test.ts +91 -0
  103. package/src/commands/analyze.ts +8 -9
  104. package/src/commands/init.test.ts +200 -5
  105. package/src/config.test.ts +232 -2
  106. package/src/git/git.errors.test.ts +43 -0
  107. package/src/git/git.errors.ts +10 -0
  108. package/src/git/git.operations.test.ts +222 -0
  109. package/src/git/git.operations.ts +85 -0
  110. package/src/git/index.ts +3 -0
  111. package/src/llm/index.ts +2 -0
  112. package/src/llm/llm.test.ts +315 -0
  113. package/src/{llm.ts → llm/llm.ts} +46 -107
  114. package/src/{prompts.ts → llm/prompts.ts} +30 -72
  115. package/src/llm/response-parser.test.ts +170 -0
  116. package/src/llm/response-parser.ts +90 -0
  117. package/src/presenters/console-presenter.test.ts +259 -0
  118. package/src/presenters/console-presenter.ts +152 -0
  119. package/src/version.test.ts +30 -16
  120. package/dist/adr.d.ts +0 -50
  121. package/dist/adr.d.ts.map +0 -1
  122. package/dist/adr.js.map +0 -1
  123. package/dist/adr.test.d.ts +0 -8
  124. package/dist/adr.test.js.map +0 -1
  125. package/dist/analysis.d.ts +0 -24
  126. package/dist/analysis.d.ts.map +0 -1
  127. package/dist/analysis.js +0 -281
  128. package/dist/analysis.js.map +0 -1
  129. package/dist/analysis.test.d.ts +0 -8
  130. package/dist/analysis.test.d.ts.map +0 -1
  131. package/dist/analysis.test.js +0 -351
  132. package/dist/analysis.test.js.map +0 -1
  133. package/dist/git.d.ts +0 -54
  134. package/dist/git.d.ts.map +0 -1
  135. package/dist/git.js +0 -204
  136. package/dist/git.js.map +0 -1
  137. package/dist/llm.d.ts +0 -73
  138. package/dist/llm.d.ts.map +0 -1
  139. package/dist/llm.js.map +0 -1
  140. package/dist/llm.test.js +0 -592
  141. package/dist/llm.test.js.map +0 -1
  142. package/dist/prompts.d.ts.map +0 -1
  143. package/dist/prompts.js.map +0 -1
  144. package/dist/prompts.test.d.ts +0 -2
  145. package/dist/prompts.test.d.ts.map +0 -1
  146. package/dist/prompts.test.js +0 -427
  147. package/dist/prompts.test.js.map +0 -1
  148. package/src/analysis.test.ts +0 -396
  149. package/src/analysis.ts +0 -262
  150. package/src/git.ts +0 -300
  151. package/src/llm.test.ts +0 -701
  152. package/src/prompts.test.ts +0 -515
  153. /package/dist/{llm.test.d.ts → llm/llm.test.d.ts} +0 -0
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ jest.mock('../providers', () => ({
4
+ getProvider: jest.fn(),
5
+ }));
6
+ jest.mock('../logger', () => ({
7
+ loggerInstance: {
8
+ info: jest.fn(),
9
+ warn: jest.fn(),
10
+ error: jest.fn(),
11
+ debug: jest.fn(),
12
+ },
13
+ }));
14
+ const providers_1 = require("../providers");
15
+ const logger_1 = require("../logger");
16
+ const llm_1 = require("./llm");
17
+ const mockedGetProvider = providers_1.getProvider;
18
+ const mockedLogger = logger_1.loggerInstance;
19
+ const config = {
20
+ provider: 'openai',
21
+ analysis_model: 'gpt-4',
22
+ api_key_env: 'TEST_API_KEY',
23
+ timeout_seconds: 15,
24
+ };
25
+ const baseAnalysisRequest = {
26
+ file_paths: ['src/index.ts'],
27
+ diff_content: 'diff --git a/src/index.ts',
28
+ repository_context: 'test repo',
29
+ analysis_prompt: 'Analyze these changes',
30
+ };
31
+ const baseGenerationRequest = {
32
+ file_paths: ['src/index.ts'],
33
+ diff_content: 'diff --git a/src/index.ts',
34
+ reason: 'significant architectural change',
35
+ generation_prompt: 'Generate ADR for these changes',
36
+ };
37
+ function createMockProvider(analyzeFn) {
38
+ return {
39
+ name: 'openai',
40
+ analyze: analyzeFn,
41
+ };
42
+ }
43
+ beforeEach(() => {
44
+ jest.clearAllMocks();
45
+ process.env.TEST_API_KEY = 'test-key';
46
+ });
47
+ afterEach(() => {
48
+ delete process.env.TEST_API_KEY;
49
+ jest.restoreAllMocks();
50
+ });
51
+ describe('analyzeChanges', () => {
52
+ it('should return error when API key is not set', async () => {
53
+ delete process.env.TEST_API_KEY;
54
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
55
+ expect(response.result).toBeNull();
56
+ expect(response.error).toContain('TEST_API_KEY');
57
+ });
58
+ it('should return successful result when provider returns clean JSON', async () => {
59
+ const mockAnalyze = jest.fn().mockResolvedValue(JSON.stringify({ is_significant: true, reason: 'big' }));
60
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
61
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
62
+ expect(response.result).not.toBeNull();
63
+ expect(response.result.is_significant).toBe(true);
64
+ expect(response.result.reason).toBe('big');
65
+ expect(response.result.timestamp).toBeDefined();
66
+ expect(response.error).toBeUndefined();
67
+ });
68
+ it('should parse JSON wrapped in a code block', async () => {
69
+ const mockAnalyze = jest.fn().mockResolvedValue('```json\n{"is_significant": true, "reason": "refactored"}\n```');
70
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
71
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
72
+ expect(response.result).not.toBeNull();
73
+ expect(response.result.is_significant).toBe(true);
74
+ expect(response.result.reason).toBe('refactored');
75
+ });
76
+ it('should return error when provider returns undefined', async () => {
77
+ const mockAnalyze = jest.fn().mockResolvedValue(undefined);
78
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
79
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
80
+ expect(response.result).toBeNull();
81
+ expect(response.error).toBe('No response content from LLM');
82
+ });
83
+ it('should return error when provider returns invalid JSON', async () => {
84
+ const mockAnalyze = jest.fn().mockResolvedValue('not valid json at all');
85
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
86
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
87
+ expect(response.result).toBeNull();
88
+ expect(response.error).toContain('Failed to parse LLM response as JSON');
89
+ });
90
+ it('should return error when is_significant is not a boolean', async () => {
91
+ const mockAnalyze = jest.fn().mockResolvedValue(JSON.stringify({ is_significant: 'yes', reason: 'something' }));
92
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
93
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
94
+ expect(response.result).toBeNull();
95
+ expect(response.error).toContain('Invalid response format');
96
+ });
97
+ it('should return error when is_significant is true but reason is empty', async () => {
98
+ const mockAnalyze = jest.fn().mockResolvedValue(JSON.stringify({ is_significant: true, reason: '' }));
99
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
100
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
101
+ expect(response.result).toBeNull();
102
+ expect(response.error).toContain('no reason');
103
+ });
104
+ it('should include confidence when value is within valid range', async () => {
105
+ const mockAnalyze = jest.fn().mockResolvedValue(JSON.stringify({ is_significant: true, reason: 'big change', confidence: 0.85 }));
106
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
107
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
108
+ expect(response.result).not.toBeNull();
109
+ expect(response.result.confidence).toBe(0.85);
110
+ });
111
+ it('should not include confidence when value is out of range', async () => {
112
+ const mockAnalyze = jest.fn().mockResolvedValue(JSON.stringify({ is_significant: true, reason: 'big change', confidence: 1.5 }));
113
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
114
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
115
+ expect(response.result).not.toBeNull();
116
+ expect(response.result.confidence).toBeUndefined();
117
+ });
118
+ it('should log warning when estimated tokens exceed 7000', async () => {
119
+ const longPrompt = 'x'.repeat(28004);
120
+ const mockAnalyze = jest.fn().mockResolvedValue(JSON.stringify({ is_significant: false, reason: 'minor' }));
121
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
122
+ const request = { ...baseAnalysisRequest, analysis_prompt: longPrompt };
123
+ await (0, llm_1.analyzeChanges)(config, request);
124
+ expect(mockedLogger.warn).toHaveBeenCalledWith('High token count detected', expect.objectContaining({ estimated_tokens: expect.any(Number) }));
125
+ });
126
+ it('should return auth error when provider throws with status 401', async () => {
127
+ const mockAnalyze = jest.fn().mockRejectedValue({ status: 401, message: 'Unauthorized' });
128
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
129
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
130
+ expect(response.result).toBeNull();
131
+ expect(response.error).toContain('Invalid API key');
132
+ });
133
+ it('should return diff-too-large error when provider throws status 400 with context length message', async () => {
134
+ const mockAnalyze = jest.fn().mockRejectedValue({
135
+ status: 400,
136
+ message: 'maximum context length exceeded with 50000 tokens',
137
+ });
138
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
139
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
140
+ expect(response.result).toBeNull();
141
+ expect(response.error).toContain('Diff too large');
142
+ });
143
+ it('should return rate limit error when provider throws with status 429', async () => {
144
+ const mockAnalyze = jest.fn().mockRejectedValue({ status: 429, message: 'Too many requests' });
145
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
146
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
147
+ expect(response.result).toBeNull();
148
+ expect(response.error).toContain('Rate limit exceeded');
149
+ });
150
+ it('should return timeout error when provider throws with code ETIMEDOUT', async () => {
151
+ const mockAnalyze = jest.fn().mockRejectedValue({ code: 'ETIMEDOUT', message: 'connection timed out' });
152
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
153
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
154
+ expect(response.result).toBeNull();
155
+ expect(response.error).toContain('timeout');
156
+ expect(response.error).toContain('15s');
157
+ });
158
+ it('should return timeout error when provider throws with timeout in message', async () => {
159
+ const mockAnalyze = jest.fn().mockRejectedValue({ message: 'Request timeout after 15000ms' });
160
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
161
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
162
+ expect(response.result).toBeNull();
163
+ expect(response.error).toContain('timeout');
164
+ });
165
+ it('should return network error when provider throws with code ENOTFOUND', async () => {
166
+ const mockAnalyze = jest.fn().mockRejectedValue({ code: 'ENOTFOUND', message: 'getaddrinfo ENOTFOUND' });
167
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
168
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
169
+ expect(response.result).toBeNull();
170
+ expect(response.error).toContain('Network error');
171
+ });
172
+ it('should return generic API error for unknown errors', async () => {
173
+ const mockAnalyze = jest.fn().mockRejectedValue({ message: 'Something unexpected' });
174
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
175
+ const response = await (0, llm_1.analyzeChanges)(config, baseAnalysisRequest);
176
+ expect(response.result).toBeNull();
177
+ expect(response.error).toBe('API error: Something unexpected');
178
+ });
179
+ });
180
+ describe('generateADRContent', () => {
181
+ it('should return error when API key is not set', async () => {
182
+ delete process.env.TEST_API_KEY;
183
+ const response = await (0, llm_1.generateADRContent)(config, baseGenerationRequest);
184
+ expect(response.result).toBeNull();
185
+ expect(response.error).toContain('TEST_API_KEY');
186
+ });
187
+ it('should extract title from markdown h1 and return cleaned content', async () => {
188
+ const markdown = '# Adopt New Database\n\n## Context\nWe need a new DB.';
189
+ const mockAnalyze = jest.fn().mockResolvedValue(markdown);
190
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
191
+ const response = await (0, llm_1.generateADRContent)(config, baseGenerationRequest);
192
+ expect(response.result).not.toBeNull();
193
+ expect(response.result.title).toBe('Adopt New Database');
194
+ expect(response.result.content).toBe(markdown);
195
+ expect(response.result.timestamp).toBeDefined();
196
+ expect(response.error).toBeUndefined();
197
+ });
198
+ it('should strip code block wrapper from markdown response', async () => {
199
+ const inner = '# My Decision\n\n## Context\nSome context.';
200
+ const wrapped = '```markdown\n' + inner + '\n```';
201
+ const mockAnalyze = jest.fn().mockResolvedValue(wrapped);
202
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
203
+ const response = await (0, llm_1.generateADRContent)(config, baseGenerationRequest);
204
+ expect(response.result).not.toBeNull();
205
+ expect(response.result.title).toBe('My Decision');
206
+ expect(response.result.content).toBe(inner);
207
+ });
208
+ it('should use Untitled Decision when markdown has no h1', async () => {
209
+ const markdown = '## Context\nSome context without a title.';
210
+ const mockAnalyze = jest.fn().mockResolvedValue(markdown);
211
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
212
+ const response = await (0, llm_1.generateADRContent)(config, baseGenerationRequest);
213
+ expect(response.result).not.toBeNull();
214
+ expect(response.result.title).toBe('Untitled Decision');
215
+ });
216
+ it('should return auth error when provider throws with status 401', async () => {
217
+ const mockAnalyze = jest.fn().mockRejectedValue({ status: 401, message: 'Unauthorized' });
218
+ mockedGetProvider.mockReturnValue(createMockProvider(mockAnalyze));
219
+ const response = await (0, llm_1.generateADRContent)(config, baseGenerationRequest);
220
+ expect(response.result).toBeNull();
221
+ expect(response.error).toContain('Invalid API key');
222
+ });
223
+ });
224
+ //# sourceMappingURL=llm.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.test.js","sourceRoot":"","sources":["../../src/llm/llm.test.ts"],"names":[],"mappings":"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"}
@@ -1,49 +1,12 @@
1
- /**
2
- * Prompts Module
3
- *
4
- * Contains versioned prompt templates for LLM analysis and ADR generation.
5
- * Follows the constitution requirement for versioned prompts.
6
- */
7
- /**
8
- * Version 1 of the analysis prompt template.
9
- *
10
- * This prompt is designed to analyze code changes for architectural significance.
11
- * It uses specific criteria for determining significance and enforces strict JSON output.
12
- */
13
1
  export declare const ANALYSIS_PROMPT_V1 = "\nYou are an expert principal engineer and software architect acting as a meticulous code reviewer. Your sole task is to determine if the provided git diff represents an architecturally significant change that warrants an Architectural Decision Record (ADR).\n\nGiven the following staged changes:\n{file_paths}\n\nDiff content:\n{diff_content}\n\nA change is considered architecturally significant if it:\n- Introduces a new external dependency, library, or service.\n- Adds, removes, or modifies infrastructure components (e.g., databases, caches, queues, Docker services).\n- Changes a public API contract, a data schema, or a critical data model.\n- Alters authentication, authorization, or other core security patterns.\n- Modifies cross-cutting concerns like logging, observability, or CI/CD pipelines.\n\nRespond ONLY with a single, minified JSON object with no preamble, no markdown, and no additional text. The JSON object must adhere to the following schema:\n{\"is_significant\": boolean, \"reason\": string}\n\nThe \"reason\" should be a concise, one-sentence explanation for your decision, suitable for showing to a developer. If the change is not significant, the reason should be an empty string.\n";
14
- /**
15
- * Formats a prompt template by replacing placeholders with actual data.
16
- *
17
- * @param template - The prompt template with placeholders
18
- * @param data - Object containing file_paths and diff_content
19
- * @returns Formatted prompt with placeholders replaced
20
- */
2
+ export declare const GENERATION_PROMPT_V1 = "\nYou are an expert software architect. Your task is to write a comprehensive Architectural Decision Record (ADR) following the MADR (Markdown Architectural Decision Records) template.\n\nGiven the following code changes:\n{file_paths}\n\nDiff content:\n{diff_content}\n\nGenerate an ADR that follows this EXACT structure:\n\n# [Short title of solved problem and solution]\n\n* Status: [proposed | rejected | accepted | deprecated | superseded by [ADR-0005](0005-example.md)]\n* Date: {current_date}\n\n## Context and Problem Statement\n\n[Describe the context and problem statement in 2-3 sentences. What is the issue that we're addressing?]\n\n## Decision Drivers\n\n* [decision driver 1, e.g., a force, constraint, requirement]\n* [decision driver 2]\n* [etc.]\n\n## Considered Options\n\n* [option 1]\n* [option 2]\n* [option 3]\n\n## Decision Outcome\n\nChosen option: \"[option 1]\", because [justification. e.g., only option which meets KO criterion decision driver | which resolves force 1 | etc.].\n\n### Consequences\n\n* Good, because [positive consequence 1]\n* Good, because [positive consequence 2]\n* Bad, because [negative consequence 1]\n* Bad, because [negative consequence 2]\n\n## More Information\n\n[Any additional context, links to related discussions, or implementation notes]\n\nIMPORTANT INSTRUCTIONS:\n1. Use the EXACT markdown structure shown above\n2. Set Status to \"accepted\" (since this change is being committed)\n3. The title should be concise, action-oriented, and describe the decision made\n4. Keep Context and Problem Statement brief but clear (2-4 sentences)\n5. List at least 2-3 decision drivers that influenced this choice\n6. Include at least 2 considered options (including the chosen one)\n7. Be specific about consequences - list both benefits and drawbacks\n8. In \"More Information\", mention any technical details, related files, or future considerations\n\nRespond ONLY with the markdown content of the ADR. Do not include any preamble, explanation, or markdown code fences. Start directly with the # title.\n";
21
3
  export declare function formatPrompt(template: string, data: {
22
4
  file_paths: string[];
23
5
  diff_content: string;
24
6
  }): string;
25
- /**
26
- * Version 1 of the generation prompt template.
27
- *
28
- * This prompt generates ADRs following the MADR (Markdown Architectural Decision Records) format.
29
- * MADR is a lean template for documenting architectural decisions in a structured way.
30
- */
31
- export declare const GENERATION_PROMPT_V1 = "\nYou are an expert software architect. Your task is to write a comprehensive Architectural Decision Record (ADR) following the MADR (Markdown Architectural Decision Records) template.\n\nGiven the following code changes:\n{file_paths}\n\nDiff content:\n{diff_content}\n\nGenerate an ADR that follows this EXACT structure:\n\n# [Short title of solved problem and solution]\n\n* Status: [proposed | rejected | accepted | deprecated | superseded by [ADR-0005](0005-example.md)]\n* Date: {current_date}\n\n## Context and Problem Statement\n\n[Describe the context and problem statement in 2-3 sentences. What is the issue that we're addressing?]\n\n## Decision Drivers\n\n* [decision driver 1, e.g., a force, constraint, requirement]\n* [decision driver 2]\n* [etc.]\n\n## Considered Options\n\n* [option 1]\n* [option 2]\n* [option 3]\n\n## Decision Outcome\n\nChosen option: \"[option 1]\", because [justification. e.g., only option which meets KO criterion decision driver | which resolves force 1 | etc.].\n\n### Consequences\n\n* Good, because [positive consequence 1]\n* Good, because [positive consequence 2]\n* Bad, because [negative consequence 1]\n* Bad, because [negative consequence 2]\n\n## More Information\n\n[Any additional context, links to related discussions, or implementation notes]\n\nIMPORTANT INSTRUCTIONS:\n1. Use the EXACT markdown structure shown above\n2. Set Status to \"accepted\" (since this change is being committed)\n3. The title should be concise, action-oriented, and describe the decision made\n4. Keep Context and Problem Statement brief but clear (2-4 sentences)\n5. List at least 2-3 decision drivers that influenced this choice\n6. Include at least 2 considered options (including the chosen one)\n7. Be specific about consequences - list both benefits and drawbacks\n8. In \"More Information\", mention any technical details, related files, or future considerations\n\nRespond ONLY with the markdown content of the ADR. Do not include any preamble, explanation, or markdown code fences. Start directly with the # title.\n";
32
- /**
33
- * Formats the generation prompt with actual diff data
34
- *
35
- * @param data - Object containing file_paths and diff_content
36
- * @returns Formatted generation prompt
37
- */
38
7
  export declare function formatGenerationPrompt(data: {
39
8
  file_paths: string[];
40
9
  diff_content: string;
41
10
  }): string;
42
- /**
43
- * Prompt user for ADR generation confirmation
44
- *
45
- * @param reason - The reason why this change is architecturally significant
46
- * @returns Promise<boolean> - true if user wants to generate, false otherwise
47
- */
48
11
  export declare function promptForGeneration(reason: string): Promise<boolean>;
49
12
  //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/llm/prompts.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB,ksCAoB9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,ihEA0DhC,CAAC;AAEF,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACnD,MAAM,CAMR;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAQT;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuB1E"}
@@ -1,10 +1,4 @@
1
1
  "use strict";
2
- /**
3
- * Prompts Module
4
- *
5
- * Contains versioned prompt templates for LLM analysis and ADR generation.
6
- * Follows the constitution requirement for versioned prompts.
7
- */
8
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
3
  if (k2 === undefined) k2 = k;
10
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -44,12 +38,6 @@ exports.formatPrompt = formatPrompt;
44
38
  exports.formatGenerationPrompt = formatGenerationPrompt;
45
39
  exports.promptForGeneration = promptForGeneration;
46
40
  const readline = __importStar(require("readline"));
47
- /**
48
- * Version 1 of the analysis prompt template.
49
- *
50
- * This prompt is designed to analyze code changes for architectural significance.
51
- * It uses specific criteria for determining significance and enforces strict JSON output.
52
- */
53
41
  exports.ANALYSIS_PROMPT_V1 = `
54
42
  You are an expert principal engineer and software architect acting as a meticulous code reviewer. Your sole task is to determine if the provided git diff represents an architecturally significant change that warrants an Architectural Decision Record (ADR).
55
43
 
@@ -71,29 +59,6 @@ Respond ONLY with a single, minified JSON object with no preamble, no markdown,
71
59
 
72
60
  The "reason" should be a concise, one-sentence explanation for your decision, suitable for showing to a developer. If the change is not significant, the reason should be an empty string.
73
61
  `;
74
- /**
75
- * Formats a prompt template by replacing placeholders with actual data.
76
- *
77
- * @param template - The prompt template with placeholders
78
- * @param data - Object containing file_paths and diff_content
79
- * @returns Formatted prompt with placeholders replaced
80
- */
81
- function formatPrompt(template, data) {
82
- // Format file paths as a readable list
83
- const formattedFilePaths = data.file_paths.length > 0
84
- ? data.file_paths.join('\n')
85
- : 'No files';
86
- // Replace placeholders with actual data
87
- return template
88
- .replace('{file_paths}', formattedFilePaths)
89
- .replace('{diff_content}', data.diff_content);
90
- }
91
- /**
92
- * Version 1 of the generation prompt template.
93
- *
94
- * This prompt generates ADRs following the MADR (Markdown Architectural Decision Records) format.
95
- * MADR is a lean template for documenting architectural decisions in a structured way.
96
- */
97
62
  exports.GENERATION_PROMPT_V1 = `
98
63
  You are an expert software architect. Your task is to write a comprehensive Architectural Decision Record (ADR) following the MADR (Markdown Architectural Decision Records) template.
99
64
 
@@ -153,40 +118,30 @@ IMPORTANT INSTRUCTIONS:
153
118
 
154
119
  Respond ONLY with the markdown content of the ADR. Do not include any preamble, explanation, or markdown code fences. Start directly with the # title.
155
120
  `;
156
- /**
157
- * Formats the generation prompt with actual diff data
158
- *
159
- * @param data - Object containing file_paths and diff_content
160
- * @returns Formatted generation prompt
161
- */
121
+ function formatPrompt(template, data) {
122
+ const formattedFilePaths = data.file_paths.length > 0 ? data.file_paths.join('\n') : 'No files';
123
+ return template
124
+ .replace('{file_paths}', formattedFilePaths)
125
+ .replace('{diff_content}', data.diff_content);
126
+ }
162
127
  function formatGenerationPrompt(data) {
163
- const formattedFilePaths = data.file_paths.length > 0
164
- ? data.file_paths.join('\n')
165
- : 'No files';
128
+ const formattedFilePaths = data.file_paths.length > 0 ? data.file_paths.join('\n') : 'No files';
166
129
  const currentDate = new Date().toISOString().split('T')[0];
167
- return exports.GENERATION_PROMPT_V1
168
- .replace('{file_paths}', formattedFilePaths)
130
+ return exports.GENERATION_PROMPT_V1.replace('{file_paths}', formattedFilePaths)
169
131
  .replace('{diff_content}', data.diff_content)
170
132
  .replace('{current_date}', currentDate);
171
133
  }
172
- /**
173
- * Prompt user for ADR generation confirmation
174
- *
175
- * @param reason - The reason why this change is architecturally significant
176
- * @returns Promise<boolean> - true if user wants to generate, false otherwise
177
- */
178
134
  async function promptForGeneration(reason) {
179
135
  return new Promise((resolve) => {
180
136
  const rl = readline.createInterface({
181
137
  input: process.stdin,
182
138
  output: process.stdout,
183
139
  });
184
- // eslint-disable-next-line no-console
140
+ /* eslint-disable-next-line no-console */
185
141
  console.log(`\n💭 ${reason}\n`);
186
142
  rl.question('📝 Would you like to generate an ADR for this change? (Press ENTER or type "yes" to confirm, "no" to skip): ', (answer) => {
187
143
  rl.close();
188
144
  const normalized = answer.trim().toLowerCase();
189
- // Accept: empty (ENTER), "y", "yes"
190
145
  const confirmed = normalized === '' || normalized === 'y' || normalized === 'yes';
191
146
  resolve(confirmed);
192
147
  });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/llm/prompts.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoFA,oCASC;AAED,wDAWC;AAED,kDAuBC;AAnID,mDAAqC;AAExB,QAAA,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;CAoBjC,CAAC;AAEW,QAAA,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DnC,CAAC;AAEF,SAAgB,YAAY,CAC1B,QAAgB,EAChB,IAAoD;IAEpD,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEhG,OAAO,QAAQ;SACZ,OAAO,CAAC,cAAc,EAAE,kBAAkB,CAAC;SAC3C,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,sBAAsB,CAAC,IAGtC;IACC,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEhG,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,OAAO,4BAAoB,CAAC,OAAO,CAAC,cAAc,EAAE,kBAAkB,CAAC;SACpE,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC;SAC5C,OAAO,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAC5C,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,MAAc;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,yCAAyC;QACzC,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,IAAI,CAAC,CAAC;QAEhC,EAAE,CAAC,QAAQ,CACT,8GAA8G,EAC9G,CAAC,MAAM,EAAE,EAAE;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;YAEX,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAE/C,MAAM,SAAS,GAAG,UAAU,KAAK,EAAE,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC;YAElF,OAAO,CAAC,SAAS,CAAC,CAAC;QACrB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface ParsedAnalysisResponse {
2
+ is_significant: boolean;
3
+ reason: string;
4
+ confidence?: number;
5
+ }
6
+ export declare function parseAnalysisResponse(responseContent: string): ParsedAnalysisResponse;
7
+ export declare function extractTitleFromMarkdown(content: string): string;
8
+ export declare function parseLLMResponse<T>(responseContent: string, validator: (parsed: unknown) => T): T;
9
+ //# sourceMappingURL=response-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-parser.d.ts","sourceRoot":"","sources":["../../src/llm/response-parser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,sBAAsB,CA0CrF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUhE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAyBjG"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseAnalysisResponse = parseAnalysisResponse;
4
+ exports.extractTitleFromMarkdown = extractTitleFromMarkdown;
5
+ exports.parseLLMResponse = parseLLMResponse;
6
+ const logger_1 = require("../logger");
7
+ function parseAnalysisResponse(responseContent) {
8
+ let jsonContent = responseContent.trim();
9
+ const codeBlockMatch = jsonContent.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
10
+ if (codeBlockMatch) {
11
+ jsonContent = codeBlockMatch[1].trim();
12
+ }
13
+ const jsonMatch = jsonContent.match(/\{[\s\S]*\}/);
14
+ if (jsonMatch) {
15
+ jsonContent = jsonMatch[0];
16
+ }
17
+ const parsedResponse = JSON.parse(jsonContent);
18
+ if (typeof parsedResponse.is_significant !== 'boolean' ||
19
+ typeof parsedResponse.reason !== 'string') {
20
+ throw new Error(`Invalid response format. Expected {is_significant: boolean, reason: string}, got: ${JSON.stringify(parsedResponse).substring(0, 150)}...`);
21
+ }
22
+ if (parsedResponse.is_significant && !parsedResponse.reason) {
23
+ throw new Error('LLM indicated significant change but provided no reason');
24
+ }
25
+ const result = {
26
+ is_significant: parsedResponse.is_significant,
27
+ reason: parsedResponse.reason,
28
+ };
29
+ if (typeof parsedResponse.confidence === 'number' &&
30
+ parsedResponse.confidence >= 0 &&
31
+ parsedResponse.confidence <= 1) {
32
+ result.confidence = parsedResponse.confidence;
33
+ }
34
+ return result;
35
+ }
36
+ function extractTitleFromMarkdown(content) {
37
+ let cleanedContent = content.trim();
38
+ const codeBlockMatch = cleanedContent.match(/```(?:markdown|md)?\s*\n?([\s\S]*?)\n?```/);
39
+ if (codeBlockMatch) {
40
+ cleanedContent = codeBlockMatch[1].trim();
41
+ }
42
+ const titleMatch = cleanedContent.match(/^#\s+(.+)$/m);
43
+ return titleMatch ? titleMatch[1].trim() : 'Untitled Decision';
44
+ }
45
+ function parseLLMResponse(responseContent, validator) {
46
+ try {
47
+ let jsonContent = responseContent.trim();
48
+ const codeBlockMatch = jsonContent.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
49
+ if (codeBlockMatch) {
50
+ jsonContent = codeBlockMatch[1].trim();
51
+ }
52
+ const jsonMatch = jsonContent.match(/\{[\s\S]*\}/);
53
+ if (jsonMatch) {
54
+ jsonContent = jsonMatch[0];
55
+ }
56
+ const parsed = JSON.parse(jsonContent);
57
+ return validator(parsed);
58
+ }
59
+ catch (parseError) {
60
+ logger_1.loggerInstance.warn('Failed to parse LLM response as JSON', {
61
+ error: parseError,
62
+ response: responseContent,
63
+ });
64
+ throw new Error(`Failed to parse LLM response as JSON. Response was:\n${responseContent.substring(0, 200)}...`);
65
+ }
66
+ }
67
+ //# sourceMappingURL=response-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-parser.js","sourceRoot":"","sources":["../../src/llm/response-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=response-parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-parser.test.d.ts","sourceRoot":"","sources":["../../src/llm/response-parser.test.ts"],"names":[],"mappings":""}