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.
- package/dist/adr/adr.d.ts +17 -0
- package/dist/adr/adr.d.ts.map +1 -0
- package/dist/{adr.js → adr/adr.js} +4 -44
- package/dist/adr/adr.js.map +1 -0
- package/dist/adr/adr.test.d.ts +5 -0
- package/dist/{adr.test.d.ts.map → adr/adr.test.d.ts.map} +1 -1
- package/dist/{adr.test.js → adr/adr.test.js} +0 -14
- package/dist/adr/adr.test.js.map +1 -0
- package/dist/adr/index.d.ts +2 -0
- package/dist/adr/index.d.ts.map +1 -0
- package/dist/adr/index.js +18 -0
- package/dist/adr/index.js.map +1 -0
- package/dist/analysis/analysis.orchestrator.d.ts +14 -0
- package/dist/analysis/analysis.orchestrator.d.ts.map +1 -0
- package/dist/analysis/analysis.orchestrator.js +175 -0
- package/dist/analysis/analysis.orchestrator.js.map +1 -0
- package/dist/analysis/analysis.orchestrator.test.d.ts +2 -0
- package/dist/analysis/analysis.orchestrator.test.d.ts.map +1 -0
- package/dist/analysis/analysis.orchestrator.test.js +177 -0
- package/dist/analysis/analysis.orchestrator.test.js.map +1 -0
- package/dist/analysis/strategies/git-strategy.d.ts +22 -0
- package/dist/analysis/strategies/git-strategy.d.ts.map +1 -0
- package/dist/analysis/strategies/git-strategy.js +114 -0
- package/dist/analysis/strategies/git-strategy.js.map +1 -0
- package/dist/analysis/strategies/git-strategy.test.d.ts +2 -0
- package/dist/analysis/strategies/git-strategy.test.d.ts.map +1 -0
- package/dist/analysis/strategies/git-strategy.test.js +147 -0
- package/dist/analysis/strategies/git-strategy.test.js.map +1 -0
- package/dist/commands/analyze.js +3 -3
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/analyze.test.d.ts +2 -0
- package/dist/commands/analyze.test.d.ts.map +1 -0
- package/dist/commands/analyze.test.js +70 -0
- package/dist/commands/analyze.test.js.map +1 -0
- package/dist/commands/init.test.js +128 -2
- package/dist/commands/init.test.js.map +1 -1
- package/dist/config.test.js +167 -0
- package/dist/config.test.js.map +1 -1
- package/dist/git/git.errors.d.ts +6 -0
- package/dist/git/git.errors.d.ts.map +1 -0
- package/dist/git/git.errors.js +15 -0
- package/dist/git/git.errors.js.map +1 -0
- package/dist/git/git.errors.test.d.ts +2 -0
- package/dist/git/git.errors.test.d.ts.map +1 -0
- package/dist/git/git.errors.test.js +34 -0
- package/dist/git/git.errors.test.js.map +1 -0
- package/dist/git/git.operations.d.ts +12 -0
- package/dist/git/git.operations.d.ts.map +1 -0
- package/dist/git/git.operations.js +64 -0
- package/dist/git/git.operations.js.map +1 -0
- package/dist/git/git.operations.test.d.ts +2 -0
- package/dist/git/git.operations.test.d.ts.map +1 -0
- package/dist/git/git.operations.test.js +164 -0
- package/dist/git/git.operations.test.js.map +1 -0
- package/dist/git/index.d.ts +4 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +19 -0
- package/dist/git/index.js.map +1 -0
- package/dist/llm/index.d.ts +3 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +19 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/llm.d.ts +35 -0
- package/dist/llm/llm.d.ts.map +1 -0
- package/dist/{llm.js → llm/llm.js} +16 -58
- package/dist/llm/llm.js.map +1 -0
- package/dist/{llm.test.d.ts.map → llm/llm.test.d.ts.map} +1 -1
- package/dist/llm/llm.test.js +224 -0
- package/dist/llm/llm.test.js.map +1 -0
- package/dist/{prompts.d.ts → llm/prompts.d.ts} +1 -38
- package/dist/llm/prompts.d.ts.map +1 -0
- package/dist/{prompts.js → llm/prompts.js} +9 -54
- package/dist/llm/prompts.js.map +1 -0
- package/dist/llm/response-parser.d.ts +9 -0
- package/dist/llm/response-parser.d.ts.map +1 -0
- package/dist/llm/response-parser.js +67 -0
- package/dist/llm/response-parser.js.map +1 -0
- package/dist/llm/response-parser.test.d.ts +2 -0
- package/dist/llm/response-parser.test.d.ts.map +1 -0
- package/dist/llm/response-parser.test.js +134 -0
- package/dist/llm/response-parser.test.js.map +1 -0
- package/dist/presenters/console-presenter.d.ts +35 -0
- package/dist/presenters/console-presenter.d.ts.map +1 -0
- package/dist/presenters/console-presenter.js +114 -0
- package/dist/presenters/console-presenter.js.map +1 -0
- package/dist/presenters/console-presenter.test.d.ts +2 -0
- package/dist/presenters/console-presenter.test.d.ts.map +1 -0
- package/dist/presenters/console-presenter.test.js +227 -0
- package/dist/presenters/console-presenter.test.js.map +1 -0
- package/dist/version.test.d.ts +1 -2
- package/dist/version.test.d.ts.map +1 -1
- package/dist/version.test.js +29 -16
- package/dist/version.test.js.map +1 -1
- package/package.json +1 -1
- package/src/{adr.test.ts → adr/adr.test.ts} +10 -23
- package/src/{adr.ts → adr/adr.ts} +7 -48
- package/src/adr/index.ts +1 -0
- package/src/analysis/analysis.orchestrator.test.ts +237 -0
- package/src/analysis/analysis.orchestrator.ts +175 -0
- package/src/analysis/strategies/git-strategy.test.ts +210 -0
- package/src/analysis/strategies/git-strategy.ts +106 -0
- package/src/commands/analyze.test.ts +91 -0
- package/src/commands/analyze.ts +8 -9
- package/src/commands/init.test.ts +200 -5
- package/src/config.test.ts +232 -2
- package/src/git/git.errors.test.ts +43 -0
- package/src/git/git.errors.ts +10 -0
- package/src/git/git.operations.test.ts +222 -0
- package/src/git/git.operations.ts +85 -0
- package/src/git/index.ts +3 -0
- package/src/llm/index.ts +2 -0
- package/src/llm/llm.test.ts +315 -0
- package/src/{llm.ts → llm/llm.ts} +46 -107
- package/src/{prompts.ts → llm/prompts.ts} +30 -72
- package/src/llm/response-parser.test.ts +170 -0
- package/src/llm/response-parser.ts +90 -0
- package/src/presenters/console-presenter.test.ts +259 -0
- package/src/presenters/console-presenter.ts +152 -0
- package/src/version.test.ts +30 -16
- package/dist/adr.d.ts +0 -50
- package/dist/adr.d.ts.map +0 -1
- package/dist/adr.js.map +0 -1
- package/dist/adr.test.d.ts +0 -8
- package/dist/adr.test.js.map +0 -1
- package/dist/analysis.d.ts +0 -24
- package/dist/analysis.d.ts.map +0 -1
- package/dist/analysis.js +0 -281
- package/dist/analysis.js.map +0 -1
- package/dist/analysis.test.d.ts +0 -8
- package/dist/analysis.test.d.ts.map +0 -1
- package/dist/analysis.test.js +0 -351
- package/dist/analysis.test.js.map +0 -1
- package/dist/git.d.ts +0 -54
- package/dist/git.d.ts.map +0 -1
- package/dist/git.js +0 -204
- package/dist/git.js.map +0 -1
- package/dist/llm.d.ts +0 -73
- package/dist/llm.d.ts.map +0 -1
- package/dist/llm.js.map +0 -1
- package/dist/llm.test.js +0 -592
- package/dist/llm.test.js.map +0 -1
- package/dist/prompts.d.ts.map +0 -1
- package/dist/prompts.js.map +0 -1
- package/dist/prompts.test.d.ts +0 -2
- package/dist/prompts.test.d.ts.map +0 -1
- package/dist/prompts.test.js +0 -427
- package/dist/prompts.test.js.map +0 -1
- package/src/analysis.test.ts +0 -396
- package/src/analysis.ts +0 -262
- package/src/git.ts +0 -300
- package/src/llm.test.ts +0 -701
- package/src/prompts.test.ts +0 -515
- /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 @@
|
|
|
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 @@
|
|
|
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("
|
|
12
|
-
const logger_1 = require("
|
|
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 =
|
|
148
|
-
'
|
|
149
|
-
|
|
150
|
-
|
|
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,
|
|
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":["
|
|
1
|
+
{"version":3,"file":"llm.test.d.ts","sourceRoot":"","sources":["../../src/llm/llm.test.ts"],"names":[],"mappings":""}
|