buddy-agent-harness 0.17.0 → 0.18.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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/dist/cli.mjs +243 -11
- package/dist/index.d.mts +68 -5
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +248 -12
- package/dist/index.mjs.map +1 -1
- package/dist/skill-scripts/doctor.mjs +44 -43
- package/dist/skill-scripts/init.mjs +44 -43
- package/dist/skill-scripts/mcp.mjs +44 -43
- package/dist/skill-scripts/reference.mjs +44 -43
- package/llms.txt +3 -2
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/doctor-buddy-agent-harness/SKILL.md +5 -1
- package/skills/doctor-buddy-agent-harness/references/global-instructions.md +30 -0
- package/skills/doctor-buddy-agent-harness/references/harnesses/claude-code.md +3 -2
- package/skills/doctor-buddy-agent-harness/references/harnesses/codex.md +4 -2
- package/skills/doctor-buddy-agent-harness/references/harnesses/copilot-cli.md +3 -2
- package/skills/doctor-buddy-agent-harness/references/harnesses/cursor.md +1 -1
- package/skills/doctor-buddy-agent-harness/references/harnesses/gemini-cli.md +2 -2
- package/skills/doctor-buddy-agent-harness/scripts/doctor.mjs +44 -43
- package/skills/enhance/SKILL.md +13 -2
- package/skills/enhance/scripts/doctor.mjs +486 -0
- package/skills/init-buddy-agent-harness/SKILL.md +1 -1
- package/skills/init-buddy-agent-harness/scripts/doctor.mjs +44 -43
- package/skills/init-buddy-agent-harness/scripts/init.mjs +44 -43
- package/skills/reference/SKILL.md +1 -1
- package/skills/reference/scripts/reference.mjs +44 -43
- package/skills/repair/SKILL.md +3 -1
- package/skills/repair/scripts/doctor.mjs +44 -43
- package/skills/repair/scripts/mcp.mjs +44 -43
- package/src/diagnose-bridges/diagnose-bridges.ts +27 -2
- package/src/diagnose-bridges/diagnose-global-instructions.ts +154 -0
- package/src/diagnose-bridges/diagnose-instructions.ts +7 -2
- package/src/diagnose-bridges/doctor-guidance.ts +152 -6
- package/src/diagnose-bridges/doctor.command.ts +6 -1
- package/src/harness-registry/harness-registry.ts +38 -4
- package/src/harness-registry/instruction-bridge.ts +25 -9
- package/src/index.ts +8 -0
- package/src/skill-scripts/launchers.ts +1 -0
package/dist/cli.mjs
CHANGED
|
@@ -17958,6 +17958,12 @@ function skillsProjection(harness, scope, directories = skillsDirectories(harnes
|
|
|
17958
17958
|
return listed.includes(".agents/skills") ? {} : { skillsDirectory: first };
|
|
17959
17959
|
}
|
|
17960
17960
|
/**
|
|
17961
|
+
* The user-scope counterpart of the root `AGENTS.md`, relative to the home directory. No harness
|
|
17962
|
+
* reads it natively; each loads it only through a user-scope `instructionBridge` (E-CC-18, E-CODEX-05,
|
|
17963
|
+
* E-GEM-03, E-COPILOT-04, E-CUR-08).
|
|
17964
|
+
*/
|
|
17965
|
+
const globalInstructions = ".agents/AGENTS.md";
|
|
17966
|
+
/**
|
|
17961
17967
|
* Skills directories come from `@cyberuni/agent-harness`, except for the harnesses it does not know
|
|
17962
17968
|
* (`devin-desktop`, `windsurf`); see `.research/agentic-configuration-standards/` for the rest.
|
|
17963
17969
|
*/
|
|
@@ -17998,7 +18004,13 @@ const harnessRegistry = [
|
|
|
17998
18004
|
},
|
|
17999
18005
|
user: {
|
|
18000
18006
|
detect: ".claude",
|
|
18001
|
-
...skillsProjection("claude-code", "user")
|
|
18007
|
+
...skillsProjection("claude-code", "user"),
|
|
18008
|
+
relocatedBy: "CLAUDE_CONFIG_DIR",
|
|
18009
|
+
instructionBridge: {
|
|
18010
|
+
kind: "import",
|
|
18011
|
+
path: ".claude/CLAUDE.md",
|
|
18012
|
+
line: `@~/${globalInstructions}`
|
|
18013
|
+
}
|
|
18002
18014
|
}
|
|
18003
18015
|
},
|
|
18004
18016
|
{
|
|
@@ -18060,7 +18072,13 @@ const harnessRegistry = [
|
|
|
18060
18072
|
},
|
|
18061
18073
|
user: {
|
|
18062
18074
|
detect: ".codex",
|
|
18063
|
-
...skillsProjection("codex", "user")
|
|
18075
|
+
...skillsProjection("codex", "user"),
|
|
18076
|
+
instructionBridge: {
|
|
18077
|
+
kind: "symlink",
|
|
18078
|
+
path: ".codex/AGENTS.md"
|
|
18079
|
+
},
|
|
18080
|
+
shadowedBy: [".codex/AGENTS.override.md"],
|
|
18081
|
+
relocatedBy: "CODEX_HOME"
|
|
18064
18082
|
}
|
|
18065
18083
|
},
|
|
18066
18084
|
{
|
|
@@ -18088,7 +18106,12 @@ const harnessRegistry = [
|
|
|
18088
18106
|
},
|
|
18089
18107
|
user: {
|
|
18090
18108
|
detect: ".copilot",
|
|
18091
|
-
...skillsProjection("copilot-cli", "user")
|
|
18109
|
+
...skillsProjection("copilot-cli", "user"),
|
|
18110
|
+
relocatedBy: "COPILOT_HOME",
|
|
18111
|
+
instructionBridge: {
|
|
18112
|
+
kind: "symlink",
|
|
18113
|
+
path: ".copilot/copilot-instructions.md"
|
|
18114
|
+
}
|
|
18092
18115
|
}
|
|
18093
18116
|
},
|
|
18094
18117
|
{
|
|
@@ -18120,7 +18143,11 @@ const harnessRegistry = [
|
|
|
18120
18143
|
},
|
|
18121
18144
|
user: {
|
|
18122
18145
|
detect: ".gemini",
|
|
18123
|
-
...skillsProjection("gemini-cli", "user")
|
|
18146
|
+
...skillsProjection("gemini-cli", "user"),
|
|
18147
|
+
instructionBridge: {
|
|
18148
|
+
kind: "symlink",
|
|
18149
|
+
path: ".gemini/GEMINI.md"
|
|
18150
|
+
}
|
|
18124
18151
|
}
|
|
18125
18152
|
},
|
|
18126
18153
|
{
|
|
@@ -18328,6 +18355,61 @@ const instructionTable = {
|
|
|
18328
18355
|
}
|
|
18329
18356
|
};
|
|
18330
18357
|
repairsOf(instructionTable);
|
|
18358
|
+
const globalFile = `~/${globalInstructions}`;
|
|
18359
|
+
/**
|
|
18360
|
+
* The step that bridges one harness's user-scope file, in the words it is handed over in; `file` is
|
|
18361
|
+
* where it was found, which a variable such as `$CODEX_HOME` may have moved.
|
|
18362
|
+
*/
|
|
18363
|
+
function globalBridgeStep(bridge, file = `~/${bridge.path}`) {
|
|
18364
|
+
return bridge.kind === "import" ? `add the line \`${bridge.line}\` to ${file}` : `run \`ln -s ${globalFile} ${file}\``;
|
|
18365
|
+
}
|
|
18366
|
+
/** Every spelling of a user-scope path a report can carry: from `~`, and from the variable that moves it. */
|
|
18367
|
+
function userSpellings(scope, path) {
|
|
18368
|
+
const under = `${scope.detect}/`;
|
|
18369
|
+
return scope.relocatedBy !== void 0 && path.startsWith(under) ? [`~/${path}`, `$${scope.relocatedBy}/${path.slice(under.length)}`] : [`~/${path}`];
|
|
18370
|
+
}
|
|
18371
|
+
/** The bridge for a reported path; undefined for a path no harness registers, such as a table's `<path>`. */
|
|
18372
|
+
function userBridgeAt(file) {
|
|
18373
|
+
for (const { user } of harnessRegistry) {
|
|
18374
|
+
const bridge = user?.instructionBridge;
|
|
18375
|
+
if (user && bridge && userSpellings(user, bridge.path).includes(file)) return bridge;
|
|
18376
|
+
}
|
|
18377
|
+
}
|
|
18378
|
+
/** The step for one reported file, or a pointer to where it is written when the path is not one. */
|
|
18379
|
+
function stepAt(file, keepContent) {
|
|
18380
|
+
const bridge = userBridgeAt(file);
|
|
18381
|
+
if (bridge === void 0) return `add the bridge the harness page names for ${file}`;
|
|
18382
|
+
return `${keepContent && bridge.kind !== "import" ? `move what ${file} says into ${globalFile} and remove it, then ` : ""}${globalBridgeStep(bridge, file)}`;
|
|
18383
|
+
}
|
|
18384
|
+
/** Outside the repository, so never written: a repair is a step handed to the user. */
|
|
18385
|
+
const handOver = "hand the user this step, since nothing here writes outside the repository:";
|
|
18386
|
+
const globalInstructionTable = {
|
|
18387
|
+
"global-instructions-missing": {
|
|
18388
|
+
detail: `no user-scope instruction file at this path — the harness loads none of ${globalFile}`,
|
|
18389
|
+
repair: ({ file }) => ({
|
|
18390
|
+
command: "",
|
|
18391
|
+
instruction: `${handOver} ${stepAt(file, false)}`
|
|
18392
|
+
}),
|
|
18393
|
+
skillRepair: () => "hand the user the step the harness page names for that file; write nothing yourself"
|
|
18394
|
+
},
|
|
18395
|
+
"global-instructions-unbridged": {
|
|
18396
|
+
detail: `the file holds its own content and does not load ${globalFile} — text placed there reaches no session of this harness`,
|
|
18397
|
+
repair: ({ file }) => ({
|
|
18398
|
+
command: "",
|
|
18399
|
+
instruction: `${handOver} ${stepAt(file, true)}`
|
|
18400
|
+
}),
|
|
18401
|
+
skillRepair: () => "hand the user the step the harness page names for that file, keeping what the file says; write nothing yourself"
|
|
18402
|
+
},
|
|
18403
|
+
"global-instructions-overridden": {
|
|
18404
|
+
detail: `the harness reads this file in place of its own user-scope file, so whatever that file loads goes unread, and this one does not load ${globalFile}`,
|
|
18405
|
+
repair: ({ file }) => ({
|
|
18406
|
+
command: "",
|
|
18407
|
+
instruction: `${handOver} move what ${file} says into ${globalFile} and remove it`
|
|
18408
|
+
}),
|
|
18409
|
+
skillRepair: () => "hand the user the move of what that file says into the global file, and its removal; write nothing yourself"
|
|
18410
|
+
}
|
|
18411
|
+
};
|
|
18412
|
+
repairsOf(globalInstructionTable);
|
|
18331
18413
|
const configurationTable = {
|
|
18332
18414
|
"deprecated-harness": {
|
|
18333
18415
|
detail: "a projection under a harness name that has been superseded — the replacement reads .agents/skills natively and needs no projection at all",
|
|
@@ -18504,6 +18586,7 @@ repairsOf(nonstandardTable);
|
|
|
18504
18586
|
const doctorTable = {
|
|
18505
18587
|
...bridgeTable,
|
|
18506
18588
|
...instructionTable,
|
|
18589
|
+
...globalInstructionTable,
|
|
18507
18590
|
...configurationTable,
|
|
18508
18591
|
...mcpTable,
|
|
18509
18592
|
...nonstandardTable
|
|
@@ -27649,7 +27732,7 @@ function projectChain(root) {
|
|
|
27649
27732
|
dir = parent;
|
|
27650
27733
|
}
|
|
27651
27734
|
}
|
|
27652
|
-
function isDirectory$
|
|
27735
|
+
function isDirectory$2(path) {
|
|
27653
27736
|
try {
|
|
27654
27737
|
return statSync(path).isDirectory();
|
|
27655
27738
|
} catch {
|
|
@@ -27685,7 +27768,7 @@ function dependencyLayers(root, skip) {
|
|
|
27685
27768
|
const dir = packageDir(pkg, manifestPath);
|
|
27686
27769
|
if (!dir || skip.has(canonical(dir))) continue;
|
|
27687
27770
|
const references = join(dir, "references");
|
|
27688
|
-
if (!isDirectory$
|
|
27771
|
+
if (!isDirectory$2(references)) continue;
|
|
27689
27772
|
const manifest = readJson(join(dir, "plugin.json"));
|
|
27690
27773
|
const manifestName = isRecord$1(manifest) && typeof manifest["name"] === "string" ? manifest["name"] : void 0;
|
|
27691
27774
|
const plugins = manifestName && manifestName !== pkg ? [pkg, manifestName] : [pkg];
|
|
@@ -27735,7 +27818,7 @@ async function referenceLayers({ root, home, platform, programData, packageRoot
|
|
|
27735
27818
|
plugins: self,
|
|
27736
27819
|
status: LEGACY_STATUS
|
|
27737
27820
|
},
|
|
27738
|
-
...enabled.filter(({ dir, skipped }) => skipped || isDirectory$
|
|
27821
|
+
...enabled.filter(({ dir, skipped }) => skipped || isDirectory$2(dir) && canonical(dirname(dir)) !== ownRoot),
|
|
27739
27822
|
...dependencyLayers(root, /* @__PURE__ */ new Set([ownRoot]))
|
|
27740
27823
|
];
|
|
27741
27824
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -27832,6 +27915,145 @@ function projectSkills({ root, canonicalSkills, harnesses, copy, force }) {
|
|
|
27832
27915
|
};
|
|
27833
27916
|
}
|
|
27834
27917
|
//#endregion
|
|
27918
|
+
//#region src/diagnose-bridges/diagnose-global-instructions.ts
|
|
27919
|
+
function isDirectory$1(path) {
|
|
27920
|
+
try {
|
|
27921
|
+
return lstatSync(path).isDirectory();
|
|
27922
|
+
} catch {
|
|
27923
|
+
return false;
|
|
27924
|
+
}
|
|
27925
|
+
}
|
|
27926
|
+
function exists$1(path) {
|
|
27927
|
+
try {
|
|
27928
|
+
lstatSync(path);
|
|
27929
|
+
return true;
|
|
27930
|
+
} catch {
|
|
27931
|
+
return false;
|
|
27932
|
+
}
|
|
27933
|
+
}
|
|
27934
|
+
/** The import a user wrote may spell the home directory either way; both load the same file. */
|
|
27935
|
+
function importsGlobal(body, bridge, home) {
|
|
27936
|
+
const spellings = bridge.kind === "import" ? [bridge.line, `@${join(home, globalInstructions)}`] : [];
|
|
27937
|
+
return body.split("\n").some((line) => spellings.includes(line.trim()));
|
|
27938
|
+
}
|
|
27939
|
+
/** Follows `relocatedBy` the way the harnesses do: an empty value is no value (E-CODEX-06, E-CC-19, E-COPILOT-05). */
|
|
27940
|
+
function locate(home, scope, env, path) {
|
|
27941
|
+
const variable = scope.relocatedBy;
|
|
27942
|
+
const moved = variable === void 0 ? void 0 : env[variable];
|
|
27943
|
+
if (!moved || path !== scope.detect && !path.startsWith(`${scope.detect}/`)) return {
|
|
27944
|
+
absolute: join(home, path),
|
|
27945
|
+
display: `~/${path}`
|
|
27946
|
+
};
|
|
27947
|
+
const rest = path.slice(scope.detect.length);
|
|
27948
|
+
return {
|
|
27949
|
+
absolute: join(resolve(moved), rest),
|
|
27950
|
+
display: `$${variable}${rest}`
|
|
27951
|
+
};
|
|
27952
|
+
}
|
|
27953
|
+
/** A shadow is read only where it is a file holding more than whitespace (E-CODEX-06). */
|
|
27954
|
+
function readsAsShadow(path) {
|
|
27955
|
+
try {
|
|
27956
|
+
return statSync(path).isFile() && readFileSync(path, "utf8").trim() !== "";
|
|
27957
|
+
} catch {
|
|
27958
|
+
return false;
|
|
27959
|
+
}
|
|
27960
|
+
}
|
|
27961
|
+
function inspect$1(home, target, bridge) {
|
|
27962
|
+
let stats;
|
|
27963
|
+
try {
|
|
27964
|
+
stats = lstatSync(target);
|
|
27965
|
+
} catch {
|
|
27966
|
+
return {
|
|
27967
|
+
kind: "none",
|
|
27968
|
+
status: "missing",
|
|
27969
|
+
problem: "global-instructions-missing"
|
|
27970
|
+
};
|
|
27971
|
+
}
|
|
27972
|
+
if (stats.isSymbolicLink()) return resolve(dirname(target), readlinkSync(target)) === join(home, ".agents/AGENTS.md") ? {
|
|
27973
|
+
kind: "symlink",
|
|
27974
|
+
status: "ok"
|
|
27975
|
+
} : {
|
|
27976
|
+
kind: "symlink",
|
|
27977
|
+
status: "unbridged",
|
|
27978
|
+
problem: "global-instructions-unbridged"
|
|
27979
|
+
};
|
|
27980
|
+
let body;
|
|
27981
|
+
try {
|
|
27982
|
+
body = readFileSync(target, "utf8");
|
|
27983
|
+
} catch {
|
|
27984
|
+
return {
|
|
27985
|
+
kind: "file",
|
|
27986
|
+
status: "unbridged",
|
|
27987
|
+
problem: "global-instructions-unbridged"
|
|
27988
|
+
};
|
|
27989
|
+
}
|
|
27990
|
+
return importsGlobal(body, bridge, home) ? {
|
|
27991
|
+
kind: "import",
|
|
27992
|
+
status: "ok"
|
|
27993
|
+
} : {
|
|
27994
|
+
kind: "file",
|
|
27995
|
+
status: "unbridged",
|
|
27996
|
+
problem: "global-instructions-unbridged"
|
|
27997
|
+
};
|
|
27998
|
+
}
|
|
27999
|
+
function finding(path, problem, cli) {
|
|
28000
|
+
const { detail, repair } = repairFor(problem);
|
|
28001
|
+
return {
|
|
28002
|
+
path,
|
|
28003
|
+
problem,
|
|
28004
|
+
detail,
|
|
28005
|
+
repair: repair({ file: path }, cli)
|
|
28006
|
+
};
|
|
28007
|
+
}
|
|
28008
|
+
/**
|
|
28009
|
+
* Whether each harness the user has installed loads `~/.agents/AGENTS.md` through its own user-scope
|
|
28010
|
+
* file, read from wherever `env` moves it. Read-only: the repair is handed to the user, since
|
|
28011
|
+
* nothing here writes outside the repository.
|
|
28012
|
+
*/
|
|
28013
|
+
function diagnoseGlobalInstructions(home, preferred, cli, env = {}) {
|
|
28014
|
+
const hasGlobal = exists$1(join(home, globalInstructions));
|
|
28015
|
+
const rows = [];
|
|
28016
|
+
const findings = [];
|
|
28017
|
+
for (const harness of harnessRegistry) {
|
|
28018
|
+
const user = harness.user;
|
|
28019
|
+
const bridge = user?.instructionBridge;
|
|
28020
|
+
if (!user || !bridge) continue;
|
|
28021
|
+
if (!preferred.includes(harness.name) && !isDirectory$1(locate(home, user, env, user.detect).absolute)) continue;
|
|
28022
|
+
const file = locate(home, user, env, bridge.path);
|
|
28023
|
+
const inspection = inspect$1(home, file.absolute, bridge);
|
|
28024
|
+
const shadow = (user.shadowedBy ?? []).map((path) => locate(home, user, env, path)).find(({ absolute }) => readsAsShadow(absolute));
|
|
28025
|
+
if (shadow !== void 0) {
|
|
28026
|
+
const read = inspect$1(home, shadow.absolute, bridge);
|
|
28027
|
+
if (read.status === "ok") {
|
|
28028
|
+
rows.push({
|
|
28029
|
+
harness: harness.name,
|
|
28030
|
+
path: shadow.display,
|
|
28031
|
+
kind: read.kind,
|
|
28032
|
+
status: "ok"
|
|
28033
|
+
});
|
|
28034
|
+
continue;
|
|
28035
|
+
}
|
|
28036
|
+
rows.push({
|
|
28037
|
+
harness: harness.name,
|
|
28038
|
+
path: file.display,
|
|
28039
|
+
kind: inspection.kind,
|
|
28040
|
+
status: "overridden"
|
|
28041
|
+
});
|
|
28042
|
+
if (hasGlobal) findings.push(finding(shadow.display, "global-instructions-overridden", cli));
|
|
28043
|
+
} else rows.push({
|
|
28044
|
+
harness: harness.name,
|
|
28045
|
+
path: file.display,
|
|
28046
|
+
kind: inspection.kind,
|
|
28047
|
+
status: inspection.status
|
|
28048
|
+
});
|
|
28049
|
+
if (hasGlobal && inspection.problem) findings.push(finding(file.display, inspection.problem, cli));
|
|
28050
|
+
}
|
|
28051
|
+
return {
|
|
28052
|
+
globalInstructions: rows,
|
|
28053
|
+
findings
|
|
28054
|
+
};
|
|
28055
|
+
}
|
|
28056
|
+
//#endregion
|
|
27835
28057
|
//#region src/diagnose-bridges/agents-files.ts
|
|
27836
28058
|
/** Directories that never hold instructions this repository is responsible for bridging. */
|
|
27837
28059
|
const pruned = /* @__PURE__ */ new Set(["node_modules"]);
|
|
@@ -27946,7 +28168,7 @@ function diagnoseInstructions(root, harnesses, cli) {
|
|
|
27946
28168
|
const bridged = harnesses.map((harness) => ({
|
|
27947
28169
|
name: harness.name,
|
|
27948
28170
|
bridge: harness.project.instructionBridge
|
|
27949
|
-
})).filter((harness) =>
|
|
28171
|
+
})).filter((harness) => harness.bridge?.kind === "settings-entry");
|
|
27950
28172
|
const instructions = [];
|
|
27951
28173
|
const findings = [];
|
|
27952
28174
|
const directories = agentsFileDirectories(root);
|
|
@@ -28202,7 +28424,7 @@ function inspect(target, path, canonical, git) {
|
|
|
28202
28424
|
* Read-only: nothing is created, moved, or repaired — the caller decides what to run from the
|
|
28203
28425
|
* repair each finding carries.
|
|
28204
28426
|
*/
|
|
28205
|
-
function diagnoseBridges({ root, harnesses: preferred = [], cli }) {
|
|
28427
|
+
function diagnoseBridges({ root, harnesses: preferred = [], cli, home, env }) {
|
|
28206
28428
|
const canonical = join(root, ".agents", "skills");
|
|
28207
28429
|
const git = new GitBridgeState(root);
|
|
28208
28430
|
const selected = selectHarnesses(root, preferred);
|
|
@@ -28247,9 +28469,15 @@ function diagnoseBridges({ root, harnesses: preferred = [], cli }) {
|
|
|
28247
28469
|
}
|
|
28248
28470
|
const instructions = diagnoseInstructions(root, selected, cli);
|
|
28249
28471
|
findings.push(...instructions.findings);
|
|
28472
|
+
const global = home === void 0 ? {
|
|
28473
|
+
globalInstructions: [],
|
|
28474
|
+
findings: []
|
|
28475
|
+
} : diagnoseGlobalInstructions(home, preferred, cli, env);
|
|
28476
|
+
findings.push(...global.findings);
|
|
28250
28477
|
return {
|
|
28251
28478
|
bridges,
|
|
28252
28479
|
instructions: instructions.instructions,
|
|
28480
|
+
globalInstructions: global.globalInstructions,
|
|
28253
28481
|
divergence,
|
|
28254
28482
|
findings
|
|
28255
28483
|
};
|
|
@@ -28270,6 +28498,7 @@ function buildDoctorReport(bin, result, configuration = [], held = []) {
|
|
|
28270
28498
|
bin,
|
|
28271
28499
|
bridges: result.bridges,
|
|
28272
28500
|
instructions: result.instructions,
|
|
28501
|
+
globalInstructions: result.globalInstructions,
|
|
28273
28502
|
references,
|
|
28274
28503
|
findings: `0 problems found — ${bridges} and the configuration around them is current`
|
|
28275
28504
|
};
|
|
@@ -28278,6 +28507,7 @@ function buildDoctorReport(bin, result, configuration = [], held = []) {
|
|
|
28278
28507
|
bin,
|
|
28279
28508
|
bridges: result.bridges,
|
|
28280
28509
|
instructions: result.instructions,
|
|
28510
|
+
globalInstructions: result.globalInstructions,
|
|
28281
28511
|
references,
|
|
28282
28512
|
...result.divergence.length ? { divergence: result.divergence } : {},
|
|
28283
28513
|
findings: findings.map(({ path, problem, detail }) => ({
|
|
@@ -28290,7 +28520,7 @@ function buildDoctorReport(bin, result, configuration = [], held = []) {
|
|
|
28290
28520
|
}
|
|
28291
28521
|
const doctorCommand = command({
|
|
28292
28522
|
name: "doctor",
|
|
28293
|
-
description: "Report whether this repository's harness bridges still resolve — skills into .agents/skills, instructions into AGENTS.md. Read-only.",
|
|
28523
|
+
description: "Report whether this repository's harness bridges still resolve — skills into .agents/skills, instructions into AGENTS.md — and whether each harness's user-scope file loads ~/.agents/AGENTS.md. Read-only.",
|
|
28294
28524
|
options: {
|
|
28295
28525
|
root: {
|
|
28296
28526
|
description: "Repository or package directory. Defaults to the current directory.",
|
|
@@ -28315,7 +28545,9 @@ const doctorCommand = command({
|
|
|
28315
28545
|
const result = diagnoseBridges({
|
|
28316
28546
|
root,
|
|
28317
28547
|
...harnesses.length ? { harnesses } : {},
|
|
28318
|
-
cli: commandInvocation
|
|
28548
|
+
cli: commandInvocation,
|
|
28549
|
+
home,
|
|
28550
|
+
env: process.env
|
|
28319
28551
|
});
|
|
28320
28552
|
const git = new GitBridgeState(root);
|
|
28321
28553
|
const configuration = [
|
package/dist/index.d.mts
CHANGED
|
@@ -10,15 +10,28 @@ export declare function run(argv: string[]): Promise<number>;
|
|
|
10
10
|
//#region src/harness-registry/instruction-bridge.d.ts
|
|
11
11
|
/**
|
|
12
12
|
* What a harness needs to read `AGENTS.md`; a union because the shape is per harness — Gemini CLI's
|
|
13
|
-
* is a settings entry,
|
|
13
|
+
* project bridge is a settings entry, Claude Code's user bridge an import line, and a harness with
|
|
14
|
+
* neither can only be given a symlink.
|
|
14
15
|
*/
|
|
15
16
|
type InstructionBridge = {
|
|
16
17
|
/** An `AGENTS.md` entry in an array inside a JSON settings file. */
|
|
17
18
|
kind: "settings-entry";
|
|
18
|
-
/**
|
|
19
|
+
/** Path of the settings file, relative to the scope's root. */
|
|
19
20
|
path: string;
|
|
20
21
|
/** Dotted path to the array within it, as the harness documents it. */
|
|
21
22
|
key: string;
|
|
23
|
+
} | {
|
|
24
|
+
/** A line in the harness's own instruction file that pulls the canonical file in. */
|
|
25
|
+
kind: "import";
|
|
26
|
+
/** Path of the instruction file, relative to the scope's root. */
|
|
27
|
+
path: string;
|
|
28
|
+
/** The line itself, exactly as the harness documents the syntax. */
|
|
29
|
+
line: string;
|
|
30
|
+
} | {
|
|
31
|
+
/** The harness's own instruction file, replaced by a symlink to the canonical file. */
|
|
32
|
+
kind: "symlink";
|
|
33
|
+
/** Path of the instruction file, relative to the scope's root. */
|
|
34
|
+
path: string;
|
|
22
35
|
};
|
|
23
36
|
//#endregion
|
|
24
37
|
//#region src/diagnose-mcp/mcp-model.d.ts
|
|
@@ -88,6 +101,11 @@ type HarnessScope = {
|
|
|
88
101
|
instructionBridge?: InstructionBridge;
|
|
89
102
|
/** Files whose presence beside `AGENTS.md` stop the harness reading it. */
|
|
90
103
|
shadowedBy?: readonly string[];
|
|
104
|
+
/**
|
|
105
|
+
* An environment variable that, set and non-empty, replaces the `detect` directory: every path
|
|
106
|
+
* under it is read from the variable's value instead.
|
|
107
|
+
*/
|
|
108
|
+
relocatedBy?: string;
|
|
91
109
|
/** Where this harness keeps its own MCP servers; `doctor` compares against it and never writes. */
|
|
92
110
|
mcpConfig?: McpConfig;
|
|
93
111
|
/** What this harness reads that no other can, reported so it can be converted to canonical form. */
|
|
@@ -111,6 +129,35 @@ type Harness = {
|
|
|
111
129
|
*/
|
|
112
130
|
export declare const harnessRegistry: readonly Harness[];
|
|
113
131
|
//#endregion
|
|
132
|
+
//#region src/diagnose-bridges/diagnose-global-instructions.d.ts
|
|
133
|
+
/** What is at a harness's user-scope instruction file. */
|
|
134
|
+
type GlobalInstructionKind = "import" | "symlink" | "file" | "none";
|
|
135
|
+
/**
|
|
136
|
+
* `missing`: no file, so the harness loads no user instructions at all; `unbridged`: a file that
|
|
137
|
+
* loads its own content and not the global one; `overridden`: a file the harness reads in its place,
|
|
138
|
+
* such as Codex's `AGENTS.override.md`, that does not load the global one either.
|
|
139
|
+
*/
|
|
140
|
+
type GlobalInstructionStatus = "ok" | "missing" | "unbridged" | "overridden";
|
|
141
|
+
type GlobalInstructionReport = {
|
|
142
|
+
harness: HarnessName;
|
|
143
|
+
/**
|
|
144
|
+
* The harness's user-scope instruction file, written from `~` so the report is publishable, or
|
|
145
|
+
* from the variable that moved it, such as `$CODEX_HOME`.
|
|
146
|
+
*/
|
|
147
|
+
path: string;
|
|
148
|
+
kind: GlobalInstructionKind;
|
|
149
|
+
status: GlobalInstructionStatus;
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* Whether each harness the user has installed loads `~/.agents/AGENTS.md` through its own user-scope
|
|
153
|
+
* file, read from wherever `env` moves it. Read-only: the repair is handed to the user, since
|
|
154
|
+
* nothing here writes outside the repository.
|
|
155
|
+
*/
|
|
156
|
+
export declare function diagnoseGlobalInstructions(home: string, preferred: readonly HarnessName[], cli: string, env?: NodeJS.ProcessEnv): {
|
|
157
|
+
globalInstructions: GlobalInstructionReport[];
|
|
158
|
+
findings: BridgeFinding[];
|
|
159
|
+
};
|
|
160
|
+
//#endregion
|
|
114
161
|
//#region src/diagnose-bridges/diagnose-instructions.d.ts
|
|
115
162
|
/** What is on disk where an instruction bridge belongs, or where a shadowing file may sit. */
|
|
116
163
|
type InstructionKind = "import" | "symlink" | "settings-entry" | "file" | "none";
|
|
@@ -183,8 +230,10 @@ type McpProblem = "mcp-golden-unreadable" | "mcp-target-unreadable" | "mcp-unpro
|
|
|
183
230
|
type NonstandardProblem = "nonstandard-instructions" | "nonstandard-rule" | "nonstandard-command" | "nonstandard-skill" | "nonstandard-subagent";
|
|
184
231
|
/** Every way a harness can end up reading none of `AGENTS.md`. */
|
|
185
232
|
type InstructionProblem = "no-instructions" | "instructions-missing" | "instructions-unbridged" | "instructions-unreadable" | "instructions-shadowing" | "instructions-superseded";
|
|
233
|
+
/** Every way a harness's user-scope instruction file fails to load `~/.agents/AGENTS.md`. */
|
|
234
|
+
type GlobalInstructionProblem = "global-instructions-missing" | "global-instructions-unbridged" | "global-instructions-overridden";
|
|
186
235
|
/** Everything `doctor` can report against, across every section. */
|
|
187
|
-
type DoctorProblem = BridgeProblem | InstructionProblem | ConfigurationFault | McpProblem | NonstandardProblem;
|
|
236
|
+
type DoctorProblem = BridgeProblem | InstructionProblem | GlobalInstructionProblem | ConfigurationFault | McpProblem | NonstandardProblem;
|
|
188
237
|
/** Alias kept for callers that name the whole set rather than one section. */
|
|
189
238
|
type ConfigurationProblem = DoctorProblem;
|
|
190
239
|
type RepairAction = {
|
|
@@ -210,6 +259,7 @@ type Repair = {
|
|
|
210
259
|
};
|
|
211
260
|
export declare const bridgeRepairs: readonly Repair[];
|
|
212
261
|
export declare const instructionRepairs: readonly Repair[];
|
|
262
|
+
export declare const globalInstructionRepairs: readonly Repair[];
|
|
213
263
|
export declare const doctorRepairs: readonly Repair[];
|
|
214
264
|
export declare const doctorSkill: {
|
|
215
265
|
readonly name: "doctor-buddy-agent-harness";
|
|
@@ -289,6 +339,16 @@ type DiagnoseOptions = {
|
|
|
289
339
|
harnesses?: HarnessName[];
|
|
290
340
|
/** How to name this tool in the repair commands. */
|
|
291
341
|
cli: string;
|
|
342
|
+
/**
|
|
343
|
+
* The home directory whose user-scope instruction files are checked for loading
|
|
344
|
+
* `~/.agents/AGENTS.md`; omitted, none are.
|
|
345
|
+
*/
|
|
346
|
+
home?: string;
|
|
347
|
+
/**
|
|
348
|
+
* The environment the harnesses run in, for the variables that move their user-scope files —
|
|
349
|
+
* `CODEX_HOME`, `COPILOT_HOME`, `CLAUDE_CONFIG_DIR`; omitted, none is followed.
|
|
350
|
+
*/
|
|
351
|
+
env?: NodeJS.ProcessEnv;
|
|
292
352
|
};
|
|
293
353
|
type DiagnoseResult = {
|
|
294
354
|
bridges: BridgeReport[];
|
|
@@ -297,6 +357,8 @@ type DiagnoseResult = {
|
|
|
297
357
|
* is never a command.
|
|
298
358
|
*/
|
|
299
359
|
instructions: InstructionReport[];
|
|
360
|
+
/** One row per installed harness whose user-scope file can load `~/.agents/AGENTS.md`. */
|
|
361
|
+
globalInstructions: GlobalInstructionReport[];
|
|
300
362
|
divergence: DivergenceReport[];
|
|
301
363
|
findings: BridgeFinding[];
|
|
302
364
|
};
|
|
@@ -304,7 +366,7 @@ type DiagnoseResult = {
|
|
|
304
366
|
* Read-only: nothing is created, moved, or repaired — the caller decides what to run from the
|
|
305
367
|
* repair each finding carries.
|
|
306
368
|
*/
|
|
307
|
-
export declare function diagnoseBridges({ root, harnesses: preferred, cli }: DiagnoseOptions): DiagnoseResult;
|
|
369
|
+
export declare function diagnoseBridges({ root, harnesses: preferred, cli, home, env }: DiagnoseOptions): DiagnoseResult;
|
|
308
370
|
//#endregion
|
|
309
371
|
//#region src/diagnose-configuration/diagnose-configuration.d.ts
|
|
310
372
|
/**
|
|
@@ -438,6 +500,7 @@ type DoctorReport = {
|
|
|
438
500
|
bin: string;
|
|
439
501
|
bridges: DiagnoseResult["bridges"];
|
|
440
502
|
instructions: DiagnoseResult["instructions"];
|
|
503
|
+
globalInstructions: DiagnoseResult["globalInstructions"];
|
|
441
504
|
/**
|
|
442
505
|
* References the managed, project, and user tiers hold, with the status `reference list` gives;
|
|
443
506
|
* reported rather than diagnosed, since a reference is a choice, not a fault.
|
|
@@ -715,5 +778,5 @@ type ReferenceSearchReport = {
|
|
|
715
778
|
};
|
|
716
779
|
export declare const referenceCommand: cli$1.Command;
|
|
717
780
|
//#endregion
|
|
718
|
-
export type { BridgeFinding, BridgeKind, BridgeProblem, BridgeReport, BridgeStatus, ConfigurationFault, ConfigurationProblem, DiagnoseMcpOptions, DiagnoseOptions, DiagnoseResult, DivergenceDirection, DivergenceReport, DoctorProblem, DoctorReference, DoctorReport, GovernanceDocument, GovernanceEntry, GovernanceLayer, GovernanceListReport, GovernanceScope, GovernanceShowReport, Harness, HarnessName, HarnessScope, HarnessScopeName, InitializeOptions, InitializeResult, InstructionBridge, InstructionKind, InstructionProblem, InstructionReport, InstructionStatus, LayerOptions, ListMcpServersOptions, MatchKind, McpConfig, McpDirection, McpField, McpProblem, McpServer, McpServerEntry, McpTransport, MergeMode, ReferenceLayer, ReferenceLayerOptions, ReferenceListReport, ReferenceListing, ReferenceName, ReferenceRow, ReferenceSearchReport, ReferenceShowEntry, ReferenceStatus, ReferenceTier, Repair, ResolveOptions, ResolvedReference, SearchMatch, TraceEntry, UsedLayer };
|
|
781
|
+
export type { BridgeFinding, BridgeKind, BridgeProblem, BridgeReport, BridgeStatus, ConfigurationFault, ConfigurationProblem, DiagnoseMcpOptions, DiagnoseOptions, DiagnoseResult, DivergenceDirection, DivergenceReport, DoctorProblem, DoctorReference, DoctorReport, GlobalInstructionKind, GlobalInstructionProblem, GlobalInstructionReport, GlobalInstructionStatus, GovernanceDocument, GovernanceEntry, GovernanceLayer, GovernanceListReport, GovernanceScope, GovernanceShowReport, Harness, HarnessName, HarnessScope, HarnessScopeName, InitializeOptions, InitializeResult, InstructionBridge, InstructionKind, InstructionProblem, InstructionReport, InstructionStatus, LayerOptions, ListMcpServersOptions, MatchKind, McpConfig, McpDirection, McpField, McpProblem, McpServer, McpServerEntry, McpTransport, MergeMode, ReferenceLayer, ReferenceLayerOptions, ReferenceListReport, ReferenceListing, ReferenceName, ReferenceRow, ReferenceSearchReport, ReferenceShowEntry, ReferenceStatus, ReferenceTier, Repair, ResolveOptions, ResolvedReference, SearchMatch, TraceEntry, UsedLayer };
|
|
719
782
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/cli.ts","../src/harness-registry/instruction-bridge.ts","../src/diagnose-mcp/mcp-model.ts","../src/mcp-dialects/mcp-dialects.ts","../src/harness-registry/mcp-config.ts","../src/harness-registry/nonstandard-artifact.ts","../src/harness-registry/harness-registry.ts","../src/diagnose-bridges/diagnose-instructions.ts","../src/diagnose-bridges/locator.ts","../src/diagnose-bridges/doctor-guidance.ts","../src/diagnose-bridges/git-bridge-state.ts","../src/diagnose-bridges/diagnose-bridges.ts","../src/diagnose-configuration/diagnose-configuration.ts","../src/references/reference-layers.ts","../src/references/reference-document.ts","../src/references/resolve-reference.ts","../src/references/reference-catalog.ts","../src/diagnose-bridges/doctor.command.ts","../src/diagnose-mcp/diagnose-mcp.ts","../src/diagnose-mcp/mcp-baseline.ts","../src/diagnose-mcp/mcp-sources.ts","../src/governance-overrides/governance-overrides.ts","../src/governance-overrides/governance.command.ts","../src/initialize-harnesses/init.command.ts","../src/skill-projection/skill-projection.ts","../src/initialize-harnesses/initialize-harnesses.ts","../src/mcp-inventory/mcp-inventory.ts","../src/references/reference.command.ts"],"mappings":";;;;;;;wBA0CsB,IAAI,iBAAiB
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/cli.ts","../src/harness-registry/instruction-bridge.ts","../src/diagnose-mcp/mcp-model.ts","../src/mcp-dialects/mcp-dialects.ts","../src/harness-registry/mcp-config.ts","../src/harness-registry/nonstandard-artifact.ts","../src/harness-registry/harness-registry.ts","../src/diagnose-bridges/diagnose-global-instructions.ts","../src/diagnose-bridges/diagnose-instructions.ts","../src/diagnose-bridges/locator.ts","../src/diagnose-bridges/doctor-guidance.ts","../src/diagnose-bridges/git-bridge-state.ts","../src/diagnose-bridges/diagnose-bridges.ts","../src/diagnose-configuration/diagnose-configuration.ts","../src/references/reference-layers.ts","../src/references/reference-document.ts","../src/references/resolve-reference.ts","../src/references/reference-catalog.ts","../src/diagnose-bridges/doctor.command.ts","../src/diagnose-mcp/diagnose-mcp.ts","../src/diagnose-mcp/mcp-baseline.ts","../src/diagnose-mcp/mcp-sources.ts","../src/governance-overrides/governance-overrides.ts","../src/governance-overrides/governance.command.ts","../src/initialize-harnesses/init.command.ts","../src/skill-projection/skill-projection.ts","../src/initialize-harnesses/initialize-harnesses.ts","../src/mcp-inventory/mcp-inventory.ts","../src/references/reference.command.ts"],"mappings":"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"}
|