@momentiq/dark-factory-cli 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/static-schema-lint.js +1 -1
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/onboard.d.ts +64 -1
- package/dist/commands/onboard.d.ts.map +1 -1
- package/dist/commands/onboard.js +265 -53
- package/dist/commands/onboard.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +20 -0
- package/dist/doctor.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/onboard.d.ts +6 -0
- package/dist/mcp/tools/onboard.d.ts.map +1 -0
- package/dist/mcp/tools/onboard.js +115 -0
- package/dist/mcp/tools/onboard.js.map +1 -0
- package/dist/onboard/apply-plan.d.ts +29 -0
- package/dist/onboard/apply-plan.d.ts.map +1 -0
- package/dist/onboard/apply-plan.js +80 -0
- package/dist/onboard/apply-plan.js.map +1 -0
- package/dist/onboard/auto-profile.d.ts +3 -0
- package/dist/onboard/auto-profile.d.ts.map +1 -0
- package/dist/onboard/auto-profile.js +20 -0
- package/dist/onboard/auto-profile.js.map +1 -0
- package/dist/onboard/generate-plan.d.ts +18 -0
- package/dist/onboard/generate-plan.d.ts.map +1 -0
- package/dist/onboard/generate-plan.js +68 -0
- package/dist/onboard/generate-plan.js.map +1 -0
- package/dist/onboard/llm-client.d.ts +45 -0
- package/dist/onboard/llm-client.d.ts.map +1 -0
- package/dist/onboard/llm-client.js +84 -0
- package/dist/onboard/llm-client.js.map +1 -0
- package/dist/onboard/prompts/scaffold.md +93 -0
- package/dist/onboard/prompts.d.ts +13 -0
- package/dist/onboard/prompts.d.ts.map +1 -0
- package/dist/onboard/prompts.js +54 -0
- package/dist/onboard/prompts.js.map +1 -0
- package/dist/onboard/scaffold-schema.d.ts +194 -0
- package/dist/onboard/scaffold-schema.d.ts.map +1 -0
- package/dist/onboard/scaffold-schema.js +73 -0
- package/dist/onboard/scaffold-schema.js.map +1 -0
- package/dist/onboard/schema.d.ts.map +1 -1
- package/dist/onboard/schema.js +7 -1
- package/dist/onboard/schema.js.map +1 -1
- package/dist/onboard/seeders/adr.d.ts +3 -0
- package/dist/onboard/seeders/adr.d.ts.map +1 -0
- package/dist/onboard/seeders/adr.js +212 -0
- package/dist/onboard/seeders/adr.js.map +1 -0
- package/dist/onboard/seeders/agent-review-config/cloud.canonical.json +22 -0
- package/dist/onboard/seeders/agent-review-config/local.canonical.json +21 -0
- package/dist/onboard/seeders/agent-review-config.d.ts +3 -0
- package/dist/onboard/seeders/agent-review-config.d.ts.map +1 -0
- package/dist/onboard/seeders/agent-review-config.js +38 -0
- package/dist/onboard/seeders/agent-review-config.js.map +1 -0
- package/dist/onboard/seeders/cycle1-bootstrap.d.ts +3 -0
- package/dist/onboard/seeders/cycle1-bootstrap.d.ts.map +1 -0
- package/dist/onboard/seeders/cycle1-bootstrap.js +76 -0
- package/dist/onboard/seeders/cycle1-bootstrap.js.map +1 -0
- package/dist/onboard/seeders/index.d.ts +47 -0
- package/dist/onboard/seeders/index.d.ts.map +1 -0
- package/dist/onboard/seeders/index.js +37 -0
- package/dist/onboard/seeders/index.js.map +1 -0
- package/dist/onboard/seeders/runbook.d.ts +13 -0
- package/dist/onboard/seeders/runbook.d.ts.map +1 -0
- package/dist/onboard/seeders/runbook.js +85 -0
- package/dist/onboard/seeders/runbook.js.map +1 -0
- package/dist/onboard/seeders/templates/adr.md.tmpl +26 -0
- package/dist/onboard/seeders/templates/cycle1-bootstrap.md.tmpl +64 -0
- package/dist/onboard/seeders/templates/runbook.md.tmpl +26 -0
- package/dist/onboard/template-loader.d.ts +20 -0
- package/dist/onboard/template-loader.d.ts.map +1 -0
- package/dist/onboard/template-loader.js +143 -0
- package/dist/onboard/template-loader.js.map +1 -0
- package/dist/onboard/template-ref.d.ts +15 -0
- package/dist/onboard/template-ref.d.ts.map +1 -0
- package/dist/onboard/template-ref.js +45 -0
- package/dist/onboard/template-ref.js.map +1 -0
- package/dist/onboard/validate.d.ts +19 -0
- package/dist/onboard/validate.d.ts.map +1 -0
- package/dist/onboard/validate.js +127 -0
- package/dist/onboard/validate.js.map +1 -0
- package/dist/onboard/writers/dry-run-renderer.d.ts +6 -0
- package/dist/onboard/writers/dry-run-renderer.d.ts.map +1 -0
- package/dist/onboard/writers/dry-run-renderer.js +88 -0
- package/dist/onboard/writers/dry-run-renderer.js.map +1 -0
- package/dist/onboard/writers/emit.d.ts +6 -0
- package/dist/onboard/writers/emit.d.ts.map +1 -0
- package/dist/onboard/writers/emit.js +29 -0
- package/dist/onboard/writers/emit.js.map +1 -0
- package/dist/onboard/writers/merge.d.ts +16 -0
- package/dist/onboard/writers/merge.d.ts.map +1 -0
- package/dist/onboard/writers/merge.js +142 -0
- package/dist/onboard/writers/merge.js.map +1 -0
- package/dist/onboard/writers/pr-writer.d.ts +44 -0
- package/dist/onboard/writers/pr-writer.d.ts.map +1 -0
- package/dist/onboard/writers/pr-writer.js +104 -0
- package/dist/onboard/writers/pr-writer.js.map +1 -0
- package/dist/onboard/writers/skip.d.ts +9 -0
- package/dist/onboard/writers/skip.d.ts.map +1 -0
- package/dist/onboard/writers/skip.js +9 -0
- package/dist/onboard/writers/skip.js.map +1 -0
- package/package.json +4 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// packages/cli/src/onboard/writers/merge.ts
|
|
2
|
+
//
|
|
3
|
+
// CLAUDE.md / AGENTS.md additive-append merge. THE Cycle 15 risk surface.
|
|
4
|
+
//
|
|
5
|
+
// Contract:
|
|
6
|
+
// - First run: append `\n<BEGIN>\n<tailored_content>\n<END>\n` after the
|
|
7
|
+
// existing file. NEVER touches the existing bytes.
|
|
8
|
+
// - Re-run: if BEGIN/END pair is found, REPLACE the content between them
|
|
9
|
+
// with the new tailored_content; preserve everything else byte-for-byte.
|
|
10
|
+
// - Parse failure (binary, > 128 KB, unbalanced fences): SKIP — leave the
|
|
11
|
+
// file untouched, emit a stderr warning. Non-fatal.
|
|
12
|
+
//
|
|
13
|
+
// The file is treated as bytes-on-disk; the heading parse is only used as a
|
|
14
|
+
// sanity gate (Phase B never NEEDS the heading list for the merge — that's a
|
|
15
|
+
// Phase A docs-analyzer concern).
|
|
16
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
17
|
+
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
18
|
+
export const BEGIN_MARKER = "<!-- df onboard: inserted-by-cycle-15 BEGIN -->";
|
|
19
|
+
export const END_MARKER = "<!-- df onboard: inserted-by-cycle-15 END -->";
|
|
20
|
+
const MAX_TARGET_SIZE = 128 * 1024;
|
|
21
|
+
function safeResolve(root, p) {
|
|
22
|
+
if (isAbsolute(p)) {
|
|
23
|
+
throw new Error(`df onboard: refuses to merge to absolute path "${p}" (outside the target root).`);
|
|
24
|
+
}
|
|
25
|
+
const resolved = resolve(root, p);
|
|
26
|
+
const rel = relative(root, resolved);
|
|
27
|
+
if (rel.startsWith("..") || isAbsolute(rel)) {
|
|
28
|
+
throw new Error(`df onboard: path traversal blocked — "${p}" resolves outside the target root.`);
|
|
29
|
+
}
|
|
30
|
+
return resolved;
|
|
31
|
+
}
|
|
32
|
+
function isBinaryBuffer(buf) {
|
|
33
|
+
const cap = Math.min(buf.length, 8192);
|
|
34
|
+
for (let i = 0; i < cap; i++)
|
|
35
|
+
if (buf[i] === 0)
|
|
36
|
+
return true;
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
// Best-effort fence balance check. Counts unescaped triple-backtick runs; an
|
|
40
|
+
// odd count means an unpaired fence (or a fence inside another fence — both
|
|
41
|
+
// are conditions where the heading regex can't safely traverse the file).
|
|
42
|
+
function fencesBalanced(text) {
|
|
43
|
+
// Lines starting with ``` (possibly preceded by spaces) toggle fence state.
|
|
44
|
+
let inFence = false;
|
|
45
|
+
for (const line of text.split(/\r?\n/)) {
|
|
46
|
+
if (/^\s*```/.test(line))
|
|
47
|
+
inFence = !inFence;
|
|
48
|
+
}
|
|
49
|
+
return !inFence;
|
|
50
|
+
}
|
|
51
|
+
// Heading detector — same `^#{1,6}\s+(.+)$` regex Phase A's docs analyzer
|
|
52
|
+
// (`docs.ts`) uses, with the same fenced-code-block tracking so a `# inside
|
|
53
|
+
// code` line in a code block doesn't count. The merge handler skips files
|
|
54
|
+
// with zero detected headings: appending after a heading-less prose blob
|
|
55
|
+
// (or YAML, or boilerplate) would yield a structurally surprising file the
|
|
56
|
+
// operator probably didn't intend to mark up. Per B-D6.
|
|
57
|
+
const HEADING_RE = /^#{1,6}\s+(.+)$/;
|
|
58
|
+
function detectHeadings(text) {
|
|
59
|
+
const out = [];
|
|
60
|
+
let inFence = false;
|
|
61
|
+
for (const line of text.split(/\r?\n/)) {
|
|
62
|
+
if (/^\s*```/.test(line)) {
|
|
63
|
+
inFence = !inFence;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (inFence)
|
|
67
|
+
continue;
|
|
68
|
+
const m = line.match(HEADING_RE);
|
|
69
|
+
if (m)
|
|
70
|
+
out.push(m[1]);
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
function findMarkerBlock(text) {
|
|
75
|
+
const start = text.indexOf(BEGIN_MARKER);
|
|
76
|
+
if (start < 0)
|
|
77
|
+
return null;
|
|
78
|
+
const endRel = text.indexOf(END_MARKER, start + BEGIN_MARKER.length);
|
|
79
|
+
if (endRel < 0)
|
|
80
|
+
return null;
|
|
81
|
+
const end = endRel + END_MARKER.length;
|
|
82
|
+
return { start, end };
|
|
83
|
+
}
|
|
84
|
+
function replaceMarkerBlock(text, content, block) {
|
|
85
|
+
const before = text.slice(0, block.start);
|
|
86
|
+
const after = text.slice(block.end);
|
|
87
|
+
return `${before}${BEGIN_MARKER}\n${content}${content.endsWith("\n") ? "" : "\n"}${END_MARKER}${after}`;
|
|
88
|
+
}
|
|
89
|
+
function appendMarkerBlock(text, content) {
|
|
90
|
+
// Normalize so the file ends with exactly one newline, then add a blank line,
|
|
91
|
+
// the BEGIN marker, content, END marker, and a trailing newline.
|
|
92
|
+
let base = text;
|
|
93
|
+
if (!base.endsWith("\n"))
|
|
94
|
+
base += "\n";
|
|
95
|
+
const block = `\n${BEGIN_MARKER}\n${content}${content.endsWith("\n") ? "" : "\n"}${END_MARKER}\n`;
|
|
96
|
+
return base + block;
|
|
97
|
+
}
|
|
98
|
+
export async function writeMerge(rootDir, plan, opts = {}) {
|
|
99
|
+
const abs = safeResolve(rootDir, plan.path);
|
|
100
|
+
// Fall-back to emit semantics if target absent.
|
|
101
|
+
let existing;
|
|
102
|
+
try {
|
|
103
|
+
existing = await readFile(abs);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
await mkdir(dirname(abs), { recursive: true });
|
|
107
|
+
await writeFile(abs, plan.tailored_content, "utf8");
|
|
108
|
+
return {
|
|
109
|
+
path: plan.path, action: "merge", wrote: true, skipped: false, fellBackToEmit: true,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// Parse-error gates.
|
|
113
|
+
if (existing.length > MAX_TARGET_SIZE) {
|
|
114
|
+
const reason = `target size ${existing.length} bytes exceeds 128 KB cap`;
|
|
115
|
+
opts.stderr?.(`df onboard: merge skipped for ${plan.path} — ${reason}; file left untouched.\n`);
|
|
116
|
+
return { path: plan.path, action: "merge", wrote: false, skipped: true, reason };
|
|
117
|
+
}
|
|
118
|
+
if (isBinaryBuffer(existing)) {
|
|
119
|
+
const reason = "target is binary";
|
|
120
|
+
opts.stderr?.(`df onboard: merge skipped for ${plan.path} — ${reason}; file left untouched.\n`);
|
|
121
|
+
return { path: plan.path, action: "merge", wrote: false, skipped: true, reason };
|
|
122
|
+
}
|
|
123
|
+
const text = existing.toString("utf8");
|
|
124
|
+
if (!fencesBalanced(text)) {
|
|
125
|
+
const reason = "could not parse headings — unbalanced fenced code blocks";
|
|
126
|
+
opts.stderr?.(`df onboard: merge skipped for ${plan.path} — ${reason}; file left untouched.\n`);
|
|
127
|
+
return { path: plan.path, action: "merge", wrote: false, skipped: true, reason };
|
|
128
|
+
}
|
|
129
|
+
if (detectHeadings(text).length === 0) {
|
|
130
|
+
const reason = "could not parse headings — no headings detected";
|
|
131
|
+
opts.stderr?.(`df onboard: merge skipped for ${plan.path} — ${reason}; file left untouched.\n`);
|
|
132
|
+
return { path: plan.path, action: "merge", wrote: false, skipped: true, reason };
|
|
133
|
+
}
|
|
134
|
+
// Re-run case: replace the existing marker block; preserve all bytes outside.
|
|
135
|
+
const block = findMarkerBlock(text);
|
|
136
|
+
const next = block
|
|
137
|
+
? replaceMarkerBlock(text, plan.tailored_content, block)
|
|
138
|
+
: appendMarkerBlock(text, plan.tailored_content);
|
|
139
|
+
await writeFile(abs, next, "utf8");
|
|
140
|
+
return { path: plan.path, action: "merge", wrote: true, skipped: false };
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/onboard/writers/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ScaffoldPlan } from "../scaffold-schema.js";
|
|
2
|
+
export type SubprocessRunner = (cmd: string, args: string[], opts?: {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
}) => Promise<{
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare const defaultRunner: SubprocessRunner;
|
|
9
|
+
export interface PrModeOptions {
|
|
10
|
+
run?: SubprocessRunner;
|
|
11
|
+
canonicalName: string;
|
|
12
|
+
/** Resolved default-branch name (e.g. "main"). Comes from
|
|
13
|
+
* `analysis.git.defaultBranch` — Phase A resolves it ONCE via
|
|
14
|
+
* `git symbolic-ref refs/remotes/origin/HEAD` with HEAD fallback. For
|
|
15
|
+
* repos where Phase A's heuristic misses (non-`origin` remote, shallow
|
|
16
|
+
* clone, local-only repo, missing remote HEAD) the empty-string value
|
|
17
|
+
* triggers runPrMode's defensive "main" fallback. Hardening tracked at
|
|
18
|
+
* DFP #262. */
|
|
19
|
+
defaultBranch: string;
|
|
20
|
+
force?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface PrModeResult {
|
|
23
|
+
branch: string;
|
|
24
|
+
prUrl: string;
|
|
25
|
+
}
|
|
26
|
+
/** Preflight check #1 — `gh` CLI authenticated.
|
|
27
|
+
* Stream-portability note: `gh auth status` has historically split the
|
|
28
|
+
* "Logged in to github.com" banner between stdout and stderr across
|
|
29
|
+
* versions. We concatenate both streams before matching so the check is
|
|
30
|
+
* robust to either shape (cli/cli#7019 / #7619). */
|
|
31
|
+
export declare function preflightGhAuth(run: SubprocessRunner, rootDir: string): Promise<void>;
|
|
32
|
+
/** Preflight check #2 — working tree is clean.
|
|
33
|
+
* Replaces the older default-branch-block check. A dirty worktree is the
|
|
34
|
+
* real footgun (the dirty changes flow into the new df/onboard-<sha8>
|
|
35
|
+
* branch silently); a clean main is harmless because the --pr writer
|
|
36
|
+
* creates a NEW branch regardless. */
|
|
37
|
+
export declare function preflightCleanWorktree(run: SubprocessRunner, rootDir: string): Promise<void>;
|
|
38
|
+
/** Single entry point for the two cheap, deterministic preflight checks.
|
|
39
|
+
* cmdOnboard MUST call this BEFORE generatePlan so operators don't pay an
|
|
40
|
+
* LLM round-trip just to discover gh isn't logged in or their worktree is
|
|
41
|
+
* dirty. */
|
|
42
|
+
export declare function preflightPr(run: SubprocessRunner, rootDir: string): Promise<void>;
|
|
43
|
+
export declare function runPrMode(rootDir: string, plan: ScaffoldPlan, analysisSha8: string, opts: PrModeOptions, stderr?: (s: string) => void): Promise<PrModeResult>;
|
|
44
|
+
//# sourceMappingURL=pr-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-writer.d.ts","sourceRoot":"","sources":["../../../src/onboard/writers/pr-writer.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,MAAM,MAAM,gBAAgB,GAAG,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KACpB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,eAAO,MAAM,aAAa,EAAE,gBAG3B,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;;oBAMgB;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;qDAIqD;AACrD,wBAAsB,eAAe,CACnC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;;uCAIuC;AACvC,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;aAGa;AACb,wBAAsB,WAAW,CAC/B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,YAAY,EAClB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,aAAa,EACnB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAC3B,OAAO,CAAC,YAAY,CAAC,CAuDvB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// packages/cli/src/onboard/writers/pr-writer.ts
|
|
2
|
+
//
|
|
3
|
+
// --pr mode: gh-auth precondition + branch + applyPlan + commit + gh pr create.
|
|
4
|
+
// Subprocess calls run through SubprocessRunner so unit tests stub them out.
|
|
5
|
+
import { execFile } from "node:child_process";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { applyPlan } from "../apply-plan.js";
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
export const defaultRunner = async (cmd, args, opts) => {
|
|
10
|
+
const result = await execFileAsync(cmd, args, opts?.cwd !== undefined ? { cwd: opts.cwd } : {});
|
|
11
|
+
return { stdout: String(result.stdout), stderr: String(result.stderr) };
|
|
12
|
+
};
|
|
13
|
+
/** Preflight check #1 — `gh` CLI authenticated.
|
|
14
|
+
* Stream-portability note: `gh auth status` has historically split the
|
|
15
|
+
* "Logged in to github.com" banner between stdout and stderr across
|
|
16
|
+
* versions. We concatenate both streams before matching so the check is
|
|
17
|
+
* robust to either shape (cli/cli#7019 / #7619). */
|
|
18
|
+
export async function preflightGhAuth(run, rootDir) {
|
|
19
|
+
try {
|
|
20
|
+
const { stdout, stderr } = await run("gh", ["auth", "status"], { cwd: rootDir });
|
|
21
|
+
const combined = `${stdout ?? ""}\n${stderr ?? ""}`;
|
|
22
|
+
if (!/Logged in to github\.com/.test(combined)) {
|
|
23
|
+
throw new Error("gh auth status did not show github.com login");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
throw new Error(`df onboard: --pr mode requires gh CLI authentication. ` +
|
|
28
|
+
`Run \`gh auth login\` and re-try. (underlying: ${e.message})`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Preflight check #2 — working tree is clean.
|
|
32
|
+
* Replaces the older default-branch-block check. A dirty worktree is the
|
|
33
|
+
* real footgun (the dirty changes flow into the new df/onboard-<sha8>
|
|
34
|
+
* branch silently); a clean main is harmless because the --pr writer
|
|
35
|
+
* creates a NEW branch regardless. */
|
|
36
|
+
export async function preflightCleanWorktree(run, rootDir) {
|
|
37
|
+
const { stdout } = await run("git", ["status", "--porcelain"], { cwd: rootDir });
|
|
38
|
+
const dirty = stdout.split("\n").filter((l) => l.trim().length > 0);
|
|
39
|
+
if (dirty.length > 0) {
|
|
40
|
+
const sample = dirty.slice(0, 20).join("\n");
|
|
41
|
+
const more = dirty.length > 20 ? `\n ... ${dirty.length - 20} more` : "";
|
|
42
|
+
throw new Error(`df onboard: refuses --pr with a dirty working tree (${dirty.length} ${dirty.length === 1 ? "path" : "paths"}). ` +
|
|
43
|
+
`Commit or stash before re-running, or use --apply for an in-place write that doesn't open a PR.\n` +
|
|
44
|
+
`Dirty paths:\n${sample}${more}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Single entry point for the two cheap, deterministic preflight checks.
|
|
48
|
+
* cmdOnboard MUST call this BEFORE generatePlan so operators don't pay an
|
|
49
|
+
* LLM round-trip just to discover gh isn't logged in or their worktree is
|
|
50
|
+
* dirty. */
|
|
51
|
+
export async function preflightPr(run, rootDir) {
|
|
52
|
+
await preflightGhAuth(run, rootDir);
|
|
53
|
+
await preflightCleanWorktree(run, rootDir);
|
|
54
|
+
}
|
|
55
|
+
export async function runPrMode(rootDir, plan, analysisSha8, opts, stderr) {
|
|
56
|
+
const run = opts.run ?? defaultRunner;
|
|
57
|
+
await preflightPr(run, rootDir);
|
|
58
|
+
// Defensive defaultBranch fallback (DFP #262). Phase B does NOT re-resolve;
|
|
59
|
+
// we fall back to "main" so `--base ""` is impossible, and warn loudly so
|
|
60
|
+
// the operator notices.
|
|
61
|
+
let defaultBranch = opts.defaultBranch;
|
|
62
|
+
if (!defaultBranch || defaultBranch.trim().length === 0) {
|
|
63
|
+
(stderr ?? ((s) => process.stderr.write(s)))("df onboard: WARNING — analysis.git.defaultBranch is empty; falling back to \"main\" for `gh pr create --base`. " +
|
|
64
|
+
"Hardening tracked at https://github.com/momentiq-ai/dark-factory-platform/issues/262.\n");
|
|
65
|
+
defaultBranch = "main";
|
|
66
|
+
}
|
|
67
|
+
const branch = `df/onboard-${analysisSha8}`;
|
|
68
|
+
const switchFlag = opts.force ? "-C" : "-c";
|
|
69
|
+
await run("git", ["switch", switchFlag, branch], { cwd: rootDir });
|
|
70
|
+
await applyPlan(rootDir, plan, opts.force !== undefined ? { mode: "apply", force: opts.force } : { mode: "apply" });
|
|
71
|
+
const commitMsg = `feat: df onboard scaffold (${opts.canonicalName}) — cycle 15 Phase B\n\n` +
|
|
72
|
+
`Tailored scaffold from template ${plan.templateRef}.\n` +
|
|
73
|
+
`Plan summary: ${plan.summary}\n`;
|
|
74
|
+
await run("git", ["add", "-A"], { cwd: rootDir });
|
|
75
|
+
await run("git", ["commit", "-m", commitMsg], { cwd: rootDir });
|
|
76
|
+
await run("git", ["push", "-u", "origin", branch], { cwd: rootDir });
|
|
77
|
+
const title = `feat: df onboard scaffold for ${opts.canonicalName}`;
|
|
78
|
+
const bodyLines = [];
|
|
79
|
+
bodyLines.push("## Summary");
|
|
80
|
+
bodyLines.push("");
|
|
81
|
+
bodyLines.push(plan.summary);
|
|
82
|
+
bodyLines.push("");
|
|
83
|
+
bodyLines.push("## Per-file actions");
|
|
84
|
+
bodyLines.push("");
|
|
85
|
+
bodyLines.push("```json");
|
|
86
|
+
bodyLines.push(JSON.stringify({
|
|
87
|
+
templateRef: plan.templateRef,
|
|
88
|
+
generatedAtIso: plan.generatedAtIso,
|
|
89
|
+
files: plan.files.map((f) => ({ path: f.path, action: f.action, rationale: f.rationale })),
|
|
90
|
+
}, null, 2));
|
|
91
|
+
bodyLines.push("```");
|
|
92
|
+
bodyLines.push("");
|
|
93
|
+
bodyLines.push("Generated by `df onboard --pr` (Dark Factory CLI cycle 15 Phase B).");
|
|
94
|
+
const { stdout } = await run("gh", [
|
|
95
|
+
"pr", "create",
|
|
96
|
+
"--title", title,
|
|
97
|
+
"--body", bodyLines.join("\n"),
|
|
98
|
+
"--base", defaultBranch,
|
|
99
|
+
"--head", branch,
|
|
100
|
+
], { cwd: rootDir });
|
|
101
|
+
const prUrl = stdout.trim().split(/\s+/).pop() ?? "";
|
|
102
|
+
return { branch, prUrl };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=pr-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-writer.js","sourceRoot":"","sources":["../../../src/onboard/writers/pr-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SkipFilePlan } from "../scaffold-schema.js";
|
|
2
|
+
export interface SkipResult {
|
|
3
|
+
path: string;
|
|
4
|
+
action: "skip";
|
|
5
|
+
rationale: string;
|
|
6
|
+
wrote: false;
|
|
7
|
+
}
|
|
8
|
+
export declare function writeSkip(_rootDir: string, plan: SkipFilePlan): Promise<SkipResult>;
|
|
9
|
+
//# sourceMappingURL=skip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skip.d.ts","sourceRoot":"","sources":["../../../src/onboard/writers/skip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAOzF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skip.js","sourceRoot":"","sources":["../../../src/onboard/writers/skip.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,IAAkB;IAClE,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@momentiq/dark-factory-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Dark Factory OSS CLI — multi-vendor adversarial critic orchestration (Cursor, Codex, Gemini, Grok) with min-complete-quorum aggregation and trusted-surface rebind",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://momentiq.ai/dark-factory",
|
|
@@ -93,6 +93,7 @@
|
|
|
93
93
|
"node": ">=20"
|
|
94
94
|
},
|
|
95
95
|
"dependencies": {
|
|
96
|
+
"@anthropic-ai/sdk": "^0.100.1",
|
|
96
97
|
"@cursor/sdk": "^1.0.12",
|
|
97
98
|
"@google/genai": "^2.2.0",
|
|
98
99
|
"@iarna/toml": "2.2.5",
|
|
@@ -102,12 +103,14 @@
|
|
|
102
103
|
"@yarnpkg/lockfile": "1.1.0",
|
|
103
104
|
"ajv": "^8.20.0",
|
|
104
105
|
"ajv-formats": "^3.0.1",
|
|
106
|
+
"diff": "^5.2.2",
|
|
105
107
|
"openai": "^6.37.0",
|
|
106
108
|
"yaml": "^2.9.0",
|
|
107
109
|
"zod": "^3.23.0",
|
|
108
110
|
"zod-to-json-schema": "^3.25.2"
|
|
109
111
|
},
|
|
110
112
|
"devDependencies": {
|
|
113
|
+
"@types/diff": "^5.2.3",
|
|
111
114
|
"@types/node": "^20.11.0",
|
|
112
115
|
"@types/yarnpkg__lockfile": "^1.1.9",
|
|
113
116
|
"@vitest/coverage-v8": "^2.1.9",
|