phantom-pr 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +0 -0
- package/README.md +143 -0
- package/dist/adapters/git.d.ts +28 -0
- package/dist/adapters/git.js +112 -0
- package/dist/adapters/git.js.map +1 -0
- package/dist/adapters/github.d.ts +71 -0
- package/dist/adapters/github.js +194 -0
- package/dist/adapters/github.js.map +1 -0
- package/dist/cli.d.ts +47 -0
- package/dist/cli.js +201 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/context.d.ts +2 -0
- package/dist/commands/context.js +275 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/full.d.ts +13 -0
- package/dist/commands/full.js +590 -0
- package/dist/commands/full.js.map +1 -0
- package/dist/commands/gen_test.d.ts +2 -0
- package/dist/commands/gen_test.js +94 -0
- package/dist/commands/gen_test.js.map +1 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.js +62 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.js +107 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/pr.d.ts +9 -0
- package/dist/commands/pr.js +400 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/pr_list.d.ts +2 -0
- package/dist/commands/pr_list.js +158 -0
- package/dist/commands/pr_list.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.js +132 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/test.d.ts +2 -0
- package/dist/commands/test.js +143 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/testability.d.ts +10 -0
- package/dist/commands/testability.js +406 -0
- package/dist/commands/testability.js.map +1 -0
- package/dist/commands/tests.d.ts +9 -0
- package/dist/commands/tests.js +801 -0
- package/dist/commands/tests.js.map +1 -0
- package/dist/core/code/exports.d.ts +5 -0
- package/dist/core/code/exports.js +68 -0
- package/dist/core/code/exports.js.map +1 -0
- package/dist/core/config/forkPolicy.d.ts +25 -0
- package/dist/core/config/forkPolicy.js +35 -0
- package/dist/core/config/forkPolicy.js.map +1 -0
- package/dist/core/config/load.d.ts +13 -0
- package/dist/core/config/load.js +35 -0
- package/dist/core/config/load.js.map +1 -0
- package/dist/core/config/types.d.ts +87 -0
- package/dist/core/config/types.js +2 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/config/validate.d.ts +4 -0
- package/dist/core/config/validate.js +246 -0
- package/dist/core/config/validate.js.map +1 -0
- package/dist/core/context/packer.d.ts +31 -0
- package/dist/core/context/packer.js +345 -0
- package/dist/core/context/packer.js.map +1 -0
- package/dist/core/context/types.d.ts +41 -0
- package/dist/core/context/types.js +2 -0
- package/dist/core/context/types.js.map +1 -0
- package/dist/core/converge/loop.d.ts +13 -0
- package/dist/core/converge/loop.js +35 -0
- package/dist/core/converge/loop.js.map +1 -0
- package/dist/core/converge/types.d.ts +15 -0
- package/dist/core/converge/types.js +2 -0
- package/dist/core/converge/types.js.map +1 -0
- package/dist/core/generator/llm/diffApply.d.ts +26 -0
- package/dist/core/generator/llm/diffApply.js +276 -0
- package/dist/core/generator/llm/diffApply.js.map +1 -0
- package/dist/core/generator/llm/qualityGate.d.ts +34 -0
- package/dist/core/generator/llm/qualityGate.js +324 -0
- package/dist/core/generator/llm/qualityGate.js.map +1 -0
- package/dist/core/generator/llmGenerator.d.ts +34 -0
- package/dist/core/generator/llmGenerator.js +245 -0
- package/dist/core/generator/llmGenerator.js.map +1 -0
- package/dist/core/generator/quality.d.ts +17 -0
- package/dist/core/generator/quality.js +31 -0
- package/dist/core/generator/quality.js.map +1 -0
- package/dist/core/generator/registry.d.ts +26 -0
- package/dist/core/generator/registry.js +29 -0
- package/dist/core/generator/registry.js.map +1 -0
- package/dist/core/generator/smokeGenerator.d.ts +11 -0
- package/dist/core/generator/smokeGenerator.js +27 -0
- package/dist/core/generator/smokeGenerator.js.map +1 -0
- package/dist/core/generator/types.d.ts +48 -0
- package/dist/core/generator/types.js +2 -0
- package/dist/core/generator/types.js.map +1 -0
- package/dist/core/index/indexer.d.ts +29 -0
- package/dist/core/index/indexer.js +167 -0
- package/dist/core/index/indexer.js.map +1 -0
- package/dist/core/jest/parser.d.ts +17 -0
- package/dist/core/jest/parser.js +90 -0
- package/dist/core/jest/parser.js.map +1 -0
- package/dist/core/llm/provider.d.ts +55 -0
- package/dist/core/llm/provider.js +105 -0
- package/dist/core/llm/provider.js.map +1 -0
- package/dist/core/logger.d.ts +19 -0
- package/dist/core/logger.js +44 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/plan/planner.d.ts +16 -0
- package/dist/core/plan/planner.js +91 -0
- package/dist/core/plan/planner.js.map +1 -0
- package/dist/core/process/exec.d.ts +22 -0
- package/dist/core/process/exec.js +83 -0
- package/dist/core/process/exec.js.map +1 -0
- package/dist/core/redact.d.ts +6 -0
- package/dist/core/redact.js +49 -0
- package/dist/core/redact.js.map +1 -0
- package/dist/core/repo/boundary.d.ts +10 -0
- package/dist/core/repo/boundary.js +58 -0
- package/dist/core/repo/boundary.js.map +1 -0
- package/dist/core/stableJson.d.ts +1 -0
- package/dist/core/stableJson.js +32 -0
- package/dist/core/stableJson.js.map +1 -0
- package/dist/core/state/policy.d.ts +20 -0
- package/dist/core/state/policy.js +51 -0
- package/dist/core/state/policy.js.map +1 -0
- package/dist/core/state/state.d.ts +67 -0
- package/dist/core/state/state.js +142 -0
- package/dist/core/state/state.js.map +1 -0
- package/dist/core/state/storage.d.ts +9 -0
- package/dist/core/state/storage.js +25 -0
- package/dist/core/state/storage.js.map +1 -0
- package/dist/core/targets/resolve.d.ts +28 -0
- package/dist/core/targets/resolve.js +96 -0
- package/dist/core/targets/resolve.js.map +1 -0
- package/dist/core/testGenerator/conventions.d.ts +7 -0
- package/dist/core/testGenerator/conventions.js +29 -0
- package/dist/core/testGenerator/conventions.js.map +1 -0
- package/dist/core/testGenerator/generate.d.ts +35 -0
- package/dist/core/testGenerator/generate.js +127 -0
- package/dist/core/testGenerator/generate.js.map +1 -0
- package/dist/core/testRunner/hints.d.ts +12 -0
- package/dist/core/testRunner/hints.js +133 -0
- package/dist/core/testRunner/hints.js.map +1 -0
- package/dist/core/testRunner/infer.d.ts +24 -0
- package/dist/core/testRunner/infer.js +65 -0
- package/dist/core/testRunner/infer.js.map +1 -0
- package/dist/core/testRunner/resolve.d.ts +12 -0
- package/dist/core/testRunner/resolve.js +31 -0
- package/dist/core/testRunner/resolve.js.map +1 -0
- package/dist/core/testRunner/runner.d.ts +24 -0
- package/dist/core/testRunner/runner.js +145 -0
- package/dist/core/testRunner/runner.js.map +1 -0
- package/dist/core/testability/heuristics.d.ts +7 -0
- package/dist/core/testability/heuristics.js +35 -0
- package/dist/core/testability/heuristics.js.map +1 -0
- package/dist/core/tests/fixers.d.ts +14 -0
- package/dist/core/tests/fixers.js +59 -0
- package/dist/core/tests/fixers.js.map +1 -0
- package/dist/core/tests/types.d.ts +98 -0
- package/dist/core/tests/types.js +2 -0
- package/dist/core/tests/types.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qualityGate.js","sourceRoot":"","sources":["../../../../src/core/generator/llm/qualityGate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { GenerateInput, GenerateOutput, ITestGenerator } from './types.js';
|
|
2
|
+
import { type ILLMProvider } from '../llm/provider.js';
|
|
3
|
+
export { applyUnifiedDiffToTestFiles } from './llm/diffApply.js';
|
|
4
|
+
type LlmCfg = {
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
providerBaseUrl: string | null;
|
|
7
|
+
endpointPath: string;
|
|
8
|
+
model: string;
|
|
9
|
+
apiKeyEnvVar: string;
|
|
10
|
+
maxTokens: number;
|
|
11
|
+
temperature: number;
|
|
12
|
+
requestedTestCases?: number;
|
|
13
|
+
maxTestCases?: number;
|
|
14
|
+
};
|
|
15
|
+
export declare class LlmGenerator implements ITestGenerator {
|
|
16
|
+
private readonly cfg;
|
|
17
|
+
private readonly dryRun;
|
|
18
|
+
private readonly env;
|
|
19
|
+
private readonly nowMs;
|
|
20
|
+
private readonly provider;
|
|
21
|
+
private readonly indexFiles;
|
|
22
|
+
constructor(opts: {
|
|
23
|
+
llm: LlmCfg;
|
|
24
|
+
dryRun: boolean;
|
|
25
|
+
env: NodeJS.ProcessEnv;
|
|
26
|
+
nowMs: () => number;
|
|
27
|
+
provider: ILLMProvider | undefined;
|
|
28
|
+
indexFiles: Array<{
|
|
29
|
+
path: string;
|
|
30
|
+
}>;
|
|
31
|
+
});
|
|
32
|
+
kind(): 'llm';
|
|
33
|
+
generate(input: GenerateInput): Promise<GenerateOutput>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import crypto from 'node:crypto';
|
|
4
|
+
import { stableStringify } from '../stableJson.js';
|
|
5
|
+
import { buildContextPack } from '../context/packer.js';
|
|
6
|
+
import { redactText } from '../redact.js';
|
|
7
|
+
import { HttpProvider } from '../llm/provider.js';
|
|
8
|
+
import { resolveLlmTestCountTuning } from './quality.js';
|
|
9
|
+
import { extractNamedExportsFromJsLike, extractTopLevelDefsFromPy } from '../code/exports.js';
|
|
10
|
+
// Re-export for backward compatibility (tests import from here)
|
|
11
|
+
export { applyUnifiedDiffToTestFiles } from './llm/diffApply.js';
|
|
12
|
+
import { applyUnifiedDiffToTestFiles } from './llm/diffApply.js';
|
|
13
|
+
import { ALLOWED_MATCHERS, MIN_DISTINCT_MATCHERS, SHALLOW_MATCHERS } from './llm/qualityGate.js';
|
|
14
|
+
function sha256_8(text) {
|
|
15
|
+
return crypto.createHash('sha256').update(text).digest('hex').slice(0, 8);
|
|
16
|
+
}
|
|
17
|
+
function uniqSorted(xs) {
|
|
18
|
+
return [...new Set(xs.map((x) => x.trim()).filter(Boolean))].sort((a, b) => a.localeCompare(b));
|
|
19
|
+
}
|
|
20
|
+
function clipForPrompt(text, maxChars) {
|
|
21
|
+
const t = text ?? '';
|
|
22
|
+
if (t.length <= maxChars)
|
|
23
|
+
return { text: t, truncated: false };
|
|
24
|
+
return { text: t.slice(0, maxChars) + '\n...[truncated]\n', truncated: true };
|
|
25
|
+
}
|
|
26
|
+
export class LlmGenerator {
|
|
27
|
+
cfg;
|
|
28
|
+
dryRun;
|
|
29
|
+
env;
|
|
30
|
+
nowMs;
|
|
31
|
+
provider;
|
|
32
|
+
indexFiles;
|
|
33
|
+
constructor(opts) {
|
|
34
|
+
this.cfg = opts.llm;
|
|
35
|
+
this.dryRun = opts.dryRun;
|
|
36
|
+
this.env = opts.env;
|
|
37
|
+
this.nowMs = opts.nowMs;
|
|
38
|
+
this.provider = opts.provider;
|
|
39
|
+
this.indexFiles = opts.indexFiles;
|
|
40
|
+
}
|
|
41
|
+
kind() {
|
|
42
|
+
return 'llm';
|
|
43
|
+
}
|
|
44
|
+
async generate(input) {
|
|
45
|
+
const tuning = resolveLlmTestCountTuning({
|
|
46
|
+
requestedTestCases: this.cfg.requestedTestCases ?? null,
|
|
47
|
+
maxTestCases: this.cfg.maxTestCases ?? null,
|
|
48
|
+
});
|
|
49
|
+
if (this.dryRun) {
|
|
50
|
+
return { generator: 'llm', created: false, generatedFiles: [], warnings: ['llm_not_enabled'], summary: 'dryRun: llm disabled' };
|
|
51
|
+
}
|
|
52
|
+
if (!this.cfg.enabled) {
|
|
53
|
+
return { generator: 'llm', created: false, generatedFiles: [], warnings: ['llm_not_enabled'], summary: 'llm.enabled=false' };
|
|
54
|
+
}
|
|
55
|
+
const provider = this.provider ??
|
|
56
|
+
new HttpProvider({
|
|
57
|
+
baseUrl: this.cfg.providerBaseUrl,
|
|
58
|
+
endpointPath: this.cfg.endpointPath,
|
|
59
|
+
apiKeyEnvVar: this.cfg.apiKeyEnvVar,
|
|
60
|
+
env: this.env,
|
|
61
|
+
timeoutMs: 20_000,
|
|
62
|
+
outputCharCap: 20_000,
|
|
63
|
+
dryRun: false,
|
|
64
|
+
});
|
|
65
|
+
const maxDepth = 1;
|
|
66
|
+
const maxFileChars = Math.min(8000, Math.max(1, input.budgets.maxChars));
|
|
67
|
+
const observed = input.hints
|
|
68
|
+
? { runner: input.hints.runner, hints: { failingFiles: input.hints.failingFiles, failingTests: input.hints.failingTests } }
|
|
69
|
+
: null;
|
|
70
|
+
const pack = await buildContextPack({
|
|
71
|
+
rootAbs: input.rootAbs,
|
|
72
|
+
targetId: input.targetId,
|
|
73
|
+
targetPathPosix: input.targetPathPosix,
|
|
74
|
+
boundary: {
|
|
75
|
+
kind: input.boundary.kind,
|
|
76
|
+
rootPathPosix: input.boundary.rootPathPosix,
|
|
77
|
+
boundaryFileRel: null,
|
|
78
|
+
},
|
|
79
|
+
inferred: {
|
|
80
|
+
runner: input.runner,
|
|
81
|
+
command: input.testCommand,
|
|
82
|
+
source: 'unknown',
|
|
83
|
+
reason: 'llm_generate',
|
|
84
|
+
},
|
|
85
|
+
observed,
|
|
86
|
+
budgets: { maxFiles: input.budgets.maxFiles, maxChars: input.budgets.maxChars, maxDepth, maxFileChars },
|
|
87
|
+
nowMs: this.nowMs,
|
|
88
|
+
readFileText: async (abs) => fs.promises.readFile(abs, 'utf8'),
|
|
89
|
+
listIndexFiles: async () => this.indexFiles.map((f) => f.path),
|
|
90
|
+
redact: redactText,
|
|
91
|
+
});
|
|
92
|
+
const contextSummary = (() => {
|
|
93
|
+
// Derive a stable hash that does NOT depend on createdAtMs and does not include raw file contents.
|
|
94
|
+
const sig = {
|
|
95
|
+
schemaVersion: 1,
|
|
96
|
+
targetId: pack.targetId,
|
|
97
|
+
targetPathPosix: pack.targetPathPosix,
|
|
98
|
+
boundary: pack.boundary,
|
|
99
|
+
budgets: pack.budgets,
|
|
100
|
+
usage: pack.usage,
|
|
101
|
+
files: pack.files.map((f) => ({ pathPosix: f.pathPosix, kind: f.kind, sha256_8: f.sha256_8, truncated: f.truncated })),
|
|
102
|
+
};
|
|
103
|
+
const digest = sha256_8(stableStringify(sig));
|
|
104
|
+
return {
|
|
105
|
+
sha256_8: digest,
|
|
106
|
+
filesUsed: pack.usage.filesUsed,
|
|
107
|
+
charsUsed: pack.usage.charsUsed,
|
|
108
|
+
hitMaxFiles: pack.usage.hitMaxFiles,
|
|
109
|
+
hitMaxChars: pack.usage.hitMaxChars,
|
|
110
|
+
};
|
|
111
|
+
})();
|
|
112
|
+
// Extract anchors before LLM call so we can include them in the prompt
|
|
113
|
+
const targetModuleStem = path.posix.basename(input.targetPathPosix).replace(/\.[^.]+$/, '');
|
|
114
|
+
const targetAnchorsResult = (() => {
|
|
115
|
+
try {
|
|
116
|
+
const abs = path.resolve(input.rootAbs, ...input.targetPathPosix.split('/'));
|
|
117
|
+
const source = fs.readFileSync(abs, 'utf8');
|
|
118
|
+
const r = input.runner.toLowerCase();
|
|
119
|
+
if (r === 'pytest' || input.targetPathPosix.toLowerCase().endsWith('.py')) {
|
|
120
|
+
return { ok: true, anchors: extractTopLevelDefsFromPy(source), source };
|
|
121
|
+
}
|
|
122
|
+
return { ok: true, anchors: extractNamedExportsFromJsLike(source).named, source };
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return { ok: false, anchors: [], source: null };
|
|
126
|
+
}
|
|
127
|
+
})();
|
|
128
|
+
const targetAnchors = targetAnchorsResult.anchors;
|
|
129
|
+
const targetSource = targetAnchorsResult.source;
|
|
130
|
+
const anchorLine = targetAnchors.length > 0
|
|
131
|
+
? `- ANCHORS (you MUST import the target module AND call at least one of these): ${targetAnchors.join(', ')}.`
|
|
132
|
+
: '- Import and exercise the target module.';
|
|
133
|
+
const isPytest = input.runner.toLowerCase() === 'pytest';
|
|
134
|
+
const runnerRules = isPytest
|
|
135
|
+
? [
|
|
136
|
+
'- Use pytest style: def test_<name>(...) functions at module level.',
|
|
137
|
+
'- Use pytest.raises(...) for exception/error test cases.',
|
|
138
|
+
'- Use @pytest.mark.parametrize when testing multiple similar inputs.',
|
|
139
|
+
'- Include at least 1 negative/edge case (e.g., invalid input, None, empty, boundary).',
|
|
140
|
+
'- Test file must be named test_*.py under tests/ directory.',
|
|
141
|
+
]
|
|
142
|
+
: [
|
|
143
|
+
`- Use at least ${MIN_DISTINCT_MATCHERS} distinct matchers from this allowlist: ${[...ALLOWED_MATCHERS].sort((a, b) => a.localeCompare(b)).join(', ')}.`,
|
|
144
|
+
`- Avoid shallow expectations (e.g. ${[...SHALLOW_MATCHERS].sort((a, b) => a.localeCompare(b)).join(', ')}).`,
|
|
145
|
+
"- If runner is vitest: use `import { describe, it, expect } from 'vitest'` with `it(...)`, OR `import { describe, test, expect } from 'vitest'` with `test(...)` (no Jest globals).",
|
|
146
|
+
"- If runner is vitest and you need mocking: use `vi.fn()` or `vi.spyOn()` and import `vi` from vitest (e.g. `import { vi } from 'vitest'`).",
|
|
147
|
+
];
|
|
148
|
+
const systemPrompt = [
|
|
149
|
+
'You are a senior engineer writing minimal, robust unit tests.',
|
|
150
|
+
'Output MUST be a single unified diff that touches ONLY unit test files.',
|
|
151
|
+
'Rules:',
|
|
152
|
+
'- Touch at most 3 files.',
|
|
153
|
+
isPytest
|
|
154
|
+
? '- Each touched file must be a unit test file (e.g. tests/test_*.py).'
|
|
155
|
+
: '- Each touched file must be a unit test file (e.g. __tests__/x.test.ts or x.test.ts).',
|
|
156
|
+
'- You MAY add a new test file OR edit an existing test file (or both).',
|
|
157
|
+
'- You MAY add fixture/support files ONLY under tests/fixtures/** or **/__fixtures__/** (never outside these fixture dirs).',
|
|
158
|
+
`- Include between ${tuning.minTestCases} and ${tuning.requestedTestCases} focused unit test cases (hard cap ${tuning.maxTestCases}).`,
|
|
159
|
+
`- Include at least ${tuning.minExpectCalls} ${isPytest ? 'assert statements' : 'expect/assert calls'} total.`,
|
|
160
|
+
'- Your tests must assert behavior: inputs → outputs, error cases, and at least one edge case.',
|
|
161
|
+
...runnerRules,
|
|
162
|
+
anchorLine,
|
|
163
|
+
'- If you cannot safely test any anchor, output exactly: NO_SAFE_TESTS',
|
|
164
|
+
'- Do NOT modify package.json, configs, snapshots, or non-test files.',
|
|
165
|
+
'- Do NOT include any explanations or Markdown; diff only.',
|
|
166
|
+
].join('\n');
|
|
167
|
+
const feedbackSection = (() => {
|
|
168
|
+
const fb = input.feedback ?? null;
|
|
169
|
+
if (!fb || !fb.rawOutput || fb.rawOutput.trim() === '')
|
|
170
|
+
return null;
|
|
171
|
+
const clipped = clipForPrompt(fb.rawOutput, 6000);
|
|
172
|
+
return [
|
|
173
|
+
'PreviousAttempt (metadata + redacted output):',
|
|
174
|
+
`attempt: ${Math.max(1, Math.trunc(fb.attempt))}`,
|
|
175
|
+
`exitCode: ${Math.trunc(fb.exitCode)}`,
|
|
176
|
+
`outputTruncated: ${clipped.truncated ? 'true' : 'false'}`,
|
|
177
|
+
'',
|
|
178
|
+
'RawOutput:',
|
|
179
|
+
clipped.text,
|
|
180
|
+
'',
|
|
181
|
+
].join('\n');
|
|
182
|
+
})();
|
|
183
|
+
const userPrompt = [
|
|
184
|
+
'Generate one minimal unit test file patch for the target.',
|
|
185
|
+
`targetId: ${input.targetId}`,
|
|
186
|
+
`targetPath: ${input.targetPathPosix}`,
|
|
187
|
+
`runner: ${input.runner}`,
|
|
188
|
+
`testCommand: ${input.testCommand ?? 'null'}`,
|
|
189
|
+
'',
|
|
190
|
+
'ContextPack (JSON):',
|
|
191
|
+
stableStringify(pack),
|
|
192
|
+
'',
|
|
193
|
+
feedbackSection ?? '',
|
|
194
|
+
].join('\n');
|
|
195
|
+
const resp = await provider.generate({
|
|
196
|
+
systemPrompt,
|
|
197
|
+
userPrompt,
|
|
198
|
+
model: this.cfg.model,
|
|
199
|
+
temperature: this.cfg.temperature,
|
|
200
|
+
maxTokens: this.cfg.maxTokens,
|
|
201
|
+
});
|
|
202
|
+
const providerWarnings = uniqSorted(resp.warnings ?? []);
|
|
203
|
+
if (!resp.text || resp.text.trim() === '') {
|
|
204
|
+
return {
|
|
205
|
+
generator: 'llm',
|
|
206
|
+
created: false,
|
|
207
|
+
generatedFiles: [],
|
|
208
|
+
warnings: uniqSorted(['llm_empty_response', ...providerWarnings]),
|
|
209
|
+
summary: 'llm: empty response',
|
|
210
|
+
context: contextSummary,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// Use targetAnchors extracted earlier; add fail-closed marker only if read failed
|
|
214
|
+
const targetExportNames = !targetAnchorsResult.ok ? ['__target_read_failed__'] : targetAnchors;
|
|
215
|
+
const applied = applyUnifiedDiffToTestFiles({
|
|
216
|
+
rootAbs: input.rootAbs,
|
|
217
|
+
boundaryRootPosix: input.boundary.rootPathPosix,
|
|
218
|
+
runner: input.runner,
|
|
219
|
+
diffText: resp.text,
|
|
220
|
+
tuning,
|
|
221
|
+
targetExportNames,
|
|
222
|
+
targetModuleStem,
|
|
223
|
+
targetSource,
|
|
224
|
+
});
|
|
225
|
+
if (!applied.ok || applied.pathsPosix.length === 0) {
|
|
226
|
+
return {
|
|
227
|
+
generator: 'llm',
|
|
228
|
+
created: false,
|
|
229
|
+
generatedFiles: [],
|
|
230
|
+
warnings: uniqSorted([...providerWarnings, ...applied.warnings]),
|
|
231
|
+
summary: 'llm: invalid diff',
|
|
232
|
+
context: contextSummary,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
generator: 'llm',
|
|
237
|
+
created: applied.createdPathsPosix.length > 0,
|
|
238
|
+
generatedFiles: applied.pathsPosix,
|
|
239
|
+
warnings: uniqSorted([...providerWarnings, ...applied.warnings]),
|
|
240
|
+
summary: `llm: applied ${applied.pathsPosix.length} file(s)`,
|
|
241
|
+
context: contextSummary,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=llmGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmGenerator.js","sourceRoot":"","sources":["../../../src/core/generator/llmGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const LLM_REVIEWABLE: {
|
|
2
|
+
readonly minTestCases: 6;
|
|
3
|
+
readonly requestedTestCases: 10;
|
|
4
|
+
readonly maxTestCases: 12;
|
|
5
|
+
readonly hardMaxTestCases: 12;
|
|
6
|
+
};
|
|
7
|
+
export type LlmTestCountTuningInput = {
|
|
8
|
+
requestedTestCases?: number | null;
|
|
9
|
+
maxTestCases?: number | null;
|
|
10
|
+
};
|
|
11
|
+
export type LlmTestCountTuningResolved = {
|
|
12
|
+
minTestCases: number;
|
|
13
|
+
requestedTestCases: number;
|
|
14
|
+
maxTestCases: number;
|
|
15
|
+
minExpectCalls: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function resolveLlmTestCountTuning(input?: LlmTestCountTuningInput): LlmTestCountTuningResolved;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const LLM_REVIEWABLE = {
|
|
2
|
+
// Default stays reviewable.
|
|
3
|
+
minTestCases: 6,
|
|
4
|
+
requestedTestCases: 10,
|
|
5
|
+
maxTestCases: 12,
|
|
6
|
+
// Hard cap: never allow configs to exceed this.
|
|
7
|
+
hardMaxTestCases: 12,
|
|
8
|
+
};
|
|
9
|
+
function clampInt(n, lo, hi) {
|
|
10
|
+
const x = Math.trunc(n);
|
|
11
|
+
if (x < lo)
|
|
12
|
+
return lo;
|
|
13
|
+
if (x > hi)
|
|
14
|
+
return hi;
|
|
15
|
+
return x;
|
|
16
|
+
}
|
|
17
|
+
export function resolveLlmTestCountTuning(input) {
|
|
18
|
+
const min = LLM_REVIEWABLE.minTestCases;
|
|
19
|
+
const hardMax = LLM_REVIEWABLE.hardMaxTestCases;
|
|
20
|
+
const maxRaw = input?.maxTestCases ?? LLM_REVIEWABLE.maxTestCases;
|
|
21
|
+
const maxTestCases = clampInt(Number.isFinite(maxRaw) ? maxRaw : LLM_REVIEWABLE.maxTestCases, min, hardMax);
|
|
22
|
+
const requestedRaw = input?.requestedTestCases ?? LLM_REVIEWABLE.requestedTestCases;
|
|
23
|
+
const requestedTestCases = clampInt(Number.isFinite(requestedRaw) ? requestedRaw : LLM_REVIEWABLE.requestedTestCases, min, maxTestCases);
|
|
24
|
+
return {
|
|
25
|
+
minTestCases: min,
|
|
26
|
+
requestedTestCases,
|
|
27
|
+
maxTestCases,
|
|
28
|
+
minExpectCalls: min * 2,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.js","sourceRoot":"","sources":["../../../src/core/generator/quality.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,4BAA4B;IAC5B,YAAY,EAAE,CAAC;IACf,kBAAkB,EAAE,EAAE;IACtB,YAAY,EAAE,EAAE;IAChB,gDAAgD;IAChD,gBAAgB,EAAE,EAAE;CACZ,CAAC;AAcX,SAAS,QAAQ,CAAC,CAAS,EAAE,EAAU,EAAE,EAAU;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAA+B;IACvE,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,CAAC;IACxC,MAAM,OAAO,GAAG,cAAc,CAAC,gBAAgB,CAAC;IAEhD,MAAM,MAAM,GAAG,KAAK,EAAE,YAAY,IAAI,cAAc,CAAC,YAAY,CAAC;IAClE,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAgB,CAAC,CAAC,CAAC,CAAE,MAAiB,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAElI,MAAM,YAAY,GAAG,KAAK,EAAE,kBAAkB,IAAI,cAAc,CAAC,kBAAkB,CAAC;IACpF,MAAM,kBAAkB,GAAG,QAAQ,CACjC,MAAM,CAAC,QAAQ,CAAC,YAAsB,CAAC,CAAC,CAAC,CAAE,YAAuB,CAAC,CAAC,CAAC,cAAc,CAAC,kBAAkB,EACtG,GAAG,EACH,YAAY,CACb,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,GAAG;QACjB,kBAAkB;QAClB,YAAY;QACZ,cAAc,EAAE,GAAG,GAAG,CAAC;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ITestGenerator } from './types.js';
|
|
2
|
+
import type { ILLMProvider } from '../llm/provider.js';
|
|
3
|
+
export type GeneratorKind = 'smoke' | 'llm';
|
|
4
|
+
export declare function pickGenerator(config: {
|
|
5
|
+
generator?: GeneratorKind;
|
|
6
|
+
}, _policy: unknown): GeneratorKind;
|
|
7
|
+
export declare function createGenerator(kind: GeneratorKind, deps?: {
|
|
8
|
+
indexFiles?: Array<{
|
|
9
|
+
path: string;
|
|
10
|
+
}>;
|
|
11
|
+
llm?: {
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
providerBaseUrl: string | null;
|
|
14
|
+
endpointPath: string;
|
|
15
|
+
model: string;
|
|
16
|
+
apiKeyEnvVar: string;
|
|
17
|
+
maxTokens: number;
|
|
18
|
+
temperature: number;
|
|
19
|
+
requestedTestCases?: number;
|
|
20
|
+
maxTestCases?: number;
|
|
21
|
+
};
|
|
22
|
+
dryRun?: boolean;
|
|
23
|
+
env?: NodeJS.ProcessEnv;
|
|
24
|
+
nowMs?: () => number;
|
|
25
|
+
llmProvider?: ILLMProvider;
|
|
26
|
+
}): ITestGenerator;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SmokeGenerator } from './smokeGenerator.js';
|
|
2
|
+
import { LlmGenerator } from './llmGenerator.js';
|
|
3
|
+
import { LLM_REVIEWABLE } from './quality.js';
|
|
4
|
+
export function pickGenerator(config, _policy) {
|
|
5
|
+
return config.generator ?? 'smoke';
|
|
6
|
+
}
|
|
7
|
+
export function createGenerator(kind, deps) {
|
|
8
|
+
if (kind === 'smoke')
|
|
9
|
+
return new SmokeGenerator({ indexFiles: deps?.indexFiles ?? [] });
|
|
10
|
+
return new LlmGenerator({
|
|
11
|
+
llm: deps?.llm ?? {
|
|
12
|
+
enabled: false,
|
|
13
|
+
providerBaseUrl: null,
|
|
14
|
+
endpointPath: '/chat/completions',
|
|
15
|
+
model: 'gpt-4.1-mini',
|
|
16
|
+
apiKeyEnvVar: 'TEST_AGENT_LLM_KEY',
|
|
17
|
+
maxTokens: 1200,
|
|
18
|
+
temperature: 0,
|
|
19
|
+
requestedTestCases: LLM_REVIEWABLE.requestedTestCases,
|
|
20
|
+
maxTestCases: LLM_REVIEWABLE.maxTestCases,
|
|
21
|
+
},
|
|
22
|
+
dryRun: deps?.dryRun ?? true,
|
|
23
|
+
env: deps?.env ?? process.env,
|
|
24
|
+
nowMs: deps?.nowMs ?? (() => Date.now()),
|
|
25
|
+
provider: deps?.llmProvider,
|
|
26
|
+
indexFiles: deps?.indexFiles ?? [],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/generator/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,UAAU,aAAa,CAAC,MAAqC,EAAE,OAAgB;IACnF,OAAO,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAAmB,EACnB,IAiBC;IAED,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;IACxF,OAAO,IAAI,YAAY,CAAC;QACtB,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI;YAChB,OAAO,EAAE,KAAK;YACd,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,mBAAmB;YACjC,KAAK,EAAE,cAAc;YACrB,YAAY,EAAE,oBAAoB;YAClC,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,CAAC;YACd,kBAAkB,EAAE,cAAc,CAAC,kBAAkB;YACrD,YAAY,EAAE,cAAc,CAAC,YAAY;SAC1C;QACD,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI;QAC5B,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG;QAC7B,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,QAAQ,EAAE,IAAI,EAAE,WAAW;QAC3B,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,EAAE;KACnC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GenerateInput, GenerateOutput, ITestGenerator } from './types.js';
|
|
2
|
+
export declare class SmokeGenerator implements ITestGenerator {
|
|
3
|
+
private readonly indexFiles;
|
|
4
|
+
constructor(deps: {
|
|
5
|
+
indexFiles: Array<{
|
|
6
|
+
path: string;
|
|
7
|
+
}>;
|
|
8
|
+
});
|
|
9
|
+
kind(): 'smoke';
|
|
10
|
+
generate(input: GenerateInput): Promise<GenerateOutput>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { generateJestTest } from '../testGenerator/generate.js';
|
|
2
|
+
function uniqSorted(xs) {
|
|
3
|
+
return [...new Set(xs)].sort((a, b) => a.localeCompare(b));
|
|
4
|
+
}
|
|
5
|
+
export class SmokeGenerator {
|
|
6
|
+
indexFiles;
|
|
7
|
+
constructor(deps) {
|
|
8
|
+
this.indexFiles = deps.indexFiles;
|
|
9
|
+
}
|
|
10
|
+
kind() {
|
|
11
|
+
return 'smoke';
|
|
12
|
+
}
|
|
13
|
+
async generate(input) {
|
|
14
|
+
// Behavior: delegate to existing generator (synchronous) with repo-relative path.
|
|
15
|
+
const r = generateJestTest({ root: input.rootAbs, targetPath: input.targetPathPosix, indexFiles: this.indexFiles });
|
|
16
|
+
const expected = r.testPath ? [r.testPath] : [];
|
|
17
|
+
return {
|
|
18
|
+
generator: 'smoke',
|
|
19
|
+
created: r.created,
|
|
20
|
+
// Keep deterministic/stable: report the expected test path even if it already existed.
|
|
21
|
+
generatedFiles: uniqSorted(expected),
|
|
22
|
+
warnings: uniqSorted(r.warnings),
|
|
23
|
+
summary: r.reason,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=smokeGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smokeGenerator.js","sourceRoot":"","sources":["../../../src/core/generator/smokeGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,SAAS,UAAU,CAAC,EAAY;IAC9B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,OAAO,cAAc;IACR,UAAU,CAA0B;IAErD,YAAY,IAA6C;QACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACpC,CAAC;IAED,IAAI;QACF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAoB;QACjC,kFAAkF;QAClF,MAAM,CAAC,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACpH,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO;YACL,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,uFAAuF;YACvF,cAAc,EAAE,UAAU,CAAC,QAAQ,CAAC;YACpC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChC,OAAO,EAAE,CAAC,CAAC,MAAM;SAClB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export type GenerateInput = {
|
|
2
|
+
rootAbs: string;
|
|
3
|
+
targetId: string;
|
|
4
|
+
targetPathPosix: string;
|
|
5
|
+
boundary: {
|
|
6
|
+
kind: 'js' | 'py' | 'unknown';
|
|
7
|
+
rootPathPosix: string | null;
|
|
8
|
+
};
|
|
9
|
+
runner: 'jest' | 'vitest' | 'pytest' | 'unknown';
|
|
10
|
+
testCommand: string | null;
|
|
11
|
+
policy: {
|
|
12
|
+
allowTestabilityEdits: boolean;
|
|
13
|
+
notes: string[];
|
|
14
|
+
workingTestCommand: string | null;
|
|
15
|
+
};
|
|
16
|
+
budgets: {
|
|
17
|
+
maxFiles: number;
|
|
18
|
+
maxChars: number;
|
|
19
|
+
};
|
|
20
|
+
hints?: {
|
|
21
|
+
runner: string;
|
|
22
|
+
failingFiles: string[];
|
|
23
|
+
failingTests: string[];
|
|
24
|
+
};
|
|
25
|
+
feedback?: {
|
|
26
|
+
attempt: number;
|
|
27
|
+
exitCode: number;
|
|
28
|
+
rawOutput: string;
|
|
29
|
+
} | null;
|
|
30
|
+
};
|
|
31
|
+
export type GenerateOutput = {
|
|
32
|
+
generator: 'smoke' | 'llm';
|
|
33
|
+
created: boolean;
|
|
34
|
+
generatedFiles: string[];
|
|
35
|
+
warnings: string[];
|
|
36
|
+
summary: string;
|
|
37
|
+
context?: {
|
|
38
|
+
sha256_8: string;
|
|
39
|
+
filesUsed: number;
|
|
40
|
+
charsUsed: number;
|
|
41
|
+
hitMaxFiles: boolean;
|
|
42
|
+
hitMaxChars: boolean;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export interface ITestGenerator {
|
|
46
|
+
kind(): 'smoke' | 'llm';
|
|
47
|
+
generate(input: GenerateInput): Promise<GenerateOutput>;
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/generator/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type IndexedFile = {
|
|
2
|
+
path: string;
|
|
3
|
+
ext: string;
|
|
4
|
+
size: number;
|
|
5
|
+
lastModifiedMs?: number;
|
|
6
|
+
};
|
|
7
|
+
export type IndexSignals = {
|
|
8
|
+
packageManager: 'pnpm' | 'npm' | 'yarn' | 'unknown';
|
|
9
|
+
hasTsconfig: boolean;
|
|
10
|
+
jest: {
|
|
11
|
+
hasJestConfigFile: boolean;
|
|
12
|
+
hasPackageJsonJestField: boolean;
|
|
13
|
+
hasJestDep: boolean;
|
|
14
|
+
hasJestInTestScript: boolean;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export type RepoIndex = {
|
|
18
|
+
root: '.';
|
|
19
|
+
schemaVersion: 1;
|
|
20
|
+
files: IndexedFile[];
|
|
21
|
+
signals: IndexSignals;
|
|
22
|
+
};
|
|
23
|
+
export declare function buildRepoIndex(root: string): {
|
|
24
|
+
index: RepoIndex;
|
|
25
|
+
warnings: string[];
|
|
26
|
+
};
|
|
27
|
+
export declare function writeRepoIndex(root: string, index: RepoIndex): {
|
|
28
|
+
outputPath: string;
|
|
29
|
+
};
|