@dougharness/cli 1.0.1

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 (144) hide show
  1. package/LICENSE +21 -0
  2. package/dist/ablate.d.ts +96 -0
  3. package/dist/ablate.js +440 -0
  4. package/dist/ablate.js.map +1 -0
  5. package/dist/apply.d.ts +2 -0
  6. package/dist/apply.js +19 -0
  7. package/dist/apply.js.map +1 -0
  8. package/dist/bin.d.ts +2 -0
  9. package/dist/bin.js +80 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/board-page.d.ts +15 -0
  12. package/dist/board-page.js +27 -0
  13. package/dist/board-page.js.map +1 -0
  14. package/dist/board-serve-process.d.ts +24 -0
  15. package/dist/board-serve-process.js +227 -0
  16. package/dist/board-serve-process.js.map +1 -0
  17. package/dist/board-serve.d.ts +9 -0
  18. package/dist/board-serve.js +302 -0
  19. package/dist/board-serve.js.map +1 -0
  20. package/dist/board.d.ts +6 -0
  21. package/dist/board.js +515 -0
  22. package/dist/board.js.map +1 -0
  23. package/dist/detect/fs.d.ts +6 -0
  24. package/dist/detect/fs.js +50 -0
  25. package/dist/detect/fs.js.map +1 -0
  26. package/dist/detect/index.d.ts +3 -0
  27. package/dist/detect/index.js +13 -0
  28. package/dist/detect/index.js.map +1 -0
  29. package/dist/detect/node.d.ts +3 -0
  30. package/dist/detect/node.js +179 -0
  31. package/dist/detect/node.js.map +1 -0
  32. package/dist/detect/python.d.ts +2 -0
  33. package/dist/detect/python.js +388 -0
  34. package/dist/detect/python.js.map +1 -0
  35. package/dist/detect/repo.d.ts +2 -0
  36. package/dist/detect/repo.js +102 -0
  37. package/dist/detect/repo.js.map +1 -0
  38. package/dist/detect/types.d.ts +98 -0
  39. package/dist/detect/types.js +2 -0
  40. package/dist/detect/types.js.map +1 -0
  41. package/dist/diff.d.ts +12 -0
  42. package/dist/diff.js +105 -0
  43. package/dist/diff.js.map +1 -0
  44. package/dist/generate/agents.d.ts +19 -0
  45. package/dist/generate/agents.js +184 -0
  46. package/dist/generate/agents.js.map +1 -0
  47. package/dist/generate/claude-md.d.ts +9 -0
  48. package/dist/generate/claude-md.js +111 -0
  49. package/dist/generate/claude-md.js.map +1 -0
  50. package/dist/generate/config.d.ts +51 -0
  51. package/dist/generate/config.js +155 -0
  52. package/dist/generate/config.js.map +1 -0
  53. package/dist/generate/proposal.d.ts +11 -0
  54. package/dist/generate/proposal.js +175 -0
  55. package/dist/generate/proposal.js.map +1 -0
  56. package/dist/generate/settings.d.ts +35 -0
  57. package/dist/generate/settings.js +213 -0
  58. package/dist/generate/settings.js.map +1 -0
  59. package/dist/generate/skills.d.ts +8 -0
  60. package/dist/generate/skills.js +264 -0
  61. package/dist/generate/skills.js.map +1 -0
  62. package/dist/init.d.ts +10 -0
  63. package/dist/init.js +69 -0
  64. package/dist/init.js.map +1 -0
  65. package/dist/trace.d.ts +9 -0
  66. package/dist/trace.js +106 -0
  67. package/dist/trace.js.map +1 -0
  68. package/node_modules/@dougharness/flow/.claude-plugin/plugin.json +10 -0
  69. package/node_modules/@dougharness/flow/LICENSE +21 -0
  70. package/node_modules/@dougharness/flow/agents/adversary-claude.md +33 -0
  71. package/node_modules/@dougharness/flow/agents/adversary.md +29 -0
  72. package/node_modules/@dougharness/flow/agents/implementer.md +23 -0
  73. package/node_modules/@dougharness/flow/agents/lead.md +35 -0
  74. package/node_modules/@dougharness/flow/agents/planner.md +70 -0
  75. package/node_modules/@dougharness/flow/agents/researcher.md +31 -0
  76. package/node_modules/@dougharness/flow/agents/reviewer.md +26 -0
  77. package/node_modules/@dougharness/flow/agents/verifier.md +24 -0
  78. package/node_modules/@dougharness/flow/lib/board.mjs +840 -0
  79. package/node_modules/@dougharness/flow/lib/code-index.mjs +629 -0
  80. package/node_modules/@dougharness/flow/lib/cost.mjs +392 -0
  81. package/node_modules/@dougharness/flow/lib/decisions.mjs +314 -0
  82. package/node_modules/@dougharness/flow/lib/embeddings.mjs +539 -0
  83. package/node_modules/@dougharness/flow/lib/land.mjs +219 -0
  84. package/node_modules/@dougharness/flow/lib/learn.mjs +742 -0
  85. package/node_modules/@dougharness/flow/lib/memory-import.mjs +145 -0
  86. package/node_modules/@dougharness/flow/lib/memory.mjs +1641 -0
  87. package/node_modules/@dougharness/flow/lib/models.mjs +148 -0
  88. package/node_modules/@dougharness/flow/lib/plan.mjs +773 -0
  89. package/node_modules/@dougharness/flow/lib/rehearse.mjs +825 -0
  90. package/node_modules/@dougharness/flow/lib/worktrees.mjs +215 -0
  91. package/node_modules/@dougharness/flow/package.json +19 -0
  92. package/node_modules/@dougharness/flow/scripts/board.mjs +260 -0
  93. package/node_modules/@dougharness/flow/scripts/cost.mjs +66 -0
  94. package/node_modules/@dougharness/flow/scripts/learn.mjs +161 -0
  95. package/node_modules/@dougharness/flow/scripts/memory.mjs +1274 -0
  96. package/node_modules/@dougharness/flow/scripts/plan.mjs +547 -0
  97. package/node_modules/@dougharness/flow/scripts/rehearse.mjs +129 -0
  98. package/node_modules/@dougharness/flow/skills/core-next/SKILL.md +92 -0
  99. package/node_modules/@dougharness/flow/skills/doug-approve/SKILL.md +15 -0
  100. package/node_modules/@dougharness/flow/skills/doug-decide/SKILL.md +26 -0
  101. package/node_modules/@dougharness/flow/skills/doug-implement/SKILL.md +22 -0
  102. package/node_modules/@dougharness/flow/skills/doug-learn/SKILL.md +20 -0
  103. package/node_modules/@dougharness/flow/skills/doug-next/SKILL.md +87 -0
  104. package/node_modules/@dougharness/flow/skills/doug-plan/SKILL.md +22 -0
  105. package/node_modules/@dougharness/flow/skills/doug-swarm/SKILL.md +55 -0
  106. package/node_modules/@dougharness/flow/skills/harness-fix/SKILL.md +85 -0
  107. package/node_modules/@dougharness/flow/skills/research/SKILL.md +41 -0
  108. package/node_modules/@dougharness/flow/skills/run-report/SKILL.md +51 -0
  109. package/node_modules/@dougharness/flow/skills/swarm-launch/SKILL.md +27 -0
  110. package/node_modules/@dougharness/flow/workflows/doug-implement.js +2687 -0
  111. package/node_modules/@dougharness/gates/.claude-plugin/plugin.json +10 -0
  112. package/node_modules/@dougharness/gates/LICENSE +21 -0
  113. package/node_modules/@dougharness/gates/hooks/hooks.json +184 -0
  114. package/node_modules/@dougharness/gates/lib/agent-context.mjs +111 -0
  115. package/node_modules/@dougharness/gates/lib/anchor.mjs +110 -0
  116. package/node_modules/@dougharness/gates/lib/baseline.mjs +160 -0
  117. package/node_modules/@dougharness/gates/lib/bash-rules.mjs +1522 -0
  118. package/node_modules/@dougharness/gates/lib/block-ledger.mjs +127 -0
  119. package/node_modules/@dougharness/gates/lib/checkpoint.mjs +97 -0
  120. package/node_modules/@dougharness/gates/lib/config.mjs +168 -0
  121. package/node_modules/@dougharness/gates/lib/evidence.mjs +59 -0
  122. package/node_modules/@dougharness/gates/lib/glob.mjs +86 -0
  123. package/node_modules/@dougharness/gates/lib/io.mjs +91 -0
  124. package/node_modules/@dougharness/gates/lib/paths.mjs +101 -0
  125. package/node_modules/@dougharness/gates/lib/proposals.mjs +201 -0
  126. package/node_modules/@dougharness/gates/lib/run.mjs +147 -0
  127. package/node_modules/@dougharness/gates/lib/scope.mjs +117 -0
  128. package/node_modules/@dougharness/gates/lib/secret-rules.mjs +268 -0
  129. package/node_modules/@dougharness/gates/lib/state.mjs +114 -0
  130. package/node_modules/@dougharness/gates/lib/trace.mjs +196 -0
  131. package/node_modules/@dougharness/gates/package.json +17 -0
  132. package/node_modules/@dougharness/gates/scripts/edit-loop.mjs +39 -0
  133. package/node_modules/@dougharness/gates/scripts/format-on-edit.mjs +45 -0
  134. package/node_modules/@dougharness/gates/scripts/guard-bash.mjs +32 -0
  135. package/node_modules/@dougharness/gates/scripts/protect-paths.mjs +49 -0
  136. package/node_modules/@dougharness/gates/scripts/reanchor.mjs +81 -0
  137. package/node_modules/@dougharness/gates/scripts/research-cap.mjs +295 -0
  138. package/node_modules/@dougharness/gates/scripts/secret-scan.mjs +26 -0
  139. package/node_modules/@dougharness/gates/scripts/session-start-baseline.mjs +57 -0
  140. package/node_modules/@dougharness/gates/scripts/statusline.mjs +133 -0
  141. package/node_modules/@dougharness/gates/scripts/stop-gate.mjs +1422 -0
  142. package/node_modules/@dougharness/gates/scripts/trace.mjs +75 -0
  143. package/package.json +33 -0
  144. package/templates/board-app.js +533 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Eric Schwartz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,96 @@
1
+ export interface AblateIo {
2
+ stdout(s: string): void;
3
+ stderr(s: string): void;
4
+ }
5
+ export declare const ABLATE_USAGE = "Usage:\n doug ablate --from <evals/out/file.json> [--from <file> ...] [--json]\n doug ablate [dir] [--tasks a,b] [--conditions baseline,gates,full] [--runs <n>] [--max-turns <n>] [--suite <name>]\n [--max-budget-usd <n>] [--judge auto|codex|claude|off] [--judge-model <name>] [--dry-run] [--json]\n\nWith --from, existing results are summarized and nothing runs. Without it, <dir>/evals/run.mjs runs the task\nset under each condition (real claude -p sessions, real tokens; --dry-run only prints its plan) and the result\nfile it writes to <dir>/evals/out is summarized. Success means the task's checks passed and every changed file\nwas in scope; mean cost is over the sessions whose cost the runner could read. A \"memory\" condition (card\nmemory-measure) is compared against \"pipeline\" on five measures, including mean turns, with a shipping verdict.\n";
6
+ export interface EvalResult {
7
+ task: string;
8
+ condition: string;
9
+ run?: number;
10
+ costUsd?: number | null;
11
+ turns?: number | null;
12
+ durationMs?: number | null;
13
+ verified?: boolean;
14
+ inScope?: boolean;
15
+ success?: boolean;
16
+ memoryWired?: boolean;
17
+ hidden?: {
18
+ total: number;
19
+ passed: number;
20
+ rate: number;
21
+ } | null;
22
+ defects?: {
23
+ judge: string | null;
24
+ verdict: string | null;
25
+ blocker: number;
26
+ major: number;
27
+ minor: number;
28
+ total: number;
29
+ error: string | null;
30
+ } | null;
31
+ }
32
+ export interface EvalFile {
33
+ suite?: string;
34
+ options?: {
35
+ conditions?: string[];
36
+ };
37
+ results: EvalResult[];
38
+ }
39
+ export interface ConditionSummary {
40
+ condition: string;
41
+ sessions: number;
42
+ successes: number;
43
+ successRate: number;
44
+ verified: number;
45
+ inScope: number;
46
+ priced: number;
47
+ totalCostUsd: number;
48
+ meanCostUsd: number | null;
49
+ meanTurns: number | null;
50
+ meanDurationMs: number | null;
51
+ scopeViolations: number;
52
+ memoryWired: number | null;
53
+ spread: ConditionSpread;
54
+ judged: number | null;
55
+ }
56
+ export interface Spread {
57
+ mean: number;
58
+ min: number;
59
+ max: number;
60
+ n: number;
61
+ }
62
+ export interface ConditionSpread {
63
+ success: Spread | null;
64
+ hidden: Spread | null;
65
+ defects: Spread | null;
66
+ scopeViolations: Spread | null;
67
+ cost: Spread | null;
68
+ wall: Spread | null;
69
+ }
70
+ export interface TaskSummary {
71
+ task: string;
72
+ condition: string;
73
+ sessions: number;
74
+ successes: number;
75
+ meanCostUsd: number | null;
76
+ meanHidden: number | null;
77
+ meanDefects: number | null;
78
+ }
79
+ export interface Ablation {
80
+ suite: string | null;
81
+ sources: string[];
82
+ sessions: number;
83
+ tasks: string[];
84
+ conditions: ConditionSummary[];
85
+ byTask: TaskSummary[];
86
+ unpriced: number;
87
+ }
88
+ export declare function spreadOf(values: number[]): Spread | null;
89
+ export declare function summarizeEval(files: {
90
+ source: string;
91
+ data: EvalFile;
92
+ }[]): Ablation;
93
+ export declare function memoryVerdict(memoryCond: ConditionSummary, pipeline: ConditionSummary): string;
94
+ export declare function renderAblation(a: Ablation): string;
95
+ export declare function newestResult(outDir: string, since: number): string | null;
96
+ export declare function runAblate(argv: string[], io?: AblateIo): Promise<number>;
package/dist/ablate.js ADDED
@@ -0,0 +1,440 @@
1
+ // `doug ablate`: success rate and mean cost per condition (baseline, gates, full) for an eval task set.
2
+ // With --from <file> it summarizes an existing evals/out result and spends nothing. Without it, it runs the
3
+ // repository's evals/run.mjs (real `claude -p` sessions, real tokens) and summarizes the file the runner wrote.
4
+ // Nothing is estimated: a session whose cost the runner could not read is counted, shown, and left out of the mean.
5
+ import { spawnSync } from "node:child_process";
6
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
7
+ import { join, resolve } from "node:path";
8
+ export const ABLATE_USAGE = `Usage:
9
+ doug ablate --from <evals/out/file.json> [--from <file> ...] [--json]
10
+ doug ablate [dir] [--tasks a,b] [--conditions baseline,gates,full] [--runs <n>] [--max-turns <n>] [--suite <name>]
11
+ [--max-budget-usd <n>] [--judge auto|codex|claude|off] [--judge-model <name>] [--dry-run] [--json]
12
+
13
+ With --from, existing results are summarized and nothing runs. Without it, <dir>/evals/run.mjs runs the task
14
+ set under each condition (real claude -p sessions, real tokens; --dry-run only prints its plan) and the result
15
+ file it writes to <dir>/evals/out is summarized. Success means the task's checks passed and every changed file
16
+ was in scope; mean cost is over the sessions whose cost the runner could read. A "memory" condition (card
17
+ memory-measure) is compared against "pipeline" on five measures, including mean turns, with a shipping verdict.
18
+ `;
19
+ // The three install conditions, then the orchestration arms in evals/run.mjs (compared against pipeline).
20
+ const CONDITION_ORDER = ["baseline", "gates", "full", "pipeline", "swarm", "swarm-cheap", "crew", "swarm-crew", "memory"];
21
+ const ARM_CONDITIONS = ["swarm", "swarm-cheap", "crew", "swarm-crew"];
22
+ // The memory arm (card memory-measure) is compared against pipeline separately from the other arms above: on
23
+ // five measures, not four (mean turns joins the other four), with its own swarm-rule verdict line.
24
+ const MEMORY_CONDITION = "memory";
25
+ function mean(values) {
26
+ return values.length ? values.reduce((a, b) => a + b, 0) / values.length : null;
27
+ }
28
+ // Mean, min, max, and n over any list of numbers (card eval-accuracy); null when the list is empty, so a caller
29
+ // never has to special-case "no sessions entered this measure" separately from the shape of the result.
30
+ export function spreadOf(values) {
31
+ if (!values.length)
32
+ return null;
33
+ return { mean: values.reduce((a, b) => a + b, 0) / values.length, min: Math.min(...values), max: Math.max(...values), n: values.length };
34
+ }
35
+ function priced(rs) {
36
+ return rs.map((r) => r.costUsd).filter((c) => typeof c === "number" && Number.isFinite(c));
37
+ }
38
+ function orderConditions(seen) {
39
+ const known = CONDITION_ORDER.filter((c) => seen.includes(c));
40
+ const rest = seen.filter((c) => !CONDITION_ORDER.includes(c));
41
+ return [...known, ...rest];
42
+ }
43
+ // One summary over any number of result files (several runs of the same suite add up).
44
+ export function summarizeEval(files) {
45
+ const results = files.flatMap((f) => (Array.isArray(f.data.results) ? f.data.results : []));
46
+ const suites = [...new Set(files.map((f) => f.data.suite).filter((s) => typeof s === "string"))];
47
+ const conditionsSeen = [...new Set(results.map((r) => r.condition))];
48
+ const conditions = orderConditions(conditionsSeen).map((condition) => {
49
+ const rs = results.filter((r) => r.condition === condition);
50
+ const costs = priced(rs);
51
+ const turns = rs.map((r) => r.turns).filter((t) => typeof t === "number");
52
+ const durations = rs.map((r) => r.durationMs).filter((d) => typeof d === "number" && Number.isFinite(d));
53
+ const successes = rs.filter((r) => r.success === true).length;
54
+ const wiredResults = rs.filter((r) => typeof r.memoryWired === "boolean");
55
+ const hiddenValues = rs
56
+ .map((r) => r.hidden)
57
+ .filter((h) => h != null)
58
+ .map((h) => h.rate);
59
+ const judgedRows = rs.map((r) => r.defects).filter((d) => d != null && d.error === null);
60
+ const hasDefects = rs.some((r) => r.defects !== undefined);
61
+ return {
62
+ condition,
63
+ sessions: rs.length,
64
+ successes,
65
+ successRate: rs.length ? successes / rs.length : 0,
66
+ verified: rs.filter((r) => r.verified === true).length,
67
+ inScope: rs.filter((r) => r.inScope === true).length,
68
+ priced: costs.length,
69
+ totalCostUsd: costs.reduce((a, b) => a + b, 0),
70
+ meanCostUsd: mean(costs),
71
+ meanTurns: mean(turns),
72
+ meanDurationMs: mean(durations),
73
+ scopeViolations: rs.filter((r) => r.inScope === false).length,
74
+ memoryWired: wiredResults.length ? wiredResults.filter((r) => r.memoryWired === true).length : null,
75
+ spread: {
76
+ success: spreadOf(rs.map((r) => (r.success === true ? 1 : 0))),
77
+ hidden: spreadOf(hiddenValues),
78
+ defects: spreadOf(judgedRows.map((d) => d.total)),
79
+ scopeViolations: spreadOf(rs.map((r) => (r.inScope === false ? 1 : 0))),
80
+ cost: spreadOf(costs),
81
+ wall: spreadOf(durations.map((d) => d / 60000)),
82
+ },
83
+ judged: hasDefects ? judgedRows.length : null,
84
+ };
85
+ });
86
+ const tasks = [...new Set(results.map((r) => r.task))];
87
+ const byTask = [];
88
+ for (const task of tasks) {
89
+ for (const c of conditions) {
90
+ const rs = results.filter((r) => r.task === task && r.condition === c.condition);
91
+ if (!rs.length)
92
+ continue;
93
+ const hiddenValues = rs
94
+ .map((r) => r.hidden)
95
+ .filter((h) => h != null)
96
+ .map((h) => h.rate);
97
+ const defectsValues = rs
98
+ .map((r) => r.defects)
99
+ .filter((d) => d != null && d.error === null)
100
+ .map((d) => d.total);
101
+ byTask.push({
102
+ task,
103
+ condition: c.condition,
104
+ sessions: rs.length,
105
+ successes: rs.filter((r) => r.success === true).length,
106
+ meanCostUsd: mean(priced(rs)),
107
+ meanHidden: mean(hiddenValues),
108
+ meanDefects: mean(defectsValues),
109
+ });
110
+ }
111
+ }
112
+ return {
113
+ suite: suites.length === 1 ? suites[0] : suites.length ? suites.join(", ") : null,
114
+ sources: files.map((f) => f.source),
115
+ sessions: results.length,
116
+ tasks,
117
+ conditions,
118
+ byTask,
119
+ unpriced: results.length - priced(results).length,
120
+ };
121
+ }
122
+ const pct = (n) => `${Math.round(n * 100)}%`;
123
+ const usd = (n) => (n === null ? "no cost" : `$${n.toFixed(3)}`);
124
+ const num = (n, digits = 1) => (n === null ? "-" : n.toFixed(digits));
125
+ // A single run is never reported as a range: a mean cell shows `mean (min-max)` only once two or more sessions
126
+ // fed the measure (card eval-accuracy); with one, or none, it renders the way a plain mean always has.
127
+ const enDash = "–";
128
+ const rangeStr = (min, max, fmt) => `${fmt(min)}${enDash}${fmt(max)}`;
129
+ function costCell(spread, fallback, priced, sessions) {
130
+ const base = spread === null ? usd(fallback) : spread.n >= 2 ? `${usd(spread.mean)} (${rangeStr(spread.min, spread.max, (n) => `$${n.toFixed(3)}`)})` : usd(spread.mean);
131
+ return `${base}${priced < sessions ? ` (${priced} priced)` : ""}`;
132
+ }
133
+ function wallCell(spread) {
134
+ if (spread === null)
135
+ return "-";
136
+ const base = `${num(spread.mean)} min`;
137
+ return spread.n >= 2 ? `${base} (${rangeStr(spread.min, spread.max, (n) => num(n))})` : base;
138
+ }
139
+ // Appends " (<k> of <n>)" whenever fewer sessions carried a hidden set than the condition ran: not every task
140
+ // carries `hidden`, so a session without one is silently absent from the spread rather than counted as 0%.
141
+ function hiddenCell(spread, sessions) {
142
+ if (spread === null)
143
+ return "-";
144
+ const base = spread.n >= 2 ? `${pct(spread.mean)} (${rangeStr(spread.min, spread.max, pct)})` : pct(spread.mean);
145
+ const note = spread.n < sessions ? ` (${spread.n} of ${sessions})` : "";
146
+ return base + note;
147
+ }
148
+ // Appends " (<k> judged)" whenever fewer sessions were actually judged than the condition ran (card eval-
149
+ // accuracy's amendment): an inconclusive judge (worktree-modified, spawn failure, git failure) leaves its
150
+ // session's defects out of the spread entirely, so the mean would otherwise look like it covered every session.
151
+ // The note still appears when spread is null (every judge came back inconclusive): "- (0 judged)" rather than a
152
+ // bare "-" that reads as if the judge never ran at all.
153
+ function defectsCell(spread, judged, sessions) {
154
+ const base = spread === null ? "-" : spread.n >= 2 ? `${spread.mean.toFixed(1)} (${spread.min}${enDash}${spread.max})` : String(spread.mean);
155
+ const note = judged !== null && judged < sessions ? ` (${judged} judged)` : "";
156
+ return base + note;
157
+ }
158
+ // The swarm rule's verdict for the memory arm (card memory-measure): ships on by default only when at least one
159
+ // of the five measures against pipeline improved and none worsened. Lower is better for scope violations, cost,
160
+ // turns, and wall clock; higher is better for success. A measure with no comparable data (a null mean on either
161
+ // side) counts as neither improved nor worsened.
162
+ export function memoryVerdict(memoryCond, pipeline) {
163
+ const points = Math.round((memoryCond.successRate - pipeline.successRate) * 100);
164
+ const scope = memoryCond.scopeViolations - pipeline.scopeViolations;
165
+ const costDelta = memoryCond.meanCostUsd !== null && pipeline.meanCostUsd !== null ? memoryCond.meanCostUsd - pipeline.meanCostUsd : null;
166
+ const turnsDelta = memoryCond.meanTurns !== null && pipeline.meanTurns !== null ? memoryCond.meanTurns - pipeline.meanTurns : null;
167
+ const wallDelta = memoryCond.meanDurationMs !== null && pipeline.meanDurationMs !== null ? memoryCond.meanDurationMs - pipeline.meanDurationMs : null;
168
+ const measures = [
169
+ { name: "success", improved: points > 0, worsened: points < 0 },
170
+ { name: "scope violations", improved: scope < 0, worsened: scope > 0 },
171
+ { name: "cost", improved: costDelta !== null && costDelta < 0, worsened: costDelta !== null && costDelta > 0 },
172
+ { name: "turns", improved: turnsDelta !== null && turnsDelta < 0, worsened: turnsDelta !== null && turnsDelta > 0 },
173
+ { name: "wall clock", improved: wallDelta !== null && wallDelta < 0, worsened: wallDelta !== null && wallDelta > 0 },
174
+ ];
175
+ const worsened = measures.filter((m) => m.worsened).map((m) => m.name);
176
+ const improved = measures.filter((m) => m.improved);
177
+ if (worsened.length === 0 && improved.length > 0)
178
+ return "memory: ships on by default";
179
+ if (worsened.length)
180
+ return `memory: ships off by default (${worsened.join(", ")} worsened)`;
181
+ return "memory: ships off by default (nothing improved)";
182
+ }
183
+ export function renderAblation(a) {
184
+ const lines = [];
185
+ const suite = a.suite ? `suite ${a.suite}` : "results";
186
+ lines.push(`Ablation of ${suite}: ${a.sessions} session${a.sessions === 1 ? "" : "s"} from ${a.sources.join(", ")}; ${a.tasks.length} task${a.tasks.length === 1 ? "" : "s"}${a.tasks.length ? ` (${a.tasks.join(", ")})` : ""}.`);
187
+ lines.push("");
188
+ // The Wired column (card memory-measure) only appears when some result actually carries memoryWired — every
189
+ // condition but memory leaves it out entirely, so a run with no memory arm shows no Wired column. Hidden
190
+ // follows the same non-null-spread rule (card eval-accuracy). Defects instead keys on the field's presence
191
+ // (`judged !== null`, the same signal `judged` itself is built from) rather than on the spread being non-null,
192
+ // so a run where every judge came back inconclusive still shows a Defects column (with "- (0 judged)") instead
193
+ // of looking like the judge never ran. Neither field exists in a result file from before this card, so neither
194
+ // column appears for one — but that file's Mean cost and Mean wall cells can still gain a `mean (min–max)`
195
+ // range once a condition in it has two or more sessions: that rendering upgrade isn't gated on this card's
196
+ // new fields at all.
197
+ const anyWired = a.conditions.some((c) => c.memoryWired !== null);
198
+ const anyHidden = a.conditions.some((c) => c.spread.hidden !== null);
199
+ const anyDefects = a.conditions.some((c) => c.judged !== null);
200
+ const header = [
201
+ "Condition",
202
+ "Sessions",
203
+ "Success",
204
+ "Verified",
205
+ "In scope",
206
+ "Mean cost",
207
+ "Mean turns",
208
+ "Mean wall",
209
+ ...(anyHidden ? ["Hidden"] : []),
210
+ ...(anyDefects ? ["Defects"] : []),
211
+ ...(anyWired ? ["Wired"] : []),
212
+ ];
213
+ lines.push(`| ${header.join(" | ")} |`);
214
+ lines.push(`|${header.map(() => "---").join("|")}|`);
215
+ for (const c of a.conditions) {
216
+ const cells = [
217
+ c.condition,
218
+ String(c.sessions),
219
+ `${c.successes}/${c.sessions} (${pct(c.successRate)})`,
220
+ `${c.verified}/${c.sessions}`,
221
+ `${c.inScope}/${c.sessions}`,
222
+ costCell(c.spread.cost, c.meanCostUsd, c.priced, c.sessions),
223
+ num(c.meanTurns),
224
+ wallCell(c.spread.wall),
225
+ ...(anyHidden ? [hiddenCell(c.spread.hidden, c.sessions)] : []),
226
+ ...(anyDefects ? [defectsCell(c.spread.defects, c.judged, c.sessions)] : []),
227
+ ...(anyWired ? [c.memoryWired === null ? "-" : `${c.memoryWired}/${c.sessions}`] : []),
228
+ ];
229
+ lines.push(`| ${cells.join(" | ")} |`);
230
+ }
231
+ // A single run is never reported as a difference (card eval-accuracy): every "Against ..." line below prints
232
+ // only when both sides ran two or more sessions, so a lone claude -p session's noise never reads as a finding.
233
+ const singleRunLine = (ref, cond, refSummary) => `Against ${ref}, ${cond.condition}: single run (n=${cond.sessions} vs n=${refSummary.sessions}), not reported as a difference.`;
234
+ // The hidden pass rate and defect count deltas (card eval-accuracy) that the arm and memory lines below append
235
+ // after their existing measures: omitted, never fabricated, unless BOTH sides drew on two or more sessions for
236
+ // that measure specifically — a condition can clear the overall single-run gate above on `sessions` while a
237
+ // single session (or zero) carried a hidden set or a conclusive judge, and one sample is still not a spread.
238
+ const twoOrMore = (s) => s !== null && s.n >= 2;
239
+ const hiddenDefectsFragments = (c, ref) => {
240
+ const parts = [];
241
+ if (twoOrMore(c.spread.hidden) && twoOrMore(ref.spread.hidden)) {
242
+ const d = Math.round((c.spread.hidden.mean - ref.spread.hidden.mean) * 100);
243
+ parts.push(`${d >= 0 ? "+" : ""}${d} points hidden pass rate`);
244
+ }
245
+ if (twoOrMore(c.spread.defects) && twoOrMore(ref.spread.defects)) {
246
+ const d = c.spread.defects.mean - ref.spread.defects.mean;
247
+ parts.push(`${d >= 0 ? "+" : ""}${d.toFixed(1)} defects`);
248
+ }
249
+ return parts.length ? `, ${parts.join(", ")}` : "";
250
+ };
251
+ const baseline = a.conditions.find((c) => c.condition === "baseline");
252
+ const others = a.conditions.filter((c) => c.condition !== "baseline");
253
+ if (baseline && others.length) {
254
+ lines.push("");
255
+ for (const c of others) {
256
+ if (c.sessions < 2 || baseline.sessions < 2) {
257
+ lines.push(singleRunLine("baseline", c, baseline));
258
+ continue;
259
+ }
260
+ const points = Math.round((c.successRate - baseline.successRate) * 100);
261
+ const cost = c.meanCostUsd !== null && baseline.meanCostUsd !== null ? `${c.meanCostUsd - baseline.meanCostUsd >= 0 ? "+" : "-"}$${Math.abs(c.meanCostUsd - baseline.meanCostUsd).toFixed(3)} mean cost` : "cost not comparable";
262
+ lines.push(`Against baseline, ${c.condition}: ${points >= 0 ? "+" : ""}${points} points success, ${cost}.`);
263
+ }
264
+ }
265
+ // The orchestration arms against the fixed pipeline: success, scope violations, cost, and wall clock, the four
266
+ // measures decision 0001 names, plus hidden pass rate and defects (card eval-accuracy) when both sides have
267
+ // them. The swarm ships disabled by default unless one improves without another worsening.
268
+ const pipeline = a.conditions.find((c) => c.condition === "pipeline");
269
+ const arms = a.conditions.filter((c) => ARM_CONDITIONS.includes(c.condition));
270
+ if (pipeline && arms.length) {
271
+ lines.push("");
272
+ for (const c of arms) {
273
+ if (c.sessions < 2 || pipeline.sessions < 2) {
274
+ lines.push(singleRunLine("pipeline", c, pipeline));
275
+ continue;
276
+ }
277
+ const points = Math.round((c.successRate - pipeline.successRate) * 100);
278
+ const scope = c.scopeViolations - pipeline.scopeViolations;
279
+ const cost = c.meanCostUsd !== null && pipeline.meanCostUsd !== null ? `${c.meanCostUsd - pipeline.meanCostUsd >= 0 ? "+" : "-"}$${Math.abs(c.meanCostUsd - pipeline.meanCostUsd).toFixed(3)} mean cost` : "cost not comparable";
280
+ const wall = c.meanDurationMs !== null && pipeline.meanDurationMs !== null ? `${c.meanDurationMs - pipeline.meanDurationMs >= 0 ? "+" : "-"}${num(Math.abs(c.meanDurationMs - pipeline.meanDurationMs) / 60000)} min wall` : "wall not comparable";
281
+ lines.push(`Against pipeline, ${c.condition}: ${points >= 0 ? "+" : ""}${points} points success, ${scope >= 0 ? "+" : ""}${scope} scope violations, ${cost}, ${wall}${hiddenDefectsFragments(c, pipeline)}.`);
282
+ }
283
+ }
284
+ // The memory arm against pipeline (card memory-measure), on a fifth measure the arms above do not carry: mean
285
+ // turns, alongside the same four success/scope/cost/wall clock as above (plus hidden/defects, card eval-
286
+ // accuracy). A separate block so the existing arm lines' format is untouched. No verdict line follows a
287
+ // single-run comparison: there is nothing to ship a verdict on.
288
+ const memoryCond = a.conditions.find((c) => c.condition === MEMORY_CONDITION);
289
+ if (pipeline && memoryCond) {
290
+ lines.push("");
291
+ if (memoryCond.sessions < 2 || pipeline.sessions < 2) {
292
+ lines.push(singleRunLine("pipeline", memoryCond, pipeline));
293
+ }
294
+ else {
295
+ const points = Math.round((memoryCond.successRate - pipeline.successRate) * 100);
296
+ const scope = memoryCond.scopeViolations - pipeline.scopeViolations;
297
+ const cost = memoryCond.meanCostUsd !== null && pipeline.meanCostUsd !== null
298
+ ? `${memoryCond.meanCostUsd - pipeline.meanCostUsd >= 0 ? "+" : "-"}$${Math.abs(memoryCond.meanCostUsd - pipeline.meanCostUsd).toFixed(3)} mean cost`
299
+ : "cost not comparable";
300
+ const turnsNote = memoryCond.meanTurns !== null && pipeline.meanTurns !== null
301
+ ? `${memoryCond.meanTurns - pipeline.meanTurns >= 0 ? "+" : "-"}${num(Math.abs(memoryCond.meanTurns - pipeline.meanTurns))} mean turns`
302
+ : "turns not comparable";
303
+ const wall = memoryCond.meanDurationMs !== null && pipeline.meanDurationMs !== null
304
+ ? `${memoryCond.meanDurationMs - pipeline.meanDurationMs >= 0 ? "+" : "-"}${num(Math.abs(memoryCond.meanDurationMs - pipeline.meanDurationMs) / 60000)} min wall`
305
+ : "wall not comparable";
306
+ lines.push(`Against pipeline, memory: ${points >= 0 ? "+" : ""}${points} points success, ${scope >= 0 ? "+" : ""}${scope} scope violations, ${cost}, ${turnsNote}, ${wall}${hiddenDefectsFragments(memoryCond, pipeline)}.`);
307
+ lines.push(memoryVerdict(memoryCond, pipeline));
308
+ }
309
+ }
310
+ if (a.tasks.length > 1) {
311
+ lines.push("");
312
+ const taskHeader = ["Task", "Condition", "Sessions", "Success", "Mean cost", ...(anyHidden ? ["Hidden"] : []), ...(anyDefects ? ["Defects"] : [])];
313
+ lines.push(`| ${taskHeader.join(" | ")} |`);
314
+ lines.push(`|${taskHeader.map(() => "---").join("|")}|`);
315
+ for (const t of a.byTask) {
316
+ const cells = [
317
+ t.task,
318
+ t.condition,
319
+ String(t.sessions),
320
+ `${t.successes}/${t.sessions}`,
321
+ usd(t.meanCostUsd),
322
+ ...(anyHidden ? [t.meanHidden === null ? "-" : pct(t.meanHidden)] : []),
323
+ ...(anyDefects ? [t.meanDefects === null ? "-" : t.meanDefects.toFixed(1)] : []),
324
+ ];
325
+ lines.push(`| ${cells.join(" | ")} |`);
326
+ }
327
+ }
328
+ if (a.unpriced) {
329
+ lines.push("");
330
+ lines.push(`Note: ${a.unpriced} session${a.unpriced === 1 ? " has" : "s have"} no cost (the runner could not read claude -p's JSON); means are over the priced sessions only.`);
331
+ }
332
+ return lines.join("\n") + "\n";
333
+ }
334
+ const BOOLEAN_FLAGS = new Set(["json", "help", "dry-run"]);
335
+ const RUNNER_OPTIONS = ["tasks", "conditions", "runs", "max-turns", "suite", "max-budget-usd", "judge", "judge-model"];
336
+ function parse(argv) {
337
+ const opts = {};
338
+ const from = [];
339
+ const positional = [];
340
+ for (let i = 0; i < argv.length; i++) {
341
+ const a = argv[i];
342
+ if (!a.startsWith("--")) {
343
+ positional.push(a);
344
+ continue;
345
+ }
346
+ const name = a.slice(2);
347
+ if (BOOLEAN_FLAGS.has(name))
348
+ opts[name] = true;
349
+ else if (name === "from")
350
+ from.push(argv[++i] ?? "");
351
+ else
352
+ opts[name] = argv[++i] ?? "";
353
+ }
354
+ return { opts, from, positional };
355
+ }
356
+ function readEvalFile(file) {
357
+ let data;
358
+ try {
359
+ data = JSON.parse(readFileSync(file, "utf8"));
360
+ }
361
+ catch (err) {
362
+ throw new Error(`cannot read ${file}: ${err instanceof Error ? err.message : String(err)}`);
363
+ }
364
+ if (!data || typeof data !== "object" || !Array.isArray(data.results))
365
+ throw new Error(`${file} is not an eval result: no results array`);
366
+ return data;
367
+ }
368
+ export function newestResult(outDir, since) {
369
+ if (!existsSync(outDir))
370
+ return null;
371
+ // Names are ISO timestamps (evals/run.mjs), so lexicographic order is chronological: sort descending by name
372
+ // before the stable mtime sort, so an equal-mtime tie (plausible for files written in the same run) resolves
373
+ // to the newer name, not the older one.
374
+ const files = readdirSync(outDir)
375
+ .filter((f) => f.endsWith(".json"))
376
+ .sort()
377
+ .reverse()
378
+ .map((f) => ({ file: join(outDir, f), mtime: statSync(join(outDir, f)).mtimeMs }))
379
+ .filter((f) => f.mtime >= since)
380
+ .sort((x, y) => y.mtime - x.mtime);
381
+ return files.length ? files[0].file : null;
382
+ }
383
+ export async function runAblate(argv, io) {
384
+ const out = io || {
385
+ stdout: (s) => void process.stdout.write(s),
386
+ stderr: (s) => void process.stderr.write(s),
387
+ };
388
+ const { opts, from, positional } = parse(argv);
389
+ if (opts.help === true) {
390
+ out.stdout(ABLATE_USAGE);
391
+ return 0;
392
+ }
393
+ const emit = (files) => {
394
+ const summary = summarizeEval(files);
395
+ out.stdout(opts.json === true ? JSON.stringify(summary, null, 2) + "\n" : renderAblation(summary));
396
+ };
397
+ try {
398
+ if (from.length) {
399
+ if (from.some((f) => !f))
400
+ throw new Error("--from needs a file");
401
+ emit(from.map((f) => ({ source: f, data: readEvalFile(resolve(f)) })));
402
+ return 0;
403
+ }
404
+ const dir = resolve(positional[0] || process.cwd());
405
+ const runner = join(dir, "evals", "run.mjs");
406
+ if (!existsSync(runner)) {
407
+ out.stderr(`no eval runner at ${runner}; pass the repository directory, or --from <evals/out/file.json> to summarize an existing result\n`);
408
+ return 1;
409
+ }
410
+ const args = [runner];
411
+ for (const name of RUNNER_OPTIONS) {
412
+ const v = opts[name];
413
+ if (typeof v === "string")
414
+ args.push(`--${name}`, v);
415
+ }
416
+ if (opts["dry-run"] === true)
417
+ args.push("--dry-run");
418
+ const started = Date.now();
419
+ const r = spawnSync(process.execPath, args, { cwd: dir, stdio: "inherit" });
420
+ if (r.status !== 0) {
421
+ out.stderr(`evals/run.mjs exited with ${r.status === null ? `signal ${r.signal}` : `status ${r.status}`}; nothing summarized\n`);
422
+ return r.status ?? 1;
423
+ }
424
+ if (opts["dry-run"] === true)
425
+ return 0;
426
+ const file = newestResult(join(dir, "evals", "out"), started);
427
+ if (!file) {
428
+ out.stderr(`evals/run.mjs wrote no result under ${join(dir, "evals", "out")}\n`);
429
+ return 1;
430
+ }
431
+ out.stdout("\n");
432
+ emit([{ source: file, data: readEvalFile(file) }]);
433
+ return 0;
434
+ }
435
+ catch (err) {
436
+ out.stderr(`${err instanceof Error ? err.message : String(err)}\n`);
437
+ return 1;
438
+ }
439
+ }
440
+ //# sourceMappingURL=ablate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ablate.js","sourceRoot":"","sources":["../src/ablate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { FileChange } from "./diff.js";
2
+ export declare function applyChanges(dir: string, changes: FileChange[]): string[];
package/dist/apply.js ADDED
@@ -0,0 +1,19 @@
1
+ import { existsSync, mkdirSync, writeFileSync, renameSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ export function applyChanges(dir, changes) {
4
+ const written = [];
5
+ for (const c of changes) {
6
+ if (c.after === null)
7
+ continue; // deletions are never proposed in this version
8
+ const abs = join(dir, c.path);
9
+ if (c.before === null && existsSync(abs))
10
+ continue; // created since the proposal was built; leave it
11
+ mkdirSync(dirname(abs), { recursive: true });
12
+ const tmp = abs + ".doug-tmp";
13
+ writeFileSync(tmp, c.after);
14
+ renameSync(tmp, abs);
15
+ written.push(c.path);
16
+ }
17
+ return written;
18
+ }
19
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,OAAqB;IAC7D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI;YAAE,SAAS,CAAC,+CAA+C;QAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,iDAAiD;QACrG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,GAAG,GAAG,WAAW,CAAC;QAC9B,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5B,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};