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,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const mockExecAsync = jest.fn();
4
+ jest.mock('child_process', () => ({ exec: jest.fn() }));
5
+ jest.mock('util', () => ({
6
+ ...jest.requireActual('util'),
7
+ promisify: jest.fn(() => mockExecAsync),
8
+ }));
9
+ const git_errors_1 = require("./git.errors");
10
+ const git_operations_1 = require("./git.operations");
11
+ beforeEach(() => {
12
+ jest.clearAllMocks();
13
+ });
14
+ afterEach(() => {
15
+ jest.restoreAllMocks();
16
+ });
17
+ // ---------------------------------------------------------------------------
18
+ // handleGitError (tested indirectly through any git command call)
19
+ // ---------------------------------------------------------------------------
20
+ describe('handleGitError', () => {
21
+ it('throws GitError with code NOT_GIT_REPO when exec fails with code 128', async () => {
22
+ const error = Object.assign(new Error('fatal: not a git repository'), { code: 128 });
23
+ mockExecAsync.mockRejectedValue(error);
24
+ const promise = (0, git_operations_1.getStagedFiles)();
25
+ await expect(promise).rejects.toThrow(git_errors_1.GitError);
26
+ await expect(promise).rejects.toMatchObject({ code: 'NOT_GIT_REPO' });
27
+ });
28
+ it('throws GitError with code GIT_NOT_FOUND when exec fails with code 127', async () => {
29
+ const error = Object.assign(new Error('git: command not found'), { code: 127 });
30
+ mockExecAsync.mockRejectedValue(error);
31
+ await expect((0, git_operations_1.getStagedFiles)()).rejects.toThrow(git_errors_1.GitError);
32
+ await expect((0, git_operations_1.getStagedFiles)()).rejects.toMatchObject({ code: 'GIT_NOT_FOUND' });
33
+ });
34
+ it('throws GitError with code GIT_ERROR when exec fails with other code', async () => {
35
+ const error = Object.assign(new Error('unknown error'), { code: 1 });
36
+ mockExecAsync.mockRejectedValue(error);
37
+ await expect((0, git_operations_1.getStagedFiles)()).rejects.toThrow(git_errors_1.GitError);
38
+ await expect((0, git_operations_1.getStagedFiles)()).rejects.toMatchObject({ code: 'GIT_ERROR' });
39
+ });
40
+ });
41
+ // ---------------------------------------------------------------------------
42
+ // getStagedFiles
43
+ // ---------------------------------------------------------------------------
44
+ describe('getStagedFiles', () => {
45
+ it('returns array of filenames from stdout', async () => {
46
+ mockExecAsync.mockResolvedValueOnce({ stdout: 'file1.ts\nfile2.ts\nfile3.ts\n' });
47
+ const result = await (0, git_operations_1.getStagedFiles)();
48
+ expect(result).toEqual(['file1.ts', 'file2.ts', 'file3.ts']);
49
+ });
50
+ it('returns empty array when stdout is empty', async () => {
51
+ mockExecAsync.mockResolvedValueOnce({ stdout: '' });
52
+ const result = await (0, git_operations_1.getStagedFiles)();
53
+ expect(result).toEqual([]);
54
+ });
55
+ it('filters blank lines from stdout', async () => {
56
+ mockExecAsync.mockResolvedValueOnce({ stdout: 'file1.ts\n\nfile2.ts\n\n' });
57
+ const result = await (0, git_operations_1.getStagedFiles)();
58
+ expect(result).toEqual(['file1.ts', 'file2.ts']);
59
+ });
60
+ });
61
+ // ---------------------------------------------------------------------------
62
+ // getStagedDiff
63
+ // ---------------------------------------------------------------------------
64
+ describe('getStagedDiff', () => {
65
+ it('returns raw diff string from stdout', async () => {
66
+ const diff = 'diff --git a/file.ts b/file.ts\n+added line\n';
67
+ mockExecAsync.mockResolvedValueOnce({ stdout: diff });
68
+ const result = await (0, git_operations_1.getStagedDiff)();
69
+ expect(result).toBe(diff);
70
+ });
71
+ });
72
+ // ---------------------------------------------------------------------------
73
+ // getAllChanges
74
+ // ---------------------------------------------------------------------------
75
+ describe('getAllChanges', () => {
76
+ it('returns array of filenames', async () => {
77
+ mockExecAsync.mockResolvedValueOnce({ stdout: 'a.ts\nb.ts\n' });
78
+ const result = await (0, git_operations_1.getAllChanges)();
79
+ expect(result).toEqual(['a.ts', 'b.ts']);
80
+ });
81
+ it('runs git diff HEAD --name-only command', async () => {
82
+ mockExecAsync.mockResolvedValueOnce({ stdout: '' });
83
+ await (0, git_operations_1.getAllChanges)();
84
+ expect(mockExecAsync).toHaveBeenCalledWith('git diff HEAD --name-only');
85
+ });
86
+ });
87
+ // ---------------------------------------------------------------------------
88
+ // getAllDiff
89
+ // ---------------------------------------------------------------------------
90
+ describe('getAllDiff', () => {
91
+ it('returns raw diff string', async () => {
92
+ const diff = 'diff --git a/x.ts b/x.ts\n-removed\n+added\n';
93
+ mockExecAsync.mockResolvedValueOnce({ stdout: diff });
94
+ const result = await (0, git_operations_1.getAllDiff)();
95
+ expect(result).toBe(diff);
96
+ });
97
+ it('runs git diff HEAD --unified=1 command', async () => {
98
+ mockExecAsync.mockResolvedValueOnce({ stdout: '' });
99
+ await (0, git_operations_1.getAllDiff)();
100
+ expect(mockExecAsync).toHaveBeenCalledWith('git diff HEAD --unified=1');
101
+ });
102
+ });
103
+ // ---------------------------------------------------------------------------
104
+ // getChangedFiles
105
+ // ---------------------------------------------------------------------------
106
+ describe('getChangedFiles', () => {
107
+ it('delegates to getStagedFiles when mode is staged', async () => {
108
+ mockExecAsync.mockResolvedValueOnce({ stdout: 'staged.ts\n' });
109
+ const result = await (0, git_operations_1.getChangedFiles)({ mode: 'staged' });
110
+ expect(mockExecAsync).toHaveBeenCalledWith('git diff --cached --name-only');
111
+ expect(result).toEqual(['staged.ts']);
112
+ });
113
+ it('delegates to getAllChanges when mode is all', async () => {
114
+ mockExecAsync.mockResolvedValueOnce({ stdout: 'all.ts\n' });
115
+ const result = await (0, git_operations_1.getChangedFiles)({ mode: 'all' });
116
+ expect(mockExecAsync).toHaveBeenCalledWith('git diff HEAD --name-only');
117
+ expect(result).toEqual(['all.ts']);
118
+ });
119
+ it('delegates to getAllChanges when mode is branch-diff (fallback)', async () => {
120
+ mockExecAsync.mockResolvedValueOnce({ stdout: 'branch.ts\n' });
121
+ const result = await (0, git_operations_1.getChangedFiles)({ mode: 'branch-diff' });
122
+ expect(mockExecAsync).toHaveBeenCalledWith('git diff HEAD --name-only');
123
+ expect(result).toEqual(['branch.ts']);
124
+ });
125
+ });
126
+ // ---------------------------------------------------------------------------
127
+ // getDiff
128
+ // ---------------------------------------------------------------------------
129
+ describe('getDiff', () => {
130
+ it('delegates to getStagedDiff when mode is staged', async () => {
131
+ const diff = 'staged diff content';
132
+ mockExecAsync.mockResolvedValueOnce({ stdout: diff });
133
+ const result = await (0, git_operations_1.getDiff)({ mode: 'staged' });
134
+ expect(mockExecAsync).toHaveBeenCalledWith('git diff --cached --unified=1');
135
+ expect(result).toBe(diff);
136
+ });
137
+ it('delegates to getAllDiff when mode is all', async () => {
138
+ const diff = 'all diff content';
139
+ mockExecAsync.mockResolvedValueOnce({ stdout: diff });
140
+ const result = await (0, git_operations_1.getDiff)({ mode: 'all' });
141
+ expect(mockExecAsync).toHaveBeenCalledWith('git diff HEAD --unified=1');
142
+ expect(result).toBe(diff);
143
+ });
144
+ it('delegates to getAllDiff when mode is branch-diff (fallback)', async () => {
145
+ const diff = 'branch diff content';
146
+ mockExecAsync.mockResolvedValueOnce({ stdout: diff });
147
+ const result = await (0, git_operations_1.getDiff)({ mode: 'branch-diff' });
148
+ expect(mockExecAsync).toHaveBeenCalledWith('git diff HEAD --unified=1');
149
+ expect(result).toBe(diff);
150
+ });
151
+ });
152
+ // ---------------------------------------------------------------------------
153
+ // parseFileList (tested indirectly)
154
+ // ---------------------------------------------------------------------------
155
+ describe('parseFileList (indirect)', () => {
156
+ it('multi-line stdout with trailing newline returns only non-empty trimmed entries', async () => {
157
+ mockExecAsync.mockResolvedValueOnce({
158
+ stdout: ' file1.ts \nfile2.ts\n \n file3.ts\n',
159
+ });
160
+ const result = await (0, git_operations_1.getStagedFiles)();
161
+ expect(result).toEqual(['file1.ts', 'file2.ts', 'file3.ts']);
162
+ });
163
+ });
164
+ //# sourceMappingURL=git.operations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.operations.test.js","sourceRoot":"","sources":["../../src/git/git.operations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './git.errors';
2
+ export * from './git.operations';
3
+ export type { DiffOptions } from './git.operations';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,19 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./git.errors"), exports);
18
+ __exportStar(require("./git.operations"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,mDAAiC"}
@@ -0,0 +1,3 @@
1
+ export * from './llm';
2
+ export * from './prompts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,WAAW,CAAC"}
@@ -0,0 +1,19 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./llm"), exports);
18
+ __exportStar(require("./prompts"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,4CAA0B"}
@@ -0,0 +1,35 @@
1
+ import { AnalysisConfig } from '../config';
2
+ export interface AnalysisRequest {
3
+ file_paths: string[];
4
+ diff_content: string;
5
+ repository_context: string;
6
+ analysis_prompt: string;
7
+ }
8
+ export interface AnalysisResult {
9
+ is_significant: boolean;
10
+ reason: string;
11
+ confidence?: number;
12
+ timestamp: string;
13
+ }
14
+ export interface AnalysisResponse {
15
+ result: AnalysisResult | null;
16
+ error?: string;
17
+ }
18
+ export interface GenerationRequest {
19
+ file_paths: string[];
20
+ diff_content: string;
21
+ reason: string;
22
+ generation_prompt: string;
23
+ }
24
+ export interface GenerationResult {
25
+ content: string;
26
+ title: string;
27
+ timestamp: string;
28
+ }
29
+ export interface GenerationResponse {
30
+ result: GenerationResult | null;
31
+ error?: string;
32
+ }
33
+ export declare function analyzeChanges(config: AnalysisConfig, request: AnalysisRequest): Promise<AnalysisResponse>;
34
+ export declare function generateADRContent(config: AnalysisConfig, request: GenerationRequest): Promise<GenerationResponse>;
35
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/llm/llm.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAoJ3B;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAiF7B"}
@@ -1,32 +1,14 @@
1
1
  "use strict";
2
- /**
3
- * LLM Client Module
4
- *
5
- * Provider-based wrapper for analyzing code changes.
6
- * Implements fail-open error handling per constitution requirements.
7
- */
8
2
  Object.defineProperty(exports, "__esModule", { value: true });
9
3
  exports.analyzeChanges = analyzeChanges;
10
4
  exports.generateADRContent = generateADRContent;
11
- const providers_1 = require("./providers");
12
- const logger_1 = require("./logger");
13
- /**
14
- * Rough token estimation (1 token ≈ 4 characters for English text)
15
- * This is a conservative estimate
16
- */
5
+ const providers_1 = require("../providers");
6
+ const logger_1 = require("../logger");
17
7
  function estimateTokens(text) {
18
8
  return Math.ceil(text.length / 4);
19
9
  }
20
- /**
21
- * Analyze staged changes using OpenAI LLM
22
- *
23
- * @param config - Analysis configuration with API settings
24
- * @param request - Analysis request with code changes
25
- * @returns Promise resolving to analysis response with result or error
26
- */
27
10
  async function analyzeChanges(config, request) {
28
11
  try {
29
- // Check if API key is available
30
12
  const apiKey = process.env[config.api_key_env];
31
13
  if (!apiKey) {
32
14
  logger_1.loggerInstance.warn('API key not found in environment', {
@@ -34,10 +16,9 @@ async function analyzeChanges(config, request) {
34
16
  });
35
17
  return {
36
18
  result: null,
37
- error: `API key not found: ${config.api_key_env} environment variable is not set`
19
+ error: `API key not found: ${config.api_key_env} environment variable is not set`,
38
20
  };
39
21
  }
40
- // Estimate tokens for logging and validation
41
22
  const estimatedTokens = estimateTokens(request.analysis_prompt);
42
23
  logger_1.loggerInstance.info('Sending analysis request to LLM', {
43
24
  provider: config.provider,
@@ -45,7 +26,6 @@ async function analyzeChanges(config, request) {
45
26
  file_count: request.file_paths.length,
46
27
  estimated_tokens: estimatedTokens,
47
28
  });
48
- // Warn if token estimate is high (most models have 8k-32k limits)
49
29
  if (estimatedTokens > 7000) {
50
30
  logger_1.loggerInstance.warn('High token count detected', {
51
31
  estimated_tokens: estimatedTokens,
@@ -63,20 +43,16 @@ async function analyzeChanges(config, request) {
63
43
  logger_1.loggerInstance.warn('No response content from LLM', { provider: config.provider });
64
44
  return {
65
45
  result: null,
66
- error: 'No response content from LLM'
46
+ error: 'No response content from LLM',
67
47
  };
68
48
  }
69
- // Parse JSON response - handle markdown-wrapped JSON
70
49
  let parsedResponse;
71
50
  try {
72
- // Try to extract JSON from markdown code blocks if present
73
51
  let jsonContent = responseContent.trim();
74
- // Remove markdown code block if present: ```json ... ``` or ``` ... ```
75
52
  const codeBlockMatch = jsonContent.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
76
53
  if (codeBlockMatch) {
77
54
  jsonContent = codeBlockMatch[1].trim();
78
55
  }
79
- // Try to find JSON object if there's surrounding text
80
56
  const jsonMatch = jsonContent.match(/\{[\s\S]*\}/);
81
57
  if (jsonMatch) {
82
58
  jsonContent = jsonMatch[0];
@@ -90,10 +66,9 @@ async function analyzeChanges(config, request) {
90
66
  });
91
67
  return {
92
68
  result: null,
93
- error: `Failed to parse LLM response as JSON. Response was:\n${responseContent.substring(0, 200)}...`
69
+ error: `Failed to parse LLM response as JSON. Response was:\n${responseContent.substring(0, 200)}...`,
94
70
  };
95
71
  }
96
- // Validate response format
97
72
  if (typeof parsedResponse.is_significant !== 'boolean' ||
98
73
  typeof parsedResponse.reason !== 'string') {
99
74
  logger_1.loggerInstance.warn('Invalid response format from LLM', {
@@ -101,26 +76,23 @@ async function analyzeChanges(config, request) {
101
76
  });
102
77
  return {
103
78
  result: null,
104
- error: `Invalid response format from LLM. Expected {is_significant: boolean, reason: string}, got: ${JSON.stringify(parsedResponse).substring(0, 150)}...`
79
+ error: `Invalid response format from LLM. Expected {is_significant: boolean, reason: string}, got: ${JSON.stringify(parsedResponse).substring(0, 150)}...`,
105
80
  };
106
81
  }
107
- // Reason is required when is_significant is true, but can be empty when false
108
82
  if (parsedResponse.is_significant && !parsedResponse.reason) {
109
83
  logger_1.loggerInstance.warn('Missing reason for significant change', {
110
84
  response: parsedResponse,
111
85
  });
112
86
  return {
113
87
  result: null,
114
- error: 'LLM indicated significant change but provided no reason'
88
+ error: 'LLM indicated significant change but provided no reason',
115
89
  };
116
90
  }
117
- // Build result with timestamp
118
91
  const result = {
119
92
  is_significant: parsedResponse.is_significant,
120
93
  reason: parsedResponse.reason,
121
94
  timestamp: new Date().toISOString(),
122
95
  };
123
- // Include confidence if provided
124
96
  if (typeof parsedResponse.confidence === 'number' &&
125
97
  parsedResponse.confidence >= 0 &&
126
98
  parsedResponse.confidence <= 1) {
@@ -133,21 +105,19 @@ async function analyzeChanges(config, request) {
133
105
  return { result, error: undefined };
134
106
  }
135
107
  catch (error) {
136
- // Fail-open: log error and return descriptive error message
137
108
  const errorObj = error;
138
109
  let errorMessage;
139
- // Check for specific error types and provide helpful messages
140
110
  if (errorObj.status === 401) {
141
111
  errorMessage = 'Invalid API key - please check your API key configuration';
142
112
  logger_1.loggerInstance.warn('LLM API authentication failed', { error: errorObj });
143
113
  }
144
114
  else if (errorObj.status === 400 && errorObj.message?.includes('maximum context length')) {
145
- // Extract token counts from error message if available
146
115
  const tokenMatch = errorObj.message.match(/(\d+)\s+tokens/g);
147
- errorMessage = 'Diff too large for model context window. Try:\n' +
148
- ' Stage fewer files at once\n' +
149
- ' • Use a model with larger context window in cadr.yaml\n' +
150
- ' • Add ignore patterns to filter large files';
116
+ errorMessage =
117
+ 'Diff too large for model context window. Try:\n' +
118
+ ' • Stage fewer files at once\n' +
119
+ ' • Use a model with larger context window in cadr.yaml\n' +
120
+ ' • Add ignore patterns to filter large files';
151
121
  logger_1.loggerInstance.warn('LLM context length exceeded', {
152
122
  error: errorObj,
153
123
  tokens: tokenMatch,
@@ -172,16 +142,8 @@ async function analyzeChanges(config, request) {
172
142
  return { result: null, error: errorMessage };
173
143
  }
174
144
  }
175
- /**
176
- * Generate ADR content using LLM
177
- *
178
- * @param config - Analysis configuration with API settings
179
- * @param request - Generation request with code changes
180
- * @returns Promise resolving to generation response with result or error
181
- */
182
145
  async function generateADRContent(config, request) {
183
146
  try {
184
- // Check if API key is available
185
147
  const apiKey = process.env[config.api_key_env];
186
148
  if (!apiKey) {
187
149
  logger_1.loggerInstance.warn('API key not found in environment for generation', {
@@ -189,7 +151,7 @@ async function generateADRContent(config, request) {
189
151
  });
190
152
  return {
191
153
  result: null,
192
- error: `API key not found: ${config.api_key_env} environment variable is not set`
154
+ error: `API key not found: ${config.api_key_env} environment variable is not set`,
193
155
  };
194
156
  }
195
157
  logger_1.loggerInstance.info('Sending generation request to LLM', {
@@ -200,26 +162,23 @@ async function generateADRContent(config, request) {
200
162
  const provider = (0, providers_1.getProvider)(config.provider);
201
163
  const responseContent = await provider.analyze(request.generation_prompt, {
202
164
  apiKey,
203
- model: config.analysis_model, // Using same model per user request
165
+ model: config.analysis_model,
204
166
  timeoutMs: config.timeout_seconds * 1000,
205
167
  });
206
168
  if (!responseContent) {
207
169
  logger_1.loggerInstance.warn('No response content from LLM for generation', {
208
- provider: config.provider
170
+ provider: config.provider,
209
171
  });
210
172
  return {
211
173
  result: null,
212
- error: 'No response content from LLM'
174
+ error: 'No response content from LLM',
213
175
  };
214
176
  }
215
- // Clean up the response - remove markdown code fences if LLM added them
216
177
  let cleanedContent = responseContent.trim();
217
- // Remove markdown code block if present
218
178
  const codeBlockMatch = cleanedContent.match(/```(?:markdown|md)?\s*\n?([\s\S]*?)\n?```/);
219
179
  if (codeBlockMatch) {
220
180
  cleanedContent = codeBlockMatch[1].trim();
221
181
  }
222
- // Extract title from first line (should be # Title)
223
182
  const titleMatch = cleanedContent.match(/^#\s+(.+)$/m);
224
183
  const title = titleMatch ? titleMatch[1].trim() : 'Untitled Decision';
225
184
  const result = {
@@ -234,7 +193,6 @@ async function generateADRContent(config, request) {
234
193
  return { result, error: undefined };
235
194
  }
236
195
  catch (error) {
237
- // Fail-open: log error and return descriptive error message
238
196
  const errorObj = error;
239
197
  let errorMessage;
240
198
  if (errorObj.status === 401) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/llm/llm.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"llm.test.d.ts","sourceRoot":"","sources":["../src/llm.test.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"llm.test.d.ts","sourceRoot":"","sources":["../../src/llm/llm.test.ts"],"names":[],"mappings":""}