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.
Files changed (159) hide show
  1. package/LICENSE.md +0 -0
  2. package/README.md +143 -0
  3. package/dist/adapters/git.d.ts +28 -0
  4. package/dist/adapters/git.js +112 -0
  5. package/dist/adapters/git.js.map +1 -0
  6. package/dist/adapters/github.d.ts +71 -0
  7. package/dist/adapters/github.js +194 -0
  8. package/dist/adapters/github.js.map +1 -0
  9. package/dist/cli.d.ts +47 -0
  10. package/dist/cli.js +201 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/context.d.ts +2 -0
  13. package/dist/commands/context.js +275 -0
  14. package/dist/commands/context.js.map +1 -0
  15. package/dist/commands/full.d.ts +13 -0
  16. package/dist/commands/full.js +590 -0
  17. package/dist/commands/full.js.map +1 -0
  18. package/dist/commands/gen_test.d.ts +2 -0
  19. package/dist/commands/gen_test.js +94 -0
  20. package/dist/commands/gen_test.js.map +1 -0
  21. package/dist/commands/index.d.ts +2 -0
  22. package/dist/commands/index.js +62 -0
  23. package/dist/commands/index.js.map +1 -0
  24. package/dist/commands/plan.d.ts +2 -0
  25. package/dist/commands/plan.js +107 -0
  26. package/dist/commands/plan.js.map +1 -0
  27. package/dist/commands/pr.d.ts +9 -0
  28. package/dist/commands/pr.js +400 -0
  29. package/dist/commands/pr.js.map +1 -0
  30. package/dist/commands/pr_list.d.ts +2 -0
  31. package/dist/commands/pr_list.js +158 -0
  32. package/dist/commands/pr_list.js.map +1 -0
  33. package/dist/commands/status.d.ts +6 -0
  34. package/dist/commands/status.js +132 -0
  35. package/dist/commands/status.js.map +1 -0
  36. package/dist/commands/test.d.ts +2 -0
  37. package/dist/commands/test.js +143 -0
  38. package/dist/commands/test.js.map +1 -0
  39. package/dist/commands/testability.d.ts +10 -0
  40. package/dist/commands/testability.js +406 -0
  41. package/dist/commands/testability.js.map +1 -0
  42. package/dist/commands/tests.d.ts +9 -0
  43. package/dist/commands/tests.js +801 -0
  44. package/dist/commands/tests.js.map +1 -0
  45. package/dist/core/code/exports.d.ts +5 -0
  46. package/dist/core/code/exports.js +68 -0
  47. package/dist/core/code/exports.js.map +1 -0
  48. package/dist/core/config/forkPolicy.d.ts +25 -0
  49. package/dist/core/config/forkPolicy.js +35 -0
  50. package/dist/core/config/forkPolicy.js.map +1 -0
  51. package/dist/core/config/load.d.ts +13 -0
  52. package/dist/core/config/load.js +35 -0
  53. package/dist/core/config/load.js.map +1 -0
  54. package/dist/core/config/types.d.ts +87 -0
  55. package/dist/core/config/types.js +2 -0
  56. package/dist/core/config/types.js.map +1 -0
  57. package/dist/core/config/validate.d.ts +4 -0
  58. package/dist/core/config/validate.js +246 -0
  59. package/dist/core/config/validate.js.map +1 -0
  60. package/dist/core/context/packer.d.ts +31 -0
  61. package/dist/core/context/packer.js +345 -0
  62. package/dist/core/context/packer.js.map +1 -0
  63. package/dist/core/context/types.d.ts +41 -0
  64. package/dist/core/context/types.js +2 -0
  65. package/dist/core/context/types.js.map +1 -0
  66. package/dist/core/converge/loop.d.ts +13 -0
  67. package/dist/core/converge/loop.js +35 -0
  68. package/dist/core/converge/loop.js.map +1 -0
  69. package/dist/core/converge/types.d.ts +15 -0
  70. package/dist/core/converge/types.js +2 -0
  71. package/dist/core/converge/types.js.map +1 -0
  72. package/dist/core/generator/llm/diffApply.d.ts +26 -0
  73. package/dist/core/generator/llm/diffApply.js +276 -0
  74. package/dist/core/generator/llm/diffApply.js.map +1 -0
  75. package/dist/core/generator/llm/qualityGate.d.ts +34 -0
  76. package/dist/core/generator/llm/qualityGate.js +324 -0
  77. package/dist/core/generator/llm/qualityGate.js.map +1 -0
  78. package/dist/core/generator/llmGenerator.d.ts +34 -0
  79. package/dist/core/generator/llmGenerator.js +245 -0
  80. package/dist/core/generator/llmGenerator.js.map +1 -0
  81. package/dist/core/generator/quality.d.ts +17 -0
  82. package/dist/core/generator/quality.js +31 -0
  83. package/dist/core/generator/quality.js.map +1 -0
  84. package/dist/core/generator/registry.d.ts +26 -0
  85. package/dist/core/generator/registry.js +29 -0
  86. package/dist/core/generator/registry.js.map +1 -0
  87. package/dist/core/generator/smokeGenerator.d.ts +11 -0
  88. package/dist/core/generator/smokeGenerator.js +27 -0
  89. package/dist/core/generator/smokeGenerator.js.map +1 -0
  90. package/dist/core/generator/types.d.ts +48 -0
  91. package/dist/core/generator/types.js +2 -0
  92. package/dist/core/generator/types.js.map +1 -0
  93. package/dist/core/index/indexer.d.ts +29 -0
  94. package/dist/core/index/indexer.js +167 -0
  95. package/dist/core/index/indexer.js.map +1 -0
  96. package/dist/core/jest/parser.d.ts +17 -0
  97. package/dist/core/jest/parser.js +90 -0
  98. package/dist/core/jest/parser.js.map +1 -0
  99. package/dist/core/llm/provider.d.ts +55 -0
  100. package/dist/core/llm/provider.js +105 -0
  101. package/dist/core/llm/provider.js.map +1 -0
  102. package/dist/core/logger.d.ts +19 -0
  103. package/dist/core/logger.js +44 -0
  104. package/dist/core/logger.js.map +1 -0
  105. package/dist/core/plan/planner.d.ts +16 -0
  106. package/dist/core/plan/planner.js +91 -0
  107. package/dist/core/plan/planner.js.map +1 -0
  108. package/dist/core/process/exec.d.ts +22 -0
  109. package/dist/core/process/exec.js +83 -0
  110. package/dist/core/process/exec.js.map +1 -0
  111. package/dist/core/redact.d.ts +6 -0
  112. package/dist/core/redact.js +49 -0
  113. package/dist/core/redact.js.map +1 -0
  114. package/dist/core/repo/boundary.d.ts +10 -0
  115. package/dist/core/repo/boundary.js +58 -0
  116. package/dist/core/repo/boundary.js.map +1 -0
  117. package/dist/core/stableJson.d.ts +1 -0
  118. package/dist/core/stableJson.js +32 -0
  119. package/dist/core/stableJson.js.map +1 -0
  120. package/dist/core/state/policy.d.ts +20 -0
  121. package/dist/core/state/policy.js +51 -0
  122. package/dist/core/state/policy.js.map +1 -0
  123. package/dist/core/state/state.d.ts +67 -0
  124. package/dist/core/state/state.js +142 -0
  125. package/dist/core/state/state.js.map +1 -0
  126. package/dist/core/state/storage.d.ts +9 -0
  127. package/dist/core/state/storage.js +25 -0
  128. package/dist/core/state/storage.js.map +1 -0
  129. package/dist/core/targets/resolve.d.ts +28 -0
  130. package/dist/core/targets/resolve.js +96 -0
  131. package/dist/core/targets/resolve.js.map +1 -0
  132. package/dist/core/testGenerator/conventions.d.ts +7 -0
  133. package/dist/core/testGenerator/conventions.js +29 -0
  134. package/dist/core/testGenerator/conventions.js.map +1 -0
  135. package/dist/core/testGenerator/generate.d.ts +35 -0
  136. package/dist/core/testGenerator/generate.js +127 -0
  137. package/dist/core/testGenerator/generate.js.map +1 -0
  138. package/dist/core/testRunner/hints.d.ts +12 -0
  139. package/dist/core/testRunner/hints.js +133 -0
  140. package/dist/core/testRunner/hints.js.map +1 -0
  141. package/dist/core/testRunner/infer.d.ts +24 -0
  142. package/dist/core/testRunner/infer.js +65 -0
  143. package/dist/core/testRunner/infer.js.map +1 -0
  144. package/dist/core/testRunner/resolve.d.ts +12 -0
  145. package/dist/core/testRunner/resolve.js +31 -0
  146. package/dist/core/testRunner/resolve.js.map +1 -0
  147. package/dist/core/testRunner/runner.d.ts +24 -0
  148. package/dist/core/testRunner/runner.js +145 -0
  149. package/dist/core/testRunner/runner.js.map +1 -0
  150. package/dist/core/testability/heuristics.d.ts +7 -0
  151. package/dist/core/testability/heuristics.js +35 -0
  152. package/dist/core/testability/heuristics.js.map +1 -0
  153. package/dist/core/tests/fixers.d.ts +14 -0
  154. package/dist/core/tests/fixers.js +59 -0
  155. package/dist/core/tests/fixers.js.map +1 -0
  156. package/dist/core/tests/types.d.ts +98 -0
  157. package/dist/core/tests/types.js +2 -0
  158. package/dist/core/tests/types.js.map +1 -0
  159. package/package.json +55 -0
package/dist/cli.js ADDED
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env node
2
+ import { runStatusWithLogger } from './commands/status.js';
3
+ import { runIndexWithLogger } from './commands/index.js';
4
+ import { runPlanWithLogger } from './commands/plan.js';
5
+ import { runTestWithLogger } from './commands/test.js';
6
+ import { runPrListWithLogger } from './commands/pr_list.js';
7
+ import { runPrWithLogger } from './commands/pr.js';
8
+ import { runGenTestWithLogger } from './commands/gen_test.js';
9
+ import { runTestsWithLogger } from './commands/tests.js';
10
+ import { runContextWithLogger } from './commands/context.js';
11
+ import { runTestabilityWithLogger } from './commands/testability.js';
12
+ import { runFullWithLogger } from './commands/full.js';
13
+ import { createLogger } from './core/logger.js';
14
+ import path from 'node:path';
15
+ import { pathToFileURL } from 'node:url';
16
+ function renderHelp() {
17
+ // Keep output deterministic: stable ordering, stable spacing, no env-dependent values.
18
+ return [
19
+ 'test-agent',
20
+ '',
21
+ 'CI-friendly CLI that opens PRs with passing Jest unit tests.',
22
+ '',
23
+ 'Usage:',
24
+ ' test-agent [--help] [--version] [--verbose]',
25
+ ' test-agent status [--config <path>] [--verbose]',
26
+ ' test-agent index [--root <path>] [--verbose]',
27
+ ' test-agent plan [--root <path>] [--max-targets <n>] [--verbose]',
28
+ ' test-agent test [--root <path>] [--config <path>] [--timeout-ms <n>] [--verbose]',
29
+ ' test-agent tests --target <id|path> [--root <path>] [--config <path>] [--report <path>] [--dryRun] [--noPr] [--remote <url>] [--verbose]',
30
+ ' test-agent context --target <id|path> [--root <path>] [--out <path>] [--maxFiles <n>] [--maxChars <n>] [--maxDepth <n>] [--verbose]',
31
+ ' test-agent testability --target <id|path> [--root <path>] [--config <path>] [--verbose]',
32
+ ' test-agent full [--root <path>] [--config <path>] [--report <path>] [--dryRun] [--stale-hours <n>] [--remote <url>] [--verbose]',
33
+ ' test-agent pr --prNumber <n> [--root <path>] [--config <path>] [--report <path>] [--dryRun] [--remote <url>] [--verbose]',
34
+ ' test-agent companion --prNumber <n> [--root <path>] [--config <path>] [--report <path>] [--dryRun] [--remote <url>] [--verbose]',
35
+ ' test-agent pr:list [--config <path>] [--label <name>] [--prefix <branchPrefix>] [--max <n>] [--verbose]',
36
+ ' test-agent gen:test --target <path> [--root <path>] [--verbose]',
37
+ '',
38
+ 'Options:',
39
+ ' --help Print this help and exit 0',
40
+ ' --version Print version and exit 0',
41
+ ' --verbose Enable debug logs (printed to stderr)',
42
+ '',
43
+ 'Commands:',
44
+ ' status Print resolved config + missing fields + token env presence (no token value)',
45
+ ' index Write .test-agent/index.json (metadata-only), respecting .gitignore + deny dirs',
46
+ ' plan Read .test-agent/index.json and write .test-agent/plan.json (heuristic targets)',
47
+ ' test Run tests safely (resolved from config/policy/package.json), with timeout + redaction',
48
+ ' tests Generate tests + run test command in a bounded loop; writes a report (default <root>/.test-agent/report.json)',
49
+ ' context Build a deterministic, budgeted context bundle for a target (no test execution; no network)',
50
+ ' testability Propose minimal testability edit for a React target (data-testid) and open a PR (no auto-merge)',
51
+ ' full Orchestrate one safe unit of work: refresh PRs, enforce caps, pick target, run testability/tests lane',
52
+ ' pr Orchestrate one PR: pick 1 changed-file target and open/update a companion PR (no auto-merge)',
53
+ ' companion Alias for pr (companion PR workflow; no auto-merge)',
54
+ ' pr:list List open PRs filtered by label/prefix (GitHub REST; no auto-merge)',
55
+ ' gen:test Generate a safe Jest smoke test for a target file (idempotent)',
56
+ '',
57
+ 'Status:',
58
+ ' This is a scaffold. Future commits will add CI-safe PR workflows and Jest verification.',
59
+ ].join('\n');
60
+ }
61
+ function renderVersion() {
62
+ // Prefer a stable fallback rather than throwing if package.json isn't available in dist.
63
+ return process.env.npm_package_version ?? '0.0.0';
64
+ }
65
+ function writeStdout(text) {
66
+ process.stdout.write(text);
67
+ process.stdout.write('\n');
68
+ }
69
+ function writeStderr(text) {
70
+ process.stderr.write(text);
71
+ process.stderr.write('\n');
72
+ }
73
+ function exit(code) {
74
+ process.exit(code);
75
+ // Satisfy TypeScript even if process.exit isn't typed as `never` in some environments.
76
+ throw new Error(`Exited with code ${code}`);
77
+ }
78
+ export function parseArgs(argv) {
79
+ const args = argv.slice(2);
80
+ if (args.length === 0)
81
+ return { action: 'help', verbose: false };
82
+ const filtered = [];
83
+ let verbose = false;
84
+ for (const a of args) {
85
+ if (a === '--verbose') {
86
+ verbose = true;
87
+ continue;
88
+ }
89
+ filtered.push(a);
90
+ }
91
+ if (filtered.length === 0)
92
+ return { action: 'help', verbose };
93
+ const firstRaw = filtered[0];
94
+ const first = firstRaw === 'companion' ? 'pr' : firstRaw;
95
+ if (first === '--help' || first === '-h')
96
+ return { action: 'help', verbose };
97
+ if (first === '--version' || first === '-v')
98
+ return { action: 'version', verbose };
99
+ if (first === 'status')
100
+ return { action: 'status', argv: filtered.slice(1), verbose };
101
+ if (first === 'index')
102
+ return { action: 'index', argv: filtered.slice(1), verbose };
103
+ if (first === 'plan')
104
+ return { action: 'plan', argv: filtered.slice(1), verbose };
105
+ if (first === 'test')
106
+ return { action: 'test', argv: filtered.slice(1), verbose };
107
+ if (first === 'tests')
108
+ return { action: 'tests', argv: filtered.slice(1), verbose };
109
+ if (first === 'context')
110
+ return { action: 'context', argv: filtered.slice(1), verbose };
111
+ if (first === 'testability')
112
+ return { action: 'testability', argv: filtered.slice(1), verbose };
113
+ if (first === 'full')
114
+ return { action: 'full', argv: filtered.slice(1), verbose };
115
+ if (first === 'pr')
116
+ return { action: 'pr', argv: filtered.slice(1), verbose };
117
+ if (first === 'pr:list')
118
+ return { action: 'pr:list', argv: filtered.slice(1), verbose };
119
+ if (first === 'gen:test')
120
+ return { action: 'gen:test', argv: filtered.slice(1), verbose };
121
+ return { action: 'unknown', unknown: firstRaw ?? '', verbose };
122
+ }
123
+ async function main(argv) {
124
+ const parsed = parseArgs(argv);
125
+ const logger = createLogger({ verbose: parsed.verbose });
126
+ switch (parsed.action) {
127
+ case 'help': {
128
+ logger.output(renderHelp());
129
+ exit(0);
130
+ }
131
+ case 'version': {
132
+ logger.output(renderVersion());
133
+ exit(0);
134
+ }
135
+ case 'status': {
136
+ const code = runStatusWithLogger(parsed.argv, logger);
137
+ exit(code);
138
+ }
139
+ case 'index': {
140
+ const code = runIndexWithLogger(parsed.argv, logger);
141
+ exit(code);
142
+ }
143
+ case 'plan': {
144
+ const code = runPlanWithLogger(parsed.argv, logger);
145
+ exit(code);
146
+ }
147
+ case 'test': {
148
+ const code = await runTestWithLogger(parsed.argv, logger);
149
+ exit(code);
150
+ }
151
+ case 'tests': {
152
+ const code = await runTestsWithLogger(parsed.argv, logger);
153
+ exit(code);
154
+ }
155
+ case 'context': {
156
+ const code = await runContextWithLogger(parsed.argv, logger);
157
+ exit(code);
158
+ }
159
+ case 'testability': {
160
+ const code = await runTestabilityWithLogger(parsed.argv, logger);
161
+ exit(code);
162
+ }
163
+ case 'full': {
164
+ const code = await runFullWithLogger(parsed.argv, logger);
165
+ exit(code);
166
+ }
167
+ case 'pr': {
168
+ const code = await runPrWithLogger(parsed.argv, logger);
169
+ exit(code);
170
+ }
171
+ case 'pr:list': {
172
+ const code = await runPrListWithLogger(parsed.argv, logger);
173
+ exit(code);
174
+ }
175
+ case 'gen:test': {
176
+ const code = runGenTestWithLogger(parsed.argv, logger);
177
+ exit(code);
178
+ }
179
+ case 'unknown': {
180
+ logger.error(`Unknown argument: ${parsed.unknown}`);
181
+ logger.output(renderHelp());
182
+ exit(2);
183
+ }
184
+ }
185
+ }
186
+ function shouldRunMain() {
187
+ // Avoid side effects when imported (tests). Preserve CLI behavior when executed directly.
188
+ const entry = process.argv[1];
189
+ if (!entry)
190
+ return true;
191
+ try {
192
+ const entryUrl = pathToFileURL(path.resolve(entry)).href;
193
+ return entryUrl === import.meta.url;
194
+ }
195
+ catch {
196
+ return true;
197
+ }
198
+ }
199
+ if (shouldRunMain())
200
+ void main(process.argv);
201
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Logger } from '../core/logger.js';
2
+ export declare function runContextWithLogger(argv: readonly string[], logger: Logger): Promise<number>;
@@ -0,0 +1,275 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { stableStringify } from '../core/stableJson.js';
4
+ import { writeStableJson } from '../core/state/storage.js';
5
+ import { loadConfigFile } from '../core/config/load.js';
6
+ import { validateConfig } from '../core/config/validate.js';
7
+ import { loadOrInitPolicy } from '../core/state/policy.js';
8
+ import { resolveTargetIdOrPath } from '../core/targets/resolve.js';
9
+ import { findNearestRepoBoundary } from '../core/repo/boundary.js';
10
+ import { inferTestCommandAndRunner } from '../core/testRunner/infer.js';
11
+ import { redactText } from '../core/redact.js';
12
+ import { buildContextPack } from '../core/context/packer.js';
13
+ function toPosix(p) {
14
+ return p.replace(/\\/g, '/');
15
+ }
16
+ function parsePositiveInt(value) {
17
+ const n = Number(value);
18
+ if (!Number.isInteger(n) || n <= 0)
19
+ return null;
20
+ return n;
21
+ }
22
+ function parseNonNegativeInt(value) {
23
+ const n = Number(value);
24
+ if (!Number.isInteger(n) || n < 0)
25
+ return null;
26
+ return n;
27
+ }
28
+ function parseArgs(argv) {
29
+ const errors = [];
30
+ let root;
31
+ let target;
32
+ let out;
33
+ let maxFiles;
34
+ let maxChars;
35
+ let maxDepth;
36
+ for (let i = 0; i < argv.length; i++) {
37
+ const a = argv[i] ?? '';
38
+ if (a === '--root') {
39
+ const v = argv[i + 1];
40
+ if (typeof v !== 'string' || v.trim() === '')
41
+ errors.push('context: --root requires a path');
42
+ else {
43
+ root = v;
44
+ i++;
45
+ }
46
+ continue;
47
+ }
48
+ if (a.startsWith('--root=')) {
49
+ const v = a.slice('--root='.length);
50
+ if (v.trim() === '')
51
+ errors.push('context: --root requires a path');
52
+ else
53
+ root = v;
54
+ continue;
55
+ }
56
+ if (a === '--target') {
57
+ const v = argv[i + 1];
58
+ if (typeof v !== 'string' || v.trim() === '')
59
+ errors.push('context: --target requires a value');
60
+ else {
61
+ target = v;
62
+ i++;
63
+ }
64
+ continue;
65
+ }
66
+ if (a.startsWith('--target=')) {
67
+ const v = a.slice('--target='.length);
68
+ if (v.trim() === '')
69
+ errors.push('context: --target requires a value');
70
+ else
71
+ target = v;
72
+ continue;
73
+ }
74
+ if (a === '--out') {
75
+ const v = argv[i + 1];
76
+ if (typeof v !== 'string' || v.trim() === '')
77
+ errors.push('context: --out requires a path');
78
+ else {
79
+ out = v;
80
+ i++;
81
+ }
82
+ continue;
83
+ }
84
+ if (a.startsWith('--out=')) {
85
+ const v = a.slice('--out='.length);
86
+ if (v.trim() === '')
87
+ errors.push('context: --out requires a path');
88
+ else
89
+ out = v;
90
+ continue;
91
+ }
92
+ if (a === '--maxFiles') {
93
+ const v = argv[i + 1];
94
+ const n = typeof v === 'string' ? parsePositiveInt(v) : null;
95
+ if (n == null)
96
+ errors.push('context: --maxFiles must be a positive integer');
97
+ else {
98
+ maxFiles = n;
99
+ i++;
100
+ }
101
+ continue;
102
+ }
103
+ if (a.startsWith('--maxFiles=')) {
104
+ const v = a.slice('--maxFiles='.length);
105
+ const n = parsePositiveInt(v);
106
+ if (n == null)
107
+ errors.push('context: --maxFiles must be a positive integer');
108
+ else
109
+ maxFiles = n;
110
+ continue;
111
+ }
112
+ if (a === '--maxChars') {
113
+ const v = argv[i + 1];
114
+ const n = typeof v === 'string' ? parsePositiveInt(v) : null;
115
+ if (n == null)
116
+ errors.push('context: --maxChars must be a positive integer');
117
+ else {
118
+ maxChars = n;
119
+ i++;
120
+ }
121
+ continue;
122
+ }
123
+ if (a.startsWith('--maxChars=')) {
124
+ const v = a.slice('--maxChars='.length);
125
+ const n = parsePositiveInt(v);
126
+ if (n == null)
127
+ errors.push('context: --maxChars must be a positive integer');
128
+ else
129
+ maxChars = n;
130
+ continue;
131
+ }
132
+ if (a === '--maxDepth') {
133
+ const v = argv[i + 1];
134
+ const n = typeof v === 'string' ? parseNonNegativeInt(v) : null;
135
+ if (n == null)
136
+ errors.push('context: --maxDepth must be a non-negative integer');
137
+ else {
138
+ maxDepth = n;
139
+ i++;
140
+ }
141
+ continue;
142
+ }
143
+ if (a.startsWith('--maxDepth=')) {
144
+ const v = a.slice('--maxDepth='.length);
145
+ const n = parseNonNegativeInt(v);
146
+ if (n == null)
147
+ errors.push('context: --maxDepth must be a non-negative integer');
148
+ else
149
+ maxDepth = n;
150
+ continue;
151
+ }
152
+ if (a === '--help' || a === '-h')
153
+ continue;
154
+ errors.push(`context: unknown argument "${a}"`);
155
+ }
156
+ errors.sort((x, y) => x.localeCompare(y));
157
+ const args = {};
158
+ if (root !== undefined)
159
+ args.root = root;
160
+ if (target !== undefined)
161
+ args.target = target;
162
+ if (out !== undefined)
163
+ args.out = out;
164
+ if (maxFiles !== undefined)
165
+ args.maxFiles = maxFiles;
166
+ if (maxChars !== undefined)
167
+ args.maxChars = maxChars;
168
+ if (maxDepth !== undefined)
169
+ args.maxDepth = maxDepth;
170
+ return { args, errors };
171
+ }
172
+ function readJsonIfExists(absPath) {
173
+ if (!fs.existsSync(absPath))
174
+ return null;
175
+ try {
176
+ return JSON.parse(fs.readFileSync(absPath, 'utf8'));
177
+ }
178
+ catch {
179
+ return null;
180
+ }
181
+ }
182
+ export async function runContextWithLogger(argv, logger) {
183
+ const parsed = parseArgs(argv);
184
+ if (parsed.errors.length > 0) {
185
+ for (const e of parsed.errors)
186
+ logger.error(e);
187
+ return 2;
188
+ }
189
+ const rootAbs = path.resolve(process.cwd(), parsed.args.root ?? '.');
190
+ const targetInput = parsed.args.target?.trim() ?? '';
191
+ if (!targetInput) {
192
+ logger.error('context: Missing --target <id|path>');
193
+ return 2;
194
+ }
195
+ const cfgLoaded = loadConfigFile(undefined, {
196
+ cwd: () => rootAbs,
197
+ resolve: (...parts) => path.resolve(...parts),
198
+ existsSync: (p) => fs.existsSync(p),
199
+ readFileSync: (p, enc) => fs.readFileSync(p, enc),
200
+ });
201
+ const cfgValidated = validateConfig(cfgLoaded.data);
202
+ if (cfgValidated.errors.length > 0) {
203
+ for (const e of cfgValidated.errors)
204
+ logger.error(e);
205
+ return 2;
206
+ }
207
+ const policy = loadOrInitPolicy({ root: rootAbs }).policy;
208
+ const planAbs = path.join(rootAbs, '.test-agent', 'plan.json');
209
+ const plan = readJsonIfExists(planAbs);
210
+ const resolved = resolveTargetIdOrPath({ root: rootAbs, plan: plan ?? {}, targetInput });
211
+ if (!resolved.found) {
212
+ logger.output(stableStringify({
213
+ command: 'context',
214
+ error: 'target_not_found',
215
+ suggestions: resolved.suggestions,
216
+ }));
217
+ return 2;
218
+ }
219
+ const target = resolved.target;
220
+ const targetPaths = [...new Set(target.paths)].sort((a, b) => a.localeCompare(b));
221
+ const targetPathPosix = toPosix(targetPaths[0] ?? targetInput);
222
+ const boundaryStartAbs = path.resolve(rootAbs, targetPathPosix);
223
+ const boundary = findNearestRepoBoundary({ rootAbs, targetPathOrDirAbs: boundaryStartAbs });
224
+ const boundaryRootRel = toPosix(path.relative(rootAbs, boundary.packageRootAbs)) || null;
225
+ const pkgPath = path.join(boundary.packageRootAbs, 'package.json');
226
+ const pkg = boundary.kind === 'js' && fs.existsSync(pkgPath)
227
+ ? JSON.parse(fs.readFileSync(pkgPath, 'utf8'))
228
+ : null;
229
+ const inferred = inferTestCommandAndRunner({
230
+ rootAbs: boundary.packageRootAbs,
231
+ packageJson: pkg,
232
+ pythonBoundary: boundary.kind === 'py' ? { boundaryFileRel: boundary.boundaryFileRel } : null,
233
+ config: { testCommand: cfgValidated.resolved.test.command },
234
+ policy: { workingTestCommand: policy.workingTestCommand },
235
+ });
236
+ const budgets = {
237
+ maxFiles: parsed.args.maxFiles ?? 20,
238
+ maxChars: parsed.args.maxChars ?? 50_000,
239
+ maxDepth: parsed.args.maxDepth ?? 1,
240
+ maxFileChars: 8_000,
241
+ };
242
+ const indexAbs = path.join(rootAbs, '.test-agent', 'index.json');
243
+ const index = readJsonIfExists(indexAbs);
244
+ const basePackInput = {
245
+ rootAbs,
246
+ targetId: target.id,
247
+ targetPathPosix,
248
+ boundary: { kind: boundary.kind, rootPathPosix: boundaryRootRel, boundaryFileRel: boundary.boundaryFileRel },
249
+ inferred,
250
+ observed: null,
251
+ budgets,
252
+ nowMs: () => Date.now(),
253
+ readFileText: async (abs) => fs.promises.readFile(abs, 'utf8'),
254
+ redact: redactText,
255
+ };
256
+ const pack = await buildContextPack(index?.files
257
+ ? { ...basePackInput, listIndexFiles: async () => index.files?.map((f) => f.path) ?? [] }
258
+ : basePackInput);
259
+ const outArg = parsed.args.out?.trim();
260
+ const outRel = outArg ? toPosix(outArg) : `.test-agent/context/${target.id}.json`;
261
+ const outAbs = outArg && path.isAbsolute(outArg) ? outArg : path.resolve(rootAbs, outRel);
262
+ fs.mkdirSync(path.dirname(outAbs), { recursive: true });
263
+ writeStableJson(outAbs, pack);
264
+ logger.output(stableStringify({
265
+ command: 'context',
266
+ targetId: target.id,
267
+ out: toPosix(path.relative(rootAbs, outAbs)) || toPosix(outAbs),
268
+ filesUsed: pack.usage.filesUsed,
269
+ charsUsed: pack.usage.charsUsed,
270
+ hitMaxFiles: pack.usage.hitMaxFiles,
271
+ hitMaxChars: pack.usage.hitMaxChars,
272
+ }));
273
+ return 0;
274
+ }
275
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Logger } from '../core/logger.js';
2
+ import { createGithubAdapter } from '../adapters/github.js';
3
+ import { runTestabilityWithLogger } from './testability.js';
4
+ import { runTestsWithLogger } from './tests.js';
5
+ import { type ForkContext } from '../core/config/forkPolicy.js';
6
+ export declare function runFullWithLogger(argv: readonly string[], logger: Logger, deps?: {
7
+ nowMs?: () => number;
8
+ createGithubAdapter?: typeof createGithubAdapter;
9
+ runTestabilityWithLogger?: typeof runTestabilityWithLogger;
10
+ runTestsWithLogger?: typeof runTestsWithLogger;
11
+ /** Injected fork context for testing; undefined = not applicable (scheduled mode default). */
12
+ forkContext?: ForkContext;
13
+ }): Promise<number>;