From a62136d7528d3465417442a50a330cd74e037d33 Mon Sep 17 00:00:00 2001 From: Nuno Amorim <10154641+NAmorim@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:01:14 +0100 Subject: [PATCH] fix(doctor): accept fabric-ai, the binary name Homebrew installs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fabric capability probed which("fabric"), but Homebrew ships danielmiessler/fabric as `fabric-ai` — the `fabric` formula is the unrelated Python SSH tool (fabfile.org). A correct `brew install fabric-ai` therefore reported as broken. The fix hint made it worse: "see the fabric project for install" steers a user toward `brew install fabric`, which installs the SSH tool. Doctor then reports the capability live while every -y call fails — strictly worse than the original broken state. - probe accepts either binary name, so source installs and user aliases work too - fixCmd names the right formula and warns off the collision - powers/detail strings corrected: all 237 patterns run natively from skills/Fabric/Patterns per skills/Fabric/SKILL.md:37, so a missing binary costs only -y and -u, not the pattern library Inverse of #2066: same which() call, false negative instead of false positive. Closes #2152 --- LifeOS/install/LIFEOS/TOOLS/Doctor.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/LifeOS/install/LIFEOS/TOOLS/Doctor.ts b/LifeOS/install/LIFEOS/TOOLS/Doctor.ts index 9ac4d38f97..ea16146f3a 100644 --- a/LifeOS/install/LIFEOS/TOOLS/Doctor.ts +++ b/LifeOS/install/LIFEOS/TOOLS/Doctor.ts @@ -526,14 +526,21 @@ const CAPS: CapSpec[] = [ { id: 'fabric', title: 'Prompt patterns (fabric)', - powers: "the Fabric skill's pattern library and YouTube transcript fetch", + powers: "the Fabric skill's YouTube transcript fetch (-y) and URL fallback (-u); the pattern library itself runs natively without it", ttlHours: 24 * 7, configured: () => true, - probeOffline: async () => - which('fabric') - ? { ok: true, detail: 'fabric on PATH' } - : { ok: false, detail: 'fabric not on PATH — pattern runs fall back to native prompting' }, - fixCmd: 'see the fabric project for install', + // Homebrew ships danielmiessler/fabric as `fabric-ai`, because the `fabric` + // formula is the unrelated Python SSH tool. Accept either name: checking + // only `fabric` reported a working install as broken (issue #2152). + // Patterns run natively from skills/Fabric/Patterns either way — the binary + // is needed only for YouTube transcripts (-y) and URL fallback (-u). + probeOffline: async () => { + const found = ['fabric', 'fabric-ai'].find((b) => which(b)); + return found + ? { ok: true, detail: `${found} on PATH` } + : { ok: false, detail: 'fabric not on PATH — patterns still run natively; -y/-u unavailable' }; + }, + fixCmd: 'brew install fabric-ai (NOT `fabric` — that is the Python SSH tool)', }, { id: 'jq',