@dougharness/cli 1.0.2 → 1.1.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.
- package/dist/bin.js +18 -3
- package/dist/bin.js.map +1 -1
- package/dist/board-serve.js +14 -7
- package/dist/board-serve.js.map +1 -1
- package/dist/board.d.ts +1 -1
- package/dist/board.js +42 -9
- package/dist/board.js.map +1 -1
- package/dist/detect/repo.js +14 -1
- package/dist/detect/repo.js.map +1 -1
- package/dist/detect/types.d.ts +2 -0
- package/dist/doctor.d.ts +46 -0
- package/dist/doctor.js +491 -0
- package/dist/doctor.js.map +1 -0
- package/dist/generate/agents.d.ts +7 -0
- package/dist/generate/agents.js +62 -12
- package/dist/generate/agents.js.map +1 -1
- package/dist/generate/claude-md.js +4 -0
- package/dist/generate/claude-md.js.map +1 -1
- package/dist/generate/config.d.ts +8 -0
- package/dist/generate/config.js +4 -1
- package/dist/generate/config.js.map +1 -1
- package/dist/generate/proposal.js +15 -6
- package/dist/generate/proposal.js.map +1 -1
- package/dist/generate/settings.d.ts +2 -0
- package/dist/generate/settings.js +17 -2
- package/dist/generate/settings.js.map +1 -1
- package/dist/init.d.ts +14 -0
- package/dist/init.js +94 -8
- package/dist/init.js.map +1 -1
- package/dist/memory-setup.d.ts +28 -0
- package/dist/memory-setup.js +326 -0
- package/dist/memory-setup.js.map +1 -0
- package/node_modules/@dougharness/flow/.claude-plugin/plugin.json +16 -4
- package/node_modules/@dougharness/flow/agents/lead.md +1 -1
- package/node_modules/@dougharness/flow/agents/planner.md +3 -3
- package/node_modules/@dougharness/flow/agents/researcher.md +2 -2
- package/node_modules/@dougharness/flow/hooks/hooks.json +16 -0
- package/node_modules/@dougharness/flow/lib/board.mjs +171 -13
- package/node_modules/@dougharness/flow/lib/code-index.mjs +18 -3
- package/node_modules/@dougharness/flow/lib/context.mjs +57 -0
- package/node_modules/@dougharness/flow/lib/cost.mjs +155 -7
- package/node_modules/@dougharness/flow/lib/embeddings.mjs +188 -24
- package/node_modules/@dougharness/flow/lib/land.mjs +74 -10
- package/node_modules/@dougharness/flow/lib/learn.mjs +4 -4
- package/node_modules/@dougharness/flow/lib/memory.mjs +368 -50
- package/node_modules/@dougharness/flow/lib/plan.mjs +11 -1
- package/node_modules/@dougharness/flow/package.json +2 -1
- package/node_modules/@dougharness/flow/scripts/board.mjs +86 -25
- package/node_modules/@dougharness/flow/scripts/context.mjs +50 -0
- package/node_modules/@dougharness/flow/scripts/cost.mjs +15 -3
- package/node_modules/@dougharness/flow/scripts/memory.mjs +197 -37
- package/node_modules/@dougharness/flow/scripts/plan.mjs +54 -64
- package/node_modules/@dougharness/flow/scripts/session-recall.mjs +132 -0
- package/node_modules/@dougharness/flow/skills/doug-hand/SKILL.md +105 -0
- package/node_modules/@dougharness/flow/skills/doug-learn/SKILL.md +1 -1
- package/node_modules/@dougharness/flow/skills/doug-next/SKILL.md +50 -14
- package/node_modules/@dougharness/flow/skills/doug-plan/SKILL.md +1 -1
- package/node_modules/@dougharness/flow/skills/doug-swarm/SKILL.md +7 -7
- package/node_modules/@dougharness/flow/skills/research/SKILL.md +4 -2
- package/node_modules/@dougharness/flow/skills/run-report/SKILL.md +14 -13
- package/node_modules/@dougharness/flow/skills/swarm-launch/SKILL.md +1 -1
- package/node_modules/@dougharness/flow/workflows/doug-implement.js +145 -86
- package/node_modules/@dougharness/gates/.claude-plugin/plugin.json +1 -1
- package/node_modules/@dougharness/gates/hooks/hooks.json +11 -0
- package/node_modules/@dougharness/gates/lib/baseline.mjs +166 -1
- package/node_modules/@dougharness/gates/lib/bash-rules.mjs +21 -14
- package/node_modules/@dougharness/gates/lib/block-ledger.mjs +58 -1
- package/node_modules/@dougharness/gates/lib/checkpoint.mjs +1 -1
- package/node_modules/@dougharness/gates/lib/config.mjs +20 -0
- package/node_modules/@dougharness/gates/lib/docs-gate.mjs +95 -0
- package/node_modules/@dougharness/gates/lib/evidence.mjs +2 -0
- package/node_modules/@dougharness/gates/lib/gate-lock.mjs +94 -0
- package/node_modules/@dougharness/gates/lib/run.mjs +4 -0
- package/node_modules/@dougharness/gates/lib/test-totals.mjs +40 -7
- package/node_modules/@dougharness/gates/lib/trace.mjs +24 -7
- package/node_modules/@dougharness/gates/lib/verified-tree.mjs +225 -0
- package/node_modules/@dougharness/gates/package.json +1 -1
- package/node_modules/@dougharness/gates/scripts/research-cap.mjs +133 -5
- package/node_modules/@dougharness/gates/scripts/stop-gate.mjs +558 -197
- package/node_modules/@dougharness/gates/scripts/trace.mjs +5 -1
- package/node_modules/@dougharness/gates/scripts/turn-start.mjs +17 -0
- package/node_modules/@dougharness/gates/scripts/verify.mjs +201 -0
- package/package.json +4 -4
- package/templates/board-app.js +4 -3
- package/node_modules/@dougharness/flow/lib/rehearse.mjs +0 -825
- package/node_modules/@dougharness/flow/scripts/rehearse.mjs +0 -129
- package/node_modules/@dougharness/flow/skills/core-next/SKILL.md +0 -92
- package/node_modules/@dougharness/flow/skills/harness-fix/SKILL.md +0 -85
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
// `doug doctor [dir] [--json]`: a read-only install health check. Never writes; reads only.
|
|
2
|
+
import { accessSync, constants, existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { delimiter, join, relative, resolve } from "node:path";
|
|
6
|
+
import { PROMPT_CACHE_TTL_KEY, SUBAGENT_DEPTH_ENV, WORKFLOW_CONCURRENCY_ENV, gatesSourceDir } from "./generate/settings.js";
|
|
7
|
+
import { BOARD_RELPATH, FALLBACK_RELPATH } from "@dougharness/flow/lib/board.mjs";
|
|
8
|
+
import { readMemoryConfig } from "@dougharness/flow/lib/embeddings.mjs";
|
|
9
|
+
export const DOCTOR_USAGE = `doug doctor [dir] [--json]
|
|
10
|
+
|
|
11
|
+
Read-only install health check: Node and SQLite FTS5, .doug/config.json, the vendored hooks, the hooks
|
|
12
|
+
registered in .claude/settings*.json, the status line, the subagent cache/concurrency/depth settings, the board,
|
|
13
|
+
codex and codex-review on PATH, the memory store, semantic memory (embeddings), whether the plugins are installed,
|
|
14
|
+
and the installed plugin versions.
|
|
15
|
+
Each check prints ok, warn, fail, or skip and, when warn or fail, one fix: command.
|
|
16
|
+
Exit 1 when any check fails, 0 otherwise, 2 on bad arguments. Never writes.
|
|
17
|
+
`;
|
|
18
|
+
const NODE_FIX = "install Node >=22.16";
|
|
19
|
+
const INSTALL_CLI_FIX = "npm install -g @dougharness/cli";
|
|
20
|
+
const FLOW_KEY = "doug-flow@dougharness";
|
|
21
|
+
const GATES_KEY = "doug-gates@dougharness";
|
|
22
|
+
const HOOKS_MARK = ".doug/hooks/scripts/";
|
|
23
|
+
const STATUSLINE_MARK = ".doug/hooks/scripts/statusline.mjs";
|
|
24
|
+
const PLUGINS_FIX = "claude plugin marketplace add eschwa3/dougharness && claude plugin install doug-gates@dougharness && claude plugin install doug-flow@dougharness";
|
|
25
|
+
function errMsg(err) {
|
|
26
|
+
return err instanceof Error ? err.message : String(err);
|
|
27
|
+
}
|
|
28
|
+
function result(id, status, detail, fix = null) {
|
|
29
|
+
return { id, status, detail, fix: status === "warn" || status === "fail" ? fix : null };
|
|
30
|
+
}
|
|
31
|
+
// A check that throws (for example EACCES while listing a directory) is that check's fail, never a lost report.
|
|
32
|
+
// The fix is generic: the check's normal fix would not cure a read error.
|
|
33
|
+
function guard(id, fn) {
|
|
34
|
+
try {
|
|
35
|
+
return fn();
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
return result(id, "fail", errMsg(err), "fix the error in detail (often a read permission), then re-run doug doctor");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function nodeAtLeast(version, major, minor) {
|
|
42
|
+
const m = /^v?(\d+)\.(\d+)/.exec(version);
|
|
43
|
+
if (!m)
|
|
44
|
+
return false;
|
|
45
|
+
const ma = Number(m[1]);
|
|
46
|
+
const mi = Number(m[2]);
|
|
47
|
+
return ma > major || (ma === major && mi >= minor);
|
|
48
|
+
}
|
|
49
|
+
function cmpVersion(a, b) {
|
|
50
|
+
const pa = a.split(/[.-]/).map((x) => parseInt(x, 10) || 0);
|
|
51
|
+
const pb = b.split(/[.-]/).map((x) => parseInt(x, 10) || 0);
|
|
52
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
53
|
+
const d = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
54
|
+
if (d !== 0)
|
|
55
|
+
return d < 0 ? -1 : 1;
|
|
56
|
+
}
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
function listFiles(root, sub) {
|
|
60
|
+
const base = join(root, sub);
|
|
61
|
+
const out = [];
|
|
62
|
+
if (!existsSync(base))
|
|
63
|
+
return out;
|
|
64
|
+
const walk = (d) => {
|
|
65
|
+
for (const e of readdirSync(d, { withFileTypes: true })) {
|
|
66
|
+
const p = join(d, e.name);
|
|
67
|
+
if (e.isDirectory())
|
|
68
|
+
walk(p);
|
|
69
|
+
else if (e.isFile())
|
|
70
|
+
out.push(relative(root, p));
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
walk(base);
|
|
74
|
+
return out.sort();
|
|
75
|
+
}
|
|
76
|
+
function readJson(file) {
|
|
77
|
+
try {
|
|
78
|
+
return { ok: true, value: JSON.parse(readFileSync(file, "utf8")) };
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
return { ok: false, error: errMsg(err) };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function isObject(v) {
|
|
85
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
86
|
+
}
|
|
87
|
+
function hookCommands(settings) {
|
|
88
|
+
const out = [];
|
|
89
|
+
if (!isObject(settings) || !isObject(settings.hooks))
|
|
90
|
+
return out;
|
|
91
|
+
for (const entries of Object.values(settings.hooks)) {
|
|
92
|
+
if (!Array.isArray(entries))
|
|
93
|
+
continue;
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
if (!isObject(entry) || !Array.isArray(entry.hooks))
|
|
96
|
+
continue;
|
|
97
|
+
for (const h of entry.hooks) {
|
|
98
|
+
if (isObject(h) && h.type === "command" && typeof h.command === "string")
|
|
99
|
+
out.push(h.command);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
// The first executable `name` on env.PATH, or null.
|
|
106
|
+
function onPath(name, env) {
|
|
107
|
+
for (const entry of (env.PATH ?? "").split(delimiter)) {
|
|
108
|
+
if (!entry)
|
|
109
|
+
continue;
|
|
110
|
+
const p = join(entry, name);
|
|
111
|
+
try {
|
|
112
|
+
if (!statSync(p).isFile())
|
|
113
|
+
continue;
|
|
114
|
+
accessSync(p, constants.X_OK);
|
|
115
|
+
return p;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// keep looking
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
// .claude/settings.json then .claude/settings.local.json (local overrides). null when settings.json is missing or
|
|
124
|
+
// unparsable; an unparsable local file is ignored.
|
|
125
|
+
function readSettingsPair(dir) {
|
|
126
|
+
const main = join(dir, ".claude", "settings.json");
|
|
127
|
+
if (!existsSync(main))
|
|
128
|
+
return null;
|
|
129
|
+
const m = readJson(main);
|
|
130
|
+
if (!m.ok || !isObject(m.value))
|
|
131
|
+
return null;
|
|
132
|
+
const lp = join(dir, ".claude", "settings.local.json");
|
|
133
|
+
const l = existsSync(lp) ? readJson(lp) : null;
|
|
134
|
+
return { main: m.value, local: l && l.ok && isObject(l.value) ? l.value : null };
|
|
135
|
+
}
|
|
136
|
+
function settingsEnvValue(pair, key) {
|
|
137
|
+
for (const s of [pair.local, pair.main]) {
|
|
138
|
+
if (s && isObject(s.env) && s.env[key] !== undefined)
|
|
139
|
+
return s.env[key];
|
|
140
|
+
}
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
function readConfigObject(dir) {
|
|
144
|
+
const f = join(dir, ".doug", "config.json");
|
|
145
|
+
if (!existsSync(f))
|
|
146
|
+
return null;
|
|
147
|
+
const p = readJson(f);
|
|
148
|
+
return p.ok && isObject(p.value) ? p.value : null;
|
|
149
|
+
}
|
|
150
|
+
export async function collectChecks(dir, deps = {}, initFix = "doug init") {
|
|
151
|
+
const env = deps.env ?? process.env;
|
|
152
|
+
const nodeVersion = deps.nodeVersion ?? process.versions.node;
|
|
153
|
+
const checks = [];
|
|
154
|
+
const readInstalledPlugins = () => {
|
|
155
|
+
const cfgDir = deps.claudeConfigDir ?? env.CLAUDE_CONFIG_DIR ?? join(homedir(), ".claude");
|
|
156
|
+
const file = join(cfgDir, "plugins", "installed_plugins.json");
|
|
157
|
+
if (!existsSync(file))
|
|
158
|
+
return null;
|
|
159
|
+
const parsed = readJson(file);
|
|
160
|
+
if (!parsed.ok || !isObject(parsed.value))
|
|
161
|
+
return null;
|
|
162
|
+
if (parsed.value.version !== 2 || !isObject(parsed.value.plugins))
|
|
163
|
+
return null;
|
|
164
|
+
return parsed.value.plugins;
|
|
165
|
+
};
|
|
166
|
+
const pickRecord = (plugins, key) => {
|
|
167
|
+
const records = plugins[key];
|
|
168
|
+
if (!Array.isArray(records))
|
|
169
|
+
return null;
|
|
170
|
+
const usable = records.filter((r) => isObject(r) && typeof r.version === "string");
|
|
171
|
+
return usable.find((r) => typeof r.projectPath === "string" && resolve(r.projectPath) === dir) ?? usable.find((r) => r.scope === "user") ?? null;
|
|
172
|
+
};
|
|
173
|
+
// 1. node
|
|
174
|
+
let lib = null;
|
|
175
|
+
let nodeCheck;
|
|
176
|
+
if (!nodeAtLeast(nodeVersion, 22, 16)) {
|
|
177
|
+
nodeCheck = result("node", "fail", `Node ${nodeVersion}; needs >=22.16`, NODE_FIX);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
try {
|
|
181
|
+
lib = await (deps.loadMemoryLib ?? (() => import("@dougharness/flow/lib/memory.mjs")))();
|
|
182
|
+
const probe = lib.probeSqliteFts5();
|
|
183
|
+
nodeCheck = probe.ok
|
|
184
|
+
? result("node", "ok", `Node ${nodeVersion} with node:sqlite FTS5`)
|
|
185
|
+
: result("node", "fail", `Node ${nodeVersion}: SQLite FTS5 unavailable${probe.reason ? ` (${probe.reason})` : ""}`, NODE_FIX);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
lib = null;
|
|
189
|
+
nodeCheck = result("node", "fail", `Node ${nodeVersion}: cannot load node:sqlite (${errMsg(err)})`, NODE_FIX);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
checks.push(nodeCheck);
|
|
193
|
+
// 2. config
|
|
194
|
+
const configFile = join(dir, ".doug", "config.json");
|
|
195
|
+
const configCheck = guard("config", () => {
|
|
196
|
+
if (!existsSync(configFile))
|
|
197
|
+
return result("config", "fail", ".doug/config.json is missing", initFix);
|
|
198
|
+
const parsed = readJson(configFile);
|
|
199
|
+
if (!parsed.ok)
|
|
200
|
+
return result("config", "fail", `.doug/config.json is not valid JSON (${parsed.error})`, initFix);
|
|
201
|
+
if (!isObject(parsed.value))
|
|
202
|
+
return result("config", "fail", ".doug/config.json is not a JSON object", initFix);
|
|
203
|
+
return result("config", "ok", ".doug/config.json parses");
|
|
204
|
+
});
|
|
205
|
+
checks.push(configCheck);
|
|
206
|
+
// 3. hooks-vendored
|
|
207
|
+
checks.push(guard("hooks-vendored", () => {
|
|
208
|
+
let gates;
|
|
209
|
+
try {
|
|
210
|
+
gates = (deps.gatesDir ?? gatesSourceDir)();
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
return result("hooks-vendored", "fail", `cannot locate the installed @dougharness/gates (${errMsg(err)})`, INSTALL_CLI_FIX);
|
|
214
|
+
}
|
|
215
|
+
const hooksDir = join(dir, ".doug", "hooks");
|
|
216
|
+
if (!existsSync(join(hooksDir, "scripts")))
|
|
217
|
+
return result("hooks-vendored", "fail", ".doug/hooks/scripts is missing", initFix);
|
|
218
|
+
const bad = [];
|
|
219
|
+
let total = 0;
|
|
220
|
+
for (const rel of [...listFiles(gates, "scripts"), ...listFiles(gates, "lib")]) {
|
|
221
|
+
total++;
|
|
222
|
+
const mine = join(hooksDir, rel);
|
|
223
|
+
try {
|
|
224
|
+
if (!readFileSync(join(gates, rel)).equals(readFileSync(mine)))
|
|
225
|
+
bad.push(`${rel} differs`);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
bad.push(`${rel} missing`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (bad.length === 0)
|
|
232
|
+
return result("hooks-vendored", "ok", `${total} vendored files match @dougharness/gates`);
|
|
233
|
+
const shown = bad.slice(0, 5).join(", ") + (bad.length > 5 ? `, +${bad.length - 5} more` : "");
|
|
234
|
+
return result("hooks-vendored", "fail", shown, initFix);
|
|
235
|
+
}));
|
|
236
|
+
// 4. hooks-registered
|
|
237
|
+
checks.push(guard("hooks-registered", () => {
|
|
238
|
+
const files = [".claude/settings.json", ".claude/settings.local.json"];
|
|
239
|
+
const commands = [];
|
|
240
|
+
for (const rel of files) {
|
|
241
|
+
const p = join(dir, rel);
|
|
242
|
+
if (!existsSync(p)) {
|
|
243
|
+
if (rel === files[0])
|
|
244
|
+
return result("hooks-registered", "fail", `${rel} is missing`, initFix);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const parsed = readJson(p);
|
|
248
|
+
if (!parsed.ok)
|
|
249
|
+
return result("hooks-registered", "fail", `${rel} is not valid JSON (${parsed.error})`, `repair the JSON in ${rel}, then run ${initFix}`);
|
|
250
|
+
for (const command of hookCommands(parsed.value))
|
|
251
|
+
commands.push({ file: rel, command });
|
|
252
|
+
}
|
|
253
|
+
if (!commands.some((c) => c.command.includes(HOOKS_MARK))) {
|
|
254
|
+
return result("hooks-registered", "fail", "no hook in .claude/settings.json runs .doug/hooks/scripts/", initFix);
|
|
255
|
+
}
|
|
256
|
+
const ref = /\$\{?CLAUDE_PROJECT_DIR\}?\/([^\s"']+)/g;
|
|
257
|
+
const missingHooks = [];
|
|
258
|
+
const missingOther = [];
|
|
259
|
+
for (const { file, command } of commands) {
|
|
260
|
+
for (const m of command.matchAll(ref)) {
|
|
261
|
+
const p = m[1];
|
|
262
|
+
if (existsSync(join(dir, p)))
|
|
263
|
+
continue;
|
|
264
|
+
if (p.startsWith(".doug/hooks/"))
|
|
265
|
+
missingHooks.push(p);
|
|
266
|
+
else
|
|
267
|
+
missingOther.push({ file, path: p });
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (missingHooks.length > 0)
|
|
271
|
+
return result("hooks-registered", "fail", `registered hook files are missing: ${missingHooks.slice(0, 5).join(", ")}`, initFix);
|
|
272
|
+
if (missingOther.length > 0) {
|
|
273
|
+
const first = missingOther[0];
|
|
274
|
+
return result("hooks-registered", "fail", `a hook in ${first.file} points at ${first.path}, which does not exist`, `remove or repair that hook in ${first.file}`);
|
|
275
|
+
}
|
|
276
|
+
return result("hooks-registered", "ok", `${commands.length} hook commands, every referenced file exists`);
|
|
277
|
+
}));
|
|
278
|
+
// statusline
|
|
279
|
+
checks.push(guard("statusline", () => {
|
|
280
|
+
const pair = readSettingsPair(dir);
|
|
281
|
+
if (!pair)
|
|
282
|
+
return result("statusline", "skip", "skipped: .claude/settings.json is missing or not valid JSON");
|
|
283
|
+
const sl = pair.local && pair.local.statusLine !== undefined ? pair.local.statusLine : pair.main.statusLine;
|
|
284
|
+
if (sl === undefined || sl === null)
|
|
285
|
+
return result("statusline", "warn", "no status line in .claude/settings.json", initFix);
|
|
286
|
+
const command = isObject(sl) && typeof sl.command === "string" ? sl.command : "";
|
|
287
|
+
if (!command.includes(STATUSLINE_MARK))
|
|
288
|
+
return result("statusline", "skip", "a custom status line is set; Doug's is not used");
|
|
289
|
+
if (!existsSync(join(dir, STATUSLINE_MARK)))
|
|
290
|
+
return result("statusline", "warn", `the status line runs ${STATUSLINE_MARK}, which does not exist`, initFix);
|
|
291
|
+
return result("statusline", "ok", `status line runs ${STATUSLINE_MARK}`);
|
|
292
|
+
}));
|
|
293
|
+
// subagent-settings
|
|
294
|
+
checks.push(guard("subagent-settings", () => {
|
|
295
|
+
const pair = readSettingsPair(dir);
|
|
296
|
+
if (!pair)
|
|
297
|
+
return result("subagent-settings", "skip", "skipped: .claude/settings.json is missing or not valid JSON");
|
|
298
|
+
const cfg = readConfigObject(dir);
|
|
299
|
+
const sub = cfg && isObject(cfg.subagents) ? cfg.subagents : {};
|
|
300
|
+
const expected = (k) => sub[k] !== null;
|
|
301
|
+
const ttl = pair.local && pair.local[PROMPT_CACHE_TTL_KEY] !== undefined ? pair.local[PROMPT_CACHE_TTL_KEY] : pair.main[PROMPT_CACHE_TTL_KEY];
|
|
302
|
+
const conc = settingsEnvValue(pair, WORKFLOW_CONCURRENCY_ENV);
|
|
303
|
+
const depth = settingsEnvValue(pair, SUBAGENT_DEPTH_ENV);
|
|
304
|
+
const rows = [
|
|
305
|
+
{ want: expected("promptCacheTtl"), label: PROMPT_CACHE_TTL_KEY, value: ttl, text: `subagent prompt cache ${String(ttl)}` },
|
|
306
|
+
{ want: expected("maxConcurrentWorkflowAgents"), label: WORKFLOW_CONCURRENCY_ENV, value: conc, text: `${String(conc)} concurrent workflow agents` },
|
|
307
|
+
{ want: expected("maxSpawnDepth"), label: SUBAGENT_DEPTH_ENV, value: depth, text: `spawn depth ${String(depth)}` },
|
|
308
|
+
];
|
|
309
|
+
const wanted = rows.filter((r) => r.want);
|
|
310
|
+
if (wanted.length === 0)
|
|
311
|
+
return result("subagent-settings", "skip", "no subagent settings are expected (all null in .doug/config.json)");
|
|
312
|
+
const missing = wanted.filter((r) => r.value === undefined);
|
|
313
|
+
if (missing.length > 0)
|
|
314
|
+
return result("subagent-settings", "warn", `missing in .claude/settings.json: ${missing.map((r) => r.label).join(", ")}`, initFix);
|
|
315
|
+
return result("subagent-settings", "ok", wanted.map((r) => r.text).join(", "));
|
|
316
|
+
}));
|
|
317
|
+
// board
|
|
318
|
+
checks.push(guard("board", () => {
|
|
319
|
+
const rel = existsSync(join(dir, BOARD_RELPATH)) ? BOARD_RELPATH : existsSync(join(dir, FALLBACK_RELPATH)) ? FALLBACK_RELPATH : null;
|
|
320
|
+
if (rel === null)
|
|
321
|
+
return result("board", "warn", "no board", `doug board init${initFix.slice("doug init".length)}`);
|
|
322
|
+
const parsed = readJson(join(dir, rel));
|
|
323
|
+
if (!parsed.ok || !isObject(parsed.value) || !Array.isArray(parsed.value.cards)) {
|
|
324
|
+
return result("board", "warn", `${rel} is not a board (unparsable or no cards array)`, `repair the JSON in ${rel}`);
|
|
325
|
+
}
|
|
326
|
+
return result("board", "ok", `${rel}: ${parsed.value.cards.length} cards; view it with doug board serve --open`);
|
|
327
|
+
}));
|
|
328
|
+
// 5. codex
|
|
329
|
+
checks.push(guard("codex", () => {
|
|
330
|
+
const found = onPath("codex", env);
|
|
331
|
+
if (found)
|
|
332
|
+
return result("codex", "ok", `codex found at ${found}`);
|
|
333
|
+
return result("codex", "warn", "codex is not on PATH; the adversary falls back to Claude", "install the Codex CLI (docs/getting-started.md)");
|
|
334
|
+
}));
|
|
335
|
+
// adversary
|
|
336
|
+
checks.push(guard("adversary", () => {
|
|
337
|
+
const cfg = readConfigObject(dir);
|
|
338
|
+
const cmds = cfg && isObject(cfg.commands) ? cfg.commands : null;
|
|
339
|
+
if (cmds && typeof cmds.adversary === "string" && cmds.adversary.length > 0) {
|
|
340
|
+
return result("adversary", "ok", `adversary command is ${cmds.adversary}`);
|
|
341
|
+
}
|
|
342
|
+
const found = onPath("codex-review", env);
|
|
343
|
+
if (found)
|
|
344
|
+
return result("adversary", "ok", `codex-review found at ${found}`);
|
|
345
|
+
return result("adversary", "warn", "codex-review is not on PATH; the adversary falls back to the Claude adversary", "npm install -g @dougharness/codex");
|
|
346
|
+
}));
|
|
347
|
+
// 6. memory
|
|
348
|
+
checks.push(guard("memory", () => {
|
|
349
|
+
if (nodeCheck.status === "fail" || !lib)
|
|
350
|
+
return result("memory", "skip", "skipped: the node check failed");
|
|
351
|
+
const info = lib.inspectMemory(dir);
|
|
352
|
+
if (!info.exists)
|
|
353
|
+
return result("memory", "skip", "no memory store yet; it is created on first memory use");
|
|
354
|
+
const mv = "mv .doug/.state/memory/memory.db .doug/.state/memory/memory.db.broken";
|
|
355
|
+
if (info.error)
|
|
356
|
+
return result("memory", "fail", `memory store cannot be read (${info.error})`, mv);
|
|
357
|
+
if (info.userVersion !== null && info.userVersion > info.maxUserVersion) {
|
|
358
|
+
return result("memory", "fail", `memory store is user_version ${info.userVersion}; this CLI understands up to ${info.maxUserVersion}`, INSTALL_CLI_FIX);
|
|
359
|
+
}
|
|
360
|
+
if (info.quickCheck !== "ok")
|
|
361
|
+
return result("memory", "fail", `memory store quick_check: ${info.quickCheck}`, mv);
|
|
362
|
+
if (info.userVersion === null || info.userVersion < 1)
|
|
363
|
+
return result("memory", "fail", `memory store has user_version ${info.userVersion}`, mv);
|
|
364
|
+
return result("memory", "ok", `memory store opens (user_version ${info.userVersion})`);
|
|
365
|
+
}));
|
|
366
|
+
// embeddings
|
|
367
|
+
checks.push(guard("embeddings", () => {
|
|
368
|
+
if (configCheck.status !== "ok")
|
|
369
|
+
return result("embeddings", "skip", "skipped: the config check is not ok");
|
|
370
|
+
const e = readMemoryConfig(dir).embeddings;
|
|
371
|
+
if (e)
|
|
372
|
+
return result("embeddings", "ok", `semantic memory: ${e.provider} ${e.model}/${e.dims} at ${String(e.baseUrl)}`);
|
|
373
|
+
return result("embeddings", "warn", "semantic memory is off; recall is keyword-only", `doug memory setup${initFix.slice("doug init".length)}`);
|
|
374
|
+
}));
|
|
375
|
+
// plugins
|
|
376
|
+
checks.push(guard("plugins", () => {
|
|
377
|
+
const missing = [];
|
|
378
|
+
const plugins = readInstalledPlugins();
|
|
379
|
+
for (const key of [FLOW_KEY, GATES_KEY])
|
|
380
|
+
if (!plugins || pickRecord(plugins, key) === null)
|
|
381
|
+
missing.push(key);
|
|
382
|
+
if (missing.length === 0)
|
|
383
|
+
return result("plugins", "ok", "doug-flow and doug-gates are installed");
|
|
384
|
+
const why = plugins ? `not installed: ${missing.join(", ")}` : `no readable installed_plugins.json; not installed: ${missing.join(", ")}`;
|
|
385
|
+
return result("plugins", "warn", `${why}; a session started with claude --plugin-dir loads them without an install`, PLUGINS_FIX);
|
|
386
|
+
}));
|
|
387
|
+
// 7. plugin-versions
|
|
388
|
+
checks.push(guard("plugin-versions", () => {
|
|
389
|
+
const cliVersion = deps.cliVersion ?? cliPackageVersion();
|
|
390
|
+
const cfgDir = deps.claudeConfigDir ?? env.CLAUDE_CONFIG_DIR ?? join(homedir(), ".claude");
|
|
391
|
+
const file = join(cfgDir, "plugins", "installed_plugins.json");
|
|
392
|
+
const skip = (why) => result("plugin-versions", "skip", `skipped: ${why}`);
|
|
393
|
+
if (!existsSync(file))
|
|
394
|
+
return skip("no installed_plugins.json");
|
|
395
|
+
const parsed = readJson(file);
|
|
396
|
+
if (!parsed.ok || !isObject(parsed.value))
|
|
397
|
+
return skip("installed_plugins.json is not readable");
|
|
398
|
+
if (parsed.value.version !== 2 || !isObject(parsed.value.plugins))
|
|
399
|
+
return skip("installed_plugins.json has an unexpected format");
|
|
400
|
+
const plugins = parsed.value.plugins;
|
|
401
|
+
const pick = (key) => {
|
|
402
|
+
const records = plugins[key];
|
|
403
|
+
if (!Array.isArray(records))
|
|
404
|
+
return null;
|
|
405
|
+
const usable = records.filter((r) => isObject(r) && typeof r.version === "string");
|
|
406
|
+
const chosen = usable.find((r) => typeof r.projectPath === "string" && resolve(r.projectPath) === dir) ?? usable.find((r) => r.scope === "user");
|
|
407
|
+
return chosen ? chosen.version : null;
|
|
408
|
+
};
|
|
409
|
+
const flow = pick(FLOW_KEY);
|
|
410
|
+
const gates = pick(GATES_KEY);
|
|
411
|
+
if (flow === null || gates === null)
|
|
412
|
+
return skip("doug-flow or doug-gates is not in installed_plugins.json");
|
|
413
|
+
const detail = `doug-flow ${flow}, doug-gates ${gates}, CLI ${cliVersion}`;
|
|
414
|
+
for (const [key, version] of [
|
|
415
|
+
[FLOW_KEY, flow],
|
|
416
|
+
[GATES_KEY, gates],
|
|
417
|
+
]) {
|
|
418
|
+
const c = cmpVersion(version, cliVersion);
|
|
419
|
+
if (c < 0)
|
|
420
|
+
return result("plugin-versions", "warn", detail, `claude plugin update ${key}`);
|
|
421
|
+
if (c > 0)
|
|
422
|
+
return result("plugin-versions", "warn", detail, `${INSTALL_CLI_FIX}@${version}`);
|
|
423
|
+
}
|
|
424
|
+
return result("plugin-versions", "ok", detail);
|
|
425
|
+
}));
|
|
426
|
+
return checks;
|
|
427
|
+
}
|
|
428
|
+
function cliPackageVersion() {
|
|
429
|
+
try {
|
|
430
|
+
return String(createRequire(import.meta.url)("../package.json").version);
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
return "unknown";
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
export function renderDoctor(report) {
|
|
437
|
+
const out = [];
|
|
438
|
+
for (const c of report.checks) {
|
|
439
|
+
out.push(`${c.status.padEnd(4)} ${c.id.padEnd(16)} ${c.detail}`);
|
|
440
|
+
if (c.fix)
|
|
441
|
+
out.push(` fix: ${c.fix}`);
|
|
442
|
+
}
|
|
443
|
+
const n = report.counts;
|
|
444
|
+
out.push(`doctor: ${n.ok} ok, ${n.warn} warn, ${n.fail} fail, ${n.skip} skip`);
|
|
445
|
+
return out.join("\n") + "\n";
|
|
446
|
+
}
|
|
447
|
+
export async function runDoctor(argv, io, deps = {}) {
|
|
448
|
+
const out = io || {
|
|
449
|
+
stdout: (s) => void process.stdout.write(s),
|
|
450
|
+
stderr: (s) => void process.stderr.write(s),
|
|
451
|
+
};
|
|
452
|
+
let json = false;
|
|
453
|
+
let help = false;
|
|
454
|
+
const positional = [];
|
|
455
|
+
for (const a of argv) {
|
|
456
|
+
if (a === "--json")
|
|
457
|
+
json = true;
|
|
458
|
+
else if (a === "--help")
|
|
459
|
+
help = true;
|
|
460
|
+
else if (a.startsWith("-")) {
|
|
461
|
+
out.stderr(`doug doctor: unknown option ${a}\n\n${DOCTOR_USAGE}`);
|
|
462
|
+
return 2;
|
|
463
|
+
}
|
|
464
|
+
else
|
|
465
|
+
positional.push(a);
|
|
466
|
+
}
|
|
467
|
+
if (help) {
|
|
468
|
+
out.stdout(DOCTOR_USAGE);
|
|
469
|
+
return 0;
|
|
470
|
+
}
|
|
471
|
+
if (positional.length > 1) {
|
|
472
|
+
out.stderr(`doug doctor: expected at most one directory\n\n${DOCTOR_USAGE}`);
|
|
473
|
+
return 2;
|
|
474
|
+
}
|
|
475
|
+
const dir = resolve(positional[0] ?? deps.cwd ?? process.cwd());
|
|
476
|
+
const initFix = positional[0] ? `doug init ${/\s/.test(positional[0]) ? JSON.stringify(positional[0]) : positional[0]}` : "doug init";
|
|
477
|
+
const checks = await collectChecks(dir, deps, initFix);
|
|
478
|
+
const counts = { ok: 0, warn: 0, fail: 0, skip: 0 };
|
|
479
|
+
for (const c of checks)
|
|
480
|
+
counts[c.status]++;
|
|
481
|
+
const report = {
|
|
482
|
+
dir,
|
|
483
|
+
cliVersion: deps.cliVersion ?? cliPackageVersion(),
|
|
484
|
+
ok: counts.fail === 0,
|
|
485
|
+
counts,
|
|
486
|
+
checks,
|
|
487
|
+
};
|
|
488
|
+
out.stdout(json ? JSON.stringify(report, null, 2) + "\n" : renderDoctor(report));
|
|
489
|
+
return counts.fail > 0 ? 1 : 0;
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,13 @@ export declare function isDougAgent(text: string): boolean;
|
|
|
12
12
|
* one), else returns `generated` unchanged (an old-form file with no such section). Pure: no filesystem.
|
|
13
13
|
*/
|
|
14
14
|
export declare function spliceProjectNotes(generated: string, existing: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Returns `generated` with the top-level `skills:` block of `existing`'s frontmatter copied verbatim in
|
|
17
|
+
* before the `doug: generated` line. The block is user-owned and survives a refresh (card
|
|
18
|
+
* role-skills-preload); the generator never emits one itself. Returns `generated` unchanged when
|
|
19
|
+
* `existing` has no such block in its frontmatter or `generated` already has a `skills:` key. Pure.
|
|
20
|
+
*/
|
|
21
|
+
export declare function spliceSkills(generated: string, existing: string): string;
|
|
15
22
|
export interface AgentFile {
|
|
16
23
|
path: string;
|
|
17
24
|
content: string;
|