dorfl 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +74 -4
- package/dist/cli.js.map +1 -1
- package/dist/gc.d.ts +59 -0
- package/dist/gc.d.ts.map +1 -1
- package/dist/gc.js +145 -2
- package/dist/gc.js.map +1 -1
- package/dist/git.d.ts +20 -0
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +155 -8
- package/dist/git.js.map +1 -1
- package/dist/skills/drive-tasks/SKILL.md +1 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +64 -21
- package/dist/workspace.js.map +1 -1
- package/package.json +1 -1
- package/src/cli.ts +94 -5
- package/src/gc.ts +202 -2
- package/src/git.ts +180 -8
- package/src/workspace.ts +74 -20
package/dist/gc.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
1
|
+
import { existsSync, lstatSync, readdirSync, rmSync, statSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { git, run } from './git.js';
|
|
4
|
+
import { encodeRepoKey, readOriginUrl } from './repo-mirror.js';
|
|
4
5
|
import { JOB_RECORD_FILENAME, jobRecordPath, readJobRecord, removeJobRecord, } from './workspace.js';
|
|
5
6
|
import { parseWorkBranchRef, workBranchRef } from './slug-namespace.js';
|
|
6
7
|
import { terminalMainPaths } from './item-lock.js';
|
|
@@ -130,14 +131,36 @@ export function reapJob(input) {
|
|
|
130
131
|
* `force: true` overrides the predicate for every job (discard un-saved work) —
|
|
131
132
|
* loud + explicit (the CLI confirms first), NEVER the default. A job whose work
|
|
132
133
|
* is NOT on the arbiter is never auto-removed without `force`.
|
|
134
|
+
*
|
|
135
|
+
* SCOPE: when `arbiterKey` is set the sweep considers ONLY worktrees belonging
|
|
136
|
+
* to that arbiter (the CLI's default, resolved from the cwd) — so a `gc` in repo
|
|
137
|
+
* A cannot reap repo B's worktrees. An UNSET `arbiterKey` sweeps GLOBALLY across
|
|
138
|
+
* every arbiter (the CLI reaches that only behind the loud `--all-arbiters`).
|
|
133
139
|
*/
|
|
134
140
|
export function gc(options) {
|
|
135
141
|
const note = options.note ?? (() => { });
|
|
136
142
|
const env = options.env;
|
|
143
|
+
const arbiterKey = options.arbiterKey;
|
|
137
144
|
const reaped = [];
|
|
138
145
|
const retained = [];
|
|
146
|
+
// First, self-heal any record-less ORPHAN `work/*` entry (a dangling symlink
|
|
147
|
+
// or a dir git never registered) so a half-set-up claim does not linger unseen
|
|
148
|
+
// by the job loop below and wedge the next `worktree add`. Orphans carry NO
|
|
149
|
+
// durable work and are NOT any repo's real worktree (no record ⇒ no mirror to
|
|
150
|
+
// attribute to an arbiter), so the arbiter scope does not gate them — they are
|
|
151
|
+
// bounded, worthless residue either way.
|
|
152
|
+
const sweptOrphans = sweepOrphans(options.workspacesDir, note);
|
|
139
153
|
for (const job of discoverJobs(options.workspacesDir)) {
|
|
140
154
|
const mirrorPath = resolveMirrorPath(options.workspacesDir, job);
|
|
155
|
+
// ARBITER SCOPE (the default `gc` mode): when `arbiterKey` is set, consider
|
|
156
|
+
// ONLY worktrees whose mirror `origin` encodes to that hub key — a `gc` run
|
|
157
|
+
// from repo A must never reap repo B's worktrees. A job whose mirror origin
|
|
158
|
+
// is unreadable (a malformed mirror) is SKIPPED under scope (the safe
|
|
159
|
+
// direction: we cannot prove it belongs to this arbiter, so leave it).
|
|
160
|
+
if (arbiterKey !== undefined &&
|
|
161
|
+
jobArbiterKey(mirrorPath, env) !== arbiterKey) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
141
164
|
const result = reapJob({
|
|
142
165
|
dir: job.dir,
|
|
143
166
|
branch: job.branch,
|
|
@@ -157,7 +180,76 @@ export function gc(options) {
|
|
|
157
180
|
retained.push({ ...job, reason, reasonText });
|
|
158
181
|
note(`Retained ${job.slug}: ${reasonText}.`);
|
|
159
182
|
}
|
|
160
|
-
return { reaped, retained };
|
|
183
|
+
return { reaped, retained, sweptOrphans };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Sweep record-less ORPHAN entries under `<workspacesDir>/work/*`: a DANGLING
|
|
187
|
+
* SYMLINK (its target gone) or a directory with NO job record at either the
|
|
188
|
+
* sibling or legacy in-tree location. These are the residue of a run that
|
|
189
|
+
* crashed BETWEEN creating the `work/<id>` path and registering it as a git
|
|
190
|
+
* worktree (or writing its record) — e.g. an early `spawn git ENOENT`. They hold
|
|
191
|
+
* no durable work, are invisible to {@link discoverJobs} (which requires a
|
|
192
|
+
* record), and block the next same-id `worktree add`. Removing them is a bounded
|
|
193
|
+
* `rmSync` of ONE path each (never a registered worktree — those carry a record
|
|
194
|
+
* and go through the reap predicate). Best-effort per entry.
|
|
195
|
+
*/
|
|
196
|
+
function sweepOrphans(workspacesDir, note) {
|
|
197
|
+
const workDir = join(workspacesDir, 'work');
|
|
198
|
+
if (!existsSync(workDir)) {
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
const swept = [];
|
|
202
|
+
for (const entry of readdirSync(workDir)) {
|
|
203
|
+
if (entry.endsWith('.json')) {
|
|
204
|
+
continue; // a sibling record file, not a work-id entry
|
|
205
|
+
}
|
|
206
|
+
const dir = join(workDir, entry);
|
|
207
|
+
let link;
|
|
208
|
+
try {
|
|
209
|
+
link = lstatSync(dir);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
continue; // vanished under us
|
|
213
|
+
}
|
|
214
|
+
const isSymlink = link.isSymbolicLink();
|
|
215
|
+
const targetExists = existsSync(dir); // follows the link; false ⇒ dangling
|
|
216
|
+
const hasRecord = existsSync(jobRecordPath(dir)) ||
|
|
217
|
+
(targetExists && existsSync(join(dir, JOB_RECORD_FILENAME)));
|
|
218
|
+
// Orphan iff: a dangling symlink (target gone), OR a record-less entry that
|
|
219
|
+
// is not a live directory git could own (a stray symlink-to-elsewhere, or a
|
|
220
|
+
// dir with no record). A record-bearing entry is a real job → leave it to the
|
|
221
|
+
// reap predicate above.
|
|
222
|
+
const danglingSymlink = isSymlink && !targetExists;
|
|
223
|
+
if (hasRecord) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (!danglingSymlink) {
|
|
227
|
+
// A record-less real directory: only sweep it if git does not track it as a
|
|
228
|
+
// worktree here. `discoverJobs` already skips it (no record), and a
|
|
229
|
+
// registered worktree always has our record, so a record-less dir is an
|
|
230
|
+
// orphan. But be conservative: skip a NON-symlink dir that is not empty of
|
|
231
|
+
// a `.git` pointer only when it looks like a crashed pre-register dir.
|
|
232
|
+
if (isSymlink && targetExists) {
|
|
233
|
+
// symlink to a live path but no record → still an orphan link
|
|
234
|
+
}
|
|
235
|
+
else if (!link.isDirectory()) {
|
|
236
|
+
continue; // not a dir, not a dangling link — leave alone
|
|
237
|
+
}
|
|
238
|
+
else if (existsSync(join(dir, '.git'))) {
|
|
239
|
+
continue; // has a git pointer but no record: leave for a human (rare)
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
try {
|
|
243
|
+
rmSync(dir, { recursive: true, force: true });
|
|
244
|
+
const kind = danglingSymlink ? 'dangling-symlink' : 'orphan-dir';
|
|
245
|
+
swept.push({ dir, kind });
|
|
246
|
+
note(`Swept orphan work entry ${entry} (${kind}).`);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// best-effort: a permission error surfaces on the next add attempt
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return swept;
|
|
161
253
|
}
|
|
162
254
|
/**
|
|
163
255
|
* Discover every job worktree under `<workspacesDir>/work/*` (the flat layout —
|
|
@@ -224,6 +316,57 @@ function resolveMirrorPath(workspacesDir, job) {
|
|
|
224
316
|
// Fallback: the repos hub under the workspaces dir (best-effort).
|
|
225
317
|
return join(workspacesDir, 'repos');
|
|
226
318
|
}
|
|
319
|
+
/**
|
|
320
|
+
* The hub KEY ({@link encodeRepoKey}) of the arbiter a job worktree belongs to,
|
|
321
|
+
* read from its hub mirror's `origin` URL (the arbiter URL the mirror was cloned
|
|
322
|
+
* from). This is the SAME identity `do --isolated` / `ensureMirror` key a repo's
|
|
323
|
+
* arbiter under (`mirrorPath` = `<workspacesDir>/repos/<key>.git`), so a `gc`
|
|
324
|
+
* scoped to the cwd's arbiter key matches exactly the worktrees cut for that
|
|
325
|
+
* arbiter. Returns `undefined` when the mirror `origin` cannot be read (a
|
|
326
|
+
* malformed mirror) — the caller then treats the job as NOT belonging to the
|
|
327
|
+
* scoped arbiter (the safe direction under a scoped sweep).
|
|
328
|
+
*/
|
|
329
|
+
function jobArbiterKey(mirrorPath, env) {
|
|
330
|
+
const originUrl = readOriginUrl(mirrorPath, env);
|
|
331
|
+
return originUrl === undefined ? undefined : encodeRepoKey(originUrl);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Enumerate the DISTINCT arbiters that currently own a worktree under
|
|
335
|
+
* `<workspacesDir>/work/*` — i.e. the set a GLOBAL (`--all-arbiters`) sweep would
|
|
336
|
+
* touch. Reads each discovered job's hub mirror `origin` URL and de-duplicates
|
|
337
|
+
* by hub key. Used ONLY to print the loud banner before a cross-arbiter sweep;
|
|
338
|
+
* the sweep itself re-derives per-job scope in {@link gc}.
|
|
339
|
+
*/
|
|
340
|
+
export function enumerateWorkspaceArbiters(workspacesDir, env) {
|
|
341
|
+
const seen = new Map();
|
|
342
|
+
for (const job of discoverJobs(workspacesDir)) {
|
|
343
|
+
const mirrorPath = resolveMirrorPath(workspacesDir, job);
|
|
344
|
+
const url = readOriginUrl(mirrorPath, env);
|
|
345
|
+
const key = url === undefined ? undefined : encodeRepoKey(url);
|
|
346
|
+
const dedupe = key ?? `path:${mirrorPath}`;
|
|
347
|
+
if (!seen.has(dedupe)) {
|
|
348
|
+
seen.set(dedupe, { key, url });
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return [...seen.values()];
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* The hub KEY ({@link encodeRepoKey}) of the arbiter reachable from a working
|
|
355
|
+
* repo `cwd` via its `<arbiter>` remote (default `origin`), i.e. `encodeRepoKey`
|
|
356
|
+
* of `git -C <cwd> remote get-url <arbiter>`. This is how the `gc` CLI resolves
|
|
357
|
+
* the DEFAULT scope from the current directory — the SAME arbiter-resolution the
|
|
358
|
+
* mirror / `do --isolated` path uses (`ensureMirror`'s `fromRepo` + `arbiter`).
|
|
359
|
+
* Returns `undefined` when `cwd` is not a git repo or has no such remote (the
|
|
360
|
+
* CLI then errors rather than silently going global).
|
|
361
|
+
*/
|
|
362
|
+
export function resolveArbiterKeyFromCwd(cwd, arbiter, env) {
|
|
363
|
+
const res = run('git', ['remote', 'get-url', arbiter], cwd, { env });
|
|
364
|
+
if (res.status !== 0) {
|
|
365
|
+
return undefined;
|
|
366
|
+
}
|
|
367
|
+
const url = res.stdout.trim();
|
|
368
|
+
return url === '' ? undefined : encodeRepoKey(url);
|
|
369
|
+
}
|
|
227
370
|
/**
|
|
228
371
|
* True iff the working tree has NO uncommitted WORK (tracked, staged, or
|
|
229
372
|
* untracked). The agent's edits and any untracked artefacts count: untracked
|
package/dist/gc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gc.js","sourceRoot":"","sources":["../src/gc.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gc.js","sourceRoot":"","sources":["../src/gc.ts"],"names":[],"mappings":"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"}
|
package/dist/git.d.ts
CHANGED
|
@@ -4,6 +4,26 @@ export interface RunResult {
|
|
|
4
4
|
stdout: string;
|
|
5
5
|
stderr: string;
|
|
6
6
|
}
|
|
7
|
+
/** Clear the {@link resolveGitBinary} cache (tests only). */
|
|
8
|
+
export declare function resetResolvedGitBinaryForTest(): void;
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the `git` executable to an ABSOLUTE path for a given `env`, robustly —
|
|
11
|
+
* so a caller `PATH` that omits `/usr/bin` cannot produce a mid-run `spawn git
|
|
12
|
+
* ENOENT`, WITHOUT masking a git the caller deliberately put earlier on `PATH`
|
|
13
|
+
* (a project pin, or a test shim). Order:
|
|
14
|
+
*
|
|
15
|
+
* 1. an explicit `DORFL_GIT` / `GIT` env override (an absolute path to a git
|
|
16
|
+
* binary), for full operator control;
|
|
17
|
+
* 2. a probe of the env's OWN `PATH` FIRST (so a shim / pinned git earlier on
|
|
18
|
+
* `PATH` wins), then the standard system dirs APPENDED — so `/usr/bin/git`
|
|
19
|
+
* is still found when the caller dropped `/usr/bin`, but never AHEAD of the
|
|
20
|
+
* caller's own entries.
|
|
21
|
+
*
|
|
22
|
+
* Falls back to the bare name `'git'` when nothing resolves (git genuinely
|
|
23
|
+
* absent) so the spawn still runs and produces the diagnostic path. Cached PER
|
|
24
|
+
* effective PATH so distinct envs resolve independently.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveGitBinary(env?: NodeJS.ProcessEnv): string;
|
|
7
27
|
/**
|
|
8
28
|
* Run a command synchronously in `cwd`, capturing output. A non-zero exit is NOT
|
|
9
29
|
* thrown here — callers inspect `status` (claim.sh's exit codes are meaningful).
|
package/dist/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAIA,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAM,GACrD,SAAS,
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAIA,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf;AA8DD,6DAA6D;AAC7D,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAU7E;AA8ED;;;GAGG;AACH,wBAAgB,GAAG,CAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAM,GACrD,SAAS,CAiBX;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAM,GACrD,OAAO,CAAC,SAAS,CAAC,CA2BpB;AAED,sFAAsF;AACtF,wBAAgB,GAAG,CAClB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAM,GACrD,MAAM,CAQR;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGjE;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GAChC,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IACnC,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAmB9B"}
|
package/dist/git.js
CHANGED
|
@@ -1,20 +1,166 @@
|
|
|
1
1
|
import { spawnSync, spawn } from 'node:child_process';
|
|
2
|
-
import { mkdirSync } from 'node:fs';
|
|
3
|
-
import { dirname } from 'node:path';
|
|
2
|
+
import { existsSync, mkdirSync, statSync } from 'node:fs';
|
|
3
|
+
import { delimiter, dirname, isAbsolute, join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* The standard system dirs core tools (`git`, `ssh`, `sh`) live in. Some callers
|
|
6
|
+
* launch `dorfl` with a CURATED `PATH` (a version-manager / MCP-agent env that
|
|
7
|
+
* lists only `~/.volta/bin`, `~/.cargo/bin`, `~/.local/bin`, …) that OMITS these.
|
|
8
|
+
* `dorfl` spawns bare `git` (and git in turn may shell out to `ssh`/`sh` for
|
|
9
|
+
* hooks and remote transport), so a `PATH` missing `/usr/bin` produces an opaque
|
|
10
|
+
* mid-run `spawn git ENOENT`. We UNION these onto whatever `PATH` we are given so
|
|
11
|
+
* core tools resolve even under a curated caller `PATH`, without discarding the
|
|
12
|
+
* caller's own entries (a project-pinned `git` earlier on `PATH` still wins).
|
|
13
|
+
*/
|
|
14
|
+
const SYSTEM_PATH_DIRS = [
|
|
15
|
+
'/usr/local/bin',
|
|
16
|
+
'/usr/bin',
|
|
17
|
+
'/bin',
|
|
18
|
+
'/usr/sbin',
|
|
19
|
+
'/sbin',
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* `PATH` with {@link SYSTEM_PATH_DIRS} APPENDED (caller entries kept FIRST, so a
|
|
23
|
+
* pinned tool earlier on `PATH` still wins; missing system dirs are added, not
|
|
24
|
+
* substituted). Deduplicated, preserving first-seen order.
|
|
25
|
+
*/
|
|
26
|
+
function pathWithSystemDirs(path) {
|
|
27
|
+
const seen = new Set();
|
|
28
|
+
const out = [];
|
|
29
|
+
for (const dir of [
|
|
30
|
+
...(path ? path.split(delimiter) : []),
|
|
31
|
+
...SYSTEM_PATH_DIRS,
|
|
32
|
+
]) {
|
|
33
|
+
if (dir !== '' && !seen.has(dir)) {
|
|
34
|
+
seen.add(dir);
|
|
35
|
+
out.push(dir);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return out.join(delimiter);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Return `env` with `PATH` hardened via {@link pathWithSystemDirs}, so the
|
|
42
|
+
* spawned tool (and any tool IT shells out to) can find core system binaries
|
|
43
|
+
* even when the caller's `PATH` omitted `/usr/bin`. Returns a COPY — never
|
|
44
|
+
* mutates the caller's env object. `PATH` is looked up case-insensitively so a
|
|
45
|
+
* Windows `Path`/`PATH` split is not silently missed.
|
|
46
|
+
*/
|
|
47
|
+
function envWithSystemPath(env) {
|
|
48
|
+
const key = Object.keys(env).find((k) => k.toUpperCase() === 'PATH') ?? 'PATH';
|
|
49
|
+
return { ...env, [key]: pathWithSystemDirs(env[key]) };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Per-effective-PATH cache of the resolved absolute `git` path. Keyed by the
|
|
53
|
+
* effective PATH (+ any `DORFL_GIT`/`GIT` override) so a DIFFERENT env — e.g. a
|
|
54
|
+
* test's PATH-prepended `git` shim, or a project that pins its own git — is
|
|
55
|
+
* resolved AGAINST ITS OWN PATH, never masked by a stale global memo. Bounded in
|
|
56
|
+
* practice (the process uses a handful of distinct envs) and reset in tests.
|
|
57
|
+
*/
|
|
58
|
+
const gitBinaryCache = new Map();
|
|
59
|
+
/** Clear the {@link resolveGitBinary} cache (tests only). */
|
|
60
|
+
export function resetResolvedGitBinaryForTest() {
|
|
61
|
+
gitBinaryCache.clear();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve the `git` executable to an ABSOLUTE path for a given `env`, robustly —
|
|
65
|
+
* so a caller `PATH` that omits `/usr/bin` cannot produce a mid-run `spawn git
|
|
66
|
+
* ENOENT`, WITHOUT masking a git the caller deliberately put earlier on `PATH`
|
|
67
|
+
* (a project pin, or a test shim). Order:
|
|
68
|
+
*
|
|
69
|
+
* 1. an explicit `DORFL_GIT` / `GIT` env override (an absolute path to a git
|
|
70
|
+
* binary), for full operator control;
|
|
71
|
+
* 2. a probe of the env's OWN `PATH` FIRST (so a shim / pinned git earlier on
|
|
72
|
+
* `PATH` wins), then the standard system dirs APPENDED — so `/usr/bin/git`
|
|
73
|
+
* is still found when the caller dropped `/usr/bin`, but never AHEAD of the
|
|
74
|
+
* caller's own entries.
|
|
75
|
+
*
|
|
76
|
+
* Falls back to the bare name `'git'` when nothing resolves (git genuinely
|
|
77
|
+
* absent) so the spawn still runs and produces the diagnostic path. Cached PER
|
|
78
|
+
* effective PATH so distinct envs resolve independently.
|
|
79
|
+
*/
|
|
80
|
+
export function resolveGitBinary(env = process.env) {
|
|
81
|
+
const pathValue = pathWithSystemDirs(env.PATH);
|
|
82
|
+
const cacheKey = `${env.DORFL_GIT ?? ''}\u0000${env.GIT ?? ''}\u0000${pathValue}`;
|
|
83
|
+
const cached = gitBinaryCache.get(cacheKey);
|
|
84
|
+
if (cached !== undefined) {
|
|
85
|
+
return cached;
|
|
86
|
+
}
|
|
87
|
+
const resolved = resolveGitBinaryUncached(env, pathValue);
|
|
88
|
+
gitBinaryCache.set(cacheKey, resolved);
|
|
89
|
+
return resolved;
|
|
90
|
+
}
|
|
91
|
+
function resolveGitBinaryUncached(env, pathValue) {
|
|
92
|
+
for (const override of [env.DORFL_GIT, env.GIT]) {
|
|
93
|
+
if (override && isAbsolute(override) && isExecutableFile(override)) {
|
|
94
|
+
return override;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const exe = process.platform === 'win32' ? 'git.exe' : 'git';
|
|
98
|
+
for (const dir of pathValue.split(delimiter)) {
|
|
99
|
+
const candidate = join(dir, exe);
|
|
100
|
+
if (isExecutableFile(candidate)) {
|
|
101
|
+
return candidate;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return 'git'; // unresolved — let the spawn surface the ENOENT diagnostic
|
|
105
|
+
}
|
|
106
|
+
/** True iff `path` is a regular file (a symlink target is followed by statSync). */
|
|
107
|
+
function isExecutableFile(path) {
|
|
108
|
+
try {
|
|
109
|
+
return existsSync(path) && statSync(path).isFile();
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Resolve a command + harden its spawn env: bare `'git'` is replaced by the
|
|
117
|
+
* absolute {@link resolveGitBinary} path, and the spawn env's `PATH` is unioned
|
|
118
|
+
* with the standard system dirs so git's own child processes (hooks, `ssh`) also
|
|
119
|
+
* resolve. Any OTHER command is passed through unchanged (only its `PATH` is
|
|
120
|
+
* hardened). This is the single choke-point both {@link run} and
|
|
121
|
+
* {@link runAsync} funnel through, so every git spawn in the codebase inherits
|
|
122
|
+
* the robust resolution for free.
|
|
123
|
+
*/
|
|
124
|
+
function resolveSpawn(command, env) {
|
|
125
|
+
const hardenedEnv = envWithSystemPath(env);
|
|
126
|
+
const resolved = command === 'git' ? resolveGitBinary(hardenedEnv) : command;
|
|
127
|
+
return { command: resolved, env: hardenedEnv };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Build the spawn-failure message. A plain `spawn git ENOENT` is OPAQUE (it does
|
|
131
|
+
* not say WHY git was not found); for the `ENOENT` case we surface the effective
|
|
132
|
+
* `PATH` and point at `DORFL_GIT`, so a curated caller `PATH` that omits the
|
|
133
|
+
* system dirs is diagnosable at a glance instead of mid-run. Other spawn errors
|
|
134
|
+
* pass through with the original message.
|
|
135
|
+
*/
|
|
136
|
+
function spawnErrorMessage(command, resolved, env, err) {
|
|
137
|
+
if (err.code === 'ENOENT') {
|
|
138
|
+
const path = env[Object.keys(env).find((k) => k.toUpperCase() === 'PATH') ?? 'PATH'] ??
|
|
139
|
+
'';
|
|
140
|
+
const hint = command === 'git'
|
|
141
|
+
? `Is git installed and on PATH? Set DORFL_GIT to an absolute git path, or add its dir to PATH. `
|
|
142
|
+
: `Is it installed and on PATH? `;
|
|
143
|
+
return (`failed to spawn '${command}': not found (tried '${resolved}'). ` +
|
|
144
|
+
hint +
|
|
145
|
+
`Effective PATH=${path}`);
|
|
146
|
+
}
|
|
147
|
+
return `failed to spawn '${command}': ${err.message}`;
|
|
148
|
+
}
|
|
4
149
|
/**
|
|
5
150
|
* Run a command synchronously in `cwd`, capturing output. A non-zero exit is NOT
|
|
6
151
|
* thrown here — callers inspect `status` (claim.sh's exit codes are meaningful).
|
|
7
152
|
*/
|
|
8
153
|
export function run(command, args, cwd, options = {}) {
|
|
9
|
-
const
|
|
154
|
+
const { command: exe, env } = resolveSpawn(command, options.env ?? process.env);
|
|
155
|
+
const result = spawnSync(exe, args, {
|
|
10
156
|
cwd,
|
|
11
157
|
encoding: 'utf8',
|
|
12
158
|
input: options.input,
|
|
13
|
-
env
|
|
159
|
+
env,
|
|
14
160
|
maxBuffer: 64 * 1024 * 1024,
|
|
15
161
|
});
|
|
16
162
|
if (result.error) {
|
|
17
|
-
throw new Error(
|
|
163
|
+
throw new Error(spawnErrorMessage(command, exe, env, result.error));
|
|
18
164
|
}
|
|
19
165
|
return {
|
|
20
166
|
status: result.status ?? -1,
|
|
@@ -28,10 +174,11 @@ export function run(command, args, cwd, options = {}) {
|
|
|
28
174
|
* claim race the way claim.sh's own verification does (truly simultaneous).
|
|
29
175
|
*/
|
|
30
176
|
export function runAsync(command, args, cwd, options = {}) {
|
|
177
|
+
const { command: exe, env } = resolveSpawn(command, options.env ?? process.env);
|
|
31
178
|
return new Promise((resolvePromise, reject) => {
|
|
32
|
-
const child = spawn(
|
|
179
|
+
const child = spawn(exe, args, {
|
|
33
180
|
cwd,
|
|
34
|
-
env
|
|
181
|
+
env,
|
|
35
182
|
});
|
|
36
183
|
let stdout = '';
|
|
37
184
|
let stderr = '';
|
|
@@ -41,7 +188,7 @@ export function runAsync(command, args, cwd, options = {}) {
|
|
|
41
188
|
child.stderr.on('data', (chunk) => {
|
|
42
189
|
stderr += chunk.toString('utf8');
|
|
43
190
|
});
|
|
44
|
-
child.on('error', (err) => reject(new Error(
|
|
191
|
+
child.on('error', (err) => reject(new Error(spawnErrorMessage(command, exe, env, err))));
|
|
45
192
|
child.on('close', (code) => {
|
|
46
193
|
resolvePromise({ status: code ?? -1, stdout, stderr });
|
|
47
194
|
});
|
package/dist/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,KAAK,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -185,7 +185,7 @@ This dispatch IS the build — `do` runs the build agent that IMPLEMENTS the tas
|
|
|
185
185
|
|
|
186
186
|
**`--isolated` is the one flag this skill mandates. Everything else — review mode, integration mode, harness, model — is LET TO CONFIG** (resolved `flag > env > per-repo > global > default`), so do NOT hardcode `--review`/`--propose`/`--merge` here: the repo's `dorfl.json` decides, and `do --propose` is already the default. (`--isolated` reads the target repo's committed `dorfl.json` from the arbiter's main, so per-repo `harness`/`verify`/`noPR`/`review` apply automatically — no `--harness`/env workaround.) **At the START of a drive, CONFIRM the run mode with the user** — do they want Gate 2 (`--review`, off by default — the human-first family default), and propose vs merge integration? — and add `--review` / `--merge` / etc. as explicit per-run OVERRIDES only when the user asks; otherwise let config drive every build of the drive.
|
|
187
187
|
|
|
188
|
-
After a failed/aborted isolated run, a stale job worktree can linger and block the next build's mirror fetch — run `dorfl gc` (or `gc --force --yes` once you've confirmed the work is safe on the arbiter) to reap it before continuing. Use a **generous timeout** — `do` runs a build agent + the full gate + (if enabled) the Gate-2 review and can take well over an hour for a big task. If you interrupt it, KILL the spawned `do`/agent process tree explicitly (an abort of your wrapper does NOT stop the child); the isolated worktree is then reaped/recovered via `gc` + the kept arbiter branch (your checkout is untouched).
|
|
188
|
+
After a failed/aborted isolated run, a stale job worktree can linger and block the next build's mirror fetch — run `dorfl gc` (or `gc --force --yes` once you've confirmed the work is safe on the arbiter) to reap it before continuing. `gc` is **arbiter-scoped by default**: run it from inside THIS repo's checkout and it only touches THIS arbiter's worktrees, so `gc --force --yes` can never discard another repo's un-pushed work (that global blast-radius now requires an explicit, loud `--all-arbiters`). Use a **generous timeout** — `do` runs a build agent + the full gate + (if enabled) the Gate-2 review and can take well over an hour for a big task. If you interrupt it, KILL the spawned `do`/agent process tree explicitly (an abort of your wrapper does NOT stop the child); the isolated worktree is then reaped/recovered via `gc` + the kept arbiter branch (your checkout is untouched).
|
|
189
189
|
|
|
190
190
|
- **Non-zero exit** (red gate / Gate-2 block / rebase conflict) → the item is now in needs-attention (its lock is `state: stuck`) with its reason in the body and its branch preserved on the arbiter. STOP that task (golden rule 2), skip its dependents, move to the next INDEPENDENT ready task. If the reason is a FIXABLE problem (not a human-decision block), it is recoverable IN-LOOP via `requeue` + re-`do` (continues from the kept branch) — see [Recovering a needs-attention item](#recovering-a-needs-attention-item-requeue); otherwise it becomes a stuck-set question.
|
|
191
191
|
|
package/dist/workspace.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/workspace.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
1
|
+
import { existsSync, lstatSync, readFileSync, rmSync, writeFileSync, } from 'node:fs';
|
|
2
2
|
import { basename, dirname, join } from 'node:path';
|
|
3
3
|
import { git } from './git.js';
|
|
4
4
|
import { encodeRepoKey, ensureMirror, } from './repo-mirror.js';
|
|
@@ -272,17 +272,73 @@ export function updateJobRecord(dir, patch) {
|
|
|
272
272
|
writeJobRecord(dir, next);
|
|
273
273
|
return next;
|
|
274
274
|
}
|
|
275
|
-
/**
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
275
|
+
/**
|
|
276
|
+
* Clear a stale worktree PATH the contract-safe way, SELF-HEALING a half-set-up
|
|
277
|
+
* claim. `git worktree remove --force` is the normal path, but it REFUSES with
|
|
278
|
+
* "is not a working tree" when `dir` is a leftover that git never registered — a
|
|
279
|
+
* dangling `~/.dorfl/work/<id>` SYMLINK, or a bare directory from a run that
|
|
280
|
+
* crashed AFTER the path appeared but BEFORE `git worktree add` registered it
|
|
281
|
+
* (an early `spawn git ENOENT`, exactly the failure this whole change targets).
|
|
282
|
+
* In that case git's own removal + `worktree prune` both leave the path in place,
|
|
283
|
+
* so the NEXT `git worktree add <dir>` fails "already exists" and the claim is
|
|
284
|
+
* wedged until a human `rm`s it by hand.
|
|
285
|
+
*
|
|
286
|
+
* So: if after the git removal the path STILL EXISTS and is NOT a live
|
|
287
|
+
* registered worktree, fall back to a BOUNDED `rmSync` of that one path. This is
|
|
288
|
+
* ADR §4-safe — we only ever `rm` a path git ITSELF refused to manage and that
|
|
289
|
+
* carries no registered worktree (no durable work to lose): a broken symlink, or
|
|
290
|
+
* an orphaned dir git does not know about. A genuinely registered worktree is
|
|
291
|
+
* removed by git and never reaches the `rmSync`.
|
|
292
|
+
*/
|
|
293
|
+
function forceClearWorktreePath(mirrorPath, dir, env) {
|
|
294
|
+
if (!pathPresent(dir)) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
// Soft-remove: ignore errors (e.g. the dir is not a registered worktree).
|
|
298
|
+
try {
|
|
299
|
+
git(['worktree', 'remove', '--force', dir], mirrorPath, { env });
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
// fall through to the prune + orphan-rm below
|
|
303
|
+
}
|
|
304
|
+
try {
|
|
305
|
+
git(['worktree', 'prune'], mirrorPath, { env });
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
// best-effort
|
|
309
|
+
}
|
|
310
|
+
// If the path survived git's removal + prune it is an ORPHAN git will not
|
|
311
|
+
// manage (a dangling symlink / an un-registered dir). Remove that one path so
|
|
312
|
+
// the re-create's `worktree add` is not blocked. Never recurse into a
|
|
313
|
+
// registered worktree (git already handled those).
|
|
314
|
+
if (pathPresent(dir)) {
|
|
279
315
|
try {
|
|
280
|
-
|
|
316
|
+
rmSync(dir, { recursive: true, force: true });
|
|
281
317
|
}
|
|
282
318
|
catch {
|
|
283
|
-
//
|
|
319
|
+
// best-effort: a genuine permission error surfaces on the next add
|
|
284
320
|
}
|
|
285
321
|
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* True iff `dir` EXISTS as a path entry — including a DANGLING symlink (whose
|
|
325
|
+
* target is gone). `existsSync` follows symlinks so it returns `false` for a
|
|
326
|
+
* broken one, which would let an orphaned `~/.dorfl/work/<id>` symlink slip past
|
|
327
|
+
* the cleanup; `lstatSync` inspects the LINK itself, so a dangling symlink is
|
|
328
|
+
* still seen (and removed).
|
|
329
|
+
*/
|
|
330
|
+
function pathPresent(dir) {
|
|
331
|
+
try {
|
|
332
|
+
lstatSync(dir);
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/** Remove a stale worktree dir / branch registration before re-creating. */
|
|
340
|
+
function clearStale(mirrorPath, dir, branch, env) {
|
|
341
|
+
forceClearWorktreePath(mirrorPath, dir, env);
|
|
286
342
|
pruneAndDropBranch(mirrorPath, branch, env);
|
|
287
343
|
}
|
|
288
344
|
/**
|
|
@@ -292,20 +348,7 @@ function clearStale(mirrorPath, dir, branch, env) {
|
|
|
292
348
|
* dir from a prior crashed attempt is still cleared so `worktree add` succeeds.
|
|
293
349
|
*/
|
|
294
350
|
function clearStaleWorktreeOnly(mirrorPath, dir, env) {
|
|
295
|
-
|
|
296
|
-
try {
|
|
297
|
-
git(['worktree', 'remove', '--force', dir], mirrorPath, { env });
|
|
298
|
-
}
|
|
299
|
-
catch {
|
|
300
|
-
// fall through to prune below
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
try {
|
|
304
|
-
git(['worktree', 'prune'], mirrorPath, { env });
|
|
305
|
-
}
|
|
306
|
-
catch {
|
|
307
|
-
// best-effort
|
|
308
|
-
}
|
|
351
|
+
forceClearWorktreePath(mirrorPath, dir, env);
|
|
309
352
|
}
|
|
310
353
|
/** Prune dangling worktree registrations + delete the work branch if present. */
|
|
311
354
|
function pruneAndDropBranch(mirrorPath, branch, env) {
|