@momentiq/dark-factory-cli 1.0.0 → 2.0.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 (159) hide show
  1. package/README.md +121 -40
  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 +15 -10
  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/adapters/index.d.ts +1 -0
  15. package/dist/adapters/index.d.ts.map +1 -1
  16. package/dist/adapters/index.js +7 -0
  17. package/dist/adapters/index.js.map +1 -1
  18. package/dist/adapters/static-schema-lint.d.ts +68 -0
  19. package/dist/adapters/static-schema-lint.d.ts.map +1 -0
  20. package/dist/adapters/static-schema-lint.js +813 -0
  21. package/dist/adapters/static-schema-lint.js.map +1 -0
  22. package/dist/branch-protection/spec-default.yaml +2 -2
  23. package/dist/cli.d.ts +17 -1
  24. package/dist/cli.d.ts.map +1 -1
  25. package/dist/cli.js +414 -113
  26. package/dist/cli.js.map +1 -1
  27. package/dist/commands/findings.d.ts +6 -0
  28. package/dist/commands/findings.d.ts.map +1 -0
  29. package/dist/commands/findings.js +196 -0
  30. package/dist/commands/findings.js.map +1 -0
  31. package/dist/commands/show.d.ts +11 -0
  32. package/dist/commands/show.d.ts.map +1 -0
  33. package/dist/commands/show.js +78 -0
  34. package/dist/commands/show.js.map +1 -0
  35. package/dist/commands/skills.d.ts +6 -0
  36. package/dist/commands/skills.d.ts.map +1 -0
  37. package/dist/commands/skills.js +248 -0
  38. package/dist/commands/skills.js.map +1 -0
  39. package/dist/commands/status.d.ts +6 -0
  40. package/dist/commands/status.d.ts.map +1 -0
  41. package/dist/commands/status.js +85 -0
  42. package/dist/commands/status.js.map +1 -0
  43. package/dist/compact/index.d.ts +2 -0
  44. package/dist/compact/index.d.ts.map +1 -0
  45. package/dist/compact/index.js +3 -0
  46. package/dist/compact/index.js.map +1 -0
  47. package/dist/compact/lockfile.d.ts +53 -0
  48. package/dist/compact/lockfile.d.ts.map +1 -0
  49. package/dist/compact/lockfile.js +626 -0
  50. package/dist/compact/lockfile.js.map +1 -0
  51. package/dist/cycle-doc-validator/validate_cycle_doc.py +39 -9
  52. package/dist/doctor.d.ts +51 -1
  53. package/dist/doctor.d.ts.map +1 -1
  54. package/dist/doctor.js +497 -1
  55. package/dist/doctor.js.map +1 -1
  56. package/dist/evidence/docker-build.d.ts +6 -0
  57. package/dist/evidence/docker-build.d.ts.map +1 -0
  58. package/dist/evidence/docker-build.js +199 -0
  59. package/dist/evidence/docker-build.js.map +1 -0
  60. package/dist/evidence/index.d.ts +1 -0
  61. package/dist/evidence/index.d.ts.map +1 -1
  62. package/dist/evidence/index.js +6 -0
  63. package/dist/evidence/index.js.map +1 -1
  64. package/dist/handoff/handoff-verb.d.ts.map +1 -1
  65. package/dist/handoff/handoff-verb.js +6 -3
  66. package/dist/handoff/handoff-verb.js.map +1 -1
  67. package/dist/handoff/ports.d.ts +8 -0
  68. package/dist/handoff/ports.d.ts.map +1 -1
  69. package/dist/handoff/real-clients.js +1 -1
  70. package/dist/handoff/real-clients.js.map +1 -1
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +8 -0
  74. package/dist/index.js.map +1 -1
  75. package/dist/lib/show-status-core.d.ts +63 -0
  76. package/dist/lib/show-status-core.d.ts.map +1 -0
  77. package/dist/lib/show-status-core.js +156 -0
  78. package/dist/lib/show-status-core.js.map +1 -0
  79. package/dist/mcp/prompts.d.ts.map +1 -1
  80. package/dist/mcp/prompts.js +113 -78
  81. package/dist/mcp/prompts.js.map +1 -1
  82. package/dist/mcp/resources.js +1 -1
  83. package/dist/mcp/resources.js.map +1 -1
  84. package/dist/mcp/server.d.ts.map +1 -1
  85. package/dist/mcp/server.js +2 -0
  86. package/dist/mcp/server.js.map +1 -1
  87. package/dist/mcp/tools/doctor.d.ts.map +1 -1
  88. package/dist/mcp/tools/doctor.js +5 -0
  89. package/dist/mcp/tools/doctor.js.map +1 -1
  90. package/dist/mcp/tools/findings.d.ts +0 -22
  91. package/dist/mcp/tools/findings.d.ts.map +1 -1
  92. package/dist/mcp/tools/findings.js +5 -73
  93. package/dist/mcp/tools/findings.js.map +1 -1
  94. package/dist/mcp/tools/handoff.d.ts.map +1 -1
  95. package/dist/mcp/tools/handoff.js +10 -17
  96. package/dist/mcp/tools/handoff.js.map +1 -1
  97. package/dist/mcp/tools/review-bypass.d.ts.map +1 -1
  98. package/dist/mcp/tools/review-bypass.js +22 -1
  99. package/dist/mcp/tools/review-bypass.js.map +1 -1
  100. package/dist/mcp/tools/skills-install.d.ts +6 -0
  101. package/dist/mcp/tools/skills-install.d.ts.map +1 -0
  102. package/dist/mcp/tools/skills-install.js +260 -0
  103. package/dist/mcp/tools/skills-install.js.map +1 -0
  104. package/dist/mcp/tools/stats-gate.d.ts.map +1 -1
  105. package/dist/mcp/tools/stats-gate.js +63 -15
  106. package/dist/mcp/tools/stats-gate.js.map +1 -1
  107. package/dist/policy/baseline.d.ts.map +1 -1
  108. package/dist/policy/baseline.js +11 -3
  109. package/dist/policy/baseline.js.map +1 -1
  110. package/dist/policy/gate.d.ts +1 -1
  111. package/dist/policy/gate.d.ts.map +1 -1
  112. package/dist/policy/gate.js +96 -12
  113. package/dist/policy/gate.js.map +1 -1
  114. package/dist/prompt.d.ts +1 -0
  115. package/dist/prompt.d.ts.map +1 -1
  116. package/dist/prompt.js +123 -4
  117. package/dist/prompt.js.map +1 -1
  118. package/dist/report.d.ts +130 -3
  119. package/dist/report.d.ts.map +1 -1
  120. package/dist/report.js +367 -10
  121. package/dist/report.js.map +1 -1
  122. package/dist/runner.d.ts +6 -0
  123. package/dist/runner.d.ts.map +1 -1
  124. package/dist/runner.js +213 -4
  125. package/dist/runner.js.map +1 -1
  126. package/dist/self-consistency.d.ts +144 -0
  127. package/dist/self-consistency.d.ts.map +1 -0
  128. package/dist/self-consistency.js +368 -0
  129. package/dist/self-consistency.js.map +1 -0
  130. package/dist/skills/config.d.ts +176 -0
  131. package/dist/skills/config.d.ts.map +1 -0
  132. package/dist/skills/config.js +251 -0
  133. package/dist/skills/config.js.map +1 -0
  134. package/dist/skills/index.d.ts +4 -0
  135. package/dist/skills/index.d.ts.map +1 -0
  136. package/dist/skills/index.js +8 -0
  137. package/dist/skills/index.js.map +1 -0
  138. package/dist/skills/install.d.ts +62 -0
  139. package/dist/skills/install.d.ts.map +1 -0
  140. package/dist/skills/install.js +315 -0
  141. package/dist/skills/install.js.map +1 -0
  142. package/dist/skills/template.d.ts +42 -0
  143. package/dist/skills/template.d.ts.map +1 -0
  144. package/dist/skills/template.js +95 -0
  145. package/dist/skills/template.js.map +1 -0
  146. package/dist/trusted-surface/rebind.d.ts.map +1 -1
  147. package/dist/trusted-surface/rebind.js +199 -2
  148. package/dist/trusted-surface/rebind.js.map +1 -1
  149. package/package.json +36 -2
  150. package/skills/README.md +89 -0
  151. package/skills/chief-engineer-blitz/SKILL.md.tmpl +443 -0
  152. package/skills/chief-engineer-blitz/skill.json +53 -0
  153. package/skills/chief-engineer-review/SKILL.md.tmpl +184 -0
  154. package/skills/chief-engineer-review/references/review-examples.md.tmpl +130 -0
  155. package/skills/chief-engineer-review/skill.json +67 -0
  156. package/skills/chief-engineer-review/templates/code-review-prompt.md.tmpl +111 -0
  157. package/skills/chief-engineer-review/templates/escalation-prompt.md.tmpl +56 -0
  158. package/skills/chief-engineer-review/templates/plan-review-prompt.md.tmpl +74 -0
  159. package/skills/skill-schema.json +73 -0
@@ -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,54 @@ export interface DoctorOptions {
9
9
  profileName?: string;
10
10
  }
11
11
  export declare function runDoctor(options: DoctorOptions): Promise<DoctorCheck[]>;
12
+ export declare const CLOUD_ENV_MARKERS: readonly ["CODESPACES", "REMOTE_CONTAINERS", "CLAUDE_CODE_SANDBOX", "DEVCONTAINER"];
13
+ export type CloudEnvMarker = (typeof CLOUD_ENV_MARKERS)[number];
14
+ export interface CloudEnvDetection {
15
+ detected: boolean;
16
+ /**
17
+ * The subset of `CLOUD_ENV_MARKERS` whose values were truthy in
18
+ * `process.env` at detection time (each one of "true", "1", "yes",
19
+ * case-insensitive; presence-only markers like a non-empty
20
+ * `CODESPACE_NAME` are NOT considered — keep the contract explicit
21
+ * boolean-ish to avoid false positives from generic env-set state).
22
+ */
23
+ markers: CloudEnvMarker[];
24
+ }
25
+ export interface DetectCloudEnvOptions {
26
+ env?: NodeJS.ProcessEnv;
27
+ }
28
+ export declare function detectCloudEnv(options?: DetectCloudEnvOptions): CloudEnvDetection;
29
+ export type DoctorTriageState = "config_missing" | "auth_pending" | "ok";
30
+ export interface ClassifyDoctorStateOptions {
31
+ config: AgentReviewConfig;
32
+ /**
33
+ * The resolved profile name the CLI used. `undefined` means the
34
+ * caller invoked `df doctor` without `--profile` AND no
35
+ * `AGENT_REVIEW_PROFILE` was set — only meaningful in back-compat
36
+ * configs that have no `profiles` map at all.
37
+ */
38
+ profileName: string | undefined;
39
+ /**
40
+ * The per-check DoctorCheck array `runDoctor` returns. The
41
+ * classifier inspects only the per-critic auth checks
42
+ * (`<criticId>.<probe>` names) — base-infra checks are intentionally
43
+ * ignored so a missing node binary doesn't masquerade as a
44
+ * subscription-auth failure.
45
+ */
46
+ perCriticChecks: readonly DoctorCheck[];
47
+ }
48
+ export interface DoctorTriageResult {
49
+ state: DoctorTriageState;
50
+ /**
51
+ * Single-line headline (no embedded newlines). Format: `[<TAG>] ...`
52
+ * where TAG is one of `CONFIG`, `AUTH`, `OK`. The bracketed prefix
53
+ * makes the line greppable AND distinguishes it from the per-check
54
+ * `[OK]/[INFO]/[FAIL]` lines `cmdDoctor` emits underneath.
55
+ */
56
+ line: string;
57
+ }
58
+ export declare function classifyDoctorState(options: ClassifyDoctorStateOptions): DoctorTriageResult;
59
+ export declare function sweepOrphanLocks(artifactDir: string): DoctorCheck;
60
+ export declare const CACHE_TREE_CORRUPTION_REGEX: RegExp;
61
+ export declare function probeCacheTree(repoRoot: string): Promise<DoctorCheck>;
12
62
  //# 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,CA4L9E;AAuBD,eAAO,MAAM,iBAAiB,qFAKpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;;;OAMG;IACH,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,wBAAgB,cAAc,CAC5B,OAAO,GAAE,qBAA0B,GAClC,iBAAiB,CAYnB;AAiPD,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"}