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
package/LICENSE.md
ADDED
|
File without changes
|
package/README.md
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# test-agent
|
|
2
|
+
|
|
3
|
+
`test-agent` is a CI-friendly CLI that opens PRs with passing Jest unit tests (bounded + deterministic, PR-only, no auto-merge).
|
|
4
|
+
|
|
5
|
+
## Quick start
|
|
6
|
+
|
|
7
|
+
### Using npm (PowerShell-friendly)
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
npm install
|
|
11
|
+
npm run build
|
|
12
|
+
npm run smoke
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## What you get
|
|
16
|
+
|
|
17
|
+
- **Strict TypeScript**: configured in `tsconfig.json`
|
|
18
|
+
- **Minimal formatting**: Prettier config in `.prettierrc.json`
|
|
19
|
+
- **CLI entrypoint**: `src/cli.ts` (prints `--help`, exits 0)
|
|
20
|
+
- **Config MVP + status**: `test-agent status` loads `test-agent.yml` (or `--config <path>`) and prints resolved config + missing fields
|
|
21
|
+
- **Full orchestration**: `test-agent full` is the “one safe unit of work” command for CI (caps + stale handling + deterministic target choice)
|
|
22
|
+
- **Testability lane (MVP)**: `test-agent testability` can open a minimal “add data-testid” PR for React targets
|
|
23
|
+
- **Tests lane**: `test-agent tests` generates tests, runs the test command, and writes `.test-agent/report.json`
|
|
24
|
+
- **Folder structure**:
|
|
25
|
+
- `src/core/` (domain logic)
|
|
26
|
+
- `src/adapters/` (IO boundaries: git hosting, filesystem, process, network)
|
|
27
|
+
- `src/commands/` (CLI commands)
|
|
28
|
+
|
|
29
|
+
## Scripts
|
|
30
|
+
|
|
31
|
+
- **build**: `tsc` compile to `dist/`
|
|
32
|
+
- **test**: unit tests for the CLI itself (`node --test tests`)
|
|
33
|
+
- **lint**: typecheck-only (`tsc --noEmit`)
|
|
34
|
+
- **smoke**: build + run `--help`
|
|
35
|
+
|
|
36
|
+
## Config (MVP)
|
|
37
|
+
|
|
38
|
+
Create `test-agent.yml` at the repo root (or pass `--config path/to/test-agent.yml`):
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
baseBranch: main
|
|
42
|
+
github:
|
|
43
|
+
owner: your-org
|
|
44
|
+
repo: your-repo
|
|
45
|
+
tokenEnvVar: GITHUB_TOKEN
|
|
46
|
+
# Safety default: fork PRs are denied unless explicitly allowed.
|
|
47
|
+
allowForkPrs: false
|
|
48
|
+
limits:
|
|
49
|
+
maxFilesChanged: 50
|
|
50
|
+
maxLinesChanged: 5000
|
|
51
|
+
maxIterations: 5
|
|
52
|
+
maxOpenBotPRs: 3
|
|
53
|
+
maxPRsPerRun: 1
|
|
54
|
+
mode:
|
|
55
|
+
dryRun: true
|
|
56
|
+
test:
|
|
57
|
+
command: npm test
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Check config resolution (never prints token values):
|
|
61
|
+
|
|
62
|
+
```powershell
|
|
63
|
+
node dist/cli.js status
|
|
64
|
+
node dist/cli.js status --config path/to/test-agent.yml
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Local run
|
|
68
|
+
|
|
69
|
+
Recommended “safe first run” in a real repo (no network side effects):
|
|
70
|
+
|
|
71
|
+
```powershell
|
|
72
|
+
npm run build
|
|
73
|
+
node dist/cli.js index --root .
|
|
74
|
+
node dist/cli.js plan --root .
|
|
75
|
+
node dist/cli.js full --root . --dryRun --report .test-agent/full.json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
What “success” looks like:
|
|
79
|
+
- `full` exits `0` and prints a stable JSON object to stdout.
|
|
80
|
+
- In dryRun, it never opens/closes/comments on PRs and may set `refreshSkippedReason` (e.g. `dryrun_no_github_token`).
|
|
81
|
+
|
|
82
|
+
## Scheduled CI run (4x/day)
|
|
83
|
+
|
|
84
|
+
Minimal pattern: install deps, build, then run `full` (the orchestrator). Schedule it **4 times/day** in your CI system:
|
|
85
|
+
|
|
86
|
+
- Example cron (works for Jenkins “Build periodically”, and similarly in other systems): `H 1,7,13,19 * * *`
|
|
87
|
+
|
|
88
|
+
Jenkins notes and a Pipeline example: see `docs/jenkins.md`.
|
|
89
|
+
|
|
90
|
+
Notes:
|
|
91
|
+
- Prefer running `full` on a clean workspace with the repo checked out and a configured Git remote.
|
|
92
|
+
- Keep `mode.dryRun: true` until you verify behavior on your repo and CI environment.
|
|
93
|
+
- `limits.maxPRsPerRun` is enforced (default `1`): one run does at most one unit of work.
|
|
94
|
+
|
|
95
|
+
## Required permissions
|
|
96
|
+
|
|
97
|
+
### Git permissions (for real mode PR workflows)
|
|
98
|
+
- The CI checkout must be able to create branches and push (e.g. SSH deploy key or HTTPS token configured for `git push`).
|
|
99
|
+
|
|
100
|
+
### GitHub API permissions (for real mode PR workflows)
|
|
101
|
+
`test-agent` uses the env var named by `github.tokenEnvVar` from `test-agent.yml` (and never prints its value).
|
|
102
|
+
|
|
103
|
+
For a GitHub Fine-grained token, the minimum typically needed:
|
|
104
|
+
- **Contents**: Read & Write (push branches)
|
|
105
|
+
- **Pull requests**: Read & Write (open PRs, read PR status)
|
|
106
|
+
- **Issues**: Read & Write (comment on PRs / add labels)
|
|
107
|
+
- **Metadata**: Read
|
|
108
|
+
|
|
109
|
+
For a classic PAT, this is commonly covered by `repo` scope, but prefer fine-grained when possible.
|
|
110
|
+
|
|
111
|
+
## How to interpret `.test-agent/report.json` (tests command)
|
|
112
|
+
|
|
113
|
+
See `docs/report-json.md`.
|
|
114
|
+
|
|
115
|
+
## How to interpret `.test-agent/full.json` (full command)
|
|
116
|
+
|
|
117
|
+
`test-agent full` writes a small orchestration report (default: `<root>/.test-agent/full.json`):
|
|
118
|
+
- **`caps`** shows open PR count and whether the cap was hit
|
|
119
|
+
- **`refreshSkippedReason`** explains why GitHub refresh wasn’t attempted (dryRun safety)
|
|
120
|
+
- **`stale`** summarizes stale PR consideration and actions
|
|
121
|
+
- **`chosenTarget`** and **`lane`** show what it decided to do
|
|
122
|
+
|
|
123
|
+
## Logging
|
|
124
|
+
|
|
125
|
+
Commands use a structured logger with levels (**debug/info/warn/error**). Logs go to **stderr** to keep command output clean.
|
|
126
|
+
|
|
127
|
+
- Enable debug logs:
|
|
128
|
+
|
|
129
|
+
```powershell
|
|
130
|
+
node dist/cli.js status --verbose
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Golden demo (real PRs)
|
|
134
|
+
|
|
135
|
+
There is a PowerShell-friendly script that runs both modes (scheduled + PR companion) in **real mode**:
|
|
136
|
+
- Scheduled: `full` (opens/updates a bot PR on `baseBranch`)
|
|
137
|
+
- PR companion: `pr --prNumber <n>` (opens/updates a companion PR)
|
|
138
|
+
|
|
139
|
+
See `DEMO.md` and run `scripts/golden-demo.ps1`.
|
|
140
|
+
|
|
141
|
+
## License
|
|
142
|
+
Proprietary — All Rights Reserved. See LICENSE.
|
|
143
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type GitAdapter = {
|
|
2
|
+
ensureCleanWorkingTree: (opts?: {
|
|
3
|
+
ignoreUntrackedPrefixes?: string[];
|
|
4
|
+
}) => Promise<void>;
|
|
5
|
+
getCurrentSha: () => Promise<string>;
|
|
6
|
+
getBaseSha: (baseBranch: string) => Promise<string>;
|
|
7
|
+
createBranch: (baseBranch: string, branchName: string, opts?: {
|
|
8
|
+
ignoreUntrackedPrefixes?: string[];
|
|
9
|
+
}) => Promise<void>;
|
|
10
|
+
checkoutOrCreateBranch: (opts: {
|
|
11
|
+
remote: string;
|
|
12
|
+
baseRef: string;
|
|
13
|
+
branchName: string;
|
|
14
|
+
ignoreUntrackedPrefixes?: string[];
|
|
15
|
+
}) => Promise<void>;
|
|
16
|
+
commitAll: (message: string) => Promise<void>;
|
|
17
|
+
commitFiles: (paths: string[], message: string, opts?: {
|
|
18
|
+
ignoreUntrackedPrefixes?: string[];
|
|
19
|
+
}) => Promise<void>;
|
|
20
|
+
commitFilesIfChanged: (paths: string[], message: string, opts?: {
|
|
21
|
+
ignoreUntrackedPrefixes?: string[];
|
|
22
|
+
}) => Promise<boolean>;
|
|
23
|
+
pushBranch: (remote: string, branch: string) => Promise<void>;
|
|
24
|
+
branchExists: (remote: string, branch: string) => Promise<boolean>;
|
|
25
|
+
};
|
|
26
|
+
export declare function createGitAdapter(opts?: {
|
|
27
|
+
cwd?: string;
|
|
28
|
+
}): GitAdapter;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { execOrThrow } from '../core/process/exec.js';
|
|
2
|
+
function trimLine(s) {
|
|
3
|
+
return s.trim().split('\n')[0]?.trim() ?? '';
|
|
4
|
+
}
|
|
5
|
+
export function createGitAdapter(opts) {
|
|
6
|
+
const cwd = opts?.cwd ?? process.cwd();
|
|
7
|
+
const git = async (args) => {
|
|
8
|
+
const r = await execOrThrow('git', args, { cwd });
|
|
9
|
+
return { stdout: r.stdout };
|
|
10
|
+
};
|
|
11
|
+
const ensureCleanWorkingTree = async (opts2) => {
|
|
12
|
+
const r = await git(['status', '--porcelain']);
|
|
13
|
+
const ignore = (opts2?.ignoreUntrackedPrefixes ?? []).map((p) => p.replace(/\\/g, '/'));
|
|
14
|
+
const lines = r.stdout
|
|
15
|
+
.split('\n')
|
|
16
|
+
.map((l) => l.trimEnd())
|
|
17
|
+
.filter((l) => l.trim() !== '');
|
|
18
|
+
const remaining = lines.filter((l) => {
|
|
19
|
+
// Only ignore untracked entries with a known prefix (e.g., ".test-agent/").
|
|
20
|
+
if (!l.startsWith('?? '))
|
|
21
|
+
return true;
|
|
22
|
+
const file = l.slice(3).replace(/\\/g, '/');
|
|
23
|
+
for (const pref of ignore) {
|
|
24
|
+
if (file === pref || file.startsWith(pref))
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
});
|
|
29
|
+
if (remaining.length > 0) {
|
|
30
|
+
throw new Error('Working tree is not clean (git status --porcelain is non-empty)');
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const getCurrentSha = async () => {
|
|
34
|
+
const r = await git(['rev-parse', 'HEAD']);
|
|
35
|
+
return trimLine(r.stdout);
|
|
36
|
+
};
|
|
37
|
+
const getBaseSha = async (baseBranch) => {
|
|
38
|
+
const r = await git(['rev-parse', baseBranch]);
|
|
39
|
+
return trimLine(r.stdout);
|
|
40
|
+
};
|
|
41
|
+
const createBranch = async (baseBranch, branchName, opts2) => {
|
|
42
|
+
await ensureCleanWorkingTree(opts2);
|
|
43
|
+
await git(['checkout', baseBranch]);
|
|
44
|
+
await git(['pull', '--ff-only']).catch(() => {
|
|
45
|
+
// If no remote is configured, pull will fail; ignore for local-only workflows.
|
|
46
|
+
});
|
|
47
|
+
await git(['checkout', '-b', branchName, baseBranch]);
|
|
48
|
+
};
|
|
49
|
+
const checkoutOrCreateBranch = async (o) => {
|
|
50
|
+
const ignore = o.ignoreUntrackedPrefixes ?? ['.test-agent/'];
|
|
51
|
+
await ensureCleanWorkingTree({ ignoreUntrackedPrefixes: ignore });
|
|
52
|
+
// Best-effort fetch for remote branch updates; ignore if missing.
|
|
53
|
+
await git(['fetch', o.remote, o.branchName]).catch(() => { });
|
|
54
|
+
// If the local branch exists, checkout and fast-forward; otherwise try tracking remote.
|
|
55
|
+
const checkedOut = await git(['checkout', o.branchName]).then(() => true, () => false);
|
|
56
|
+
if (!checkedOut) {
|
|
57
|
+
const tracked = await git(['checkout', '-b', o.branchName, '--track', `${o.remote}/${o.branchName}`]).then(() => true, () => false);
|
|
58
|
+
if (!tracked) {
|
|
59
|
+
// Fall back to creating from baseRef (e.g. HEAD in CI).
|
|
60
|
+
await git(['checkout', o.baseRef]);
|
|
61
|
+
await git(['pull', '--ff-only']).catch(() => { });
|
|
62
|
+
await git(['checkout', '-b', o.branchName, o.baseRef]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
await git(['pull', '--ff-only']).catch(() => { });
|
|
66
|
+
};
|
|
67
|
+
const commitAll = async (message) => {
|
|
68
|
+
await git(['add', '-A']);
|
|
69
|
+
// If nothing to commit, git exits 1; treat as error for CI correctness.
|
|
70
|
+
await git(['commit', '-m', message]);
|
|
71
|
+
await ensureCleanWorkingTree({ ignoreUntrackedPrefixes: ['.test-agent/'] });
|
|
72
|
+
};
|
|
73
|
+
const commitFiles = async (paths, message, opts2) => {
|
|
74
|
+
if (paths.length === 0)
|
|
75
|
+
throw new Error('commitFiles: no paths provided');
|
|
76
|
+
await git(['add', '--', ...paths]);
|
|
77
|
+
await git(['commit', '-m', message]);
|
|
78
|
+
await ensureCleanWorkingTree(opts2 ?? { ignoreUntrackedPrefixes: ['.test-agent/'] });
|
|
79
|
+
};
|
|
80
|
+
const commitFilesIfChanged = async (paths, message, opts2) => {
|
|
81
|
+
if (paths.length === 0)
|
|
82
|
+
throw new Error('commitFilesIfChanged: no paths provided');
|
|
83
|
+
await git(['add', '--', ...paths]);
|
|
84
|
+
const diff = await git(['diff', '--cached', '--name-only', '--', ...paths]);
|
|
85
|
+
if (trimLine(diff.stdout) === '')
|
|
86
|
+
return false;
|
|
87
|
+
await git(['commit', '-m', message]);
|
|
88
|
+
await ensureCleanWorkingTree(opts2 ?? { ignoreUntrackedPrefixes: ['.test-agent/'] });
|
|
89
|
+
return true;
|
|
90
|
+
};
|
|
91
|
+
const pushBranch = async (remote, branch) => {
|
|
92
|
+
await git(['push', remote, `HEAD:${branch}`]);
|
|
93
|
+
};
|
|
94
|
+
const branchExists = async (remote, branch) => {
|
|
95
|
+
// Works with remote name or remote URL.
|
|
96
|
+
const r = await execOrThrow('git', ['ls-remote', '--heads', remote, `refs/heads/${branch}`], { cwd });
|
|
97
|
+
return r.stdout.trim() !== '';
|
|
98
|
+
};
|
|
99
|
+
return {
|
|
100
|
+
ensureCleanWorkingTree,
|
|
101
|
+
getCurrentSha,
|
|
102
|
+
getBaseSha,
|
|
103
|
+
createBranch,
|
|
104
|
+
checkoutOrCreateBranch,
|
|
105
|
+
commitAll,
|
|
106
|
+
commitFiles,
|
|
107
|
+
commitFilesIfChanged,
|
|
108
|
+
pushBranch,
|
|
109
|
+
branchExists,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/adapters/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export type PullRequestState = 'open' | 'closed' | 'merged';
|
|
2
|
+
export type PullRequestSummary = {
|
|
3
|
+
number: number;
|
|
4
|
+
title: string;
|
|
5
|
+
url: string;
|
|
6
|
+
headRef: string;
|
|
7
|
+
baseRef: string;
|
|
8
|
+
state: PullRequestState;
|
|
9
|
+
labels: string[];
|
|
10
|
+
};
|
|
11
|
+
export type PullRequestDetails = {
|
|
12
|
+
number: number;
|
|
13
|
+
url: string;
|
|
14
|
+
headRef: string;
|
|
15
|
+
baseRef: string;
|
|
16
|
+
headRepoFullName: string | null;
|
|
17
|
+
baseRepoFullName: string | null;
|
|
18
|
+
state: PullRequestState;
|
|
19
|
+
};
|
|
20
|
+
export type GithubAdapter = {
|
|
21
|
+
listOpenPullRequests: (opts: {
|
|
22
|
+
owner: string;
|
|
23
|
+
repo: string;
|
|
24
|
+
branchPrefix?: string;
|
|
25
|
+
label?: string;
|
|
26
|
+
max?: number;
|
|
27
|
+
}) => Promise<PullRequestSummary[]>;
|
|
28
|
+
readPullRequest: (opts: {
|
|
29
|
+
owner: string;
|
|
30
|
+
repo: string;
|
|
31
|
+
number: number;
|
|
32
|
+
}) => Promise<PullRequestDetails>;
|
|
33
|
+
listPullRequestFiles: (opts: {
|
|
34
|
+
owner: string;
|
|
35
|
+
repo: string;
|
|
36
|
+
number: number;
|
|
37
|
+
max?: number;
|
|
38
|
+
}) => Promise<string[]>;
|
|
39
|
+
openPullRequest: (opts: {
|
|
40
|
+
owner: string;
|
|
41
|
+
repo: string;
|
|
42
|
+
title: string;
|
|
43
|
+
body: string;
|
|
44
|
+
base: string;
|
|
45
|
+
head: string;
|
|
46
|
+
labels?: string[];
|
|
47
|
+
}) => Promise<PullRequestSummary>;
|
|
48
|
+
commentOnPullRequest: (opts: {
|
|
49
|
+
owner: string;
|
|
50
|
+
repo: string;
|
|
51
|
+
number: number;
|
|
52
|
+
body: string;
|
|
53
|
+
}) => Promise<void>;
|
|
54
|
+
closePullRequest: (opts: {
|
|
55
|
+
owner: string;
|
|
56
|
+
repo: string;
|
|
57
|
+
number: number;
|
|
58
|
+
}) => Promise<void>;
|
|
59
|
+
readPullRequestStatus: (opts: {
|
|
60
|
+
owner: string;
|
|
61
|
+
repo: string;
|
|
62
|
+
number: number;
|
|
63
|
+
}) => Promise<{
|
|
64
|
+
state: PullRequestState;
|
|
65
|
+
url: string;
|
|
66
|
+
}>;
|
|
67
|
+
};
|
|
68
|
+
export declare function createGithubAdapter(opts: {
|
|
69
|
+
token: string;
|
|
70
|
+
apiBaseUrl?: string;
|
|
71
|
+
}): GithubAdapter;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
function sortByNumber(prs) {
|
|
2
|
+
return [...prs].sort((a, b) => a.number - b.number);
|
|
3
|
+
}
|
|
4
|
+
function toLabels(value) {
|
|
5
|
+
if (!Array.isArray(value))
|
|
6
|
+
return [];
|
|
7
|
+
const names = value
|
|
8
|
+
.map((l) => (l && typeof l === 'object' ? l.name : null))
|
|
9
|
+
.filter((n) => typeof n === 'string' && n.trim() !== '');
|
|
10
|
+
return [...new Set(names)].sort((a, b) => a.localeCompare(b));
|
|
11
|
+
}
|
|
12
|
+
async function requestJson(opts) {
|
|
13
|
+
const { request: httpsRequest } = await import('node:https');
|
|
14
|
+
const { request: httpRequest } = await import('node:http');
|
|
15
|
+
const u = new URL(opts.url);
|
|
16
|
+
const requester = u.protocol === 'http:' ? httpRequest : httpsRequest;
|
|
17
|
+
const bodyText = opts.body === undefined ? null : JSON.stringify(opts.body);
|
|
18
|
+
const headers = {
|
|
19
|
+
Accept: 'application/vnd.github+json',
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
Authorization: `Bearer ${opts.token}`,
|
|
22
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
23
|
+
};
|
|
24
|
+
if (bodyText != null)
|
|
25
|
+
headers['Content-Length'] = String(Buffer.byteLength(bodyText, 'utf8'));
|
|
26
|
+
return await new Promise((resolve, reject) => {
|
|
27
|
+
const req = requester({
|
|
28
|
+
protocol: u.protocol,
|
|
29
|
+
hostname: u.hostname,
|
|
30
|
+
port: u.port ? Number(u.port) : undefined,
|
|
31
|
+
path: `${u.pathname}${u.search}`,
|
|
32
|
+
method: opts.method,
|
|
33
|
+
headers,
|
|
34
|
+
}, (res) => {
|
|
35
|
+
res.setEncoding('utf8');
|
|
36
|
+
let text = '';
|
|
37
|
+
res.on('data', (c) => (text += c));
|
|
38
|
+
res.on('end', () => {
|
|
39
|
+
const status = res.statusCode ?? 0;
|
|
40
|
+
if (status === 204)
|
|
41
|
+
return resolve({ status, json: null, text });
|
|
42
|
+
if (!text)
|
|
43
|
+
return resolve({ status, json: null, text });
|
|
44
|
+
try {
|
|
45
|
+
resolve({ status, json: JSON.parse(text), text });
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
resolve({ status, json: null, text });
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
req.on('error', reject);
|
|
53
|
+
if (bodyText != null)
|
|
54
|
+
req.write(bodyText);
|
|
55
|
+
req.end();
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function requireOk(status, method, url, text) {
|
|
59
|
+
if (status >= 200 && status < 300)
|
|
60
|
+
return;
|
|
61
|
+
throw new Error(`${method} ${url}: HTTP ${status}${text ? `: ${text}` : ''}`);
|
|
62
|
+
}
|
|
63
|
+
export function createGithubAdapter(opts) {
|
|
64
|
+
const apiBaseUrl = opts.apiBaseUrl ?? 'https://api.github.com';
|
|
65
|
+
const request = async (method, url, body) => {
|
|
66
|
+
const r = await requestJson({ method, url, token: opts.token, body });
|
|
67
|
+
requireOk(r.status, method, url, r.text);
|
|
68
|
+
return r.json;
|
|
69
|
+
};
|
|
70
|
+
const getIssueLabels = async (owner, repo, number) => {
|
|
71
|
+
const data = await request('GET', `${apiBaseUrl}/repos/${owner}/${repo}/issues/${number}`);
|
|
72
|
+
return toLabels(data?.labels);
|
|
73
|
+
};
|
|
74
|
+
const listOpenPullRequests = async (opts2) => {
|
|
75
|
+
const max = Math.max(1, Math.min(200, opts2.max ?? 100));
|
|
76
|
+
const perPage = Math.min(100, max);
|
|
77
|
+
const url = `${apiBaseUrl}/repos/${opts2.owner}/${opts2.repo}/pulls?state=open&per_page=${perPage}&page=1`;
|
|
78
|
+
const data = await request('GET', url);
|
|
79
|
+
const items = Array.isArray(data) ? data : [];
|
|
80
|
+
const mapped = [];
|
|
81
|
+
for (const pr of items) {
|
|
82
|
+
if (mapped.length >= max)
|
|
83
|
+
break;
|
|
84
|
+
if (!pr || typeof pr !== 'object')
|
|
85
|
+
continue;
|
|
86
|
+
const number = Number(pr.number);
|
|
87
|
+
if (!Number.isInteger(number))
|
|
88
|
+
continue;
|
|
89
|
+
const headRef = String(pr.head?.ref ?? '');
|
|
90
|
+
if (opts2.branchPrefix && !headRef.startsWith(opts2.branchPrefix))
|
|
91
|
+
continue;
|
|
92
|
+
const baseRef = String(pr.base?.ref ?? '');
|
|
93
|
+
const title = String(pr.title ?? '');
|
|
94
|
+
const url2 = String(pr.html_url ?? '');
|
|
95
|
+
// PR list payload may or may not include labels; only fetch issues when label filtering is requested.
|
|
96
|
+
const directLabels = toLabels(pr.labels);
|
|
97
|
+
const labels = opts2.label ? await getIssueLabels(opts2.owner, opts2.repo, number) : directLabels;
|
|
98
|
+
if (opts2.label && !labels.includes(opts2.label))
|
|
99
|
+
continue;
|
|
100
|
+
mapped.push({
|
|
101
|
+
number,
|
|
102
|
+
title,
|
|
103
|
+
url: url2,
|
|
104
|
+
headRef,
|
|
105
|
+
baseRef,
|
|
106
|
+
state: 'open',
|
|
107
|
+
labels,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return sortByNumber(mapped);
|
|
111
|
+
};
|
|
112
|
+
const readPullRequest = async (o) => {
|
|
113
|
+
const pr = await request('GET', `${apiBaseUrl}/repos/${o.owner}/${o.repo}/pulls/${o.number}`);
|
|
114
|
+
const state = String(pr?.state ?? '');
|
|
115
|
+
const mergedAt = pr?.merged_at;
|
|
116
|
+
const url = String(pr?.html_url ?? '');
|
|
117
|
+
const headRef = String(pr?.head?.ref ?? '');
|
|
118
|
+
const baseRef = String(pr?.base?.ref ?? '');
|
|
119
|
+
const headRepoFullName = (() => {
|
|
120
|
+
const v = pr?.head?.repo?.full_name;
|
|
121
|
+
return typeof v === 'string' && v.trim() !== '' ? v : null;
|
|
122
|
+
})();
|
|
123
|
+
const baseRepoFullName = (() => {
|
|
124
|
+
const v = pr?.base?.repo?.full_name;
|
|
125
|
+
return typeof v === 'string' && v.trim() !== '' ? v : null;
|
|
126
|
+
})();
|
|
127
|
+
const effective = mergedAt ? 'merged' : state === 'open' ? 'open' : 'closed';
|
|
128
|
+
return { number: o.number, url, headRef, baseRef, headRepoFullName, baseRepoFullName, state: effective };
|
|
129
|
+
};
|
|
130
|
+
const listPullRequestFiles = async (o) => {
|
|
131
|
+
const max = Math.max(1, Math.min(300, o.max ?? 300));
|
|
132
|
+
const perPage = Math.min(100, max);
|
|
133
|
+
const url = `${apiBaseUrl}/repos/${o.owner}/${o.repo}/pulls/${o.number}/files?per_page=${perPage}&page=1`;
|
|
134
|
+
const data = await request('GET', url);
|
|
135
|
+
const items = Array.isArray(data) ? data : [];
|
|
136
|
+
const names = items
|
|
137
|
+
.map((f) => (f && typeof f === 'object' ? f.filename : null))
|
|
138
|
+
.filter((x) => typeof x === 'string' && x.trim() !== '');
|
|
139
|
+
return [...new Set(names)].sort((a, b) => a.localeCompare(b)).slice(0, max);
|
|
140
|
+
};
|
|
141
|
+
const openPullRequest = async (o) => {
|
|
142
|
+
const pr = await request('POST', `${apiBaseUrl}/repos/${o.owner}/${o.repo}/pulls`, {
|
|
143
|
+
title: o.title,
|
|
144
|
+
body: o.body,
|
|
145
|
+
head: o.head,
|
|
146
|
+
base: o.base,
|
|
147
|
+
});
|
|
148
|
+
const number = Number(pr?.number);
|
|
149
|
+
if (!Number.isInteger(number))
|
|
150
|
+
throw new Error('openPullRequest: missing PR number');
|
|
151
|
+
if (o.labels && o.labels.length > 0) {
|
|
152
|
+
await request('POST', `${apiBaseUrl}/repos/${o.owner}/${o.repo}/issues/${number}/labels`, {
|
|
153
|
+
labels: o.labels,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
const labels = o.labels ? [...new Set(o.labels)].sort((a, b) => a.localeCompare(b)) : [];
|
|
157
|
+
return {
|
|
158
|
+
number,
|
|
159
|
+
title: String(pr?.title ?? ''),
|
|
160
|
+
url: String(pr?.html_url ?? ''),
|
|
161
|
+
headRef: String(pr?.head?.ref ?? o.head),
|
|
162
|
+
baseRef: String(pr?.base?.ref ?? o.base),
|
|
163
|
+
state: 'open',
|
|
164
|
+
labels,
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
const closePullRequest = async (o) => {
|
|
168
|
+
await request('PATCH', `${apiBaseUrl}/repos/${o.owner}/${o.repo}/pulls/${o.number}`, { state: 'closed' });
|
|
169
|
+
};
|
|
170
|
+
const commentOnPullRequest = async (o) => {
|
|
171
|
+
await request('POST', `${apiBaseUrl}/repos/${o.owner}/${o.repo}/issues/${o.number}/comments`, { body: o.body });
|
|
172
|
+
};
|
|
173
|
+
const readPullRequestStatus = async (o) => {
|
|
174
|
+
const pr = await request('GET', `${apiBaseUrl}/repos/${o.owner}/${o.repo}/pulls/${o.number}`);
|
|
175
|
+
const state = String(pr?.state ?? '');
|
|
176
|
+
const mergedAt = pr?.merged_at;
|
|
177
|
+
const url = String(pr?.html_url ?? '');
|
|
178
|
+
if (mergedAt)
|
|
179
|
+
return { state: 'merged', url };
|
|
180
|
+
if (state === 'open')
|
|
181
|
+
return { state: 'open', url };
|
|
182
|
+
return { state: 'closed', url };
|
|
183
|
+
};
|
|
184
|
+
return {
|
|
185
|
+
listOpenPullRequests,
|
|
186
|
+
readPullRequest,
|
|
187
|
+
listPullRequestFiles,
|
|
188
|
+
openPullRequest,
|
|
189
|
+
commentOnPullRequest,
|
|
190
|
+
closePullRequest,
|
|
191
|
+
readPullRequestStatus,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/adapters/github.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
type ParsedArgs = {
|
|
3
|
+
action: 'help' | 'version';
|
|
4
|
+
} | {
|
|
5
|
+
action: 'status';
|
|
6
|
+
argv: string[];
|
|
7
|
+
} | {
|
|
8
|
+
action: 'index';
|
|
9
|
+
argv: string[];
|
|
10
|
+
} | {
|
|
11
|
+
action: 'plan';
|
|
12
|
+
argv: string[];
|
|
13
|
+
} | {
|
|
14
|
+
action: 'test';
|
|
15
|
+
argv: string[];
|
|
16
|
+
} | {
|
|
17
|
+
action: 'tests';
|
|
18
|
+
argv: string[];
|
|
19
|
+
} | {
|
|
20
|
+
action: 'context';
|
|
21
|
+
argv: string[];
|
|
22
|
+
} | {
|
|
23
|
+
action: 'testability';
|
|
24
|
+
argv: string[];
|
|
25
|
+
} | {
|
|
26
|
+
action: 'full';
|
|
27
|
+
argv: string[];
|
|
28
|
+
} | {
|
|
29
|
+
action: 'pr';
|
|
30
|
+
argv: string[];
|
|
31
|
+
} | {
|
|
32
|
+
action: 'pr:list';
|
|
33
|
+
argv: string[];
|
|
34
|
+
} | {
|
|
35
|
+
action: 'gen:test';
|
|
36
|
+
argv: string[];
|
|
37
|
+
} | {
|
|
38
|
+
action: 'unknown';
|
|
39
|
+
unknown: string;
|
|
40
|
+
};
|
|
41
|
+
export declare function parseArgs(argv: readonly string[]): (ParsedArgs & {
|
|
42
|
+
verbose: boolean;
|
|
43
|
+
}) | {
|
|
44
|
+
action: 'help';
|
|
45
|
+
verbose: boolean;
|
|
46
|
+
};
|
|
47
|
+
export {};
|