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
@@ -0,0 +1,94 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { stableStringify } from '../core/stableJson.js';
4
+ import { generateJestTest } from '../core/testGenerator/generate.js';
5
+ function parseArgs(argv) {
6
+ const errors = [];
7
+ let root;
8
+ let target;
9
+ for (let i = 0; i < argv.length; i++) {
10
+ const a = argv[i] ?? '';
11
+ if (a === '--root') {
12
+ const v = argv[i + 1];
13
+ if (typeof v !== 'string' || v.trim() === '')
14
+ errors.push('gen:test: --root requires a path');
15
+ else {
16
+ root = v;
17
+ i++;
18
+ }
19
+ continue;
20
+ }
21
+ if (a.startsWith('--root=')) {
22
+ const v = a.slice('--root='.length);
23
+ if (v.trim() === '')
24
+ errors.push('gen:test: --root requires a path');
25
+ else
26
+ root = v;
27
+ continue;
28
+ }
29
+ if (a === '--target') {
30
+ const v = argv[i + 1];
31
+ if (typeof v !== 'string' || v.trim() === '')
32
+ errors.push('gen:test: --target requires a path');
33
+ else {
34
+ target = v;
35
+ i++;
36
+ }
37
+ continue;
38
+ }
39
+ if (a.startsWith('--target=')) {
40
+ const v = a.slice('--target='.length);
41
+ if (v.trim() === '')
42
+ errors.push('gen:test: --target requires a path');
43
+ else
44
+ target = v;
45
+ continue;
46
+ }
47
+ if (a === '--help' || a === '-h')
48
+ continue;
49
+ errors.push(`gen:test: unknown argument "${a}"`);
50
+ }
51
+ errors.sort((x, y) => x.localeCompare(y));
52
+ const args = {};
53
+ if (root !== undefined)
54
+ args.root = root;
55
+ if (target !== undefined)
56
+ args.target = target;
57
+ return { args, errors };
58
+ }
59
+ export function runGenTestWithLogger(argv, logger) {
60
+ const parsed = parseArgs(argv);
61
+ if (parsed.errors.length > 0) {
62
+ for (const e of parsed.errors)
63
+ logger.error(e);
64
+ return 2;
65
+ }
66
+ if (!parsed.args.target) {
67
+ logger.output(stableStringify({ command: 'gen:test', error: 'Missing --target <path>' }));
68
+ return 2;
69
+ }
70
+ const root = path.resolve(process.cwd(), parsed.args.root ?? '.');
71
+ const indexPath = path.join(root, '.test-agent', 'index.json');
72
+ if (!fs.existsSync(indexPath)) {
73
+ logger.output(stableStringify({
74
+ command: 'gen:test',
75
+ error: `Missing index at ${indexPath}. Run "test-agent index" first.`,
76
+ }));
77
+ return 2;
78
+ }
79
+ const index = JSON.parse(fs.readFileSync(indexPath, 'utf8'));
80
+ const files = Array.isArray(index.files) ? index.files : [];
81
+ const result = generateJestTest({ root, targetPath: parsed.args.target, indexFiles: files });
82
+ logger.output(stableStringify({
83
+ command: 'gen:test',
84
+ root,
85
+ targetId: result.targetId,
86
+ targetPath: result.targetPath,
87
+ generatedFiles: result.generatedFiles,
88
+ assumptionsUsed: result.assumptionsUsed,
89
+ warnings: result.warnings,
90
+ result,
91
+ }));
92
+ return result.created ? 0 : 0;
93
+ }
94
+ //# sourceMappingURL=gen_test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gen_test.js","sourceRoot":"","sources":["../../src/commands/gen_test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Logger } from '../core/logger.js';
2
+ export declare function runIndexWithLogger(argv: readonly string[], logger: Logger): number;
@@ -0,0 +1,62 @@
1
+ import path from 'node:path';
2
+ import { stableStringify } from '../core/stableJson.js';
3
+ import { buildRepoIndex, writeRepoIndex } from '../core/index/indexer.js';
4
+ function parseIndexArgs(argv) {
5
+ const errors = [];
6
+ let root;
7
+ for (let i = 0; i < argv.length; i++) {
8
+ const a = argv[i] ?? '';
9
+ if (a === '--root') {
10
+ const v = argv[i + 1];
11
+ if (typeof v !== 'string' || v.trim() === '')
12
+ errors.push('index: --root requires a path');
13
+ else {
14
+ root = v;
15
+ i++;
16
+ }
17
+ continue;
18
+ }
19
+ if (a.startsWith('--root=')) {
20
+ const v = a.slice('--root='.length);
21
+ if (v.trim() === '')
22
+ errors.push('index: --root requires a path');
23
+ else
24
+ root = v;
25
+ continue;
26
+ }
27
+ if (a === '--help' || a === '-h')
28
+ continue;
29
+ errors.push(`index: unknown argument "${a}"`);
30
+ }
31
+ errors.sort((x, y) => x.localeCompare(y));
32
+ const args = {};
33
+ if (root !== undefined)
34
+ args.root = root;
35
+ return { args, errors };
36
+ }
37
+ export function runIndexWithLogger(argv, logger) {
38
+ const parsed = parseIndexArgs(argv);
39
+ if (parsed.errors.length > 0) {
40
+ for (const e of parsed.errors)
41
+ logger.error(e);
42
+ return 2;
43
+ }
44
+ const root = path.resolve(process.cwd(), parsed.args.root ?? '.');
45
+ logger.info(`Indexing repo at ${root}`);
46
+ const { index, warnings } = buildRepoIndex(root);
47
+ for (const w of warnings)
48
+ logger.warn(w);
49
+ const { outputPath } = writeRepoIndex(root, index);
50
+ logger.info(`Wrote index to ${outputPath}`);
51
+ // Print a small stable summary to stdout (readable + CI-friendly).
52
+ logger.output(stableStringify({
53
+ command: 'index',
54
+ root,
55
+ outputPath,
56
+ fileCount: index.files.length,
57
+ signals: index.signals,
58
+ warnings,
59
+ }));
60
+ return 0;
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Logger } from '../core/logger.js';
2
+ export declare function runPlanWithLogger(argv: readonly string[], logger: Logger): number;
@@ -0,0 +1,107 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { stableStringify } from '../core/stableJson.js';
4
+ import { buildPlanFromIndex } from '../core/plan/planner.js';
5
+ function parsePositiveInt(value) {
6
+ const n = Number(value);
7
+ if (!Number.isInteger(n) || n <= 0)
8
+ return null;
9
+ return n;
10
+ }
11
+ function parsePlanArgs(argv) {
12
+ const errors = [];
13
+ let root;
14
+ let maxTargets;
15
+ for (let i = 0; i < argv.length; i++) {
16
+ const a = argv[i] ?? '';
17
+ if (a === '--root') {
18
+ const v = argv[i + 1];
19
+ if (typeof v !== 'string' || v.trim() === '')
20
+ errors.push('plan: --root requires a path');
21
+ else {
22
+ root = v;
23
+ i++;
24
+ }
25
+ continue;
26
+ }
27
+ if (a.startsWith('--root=')) {
28
+ const v = a.slice('--root='.length);
29
+ if (v.trim() === '')
30
+ errors.push('plan: --root requires a path');
31
+ else
32
+ root = v;
33
+ continue;
34
+ }
35
+ if (a === '--max-targets') {
36
+ const v = argv[i + 1];
37
+ if (typeof v !== 'string' || v.trim() === '')
38
+ errors.push('plan: --max-targets requires a number');
39
+ else {
40
+ const n = parsePositiveInt(v);
41
+ if (n == null)
42
+ errors.push('plan: --max-targets must be a positive integer');
43
+ else
44
+ maxTargets = n;
45
+ i++;
46
+ }
47
+ continue;
48
+ }
49
+ if (a.startsWith('--max-targets=')) {
50
+ const v = a.slice('--max-targets='.length);
51
+ const n = parsePositiveInt(v);
52
+ if (n == null)
53
+ errors.push('plan: --max-targets must be a positive integer');
54
+ else
55
+ maxTargets = n;
56
+ continue;
57
+ }
58
+ if (a === '--help' || a === '-h')
59
+ continue;
60
+ errors.push(`plan: unknown argument "${a}"`);
61
+ }
62
+ errors.sort((x, y) => x.localeCompare(y));
63
+ const args = {};
64
+ if (root !== undefined)
65
+ args.root = root;
66
+ if (maxTargets !== undefined)
67
+ args.maxTargets = maxTargets;
68
+ return { args, errors };
69
+ }
70
+ export function runPlanWithLogger(argv, logger) {
71
+ const parsed = parsePlanArgs(argv);
72
+ if (parsed.errors.length > 0) {
73
+ for (const e of parsed.errors)
74
+ logger.error(e);
75
+ return 2;
76
+ }
77
+ const root = path.resolve(process.cwd(), parsed.args.root ?? '.');
78
+ const indexPath = path.join(root, '.test-agent', 'index.json');
79
+ const planPath = path.join(root, '.test-agent', 'plan.json');
80
+ if (!fs.existsSync(indexPath)) {
81
+ logger.error(`plan: missing index file at ${indexPath} (run "test-agent index" first)`);
82
+ return 2;
83
+ }
84
+ let indexData;
85
+ try {
86
+ indexData = JSON.parse(fs.readFileSync(indexPath, 'utf8'));
87
+ }
88
+ catch (e) {
89
+ logger.error(`plan: failed to read/parse index.json: ${String(e)}`);
90
+ return 2;
91
+ }
92
+ const opts = {};
93
+ if (parsed.args.maxTargets !== undefined)
94
+ opts.maxTargets = parsed.args.maxTargets;
95
+ const plan = buildPlanFromIndex(indexData, opts);
96
+ fs.mkdirSync(path.dirname(planPath), { recursive: true });
97
+ fs.writeFileSync(planPath, stableStringify(plan) + '\n', 'utf8');
98
+ logger.output(stableStringify({
99
+ command: 'plan',
100
+ root,
101
+ indexPath,
102
+ outputPath: planPath,
103
+ targetCount: plan.targets.length,
104
+ }));
105
+ return 0;
106
+ }
107
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Logger } from '../core/logger.js';
2
+ import { type GithubAdapter } from '../adapters/github.js';
3
+ import { runTestsWithLogger } from './tests.js';
4
+ export declare function runPrWithLogger(argv: readonly string[], logger: Logger, deps?: {
5
+ createGithubAdapter?: (o: {
6
+ token: string;
7
+ }) => GithubAdapter;
8
+ runTestsWithLogger?: typeof runTestsWithLogger;
9
+ }): Promise<number>;