buddy-agent-harness 0.17.0 → 0.19.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 +272 -11
- package/dist/index.d.mts +75 -5
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +277 -12
- package/dist/index.mjs.map +1 -1
- package/dist/skill-scripts/doctor.mjs +73 -72
- package/dist/skill-scripts/init.mjs +73 -72
- package/dist/skill-scripts/mcp.mjs +73 -72
- package/dist/skill-scripts/reference.mjs +73 -72
- 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 +33 -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 +73 -72
- package/skills/enhance/SKILL.md +14 -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 +73 -72
- package/skills/init-buddy-agent-harness/scripts/init.mjs +73 -72
- package/skills/reference/SKILL.md +1 -1
- package/skills/reference/scripts/reference.mjs +73 -72
- package/skills/repair/SKILL.md +3 -1
- package/skills/repair/scripts/doctor.mjs +73 -72
- package/skills/repair/scripts/mcp.mjs +73 -72
- package/src/diagnose-bridges/diagnose-bridges.ts +27 -2
- package/src/diagnose-bridges/diagnose-global-instructions.ts +172 -0
- package/src/diagnose-bridges/diagnose-instructions.ts +7 -2
- package/src/diagnose-bridges/doctor-guidance.ts +175 -6
- package/src/diagnose-bridges/doctor.command.ts +6 -1
- package/src/harness-registry/harness-registry.ts +45 -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,14 @@ 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
|
+
emptyRelocatesToStart: true,
|
|
18010
|
+
instructionBridge: {
|
|
18011
|
+
kind: "import",
|
|
18012
|
+
path: ".claude/CLAUDE.md",
|
|
18013
|
+
line: `@~/${globalInstructions}`
|
|
18014
|
+
}
|
|
18002
18015
|
}
|
|
18003
18016
|
},
|
|
18004
18017
|
{
|
|
@@ -18060,7 +18073,13 @@ const harnessRegistry = [
|
|
|
18060
18073
|
},
|
|
18061
18074
|
user: {
|
|
18062
18075
|
detect: ".codex",
|
|
18063
|
-
...skillsProjection("codex", "user")
|
|
18076
|
+
...skillsProjection("codex", "user"),
|
|
18077
|
+
instructionBridge: {
|
|
18078
|
+
kind: "symlink",
|
|
18079
|
+
path: ".codex/AGENTS.md"
|
|
18080
|
+
},
|
|
18081
|
+
shadowedBy: [".codex/AGENTS.override.md"],
|
|
18082
|
+
relocatedBy: "CODEX_HOME"
|
|
18064
18083
|
}
|
|
18065
18084
|
},
|
|
18066
18085
|
{
|
|
@@ -18088,7 +18107,12 @@ const harnessRegistry = [
|
|
|
18088
18107
|
},
|
|
18089
18108
|
user: {
|
|
18090
18109
|
detect: ".copilot",
|
|
18091
|
-
...skillsProjection("copilot-cli", "user")
|
|
18110
|
+
...skillsProjection("copilot-cli", "user"),
|
|
18111
|
+
relocatedBy: "COPILOT_HOME",
|
|
18112
|
+
instructionBridge: {
|
|
18113
|
+
kind: "symlink",
|
|
18114
|
+
path: ".copilot/copilot-instructions.md"
|
|
18115
|
+
}
|
|
18092
18116
|
}
|
|
18093
18117
|
},
|
|
18094
18118
|
{
|
|
@@ -18120,7 +18144,11 @@ const harnessRegistry = [
|
|
|
18120
18144
|
},
|
|
18121
18145
|
user: {
|
|
18122
18146
|
detect: ".gemini",
|
|
18123
|
-
...skillsProjection("gemini-cli", "user")
|
|
18147
|
+
...skillsProjection("gemini-cli", "user"),
|
|
18148
|
+
instructionBridge: {
|
|
18149
|
+
kind: "symlink",
|
|
18150
|
+
path: ".gemini/GEMINI.md"
|
|
18151
|
+
}
|
|
18124
18152
|
}
|
|
18125
18153
|
},
|
|
18126
18154
|
{
|
|
@@ -18328,6 +18356,69 @@ const instructionTable = {
|
|
|
18328
18356
|
}
|
|
18329
18357
|
};
|
|
18330
18358
|
repairsOf(instructionTable);
|
|
18359
|
+
const globalFile = `~/${globalInstructions}`;
|
|
18360
|
+
/**
|
|
18361
|
+
* The step that bridges one harness's user-scope file, in the words it is handed over in; `file` is
|
|
18362
|
+
* where it was found, which a variable such as `$CODEX_HOME` may have moved.
|
|
18363
|
+
*/
|
|
18364
|
+
function globalBridgeStep(bridge, file = `~/${bridge.path}`) {
|
|
18365
|
+
return bridge.kind === "import" ? `add the line \`${bridge.line}\` to ${file}` : `run \`ln -s ${globalFile} ${file}\``;
|
|
18366
|
+
}
|
|
18367
|
+
/** Every spelling of a user-scope path a report can carry: from `~`, and from the variable that moves it. */
|
|
18368
|
+
function userSpellings(scope, path) {
|
|
18369
|
+
const under = `${scope.detect}/`;
|
|
18370
|
+
return scope.relocatedBy !== void 0 && path.startsWith(under) ? [`~/${path}`, `$${scope.relocatedBy}/${path.slice(under.length)}`] : [`~/${path}`];
|
|
18371
|
+
}
|
|
18372
|
+
/** The bridge for a reported path; undefined for a path no harness registers, such as a table's `<path>`. */
|
|
18373
|
+
function userBridgeAt(file) {
|
|
18374
|
+
for (const { user } of harnessRegistry) {
|
|
18375
|
+
const bridge = user?.instructionBridge;
|
|
18376
|
+
if (user && bridge && userSpellings(user, bridge.path).includes(file)) return bridge;
|
|
18377
|
+
}
|
|
18378
|
+
}
|
|
18379
|
+
/** The step for one reported file, or a pointer to where it is written when the path is not one. */
|
|
18380
|
+
function stepAt(file, keepContent) {
|
|
18381
|
+
const bridge = userBridgeAt(file);
|
|
18382
|
+
if (bridge === void 0) return `add the bridge the harness page names for ${file}`;
|
|
18383
|
+
return `${keepContent && bridge.kind !== "import" ? `move what ${file} says into ${globalFile} and remove it, then ` : ""}${globalBridgeStep(bridge, file)}`;
|
|
18384
|
+
}
|
|
18385
|
+
/** Outside the repository, so never written: a repair is a step handed to the user. */
|
|
18386
|
+
const handOver = "hand the user this step, since nothing here writes outside the repository:";
|
|
18387
|
+
const globalInstructionTable = {
|
|
18388
|
+
"global-instructions-missing": {
|
|
18389
|
+
detail: `no user-scope instruction file at this path — the harness loads none of ${globalFile}`,
|
|
18390
|
+
repair: ({ file }) => ({
|
|
18391
|
+
command: "",
|
|
18392
|
+
instruction: `${handOver} ${stepAt(file, false)}`
|
|
18393
|
+
}),
|
|
18394
|
+
skillRepair: () => "hand the user the step the harness page names for that file; write nothing yourself"
|
|
18395
|
+
},
|
|
18396
|
+
"global-instructions-unbridged": {
|
|
18397
|
+
detail: `the file holds its own content and does not load ${globalFile} — text placed there reaches no session of this harness`,
|
|
18398
|
+
repair: ({ file }) => ({
|
|
18399
|
+
command: "",
|
|
18400
|
+
instruction: `${handOver} ${stepAt(file, true)}`
|
|
18401
|
+
}),
|
|
18402
|
+
skillRepair: () => "hand the user the step the harness page names for that file, keeping what the file says; write nothing yourself"
|
|
18403
|
+
},
|
|
18404
|
+
"global-instructions-overridden": {
|
|
18405
|
+
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}`,
|
|
18406
|
+
repair: ({ file }) => ({
|
|
18407
|
+
command: "",
|
|
18408
|
+
instruction: `${handOver} move what ${file} says into ${globalFile} and remove it`
|
|
18409
|
+
}),
|
|
18410
|
+
skillRepair: () => "hand the user the move of what that file says into the global file, and its removal; write nothing yourself"
|
|
18411
|
+
},
|
|
18412
|
+
"global-instructions-emptied": {
|
|
18413
|
+
detail: "the variable is set but empty, which this harness reads as the directory it starts in rather than as unset — its user-scope file is whichever one sits there, not the one in its own folder",
|
|
18414
|
+
repair: ({ file }) => ({
|
|
18415
|
+
command: "",
|
|
18416
|
+
instruction: `${handOver} unset ${file.slice(1)} where your shell sets it, or set it to the folder you meant`
|
|
18417
|
+
}),
|
|
18418
|
+
skillRepair: () => "hand the user the step of unsetting that variable; write nothing yourself"
|
|
18419
|
+
}
|
|
18420
|
+
};
|
|
18421
|
+
repairsOf(globalInstructionTable);
|
|
18331
18422
|
const configurationTable = {
|
|
18332
18423
|
"deprecated-harness": {
|
|
18333
18424
|
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 +18595,7 @@ repairsOf(nonstandardTable);
|
|
|
18504
18595
|
const doctorTable = {
|
|
18505
18596
|
...bridgeTable,
|
|
18506
18597
|
...instructionTable,
|
|
18598
|
+
...globalInstructionTable,
|
|
18507
18599
|
...configurationTable,
|
|
18508
18600
|
...mcpTable,
|
|
18509
18601
|
...nonstandardTable
|
|
@@ -27649,7 +27741,7 @@ function projectChain(root) {
|
|
|
27649
27741
|
dir = parent;
|
|
27650
27742
|
}
|
|
27651
27743
|
}
|
|
27652
|
-
function isDirectory$
|
|
27744
|
+
function isDirectory$2(path) {
|
|
27653
27745
|
try {
|
|
27654
27746
|
return statSync(path).isDirectory();
|
|
27655
27747
|
} catch {
|
|
@@ -27685,7 +27777,7 @@ function dependencyLayers(root, skip) {
|
|
|
27685
27777
|
const dir = packageDir(pkg, manifestPath);
|
|
27686
27778
|
if (!dir || skip.has(canonical(dir))) continue;
|
|
27687
27779
|
const references = join(dir, "references");
|
|
27688
|
-
if (!isDirectory$
|
|
27780
|
+
if (!isDirectory$2(references)) continue;
|
|
27689
27781
|
const manifest = readJson(join(dir, "plugin.json"));
|
|
27690
27782
|
const manifestName = isRecord$1(manifest) && typeof manifest["name"] === "string" ? manifest["name"] : void 0;
|
|
27691
27783
|
const plugins = manifestName && manifestName !== pkg ? [pkg, manifestName] : [pkg];
|
|
@@ -27735,7 +27827,7 @@ async function referenceLayers({ root, home, platform, programData, packageRoot
|
|
|
27735
27827
|
plugins: self,
|
|
27736
27828
|
status: LEGACY_STATUS
|
|
27737
27829
|
},
|
|
27738
|
-
...enabled.filter(({ dir, skipped }) => skipped || isDirectory$
|
|
27830
|
+
...enabled.filter(({ dir, skipped }) => skipped || isDirectory$2(dir) && canonical(dirname(dir)) !== ownRoot),
|
|
27739
27831
|
...dependencyLayers(root, /* @__PURE__ */ new Set([ownRoot]))
|
|
27740
27832
|
];
|
|
27741
27833
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -27832,6 +27924,165 @@ function projectSkills({ root, canonicalSkills, harnesses, copy, force }) {
|
|
|
27832
27924
|
};
|
|
27833
27925
|
}
|
|
27834
27926
|
//#endregion
|
|
27927
|
+
//#region src/diagnose-bridges/diagnose-global-instructions.ts
|
|
27928
|
+
function isDirectory$1(path) {
|
|
27929
|
+
try {
|
|
27930
|
+
return lstatSync(path).isDirectory();
|
|
27931
|
+
} catch {
|
|
27932
|
+
return false;
|
|
27933
|
+
}
|
|
27934
|
+
}
|
|
27935
|
+
function exists$1(path) {
|
|
27936
|
+
try {
|
|
27937
|
+
lstatSync(path);
|
|
27938
|
+
return true;
|
|
27939
|
+
} catch {
|
|
27940
|
+
return false;
|
|
27941
|
+
}
|
|
27942
|
+
}
|
|
27943
|
+
/** The import a user wrote may spell the home directory either way; both load the same file. */
|
|
27944
|
+
function importsGlobal(body, bridge, home) {
|
|
27945
|
+
const spellings = bridge.kind === "import" ? [bridge.line, `@${join(home, globalInstructions)}`] : [];
|
|
27946
|
+
return body.split("\n").some((line) => spellings.includes(line.trim()));
|
|
27947
|
+
}
|
|
27948
|
+
/**
|
|
27949
|
+
* Follows `relocatedBy` the way each harness does. An empty value is no value to Codex and Copilot CLI
|
|
27950
|
+
* (E-CODEX-06, E-COPILOT-06), and the directory Claude Code starts in to Claude Code (E-CC-20).
|
|
27951
|
+
*/
|
|
27952
|
+
function base(scope, env, start) {
|
|
27953
|
+
const variable = scope.relocatedBy;
|
|
27954
|
+
const value = variable === void 0 ? void 0 : env[variable];
|
|
27955
|
+
if (variable === void 0 || value === void 0) return {};
|
|
27956
|
+
if (value !== "") return { moved: {
|
|
27957
|
+
root: resolve(value),
|
|
27958
|
+
display: `$${variable}`
|
|
27959
|
+
} };
|
|
27960
|
+
return scope.emptyRelocatesToStart ? {
|
|
27961
|
+
moved: {
|
|
27962
|
+
root: start,
|
|
27963
|
+
display: "."
|
|
27964
|
+
},
|
|
27965
|
+
emptied: variable
|
|
27966
|
+
} : {};
|
|
27967
|
+
}
|
|
27968
|
+
function locate(home, scope, { moved }, path) {
|
|
27969
|
+
if (!moved || path !== scope.detect && !path.startsWith(`${scope.detect}/`)) return {
|
|
27970
|
+
absolute: join(home, path),
|
|
27971
|
+
display: `~/${path}`
|
|
27972
|
+
};
|
|
27973
|
+
const rest = path.slice(scope.detect.length);
|
|
27974
|
+
return {
|
|
27975
|
+
absolute: join(moved.root, rest),
|
|
27976
|
+
display: `${moved.display}${rest}`
|
|
27977
|
+
};
|
|
27978
|
+
}
|
|
27979
|
+
/** A shadow is read only where it is a file holding more than whitespace (E-CODEX-06). */
|
|
27980
|
+
function readsAsShadow(path) {
|
|
27981
|
+
try {
|
|
27982
|
+
return statSync(path).isFile() && readFileSync(path, "utf8").trim() !== "";
|
|
27983
|
+
} catch {
|
|
27984
|
+
return false;
|
|
27985
|
+
}
|
|
27986
|
+
}
|
|
27987
|
+
function inspect$1(home, target, bridge) {
|
|
27988
|
+
let stats;
|
|
27989
|
+
try {
|
|
27990
|
+
stats = lstatSync(target);
|
|
27991
|
+
} catch {
|
|
27992
|
+
return {
|
|
27993
|
+
kind: "none",
|
|
27994
|
+
status: "missing",
|
|
27995
|
+
problem: "global-instructions-missing"
|
|
27996
|
+
};
|
|
27997
|
+
}
|
|
27998
|
+
if (stats.isSymbolicLink()) return resolve(dirname(target), readlinkSync(target)) === join(home, ".agents/AGENTS.md") ? {
|
|
27999
|
+
kind: "symlink",
|
|
28000
|
+
status: "ok"
|
|
28001
|
+
} : {
|
|
28002
|
+
kind: "symlink",
|
|
28003
|
+
status: "unbridged",
|
|
28004
|
+
problem: "global-instructions-unbridged"
|
|
28005
|
+
};
|
|
28006
|
+
let body;
|
|
28007
|
+
try {
|
|
28008
|
+
body = readFileSync(target, "utf8");
|
|
28009
|
+
} catch {
|
|
28010
|
+
return {
|
|
28011
|
+
kind: "file",
|
|
28012
|
+
status: "unbridged",
|
|
28013
|
+
problem: "global-instructions-unbridged"
|
|
28014
|
+
};
|
|
28015
|
+
}
|
|
28016
|
+
return importsGlobal(body, bridge, home) ? {
|
|
28017
|
+
kind: "import",
|
|
28018
|
+
status: "ok"
|
|
28019
|
+
} : {
|
|
28020
|
+
kind: "file",
|
|
28021
|
+
status: "unbridged",
|
|
28022
|
+
problem: "global-instructions-unbridged"
|
|
28023
|
+
};
|
|
28024
|
+
}
|
|
28025
|
+
function finding(path, problem, cli) {
|
|
28026
|
+
const { detail, repair } = repairFor(problem);
|
|
28027
|
+
return {
|
|
28028
|
+
path,
|
|
28029
|
+
problem,
|
|
28030
|
+
detail,
|
|
28031
|
+
repair: repair({ file: path }, cli)
|
|
28032
|
+
};
|
|
28033
|
+
}
|
|
28034
|
+
/**
|
|
28035
|
+
* Whether each harness the user has installed loads `~/.agents/AGENTS.md` through its own user-scope
|
|
28036
|
+
* file, read from wherever `env` moves it — `start`, for a harness that reads an empty variable as
|
|
28037
|
+
* the directory it starts in. Read-only: the repair is handed to the user, since nothing here
|
|
28038
|
+
* writes outside the repository.
|
|
28039
|
+
*/
|
|
28040
|
+
function diagnoseGlobalInstructions(home, preferred, cli, env = {}, start = process.cwd()) {
|
|
28041
|
+
const hasGlobal = exists$1(join(home, globalInstructions));
|
|
28042
|
+
const rows = [];
|
|
28043
|
+
const findings = [];
|
|
28044
|
+
for (const harness of harnessRegistry) {
|
|
28045
|
+
const user = harness.user;
|
|
28046
|
+
const bridge = user?.instructionBridge;
|
|
28047
|
+
if (!user || !bridge) continue;
|
|
28048
|
+
const moved = base(user, env, start);
|
|
28049
|
+
if (!preferred.includes(harness.name) && !isDirectory$1(locate(home, user, moved, user.detect).absolute)) continue;
|
|
28050
|
+
const file = locate(home, user, moved, bridge.path);
|
|
28051
|
+
const inspection = inspect$1(home, file.absolute, bridge);
|
|
28052
|
+
const shadow = (user.shadowedBy ?? []).map((path) => locate(home, user, moved, path)).find(({ absolute }) => readsAsShadow(absolute));
|
|
28053
|
+
if (shadow !== void 0) {
|
|
28054
|
+
const read = inspect$1(home, shadow.absolute, bridge);
|
|
28055
|
+
if (read.status === "ok") {
|
|
28056
|
+
rows.push({
|
|
28057
|
+
harness: harness.name,
|
|
28058
|
+
path: shadow.display,
|
|
28059
|
+
kind: read.kind,
|
|
28060
|
+
status: "ok"
|
|
28061
|
+
});
|
|
28062
|
+
continue;
|
|
28063
|
+
}
|
|
28064
|
+
rows.push({
|
|
28065
|
+
harness: harness.name,
|
|
28066
|
+
path: file.display,
|
|
28067
|
+
kind: inspection.kind,
|
|
28068
|
+
status: "overridden"
|
|
28069
|
+
});
|
|
28070
|
+
if (hasGlobal) findings.push(finding(shadow.display, "global-instructions-overridden", cli));
|
|
28071
|
+
} else rows.push({
|
|
28072
|
+
harness: harness.name,
|
|
28073
|
+
path: file.display,
|
|
28074
|
+
kind: inspection.kind,
|
|
28075
|
+
status: inspection.status
|
|
28076
|
+
});
|
|
28077
|
+
if (hasGlobal && moved.emptied) findings.push(finding(`$${moved.emptied}`, "global-instructions-emptied", cli));
|
|
28078
|
+
else if (hasGlobal && inspection.problem) findings.push(finding(file.display, inspection.problem, cli));
|
|
28079
|
+
}
|
|
28080
|
+
return {
|
|
28081
|
+
globalInstructions: rows,
|
|
28082
|
+
findings
|
|
28083
|
+
};
|
|
28084
|
+
}
|
|
28085
|
+
//#endregion
|
|
27835
28086
|
//#region src/diagnose-bridges/agents-files.ts
|
|
27836
28087
|
/** Directories that never hold instructions this repository is responsible for bridging. */
|
|
27837
28088
|
const pruned = /* @__PURE__ */ new Set(["node_modules"]);
|
|
@@ -27946,7 +28197,7 @@ function diagnoseInstructions(root, harnesses, cli) {
|
|
|
27946
28197
|
const bridged = harnesses.map((harness) => ({
|
|
27947
28198
|
name: harness.name,
|
|
27948
28199
|
bridge: harness.project.instructionBridge
|
|
27949
|
-
})).filter((harness) =>
|
|
28200
|
+
})).filter((harness) => harness.bridge?.kind === "settings-entry");
|
|
27950
28201
|
const instructions = [];
|
|
27951
28202
|
const findings = [];
|
|
27952
28203
|
const directories = agentsFileDirectories(root);
|
|
@@ -28202,7 +28453,7 @@ function inspect(target, path, canonical, git) {
|
|
|
28202
28453
|
* Read-only: nothing is created, moved, or repaired — the caller decides what to run from the
|
|
28203
28454
|
* repair each finding carries.
|
|
28204
28455
|
*/
|
|
28205
|
-
function diagnoseBridges({ root, harnesses: preferred = [], cli }) {
|
|
28456
|
+
function diagnoseBridges({ root, harnesses: preferred = [], cli, home, env }) {
|
|
28206
28457
|
const canonical = join(root, ".agents", "skills");
|
|
28207
28458
|
const git = new GitBridgeState(root);
|
|
28208
28459
|
const selected = selectHarnesses(root, preferred);
|
|
@@ -28247,9 +28498,15 @@ function diagnoseBridges({ root, harnesses: preferred = [], cli }) {
|
|
|
28247
28498
|
}
|
|
28248
28499
|
const instructions = diagnoseInstructions(root, selected, cli);
|
|
28249
28500
|
findings.push(...instructions.findings);
|
|
28501
|
+
const global = home === void 0 ? {
|
|
28502
|
+
globalInstructions: [],
|
|
28503
|
+
findings: []
|
|
28504
|
+
} : diagnoseGlobalInstructions(home, preferred, cli, env, root);
|
|
28505
|
+
findings.push(...global.findings);
|
|
28250
28506
|
return {
|
|
28251
28507
|
bridges,
|
|
28252
28508
|
instructions: instructions.instructions,
|
|
28509
|
+
globalInstructions: global.globalInstructions,
|
|
28253
28510
|
divergence,
|
|
28254
28511
|
findings
|
|
28255
28512
|
};
|
|
@@ -28270,6 +28527,7 @@ function buildDoctorReport(bin, result, configuration = [], held = []) {
|
|
|
28270
28527
|
bin,
|
|
28271
28528
|
bridges: result.bridges,
|
|
28272
28529
|
instructions: result.instructions,
|
|
28530
|
+
globalInstructions: result.globalInstructions,
|
|
28273
28531
|
references,
|
|
28274
28532
|
findings: `0 problems found — ${bridges} and the configuration around them is current`
|
|
28275
28533
|
};
|
|
@@ -28278,6 +28536,7 @@ function buildDoctorReport(bin, result, configuration = [], held = []) {
|
|
|
28278
28536
|
bin,
|
|
28279
28537
|
bridges: result.bridges,
|
|
28280
28538
|
instructions: result.instructions,
|
|
28539
|
+
globalInstructions: result.globalInstructions,
|
|
28281
28540
|
references,
|
|
28282
28541
|
...result.divergence.length ? { divergence: result.divergence } : {},
|
|
28283
28542
|
findings: findings.map(({ path, problem, detail }) => ({
|
|
@@ -28290,7 +28549,7 @@ function buildDoctorReport(bin, result, configuration = [], held = []) {
|
|
|
28290
28549
|
}
|
|
28291
28550
|
const doctorCommand = command({
|
|
28292
28551
|
name: "doctor",
|
|
28293
|
-
description: "Report whether this repository's harness bridges still resolve — skills into .agents/skills, instructions into AGENTS.md. Read-only.",
|
|
28552
|
+
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
28553
|
options: {
|
|
28295
28554
|
root: {
|
|
28296
28555
|
description: "Repository or package directory. Defaults to the current directory.",
|
|
@@ -28315,7 +28574,9 @@ const doctorCommand = command({
|
|
|
28315
28574
|
const result = diagnoseBridges({
|
|
28316
28575
|
root,
|
|
28317
28576
|
...harnesses.length ? { harnesses } : {},
|
|
28318
|
-
cli: commandInvocation
|
|
28577
|
+
cli: commandInvocation,
|
|
28578
|
+
home,
|
|
28579
|
+
env: process.env
|
|
28319
28580
|
});
|
|
28320
28581
|
const git = new GitBridgeState(root);
|
|
28321
28582
|
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,16 @@ 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;
|
|
109
|
+
/**
|
|
110
|
+
* `relocatedBy` set to an empty string is read as the directory the harness starts in, rather
|
|
111
|
+
* than as unset.
|
|
112
|
+
*/
|
|
113
|
+
emptyRelocatesToStart?: true;
|
|
91
114
|
/** Where this harness keeps its own MCP servers; `doctor` compares against it and never writes. */
|
|
92
115
|
mcpConfig?: McpConfig;
|
|
93
116
|
/** What this harness reads that no other can, reported so it can be converted to canonical form. */
|
|
@@ -111,6 +134,37 @@ type Harness = {
|
|
|
111
134
|
*/
|
|
112
135
|
export declare const harnessRegistry: readonly Harness[];
|
|
113
136
|
//#endregion
|
|
137
|
+
//#region src/diagnose-bridges/diagnose-global-instructions.d.ts
|
|
138
|
+
/** What is at a harness's user-scope instruction file. */
|
|
139
|
+
type GlobalInstructionKind = "import" | "symlink" | "file" | "none";
|
|
140
|
+
/**
|
|
141
|
+
* `missing`: no file, so the harness loads no user instructions at all; `unbridged`: a file that
|
|
142
|
+
* loads its own content and not the global one; `overridden`: a file the harness reads in its place,
|
|
143
|
+
* such as Codex's `AGENTS.override.md`, that does not load the global one either.
|
|
144
|
+
*/
|
|
145
|
+
type GlobalInstructionStatus = "ok" | "missing" | "unbridged" | "overridden";
|
|
146
|
+
type GlobalInstructionReport = {
|
|
147
|
+
harness: HarnessName;
|
|
148
|
+
/**
|
|
149
|
+
* The harness's user-scope instruction file, written from `~` so the report is publishable, or
|
|
150
|
+
* from the variable that moved it, such as `$CODEX_HOME`, or from `.` where an empty variable moved
|
|
151
|
+
* it to the directory the harness starts in.
|
|
152
|
+
*/
|
|
153
|
+
path: string;
|
|
154
|
+
kind: GlobalInstructionKind;
|
|
155
|
+
status: GlobalInstructionStatus;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Whether each harness the user has installed loads `~/.agents/AGENTS.md` through its own user-scope
|
|
159
|
+
* file, read from wherever `env` moves it — `start`, for a harness that reads an empty variable as
|
|
160
|
+
* the directory it starts in. Read-only: the repair is handed to the user, since nothing here
|
|
161
|
+
* writes outside the repository.
|
|
162
|
+
*/
|
|
163
|
+
export declare function diagnoseGlobalInstructions(home: string, preferred: readonly HarnessName[], cli: string, env?: NodeJS.ProcessEnv, start?: string): {
|
|
164
|
+
globalInstructions: GlobalInstructionReport[];
|
|
165
|
+
findings: BridgeFinding[];
|
|
166
|
+
};
|
|
167
|
+
//#endregion
|
|
114
168
|
//#region src/diagnose-bridges/diagnose-instructions.d.ts
|
|
115
169
|
/** What is on disk where an instruction bridge belongs, or where a shadowing file may sit. */
|
|
116
170
|
type InstructionKind = "import" | "symlink" | "settings-entry" | "file" | "none";
|
|
@@ -183,8 +237,10 @@ type McpProblem = "mcp-golden-unreadable" | "mcp-target-unreadable" | "mcp-unpro
|
|
|
183
237
|
type NonstandardProblem = "nonstandard-instructions" | "nonstandard-rule" | "nonstandard-command" | "nonstandard-skill" | "nonstandard-subagent";
|
|
184
238
|
/** Every way a harness can end up reading none of `AGENTS.md`. */
|
|
185
239
|
type InstructionProblem = "no-instructions" | "instructions-missing" | "instructions-unbridged" | "instructions-unreadable" | "instructions-shadowing" | "instructions-superseded";
|
|
240
|
+
/** Every way a harness's user-scope instruction file fails to load `~/.agents/AGENTS.md`. */
|
|
241
|
+
type GlobalInstructionProblem = "global-instructions-missing" | "global-instructions-unbridged" | "global-instructions-overridden" | "global-instructions-emptied";
|
|
186
242
|
/** Everything `doctor` can report against, across every section. */
|
|
187
|
-
type DoctorProblem = BridgeProblem | InstructionProblem | ConfigurationFault | McpProblem | NonstandardProblem;
|
|
243
|
+
type DoctorProblem = BridgeProblem | InstructionProblem | GlobalInstructionProblem | ConfigurationFault | McpProblem | NonstandardProblem;
|
|
188
244
|
/** Alias kept for callers that name the whole set rather than one section. */
|
|
189
245
|
type ConfigurationProblem = DoctorProblem;
|
|
190
246
|
type RepairAction = {
|
|
@@ -210,6 +266,7 @@ type Repair = {
|
|
|
210
266
|
};
|
|
211
267
|
export declare const bridgeRepairs: readonly Repair[];
|
|
212
268
|
export declare const instructionRepairs: readonly Repair[];
|
|
269
|
+
export declare const globalInstructionRepairs: readonly Repair[];
|
|
213
270
|
export declare const doctorRepairs: readonly Repair[];
|
|
214
271
|
export declare const doctorSkill: {
|
|
215
272
|
readonly name: "doctor-buddy-agent-harness";
|
|
@@ -289,6 +346,16 @@ type DiagnoseOptions = {
|
|
|
289
346
|
harnesses?: HarnessName[];
|
|
290
347
|
/** How to name this tool in the repair commands. */
|
|
291
348
|
cli: string;
|
|
349
|
+
/**
|
|
350
|
+
* The home directory whose user-scope instruction files are checked for loading
|
|
351
|
+
* `~/.agents/AGENTS.md`; omitted, none are.
|
|
352
|
+
*/
|
|
353
|
+
home?: string;
|
|
354
|
+
/**
|
|
355
|
+
* The environment the harnesses run in, for the variables that move their user-scope files —
|
|
356
|
+
* `CODEX_HOME`, `COPILOT_HOME`, `CLAUDE_CONFIG_DIR`; omitted, none is followed.
|
|
357
|
+
*/
|
|
358
|
+
env?: NodeJS.ProcessEnv;
|
|
292
359
|
};
|
|
293
360
|
type DiagnoseResult = {
|
|
294
361
|
bridges: BridgeReport[];
|
|
@@ -297,6 +364,8 @@ type DiagnoseResult = {
|
|
|
297
364
|
* is never a command.
|
|
298
365
|
*/
|
|
299
366
|
instructions: InstructionReport[];
|
|
367
|
+
/** One row per installed harness whose user-scope file can load `~/.agents/AGENTS.md`. */
|
|
368
|
+
globalInstructions: GlobalInstructionReport[];
|
|
300
369
|
divergence: DivergenceReport[];
|
|
301
370
|
findings: BridgeFinding[];
|
|
302
371
|
};
|
|
@@ -304,7 +373,7 @@ type DiagnoseResult = {
|
|
|
304
373
|
* Read-only: nothing is created, moved, or repaired — the caller decides what to run from the
|
|
305
374
|
* repair each finding carries.
|
|
306
375
|
*/
|
|
307
|
-
export declare function diagnoseBridges({ root, harnesses: preferred, cli }: DiagnoseOptions): DiagnoseResult;
|
|
376
|
+
export declare function diagnoseBridges({ root, harnesses: preferred, cli, home, env }: DiagnoseOptions): DiagnoseResult;
|
|
308
377
|
//#endregion
|
|
309
378
|
//#region src/diagnose-configuration/diagnose-configuration.d.ts
|
|
310
379
|
/**
|
|
@@ -438,6 +507,7 @@ type DoctorReport = {
|
|
|
438
507
|
bin: string;
|
|
439
508
|
bridges: DiagnoseResult["bridges"];
|
|
440
509
|
instructions: DiagnoseResult["instructions"];
|
|
510
|
+
globalInstructions: DiagnoseResult["globalInstructions"];
|
|
441
511
|
/**
|
|
442
512
|
* References the managed, project, and user tiers hold, with the status `reference list` gives;
|
|
443
513
|
* reported rather than diagnosed, since a reference is a choice, not a fault.
|
|
@@ -715,5 +785,5 @@ type ReferenceSearchReport = {
|
|
|
715
785
|
};
|
|
716
786
|
export declare const referenceCommand: cli$1.Command;
|
|
717
787
|
//#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 };
|
|
788
|
+
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
789
|
//# 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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"}
|