@momentiq/dark-factory-cli 1.1.0 → 2.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 (149) hide show
  1. package/README.md +86 -2
  2. package/dist/adapters/critic-result-schema.d.ts +14 -14
  3. package/dist/adapters/index.d.ts +1 -0
  4. package/dist/adapters/index.d.ts.map +1 -1
  5. package/dist/adapters/index.js +7 -0
  6. package/dist/adapters/index.js.map +1 -1
  7. package/dist/adapters/static-schema-lint.d.ts +68 -0
  8. package/dist/adapters/static-schema-lint.d.ts.map +1 -0
  9. package/dist/adapters/static-schema-lint.js +813 -0
  10. package/dist/adapters/static-schema-lint.js.map +1 -0
  11. package/dist/cli.d.ts +17 -1
  12. package/dist/cli.d.ts.map +1 -1
  13. package/dist/cli.js +313 -41
  14. package/dist/cli.js.map +1 -1
  15. package/dist/commands/findings.d.ts +6 -0
  16. package/dist/commands/findings.d.ts.map +1 -0
  17. package/dist/commands/findings.js +196 -0
  18. package/dist/commands/findings.js.map +1 -0
  19. package/dist/commands/onboard.d.ts +6 -0
  20. package/dist/commands/onboard.d.ts.map +1 -0
  21. package/dist/commands/onboard.js +111 -0
  22. package/dist/commands/onboard.js.map +1 -0
  23. package/dist/commands/skills.d.ts +6 -0
  24. package/dist/commands/skills.d.ts.map +1 -0
  25. package/dist/commands/skills.js +248 -0
  26. package/dist/commands/skills.js.map +1 -0
  27. package/dist/cycle-doc-validator/validate_cycle_doc.py +131 -60
  28. package/dist/doctor.d.ts +17 -0
  29. package/dist/doctor.d.ts.map +1 -1
  30. package/dist/doctor.js +107 -0
  31. package/dist/doctor.js.map +1 -1
  32. package/dist/evidence/docker-build.d.ts +6 -0
  33. package/dist/evidence/docker-build.d.ts.map +1 -0
  34. package/dist/evidence/docker-build.js +199 -0
  35. package/dist/evidence/docker-build.js.map +1 -0
  36. package/dist/evidence/index.d.ts +1 -0
  37. package/dist/evidence/index.d.ts.map +1 -1
  38. package/dist/evidence/index.js +6 -0
  39. package/dist/evidence/index.js.map +1 -1
  40. package/dist/index.d.ts +1 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +4 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/mcp/server.d.ts.map +1 -1
  45. package/dist/mcp/server.js +2 -0
  46. package/dist/mcp/server.js.map +1 -1
  47. package/dist/mcp/tools/doctor.d.ts.map +1 -1
  48. package/dist/mcp/tools/doctor.js +5 -0
  49. package/dist/mcp/tools/doctor.js.map +1 -1
  50. package/dist/mcp/tools/review-bypass.d.ts.map +1 -1
  51. package/dist/mcp/tools/review-bypass.js +21 -0
  52. package/dist/mcp/tools/review-bypass.js.map +1 -1
  53. package/dist/mcp/tools/skills-install.d.ts +6 -0
  54. package/dist/mcp/tools/skills-install.d.ts.map +1 -0
  55. package/dist/mcp/tools/skills-install.js +260 -0
  56. package/dist/mcp/tools/skills-install.js.map +1 -0
  57. package/dist/mcp/tools/stats-gate.d.ts.map +1 -1
  58. package/dist/mcp/tools/stats-gate.js +63 -15
  59. package/dist/mcp/tools/stats-gate.js.map +1 -1
  60. package/dist/onboard/analyze.d.ts +7 -0
  61. package/dist/onboard/analyze.d.ts.map +1 -0
  62. package/dist/onboard/analyze.js +86 -0
  63. package/dist/onboard/analyze.js.map +1 -0
  64. package/dist/onboard/analyzer.d.ts +15 -0
  65. package/dist/onboard/analyzer.d.ts.map +1 -0
  66. package/dist/onboard/analyzer.js +52 -0
  67. package/dist/onboard/analyzer.js.map +1 -0
  68. package/dist/onboard/analyzers/ci.d.ts +3 -0
  69. package/dist/onboard/analyzers/ci.d.ts.map +1 -0
  70. package/dist/onboard/analyzers/ci.js +112 -0
  71. package/dist/onboard/analyzers/ci.js.map +1 -0
  72. package/dist/onboard/analyzers/docs.d.ts +3 -0
  73. package/dist/onboard/analyzers/docs.d.ts.map +1 -0
  74. package/dist/onboard/analyzers/docs.js +151 -0
  75. package/dist/onboard/analyzers/docs.js.map +1 -0
  76. package/dist/onboard/analyzers/git.d.ts +3 -0
  77. package/dist/onboard/analyzers/git.d.ts.map +1 -0
  78. package/dist/onboard/analyzers/git.js +87 -0
  79. package/dist/onboard/analyzers/git.js.map +1 -0
  80. package/dist/onboard/analyzers/lockfile.d.ts +3 -0
  81. package/dist/onboard/analyzers/lockfile.d.ts.map +1 -0
  82. package/dist/onboard/analyzers/lockfile.js +285 -0
  83. package/dist/onboard/analyzers/lockfile.js.map +1 -0
  84. package/dist/onboard/analyzers/manifest.d.ts +3 -0
  85. package/dist/onboard/analyzers/manifest.d.ts.map +1 -0
  86. package/dist/onboard/analyzers/manifest.js +228 -0
  87. package/dist/onboard/analyzers/manifest.js.map +1 -0
  88. package/dist/onboard/analyzers/tree.d.ts +3 -0
  89. package/dist/onboard/analyzers/tree.d.ts.map +1 -0
  90. package/dist/onboard/analyzers/tree.js +196 -0
  91. package/dist/onboard/analyzers/tree.js.map +1 -0
  92. package/dist/onboard/fixtures/replay-git-history.d.ts +20 -0
  93. package/dist/onboard/fixtures/replay-git-history.d.ts.map +1 -0
  94. package/dist/onboard/fixtures/replay-git-history.js +91 -0
  95. package/dist/onboard/fixtures/replay-git-history.js.map +1 -0
  96. package/dist/onboard/schema.d.ts +545 -0
  97. package/dist/onboard/schema.d.ts.map +1 -0
  98. package/dist/onboard/schema.js +142 -0
  99. package/dist/onboard/schema.js.map +1 -0
  100. package/dist/policy/gate.d.ts +1 -1
  101. package/dist/policy/gate.d.ts.map +1 -1
  102. package/dist/policy/gate.js +96 -12
  103. package/dist/policy/gate.js.map +1 -1
  104. package/dist/prompt.d.ts +1 -0
  105. package/dist/prompt.d.ts.map +1 -1
  106. package/dist/prompt.js +105 -1
  107. package/dist/prompt.js.map +1 -1
  108. package/dist/report.d.ts +106 -3
  109. package/dist/report.d.ts.map +1 -1
  110. package/dist/report.js +282 -10
  111. package/dist/report.js.map +1 -1
  112. package/dist/runner.d.ts +2 -0
  113. package/dist/runner.d.ts.map +1 -1
  114. package/dist/runner.js +86 -2
  115. package/dist/runner.js.map +1 -1
  116. package/dist/self-consistency.d.ts +144 -0
  117. package/dist/self-consistency.d.ts.map +1 -0
  118. package/dist/self-consistency.js +368 -0
  119. package/dist/self-consistency.js.map +1 -0
  120. package/dist/skills/config.d.ts +176 -0
  121. package/dist/skills/config.d.ts.map +1 -0
  122. package/dist/skills/config.js +251 -0
  123. package/dist/skills/config.js.map +1 -0
  124. package/dist/skills/index.d.ts +4 -0
  125. package/dist/skills/index.d.ts.map +1 -0
  126. package/dist/skills/index.js +8 -0
  127. package/dist/skills/index.js.map +1 -0
  128. package/dist/skills/install.d.ts +62 -0
  129. package/dist/skills/install.d.ts.map +1 -0
  130. package/dist/skills/install.js +315 -0
  131. package/dist/skills/install.js.map +1 -0
  132. package/dist/skills/template.d.ts +42 -0
  133. package/dist/skills/template.d.ts.map +1 -0
  134. package/dist/skills/template.js +95 -0
  135. package/dist/skills/template.js.map +1 -0
  136. package/dist/trusted-surface/rebind.d.ts.map +1 -1
  137. package/dist/trusted-surface/rebind.js +14 -1
  138. package/dist/trusted-surface/rebind.js.map +1 -1
  139. package/package.json +36 -2
  140. package/skills/README.md +89 -0
  141. package/skills/chief-engineer-blitz/SKILL.md.tmpl +443 -0
  142. package/skills/chief-engineer-blitz/skill.json +53 -0
  143. package/skills/chief-engineer-review/SKILL.md.tmpl +184 -0
  144. package/skills/chief-engineer-review/references/review-examples.md.tmpl +130 -0
  145. package/skills/chief-engineer-review/skill.json +67 -0
  146. package/skills/chief-engineer-review/templates/code-review-prompt.md.tmpl +111 -0
  147. package/skills/chief-engineer-review/templates/escalation-prompt.md.tmpl +56 -0
  148. package/skills/chief-engineer-review/templates/plan-review-prompt.md.tmpl +74 -0
  149. package/skills/skill-schema.json +73 -0
package/README.md CHANGED
@@ -99,16 +99,28 @@ df admit-pr --files docs/roadmap/cycles/cycle1.md,packages/cli/src/cli.ts
99
99
 
100
100
  # Hook-facing subcommands (subscription cost model).
101
101
  df review --commit HEAD --profile local --foreground
102
- df gate-push # local pre-push, reads stdin
102
+ df gate-push # local pre-push, reads stdin (default: gate HEAD only)
103
+ df gate-push --full-range # legacy: gate every commit in the push range
103
104
  df gate-push --commit HEAD --ci # CI replay
104
105
  df doctor --profile local # env + per-adapter auth check
105
106
  df gates # static gates, no LLM
106
107
  df stats # alias for `df audit stats`
107
108
 
109
+ # Audit-mode inspection (NOT a gate).
110
+ df findings --range origin/main..HEAD # per-commit findings for the range
111
+ df findings --range origin/main..HEAD --json # df_findings-shaped JSON array
112
+
108
113
  # Stdio Model Context Protocol server — exposes the CLI surface to any
109
114
  # MCP-speaking agent.
110
115
  df mcp # start the stdio MCP server
111
116
  df mcp --help # config snippets for Claude Code, Cursor, Codex
117
+
118
+ # Bundled-skill installer (consumer-shape — implements DFP #192).
119
+ df skills list # list bundled skills (name, version, summary)
120
+ df skills install <name> # render + write .claude/skills/<name>/
121
+ df skills install --all # install every skill declared `enabled: true`
122
+ # in darkfactory.yaml
123
+ df skills install <name> --force # overwrite a hand-edited rendered file
112
124
  ```
113
125
 
114
126
  > **Note on `--use-bundled-default-spec`**: the bundled `spec-default.yaml`
@@ -133,7 +145,8 @@ Codex / Claude CLI logins) are flat-rate.
133
145
  | Subcommand | Hook | Cost model |
134
146
  | --- | --- | --- |
135
147
  | `df review` | `.husky/post-commit` (background) | **Subscription** — consumes Cursor / Codex / Claude CLI logins via the active profile's `auth` pins. No API spend by default. |
136
- | `df gate-push` | `.husky/pre-push` | Free — reads pre-existing artifacts, no LLM calls. |
148
+ | `df gate-push` | `.husky/pre-push` | Free — reads pre-existing artifacts, no LLM calls. Default (Cycle 13 / dark-factory-platform#149): gates the HEAD commit only; intermediate commits are iteration receipts (`df findings --range` surfaces them un-gated). Opt-in legacy: `--full-range` or `DF_GATE_FULL_RANGE=1` gates every commit in the range. **Soundness caveat:** HEAD's per-SHA artifact reviews `parent..HEAD` only, NOT `base..HEAD` — use `--full-range` or the CI cold-path `agent-critic` workflow (which reviews the full PR diff) when cumulative-state evidence is required. |
149
+ | `df findings --range <base>..<head>` | None (operator-run) | Free. Walks every commit's per-SHA artifact in the range for audit-mode inspection. NOT a gate; does not re-run critics. The companion-surface to the final-commit-only `df gate-push` default. |
137
150
  | `df doctor` | None (operator-run) | Free. Validates that per-adapter auth source is reachable. |
138
151
  | `df gates` | None (operator-run) | Free. Runs static quality gates per `validation.requiredQualityGates`. |
139
152
  | `df stats` | None (operator-run) | Free. Reads `.git/agent-reviews/_runs.ndjson`. |
@@ -273,6 +286,77 @@ The bundled Python scripts resolve the consumer repo root in this order:
273
286
  The TypeScript wrappers set `DF_REPO_ROOT` automatically when a `repoRoot`
274
287
  option is supplied — pass it when invoking outside a git worktree.
275
288
 
289
+ ## Bundled skills (`df skills install` — DFP #192)
290
+
291
+ The CLI ships a small set of **consumer-shape templated skills** that any
292
+ repo adopting Dark Factory can install with one command — no fork, no
293
+ hand-edit. The skill body templates live in this repo under `skills/<name>/`;
294
+ the renderer substitutes `{{REPO_NAME}}`, `{{ADR_DIR}}`,
295
+ `{{CYCLE_DOCS_DIR}}`, `{{QUALITY_GATE_TARGETS}}`, etc. against the
296
+ consumer's `darkfactory.yaml` at install time.
297
+
298
+ **Bundled today:**
299
+
300
+ - **`chief-engineer-review`** — AI-native architectural review (autonomous
301
+ + conversational modes). Originated in `momentiq-ai/sage3c`.
302
+ - **`chief-engineer-blitz`** — orchestrated multi-PR delivery doctrine (six
303
+ phases: Plan → Spec → Implement → Triage → Validate → Closure).
304
+ Originated in `momentiq-ai/dark-factory-platform`.
305
+
306
+ **Consumer setup (one-time per repo):**
307
+
308
+ ```bash
309
+ # 1. Author darkfactory.yaml at repo root (see the schema below).
310
+ # 2. Install:
311
+ df skills install --all # installs every skill marked enabled
312
+ # … or one at a time:
313
+ df skills install chief-engineer-review
314
+ ```
315
+
316
+ **`darkfactory.yaml` schema** (every key optional — install falls back to
317
+ sensible defaults):
318
+
319
+ ```yaml
320
+ repo:
321
+ displayName: "My Repo"
322
+ slug: "my-repo"
323
+ ownerRepo: "my-org/my-repo"
324
+ docs:
325
+ manifesto: docs/PRINCIPLES.md
326
+ adrDir: docs/ADR
327
+ cycleDocsDir: docs/roadmap/cycles
328
+ rfcDir: docs/rfcs
329
+ prdDir: docs/prds
330
+ agents:
331
+ chiefEngineer: .claude/agents/chief-engineer.md
332
+ qualityGates:
333
+ - make quality-gates
334
+ - make test
335
+ worktreeRoot: .claude/worktrees
336
+ agentCommitterOrg: my-org # for the claude-code+<handle>@<org>.ai committer
337
+ skills:
338
+ chief-engineer-review:
339
+ enabled: true
340
+ chief-engineer-blitz:
341
+ enabled: true
342
+ ```
343
+
344
+ **Re-install semantics:**
345
+
346
+ - A re-install with identical inputs is a no-op (the rendered file carries
347
+ an `install-hash` in its `GENERATED` header; matching hash → unchanged).
348
+ - A re-install with different inputs (config changed, template upstream
349
+ changed) overwrites the rendered file.
350
+ - A re-install where the rendered file has been hand-edited (no `GENERATED`
351
+ header detected) is **skipped** — pass `--force` to overwrite.
352
+
353
+ **MCP tool parity:** the `df mcp` server exposes `df_skills_install` +
354
+ `df_skills_list` with the same semantics, so MCP-speaking agents (Claude
355
+ Code, Cursor) can install skills programmatically without shelling out.
356
+
357
+ **Adding a new bundled skill:** see `skills/README.md` for the manifest +
358
+ template authoring rules.
359
+
276
360
  ## License
277
361
 
278
362
  Apache-2.0. The OSS critic surface is a public artifact. The hosted Dark
@@ -52,33 +52,33 @@ export declare const CriticResultZodSchema: z.ZodObject<{
52
52
  justification: z.ZodOptional<z.ZodString>;
53
53
  requiresHumanJudgment: z.ZodOptional<z.ZodBoolean>;
54
54
  }, "strip", z.ZodTypeAny, {
55
- evidence: string;
56
55
  severity: string;
57
56
  category: string;
57
+ evidence: string;
58
58
  impact: string;
59
59
  requiredFix: string;
60
60
  symbol?: string | undefined;
61
- routeId?: string | undefined;
62
- requiresHumanJudgment?: boolean | undefined;
63
61
  file?: string | undefined;
64
62
  line?: number | undefined;
65
63
  manifestoSection?: string | undefined;
66
64
  evidencePath?: string | undefined;
65
+ routeId?: string | undefined;
67
66
  justification?: string | undefined;
67
+ requiresHumanJudgment?: boolean | undefined;
68
68
  }, {
69
- evidence: string;
70
69
  severity: string;
71
70
  category: string;
71
+ evidence: string;
72
72
  impact: string;
73
73
  requiredFix: string;
74
74
  symbol?: string | undefined;
75
- routeId?: string | undefined;
76
- requiresHumanJudgment?: boolean | undefined;
77
75
  file?: string | undefined;
78
76
  line?: number | undefined;
79
77
  manifestoSection?: string | undefined;
80
78
  evidencePath?: string | undefined;
79
+ routeId?: string | undefined;
81
80
  justification?: string | undefined;
81
+ requiresHumanJudgment?: boolean | undefined;
82
82
  }>, "many">;
83
83
  validation: z.ZodObject<{
84
84
  qualityGateResults: z.ZodArray<z.ZodObject<{
@@ -132,6 +132,7 @@ export declare const CriticResultZodSchema: z.ZodObject<{
132
132
  }>;
133
133
  confidence: z.ZodEnum<[string, ...string[]]>;
134
134
  }, "strip", z.ZodTypeAny, {
135
+ requiresHumanJudgment: boolean;
135
136
  status: string;
136
137
  validation: {
137
138
  qualityGateResults: {
@@ -145,26 +146,26 @@ export declare const CriticResultZodSchema: z.ZodObject<{
145
146
  }[];
146
147
  qualityGatesMissing: string[];
147
148
  };
148
- requiresHumanJudgment: boolean;
149
149
  summary: string;
150
150
  confidence: string;
151
151
  verdict: string;
152
152
  findings: {
153
- evidence: string;
154
153
  severity: string;
155
154
  category: string;
155
+ evidence: string;
156
156
  impact: string;
157
157
  requiredFix: string;
158
158
  symbol?: string | undefined;
159
- routeId?: string | undefined;
160
- requiresHumanJudgment?: boolean | undefined;
161
159
  file?: string | undefined;
162
160
  line?: number | undefined;
163
161
  manifestoSection?: string | undefined;
164
162
  evidencePath?: string | undefined;
163
+ routeId?: string | undefined;
165
164
  justification?: string | undefined;
165
+ requiresHumanJudgment?: boolean | undefined;
166
166
  }[];
167
167
  }, {
168
+ requiresHumanJudgment: boolean;
168
169
  status: string;
169
170
  validation: {
170
171
  qualityGateResults: {
@@ -178,24 +179,23 @@ export declare const CriticResultZodSchema: z.ZodObject<{
178
179
  }[];
179
180
  qualityGatesMissing: string[];
180
181
  };
181
- requiresHumanJudgment: boolean;
182
182
  summary: string;
183
183
  confidence: string;
184
184
  verdict: string;
185
185
  findings: {
186
- evidence: string;
187
186
  severity: string;
188
187
  category: string;
188
+ evidence: string;
189
189
  impact: string;
190
190
  requiredFix: string;
191
191
  symbol?: string | undefined;
192
- routeId?: string | undefined;
193
- requiresHumanJudgment?: boolean | undefined;
194
192
  file?: string | undefined;
195
193
  line?: number | undefined;
196
194
  manifestoSection?: string | undefined;
197
195
  evidencePath?: string | undefined;
196
+ routeId?: string | undefined;
198
197
  justification?: string | undefined;
198
+ requiresHumanJudgment?: boolean | undefined;
199
199
  }[];
200
200
  }>;
201
201
  export type CriticResultModelEnvelope = z.infer<typeof CriticResultZodSchema>;
@@ -3,5 +3,6 @@ export { GeminiSdkAdapter, GEMINI_SDK_ADAPTER_ID, GEMINI_API_KEY_ENV, DEFAULT_TH
3
3
  export { GrokDirectSdkAdapter, GROK_DIRECT_SDK_ADAPTER_ID, XAI_API_KEY_ENV, XAI_BASE_URL, GROK_PERMANENT_STATUS, DEFAULT_REASONING_EFFORT as GROK_DEFAULT_REASONING_EFFORT, resolveReasoningEffort, extractXaiApiErrorStatus, isGrokPermanentFailure, type GrokClient, type GrokResponsesCreateParams, type GrokStreamEvent, type GrokUsage, type GrokDirectSdkAdapterOptions, type GrokReasoningEffort, } from "./grok-direct-sdk.js";
4
4
  export { CodexSdkAdapter, CODEX_SDK_ADAPTER_ID, CODEX_API_KEY_ENV, CODEX_HOME_ENV, CODEX_AUTH_CHATGPT, CODEX_AUTH_API, CODEX_AUTH_MODES, DEFAULT_REASONING_EFFORT as CODEX_DEFAULT_REASONING_EFFORT, targetTripleForCurrentPlatform, resolveBundledCodexCliPath, probeCodexLoginStatus, resolveCodexReasoningEffort, extractCodexErrorCode, resolveAuthOrFail, type CodexAuthMode, type CodexAuthProbeOutcome, type CodexExecHook, type CodexClient, type CodexThread, type CodexUsage, type CodexTurnResult, type CodexThreadOptions, type CodexThreadEvent, type CodexSdkAdapterOptions, } from "./codex-sdk.js";
5
5
  export { CursorCliAdapter, CURSOR_CLI_ADAPTER_ID, CURSOR_CLI_BINARY, CURSOR_API_KEY_ENV as CURSOR_CLI_API_KEY_ENV_STRIPPED, CURSOR_CLI_AUTH_CHATGPT, CURSOR_CLI_AUTH_MODES, CURSOR_CLI_PERMANENT_SUBTYPES, buildCursorCliArgs, buildSubscriptionEnv, defaultCursorCliRunner, extractAssistantText as cursorCliExtractAssistantText, extractInitEvent, extractResultEnvelope, isPermanentResultSubtype, resolveAuthOrFail as cursorCliResolveAuthOrFail, resolveCursorCliModelId, type CursorCliAdapterOptions, type CursorCliAuthMode, type CursorCliInitEvent, type CursorCliResultEnvelope, type CursorCliRunArgs, type CursorCliRunOutcome, type CursorCliRunner, } from "./cursor-cli.js";
6
+ export { StaticSchemaLintAdapter, STATIC_SCHEMA_LINT_ADAPTER_ID, STATIC_SCHEMAS, extractSchemaBlocks, stripJsoncSyntax, type StaticSchemaLintAdapterOptions, type ExtractedBlock, } from "./static-schema-lint.js";
6
7
  export { AdapterRegistry, collectRequiredEnvVars, type CriticAdapter, type CriticReviewOptions, } from "./critic.js";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,wBAAwB,IAAI,6BAA6B,EACzD,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,KAAK,UAAU,EACf,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,wBAAwB,IAAI,8BAA8B,EAC1D,8BAA8B,EAC9B,0BAA0B,EAC1B,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AAOxB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,IAAI,+BAA+B,EACrD,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,IAAI,6BAA6B,EACrD,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,IAAI,0BAA0B,EAC/C,uBAAuB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,wBAAwB,IAAI,6BAA6B,EACzD,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,KAAK,UAAU,EACf,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,wBAAwB,IAAI,8BAA8B,EAC1D,8BAA8B,EAC9B,0BAA0B,EAC1B,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AAOxB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,IAAI,+BAA+B,EACrD,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,IAAI,6BAA6B,EACrD,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,IAAI,0BAA0B,EAC/C,uBAAuB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,KAAK,8BAA8B,EACnC,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC"}
@@ -19,5 +19,12 @@ export { CodexSdkAdapter, CODEX_SDK_ADAPTER_ID, CODEX_API_KEY_ENV, CODEX_HOME_EN
19
19
  // cursor-sdk: cloud/CI profiles continue to use cursor-sdk with the
20
20
  // Doppler-provisioned key; local profiles use cursor-cli with no key.
21
21
  export { CursorCliAdapter, CURSOR_CLI_ADAPTER_ID, CURSOR_CLI_BINARY, CURSOR_API_KEY_ENV as CURSOR_CLI_API_KEY_ENV_STRIPPED, CURSOR_CLI_AUTH_CHATGPT, CURSOR_CLI_AUTH_MODES, CURSOR_CLI_PERMANENT_SUBTYPES, buildCursorCliArgs, buildSubscriptionEnv, defaultCursorCliRunner, extractAssistantText as cursorCliExtractAssistantText, extractInitEvent, extractResultEnvelope, isPermanentResultSubtype, resolveAuthOrFail as cursorCliResolveAuthOrFail, resolveCursorCliModelId, } from "./cursor-cli.js";
22
+ // Consumer dark-factory-platform#107 — deterministic schema-lint adapter.
23
+ // Validates JSON-Schema-tagged code blocks in markdown / config-file
24
+ // examples (e.g. CLAUDE.md `~/.claude/settings.json` examples). No LLM,
25
+ // no network, no auth; runs in <100ms. Closes the local-quorum
26
+ // coverage gap where the LLM critics passed a schema-invalid example
27
+ // that the cloud-cursor adapter (different prompt envelope) caught.
28
+ export { StaticSchemaLintAdapter, STATIC_SCHEMA_LINT_ADAPTER_ID, STATIC_SCHEMAS, extractSchemaBlocks, stripJsoncSyntax, } from "./static-schema-lint.js";
22
29
  export { AdapterRegistry, collectRequiredEnvVars, } from "./critic.js";
23
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,EAAE;AACF,kEAAkE;AAClE,2DAA2D;AAC3D,EAAE;AACF,kEAAkE;AAClE,4CAA4C;AAC5C,kGAAkG;AAClG,EAAE;AACF,wEAAwE;AACxE,0DAA0D;AAE1D,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,aAAa,GAGd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,GAIzB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,wBAAwB,IAAI,6BAA6B,EACzD,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,GAOvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,wBAAwB,IAAI,8BAA8B,EAC1D,8BAA8B,EAC9B,0BAA0B,EAC1B,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,iBAAiB,GAWlB,MAAM,gBAAgB,CAAC;AAExB,wEAAwE;AACxE,wEAAwE;AACxE,gEAAgE;AAChE,oEAAoE;AACpE,sEAAsE;AACtE,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,IAAI,+BAA+B,EACrD,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,IAAI,6BAA6B,EACrD,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,IAAI,0BAA0B,EAC/C,uBAAuB,GAQxB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,sBAAsB,GAGvB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,EAAE;AACF,kEAAkE;AAClE,2DAA2D;AAC3D,EAAE;AACF,kEAAkE;AAClE,4CAA4C;AAC5C,kGAAkG;AAClG,EAAE;AACF,wEAAwE;AACxE,0DAA0D;AAE1D,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,aAAa,GAGd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,GAIzB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,wBAAwB,IAAI,6BAA6B,EACzD,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,GAOvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,wBAAwB,IAAI,8BAA8B,EAC1D,8BAA8B,EAC9B,0BAA0B,EAC1B,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,iBAAiB,GAWlB,MAAM,gBAAgB,CAAC;AAExB,wEAAwE;AACxE,wEAAwE;AACxE,gEAAgE;AAChE,oEAAoE;AACpE,sEAAsE;AACtE,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,IAAI,+BAA+B,EACrD,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,IAAI,6BAA6B,EACrD,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,IAAI,0BAA0B,EAC/C,uBAAuB,GAQxB,MAAM,iBAAiB,CAAC;AAEzB,0EAA0E;AAC1E,qEAAqE;AACrE,wEAAwE;AACxE,+DAA+D;AAC/D,qEAAqE;AACrE,oEAAoE;AACpE,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GAGjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,eAAe,EACf,sBAAsB,GAGvB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { type CriticConfig, type CriticResult, type DoctorCheck, type ReviewPacket } from "@momentiq/dark-factory-schemas";
2
+ import type { CriticAdapter, CriticReviewOptions } from "./critic.js";
3
+ export declare const STATIC_SCHEMA_LINT_ADAPTER_ID = "static-schema-lint";
4
+ /**
5
+ * The built-in schema registry. Maps a schema name (the value of the
6
+ * `// schema: <name>` annotation) to the JSON Schema definition the
7
+ * adapter validates against.
8
+ */
9
+ export declare const STATIC_SCHEMAS: Readonly<Record<string, Record<string, unknown>>>;
10
+ export interface ExtractedBlock {
11
+ /** Schema name from the annotation. */
12
+ schemaName: string;
13
+ /** Code-block body with the schema-marker line stripped (parseable as JSON). */
14
+ body: string;
15
+ /** Fence language tag (e.g. "jsonc", "json", "yaml", or "" if absent). */
16
+ language: string;
17
+ /** 1-based line in the source markdown where the fence body starts. */
18
+ startLine: number;
19
+ }
20
+ /**
21
+ * Strip JSONC / JSON5-style comments AND trailing commas from a JSON-ish
22
+ * payload so `JSON.parse` succeeds on JSONC examples. Single-pass state
23
+ * machine — comment stripping AND trailing-comma removal both honor
24
+ * string-literal boundaries, so a comma-brace sequence inside a string
25
+ * value (`",}"`) is preserved verbatim. Designed for the limited surface
26
+ * of config-file examples in docs, not as a general JSON5 parser.
27
+ *
28
+ * Exported for unit-testability.
29
+ */
30
+ export declare function stripJsoncSyntax(text: string): string;
31
+ /**
32
+ * Extract schema-annotated code blocks from a markdown source. Returns
33
+ * an empty array when the source contains no annotated blocks.
34
+ *
35
+ * The schema annotation may be embedded INSIDE the code block — three
36
+ * forms: JSONC line comment, YAML / shell line comment, or block
37
+ * comment — or as an HTML comment IMMEDIATELY before the fence (the
38
+ * only form compatible with strict JSON blocks, since JSON forbids
39
+ * inline comments).
40
+ */
41
+ export declare function extractSchemaBlocks(source: string): ExtractedBlock[];
42
+ export declare function reconstructAddedContentFromDiff(diff: string): Map<string, string>;
43
+ /**
44
+ * Options for constructing the adapter. The `schemas` override lets
45
+ * callers add additional schemas without modifying the built-in registry
46
+ * (useful for tests and for consumer repos that want to lint their own
47
+ * config shapes). Supplied schemas merge with `STATIC_SCHEMAS`; a
48
+ * caller-supplied schema with the same name as a built-in overrides it.
49
+ */
50
+ export interface StaticSchemaLintAdapterOptions {
51
+ schemas?: Readonly<Record<string, Record<string, unknown>>>;
52
+ /**
53
+ * File globs (basenames + extensions) the adapter will scan. The
54
+ * default covers the high-churn doc surfaces. Anything not matching
55
+ * is skipped without inspection.
56
+ */
57
+ scannedFilePatterns?: readonly RegExp[];
58
+ }
59
+ export declare class StaticSchemaLintAdapter implements CriticAdapter {
60
+ readonly id = "static-schema-lint";
61
+ readonly requiredEnvVars: readonly string[];
62
+ private readonly registry;
63
+ private readonly scannedFilePatterns;
64
+ constructor(options?: StaticSchemaLintAdapterOptions);
65
+ review(packet: ReviewPacket, critic: CriticConfig, options: CriticReviewOptions): Promise<CriticResult>;
66
+ doctor(_critic: CriticConfig): Promise<DoctorCheck[]>;
67
+ }
68
+ //# sourceMappingURL=static-schema-lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-schema-lint.d.ts","sourceRoot":"","sources":["../../src/adapters/static-schema-lint.ts"],"names":[],"mappings":"AAmEA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,WAAW,EAEhB,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAC;AAyBxC,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEtE,eAAO,MAAM,6BAA6B,uBAAuB,CAAC;AAoHlE;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAG3E,CAAC;AAiDH,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkFrD;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CA0DpE;AAmED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA4EjF;AA4ED;;;;;;GAMG;AACH,MAAM,WAAW,8BAA8B;IAC7C,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5D;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAUD,qBAAa,uBAAwB,YAAW,aAAa;IAC3D,QAAQ,CAAC,EAAE,wBAAiC;IAC5C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAM;IAEjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAoB;gBAE5C,OAAO,GAAE,8BAAmC;IAMlD,MAAM,CACV,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,YAAY,CAAC;IAwKlB,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CA2C5D"}