@momentiq/dark-factory-cli 0.1.1-alpha.9 → 0.3.0-alpha.9
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 +5 -0
- package/dist/adapters/cursor-cli.d.ts +211 -0
- package/dist/adapters/cursor-cli.d.ts.map +1 -0
- package/dist/adapters/cursor-cli.js +1126 -0
- package/dist/adapters/cursor-cli.js.map +1 -0
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/cli.js +30 -2
- package/dist/cli.js.map +1 -1
- package/dist/mcp/adr/parser.d.ts +39 -0
- package/dist/mcp/adr/parser.d.ts.map +1 -0
- package/dist/mcp/adr/parser.js +148 -0
- package/dist/mcp/adr/parser.js.map +1 -0
- package/dist/mcp/cli.d.ts +3 -0
- package/dist/mcp/cli.d.ts.map +1 -0
- package/dist/mcp/cli.js +103 -0
- package/dist/mcp/cli.js.map +1 -0
- package/dist/mcp/cycle-doc/parser.d.ts +44 -0
- package/dist/mcp/cycle-doc/parser.d.ts.map +1 -0
- package/dist/mcp/cycle-doc/parser.js +168 -0
- package/dist/mcp/cycle-doc/parser.js.map +1 -0
- package/dist/mcp/prompts.d.ts +6 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +364 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/resources.d.ts +6 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +339 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +20 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +106 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/adr.d.ts +6 -0
- package/dist/mcp/tools/adr.d.ts.map +1 -0
- package/dist/mcp/tools/adr.js +144 -0
- package/dist/mcp/tools/adr.js.map +1 -0
- package/dist/mcp/tools/critics-config.d.ts +6 -0
- package/dist/mcp/tools/critics-config.d.ts.map +1 -0
- package/dist/mcp/tools/critics-config.js +97 -0
- package/dist/mcp/tools/critics-config.js.map +1 -0
- package/dist/mcp/tools/cycle.d.ts +12 -0
- package/dist/mcp/tools/cycle.d.ts.map +1 -0
- package/dist/mcp/tools/cycle.js +145 -0
- package/dist/mcp/tools/cycle.js.map +1 -0
- package/dist/mcp/tools/doctor.d.ts +30 -0
- package/dist/mcp/tools/doctor.d.ts.map +1 -0
- package/dist/mcp/tools/doctor.js +218 -0
- package/dist/mcp/tools/doctor.js.map +1 -0
- package/dist/mcp/tools/findings.d.ts +33 -0
- package/dist/mcp/tools/findings.d.ts.map +1 -0
- package/dist/mcp/tools/findings.js +267 -0
- package/dist/mcp/tools/findings.js.map +1 -0
- package/dist/mcp/tools/generate.d.ts +6 -0
- package/dist/mcp/tools/generate.d.ts.map +1 -0
- package/dist/mcp/tools/generate.js +463 -0
- package/dist/mcp/tools/generate.js.map +1 -0
- package/dist/mcp/tools/review-bypass.d.ts +13 -0
- package/dist/mcp/tools/review-bypass.d.ts.map +1 -0
- package/dist/mcp/tools/review-bypass.js +549 -0
- package/dist/mcp/tools/review-bypass.js.map +1 -0
- package/dist/mcp/tools/stats-gate.d.ts +48 -0
- package/dist/mcp/tools/stats-gate.d.ts.map +1 -0
- package/dist/mcp/tools/stats-gate.js +290 -0
- package/dist/mcp/tools/stats-gate.js.map +1 -0
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -106,6 +106,11 @@ df gate-push --commit HEAD --ci # CI replay
|
|
|
106
106
|
df doctor --profile local # env + per-adapter auth check
|
|
107
107
|
df gates # static gates, no LLM
|
|
108
108
|
df stats # alias for `df audit stats`
|
|
109
|
+
|
|
110
|
+
# Phase G — MCP server (cycle 5). Stdio Model Context Protocol server
|
|
111
|
+
# exposing the CLI surface to any MCP-speaking agent.
|
|
112
|
+
df mcp # start the stdio MCP server
|
|
113
|
+
df mcp --help # config snippets for Claude Code, Cursor, Codex
|
|
109
114
|
```
|
|
110
115
|
|
|
111
116
|
> **Note on `--use-bundled-default-spec`**: the bundled `spec-default.yaml`
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { type CriticConfig, type CriticResult, type DoctorCheck, type ReviewPacket } from "@momentiq/dark-factory-schemas";
|
|
2
|
+
import type { CriticAdapter, CriticReviewOptions } from "./critic.js";
|
|
3
|
+
import { type AttemptOutcome } from "./_retry.js";
|
|
4
|
+
export declare const CURSOR_CLI_ADAPTER_ID = "cursor-cli";
|
|
5
|
+
export declare const CURSOR_CLI_BINARY = "cursor-agent";
|
|
6
|
+
export declare const CURSOR_API_KEY_ENV = "CURSOR_API_KEY";
|
|
7
|
+
export declare const CURSOR_CLI_AUTH_CHATGPT: "chatgpt";
|
|
8
|
+
export type CursorCliAuthMode = typeof CURSOR_CLI_AUTH_CHATGPT;
|
|
9
|
+
export declare const CURSOR_CLI_AUTH_MODES: readonly CursorCliAuthMode[];
|
|
10
|
+
/**
|
|
11
|
+
* Resolve the effective `--model` arg from a critic config. Appends the
|
|
12
|
+
* `-fast` suffix when the critic declares `fast: true` (and the id
|
|
13
|
+
* doesn't already carry the suffix). Exported for direct unit testing.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveCursorCliModelId(critic: CriticConfig): string;
|
|
16
|
+
/**
|
|
17
|
+
* `system.init` event — emitted as the first event in `--output-format
|
|
18
|
+
* stream-json` mode. Documented fields: `type`, `subtype`,
|
|
19
|
+
* `apiKeySource`, `cwd`, `session_id`, `model`, `permissionMode`.
|
|
20
|
+
*
|
|
21
|
+
* `apiKeySource` is the trust signal: `"login"` means the CLI used
|
|
22
|
+
* Keychain-backed subscription auth (the desired mode for `cursor-cli`),
|
|
23
|
+
* `"env"` means a `CURSOR_API_KEY` env var was honored, `"flag"` means
|
|
24
|
+
* `--api-key` was passed. When auth is pinned to "chatgpt", anything
|
|
25
|
+
* other than "login" fails the run closed (issue #28 defense in depth).
|
|
26
|
+
*/
|
|
27
|
+
export interface CursorCliInitEvent {
|
|
28
|
+
apiKeySource?: string;
|
|
29
|
+
sessionId?: string;
|
|
30
|
+
model?: string;
|
|
31
|
+
permissionMode?: string;
|
|
32
|
+
cwd?: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function extractInitEvent(event: unknown): CursorCliInitEvent | null;
|
|
35
|
+
/**
|
|
36
|
+
* `assistant` event — `message.content[]` array with `type: "text"`
|
|
37
|
+
* entries the model wrote. Same shape as the @cursor/sdk stream (verified
|
|
38
|
+
* empirically) so this extractor mirrors `cursor-sdk.ts:extractAssistantText`.
|
|
39
|
+
*
|
|
40
|
+
* Returns the empty string for non-assistant events or malformed shapes.
|
|
41
|
+
*/
|
|
42
|
+
export declare function extractAssistantText(event: unknown): string;
|
|
43
|
+
/**
|
|
44
|
+
* `result` event — terminal envelope. Documented fields: `type`,
|
|
45
|
+
* `subtype`, `duration_ms`, `duration_api_ms`, `is_error`, `result`,
|
|
46
|
+
* `session_id`, `request_id`, `usage`. Stream parsing stops once this
|
|
47
|
+
* event is observed (or the subprocess exits, whichever comes first).
|
|
48
|
+
*/
|
|
49
|
+
export interface CursorCliResultEnvelope {
|
|
50
|
+
isError: boolean;
|
|
51
|
+
subtype: string | null;
|
|
52
|
+
resultText: string;
|
|
53
|
+
sessionId: string | null;
|
|
54
|
+
requestId: string | null;
|
|
55
|
+
durationMs: number | null;
|
|
56
|
+
usageInputTokens: number | null;
|
|
57
|
+
usageOutputTokens: number | null;
|
|
58
|
+
}
|
|
59
|
+
export declare function extractResultEnvelope(event: unknown): CursorCliResultEnvelope | null;
|
|
60
|
+
export declare const CURSOR_CLI_PERMANENT_SUBTYPES: ReadonlySet<string>;
|
|
61
|
+
/**
|
|
62
|
+
* Classify a `result` envelope's `subtype` as permanent vs retryable.
|
|
63
|
+
* Returns `true` for the permanent set, `false` otherwise (unknown
|
|
64
|
+
* subtypes are treated as retryable). Exported for unit testing.
|
|
65
|
+
*/
|
|
66
|
+
export declare function isPermanentResultSubtype(subtype: string | null): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Aggregate outcome of a single subprocess invocation. The adapter
|
|
69
|
+
* dispatches on these fields; tests inject a stub returning a scripted
|
|
70
|
+
* shape so no real `cursor-agent` process is spawned during unit tests.
|
|
71
|
+
*/
|
|
72
|
+
export interface CursorCliRunOutcome {
|
|
73
|
+
/** Parsed NDJSON events from stdout, in order. */
|
|
74
|
+
events: unknown[];
|
|
75
|
+
/** Process exit code (`null` if the process was killed by a signal). */
|
|
76
|
+
exitCode: number | null;
|
|
77
|
+
/** Captured stderr (typically empty on success; carries CLI errors). */
|
|
78
|
+
stderr: string;
|
|
79
|
+
/**
|
|
80
|
+
* Set when the subprocess could not be spawned at all (e.g., the
|
|
81
|
+
* `cursor-agent` binary was not on PATH). The adapter treats this as a
|
|
82
|
+
* permanent install failure rather than a retryable run failure.
|
|
83
|
+
*/
|
|
84
|
+
spawnError: Error | null;
|
|
85
|
+
}
|
|
86
|
+
export interface CursorCliRunArgs {
|
|
87
|
+
binaryPath: string;
|
|
88
|
+
cliArgs: readonly string[];
|
|
89
|
+
env: NodeJS.ProcessEnv;
|
|
90
|
+
cwd: string;
|
|
91
|
+
prompt: string;
|
|
92
|
+
signal?: AbortSignal;
|
|
93
|
+
}
|
|
94
|
+
export type CursorCliRunner = (args: CursorCliRunArgs) => Promise<CursorCliRunOutcome>;
|
|
95
|
+
/**
|
|
96
|
+
* Default production runner. Spawns the CLI, writes the compiled
|
|
97
|
+
* prompt to stdin, parses NDJSON line-by-line from stdout, captures
|
|
98
|
+
* stderr verbatim, resolves once the subprocess exits (or once the
|
|
99
|
+
* AbortSignal fires, in which case the subprocess is killed first).
|
|
100
|
+
*
|
|
101
|
+
* Returns a `spawnError` when spawning itself failed (ENOENT, EACCES,
|
|
102
|
+
* etc.) so the adapter can surface a clear install/binary failure
|
|
103
|
+
* instead of a generic transport error.
|
|
104
|
+
*/
|
|
105
|
+
export declare const defaultCursorCliRunner: CursorCliRunner;
|
|
106
|
+
/**
|
|
107
|
+
* Issue #28 — strict-no-fallback auth resolution. Validates `critic.auth`
|
|
108
|
+
* against the cursor-cli adapter vocabulary
|
|
109
|
+
* ({@link CURSOR_CLI_AUTH_MODES}) and surfaces every misuse as
|
|
110
|
+
* `permanent_failure` so the outer retry loop returns the configuration
|
|
111
|
+
* error immediately (retrying a config mistake just wastes budget).
|
|
112
|
+
*
|
|
113
|
+
* Two failure shapes, both permanent (no retry):
|
|
114
|
+
*
|
|
115
|
+
* 1. `critic.auth === undefined`: profile didn't pin auth. Surfaces
|
|
116
|
+
* as `permanent_failure` with a message naming the critic + the
|
|
117
|
+
* exact config path the operator must edit.
|
|
118
|
+
*
|
|
119
|
+
* 2. `critic.auth` is set but not "chatgpt" (e.g., "api"): this
|
|
120
|
+
* adapter is subscription-only. Error message directs the
|
|
121
|
+
* operator to use the `cursor-sdk` adapter instead (which is
|
|
122
|
+
* designed for API-key auth) — fixing the config rather than
|
|
123
|
+
* muddling adapter responsibilities.
|
|
124
|
+
*/
|
|
125
|
+
export declare function resolveAuthOrFail(critic: CriticConfig, attemptIdx: number): {
|
|
126
|
+
kind: "ok";
|
|
127
|
+
mode: CursorCliAuthMode;
|
|
128
|
+
} | Extract<AttemptOutcome, {
|
|
129
|
+
kind: "permanent_failure";
|
|
130
|
+
}>;
|
|
131
|
+
/**
|
|
132
|
+
* Build the CLI argv array for a review run. Pure function — no env
|
|
133
|
+
* inspection — so the test surface is a flat array. Order is documented
|
|
134
|
+
* by Cursor; the adapter sets every flag explicitly rather than relying
|
|
135
|
+
* on defaults so behavior is reproducible across CLI versions.
|
|
136
|
+
*
|
|
137
|
+
* --print Headless mode (no TUI).
|
|
138
|
+
* --output-format stream-json NDJSON events on stdout.
|
|
139
|
+
* --trust Workspace trust without prompting
|
|
140
|
+
* (only valid with --print).
|
|
141
|
+
* --sandbox enabled Read-only sandbox; blocks file
|
|
142
|
+
* writes even if the model attempts
|
|
143
|
+
* one (defense in depth against
|
|
144
|
+
* untrusted diff content).
|
|
145
|
+
* --model <id> Resolved by resolveCursorCliModelId.
|
|
146
|
+
*
|
|
147
|
+
* The prompt itself is NOT an argv member — it's piped via stdin to
|
|
148
|
+
* sidestep the macOS argv length cap (~256KB) that would truncate
|
|
149
|
+
* review packets with full changed files (config caps
|
|
150
|
+
* `maxChangedFileBytes: 200000`).
|
|
151
|
+
*/
|
|
152
|
+
export declare function buildCursorCliArgs(modelId: string): string[];
|
|
153
|
+
/**
|
|
154
|
+
* Strip `CURSOR_API_KEY` from the subprocess env when auth is pinned to
|
|
155
|
+
* "chatgpt". Belt-and-suspenders against a Doppler-leaked env var
|
|
156
|
+
* routing the run through API-key billing without the operator
|
|
157
|
+
* noticing. The `system.init.apiKeySource` assertion below is the
|
|
158
|
+
* second layer — if a key somehow leaks past this strip, the run still
|
|
159
|
+
* fails closed because `apiKeySource !== "login"`.
|
|
160
|
+
*/
|
|
161
|
+
export declare function buildSubscriptionEnv(base?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
162
|
+
export interface CursorCliAdapterOptions {
|
|
163
|
+
/**
|
|
164
|
+
* Override the cursor-agent binary path. Default: the literal
|
|
165
|
+
* "cursor-agent" (resolved via PATH at spawn time). Tests pass a
|
|
166
|
+
* fixed string to assert which path was probed.
|
|
167
|
+
*/
|
|
168
|
+
binaryPath?: string;
|
|
169
|
+
/**
|
|
170
|
+
* Test escape hatch — inject a scripted subprocess runner. Production
|
|
171
|
+
* uses {@link defaultCursorCliRunner} which actually spawns the CLI.
|
|
172
|
+
*/
|
|
173
|
+
runCursorAgentCli?: CursorCliRunner;
|
|
174
|
+
/**
|
|
175
|
+
* Test escape hatch for the `execFile` doctor-probe wrapper. Production
|
|
176
|
+
* uses the promisified `child_process.execFile`. Tests pass a mock to
|
|
177
|
+
* avoid spawning the real binary and to assert which arguments the
|
|
178
|
+
* doctor probed.
|
|
179
|
+
*/
|
|
180
|
+
execCursorAgent?: (binaryPath: string, args: readonly string[], options?: {
|
|
181
|
+
timeout?: number;
|
|
182
|
+
}) => Promise<{
|
|
183
|
+
stdout: string;
|
|
184
|
+
stderr: string;
|
|
185
|
+
}>;
|
|
186
|
+
/**
|
|
187
|
+
* Test escape hatch for the retry-loop sleep. When unset the adapter
|
|
188
|
+
* uses the real `sleepForRetry` (wall-clock + AbortSignal-aware).
|
|
189
|
+
* Mirrors the same hook on `runRetryLoop` so tests don't have to
|
|
190
|
+
* wait for 5s + 15s of real backoff to exercise retry behavior.
|
|
191
|
+
*/
|
|
192
|
+
sleep?: (idx: number, signal: AbortSignal | undefined) => Promise<void>;
|
|
193
|
+
/**
|
|
194
|
+
* Override the `process.env` snapshot used as the base for the
|
|
195
|
+
* subprocess env. Tests pass a fixed map so the env-strip behavior
|
|
196
|
+
* is hermetic.
|
|
197
|
+
*/
|
|
198
|
+
baseEnv?: NodeJS.ProcessEnv;
|
|
199
|
+
}
|
|
200
|
+
export declare class CursorCliAdapter implements CriticAdapter {
|
|
201
|
+
private readonly options;
|
|
202
|
+
readonly id = "cursor-cli";
|
|
203
|
+
readonly requiredEnvVars: readonly string[];
|
|
204
|
+
private readonly run;
|
|
205
|
+
private readonly exec;
|
|
206
|
+
constructor(options?: CursorCliAdapterOptions);
|
|
207
|
+
review(packet: ReviewPacket, critic: CriticConfig, options: CriticReviewOptions): Promise<CriticResult>;
|
|
208
|
+
private attemptReview;
|
|
209
|
+
doctor(critic: CriticConfig): Promise<DoctorCheck[]>;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=cursor-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-cli.d.ts","sourceRoot":"","sources":["../../src/adapters/cursor-cli.ts"],"names":[],"mappings":"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"}
|