@momentiq/dark-factory-cli 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -38
- package/dist/adapters/codex-sdk.d.ts +66 -0
- package/dist/adapters/codex-sdk.d.ts.map +1 -1
- package/dist/adapters/codex-sdk.js +321 -4
- package/dist/adapters/codex-sdk.js.map +1 -1
- package/dist/adapters/critic-result-schema.d.ts +5 -0
- package/dist/adapters/critic-result-schema.d.ts.map +1 -1
- package/dist/adapters/critic-result-schema.js +10 -0
- package/dist/adapters/critic-result-schema.js.map +1 -1
- package/dist/adapters/cursor-cli.d.ts +19 -1
- package/dist/adapters/cursor-cli.d.ts.map +1 -1
- package/dist/adapters/cursor-cli.js +96 -14
- package/dist/adapters/cursor-cli.js.map +1 -1
- package/dist/branch-protection/spec-default.yaml +2 -2
- package/dist/cli.js +127 -81
- package/dist/cli.js.map +1 -1
- package/dist/commands/show.d.ts +11 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +78 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +85 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/compact/index.d.ts +2 -0
- package/dist/compact/index.d.ts.map +1 -0
- package/dist/compact/index.js +3 -0
- package/dist/compact/index.js.map +1 -0
- package/dist/compact/lockfile.d.ts +53 -0
- package/dist/compact/lockfile.d.ts.map +1 -0
- package/dist/compact/lockfile.js +626 -0
- package/dist/compact/lockfile.js.map +1 -0
- package/dist/cycle-doc-validator/validate_cycle_doc.py +39 -9
- package/dist/doctor.d.ts +34 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +390 -1
- package/dist/doctor.js.map +1 -1
- package/dist/handoff/handoff-verb.d.ts.map +1 -1
- package/dist/handoff/handoff-verb.js +6 -3
- package/dist/handoff/handoff-verb.js.map +1 -1
- package/dist/handoff/ports.d.ts +8 -0
- package/dist/handoff/ports.d.ts.map +1 -1
- package/dist/handoff/real-clients.js +1 -1
- package/dist/handoff/real-clients.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/show-status-core.d.ts +63 -0
- package/dist/lib/show-status-core.d.ts.map +1 -0
- package/dist/lib/show-status-core.js +156 -0
- package/dist/lib/show-status-core.js.map +1 -0
- package/dist/mcp/prompts.d.ts.map +1 -1
- package/dist/mcp/prompts.js +113 -78
- package/dist/mcp/prompts.js.map +1 -1
- package/dist/mcp/resources.js +1 -1
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/tools/findings.d.ts +0 -22
- package/dist/mcp/tools/findings.d.ts.map +1 -1
- package/dist/mcp/tools/findings.js +5 -73
- package/dist/mcp/tools/findings.js.map +1 -1
- package/dist/mcp/tools/handoff.d.ts.map +1 -1
- package/dist/mcp/tools/handoff.js +10 -17
- package/dist/mcp/tools/handoff.js.map +1 -1
- package/dist/mcp/tools/review-bypass.d.ts.map +1 -1
- package/dist/mcp/tools/review-bypass.js +1 -1
- package/dist/mcp/tools/review-bypass.js.map +1 -1
- package/dist/policy/baseline.d.ts.map +1 -1
- package/dist/policy/baseline.js +11 -3
- package/dist/policy/baseline.js.map +1 -1
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +18 -3
- package/dist/prompt.js.map +1 -1
- package/dist/report.d.ts +24 -0
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +85 -0
- package/dist/report.js.map +1 -1
- package/dist/runner.d.ts +4 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +127 -2
- package/dist/runner.js.map +1 -1
- package/dist/trusted-surface/rebind.d.ts.map +1 -1
- package/dist/trusted-surface/rebind.js +185 -1
- package/dist/trusted-surface/rebind.js.map +1 -1
- package/package.json +6 -2
|
@@ -41,9 +41,14 @@ aligned with CONTRIBUTING.md "Trailers" section):
|
|
|
41
41
|
1. **Type detection.** Plan PR if title starts with ``docs(roadmap):``
|
|
42
42
|
or ``docs(<cycle>):``, OR PR has label ``plan-pr``, AND every
|
|
43
43
|
changed path is under ``docs/`` (or is the repo-root ``AGENTS.md``
|
|
44
|
-
/ ``CLAUDE.md``)
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
/ ``CLAUDE.md``), AND at least one changed file is itself a cycle
|
|
45
|
+
doc matching ``docs/roadmap/cycles/cycle*.md``. The "docs only"
|
|
46
|
+
check is broader than just cycle-doc paths so a plan PR can include
|
|
47
|
+
supporting ADR / engineering docs in the same change without being
|
|
48
|
+
misclassified as a code PR. The "at least one cycle doc" check
|
|
49
|
+
(issue #25) prevents routine roadmap-index refreshes
|
|
50
|
+
(``docs/roadmap/roadmap-overview.md``, ``docs/roadmap/dark-factory-
|
|
51
|
+
roadmap.md``) from being forced through the full plan-PR contract.
|
|
47
52
|
Otherwise code PR.
|
|
48
53
|
|
|
49
54
|
2. **Bot/automation exemption.** PRs with any of the labels
|
|
@@ -651,6 +656,21 @@ def _parse_paginated_commit_messages(raw: str) -> str:
|
|
|
651
656
|
return "\n\n".join(_parse_paginated_commits_to_list(raw))
|
|
652
657
|
|
|
653
658
|
|
|
659
|
+
def _is_cycle_doc_path(path: str) -> bool:
|
|
660
|
+
"""Match ``docs/roadmap/cycles/cycle<id>(-<slug>)?.md``.
|
|
661
|
+
|
|
662
|
+
The classifier counts only files whose basename starts with
|
|
663
|
+
``cycle`` followed by an id character. Sibling files like
|
|
664
|
+
``docs/roadmap/cycles/README.md`` are index/meta content and do
|
|
665
|
+
NOT trigger the plan-PR contract.
|
|
666
|
+
"""
|
|
667
|
+
prefix = "docs/roadmap/cycles/cycle"
|
|
668
|
+
if not path.startswith(prefix) or not path.endswith(".md"):
|
|
669
|
+
return False
|
|
670
|
+
next_char = path[len(prefix) : len(prefix) + 1]
|
|
671
|
+
return next_char.isdigit()
|
|
672
|
+
|
|
673
|
+
|
|
654
674
|
def is_plan_pr(
|
|
655
675
|
title: str,
|
|
656
676
|
labels: Iterable[str],
|
|
@@ -658,13 +678,22 @@ def is_plan_pr(
|
|
|
658
678
|
) -> bool:
|
|
659
679
|
"""Plan PR detection per Component 2 rule 1.
|
|
660
680
|
|
|
661
|
-
A PR is a plan PR if
|
|
681
|
+
A PR is a plan PR if ALL three conditions hold:
|
|
662
682
|
- title matches ``docs(roadmap):`` OR ``docs(<cycle>):``,
|
|
663
683
|
OR the PR has the label ``plan-pr``;
|
|
664
|
-
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
684
|
+
- every changed file is under ``docs/`` (no code paths) — a plan
|
|
685
|
+
PR may include supporting docs (ADR, engineering doc) in the
|
|
686
|
+
same change, so we accept the broader ``docs/`` prefix here;
|
|
687
|
+
- AND at least one changed file is itself a cycle doc matching
|
|
688
|
+
``docs/roadmap/cycles/cycle*.md``.
|
|
689
|
+
|
|
690
|
+
The third condition narrows what used to be a too-broad classifier
|
|
691
|
+
(issue #25): editing only ``docs/roadmap/dark-factory-roadmap.md``
|
|
692
|
+
or ``docs/roadmap/roadmap-overview.md`` is a routine index refresh,
|
|
693
|
+
not a plan PR — forcing the full plan-PR trailer contract on those
|
|
694
|
+
edits required manufacturing throwaway cycle docs + tracking
|
|
695
|
+
issues. The plan-PR contract now fires only when the diff actually
|
|
696
|
+
creates or updates a cycle doc.
|
|
668
697
|
"""
|
|
669
698
|
label_match = any(label.strip().lower() == "plan-pr" for label in labels)
|
|
670
699
|
title_match = bool(PLAN_TITLE_RE.match(title or ""))
|
|
@@ -672,7 +701,8 @@ def is_plan_pr(
|
|
|
672
701
|
if not files:
|
|
673
702
|
return False
|
|
674
703
|
docs_only = all(p.startswith("docs/") or p == "AGENTS.md" or p == "CLAUDE.md" for p in files)
|
|
675
|
-
|
|
704
|
+
cycle_doc_in_diff = any(_is_cycle_doc_path(p) for p in files)
|
|
705
|
+
return (label_match or title_match) and docs_only and cycle_doc_in_diff
|
|
676
706
|
|
|
677
707
|
|
|
678
708
|
def status_completion_in_diff(diff: str) -> list[str]:
|
package/dist/doctor.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AdapterRegistry } from "./adapters/critic.js";
|
|
2
2
|
import type { LoadedConfig } from "./policy/config.js";
|
|
3
3
|
import type { BootstrapResult } from "./doppler-bootstrap.js";
|
|
4
|
-
import type { DoctorCheck } from "@momentiq/dark-factory-schemas";
|
|
4
|
+
import type { AgentReviewConfig, DoctorCheck } from "@momentiq/dark-factory-schemas";
|
|
5
5
|
export interface DoctorOptions {
|
|
6
6
|
loaded: LoadedConfig;
|
|
7
7
|
registry: AdapterRegistry;
|
|
@@ -9,4 +9,37 @@ export interface DoctorOptions {
|
|
|
9
9
|
profileName?: string;
|
|
10
10
|
}
|
|
11
11
|
export declare function runDoctor(options: DoctorOptions): Promise<DoctorCheck[]>;
|
|
12
|
+
export type DoctorTriageState = "config_missing" | "auth_pending" | "ok";
|
|
13
|
+
export interface ClassifyDoctorStateOptions {
|
|
14
|
+
config: AgentReviewConfig;
|
|
15
|
+
/**
|
|
16
|
+
* The resolved profile name the CLI used. `undefined` means the
|
|
17
|
+
* caller invoked `df doctor` without `--profile` AND no
|
|
18
|
+
* `AGENT_REVIEW_PROFILE` was set — only meaningful in back-compat
|
|
19
|
+
* configs that have no `profiles` map at all.
|
|
20
|
+
*/
|
|
21
|
+
profileName: string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* The per-check DoctorCheck array `runDoctor` returns. The
|
|
24
|
+
* classifier inspects only the per-critic auth checks
|
|
25
|
+
* (`<criticId>.<probe>` names) — base-infra checks are intentionally
|
|
26
|
+
* ignored so a missing node binary doesn't masquerade as a
|
|
27
|
+
* subscription-auth failure.
|
|
28
|
+
*/
|
|
29
|
+
perCriticChecks: readonly DoctorCheck[];
|
|
30
|
+
}
|
|
31
|
+
export interface DoctorTriageResult {
|
|
32
|
+
state: DoctorTriageState;
|
|
33
|
+
/**
|
|
34
|
+
* Single-line headline (no embedded newlines). Format: `[<TAG>] ...`
|
|
35
|
+
* where TAG is one of `CONFIG`, `AUTH`, `OK`. The bracketed prefix
|
|
36
|
+
* makes the line greppable AND distinguishes it from the per-check
|
|
37
|
+
* `[OK]/[INFO]/[FAIL]` lines `cmdDoctor` emits underneath.
|
|
38
|
+
*/
|
|
39
|
+
line: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function classifyDoctorState(options: ClassifyDoctorStateOptions): DoctorTriageResult;
|
|
42
|
+
export declare function sweepOrphanLocks(artifactDir: string): DoctorCheck;
|
|
43
|
+
export declare const CACHE_TREE_CORRUPTION_REGEX: RegExp;
|
|
44
|
+
export declare function probeCacheTree(repoRoot: string): Promise<DoctorCheck>;
|
|
12
45
|
//# sourceMappingURL=doctor.d.ts.map
|
package/dist/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACZ,MAAM,gCAAgC,CAAC;AAIxC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,eAAe,CAAC;IAK1B,SAAS,CAAC,EAAE,eAAe,CAAC;IAO5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAoJ9E;AAkND,MAAM,MAAM,iBAAiB,GACzB,gBAAgB,GAChB,cAAc,GACd,IAAI,CAAC;AAET,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;;;;OAKG;IACH,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC;;;;;;OAMG;IACH,eAAe,EAAE,SAAS,WAAW,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,iBAAiB,CAAC;IACzB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,0BAA0B,GAClC,kBAAkB,CAiDpB;AA0BD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAwDjE;AAoED,eAAO,MAAM,2BAA2B,QACQ,CAAC;AA8GjD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA6F3E"}
|
package/dist/doctor.js
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
// `subscription` / `api` was pinned by the profile and reports
|
|
28
28
|
// pass/fail accordingly.
|
|
29
29
|
import { spawn } from "node:child_process";
|
|
30
|
-
import { accessSync, constants, existsSync, mkdirSync } from "node:fs";
|
|
30
|
+
import { accessSync, constants, existsSync, mkdirSync, readFileSync, readdirSync, unlinkSync, } from "node:fs";
|
|
31
31
|
import { resolve } from "node:path";
|
|
32
32
|
import { gitCommonDir, gitDir } from "./git.js";
|
|
33
33
|
import { applyProfileAuth, resolveProfileWithConfig, } from "./policy/profile.js";
|
|
@@ -101,6 +101,16 @@ export async function runDoctor(options) {
|
|
|
101
101
|
? {}
|
|
102
102
|
: { remediation: `mkdir -p ${artifactDir} and ensure write permission` }),
|
|
103
103
|
});
|
|
104
|
+
// 5a. Issue #105 — orphan-lock sweep. Subagent processes killed mid-run
|
|
105
|
+
// leave behind `.git/agent-reviews/<sha>.lock` files that block every
|
|
106
|
+
// subsequent `df review` for that SHA. Walk the dir, parse each
|
|
107
|
+
// lock's PID, and remove locks whose recorded PID is dead.
|
|
108
|
+
checks.push(sweepOrphanLocks(artifactDir));
|
|
109
|
+
// 5b. Cache-tree corruption probe (issue #107). Detects the
|
|
110
|
+
// index-cache-tree-references-missing-object state a killed-mid-write
|
|
111
|
+
// `git commit` leaves the worktree in. Detect-only — the recovery
|
|
112
|
+
// (`git read-tree HEAD`) is destructive and stays operator-driven.
|
|
113
|
+
checks.push(await probeCacheTree(root));
|
|
104
114
|
// 6. Doppler bootstrap visibility (when caller supplied a BootstrapResult).
|
|
105
115
|
// For the OSS doctor, this is informational — a `no-bootstrap-file` status
|
|
106
116
|
// is perfectly fine when the user exports tokens directly in their shell.
|
|
@@ -326,4 +336,383 @@ function canCreateDir(path) {
|
|
|
326
336
|
return false;
|
|
327
337
|
}
|
|
328
338
|
}
|
|
339
|
+
export function classifyDoctorState(options) {
|
|
340
|
+
const { config, profileName, perCriticChecks } = options;
|
|
341
|
+
// (1) config_missing — checked FIRST. A missing profiles block (or a
|
|
342
|
+
// typo'd profile name) is the most actionable diagnosis; the
|
|
343
|
+
// per-critic auth checks are moot until the profile is resolvable.
|
|
344
|
+
if (profileName !== undefined) {
|
|
345
|
+
if (!config.profiles) {
|
|
346
|
+
return {
|
|
347
|
+
state: "config_missing",
|
|
348
|
+
line: `[CONFIG] config_missing: .agent-review/config.json has no 'profiles' block (requested profile: "${profileName}"). Add a 'profiles' map; mirror sage3c's pattern.`,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
if (!config.profiles[profileName]) {
|
|
352
|
+
const available = Object.keys(config.profiles);
|
|
353
|
+
const availableStr = available.length > 0 ? available.join(", ") : "(none)";
|
|
354
|
+
return {
|
|
355
|
+
state: "config_missing",
|
|
356
|
+
line: `[CONFIG] config_missing: profile "${profileName}" not found in .agent-review/config.json profiles map (available: ${availableStr}).`,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// (2) auth_pending — config + profile both resolved. Walk the
|
|
361
|
+
// per-critic checks: a failing check whose name starts with
|
|
362
|
+
// `<criticId>.` AND is not flagged `optional: true` means a REQUIRED
|
|
363
|
+
// critic's auth/credentials probe failed.
|
|
364
|
+
const failingCriticAuth = perCriticChecks.filter((c) => {
|
|
365
|
+
if (c.passed)
|
|
366
|
+
return false;
|
|
367
|
+
if (c.optional)
|
|
368
|
+
return false;
|
|
369
|
+
return isCriticAuthCheckName(c.name);
|
|
370
|
+
});
|
|
371
|
+
if (failingCriticAuth.length > 0) {
|
|
372
|
+
const criticIds = uniq(failingCriticAuth.map((c) => c.name.split(".")[0] ?? c.name));
|
|
373
|
+
return {
|
|
374
|
+
state: "auth_pending",
|
|
375
|
+
line: `[AUTH] auth_pending: config OK but workstation auth pending for ${criticIds.join(", ")} — run \`df doctor --profile <name>\` for per-critic remediation.`,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
// (3) ok — everything passed. Surface a clear all-clear line so an
|
|
379
|
+
// operator who runs `df doctor` after fixing the failure sees an
|
|
380
|
+
// explicit success signal.
|
|
381
|
+
return {
|
|
382
|
+
state: "ok",
|
|
383
|
+
line: `[OK] config + auth both OK${profileName !== undefined ? ` (profile: "${profileName}")` : ""}.`,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
function isCriticAuthCheckName(name) {
|
|
387
|
+
// `runDoctor` namespaces per-critic checks as `<criticId>.<probe>`.
|
|
388
|
+
// Base-infra checks (`node_version`, `hook_post-commit`,
|
|
389
|
+
// `artifact_dir_writable`, `doppler_*`, `git_core_hookspath`) have
|
|
390
|
+
// no `.` in the first half of the name. Treat any name containing
|
|
391
|
+
// a `.` as a per-critic check.
|
|
392
|
+
return name.includes(".");
|
|
393
|
+
}
|
|
394
|
+
function uniq(values) {
|
|
395
|
+
return Array.from(new Set(values));
|
|
396
|
+
}
|
|
397
|
+
// ---------------------------------------------------------------------------
|
|
398
|
+
// Issue #105 — orphan-lock sweep.
|
|
399
|
+
//
|
|
400
|
+
// `df review` writes `.git/agent-reviews/<sha>.lock` containing its PID
|
|
401
|
+
// + an ISO timestamp. When the process is killed mid-run (SIGKILL, OOM,
|
|
402
|
+
// container teardown) the lock orphans and blocks every subsequent
|
|
403
|
+
// review of that SHA. `sweepOrphanLocks` walks the artifact dir, parses
|
|
404
|
+
// each lock's first line as a PID, and removes the lock when
|
|
405
|
+
// `process.kill(pid, 0)` reports ESRCH (no such process).
|
|
406
|
+
// ---------------------------------------------------------------------------
|
|
407
|
+
export function sweepOrphanLocks(artifactDir) {
|
|
408
|
+
if (!existsSync(artifactDir)) {
|
|
409
|
+
return {
|
|
410
|
+
name: "orphan_lock_sweep",
|
|
411
|
+
passed: true,
|
|
412
|
+
detail: `artifact dir not present at ${artifactDir} — no orphan locks to sweep`,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
let entries;
|
|
416
|
+
try {
|
|
417
|
+
entries = readdirSync(artifactDir);
|
|
418
|
+
}
|
|
419
|
+
catch (err) {
|
|
420
|
+
return {
|
|
421
|
+
name: "orphan_lock_sweep",
|
|
422
|
+
passed: false,
|
|
423
|
+
detail: `failed to enumerate ${artifactDir}: ${err.message}`,
|
|
424
|
+
remediation: `verify ${artifactDir} is readable`,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
const removed = [];
|
|
428
|
+
for (const entry of entries) {
|
|
429
|
+
if (!entry.endsWith(".lock"))
|
|
430
|
+
continue;
|
|
431
|
+
const path = resolve(artifactDir, entry);
|
|
432
|
+
const parsed = readLockPid(path);
|
|
433
|
+
if (parsed.pid === null) {
|
|
434
|
+
try {
|
|
435
|
+
unlinkSync(path);
|
|
436
|
+
removed.push({ name: entry, pid: null, reason: parsed.reason });
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
// best-effort; a racing process may have removed it already
|
|
440
|
+
}
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
if (isPidAlive(parsed.pid))
|
|
444
|
+
continue;
|
|
445
|
+
try {
|
|
446
|
+
unlinkSync(path);
|
|
447
|
+
removed.push({ name: entry, pid: parsed.pid, reason: "dead PID" });
|
|
448
|
+
}
|
|
449
|
+
catch {
|
|
450
|
+
// best-effort
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
if (removed.length === 0) {
|
|
454
|
+
return {
|
|
455
|
+
name: "orphan_lock_sweep",
|
|
456
|
+
passed: true,
|
|
457
|
+
detail: `no orphan locks under ${artifactDir}`,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
const summary = removed
|
|
461
|
+
.map((r) => `${r.name} (pid=${r.pid ?? "unreadable"}: ${r.reason})`)
|
|
462
|
+
.join(", ");
|
|
463
|
+
return {
|
|
464
|
+
name: "orphan_lock_sweep",
|
|
465
|
+
passed: true,
|
|
466
|
+
detail: `${removed.length} orphan lock(s) removed under ${artifactDir}: ${summary}`,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
function readLockPid(path) {
|
|
470
|
+
let contents;
|
|
471
|
+
try {
|
|
472
|
+
contents = readFileSync(path, "utf8");
|
|
473
|
+
}
|
|
474
|
+
catch (err) {
|
|
475
|
+
return { pid: null, reason: `read failed: ${err.message}` };
|
|
476
|
+
}
|
|
477
|
+
const firstLine = contents.split("\n")[0]?.trim() ?? "";
|
|
478
|
+
if (firstLine === "") {
|
|
479
|
+
return { pid: null, reason: "empty lock file" };
|
|
480
|
+
}
|
|
481
|
+
const n = Number(firstLine);
|
|
482
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
483
|
+
return { pid: null, reason: `unparseable PID "${firstLine}"` };
|
|
484
|
+
}
|
|
485
|
+
return { pid: n, reason: "" };
|
|
486
|
+
}
|
|
487
|
+
function isPidAlive(pid) {
|
|
488
|
+
try {
|
|
489
|
+
process.kill(pid, 0);
|
|
490
|
+
return true;
|
|
491
|
+
}
|
|
492
|
+
catch (err) {
|
|
493
|
+
const e = err;
|
|
494
|
+
// EPERM means the process exists but we lack permission to signal it
|
|
495
|
+
// → still alive from a lock-ownership perspective. ESRCH means no
|
|
496
|
+
// such process → orphan. Any other code: treat as alive to err on
|
|
497
|
+
// the side of NOT removing a possibly-live lock.
|
|
498
|
+
if (e.code === "ESRCH")
|
|
499
|
+
return false;
|
|
500
|
+
return true;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
// ---------------------------------------------------------------------------
|
|
504
|
+
// Issue #107 — cache-tree corruption probe.
|
|
505
|
+
//
|
|
506
|
+
// Detects the specific corruption shape `dark-factory-platform#170`
|
|
507
|
+
// reproduced: the index's cache-tree references an object (tree or
|
|
508
|
+
// blob) that doesn't exist in `.git/objects/`. This is the state a
|
|
509
|
+
// killed-mid-write `git commit` leaves the worktree in — the cache-tree
|
|
510
|
+
// has been updated to reference the new tree SHA, but the tree object
|
|
511
|
+
// itself was never finalised before the process was killed.
|
|
512
|
+
//
|
|
513
|
+
// Probe shape: `git fsck --no-dangling` with LC_ALL=C / LANG=C, a
|
|
514
|
+
// bounded buffer and a timeout. When the cache-tree is dangling, fsck
|
|
515
|
+
// emits a line containing `invalid sha1 pointer in cache-tree`
|
|
516
|
+
// (git 2.39.x short form) or `invalid sha1 pointer in cache-tree of
|
|
517
|
+
// <path>` (git 2.50.x long form) — the regex accepts both. Adjacent
|
|
518
|
+
// bad-repo states (broken HEAD ref, missing blob NOT in cache-tree,
|
|
519
|
+
// dangling orphan objects) emit different error messages, so the
|
|
520
|
+
// probe is specific without being noisy.
|
|
521
|
+
//
|
|
522
|
+
// Detect-only: the recovery (`git read-tree HEAD`) discards staged
|
|
523
|
+
// work. The operator must decide whether to preserve the staged
|
|
524
|
+
// changes (re-add them after `read-tree`) or accept the loss. The
|
|
525
|
+
// probe surfaces the diagnosis + remediation hint and nothing more.
|
|
526
|
+
//
|
|
527
|
+
// Async: `git fsck` walks the entire object database and can take
|
|
528
|
+
// seconds-to-minutes on large repos. The probe is `async` so it
|
|
529
|
+
// doesn't freeze `runDoctor`'s overall event loop.
|
|
530
|
+
// ---------------------------------------------------------------------------
|
|
531
|
+
// Accept BOTH the git-2.39.x short form ("invalid sha1 pointer in
|
|
532
|
+
// cache-tree" with a word boundary) AND the git-2.50.x long form
|
|
533
|
+
// (suffixed with " of <path>"). Earlier revisions required the
|
|
534
|
+
// trailing " of", which silently fail-passed on git 2.39 (Debian 12).
|
|
535
|
+
export const CACHE_TREE_CORRUPTION_REGEX = /invalid sha1 pointer in cache-tree(?:\b| of)/;
|
|
536
|
+
const RECOVERY_REMEDIATION = "Run `git read-tree HEAD` in the affected worktree to rebuild the index from HEAD's tree — WARNING: this discards any staged changes; re-add them after recovery if needed.";
|
|
537
|
+
// 50 MB stdout/stderr ceiling. Real cache-tree-corruption stderr is
|
|
538
|
+
// O(KB); the ceiling exists to bound runaway fsck output on
|
|
539
|
+
// pathological repos. ENOBUFS-shape overflow is treated as
|
|
540
|
+
// non-passing, NOT silent pass.
|
|
541
|
+
const FSCK_BUFFER_BYTES = 50 * 1024 * 1024;
|
|
542
|
+
// 30 s wall-clock ceiling. fsck on huge repos can run for minutes; the
|
|
543
|
+
// probe is a doctor check, so we'd rather report indeterminate than
|
|
544
|
+
// hold up the rest of the doctor run forever. Overridable via
|
|
545
|
+
// `DF_CACHE_TREE_PROBE_TIMEOUT_MS` for testing the timeout path
|
|
546
|
+
// without making test suites wait 30s.
|
|
547
|
+
function fsckTimeoutMs() {
|
|
548
|
+
const env = process.env["DF_CACHE_TREE_PROBE_TIMEOUT_MS"];
|
|
549
|
+
if (env !== undefined) {
|
|
550
|
+
const n = Number(env);
|
|
551
|
+
if (Number.isFinite(n) && n > 0)
|
|
552
|
+
return n;
|
|
553
|
+
}
|
|
554
|
+
return 30_000;
|
|
555
|
+
}
|
|
556
|
+
function runGitFsck(repoRoot) {
|
|
557
|
+
return new Promise((resolvePromise) => {
|
|
558
|
+
let settled = false;
|
|
559
|
+
const settle = (r) => {
|
|
560
|
+
if (settled)
|
|
561
|
+
return;
|
|
562
|
+
settled = true;
|
|
563
|
+
resolvePromise(r);
|
|
564
|
+
};
|
|
565
|
+
let child;
|
|
566
|
+
try {
|
|
567
|
+
child = spawn("git", ["fsck", "--no-dangling"], {
|
|
568
|
+
cwd: repoRoot,
|
|
569
|
+
env: { ...process.env, LC_ALL: "C", LANG: "C" },
|
|
570
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
catch (err) {
|
|
574
|
+
settle({
|
|
575
|
+
stdout: "",
|
|
576
|
+
stderr: "",
|
|
577
|
+
code: null,
|
|
578
|
+
signal: null,
|
|
579
|
+
spawnError: err,
|
|
580
|
+
overflowed: false,
|
|
581
|
+
timedOut: false,
|
|
582
|
+
});
|
|
583
|
+
return;
|
|
584
|
+
}
|
|
585
|
+
let stdout = "";
|
|
586
|
+
let stderr = "";
|
|
587
|
+
let total = 0;
|
|
588
|
+
let overflowed = false;
|
|
589
|
+
const onData = (which) => (c) => {
|
|
590
|
+
total += c.length;
|
|
591
|
+
if (total > FSCK_BUFFER_BYTES) {
|
|
592
|
+
if (!overflowed) {
|
|
593
|
+
overflowed = true;
|
|
594
|
+
child.kill("SIGKILL");
|
|
595
|
+
}
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
if (which === "stdout")
|
|
599
|
+
stdout += c.toString("utf8");
|
|
600
|
+
else
|
|
601
|
+
stderr += c.toString("utf8");
|
|
602
|
+
};
|
|
603
|
+
child.stdout?.on("data", onData("stdout"));
|
|
604
|
+
child.stderr?.on("data", onData("stderr"));
|
|
605
|
+
let timedOut = false;
|
|
606
|
+
const timer = setTimeout(() => {
|
|
607
|
+
timedOut = true;
|
|
608
|
+
child.kill("SIGKILL");
|
|
609
|
+
}, fsckTimeoutMs());
|
|
610
|
+
child.on("error", (err) => {
|
|
611
|
+
clearTimeout(timer);
|
|
612
|
+
settle({
|
|
613
|
+
stdout,
|
|
614
|
+
stderr,
|
|
615
|
+
code: null,
|
|
616
|
+
signal: null,
|
|
617
|
+
spawnError: err,
|
|
618
|
+
overflowed,
|
|
619
|
+
timedOut,
|
|
620
|
+
});
|
|
621
|
+
});
|
|
622
|
+
child.on("close", (code, signal) => {
|
|
623
|
+
clearTimeout(timer);
|
|
624
|
+
settle({
|
|
625
|
+
stdout,
|
|
626
|
+
stderr,
|
|
627
|
+
code,
|
|
628
|
+
signal,
|
|
629
|
+
overflowed,
|
|
630
|
+
timedOut,
|
|
631
|
+
});
|
|
632
|
+
});
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
export async function probeCacheTree(repoRoot) {
|
|
636
|
+
if (!existsSync(resolve(repoRoot, ".git"))) {
|
|
637
|
+
// `df doctor`'s base-infra checks already cover the
|
|
638
|
+
// "not-a-git-repo" case (artifact_dir_writable + git_core_hookspath
|
|
639
|
+
// both fail). Surface this informationally so the probe doesn't
|
|
640
|
+
// throw / fail-closed on the wrong condition.
|
|
641
|
+
return {
|
|
642
|
+
name: "cache_tree_probe",
|
|
643
|
+
passed: true,
|
|
644
|
+
detail: `${repoRoot} is not a git working tree — cache-tree probe skipped`,
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
const result = await runGitFsck(repoRoot);
|
|
648
|
+
const combined = `${result.stdout}\n${result.stderr}`;
|
|
649
|
+
// Inspect captured output for the corruption signature FIRST. A
|
|
650
|
+
// realistic mid-corruption fsck both prints the signature AND exits
|
|
651
|
+
// non-zero — handle the diagnostic path before the generic
|
|
652
|
+
// error-reporting paths so the operator sees the actionable line.
|
|
653
|
+
if (CACHE_TREE_CORRUPTION_REGEX.test(combined)) {
|
|
654
|
+
const matches = combined.matchAll(/([0-9a-f]{40}): invalid sha1 pointer in cache-tree(?: of (\S+))?/g);
|
|
655
|
+
const offenders = Array.from(matches).map((m) => ({
|
|
656
|
+
sha: m[1] ?? "(unknown)",
|
|
657
|
+
indexPath: m[2] ?? "(unknown)",
|
|
658
|
+
}));
|
|
659
|
+
const detail = offenders.length > 0
|
|
660
|
+
? `cache-tree references missing object${offenders.length > 1 ? "s" : ""}: ${offenders
|
|
661
|
+
.map((o) => `${o.sha} in ${o.indexPath}`)
|
|
662
|
+
.join("; ")}`
|
|
663
|
+
: `git fsck reported cache-tree corruption: ${combined.trim()}`;
|
|
664
|
+
return {
|
|
665
|
+
name: "cache_tree_probe",
|
|
666
|
+
passed: false,
|
|
667
|
+
detail,
|
|
668
|
+
remediation: RECOVERY_REMEDIATION,
|
|
669
|
+
};
|
|
670
|
+
}
|
|
671
|
+
if (result.overflowed) {
|
|
672
|
+
return {
|
|
673
|
+
name: "cache_tree_probe",
|
|
674
|
+
passed: false,
|
|
675
|
+
detail: `git fsck output exceeded ${FSCK_BUFFER_BYTES} bytes — cannot determine cache-tree state; output was truncated.`,
|
|
676
|
+
remediation: "investigate the repo's object database manually (`git fsck --no-dangling 2>&1 | head -50`); cache-tree probe is inconclusive at this output volume",
|
|
677
|
+
};
|
|
678
|
+
}
|
|
679
|
+
if (result.timedOut) {
|
|
680
|
+
return {
|
|
681
|
+
name: "cache_tree_probe",
|
|
682
|
+
passed: false,
|
|
683
|
+
detail: `git fsck exceeded ${fsckTimeoutMs()}ms — cache-tree state indeterminate`,
|
|
684
|
+
remediation: "run `git fsck --no-dangling` manually; the probe times out on very large repos",
|
|
685
|
+
};
|
|
686
|
+
}
|
|
687
|
+
if (result.spawnError) {
|
|
688
|
+
// ENOENT (git not on PATH) is genuinely informational — the rest of
|
|
689
|
+
// `df doctor` (which all shells out to git) will surface that
|
|
690
|
+
// diagnostic loudly. Don't double-report. Other spawn errors
|
|
691
|
+
// (EACCES, etc.) ARE surfaced because they indicate environment
|
|
692
|
+
// problems the operator should know about.
|
|
693
|
+
if (result.spawnError.code === "ENOENT") {
|
|
694
|
+
return {
|
|
695
|
+
name: "cache_tree_probe",
|
|
696
|
+
passed: true,
|
|
697
|
+
detail: `git fsck not runnable in ${repoRoot}: ${result.spawnError.message}`,
|
|
698
|
+
};
|
|
699
|
+
}
|
|
700
|
+
return {
|
|
701
|
+
name: "cache_tree_probe",
|
|
702
|
+
passed: false,
|
|
703
|
+
detail: `git fsck failed to spawn in ${repoRoot}: ${result.spawnError.message}`,
|
|
704
|
+
remediation: "verify the git binary is installed, on PATH, and executable from the repository working directory",
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
// No corruption signature, no overflow, no spawn error. A non-zero
|
|
708
|
+
// fsck exit (broken ref, missing blob NOT in cache-tree, etc.) is
|
|
709
|
+
// out-of-scope for THIS probe — `df doctor` covers ref/object
|
|
710
|
+
// integrity via other surfaces. The cache-tree-specific answer
|
|
711
|
+
// here is "no cache-tree corruption observed".
|
|
712
|
+
return {
|
|
713
|
+
name: "cache_tree_probe",
|
|
714
|
+
passed: true,
|
|
715
|
+
detail: `git fsck reports no cache-tree corruption in ${repoRoot}`,
|
|
716
|
+
};
|
|
717
|
+
}
|
|
329
718
|
//# sourceMappingURL=doctor.js.map
|
package/dist/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff-verb.d.ts","sourceRoot":"","sources":["../../src/handoff/handoff-verb.ts"],"names":[],"mappings":"AAqDA,OAAO,EAAgB,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AASrF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAyGD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"handoff-verb.d.ts","sourceRoot":"","sources":["../../src/handoff/handoff-verb.ts"],"names":[],"mappings":"AAqDA,OAAO,EAAgB,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AASrF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAyGD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAyW3B"}
|
|
@@ -441,9 +441,12 @@ export async function runHandoff(opts) {
|
|
|
441
441
|
logs.push(`updated handoff issue #${issueNum}`);
|
|
442
442
|
return {
|
|
443
443
|
issueNumber: issueNum,
|
|
444
|
-
//
|
|
445
|
-
//
|
|
446
|
-
|
|
444
|
+
// Parity with the CREATE branch (which returns `created.url`) — issue #73.
|
|
445
|
+
// `prePatch` already fetched the full IssueView for the race-safety drift
|
|
446
|
+
// check, so the html_url is in hand at zero extra cost. The fallback to
|
|
447
|
+
// the bash-style `#N` short form covers fakes that don't populate `url`
|
|
448
|
+
// (existing test fixtures); production gh always provides it.
|
|
449
|
+
noteUrl: prePatch.url ?? `#${issueNum}`,
|
|
447
450
|
created: false,
|
|
448
451
|
logs,
|
|
449
452
|
};
|