pipeline-worker 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -36
- package/dist/agent/claude.d.ts +17 -0
- package/dist/agent/claude.js +79 -5
- package/dist/agent/claude.js.map +1 -1
- package/dist/agent/types.d.ts +2 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/detectChecks.js +51 -2
- package/dist/config/detectChecks.js.map +1 -1
- package/dist/config/loader.js +26 -3
- package/dist/config/loader.js.map +1 -1
- package/dist/forge/github.js +12 -1
- package/dist/forge/github.js.map +1 -1
- package/dist/forge/gitlab.d.ts +1 -1
- package/dist/forge/gitlab.js +18 -5
- package/dist/forge/gitlab.js.map +1 -1
- package/dist/forge/types.d.ts +9 -0
- package/dist/git/commit.d.ts +20 -0
- package/dist/git/commit.js +37 -0
- package/dist/git/commit.js.map +1 -1
- package/dist/git/diff.d.ts +6 -0
- package/dist/git/diff.js +7 -1
- package/dist/git/diff.js.map +1 -1
- package/dist/git/resolveProjectPath.d.ts +22 -0
- package/dist/git/resolveProjectPath.js +37 -0
- package/dist/git/resolveProjectPath.js.map +1 -0
- package/dist/git/worktree.d.ts +24 -1
- package/dist/git/worktree.js +63 -3
- package/dist/git/worktree.js.map +1 -1
- package/dist/types.d.ts +16 -1
- package/dist/ui/steps.d.ts +34 -0
- package/dist/ui/steps.js +83 -0
- package/dist/ui/steps.js.map +1 -0
- package/dist/ui/welcome.d.ts +5 -0
- package/dist/ui/welcome.js +34 -0
- package/dist/ui/welcome.js.map +1 -0
- package/dist/workflow/captureIntent.js +71 -8
- package/dist/workflow/captureIntent.js.map +1 -1
- package/dist/workflow/openMergeRequest.d.ts +2 -0
- package/dist/workflow/openMergeRequest.js +24 -13
- package/dist/workflow/openMergeRequest.js.map +1 -1
- package/dist/workflow/orchestrate.js +48 -13
- package/dist/workflow/orchestrate.js.map +1 -1
- package/dist/workflow/runChecks.d.ts +6 -0
- package/dist/workflow/runChecks.js +33 -5
- package/dist/workflow/runChecks.js.map +1 -1
- package/dist/workflow/watchPipeline.d.ts +8 -1
- package/dist/workflow/watchPipeline.js +112 -22
- package/dist/workflow/watchPipeline.js.map +1 -1
- package/package.json +2 -4
- package/.env.example +0 -27
- package/.pipeline-worker.yml.example +0 -24
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# pipeline-worker
|
|
2
2
|
|
|
3
|
-
[](https://github.com/MohanTn/pipeline_worker/actions/workflows/ci.yml)
|
|
4
4
|
[](https://www.npmjs.com/package/pipeline-worker)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
|
|
7
|
-
Automate the last mile of your local changes: pipeline-worker takes the uncommitted diff in your repo and drives it — unattended
|
|
7
|
+
Automate the last mile of your local changes: pipeline-worker takes the uncommitted diff in your repo and drives it — unattended to a green merge request.
|
|
8
8
|
|
|
9
9
|
1. Captures your staged + unstaged changes (your working tree is never touched).
|
|
10
10
|
2. Replays them in a disposable git worktree.
|
|
@@ -29,63 +29,69 @@ npm install -g pipeline-worker
|
|
|
29
29
|
|
|
30
30
|
## Quick start
|
|
31
31
|
|
|
32
|
+
Set these once in your shell profile (`~/.zshrc` / `~/.bashrc`) and every
|
|
33
|
+
repo on the machine picks them up — no per-repo setup needed:
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
export PIPELINE_WORKER_AGENT=claude
|
|
37
|
+
export PIPELINE_WORKER_FORGE=gitlab
|
|
38
|
+
export PIPELINE_WORKER_GITLAB_HOST=https://gitlab.example.com
|
|
39
|
+
export PIPELINE_WORKER_GITLAB_TOKEN=glpat-xxxxx
|
|
40
|
+
export PIPELINE_WORKER_GITLAB_REPO_BASE=$HOME/REPO # local dir that mirrors the GitLab namespace root — enables auto-detected projectId in any repo underneath it
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Then, in any repo:
|
|
44
|
+
|
|
32
45
|
```sh
|
|
33
46
|
cd your-repo
|
|
34
|
-
cp $(npm root -g)/pipeline-worker/.env.example .env # set tokens & defaults
|
|
35
|
-
cp $(npm root -g)/pipeline-worker/.pipeline-worker.yml.example .pipeline-worker.yml
|
|
36
47
|
# hack, hack, hack — leave the changes uncommitted, then:
|
|
37
48
|
pipeline-worker
|
|
38
49
|
```
|
|
39
50
|
|
|
40
51
|
## Configuration
|
|
41
52
|
|
|
42
|
-
|
|
53
|
+
pipeline-worker is configured entirely through real environment variables — set them in your shell profile once, and every repo picks them up.
|
|
43
54
|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
|
|
|
51
|
-
| `
|
|
52
|
-
|
|
|
53
|
-
| `
|
|
54
|
-
| `
|
|
55
|
-
| `pollIntervalSeconds` | `PIPELINE_WORKER_POLL_INTERVAL_SECONDS` | `15` | pipeline poll cadence; use `60` for slow pipelines |
|
|
55
|
+
| Env var | Default | Meaning |
|
|
56
|
+
| --------------------------------------- | ---------------------------- | ----------------------------------------------------------------------------- |
|
|
57
|
+
| `PIPELINE_WORKER_AGENT` | `claude` | `claude` or `copilot` |
|
|
58
|
+
| `PIPELINE_WORKER_FORGE` | `gitlab` | `gitlab` or `github` |
|
|
59
|
+
| `PIPELINE_WORKER_GITLAB_HOST` | — | e.g. `https://gitlab.example.com` |
|
|
60
|
+
| `PIPELINE_WORKER_GITLAB_PROJECT_ID` | — | numeric project id |
|
|
61
|
+
| `PIPELINE_WORKER_GITLAB_REPO_BASE` | — | local dir mirroring the GitLab namespace root, for auto-detecting `projectId` |
|
|
62
|
+
| `PIPELINE_WORKER_GITLAB_TOKEN` | — | GitLab API token |
|
|
63
|
+
| `PIPELINE_WORKER_GITHUB_REPO` | — | `owner/name` slug |
|
|
64
|
+
| `PIPELINE_WORKER_GITHUB_TOKEN` | falls back to `GITHUB_TOKEN` | GitHub token |
|
|
65
|
+
| `PIPELINE_WORKER_POLL_INTERVAL_SECONDS` | `15` | pipeline poll cadence; use `60` for slow pipelines |
|
|
56
66
|
|
|
57
|
-
|
|
67
|
+
`build` / `lint` / `test` local check commands and `maxFixAttempts` (default `5`) are not configurable via env var — see auto-detection below.
|
|
58
68
|
|
|
59
69
|
### Check command auto-detection
|
|
60
70
|
|
|
61
|
-
|
|
71
|
+
`build` / `lint` / `test` are picked from the repo's toolchain (first marker found wins; mixed-language repos should set the commands explicitly):
|
|
62
72
|
|
|
63
|
-
| Toolchain
|
|
64
|
-
|
|
|
65
|
-
| Node / TypeScript | `package.json`
|
|
66
|
-
| .NET
|
|
67
|
-
| Go
|
|
68
|
-
| Python
|
|
73
|
+
| Toolchain | Marker | build | lint | test |
|
|
74
|
+
| ----------------- | ------------------------------------------------------ | ---------------- | ----------------------------------- | ------------------------------------------------ |
|
|
75
|
+
| Node / TypeScript | `package.json` | `npm run build` | `npm run lint` | `npm test` — each only if the script is declared |
|
|
76
|
+
| .NET | `*.sln` / `*.csproj` / `*.fsproj` / `*.vbproj` at root | `dotnet build` | `dotnet format --verify-no-changes` | `dotnet test` |
|
|
77
|
+
| Go | `go.mod` | `go build ./...` | `go vet ./...` | `go test ./...` |
|
|
78
|
+
| Python | `pyproject.toml` / `setup.py` / `requirements.txt` | — | — | `pytest` |
|
|
69
79
|
|
|
70
|
-
A stage with no command (
|
|
80
|
+
A stage with no command (`—`) is skipped. If no toolchain is detected and no commands are configured, all local checks are skipped with a warning.
|
|
71
81
|
|
|
72
82
|
## Commands
|
|
73
83
|
|
|
74
|
-
| Command
|
|
75
|
-
|
|
|
76
|
-
| `pipeline-worker` (or `pipeline-worker run`) | Capture the current diff and drive it to a green MR/PR
|
|
77
|
-
| `pipeline-worker serve`
|
|
78
|
-
| `pipeline-worker resume --branch <name>`
|
|
79
|
-
| `pipeline-worker status --branch <name>`
|
|
84
|
+
| Command | What it does |
|
|
85
|
+
| -------------------------------------------- | ------------------------------------------------------------------------- |
|
|
86
|
+
| `pipeline-worker` (or `pipeline-worker run`) | Capture the current diff and drive it to a green MR/PR |
|
|
87
|
+
| `pipeline-worker serve` | Start the forge MCP server over stdio (used by the agent during fix runs) |
|
|
88
|
+
| `pipeline-worker resume --branch <name>` | Resume watching/fixing a run after a crash |
|
|
89
|
+
| `pipeline-worker status --branch <name>` | Print the persisted state of a run |
|
|
80
90
|
|
|
81
91
|
## How the fix loop stays bounded
|
|
82
92
|
|
|
83
93
|
Every retry path has a cap: local checks abort the run before an MR is ever opened; pipeline polling gives up after a 2-hour safety window; fix attempts stop at `maxFixAttempts`; a fix attempt that changes no files, or a pipeline that ends `canceled`/`skipped`, escalates immediately instead of spending agent tokens. Escalation always leaves a comment on the MR/PR so a human knows to take over.
|
|
84
94
|
|
|
85
|
-
## Contributing
|
|
86
|
-
|
|
87
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md). Please note the [Code of Conduct](CODE_OF_CONDUCT.md) and report vulnerabilities per [SECURITY.md](SECURITY.md).
|
|
88
|
-
|
|
89
95
|
## License
|
|
90
96
|
|
|
91
97
|
[MIT](LICENSE)
|
package/dist/agent/claude.d.ts
CHANGED
|
@@ -3,6 +3,23 @@
|
|
|
3
3
|
* `claude` CLI: `-p/--print`, `--output-format json`, `--permission-mode`,
|
|
4
4
|
* `--json-schema`, `--mcp-config`. There is no `--cwd` flag — working
|
|
5
5
|
* directory is controlled by the spawned process's `cwd` option.
|
|
6
|
+
*
|
|
7
|
+
* When the spawned CLI exits non-zero, the rejection we throw includes
|
|
8
|
+
* **stdout in addition to stderr**. Under `--output-format json` Claude
|
|
9
|
+
* frequently writes a structured `is_error: true` envelope to stdout, which
|
|
10
|
+
* is where the real diagnostic lives; Node's default execFile rejection only
|
|
11
|
+
* surfaces the command line + stderr, so without this the most useful failure
|
|
12
|
+
* information is silently dropped.
|
|
6
13
|
*/
|
|
7
14
|
import type { AgentAdapter } from './types.js';
|
|
15
|
+
/** Subset of the rejection shape Node's promisified execFile produces. */
|
|
16
|
+
interface ExecErrorShape {
|
|
17
|
+
code?: number | string | null;
|
|
18
|
+
signal?: NodeJS.Signals | null;
|
|
19
|
+
stdout?: string;
|
|
20
|
+
stderr?: string;
|
|
21
|
+
message?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function formatProcessError(err: ExecErrorShape): string;
|
|
8
24
|
export declare const claudeAdapter: AgentAdapter;
|
|
25
|
+
export {};
|
package/dist/agent/claude.js
CHANGED
|
@@ -3,11 +3,74 @@
|
|
|
3
3
|
* `claude` CLI: `-p/--print`, `--output-format json`, `--permission-mode`,
|
|
4
4
|
* `--json-schema`, `--mcp-config`. There is no `--cwd` flag — working
|
|
5
5
|
* directory is controlled by the spawned process's `cwd` option.
|
|
6
|
+
*
|
|
7
|
+
* When the spawned CLI exits non-zero, the rejection we throw includes
|
|
8
|
+
* **stdout in addition to stderr**. Under `--output-format json` Claude
|
|
9
|
+
* frequently writes a structured `is_error: true` envelope to stdout, which
|
|
10
|
+
* is where the real diagnostic lives; Node's default execFile rejection only
|
|
11
|
+
* surfaces the command line + stderr, so without this the most useful failure
|
|
12
|
+
* information is silently dropped.
|
|
6
13
|
*/
|
|
7
14
|
import { execFile } from 'node:child_process';
|
|
8
15
|
import { promisify } from 'node:util';
|
|
9
16
|
const execFileAsync = promisify(execFile);
|
|
10
17
|
const INVOKE_TIMEOUT_MS = 300_000;
|
|
18
|
+
/**
|
|
19
|
+
* Tail-truncation cap for stdout/stderr in the rejection message. Mirrors
|
|
20
|
+
* `watchPipeline.ts`'s `.slice(-4000)` so a verbose agent failure (e.g. an
|
|
21
|
+
* error envelope that re-echoes the input diff) doesn't blow up the error
|
|
22
|
+
* text that propagates through captureIntent and ultimately lands in the
|
|
23
|
+
* CLI's stderr.
|
|
24
|
+
*/
|
|
25
|
+
const MAX_ERROR_OUTPUT_CHARS = 4000;
|
|
26
|
+
/**
|
|
27
|
+
* Composes a human-readable message naming the cause (exit code or signal)
|
|
28
|
+
* and including both stdout and stderr streams. Exported for unit testing so
|
|
29
|
+
* callers building on top of this adapter can pin its behavior.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Renders one captured stream (`stdout` or `stderr`) as a single block, with
|
|
33
|
+
* tail-truncation and a visible marker when the stream exceeded the cap.
|
|
34
|
+
* Returns the empty string when there is nothing meaningful to show so the
|
|
35
|
+
* caller can skip the block entirely.
|
|
36
|
+
*/
|
|
37
|
+
function formatStreamBlock(label, raw) {
|
|
38
|
+
if (!raw || raw.trim().length === 0)
|
|
39
|
+
return '';
|
|
40
|
+
const trimmed = raw.trim();
|
|
41
|
+
if (trimmed.length <= MAX_ERROR_OUTPUT_CHARS) {
|
|
42
|
+
return `--- ${label} ---\n${trimmed}`;
|
|
43
|
+
}
|
|
44
|
+
const dropped = trimmed.length - MAX_ERROR_OUTPUT_CHARS;
|
|
45
|
+
return `--- ${label} ---\n[... ${dropped} chars truncated, showing last ${MAX_ERROR_OUTPUT_CHARS} ...]\n${trimmed.slice(-MAX_ERROR_OUTPUT_CHARS)}`;
|
|
46
|
+
}
|
|
47
|
+
export function formatProcessError(err) {
|
|
48
|
+
let cause;
|
|
49
|
+
if (err.signal) {
|
|
50
|
+
cause = `killed by signal ${err.signal}`;
|
|
51
|
+
}
|
|
52
|
+
else if (err.code !== undefined && err.code !== null) {
|
|
53
|
+
cause = `exited with code ${err.code}`;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
cause = 'failed with no exit code or signal reported';
|
|
57
|
+
}
|
|
58
|
+
const lines = [`claude ${cause}.`];
|
|
59
|
+
for (const [label, raw] of [['stdout', err.stdout], ['stderr', err.stderr]]) {
|
|
60
|
+
const block = formatStreamBlock(label, raw);
|
|
61
|
+
if (block)
|
|
62
|
+
lines.push(block);
|
|
63
|
+
}
|
|
64
|
+
// Only fall through to the underlying Node error message when neither
|
|
65
|
+
// captured stream has content — typical of spawn-time failures like
|
|
66
|
+
// ENOENT, where the message is the only context we have.
|
|
67
|
+
const hasStdout = !!(err.stdout && err.stdout.trim().length > 0);
|
|
68
|
+
const hasStderr = !!(err.stderr && err.stderr.trim().length > 0);
|
|
69
|
+
if (err.message && err.message.trim().length > 0 && !hasStdout && !hasStderr) {
|
|
70
|
+
lines.push(`(underlying: ${err.message.trim()})`);
|
|
71
|
+
}
|
|
72
|
+
return lines.join('\n');
|
|
73
|
+
}
|
|
11
74
|
export const claudeAdapter = {
|
|
12
75
|
async invoke(opts) {
|
|
13
76
|
const args = [
|
|
@@ -21,11 +84,22 @@ export const claudeAdapter = {
|
|
|
21
84
|
if (opts.mcpConfigPath) {
|
|
22
85
|
args.push('--mcp-config', opts.mcpConfigPath);
|
|
23
86
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
87
|
+
if (opts.model) {
|
|
88
|
+
args.push('--model', opts.model);
|
|
89
|
+
}
|
|
90
|
+
let stdout;
|
|
91
|
+
try {
|
|
92
|
+
const result = await execFileAsync('claude', args, {
|
|
93
|
+
cwd: opts.cwd,
|
|
94
|
+
timeout: INVOKE_TIMEOUT_MS,
|
|
95
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
96
|
+
});
|
|
97
|
+
stdout = result.stdout;
|
|
98
|
+
}
|
|
99
|
+
catch (rawErr) {
|
|
100
|
+
const err = rawErr;
|
|
101
|
+
throw new Error(formatProcessError(err));
|
|
102
|
+
}
|
|
29
103
|
try {
|
|
30
104
|
const parsed = JSON.parse(stdout);
|
|
31
105
|
return { text: parsed.result ?? stdout, raw: parsed };
|
package/dist/agent/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agent/claude.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agent/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/types.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export interface AgentInvokeOptions {
|
|
|
10
10
|
mcpConfigPath?: string;
|
|
11
11
|
/** Optional permission mode override; adapters default to an auto-accept mode suitable for unattended runs. */
|
|
12
12
|
permissionMode?: string;
|
|
13
|
+
/** Optional model override (e.g. "haiku"), for adapters that support per-invocation model selection. */
|
|
14
|
+
model?: string;
|
|
13
15
|
}
|
|
14
16
|
export interface AgentInvokeResult {
|
|
15
17
|
/** The agent's final text answer (or, when jsonSchema was supplied, its raw JSON string). */
|
package/dist/cli.js
CHANGED
|
@@ -49,7 +49,7 @@ program
|
|
|
49
49
|
const config = loadConfig(repoRoot);
|
|
50
50
|
const forge = createForge(config);
|
|
51
51
|
const agent = selectAgent(config);
|
|
52
|
-
await watchPipeline(forge, config, agent, state.worktreePath, state.branch, state.mrIid, state, repoRoot);
|
|
52
|
+
await watchPipeline(forge, config, agent, state.worktreePath, state.branch, state.targetBranch, state.mrIid, state, repoRoot);
|
|
53
53
|
console.log(`pipeline-worker: resumed run finished with phase "${state.phase}".`);
|
|
54
54
|
}
|
|
55
55
|
catch (error) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAElE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC,kEAAkE,CAAC,CAAC;AAEhH,OAAO;KACJ,OAAO,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACnC,WAAW,CAAC,8EAA8E,CAAC;KAC3F,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uEAAuE,CAAC;KACpF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,WAAW,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,cAAc,CAAC,iBAAiB,EAAE,kCAAkC,CAAC;KACrE,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,sDAAsD,IAAI,CAAC,MAAM,mCAAmC,CAAC,CAAC;YACpH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
9
9
|
import { join } from 'node:path';
|
|
10
|
-
const
|
|
10
|
+
const DOTNET_SOLUTION_SUFFIXES = ['.sln', '.slnx'];
|
|
11
|
+
const DOTNET_PROJECT_SUFFIXES = [...DOTNET_SOLUTION_SUFFIXES, '.csproj', '.fsproj', '.vbproj'];
|
|
11
12
|
const PYTHON_MARKERS = ['pyproject.toml', 'setup.py', 'requirements.txt'];
|
|
12
13
|
/** Maps each stage to `npm run <script>` only for scripts the repo declares. */
|
|
13
14
|
function detectNode(repoRoot) {
|
|
@@ -28,6 +29,40 @@ function detectNode(repoRoot) {
|
|
|
28
29
|
test: 'test' in scripts ? 'npm test' : '',
|
|
29
30
|
};
|
|
30
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns true when the repo uses CSharpier as its formatter.
|
|
34
|
+
* Detected via a .csharpierignore file at the root OR a 'csharpier' entry
|
|
35
|
+
* in .config/dotnet-tools.json (the standard local tools manifest).
|
|
36
|
+
*/
|
|
37
|
+
function hasCsharpier(repoRoot) {
|
|
38
|
+
if (existsSync(join(repoRoot, '.csharpierignore')))
|
|
39
|
+
return true;
|
|
40
|
+
const toolsManifest = join(repoRoot, '.config', 'dotnet-tools.json');
|
|
41
|
+
if (!existsSync(toolsManifest))
|
|
42
|
+
return false;
|
|
43
|
+
try {
|
|
44
|
+
const manifest = JSON.parse(readFileSync(toolsManifest, 'utf-8'));
|
|
45
|
+
return 'csharpier' in (manifest.tools ?? {});
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Builds the DetectedChecks for a .NET repo.
|
|
53
|
+
* @param repoRoot - absolute path to the repo root
|
|
54
|
+
* @param slnSubdir - relative subdirectory containing the .sln (e.g. 'src'), or undefined if at root
|
|
55
|
+
*/
|
|
56
|
+
function detectDotnet(repoRoot, slnSubdir) {
|
|
57
|
+
const build = slnSubdir ? `dotnet build ${slnSubdir}` : 'dotnet build';
|
|
58
|
+
const lint = hasCsharpier(repoRoot)
|
|
59
|
+
? 'dotnet tool restore && dotnet csharpier check .'
|
|
60
|
+
: 'dotnet format --verify-no-changes';
|
|
61
|
+
// A `run-tests` script is a common pattern for repos that wrap dotnet test
|
|
62
|
+
// with coverage reporting; prefer it over the bare dotnet test command.
|
|
63
|
+
const test = existsSync(join(repoRoot, 'run-tests')) ? './run-tests Unit' : 'dotnet test';
|
|
64
|
+
return { language: 'dotnet', build, lint, test };
|
|
65
|
+
}
|
|
31
66
|
export function detectChecks(repoRoot) {
|
|
32
67
|
if (existsSync(join(repoRoot, 'package.json')))
|
|
33
68
|
return detectNode(repoRoot);
|
|
@@ -38,8 +73,22 @@ export function detectChecks(repoRoot) {
|
|
|
38
73
|
catch {
|
|
39
74
|
// Unreadable root: fall through to unknown, honoring loader.ts's never-throw contract.
|
|
40
75
|
}
|
|
76
|
+
// .sln/.csproj at the repo root
|
|
41
77
|
if (rootEntries.some((name) => DOTNET_PROJECT_SUFFIXES.some((suffix) => name.endsWith(suffix)))) {
|
|
42
|
-
return
|
|
78
|
+
return detectDotnet(repoRoot);
|
|
79
|
+
}
|
|
80
|
+
// .sln in a src/ subdirectory — a common layout where source lives one level down
|
|
81
|
+
const srcDir = join(repoRoot, 'src');
|
|
82
|
+
if (existsSync(srcDir)) {
|
|
83
|
+
try {
|
|
84
|
+
const srcEntries = readdirSync(srcDir);
|
|
85
|
+
if (srcEntries.some((name) => DOTNET_SOLUTION_SUFFIXES.some((suffix) => name.endsWith(suffix)))) {
|
|
86
|
+
return detectDotnet(repoRoot, 'src');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Ignore readdir errors on the src/ subdirectory.
|
|
91
|
+
}
|
|
43
92
|
}
|
|
44
93
|
if (existsSync(join(repoRoot, 'go.mod'))) {
|
|
45
94
|
return { language: 'go', build: 'go build ./...', lint: 'go vet ./...', test: 'go test ./...' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detectChecks.js","sourceRoot":"","sources":["../../src/config/detectChecks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,
|
|
1
|
+
{"version":3,"file":"detectChecks.js","sourceRoot":"","sources":["../../src/config/detectChecks.ts"],"names":[],"mappings":"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"}
|
package/dist/config/loader.js
CHANGED
|
@@ -12,6 +12,7 @@ import { join } from 'node:path';
|
|
|
12
12
|
import { parseEnv } from 'node:util';
|
|
13
13
|
import { load } from 'js-yaml';
|
|
14
14
|
import { detectChecks } from './detectChecks.js';
|
|
15
|
+
import { deriveProjectPath } from '../git/resolveProjectPath.js';
|
|
15
16
|
const CONFIG_FILE_NAME = '.pipeline-worker.yml';
|
|
16
17
|
const AGENT_NAMES = ['claude', 'copilot'];
|
|
17
18
|
const FORGE_NAMES = ['gitlab', 'github'];
|
|
@@ -78,15 +79,37 @@ export function loadConfig(repoRoot, override) {
|
|
|
78
79
|
}
|
|
79
80
|
// Each tier is validated independently: an invalid env value falls back to
|
|
80
81
|
// a valid yaml value, not straight to the built-in default.
|
|
82
|
+
// Resolve the repoBase: env var wins over YAML value
|
|
83
|
+
const repoBase = process.env.PIPELINE_WORKER_GITLAB_REPO_BASE || parsed.gitlab?.repoBase;
|
|
84
|
+
// Resolve projectId: YAML value is authoritative; when unset, fall back to
|
|
85
|
+
// auto-detecting a string path from repoBase. projectId can legitimately be
|
|
86
|
+
// a string (a 'group/subgroup/project' path), so it is kept as-is below
|
|
87
|
+
// rather than coerced through positiveNumber, which is number-only.
|
|
88
|
+
let resolvedProjectId = parsed.gitlab?.projectId ?? DEFAULT_CONFIG.gitlab.projectId;
|
|
89
|
+
if (!resolvedProjectId && repoBase) {
|
|
90
|
+
try {
|
|
91
|
+
resolvedProjectId = deriveProjectPath(repoBase, repoRoot);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
95
|
+
console.error(`Warning: ${message}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// The env var override is numeric-only (GitLab numeric project IDs); an
|
|
99
|
+
// unset or invalid value falls back to the yaml/auto-detected resolution
|
|
100
|
+
// above, which may be a string path.
|
|
101
|
+
const envProjectId = positiveNumber(process.env.PIPELINE_WORKER_GITLAB_PROJECT_ID, NaN);
|
|
102
|
+
const projectId = Number.isNaN(envProjectId) ? resolvedProjectId : envProjectId;
|
|
81
103
|
return {
|
|
82
104
|
agent: pickName(process.env.PIPELINE_WORKER_AGENT, AGENT_NAMES, pickName(parsed.agent, AGENT_NAMES, DEFAULT_CONFIG.agent)),
|
|
83
105
|
forge: pickName(process.env.PIPELINE_WORKER_FORGE, FORGE_NAMES, pickName(parsed.forge, FORGE_NAMES, DEFAULT_CONFIG.forge)),
|
|
84
106
|
gitlab: {
|
|
85
|
-
host: parsed.gitlab?.host
|
|
86
|
-
projectId
|
|
107
|
+
host: process.env.PIPELINE_WORKER_GITLAB_HOST || parsed.gitlab?.host || DEFAULT_CONFIG.gitlab.host,
|
|
108
|
+
projectId,
|
|
109
|
+
repoBase,
|
|
87
110
|
},
|
|
88
111
|
github: {
|
|
89
|
-
repo: parsed.github?.repo
|
|
112
|
+
repo: process.env.PIPELINE_WORKER_GITHUB_REPO || parsed.github?.repo || DEFAULT_CONFIG.github.repo,
|
|
90
113
|
},
|
|
91
114
|
build: parsed.build ?? detected.build,
|
|
92
115
|
lint: parsed.lint ?? detected.lint,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/forge/github.js
CHANGED
|
@@ -6,8 +6,11 @@
|
|
|
6
6
|
* environment variable — never from `.pipeline-worker.yml`.
|
|
7
7
|
*/
|
|
8
8
|
export function resolveGithubAuth(config) {
|
|
9
|
+
// config.github.repo is already env/.env/yaml-resolved by config/loader.ts;
|
|
10
|
+
// only the token (never read from yaml) and the API URL override are read
|
|
11
|
+
// directly from the environment here.
|
|
9
12
|
const apiUrl = process.env.PIPELINE_WORKER_GITHUB_API_URL || 'https://api.github.com';
|
|
10
|
-
const repo =
|
|
13
|
+
const repo = config.github.repo;
|
|
11
14
|
const token = process.env.PIPELINE_WORKER_GITHUB_TOKEN || process.env.GITHUB_TOKEN;
|
|
12
15
|
if (!/^[^/\s]+\/[^/\s]+$/.test(repo)) {
|
|
13
16
|
throw new Error('GitHub repo is not configured (set github.repo to "owner/name" in .pipeline-worker.yml or PIPELINE_WORKER_GITHUB_REPO).');
|
|
@@ -129,6 +132,14 @@ export function createGithubForge(config) {
|
|
|
129
132
|
const note = (await res.json());
|
|
130
133
|
return { id: note.id };
|
|
131
134
|
},
|
|
135
|
+
async hasMergeConflicts(mrIid) {
|
|
136
|
+
const res = await githubRequest(auth, `/pulls/${mrIid}`);
|
|
137
|
+
const pr = (await res.json());
|
|
138
|
+
// "dirty" is GitHub's specific state for real merge conflicts; other
|
|
139
|
+
// non-mergeable states (unstable, blocked, behind, draft, unknown) are
|
|
140
|
+
// not conflicts and must not trigger conflict resolution.
|
|
141
|
+
return pr.mergeable_state === 'dirty';
|
|
142
|
+
},
|
|
132
143
|
};
|
|
133
144
|
}
|
|
134
145
|
//# sourceMappingURL=github.js.map
|
package/dist/forge/github.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/forge/github.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,MAAM,UAAU,iBAAiB,CAAC,MAA4B;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,wBAAwB,CAAC;IACtF,MAAM,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/forge/github.ts"],"names":[],"mappings":"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"}
|
package/dist/forge/gitlab.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type { PipelineWorkerConfig } from '../types.js';
|
|
|
8
8
|
import type { ForgeClient } from './types.js';
|
|
9
9
|
export interface GitlabAuth {
|
|
10
10
|
host: string;
|
|
11
|
-
projectId: number;
|
|
11
|
+
projectId: number | string;
|
|
12
12
|
token: string;
|
|
13
13
|
}
|
|
14
14
|
export declare function resolveGitlabAuth(config: PipelineWorkerConfig): GitlabAuth;
|
package/dist/forge/gitlab.js
CHANGED
|
@@ -5,20 +5,25 @@
|
|
|
5
5
|
* so there is exactly one place that knows how to talk to GitLab.
|
|
6
6
|
*/
|
|
7
7
|
export function resolveGitlabAuth(config) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
// config.gitlab.host/projectId are already env/.env/yaml-resolved by
|
|
9
|
+
// config/loader.ts; only the token (never read from yaml) is read
|
|
10
|
+
// directly from the environment here.
|
|
11
|
+
const host = config.gitlab.host;
|
|
12
|
+
const projectId = config.gitlab.projectId;
|
|
11
13
|
const token = process.env.PIPELINE_WORKER_GITLAB_TOKEN;
|
|
12
14
|
if (!host)
|
|
13
15
|
throw new Error('GitLab host is not configured (set gitlab.host in .pipeline-worker.yml or PIPELINE_WORKER_GITLAB_HOST).');
|
|
14
16
|
if (!projectId)
|
|
15
|
-
throw new Error('GitLab projectId is not configured (set gitlab.projectId in .pipeline-worker.yml or
|
|
17
|
+
throw new Error('GitLab projectId is not configured (set gitlab.projectId in .pipeline-worker.yml, PIPELINE_WORKER_GITLAB_PROJECT_ID, or PIPELINE_WORKER_GITLAB_REPO_BASE for auto-detection).');
|
|
16
18
|
if (!token)
|
|
17
19
|
throw new Error('PIPELINE_WORKER_GITLAB_TOKEN environment variable is not set.');
|
|
18
20
|
return { host, projectId, token };
|
|
19
21
|
}
|
|
20
22
|
async function gitlabRequest(auth, path, init) {
|
|
21
|
-
|
|
23
|
+
// String project paths (e.g. 'group/subgroup/project') must be URL-encoded
|
|
24
|
+
// so slashes don't collide with the API route structure.
|
|
25
|
+
const projectSegment = typeof auth.projectId === 'string' ? encodeURIComponent(auth.projectId) : auth.projectId;
|
|
26
|
+
const url = `${auth.host.replace(/\/$/, '')}/api/v4/projects/${projectSegment}${path}`;
|
|
22
27
|
const res = await fetch(url, {
|
|
23
28
|
...init,
|
|
24
29
|
headers: {
|
|
@@ -94,6 +99,14 @@ export function createGitlabForge(config) {
|
|
|
94
99
|
const note = (await res.json());
|
|
95
100
|
return { id: note.id };
|
|
96
101
|
},
|
|
102
|
+
async hasMergeConflicts(mrIid) {
|
|
103
|
+
const res = await gitlabRequest(auth, `/merge_requests/${mrIid}`);
|
|
104
|
+
const mr = (await res.json());
|
|
105
|
+
// "cannot_be_merged" is GitLab's confirmed-conflict state; "unchecked"/
|
|
106
|
+
// "checking"/"cannot_be_merged_recheck" mean it hasn't finished
|
|
107
|
+
// computing yet and must not be treated as a conflict.
|
|
108
|
+
return mr.merge_status === 'cannot_be_merged';
|
|
109
|
+
},
|
|
97
110
|
};
|
|
98
111
|
}
|
|
99
112
|
//# sourceMappingURL=gitlab.js.map
|
package/dist/forge/gitlab.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../src/forge/gitlab.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,UAAU,iBAAiB,CAAC,MAA4B;IAC5D,
|
|
1
|
+
{"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../src/forge/gitlab.ts"],"names":[],"mappings":"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"}
|
package/dist/forge/types.d.ts
CHANGED
|
@@ -22,4 +22,13 @@ export interface ForgeClient {
|
|
|
22
22
|
createMrNote(mrIid: number, body: string): Promise<{
|
|
23
23
|
id: number;
|
|
24
24
|
}>;
|
|
25
|
+
/**
|
|
26
|
+
* True only when the forge has *confirmed* the MR/PR has real merge
|
|
27
|
+
* conflicts against its target branch (GitHub's `mergeable_state: "dirty"`,
|
|
28
|
+
* GitLab's `merge_status: "cannot_be_merged"`). Both forges compute this
|
|
29
|
+
* asynchronously after a push, so a not-yet-known state must read as
|
|
30
|
+
* false here — treating "unknown" as "conflicted" would trigger conflict
|
|
31
|
+
* resolution on every push, before the forge has even checked.
|
|
32
|
+
*/
|
|
33
|
+
hasMergeConflicts(mrIid: number): Promise<boolean>;
|
|
25
34
|
}
|