pipeline-worker 0.1.8 → 0.1.10
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 +35 -6
- package/dist/agent/copilot.d.ts +3 -0
- package/dist/agent/copilot.js +7 -0
- package/dist/agent/copilot.js.map +1 -1
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.js +1 -1
- package/dist/cli.js +3 -2
- package/dist/cli.js.map +1 -1
- package/dist/config/detectChecks.d.ts +3 -3
- package/dist/config/detectChecks.js +3 -3
- package/dist/config/loader.d.ts +8 -9
- package/dist/config/loader.js +61 -51
- package/dist/config/loader.js.map +1 -1
- package/dist/forge/github.d.ts +1 -1
- package/dist/forge/github.js +4 -5
- package/dist/forge/github.js.map +1 -1
- package/dist/forge/gitlab.d.ts +3 -3
- package/dist/forge/gitlab.js +7 -8
- package/dist/forge/gitlab.js.map +1 -1
- package/dist/forge/index.d.ts +1 -1
- package/dist/forge/index.js +1 -1
- package/dist/forge/index.js.map +1 -1
- package/dist/git/branchName.d.ts +17 -0
- package/dist/git/branchName.js +26 -0
- package/dist/git/branchName.js.map +1 -0
- package/dist/git/diff.d.ts +9 -0
- package/dist/git/diff.js +16 -0
- package/dist/git/diff.js.map +1 -1
- package/dist/git/resolveProjectPath.js +1 -2
- package/dist/git/resolveProjectPath.js.map +1 -1
- package/dist/types.d.ts +10 -1
- package/dist/ui/welcome.js +2 -2
- package/dist/ui/welcome.js.map +1 -1
- package/dist/workflow/captureIntent.d.ts +8 -1
- package/dist/workflow/captureIntent.js +24 -18
- package/dist/workflow/captureIntent.js.map +1 -1
- package/dist/workflow/orchestrate.d.ts +5 -1
- package/dist/workflow/orchestrate.js +21 -9
- package/dist/workflow/orchestrate.js.map +1 -1
- package/package.json +1 -3
package/README.md
CHANGED
|
@@ -6,12 +6,13 @@
|
|
|
6
6
|
|
|
7
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
|
-
1. Captures your staged + unstaged changes (your working tree is
|
|
9
|
+
1. Captures your staged + unstaged changes (your working tree is only read, not modified, up through this point).
|
|
10
10
|
2. Replays them in a disposable git worktree.
|
|
11
|
-
3. Asks a coding agent (Claude Code or GitHub Copilot CLI) to infer the intent: branch
|
|
11
|
+
3. Asks a coding agent (Claude Code or GitHub Copilot CLI) to infer the intent: change type, branch slug, commit message, summary.
|
|
12
12
|
4. Runs your `build` / `lint` / `test` commands, fail-fast.
|
|
13
|
-
5. Commits, pushes, and opens a GitLab MR or GitHub PR
|
|
13
|
+
5. Commits, pushes, and opens a GitLab MR or GitHub PR — the branch name is composed from the configurable `branchPattern`.
|
|
14
14
|
6. Polls the CI pipeline; on failure it hands the failing job logs to the agent, commits the fix, pushes, and re-polls — capped at `maxFixAttempts` before escalating to a human with an MR comment.
|
|
15
|
+
7. Once the MR/PR is ready to merge, resets your repo's current branch back to HEAD (see `PIPELINE_WORKER_CLEANUP` below) — your changes now live safely on the feature branch instead of sitting uncommitted locally too.
|
|
15
16
|
|
|
16
17
|
Polling is plain REST and costs zero agent tokens; the agent is invoked only when a pipeline actually fails, with truncated logs and a token-efficient [TOON](https://github.com/toon-format/toon)-encoded MCP server for anything more it needs.
|
|
17
18
|
|
|
@@ -63,12 +64,40 @@ pipeline-worker is configured entirely through real environment variables — se
|
|
|
63
64
|
| `PIPELINE_WORKER_GITHUB_REPO` | auto-detected from `origin` | `owner/name` slug — only needed when `origin` isn't a GitHub remote |
|
|
64
65
|
| `PIPELINE_WORKER_GITHUB_TOKEN` | falls back to `GITHUB_TOKEN` | GitHub token |
|
|
65
66
|
| `PIPELINE_WORKER_POLL_INTERVAL_SECONDS` | `15` | pipeline poll cadence; use `60` for slow pipelines |
|
|
67
|
+
| `PIPELINE_WORKER_BRANCH_PATTERN` | `pipeline-worker/{name}` | feature branch naming template — see below |
|
|
68
|
+
| `PIPELINE_WORKER_CLEANUP` | `true` | reset repoRoot to HEAD once the MR/PR is opened and CI is green (`false` to keep your local uncommitted changes as-is) |
|
|
69
|
+
| `PIPELINE_WORKER_INTENT_MODEL` | `haiku` | model used for the intent-capture step (branch/commit/summary); claude only — copilot has no per-invocation model selection and ignores it |
|
|
70
|
+
| `PIPELINE_WORKER_BUILD` | auto-detected from toolchain | build command override; set to an empty string to skip the stage |
|
|
71
|
+
| `PIPELINE_WORKER_LINT` | auto-detected from toolchain | lint command override; set to an empty string to skip the stage |
|
|
72
|
+
| `PIPELINE_WORKER_TEST` | auto-detected from toolchain | test command override; set to an empty string to skip the stage |
|
|
73
|
+
| `PIPELINE_WORKER_MAX_FIX_ATTEMPTS` | `5` | how many CI-fix attempts before escalating to a human |
|
|
66
74
|
|
|
67
|
-
|
|
75
|
+
### Branch naming
|
|
76
|
+
|
|
77
|
+
`PIPELINE_WORKER_BRANCH_PATTERN` controls the feature branch name, built from three placeholders:
|
|
78
|
+
|
|
79
|
+
| Placeholder | Filled by |
|
|
80
|
+
| ----------- | ------------------------------------------------------------------- |
|
|
81
|
+
| `{type}` | `feature`, `bugfix`, or `chore` — inferred from the diff by the agent |
|
|
82
|
+
| `{ticket}` | the `--ticket <id>` flag passed to `pipeline-worker run` |
|
|
83
|
+
| `{name}` | a short kebab-case slug describing the change — inferred by the agent |
|
|
84
|
+
|
|
85
|
+
For example, a team using GitLab issue-linked branches would set:
|
|
86
|
+
|
|
87
|
+
```sh
|
|
88
|
+
export PIPELINE_WORKER_BRANCH_PATTERN='{type}/{ticket}/{name}'
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
```sh
|
|
92
|
+
pipeline-worker run --ticket PROJ-123
|
|
93
|
+
# -> bugfix/PROJ-123/fix-login-redirect
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
A pattern that includes `{ticket}` requires `--ticket` to be passed; the run fails fast at the naming step otherwise.
|
|
68
97
|
|
|
69
98
|
### Check command auto-detection
|
|
70
99
|
|
|
71
|
-
`build` / `lint` / `test` are picked from the repo's toolchain (first marker found wins; mixed-language repos should set
|
|
100
|
+
`build` / `lint` / `test` are picked from the repo's toolchain (first marker found wins; mixed-language repos should set `PIPELINE_WORKER_BUILD` / `PIPELINE_WORKER_LINT` / `PIPELINE_WORKER_TEST` explicitly):
|
|
72
101
|
|
|
73
102
|
| Toolchain | Marker | build | lint | test |
|
|
74
103
|
| ----------------- | ------------------------------------------------------ | ---------------- | ----------------------------------- | ------------------------------------------------ |
|
|
@@ -83,7 +112,7 @@ A stage with no command (`—`) is skipped. If no toolchain is detected and no c
|
|
|
83
112
|
|
|
84
113
|
| Command | What it does |
|
|
85
114
|
| -------------------------------------------- | ------------------------------------------------------------------------- |
|
|
86
|
-
| `pipeline-worker` (or `pipeline-worker run`) | Capture the current diff and drive it to a green MR/PR
|
|
115
|
+
| `pipeline-worker` (or `pipeline-worker run`) `[--ticket <id>]` | Capture the current diff and drive it to a green MR/PR |
|
|
87
116
|
| `pipeline-worker serve` | Start the forge MCP server over stdio (used by the agent during fix runs) |
|
|
88
117
|
| `pipeline-worker resume --branch <name>` | Resume watching/fixing a run after a crash |
|
|
89
118
|
| `pipeline-worker status --branch <name>` | Print the persisted state of a run |
|
package/dist/agent/copilot.d.ts
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
* prompt and the JSON object is extracted from the response text;
|
|
9
9
|
* - no per-invocation MCP config flag -> Copilot only reads
|
|
10
10
|
* ~/.copilot/mcp-config.json, so `mcpConfigPath` is ignored with a warning.
|
|
11
|
+
* - no per-invocation model flag -> `opts.model` (e.g. the configured
|
|
12
|
+
* `PIPELINE_WORKER_INTENT_MODEL`) is ignored with a warning; switch
|
|
13
|
+
* Copilot's model via its own `/model` command or config instead.
|
|
11
14
|
* - no per-invocation tool allowlist -> `--allow-all-tools` is always passed,
|
|
12
15
|
* so `allowedTools` is ignored; a read-only step (e.g. captureIntent.ts)
|
|
13
16
|
* gets full tool access under this adapter instead of being restricted.
|
package/dist/agent/copilot.js
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
* prompt and the JSON object is extracted from the response text;
|
|
9
9
|
* - no per-invocation MCP config flag -> Copilot only reads
|
|
10
10
|
* ~/.copilot/mcp-config.json, so `mcpConfigPath` is ignored with a warning.
|
|
11
|
+
* - no per-invocation model flag -> `opts.model` (e.g. the configured
|
|
12
|
+
* `PIPELINE_WORKER_INTENT_MODEL`) is ignored with a warning; switch
|
|
13
|
+
* Copilot's model via its own `/model` command or config instead.
|
|
11
14
|
* - no per-invocation tool allowlist -> `--allow-all-tools` is always passed,
|
|
12
15
|
* so `allowedTools` is ignored; a read-only step (e.g. captureIntent.ts)
|
|
13
16
|
* gets full tool access under this adapter instead of being restricted.
|
|
@@ -43,6 +46,10 @@ export const copilotAdapter = {
|
|
|
43
46
|
console.error('pipeline-worker: copilot CLI has no per-invocation MCP config flag; ignoring it. ' +
|
|
44
47
|
'Register the server in ~/.copilot/mcp-config.json to give copilot forge access.');
|
|
45
48
|
}
|
|
49
|
+
if (opts.model) {
|
|
50
|
+
console.error(`pipeline-worker: copilot CLI has no per-invocation model flag; ignoring the configured model "${opts.model}". ` +
|
|
51
|
+
"Switch copilot's model via its own /model command or config instead.");
|
|
52
|
+
}
|
|
46
53
|
const invocation = execFileAsync('copilot', ['-s', '--no-ask-user', '--allow-all-tools'], {
|
|
47
54
|
cwd: opts.cwd,
|
|
48
55
|
timeout: INVOKE_TIMEOUT_MS,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/agent/copilot.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/agent/copilot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAElC,0FAA0F;AAC1F,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,KAAK,CAAC,MAAM,CAAC,IAAwB;QACnC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM;gBACJ,oGAAoG;oBACpG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CACX,mFAAmF;gBACjF,iFAAiF,CACpF,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,iGAAiG,IAAI,CAAC,KAAK,KAAK;gBAC9G,sEAAsE,CACzE,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,mBAAmB,CAAC,EAAE;YACxF,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,iBAAiB;YAC1B,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,uFAAuF;QACvF,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,KAAM,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC;QAEpC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IAC/E,CAAC;CACF,CAAC"}
|
package/dist/agent/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { PipelineWorkerConfig } from '../types.js';
|
|
2
2
|
import type { AgentAdapter } from './types.js';
|
|
3
3
|
/**
|
|
4
|
-
* Picks the adapter named
|
|
4
|
+
* Picks the adapter named by PIPELINE_WORKER_AGENT. Deliberately no runtime
|
|
5
5
|
* fallback/interactive choice — the config names exactly one agent per repo.
|
|
6
6
|
*/
|
|
7
7
|
export declare function selectAgent(config: PipelineWorkerConfig): AgentAdapter;
|
package/dist/agent/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { claudeAdapter } from './claude.js';
|
|
2
2
|
import { copilotAdapter } from './copilot.js';
|
|
3
3
|
/**
|
|
4
|
-
* Picks the adapter named
|
|
4
|
+
* Picks the adapter named by PIPELINE_WORKER_AGENT. Deliberately no runtime
|
|
5
5
|
* fallback/interactive choice — the config names exactly one agent per repo.
|
|
6
6
|
*/
|
|
7
7
|
export function selectAgent(config) {
|
package/dist/cli.js
CHANGED
|
@@ -19,9 +19,10 @@ program.version(pkg.version, '-v, --version', 'output the installed pipeline-wor
|
|
|
19
19
|
program
|
|
20
20
|
.command('run', { isDefault: true })
|
|
21
21
|
.description('Capture the current diff, validate it, and drive it through to a green MR/PR')
|
|
22
|
-
.
|
|
22
|
+
.option('--ticket <id>', 'ticket/issue id to interpolate into the configured branchPattern\'s {ticket} placeholder')
|
|
23
|
+
.action(async (opts) => {
|
|
23
24
|
try {
|
|
24
|
-
await runWorkflow(process.cwd());
|
|
25
|
+
await runWorkflow(process.cwd(), { ticket: opts.ticket });
|
|
25
26
|
}
|
|
26
27
|
catch (error) {
|
|
27
28
|
console.error('pipeline-worker run failed:', error instanceof Error ? error.message : 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,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,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,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAwB,CAAC;AAEhH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC,kEAAkE,CAAC,CAAC;AAChH,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,8CAA8C,CAAC,CAAC;AAE9F,OAAO;KACJ,OAAO,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACnC,WAAW,CAAC,8EAA8E,CAAC;KAC3F,MAAM,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Toolchain detection: default build/lint/test commands for the target repo's
|
|
3
3
|
* language. An empty command means "no sensible default here" and the stage is
|
|
4
|
-
* skipped (see runChecks.ts). Explicit
|
|
5
|
-
* (see loader.ts). The first marker that matches decides;
|
|
6
|
-
* should set the commands explicitly.
|
|
4
|
+
* skipped (see runChecks.ts). Explicit PIPELINE_WORKER_BUILD / _LINT / _TEST
|
|
5
|
+
* env vars always win (see loader.ts). The first marker that matches decides;
|
|
6
|
+
* mixed-language repos should set the commands explicitly.
|
|
7
7
|
*/
|
|
8
8
|
export interface DetectedChecks {
|
|
9
9
|
language: 'node' | 'dotnet' | 'go' | 'python' | 'unknown';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Toolchain detection: default build/lint/test commands for the target repo's
|
|
3
3
|
* language. An empty command means "no sensible default here" and the stage is
|
|
4
|
-
* skipped (see runChecks.ts). Explicit
|
|
5
|
-
* (see loader.ts). The first marker that matches decides;
|
|
6
|
-
* should set the commands explicitly.
|
|
4
|
+
* skipped (see runChecks.ts). Explicit PIPELINE_WORKER_BUILD / _LINT / _TEST
|
|
5
|
+
* env vars always win (see loader.ts). The first marker that matches decides;
|
|
6
|
+
* mixed-language repos should set the commands explicitly.
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
9
9
|
import { join } from 'node:path';
|
package/dist/config/loader.d.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* .env file at repo root (never overrides real env) ->
|
|
4
|
-
* built-in default (for build/lint/test: commands auto-detected from the
|
|
5
|
-
* toolchain, see detectChecks.ts; for github.repo: the repo's own
|
|
6
|
-
* remote, see git/remote.ts).
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* mirroring mcp-sonar-analysis's registry.ts read/never-throw contract.
|
|
2
|
+
* Environment-variable config resolver. Resolution order per value:
|
|
3
|
+
* environment variable -> .env file at repo root (never overrides real env) ->
|
|
4
|
+
* built-in default (for build/lint/test: commands auto-detected from the
|
|
5
|
+
* repo's toolchain, see detectChecks.ts; for github.repo: the repo's own
|
|
6
|
+
* `origin` remote, see git/remote.ts). Never throws — an unset or invalid
|
|
7
|
+
* value falls back to the default (with a warning where relevant), mirroring
|
|
8
|
+
* mcp-sonar-analysis's registry.ts read/never-throw contract.
|
|
10
9
|
*/
|
|
11
10
|
import type { PipelineWorkerConfig } from '../types.js';
|
|
12
|
-
export declare function loadConfig(repoRoot: string
|
|
11
|
+
export declare function loadConfig(repoRoot: string): PipelineWorkerConfig;
|
package/dist/config/loader.js
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* .env file at repo root (never overrides real env) ->
|
|
4
|
-
* built-in default (for build/lint/test: commands auto-detected from the
|
|
5
|
-
* toolchain, see detectChecks.ts; for github.repo: the repo's own
|
|
6
|
-
* remote, see git/remote.ts).
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* mirroring mcp-sonar-analysis's registry.ts read/never-throw contract.
|
|
2
|
+
* Environment-variable config resolver. Resolution order per value:
|
|
3
|
+
* environment variable -> .env file at repo root (never overrides real env) ->
|
|
4
|
+
* built-in default (for build/lint/test: commands auto-detected from the
|
|
5
|
+
* repo's toolchain, see detectChecks.ts; for github.repo: the repo's own
|
|
6
|
+
* `origin` remote, see git/remote.ts). Never throws — an unset or invalid
|
|
7
|
+
* value falls back to the default (with a warning where relevant), mirroring
|
|
8
|
+
* mcp-sonar-analysis's registry.ts read/never-throw contract.
|
|
10
9
|
*/
|
|
11
10
|
import { existsSync, readFileSync } from 'node:fs';
|
|
12
11
|
import { join } from 'node:path';
|
|
13
12
|
import { parseEnv } from 'node:util';
|
|
14
|
-
import { load } from 'js-yaml';
|
|
15
13
|
import { detectChecks } from './detectChecks.js';
|
|
16
14
|
import { deriveProjectPath } from '../git/resolveProjectPath.js';
|
|
17
15
|
import { detectGithubRepo } from '../git/remote.js';
|
|
18
|
-
const CONFIG_FILE_NAME = '.pipeline-worker.yml';
|
|
19
16
|
const AGENT_NAMES = ['claude', 'copilot'];
|
|
20
17
|
const FORGE_NAMES = ['gitlab', 'github'];
|
|
21
18
|
// build/lint/test defaults come from detectChecks(repoRoot) at load time.
|
|
@@ -31,6 +28,9 @@ const DEFAULT_CONFIG = {
|
|
|
31
28
|
},
|
|
32
29
|
maxFixAttempts: 5,
|
|
33
30
|
pollIntervalSeconds: 15,
|
|
31
|
+
branchPattern: 'pipeline-worker/{name}',
|
|
32
|
+
cleanupOnSuccess: true,
|
|
33
|
+
intentModel: 'haiku',
|
|
34
34
|
};
|
|
35
35
|
/** Loads <repoRoot>/.env into process.env; already-set variables always win. */
|
|
36
36
|
function loadDotEnv(repoRoot) {
|
|
@@ -57,37 +57,48 @@ function positiveNumber(value, fallback) {
|
|
|
57
57
|
const num = Number(value);
|
|
58
58
|
return Number.isFinite(num) && num > 0 ? num : fallback;
|
|
59
59
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
catch (error) {
|
|
70
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
71
|
-
console.error(`Warning: failed to read ${configPath}: ${message}. Falling back to defaults.`);
|
|
72
|
-
return {};
|
|
60
|
+
/** Parses "true"/"false" (case-insensitive), falling back when unset or unrecognized. */
|
|
61
|
+
function boolean(value, fallback) {
|
|
62
|
+
if (typeof value === 'boolean')
|
|
63
|
+
return value;
|
|
64
|
+
if (typeof value === 'string') {
|
|
65
|
+
if (value.toLowerCase() === 'true')
|
|
66
|
+
return true;
|
|
67
|
+
if (value.toLowerCase() === 'false')
|
|
68
|
+
return false;
|
|
73
69
|
}
|
|
70
|
+
return fallback;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Unlike `||`-based resolution, an env var explicitly set to `''` (e.g.
|
|
74
|
+
* `PIPELINE_WORKER_BUILD=`) is honored as "skip this stage" rather than
|
|
75
|
+
* falling through to the detected default — only a genuinely unset var falls
|
|
76
|
+
* back.
|
|
77
|
+
*/
|
|
78
|
+
function stringOr(value, fallback) {
|
|
79
|
+
return value !== undefined ? value : fallback;
|
|
80
|
+
}
|
|
81
|
+
/** GitLab project ids are either numeric or a 'group/subgroup/project' path; numeric strings are coerced, everything else is kept as-is. */
|
|
82
|
+
function resolveProjectId(value, fallback) {
|
|
83
|
+
if (!value)
|
|
84
|
+
return fallback;
|
|
85
|
+
const num = Number(value);
|
|
86
|
+
return Number.isFinite(num) && num > 0 ? num : value;
|
|
74
87
|
}
|
|
75
|
-
export function loadConfig(repoRoot
|
|
76
|
-
loadDotEnv(repoRoot);
|
|
77
|
-
const parsed = readYamlConfig(resolveConfigPath(repoRoot, override));
|
|
88
|
+
export function loadConfig(repoRoot) {
|
|
89
|
+
loadDotEnv(repoRoot);
|
|
78
90
|
const detected = detectChecks(repoRoot);
|
|
79
|
-
if (detected.language === 'unknown' &&
|
|
80
|
-
|
|
91
|
+
if (detected.language === 'unknown' &&
|
|
92
|
+
process.env.PIPELINE_WORKER_BUILD === undefined &&
|
|
93
|
+
process.env.PIPELINE_WORKER_LINT === undefined &&
|
|
94
|
+
process.env.PIPELINE_WORKER_TEST === undefined) {
|
|
95
|
+
console.error(`Warning: could not detect the toolchain of ${repoRoot}; build/lint/test will be skipped. ` +
|
|
96
|
+
'Set PIPELINE_WORKER_BUILD / PIPELINE_WORKER_LINT / PIPELINE_WORKER_TEST to configure them explicitly.');
|
|
81
97
|
}
|
|
82
|
-
|
|
83
|
-
// a
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
// Resolve projectId: YAML value is authoritative; when unset, fall back to
|
|
87
|
-
// auto-detecting a string path from repoBase. projectId can legitimately be
|
|
88
|
-
// a string (a 'group/subgroup/project' path), so it is kept as-is below
|
|
89
|
-
// rather than coerced through positiveNumber, which is number-only.
|
|
90
|
-
let resolvedProjectId = parsed.gitlab?.projectId ?? DEFAULT_CONFIG.gitlab.projectId;
|
|
98
|
+
const repoBase = process.env.PIPELINE_WORKER_GITLAB_REPO_BASE;
|
|
99
|
+
// Auto-detect a string path from repoBase when no project id is configured
|
|
100
|
+
// yet; the env var override below (numeric or string path) always wins.
|
|
101
|
+
let resolvedProjectId = DEFAULT_CONFIG.gitlab.projectId;
|
|
91
102
|
if (!resolvedProjectId && repoBase) {
|
|
92
103
|
try {
|
|
93
104
|
resolvedProjectId = deriveProjectPath(repoBase, repoRoot);
|
|
@@ -97,27 +108,26 @@ export function loadConfig(repoRoot, override) {
|
|
|
97
108
|
console.error(`Warning: ${message}`);
|
|
98
109
|
}
|
|
99
110
|
}
|
|
100
|
-
|
|
101
|
-
// unset or invalid value falls back to the yaml/auto-detected resolution
|
|
102
|
-
// above, which may be a string path.
|
|
103
|
-
const envProjectId = positiveNumber(process.env.PIPELINE_WORKER_GITLAB_PROJECT_ID, NaN);
|
|
104
|
-
const projectId = Number.isNaN(envProjectId) ? resolvedProjectId : envProjectId;
|
|
111
|
+
const projectId = resolveProjectId(process.env.PIPELINE_WORKER_GITLAB_PROJECT_ID, resolvedProjectId);
|
|
105
112
|
return {
|
|
106
|
-
agent: pickName(process.env.PIPELINE_WORKER_AGENT, AGENT_NAMES,
|
|
107
|
-
forge: pickName(process.env.PIPELINE_WORKER_FORGE, FORGE_NAMES,
|
|
113
|
+
agent: pickName(process.env.PIPELINE_WORKER_AGENT, AGENT_NAMES, DEFAULT_CONFIG.agent),
|
|
114
|
+
forge: pickName(process.env.PIPELINE_WORKER_FORGE, FORGE_NAMES, DEFAULT_CONFIG.forge),
|
|
108
115
|
gitlab: {
|
|
109
|
-
host: process.env.PIPELINE_WORKER_GITLAB_HOST ||
|
|
116
|
+
host: process.env.PIPELINE_WORKER_GITLAB_HOST || DEFAULT_CONFIG.gitlab.host,
|
|
110
117
|
projectId,
|
|
111
118
|
repoBase,
|
|
112
119
|
},
|
|
113
120
|
github: {
|
|
114
|
-
repo: process.env.PIPELINE_WORKER_GITHUB_REPO ||
|
|
121
|
+
repo: process.env.PIPELINE_WORKER_GITHUB_REPO || detectGithubRepo(repoRoot) || DEFAULT_CONFIG.github.repo,
|
|
115
122
|
},
|
|
116
|
-
build:
|
|
117
|
-
lint:
|
|
118
|
-
test:
|
|
119
|
-
maxFixAttempts:
|
|
120
|
-
pollIntervalSeconds: positiveNumber(process.env.PIPELINE_WORKER_POLL_INTERVAL_SECONDS,
|
|
123
|
+
build: stringOr(process.env.PIPELINE_WORKER_BUILD, detected.build),
|
|
124
|
+
lint: stringOr(process.env.PIPELINE_WORKER_LINT, detected.lint),
|
|
125
|
+
test: stringOr(process.env.PIPELINE_WORKER_TEST, detected.test),
|
|
126
|
+
maxFixAttempts: positiveNumber(process.env.PIPELINE_WORKER_MAX_FIX_ATTEMPTS, DEFAULT_CONFIG.maxFixAttempts),
|
|
127
|
+
pollIntervalSeconds: positiveNumber(process.env.PIPELINE_WORKER_POLL_INTERVAL_SECONDS, DEFAULT_CONFIG.pollIntervalSeconds),
|
|
128
|
+
branchPattern: process.env.PIPELINE_WORKER_BRANCH_PATTERN || DEFAULT_CONFIG.branchPattern,
|
|
129
|
+
cleanupOnSuccess: boolean(process.env.PIPELINE_WORKER_CLEANUP, DEFAULT_CONFIG.cleanupOnSuccess),
|
|
130
|
+
intentModel: process.env.PIPELINE_WORKER_INTENT_MODEL || DEFAULT_CONFIG.intentModel,
|
|
121
131
|
};
|
|
122
132
|
}
|
|
123
133
|
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/forge/github.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* shapes: pull request -> MergeRequest (iid = PR number), the set of Actions
|
|
4
4
|
* workflow runs for the PR's head SHA -> one aggregated Pipeline, workflow
|
|
5
5
|
* jobs -> PipelineJob. The token is deliberately sourced only from an
|
|
6
|
-
* environment variable
|
|
6
|
+
* environment variable and never logged.
|
|
7
7
|
*/
|
|
8
8
|
import type { PipelineWorkerConfig, Pipeline } from '../types.js';
|
|
9
9
|
import type { ForgeClient } from './types.js';
|
package/dist/forge/github.js
CHANGED
|
@@ -3,17 +3,16 @@
|
|
|
3
3
|
* shapes: pull request -> MergeRequest (iid = PR number), the set of Actions
|
|
4
4
|
* workflow runs for the PR's head SHA -> one aggregated Pipeline, workflow
|
|
5
5
|
* jobs -> PipelineJob. The token is deliberately sourced only from an
|
|
6
|
-
* environment variable
|
|
6
|
+
* environment variable and never logged.
|
|
7
7
|
*/
|
|
8
8
|
export function resolveGithubAuth(config) {
|
|
9
|
-
// config.github.repo is already env/.env
|
|
10
|
-
//
|
|
11
|
-
// directly from the environment here.
|
|
9
|
+
// config.github.repo is already env/.env-resolved by config/loader.ts; the
|
|
10
|
+
// token and the API URL override are read directly from the environment here.
|
|
12
11
|
const apiUrl = process.env.PIPELINE_WORKER_GITHUB_API_URL || 'https://api.github.com';
|
|
13
12
|
const repo = config.github.repo;
|
|
14
13
|
const token = process.env.PIPELINE_WORKER_GITHUB_TOKEN || process.env.GITHUB_TOKEN;
|
|
15
14
|
if (!/^[^/\s]+\/[^/\s]+$/.test(repo)) {
|
|
16
|
-
throw new Error('GitHub repo is not configured (set
|
|
15
|
+
throw new Error('GitHub repo is not configured (set PIPELINE_WORKER_GITHUB_REPO to "owner/name").');
|
|
17
16
|
}
|
|
18
17
|
if (!token)
|
|
19
18
|
throw new Error('PIPELINE_WORKER_GITHUB_TOKEN (or GITHUB_TOKEN) environment variable is not set.');
|
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,
|
|
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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GitLab REST (v4) ForgeClient. The token is deliberately sourced only from
|
|
3
|
-
* an environment variable
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* an environment variable and never logged. Used both by the workflow
|
|
4
|
+
* orchestrator and the MCP tool handlers, so there is exactly one place that
|
|
5
|
+
* knows how to talk to GitLab.
|
|
6
6
|
*/
|
|
7
7
|
import type { PipelineWorkerConfig } from '../types.js';
|
|
8
8
|
import type { ForgeClient } from './types.js';
|
package/dist/forge/gitlab.js
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GitLab REST (v4) ForgeClient. The token is deliberately sourced only from
|
|
3
|
-
* an environment variable
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* an environment variable and never logged. Used both by the workflow
|
|
4
|
+
* orchestrator and the MCP tool handlers, so there is exactly one place that
|
|
5
|
+
* knows how to talk to GitLab.
|
|
6
6
|
*/
|
|
7
7
|
export function resolveGitlabAuth(config) {
|
|
8
|
-
// config.gitlab.host/projectId are already env/.env
|
|
9
|
-
// config/loader.ts;
|
|
10
|
-
// directly from the environment here.
|
|
8
|
+
// config.gitlab.host/projectId are already env/.env-resolved by
|
|
9
|
+
// config/loader.ts; the token is read directly from the environment here.
|
|
11
10
|
const host = config.gitlab.host;
|
|
12
11
|
const projectId = config.gitlab.projectId;
|
|
13
12
|
const token = process.env.PIPELINE_WORKER_GITLAB_TOKEN;
|
|
14
13
|
if (!host)
|
|
15
|
-
throw new Error('GitLab host is not configured (set
|
|
14
|
+
throw new Error('GitLab host is not configured (set PIPELINE_WORKER_GITLAB_HOST).');
|
|
16
15
|
if (!projectId)
|
|
17
|
-
throw new Error('GitLab projectId is not configured (set
|
|
16
|
+
throw new Error('GitLab projectId is not configured (set PIPELINE_WORKER_GITLAB_PROJECT_ID, or PIPELINE_WORKER_GITLAB_REPO_BASE for auto-detection).');
|
|
18
17
|
if (!token)
|
|
19
18
|
throw new Error('PIPELINE_WORKER_GITLAB_TOKEN environment variable is not set.');
|
|
20
19
|
return { host, projectId, token };
|
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/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { PipelineWorkerConfig } from '../types.js';
|
|
2
2
|
import type { ForgeClient } from './types.js';
|
|
3
|
-
/** Picks the forge named in config (
|
|
3
|
+
/** Picks the forge named in config (PIPELINE_WORKER_FORGE). No runtime fallback. */
|
|
4
4
|
export declare function createForge(config: PipelineWorkerConfig): ForgeClient;
|
package/dist/forge/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createGitlabForge } from './gitlab.js';
|
|
2
2
|
import { createGithubForge } from './github.js';
|
|
3
|
-
/** Picks the forge named in config (
|
|
3
|
+
/** Picks the forge named in config (PIPELINE_WORKER_FORGE). No runtime fallback. */
|
|
4
4
|
export function createForge(config) {
|
|
5
5
|
switch (config.forge) {
|
|
6
6
|
case 'gitlab':
|
package/dist/forge/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/forge/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/forge/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,oFAAoF;AACpF,MAAM,UAAU,WAAW,CAAC,MAA4B;IACtD,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composes the final feature branch name from the team's configured
|
|
3
|
+
* `branchPattern` (see config/loader.ts) and the values captured/passed at
|
|
4
|
+
* run time, so naming conventions like "bugfix/PROJ-123/fix-login" are a
|
|
5
|
+
* config choice instead of hardcoded.
|
|
6
|
+
*/
|
|
7
|
+
export interface BranchNameVars {
|
|
8
|
+
type: string;
|
|
9
|
+
name: string;
|
|
10
|
+
ticket?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Throws when `pattern` references {ticket} but no ticket was supplied —
|
|
14
|
+
* a missing ticket id would otherwise silently collapse into a double slash
|
|
15
|
+
* or trailing separator instead of surfacing the misconfiguration.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildBranchName(pattern: string, vars: BranchNameVars): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composes the final feature branch name from the team's configured
|
|
3
|
+
* `branchPattern` (see config/loader.ts) and the values captured/passed at
|
|
4
|
+
* run time, so naming conventions like "bugfix/PROJ-123/fix-login" are a
|
|
5
|
+
* config choice instead of hardcoded.
|
|
6
|
+
*/
|
|
7
|
+
const PLACEHOLDER = /\{(type|ticket|name)\}/g;
|
|
8
|
+
// A git ref segment: no leading dash/dot, safe punctuation only. Slashes are
|
|
9
|
+
// allowed since patterns like "{type}/{ticket}/{name}" use them as separators.
|
|
10
|
+
const SAFE_BRANCH_NAME = /^[A-Za-z0-9][A-Za-z0-9._/-]*$/;
|
|
11
|
+
/**
|
|
12
|
+
* Throws when `pattern` references {ticket} but no ticket was supplied —
|
|
13
|
+
* a missing ticket id would otherwise silently collapse into a double slash
|
|
14
|
+
* or trailing separator instead of surfacing the misconfiguration.
|
|
15
|
+
*/
|
|
16
|
+
export function buildBranchName(pattern, vars) {
|
|
17
|
+
if (pattern.includes('{ticket}') && !vars.ticket) {
|
|
18
|
+
throw new Error(`branchPattern "${pattern}" requires a ticket id — pass one with --ticket <id>, or drop {ticket} from branchPattern.`);
|
|
19
|
+
}
|
|
20
|
+
const branchName = pattern.replace(PLACEHOLDER, (_match, key) => vars[key] ?? '');
|
|
21
|
+
if (!SAFE_BRANCH_NAME.test(branchName)) {
|
|
22
|
+
throw new Error(`composed branch name "${branchName}" (from branchPattern "${pattern}") is not a valid git branch name`);
|
|
23
|
+
}
|
|
24
|
+
return branchName;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=branchName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branchName.js","sourceRoot":"","sources":["../../src/git/branchName.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAC9C,6EAA6E;AAC7E,+EAA+E;AAC/E,MAAM,gBAAgB,GAAG,+BAA+B,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,IAAoB;IACnE,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,kBAAkB,OAAO,4FAA4F,CACtH,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,GAA+B,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAE9G,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,yBAAyB,UAAU,0BAA0B,OAAO,mCAAmC,CAAC,CAAC;IAC3H,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/dist/git/diff.d.ts
CHANGED
|
@@ -27,3 +27,12 @@ export interface CapturedDiff {
|
|
|
27
27
|
* scan the full (potentially many-MB, base64-laden) `diffText`.
|
|
28
28
|
*/
|
|
29
29
|
export declare function captureDiff(repoRoot: string): Promise<CapturedDiff>;
|
|
30
|
+
/**
|
|
31
|
+
* Discards repoRoot's now-redundant uncommitted changes once they're safely
|
|
32
|
+
* captured on the opened MR/PR: `git reset --hard HEAD` undoes tracked
|
|
33
|
+
* edits (whatever branch repoRoot happens to be on), then `untrackedFiles`
|
|
34
|
+
* — the same list captureDiff recorded at the start of the run — is deleted
|
|
35
|
+
* individually rather than via a blanket `git clean`, so unrelated
|
|
36
|
+
* untracked files (build output, scratch files) are left alone.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resetRepo(repoRoot: string, untrackedFiles: string[]): Promise<void>;
|
package/dist/git/diff.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/** Reads the caller's in-progress change set without touching their working tree. */
|
|
2
2
|
import { execFile } from 'node:child_process';
|
|
3
|
+
import { rmSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
3
5
|
import { promisify } from 'node:util';
|
|
4
6
|
const execFileAsync = promisify(execFile);
|
|
5
7
|
/**
|
|
@@ -37,4 +39,18 @@ export async function captureDiff(repoRoot) {
|
|
|
37
39
|
.map((line) => line.slice(3).trim());
|
|
38
40
|
return { diffText, changedFiles, untrackedFiles };
|
|
39
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Discards repoRoot's now-redundant uncommitted changes once they're safely
|
|
44
|
+
* captured on the opened MR/PR: `git reset --hard HEAD` undoes tracked
|
|
45
|
+
* edits (whatever branch repoRoot happens to be on), then `untrackedFiles`
|
|
46
|
+
* — the same list captureDiff recorded at the start of the run — is deleted
|
|
47
|
+
* individually rather than via a blanket `git clean`, so unrelated
|
|
48
|
+
* untracked files (build output, scratch files) are left alone.
|
|
49
|
+
*/
|
|
50
|
+
export async function resetRepo(repoRoot, untrackedFiles) {
|
|
51
|
+
await execFileAsync('git', ['reset', '--hard', 'HEAD'], { cwd: repoRoot });
|
|
52
|
+
for (const relativePath of untrackedFiles) {
|
|
53
|
+
rmSync(join(repoRoot, relativePath), { recursive: true, force: true });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
40
56
|
//# sourceMappingURL=diff.js.map
|
package/dist/git/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/git/diff.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/F,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QAClH,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QACrG,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;KACnE,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1G,MAAM,cAAc,GAAG,SAAS;SAC7B,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEvC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AACpD,CAAC"}
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/git/diff.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/F,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QAClH,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QACrG,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;KACnE,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1G,MAAM,cAAc,GAAG,SAAS;SAC7B,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEvC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,cAAwB;IACxE,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3E,KAAK,MAAM,YAAY,IAAI,cAAc,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC;AACH,CAAC"}
|
|
@@ -29,8 +29,7 @@ export function deriveProjectPath(repoBase, repoRoot) {
|
|
|
29
29
|
const rel = relative(repoBase, repoRoot);
|
|
30
30
|
if (!rel || rel.startsWith('..')) {
|
|
31
31
|
throw new Error(`Cannot derive GitLab project path: '${repoRoot}' is not inside repoBase '${repoBase}'. ` +
|
|
32
|
-
`Set PIPELINE_WORKER_GITLAB_REPO_BASE
|
|
33
|
-
`to the local directory that mirrors the GitLab host namespace root.`);
|
|
32
|
+
`Set PIPELINE_WORKER_GITLAB_REPO_BASE to the local directory that mirrors the GitLab host namespace root.`);
|
|
34
33
|
}
|
|
35
34
|
return rel.split(sep).map(toKebabCase).join('/');
|
|
36
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveProjectPath.js","sourceRoot":"","sources":["../../src/git/resolveProjectPath.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,OAAO;SACX,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC;SACrC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,WAAW,EAAE,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,QAAgB;IAClE,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,6BAA6B,QAAQ,KAAK;YACvF,
|
|
1
|
+
{"version":3,"file":"resolveProjectPath.js","sourceRoot":"","sources":["../../src/git/resolveProjectPath.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,OAAO;SACX,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC;SACrC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,WAAW,EAAE,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,QAAgB;IAClE,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,6BAA6B,QAAQ,KAAK;YACvF,0GAA0G,CAC7G,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -19,6 +19,12 @@ export interface PipelineWorkerConfig {
|
|
|
19
19
|
test: string;
|
|
20
20
|
maxFixAttempts: number;
|
|
21
21
|
pollIntervalSeconds: number;
|
|
22
|
+
/** Model passed to the agent for the intent-capture step (see captureIntent.ts). Ignored by adapters with no per-invocation model selection (e.g. copilot). */
|
|
23
|
+
intentModel: string;
|
|
24
|
+
/** Feature branch naming template. Supports {type}, {ticket}, {name} placeholders; e.g. "{type}/{ticket}/{name}". */
|
|
25
|
+
branchPattern: string;
|
|
26
|
+
/** Once the MR/PR is opened and CI is green, reset repoRoot to HEAD — the captured changes now live safely on the branch. */
|
|
27
|
+
cleanupOnSuccess: boolean;
|
|
22
28
|
}
|
|
23
29
|
export type RunPhase = 'diff' | 'intent' | 'checks' | 'mr' | 'watch' | 'done' | 'escalated';
|
|
24
30
|
export interface RunState {
|
|
@@ -31,6 +37,7 @@ export interface RunState {
|
|
|
31
37
|
phase: RunPhase;
|
|
32
38
|
}
|
|
33
39
|
export type RiskLevel = 'low' | 'medium' | 'high';
|
|
40
|
+
export type ChangeType = 'feature' | 'bugfix' | 'chore';
|
|
34
41
|
export interface FileChangeSummary {
|
|
35
42
|
file: string;
|
|
36
43
|
summary: string;
|
|
@@ -39,7 +46,9 @@ export interface CapturedIntent {
|
|
|
39
46
|
/** One short sentence: why this change exists / what problem it solves. */
|
|
40
47
|
intent: string;
|
|
41
48
|
summary: string;
|
|
42
|
-
|
|
49
|
+
changeType: ChangeType;
|
|
50
|
+
/** Short kebab-case slug describing the change, with no prefix/ticket — the branch pattern supplies those. */
|
|
51
|
+
branchSlug: string;
|
|
43
52
|
commitMessage: string;
|
|
44
53
|
fileChanges: FileChangeSummary[];
|
|
45
54
|
risk: RiskLevel;
|
package/dist/ui/welcome.js
CHANGED
|
@@ -9,9 +9,9 @@ export function repositoryUrl(config) {
|
|
|
9
9
|
return config.gitlab.host ? `${config.gitlab.host} (project ${config.gitlab.projectId})` : '(not configured)';
|
|
10
10
|
}
|
|
11
11
|
export function agentDescription(config) {
|
|
12
|
-
// Mirrors captureIntent.ts's
|
|
12
|
+
// Mirrors captureIntent.ts's model handling: only claude supports
|
|
13
13
|
// per-invocation model selection today, so only claude has a "mode" to show.
|
|
14
|
-
return config.agent === 'claude' ?
|
|
14
|
+
return config.agent === 'claude' ? `claude (${config.intentModel} for intent capture, default model for CI fixes)` : 'copilot';
|
|
15
15
|
}
|
|
16
16
|
export async function printWelcome(config, repoRoot) {
|
|
17
17
|
const user = await getGitUser(repoRoot);
|
package/dist/ui/welcome.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAEtG,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,UAAU,aAAa,CAAC,MAA4B;IACxD,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC9F,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA4B;IAC3D,
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAEtG,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,UAAU,aAAa,CAAC,MAA4B;IACxD,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC9F,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA4B;IAC3D,kEAAkE;IAClE,6EAA6E;IAC7E,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,WAAW,kDAAkD,CAAC,CAAC,CAAC,SAAS,CAAC;AACjI,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAA4B,EAAE,QAAgB;IAC/E,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,IAAI,GAA4B;QACpC,CAAC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;QACvB,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC;KAC5F,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -11,5 +11,12 @@ import type { CapturedIntent } from '../types.js';
|
|
|
11
11
|
* large any individual file's diff is, and lets the agent skip files it
|
|
12
12
|
* judges irrelevant to intent (lockfiles, generated assets) instead of
|
|
13
13
|
* paying to read them.
|
|
14
|
+
*
|
|
15
|
+
* `model` (config's `intentModel`, default "haiku" — see config/loader.ts)
|
|
16
|
+
* lets a lighter model handle this step to keep its token cost down, since
|
|
17
|
+
* naming a branch/commit/summary from a diff needs no deep reasoning.
|
|
18
|
+
* Adapters with no per-invocation model selection (e.g. copilot) ignore it.
|
|
19
|
+
* The CI-fix path (watchPipeline.ts) deliberately never sets a model override
|
|
20
|
+
* — fixing a real failing build needs the stronger default model.
|
|
14
21
|
*/
|
|
15
|
-
export declare function captureIntent(agent: AgentAdapter, files: string[], worktreePath: string): Promise<CapturedIntent>;
|
|
22
|
+
export declare function captureIntent(agent: AgentAdapter, files: string[], worktreePath: string, model: string): Promise<CapturedIntent>;
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
/** Step 3: ask the configured agent what a diff is *for*, in a structured, reusable shape. */
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
const COMMIT_MESSAGE_MAX_LENGTH = 72;
|
|
4
|
-
/**
|
|
5
|
-
* Naming a branch/commit/summary from a diff needs no deep reasoning, so a
|
|
6
|
-
* lighter model keeps this step's token cost down. Adapters that don't
|
|
7
|
-
* support per-invocation model selection (e.g. copilot) just ignore this.
|
|
8
|
-
* The CI-fix path (watchPipeline.ts) deliberately does NOT set this — fixing
|
|
9
|
-
* a real failing build needs the stronger default model.
|
|
10
|
-
*/
|
|
11
|
-
const INTENT_MODEL = 'haiku';
|
|
12
4
|
/**
|
|
13
5
|
* Read-only tools the agent may use to inspect the change set itself (see
|
|
14
6
|
* captureIntent below): `Read` for new/untracked files (`git diff` shows
|
|
@@ -23,12 +15,14 @@ const READ_ONLY_TOOLS = ['Read', 'Grep', 'Glob', 'Bash(git diff:*)'];
|
|
|
23
15
|
const RISK_CRITERIA = 'low: the change is isolated to independent components with a small blast radius. ' +
|
|
24
16
|
'medium: the change touches a shared/dependent component, but that component is well covered by existing unit tests. ' +
|
|
25
17
|
"high: the change touches existing/critical code paths and needs a human reviewer's attention before merging.";
|
|
18
|
+
const CHANGE_TYPES = ['feature', 'bugfix', 'chore'];
|
|
26
19
|
const INTENT_SCHEMA = {
|
|
27
20
|
type: 'object',
|
|
28
21
|
properties: {
|
|
29
22
|
intent: { type: 'string', description: 'One short sentence, no line breaks: why this change exists / what problem it solves.' },
|
|
30
23
|
summary: { type: 'string', description: 'One or two sentences (single line, no line breaks) on what this change does and why' },
|
|
31
|
-
|
|
24
|
+
changeType: { type: 'string', enum: [...CHANGE_TYPES], description: 'The kind of change, used to compose the branch name.' },
|
|
25
|
+
branchSlug: { type: 'string', description: 'A short kebab-case slug describing the change — no prefix, path, or ticket id.' },
|
|
32
26
|
commitMessage: {
|
|
33
27
|
type: 'string',
|
|
34
28
|
maxLength: COMMIT_MESSAGE_MAX_LENGTH,
|
|
@@ -55,7 +49,7 @@ const INTENT_SCHEMA = {
|
|
|
55
49
|
description: 'Concrete test scenarios (each a single line) a reviewer should verify before merging.',
|
|
56
50
|
},
|
|
57
51
|
},
|
|
58
|
-
required: ['intent', 'summary', '
|
|
52
|
+
required: ['intent', 'summary', 'changeType', 'branchSlug', 'commitMessage', 'fileChanges', 'risk', 'riskReason', 'testScenarios'],
|
|
59
53
|
};
|
|
60
54
|
/**
|
|
61
55
|
* Every one of these fields is rendered by openMergeRequest.ts's
|
|
@@ -70,15 +64,19 @@ function singleLine(fieldName) {
|
|
|
70
64
|
.refine((s) => !s.includes('\n'), `${fieldName} must be a single line`);
|
|
71
65
|
}
|
|
72
66
|
/**
|
|
73
|
-
* Agent output is untrusted input: validate the shape and constrain
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
67
|
+
* Agent output is untrusted input: validate the shape and constrain
|
|
68
|
+
* branchSlug to characters that are safe as a git ref segment and a URL
|
|
69
|
+
* segment (the full branch name — prefix, ticket, slug — is composed and
|
|
70
|
+
* re-validated by git/branchName.ts once orchestrate.ts knows the
|
|
71
|
+
* configured branchPattern and any --ticket). commitMessage doubles as the
|
|
72
|
+
* MR/PR title (see openMergeRequest.ts), so it must stay a single line
|
|
73
|
+
* short enough to render as one.
|
|
77
74
|
*/
|
|
78
75
|
const IntentShape = z.object({
|
|
79
76
|
intent: singleLine('intent'),
|
|
80
77
|
summary: singleLine('summary'),
|
|
81
|
-
|
|
78
|
+
changeType: z.enum(CHANGE_TYPES),
|
|
79
|
+
branchSlug: z.string().regex(/^[a-z0-9][a-z0-9-]*$/, 'branchSlug must be a kebab-case slug with no prefix, path, or ticket id'),
|
|
82
80
|
commitMessage: z
|
|
83
81
|
.string()
|
|
84
82
|
.min(1)
|
|
@@ -99,15 +97,23 @@ const IntentShape = z.object({
|
|
|
99
97
|
* large any individual file's diff is, and lets the agent skip files it
|
|
100
98
|
* judges irrelevant to intent (lockfiles, generated assets) instead of
|
|
101
99
|
* paying to read them.
|
|
100
|
+
*
|
|
101
|
+
* `model` (config's `intentModel`, default "haiku" — see config/loader.ts)
|
|
102
|
+
* lets a lighter model handle this step to keep its token cost down, since
|
|
103
|
+
* naming a branch/commit/summary from a diff needs no deep reasoning.
|
|
104
|
+
* Adapters with no per-invocation model selection (e.g. copilot) ignore it.
|
|
105
|
+
* The CI-fix path (watchPipeline.ts) deliberately never sets a model override
|
|
106
|
+
* — fixing a real failing build needs the stronger default model.
|
|
102
107
|
*/
|
|
103
|
-
export async function captureIntent(agent, files, worktreePath) {
|
|
108
|
+
export async function captureIntent(agent, files, worktreePath, model) {
|
|
104
109
|
const prompt = 'The following files changed in this git worktree (which is your current working directory):\n' +
|
|
105
110
|
files.map((file) => `- ${file}`).join('\n') +
|
|
106
111
|
'\n\nUse your tools to inspect what changed: `git diff HEAD -- <file>` (or `git diff HEAD` for everything at ' +
|
|
107
112
|
"once) for a file that already existed, or Read it directly if it's a new file git diff won't show. " +
|
|
108
113
|
'Then determine the intent behind the change as a whole. ' +
|
|
109
114
|
'Respond with a JSON object matching the given schema: why this change exists, a short summary of what changed, ' +
|
|
110
|
-
|
|
115
|
+
`the kind of change (${CHANGE_TYPES.join('/')}), a short kebab-case branch slug describing the change ` +
|
|
116
|
+
'(no prefix, path, or ticket id — those are added separately), a short single-line conventional-commit ' +
|
|
111
117
|
`subject (max ${COMMIT_MESSAGE_MAX_LENGTH} characters, no body or bullet list, used verbatim as the MR/PR title), ` +
|
|
112
118
|
'a one-line summary per changed file, a risk level with a one-line justification ' +
|
|
113
119
|
`(${RISK_CRITERIA}), and the concrete test scenarios a reviewer should check before merging.`;
|
|
@@ -115,7 +121,7 @@ export async function captureIntent(agent, files, worktreePath) {
|
|
|
115
121
|
prompt,
|
|
116
122
|
cwd: worktreePath,
|
|
117
123
|
jsonSchema: INTENT_SCHEMA,
|
|
118
|
-
model
|
|
124
|
+
model,
|
|
119
125
|
permissionMode: 'default',
|
|
120
126
|
allowedTools: READ_ONLY_TOOLS,
|
|
121
127
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captureIntent.js","sourceRoot":"","sources":["../../src/workflow/captureIntent.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAE9F,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC
|
|
1
|
+
{"version":3,"file":"captureIntent.js","sourceRoot":"","sources":["../../src/workflow/captureIntent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
1
|
/** Top-level control flow wiring the user's 8-step workflow together. */
|
|
2
|
-
export
|
|
2
|
+
export interface RunWorkflowOptions {
|
|
3
|
+
/** Ticket/issue id to interpolate into config.branchPattern's {ticket} placeholder, if it has one. */
|
|
4
|
+
ticket?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function runWorkflow(repoRoot: string, options?: RunWorkflowOptions): Promise<void>;
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import { loadConfig } from '../config/loader.js';
|
|
3
3
|
import { createForge } from '../forge/index.js';
|
|
4
4
|
import { selectAgent } from '../agent/index.js';
|
|
5
|
-
import { captureDiff } from '../git/diff.js';
|
|
5
|
+
import { captureDiff, resetRepo } from '../git/diff.js';
|
|
6
|
+
import { buildBranchName } from '../git/branchName.js';
|
|
6
7
|
import { createWorktree, syncWithOrigin, applyDiffToWorktree, removeWorktree, renameBranch, generateTempBranchName } from '../git/worktree.js';
|
|
7
8
|
import { currentBranch, commit, stageAll, findUnresolvedConflictMarkers } from '../git/commit.js';
|
|
8
9
|
import { captureIntent } from './captureIntent.js';
|
|
@@ -37,7 +38,7 @@ async function resolveApplyConflicts(agent, worktreePath, conflictedFiles) {
|
|
|
37
38
|
}
|
|
38
39
|
await stageAll(worktreePath);
|
|
39
40
|
}
|
|
40
|
-
export async function runWorkflow(repoRoot) {
|
|
41
|
+
export async function runWorkflow(repoRoot, options = {}) {
|
|
41
42
|
const config = loadConfig(repoRoot);
|
|
42
43
|
const forge = createForge(config);
|
|
43
44
|
const agent = selectAgent(config);
|
|
@@ -72,13 +73,7 @@ export async function runWorkflow(repoRoot) {
|
|
|
72
73
|
note(`conflict in: ${applyResult.conflictedFiles.join(', ')}`);
|
|
73
74
|
await resolveApplyConflicts(agent, worktreePath, applyResult.conflictedFiles);
|
|
74
75
|
}
|
|
75
|
-
const
|
|
76
|
-
note(`${config.agent} says: ${intent.summary}`);
|
|
77
|
-
noteRisk(intent.risk, intent.riskReason);
|
|
78
|
-
await runStep(6, '🌿', 'Checkout feature branch', `switch to feature branch ${intent.branchName}`, () => renameBranch(worktreePath, intent.branchName));
|
|
79
|
-
state = { ...state, branch: intent.branchName, phase: 'intent' };
|
|
80
|
-
saveRunState(repoRoot, state);
|
|
81
|
-
const checks = await runStep(7, '✅', 'Running checks', 'build, lint, and test — whichever your repo has configured', () => runChecks(config, worktreePath));
|
|
76
|
+
const checks = await runStep(5, '✅', 'Running checks', 'build, lint, and test — whichever your repo has configured', () => runChecks(config, worktreePath));
|
|
82
77
|
for (const check of checks)
|
|
83
78
|
note(`${check.name}: ${check.ok ? 'passed' : 'failed'} (${(check.durationMs / 1000).toFixed(1)}s)`);
|
|
84
79
|
const failedCheck = checks.find((c) => !c.ok);
|
|
@@ -89,6 +84,16 @@ export async function runWorkflow(repoRoot) {
|
|
|
89
84
|
}
|
|
90
85
|
state.phase = 'checks';
|
|
91
86
|
saveRunState(repoRoot, state);
|
|
87
|
+
// Runs last among the pre-push stages (checks pass first) since it's the
|
|
88
|
+
// most expensive one: no point paying for an AI summary of a change that
|
|
89
|
+
// build/lint/test already rejected.
|
|
90
|
+
const intent = await runStep(6, '🧠', 'Understanding your changes', `ask ${config.agent} to infer a change type, branch slug, commit message, and summary`, () => captureIntent(agent, [...changedFiles, ...untrackedFiles], worktreePath, config.intentModel));
|
|
91
|
+
note(`${config.agent} says: ${intent.summary}`);
|
|
92
|
+
noteRisk(intent.risk, intent.riskReason);
|
|
93
|
+
const branchName = buildBranchName(config.branchPattern, { type: intent.changeType, ticket: options.ticket, name: intent.branchSlug });
|
|
94
|
+
await runStep(7, '🌿', 'Checkout feature branch', `switch to feature branch ${branchName}`, () => renameBranch(worktreePath, branchName));
|
|
95
|
+
state = { ...state, branch: branchName, phase: 'intent' };
|
|
96
|
+
saveRunState(repoRoot, state);
|
|
92
97
|
await runStep(8, '💾', 'Committing changes', `commit message: "${intent.commitMessage}"`,
|
|
93
98
|
// applyDiffToWorktree left everything staged; without this commit the
|
|
94
99
|
// push would carry no changes and the MR would be empty.
|
|
@@ -105,6 +110,13 @@ export async function runWorkflow(repoRoot) {
|
|
|
105
110
|
if (finalPhase === 'done') {
|
|
106
111
|
const detail = state.pipelineId !== undefined ? `MR ${mr.webUrl} passed CI` : `MR ${mr.webUrl} opened — no CI pipeline found, nothing to watch`;
|
|
107
112
|
step('🎉', 'Done', detail);
|
|
113
|
+
if (config.cleanupOnSuccess) {
|
|
114
|
+
// The captured changes now live safely on state.branch (pushed and,
|
|
115
|
+
// per finalPhase === 'done', either merged-clean or CI-verified) —
|
|
116
|
+
// repoRoot's copy is redundant, so reset it back to HEAD regardless
|
|
117
|
+
// of what branch it's currently on.
|
|
118
|
+
await runStep(11, '🧹', 'Cleaning up your repo', `reset to HEAD — your changes are now safely on ${state.branch}`, () => resetRepo(repoRoot, untrackedFiles));
|
|
119
|
+
}
|
|
108
120
|
}
|
|
109
121
|
else if (finalPhase === 'escalated') {
|
|
110
122
|
step('🚨', 'Stopped for human review', `see ${mr.webUrl} for what was tried and why`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../src/workflow/orchestrate.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../src/workflow/orchestrate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pipeline-worker",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"description": "Automated git-worktree workflow: captures intent from a diff via Claude Code or GitHub Copilot CLI, runs build/lint/test, opens a GitLab MR or GitHub PR, and auto-fixes failing pipelines — with a companion forge MCP server (TOON-encoded responses).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Mohan TN <mohan.tn100@gmail.com>",
|
|
@@ -49,12 +49,10 @@
|
|
|
49
49
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
50
50
|
"@toon-format/toon": "^2.3.0",
|
|
51
51
|
"commander": "^12.0.0",
|
|
52
|
-
"js-yaml": "^4.1.0",
|
|
53
52
|
"zod": "^3.25.0"
|
|
54
53
|
},
|
|
55
54
|
"devDependencies": {
|
|
56
55
|
"@eslint/js": "^9.0.0",
|
|
57
|
-
"@types/js-yaml": "^4.0.0",
|
|
58
56
|
"@types/node": "^22.0.0",
|
|
59
57
|
"tsx": "^4.0.0",
|
|
60
58
|
"typescript": "^5.5.0",
|