@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.
Files changed (85) hide show
  1. package/README.md +35 -38
  2. package/dist/adapters/codex-sdk.d.ts +66 -0
  3. package/dist/adapters/codex-sdk.d.ts.map +1 -1
  4. package/dist/adapters/codex-sdk.js +321 -4
  5. package/dist/adapters/codex-sdk.js.map +1 -1
  6. package/dist/adapters/critic-result-schema.d.ts +5 -0
  7. package/dist/adapters/critic-result-schema.d.ts.map +1 -1
  8. package/dist/adapters/critic-result-schema.js +10 -0
  9. package/dist/adapters/critic-result-schema.js.map +1 -1
  10. package/dist/adapters/cursor-cli.d.ts +19 -1
  11. package/dist/adapters/cursor-cli.d.ts.map +1 -1
  12. package/dist/adapters/cursor-cli.js +96 -14
  13. package/dist/adapters/cursor-cli.js.map +1 -1
  14. package/dist/branch-protection/spec-default.yaml +2 -2
  15. package/dist/cli.js +127 -81
  16. package/dist/cli.js.map +1 -1
  17. package/dist/commands/show.d.ts +11 -0
  18. package/dist/commands/show.d.ts.map +1 -0
  19. package/dist/commands/show.js +78 -0
  20. package/dist/commands/show.js.map +1 -0
  21. package/dist/commands/status.d.ts +6 -0
  22. package/dist/commands/status.d.ts.map +1 -0
  23. package/dist/commands/status.js +85 -0
  24. package/dist/commands/status.js.map +1 -0
  25. package/dist/compact/index.d.ts +2 -0
  26. package/dist/compact/index.d.ts.map +1 -0
  27. package/dist/compact/index.js +3 -0
  28. package/dist/compact/index.js.map +1 -0
  29. package/dist/compact/lockfile.d.ts +53 -0
  30. package/dist/compact/lockfile.d.ts.map +1 -0
  31. package/dist/compact/lockfile.js +626 -0
  32. package/dist/compact/lockfile.js.map +1 -0
  33. package/dist/cycle-doc-validator/validate_cycle_doc.py +39 -9
  34. package/dist/doctor.d.ts +34 -1
  35. package/dist/doctor.d.ts.map +1 -1
  36. package/dist/doctor.js +390 -1
  37. package/dist/doctor.js.map +1 -1
  38. package/dist/handoff/handoff-verb.d.ts.map +1 -1
  39. package/dist/handoff/handoff-verb.js +6 -3
  40. package/dist/handoff/handoff-verb.js.map +1 -1
  41. package/dist/handoff/ports.d.ts +8 -0
  42. package/dist/handoff/ports.d.ts.map +1 -1
  43. package/dist/handoff/real-clients.js +1 -1
  44. package/dist/handoff/real-clients.js.map +1 -1
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +4 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/lib/show-status-core.d.ts +63 -0
  50. package/dist/lib/show-status-core.d.ts.map +1 -0
  51. package/dist/lib/show-status-core.js +156 -0
  52. package/dist/lib/show-status-core.js.map +1 -0
  53. package/dist/mcp/prompts.d.ts.map +1 -1
  54. package/dist/mcp/prompts.js +113 -78
  55. package/dist/mcp/prompts.js.map +1 -1
  56. package/dist/mcp/resources.js +1 -1
  57. package/dist/mcp/resources.js.map +1 -1
  58. package/dist/mcp/tools/findings.d.ts +0 -22
  59. package/dist/mcp/tools/findings.d.ts.map +1 -1
  60. package/dist/mcp/tools/findings.js +5 -73
  61. package/dist/mcp/tools/findings.js.map +1 -1
  62. package/dist/mcp/tools/handoff.d.ts.map +1 -1
  63. package/dist/mcp/tools/handoff.js +10 -17
  64. package/dist/mcp/tools/handoff.js.map +1 -1
  65. package/dist/mcp/tools/review-bypass.d.ts.map +1 -1
  66. package/dist/mcp/tools/review-bypass.js +1 -1
  67. package/dist/mcp/tools/review-bypass.js.map +1 -1
  68. package/dist/policy/baseline.d.ts.map +1 -1
  69. package/dist/policy/baseline.js +11 -3
  70. package/dist/policy/baseline.js.map +1 -1
  71. package/dist/prompt.d.ts.map +1 -1
  72. package/dist/prompt.js +18 -3
  73. package/dist/prompt.js.map +1 -1
  74. package/dist/report.d.ts +24 -0
  75. package/dist/report.d.ts.map +1 -1
  76. package/dist/report.js +85 -0
  77. package/dist/report.js.map +1 -1
  78. package/dist/runner.d.ts +4 -0
  79. package/dist/runner.d.ts.map +1 -1
  80. package/dist/runner.js +127 -2
  81. package/dist/runner.js.map +1 -1
  82. package/dist/trusted-surface/rebind.d.ts.map +1 -1
  83. package/dist/trusted-surface/rebind.js +185 -1
  84. package/dist/trusted-surface/rebind.js.map +1 -1
  85. 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``). The "docs only" check is broader than just
45
- cycle-doc paths so a plan PR can include supporting ADR / engineering
46
- docs in the same change without being misclassified as a code PR.
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 BOTH conditions hold:
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
- - AND every changed file is under ``docs/`` (no code paths). We
665
- use the broader ``docs/`` rather than just cycle-doc paths so
666
- that a plan PR can add supporting docs (ADR, engineering doc)
667
- in the same change.
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
- return (label_match or title_match) and docs_only
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
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAiCA,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,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAIlE,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,CAwI9E"}
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
@@ -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,CAsW3B"}
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
- // We don't have the URL handy without an extra view; bash echoes
445
- // `#$ISSUE`. The CLI can format it as a repo-relative ref.
446
- noteUrl: `#${issueNum}`,
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
  };