fix(desktop): find user-installed CLIs when shell probing fails - #9232

Open
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback
Open

fix(desktop): find user-installed CLIs when shell probing fails#9232
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback

Conversation

@CyberStefNef

@CyberStefNefCyberStefNef commented Sep 2, 2026

Copy link
Copy Markdown

What Changed

resolveKnownPosixCliDirs in packages/shared/src/shell.ts returns the standard CLI directories for macOS and Linux, beside the existing resolveKnownWindowsCliDirs. Both POSIX PATH hydration paths now fall back to it when neither the login shell nor launchctl getenv PATH answers: installPosixEnvironment in apps/desktop/src/shell/DesktopShellEnvironment.ts and hydratePosixPath in apps/server/src/os-jank.ts.

The fallback is last in the chain, so a shell that did answer still decides the order. Directories are not checked for existence, matching resolveKnownWindowsCliDirs.

Why

A Finder launch starts the app with /usr/bin:/bin:/usr/sbin:/sbin. Both hydration paths repair that from the login shell, but the probe collapses failures and timeouts into an empty result, so a profile slower than the 5s timeout leaves PATH untouched. launchctl getenv PATH is unset on recent macOS, so the second probe returns nothing either. Every bare-name spawn then fails with ENOENT: #7618 counted 1246 failed gh spawns and zero successes over 14 hours, with gh auth status never running.

#1799 built this chain and added the launchctl probe as its last step. This adds the next step, for machines where that probe is also empty. Raising the timeout does not help, since the probe fails for reasons unrelated to how long it is given.

Both Windows paths already end in resolveKnownWindowsCliDirs. POSIX ended in nothing.

Closes#7618

Verification

  • vp test run apps/desktop/src/shell/DesktopShellEnvironment.test.ts packages/shared/src/shell.test.ts apps/server/src/os-jank.test.ts: 54 passed.
  • Typecheck for @t3tools/desktop, @t3tools/shared, and the server.
  • vp lint on the five changed files with --report-unused-disable-directives.
  • git diff --check: clean.
  • Seven added tests: the macOS and Linux fallbacks in both hydration paths, and guards that the known directories stay out of the merge when either probe answers. Reverting the source change fails the fallback tests and leaves the guards passing.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because nothing visual changed
  • A video is not applicable because no motion or interaction changed

Note

Medium Risk
Changes process PATH for all desktop and server POSIX startups when probes fail; behavior is intentional but affects every child-process spawn in those scenarios.

Overview
Adds shared resolveKnownPosixCliDirs (Homebrew/Linuxbrew, /usr/local/bin, and $HOME/.local/bin when HOME is set) as the last POSIX PATH fallback, mirroring the existing Windows known-CLI list.

DesktopinstallPosixEnvironment and serverhydratePosixPath now use it when the login-shell probe and (on macOS) launchctl getenv PATH both return nothing—e.g. GUI/Finder launches with only /usr/bin:/bin:… and slow or empty shell probes. A PATH from either probe is unchanged; the hardcoded dirs are not mixed in when a probe succeeds.

New tests cover macOS/Linux fallback merges, and guards that known dirs stay out when shell or launchctl answers.

Reviewed by Cursor Bugbot for commit 7bd0ba4. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add known CLI directory fallback to hydratePosixPath and installPosixEnvironment

  • Adds shared resolveKnownPosixCliDirs resolver that returns platform-specific CLI install directories (Homebrew on macOS, Linuxbrew on Linux, plus system-local and HOME-local bin).
  • Both desktop POSIX environment installation and server PATH hydration now prepend these known directories as a final fallback when neither the login shell nor launchctl produces a PATH.
  • A PATH from the login shell or launchctl remains preferred and is used directly without adding the fallback directories.
  • Risk: any caller relying on an empty PATH when probes fail will now receive a non-empty PATH composed of known CLI directories; the HOME-local entry is omitted when HOME is blank or unset.

Macroscope summarized 7bd0ba4.

POSIX PATH hydration had no fallback when both the login-shell and
launchctl probes returned nothing, so a slow shell profile left the
desktop app and the server on the bare Finder PATH and every bare-name
CLI spawn failed.
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 5d8d654

Macroscope's review found this PR approvable — This focused bug fix adds known POSIX CLI directories only when existing shell and launchctl PATH discovery fails, leaving successful probe paths unchanged. The implementation is small, isolated, and tested, with no schema, deployment, security-sensitive, or static-analysis configuration changes.

You can add or adjust custom eligibility rules. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: macOS Source Control reports installed Homebrew gh as unavailable

1 participant

@CyberStefNef
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(desktop): find user-installed CLIs when shell probing fails - #9232

Open
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback
Open

fix(desktop): find user-installed CLIs when shell probing fails#9232
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback

Conversation

@CyberStefNef

@CyberStefNefCyberStefNef commented Sep 2, 2026

Copy link
Copy Markdown

What Changed

resolveKnownPosixCliDirs in packages/shared/src/shell.ts returns the standard CLI directories for macOS and Linux, beside the existing resolveKnownWindowsCliDirs. Both POSIX PATH hydration paths now fall back to it when neither the login shell nor launchctl getenv PATH answers: installPosixEnvironment in apps/desktop/src/shell/DesktopShellEnvironment.ts and hydratePosixPath in apps/server/src/os-jank.ts.

The fallback is last in the chain, so a shell that did answer still decides the order. Directories are not checked for existence, matching resolveKnownWindowsCliDirs.

Why

A Finder launch starts the app with /usr/bin:/bin:/usr/sbin:/sbin. Both hydration paths repair that from the login shell, but the probe collapses failures and timeouts into an empty result, so a profile slower than the 5s timeout leaves PATH untouched. launchctl getenv PATH is unset on recent macOS, so the second probe returns nothing either. Every bare-name spawn then fails with ENOENT: #7618 counted 1246 failed gh spawns and zero successes over 14 hours, with gh auth status never running.

#1799 built this chain and added the launchctl probe as its last step. This adds the next step, for machines where that probe is also empty. Raising the timeout does not help, since the probe fails for reasons unrelated to how long it is given.

Both Windows paths already end in resolveKnownWindowsCliDirs. POSIX ended in nothing.

Closes#7618

Verification

  • vp test run apps/desktop/src/shell/DesktopShellEnvironment.test.ts packages/shared/src/shell.test.ts apps/server/src/os-jank.test.ts: 54 passed.
  • Typecheck for @t3tools/desktop, @t3tools/shared, and the server.
  • vp lint on the five changed files with --report-unused-disable-directives.
  • git diff --check: clean.
  • Seven added tests: the macOS and Linux fallbacks in both hydration paths, and guards that the known directories stay out of the merge when either probe answers. Reverting the source change fails the fallback tests and leaves the guards passing.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because nothing visual changed
  • A video is not applicable because no motion or interaction changed

Note

Medium Risk
Changes process PATH for all desktop and server POSIX startups when probes fail; behavior is intentional but affects every child-process spawn in those scenarios.

Overview
Adds shared resolveKnownPosixCliDirs (Homebrew/Linuxbrew, /usr/local/bin, and $HOME/.local/bin when HOME is set) as the last POSIX PATH fallback, mirroring the existing Windows known-CLI list.

DesktopinstallPosixEnvironment and serverhydratePosixPath now use it when the login-shell probe and (on macOS) launchctl getenv PATH both return nothing—e.g. GUI/Finder launches with only /usr/bin:/bin:… and slow or empty shell probes. A PATH from either probe is unchanged; the hardcoded dirs are not mixed in when a probe succeeds.

New tests cover macOS/Linux fallback merges, and guards that known dirs stay out when shell or launchctl answers.

Reviewed by Cursor Bugbot for commit 7bd0ba4. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add known CLI directory fallback to hydratePosixPath and installPosixEnvironment

  • Adds shared resolveKnownPosixCliDirs resolver that returns platform-specific CLI install directories (Homebrew on macOS, Linuxbrew on Linux, plus system-local and HOME-local bin).
  • Both desktop POSIX environment installation and server PATH hydration now prepend these known directories as a final fallback when neither the login shell nor launchctl produces a PATH.
  • A PATH from the login shell or launchctl remains preferred and is used directly without adding the fallback directories.
  • Risk: any caller relying on an empty PATH when probes fail will now receive a non-empty PATH composed of known CLI directories; the HOME-local entry is omitted when HOME is blank or unset.

Macroscope summarized 7bd0ba4.

POSIX PATH hydration had no fallback when both the login-shell and
launchctl probes returned nothing, so a slow shell profile left the
desktop app and the server on the bare Finder PATH and every bare-name
CLI spawn failed.
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 5d8d654

Macroscope's review found this PR approvable — This focused bug fix adds known POSIX CLI directories only when existing shell and launchctl PATH discovery fails, leaving successful probe paths unchanged. The implementation is small, isolated, and tested, with no schema, deployment, security-sensitive, or static-analysis configuration changes.

You can add or adjust custom eligibility rules. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: macOS Source Control reports installed Homebrew gh as unavailable

1 participant

@CyberStefNef
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): find user-installed CLIs when shell probing fails - #9232

Open
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback
Open

fix(desktop): find user-installed CLIs when shell probing fails#9232
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback

Conversation

@CyberStefNef

@CyberStefNefCyberStefNef commented Sep 2, 2026

Copy link
Copy Markdown

What Changed

resolveKnownPosixCliDirs in packages/shared/src/shell.ts returns the standard CLI directories for macOS and Linux, beside the existing resolveKnownWindowsCliDirs. Both POSIX PATH hydration paths now fall back to it when neither the login shell nor launchctl getenv PATH answers: installPosixEnvironment in apps/desktop/src/shell/DesktopShellEnvironment.ts and hydratePosixPath in apps/server/src/os-jank.ts.

The fallback is last in the chain, so a shell that did answer still decides the order. Directories are not checked for existence, matching resolveKnownWindowsCliDirs.

Why

A Finder launch starts the app with /usr/bin:/bin:/usr/sbin:/sbin. Both hydration paths repair that from the login shell, but the probe collapses failures and timeouts into an empty result, so a profile slower than the 5s timeout leaves PATH untouched. launchctl getenv PATH is unset on recent macOS, so the second probe returns nothing either. Every bare-name spawn then fails with ENOENT: #7618 counted 1246 failed gh spawns and zero successes over 14 hours, with gh auth status never running.

#1799 built this chain and added the launchctl probe as its last step. This adds the next step, for machines where that probe is also empty. Raising the timeout does not help, since the probe fails for reasons unrelated to how long it is given.

Both Windows paths already end in resolveKnownWindowsCliDirs. POSIX ended in nothing.

Closes#7618

Verification

  • vp test run apps/desktop/src/shell/DesktopShellEnvironment.test.ts packages/shared/src/shell.test.ts apps/server/src/os-jank.test.ts: 54 passed.
  • Typecheck for @t3tools/desktop, @t3tools/shared, and the server.
  • vp lint on the five changed files with --report-unused-disable-directives.
  • git diff --check: clean.
  • Seven added tests: the macOS and Linux fallbacks in both hydration paths, and guards that the known directories stay out of the merge when either probe answers. Reverting the source change fails the fallback tests and leaves the guards passing.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because nothing visual changed
  • A video is not applicable because no motion or interaction changed

Note

Medium Risk
Changes process PATH for all desktop and server POSIX startups when probes fail; behavior is intentional but affects every child-process spawn in those scenarios.

Overview
Adds shared resolveKnownPosixCliDirs (Homebrew/Linuxbrew, /usr/local/bin, and $HOME/.local/bin when HOME is set) as the last POSIX PATH fallback, mirroring the existing Windows known-CLI list.

DesktopinstallPosixEnvironment and serverhydratePosixPath now use it when the login-shell probe and (on macOS) launchctl getenv PATH both return nothing—e.g. GUI/Finder launches with only /usr/bin:/bin:… and slow or empty shell probes. A PATH from either probe is unchanged; the hardcoded dirs are not mixed in when a probe succeeds.

New tests cover macOS/Linux fallback merges, and guards that known dirs stay out when shell or launchctl answers.

Reviewed by Cursor Bugbot for commit 7bd0ba4. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add known CLI directory fallback to hydratePosixPath and installPosixEnvironment

  • Adds shared resolveKnownPosixCliDirs resolver that returns platform-specific CLI install directories (Homebrew on macOS, Linuxbrew on Linux, plus system-local and HOME-local bin).
  • Both desktop POSIX environment installation and server PATH hydration now prepend these known directories as a final fallback when neither the login shell nor launchctl produces a PATH.
  • A PATH from the login shell or launchctl remains preferred and is used directly without adding the fallback directories.
  • Risk: any caller relying on an empty PATH when probes fail will now receive a non-empty PATH composed of known CLI directories; the HOME-local entry is omitted when HOME is blank or unset.

Macroscope summarized 7bd0ba4.

POSIX PATH hydration had no fallback when both the login-shell and
launchctl probes returned nothing, so a slow shell profile left the
desktop app and the server on the bare Finder PATH and every bare-name
CLI spawn failed.
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 5d8d654

Macroscope's review found this PR approvable — This focused bug fix adds known POSIX CLI directories only when existing shell and launchctl PATH discovery fails, leaving successful probe paths unchanged. The implementation is small, isolated, and tested, with no schema, deployment, security-sensitive, or static-analysis configuration changes.

You can add or adjust custom eligibility rules. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: macOS Source Control reports installed Homebrew gh as unavailable

1 participant

@CyberStefNef
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): find user-installed CLIs when shell probing fails - #9232

Open
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback
Open

fix(desktop): find user-installed CLIs when shell probing fails#9232
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback

Conversation

@CyberStefNef

@CyberStefNefCyberStefNef commented Sep 2, 2026

Copy link
Copy Markdown

What Changed

resolveKnownPosixCliDirs in packages/shared/src/shell.ts returns the standard CLI directories for macOS and Linux, beside the existing resolveKnownWindowsCliDirs. Both POSIX PATH hydration paths now fall back to it when neither the login shell nor launchctl getenv PATH answers: installPosixEnvironment in apps/desktop/src/shell/DesktopShellEnvironment.ts and hydratePosixPath in apps/server/src/os-jank.ts.

The fallback is last in the chain, so a shell that did answer still decides the order. Directories are not checked for existence, matching resolveKnownWindowsCliDirs.

Why

A Finder launch starts the app with /usr/bin:/bin:/usr/sbin:/sbin. Both hydration paths repair that from the login shell, but the probe collapses failures and timeouts into an empty result, so a profile slower than the 5s timeout leaves PATH untouched. launchctl getenv PATH is unset on recent macOS, so the second probe returns nothing either. Every bare-name spawn then fails with ENOENT: #7618 counted 1246 failed gh spawns and zero successes over 14 hours, with gh auth status never running.

#1799 built this chain and added the launchctl probe as its last step. This adds the next step, for machines where that probe is also empty. Raising the timeout does not help, since the probe fails for reasons unrelated to how long it is given.

Both Windows paths already end in resolveKnownWindowsCliDirs. POSIX ended in nothing.

Closes#7618

Verification

  • vp test run apps/desktop/src/shell/DesktopShellEnvironment.test.ts packages/shared/src/shell.test.ts apps/server/src/os-jank.test.ts: 54 passed.
  • Typecheck for @t3tools/desktop, @t3tools/shared, and the server.
  • vp lint on the five changed files with --report-unused-disable-directives.
  • git diff --check: clean.
  • Seven added tests: the macOS and Linux fallbacks in both hydration paths, and guards that the known directories stay out of the merge when either probe answers. Reverting the source change fails the fallback tests and leaves the guards passing.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because nothing visual changed
  • A video is not applicable because no motion or interaction changed

Note

Medium Risk
Changes process PATH for all desktop and server POSIX startups when probes fail; behavior is intentional but affects every child-process spawn in those scenarios.

Overview
Adds shared resolveKnownPosixCliDirs (Homebrew/Linuxbrew, /usr/local/bin, and $HOME/.local/bin when HOME is set) as the last POSIX PATH fallback, mirroring the existing Windows known-CLI list.

DesktopinstallPosixEnvironment and serverhydratePosixPath now use it when the login-shell probe and (on macOS) launchctl getenv PATH both return nothing—e.g. GUI/Finder launches with only /usr/bin:/bin:… and slow or empty shell probes. A PATH from either probe is unchanged; the hardcoded dirs are not mixed in when a probe succeeds.

New tests cover macOS/Linux fallback merges, and guards that known dirs stay out when shell or launchctl answers.

Reviewed by Cursor Bugbot for commit 7bd0ba4. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add known CLI directory fallback to hydratePosixPath and installPosixEnvironment

  • Adds shared resolveKnownPosixCliDirs resolver that returns platform-specific CLI install directories (Homebrew on macOS, Linuxbrew on Linux, plus system-local and HOME-local bin).
  • Both desktop POSIX environment installation and server PATH hydration now prepend these known directories as a final fallback when neither the login shell nor launchctl produces a PATH.
  • A PATH from the login shell or launchctl remains preferred and is used directly without adding the fallback directories.
  • Risk: any caller relying on an empty PATH when probes fail will now receive a non-empty PATH composed of known CLI directories; the HOME-local entry is omitted when HOME is blank or unset.

Macroscope summarized 7bd0ba4.

POSIX PATH hydration had no fallback when both the login-shell and
launchctl probes returned nothing, so a slow shell profile left the
desktop app and the server on the bare Finder PATH and every bare-name
CLI spawn failed.
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 5d8d654

Macroscope's review found this PR approvable — This focused bug fix adds known POSIX CLI directories only when existing shell and launchctl PATH discovery fails, leaving successful probe paths unchanged. The implementation is small, isolated, and tested, with no schema, deployment, security-sensitive, or static-analysis configuration changes.

You can add or adjust custom eligibility rules. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: macOS Source Control reports installed Homebrew gh as unavailable

1 participant

@CyberStefNef
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(desktop): find user-installed CLIs when shell probing fails - #9232

Open
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback
Open

fix(desktop): find user-installed CLIs when shell probing fails#9232
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback

Conversation

@CyberStefNef

@CyberStefNefCyberStefNef commented Sep 2, 2026

Copy link
Copy Markdown

What Changed

resolveKnownPosixCliDirs in packages/shared/src/shell.ts returns the standard CLI directories for macOS and Linux, beside the existing resolveKnownWindowsCliDirs. Both POSIX PATH hydration paths now fall back to it when neither the login shell nor launchctl getenv PATH answers: installPosixEnvironment in apps/desktop/src/shell/DesktopShellEnvironment.ts and hydratePosixPath in apps/server/src/os-jank.ts.

The fallback is last in the chain, so a shell that did answer still decides the order. Directories are not checked for existence, matching resolveKnownWindowsCliDirs.

Why

A Finder launch starts the app with /usr/bin:/bin:/usr/sbin:/sbin. Both hydration paths repair that from the login shell, but the probe collapses failures and timeouts into an empty result, so a profile slower than the 5s timeout leaves PATH untouched. launchctl getenv PATH is unset on recent macOS, so the second probe returns nothing either. Every bare-name spawn then fails with ENOENT: #7618 counted 1246 failed gh spawns and zero successes over 14 hours, with gh auth status never running.

#1799 built this chain and added the launchctl probe as its last step. This adds the next step, for machines where that probe is also empty. Raising the timeout does not help, since the probe fails for reasons unrelated to how long it is given.

Both Windows paths already end in resolveKnownWindowsCliDirs. POSIX ended in nothing.

Closes#7618

Verification

  • vp test run apps/desktop/src/shell/DesktopShellEnvironment.test.ts packages/shared/src/shell.test.ts apps/server/src/os-jank.test.ts: 54 passed.
  • Typecheck for @t3tools/desktop, @t3tools/shared, and the server.
  • vp lint on the five changed files with --report-unused-disable-directives.
  • git diff --check: clean.
  • Seven added tests: the macOS and Linux fallbacks in both hydration paths, and guards that the known directories stay out of the merge when either probe answers. Reverting the source change fails the fallback tests and leaves the guards passing.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because nothing visual changed
  • A video is not applicable because no motion or interaction changed

Note

Medium Risk
Changes process PATH for all desktop and server POSIX startups when probes fail; behavior is intentional but affects every child-process spawn in those scenarios.

Overview
Adds shared resolveKnownPosixCliDirs (Homebrew/Linuxbrew, /usr/local/bin, and $HOME/.local/bin when HOME is set) as the last POSIX PATH fallback, mirroring the existing Windows known-CLI list.

DesktopinstallPosixEnvironment and serverhydratePosixPath now use it when the login-shell probe and (on macOS) launchctl getenv PATH both return nothing—e.g. GUI/Finder launches with only /usr/bin:/bin:… and slow or empty shell probes. A PATH from either probe is unchanged; the hardcoded dirs are not mixed in when a probe succeeds.

New tests cover macOS/Linux fallback merges, and guards that known dirs stay out when shell or launchctl answers.

Reviewed by Cursor Bugbot for commit 7bd0ba4. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add known CLI directory fallback to hydratePosixPath and installPosixEnvironment

  • Adds shared resolveKnownPosixCliDirs resolver that returns platform-specific CLI install directories (Homebrew on macOS, Linuxbrew on Linux, plus system-local and HOME-local bin).
  • Both desktop POSIX environment installation and server PATH hydration now prepend these known directories as a final fallback when neither the login shell nor launchctl produces a PATH.
  • A PATH from the login shell or launchctl remains preferred and is used directly without adding the fallback directories.
  • Risk: any caller relying on an empty PATH when probes fail will now receive a non-empty PATH composed of known CLI directories; the HOME-local entry is omitted when HOME is blank or unset.

Macroscope summarized 7bd0ba4.

POSIX PATH hydration had no fallback when both the login-shell and
launchctl probes returned nothing, so a slow shell profile left the
desktop app and the server on the bare Finder PATH and every bare-name
CLI spawn failed.
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 5d8d654

Macroscope's review found this PR approvable — This focused bug fix adds known POSIX CLI directories only when existing shell and launchctl PATH discovery fails, leaving successful probe paths unchanged. The implementation is small, isolated, and tested, with no schema, deployment, security-sensitive, or static-analysis configuration changes.

You can add or adjust custom eligibility rules. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: macOS Source Control reports installed Homebrew gh as unavailable

1 participant

@CyberStefNef
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): find user-installed CLIs when shell probing fails - #9232

Open
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback
Open

fix(desktop): find user-installed CLIs when shell probing fails#9232
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback

Conversation

@CyberStefNef

@CyberStefNefCyberStefNef commented Sep 2, 2026

Copy link
Copy Markdown

What Changed

resolveKnownPosixCliDirs in packages/shared/src/shell.ts returns the standard CLI directories for macOS and Linux, beside the existing resolveKnownWindowsCliDirs. Both POSIX PATH hydration paths now fall back to it when neither the login shell nor launchctl getenv PATH answers: installPosixEnvironment in apps/desktop/src/shell/DesktopShellEnvironment.ts and hydratePosixPath in apps/server/src/os-jank.ts.

The fallback is last in the chain, so a shell that did answer still decides the order. Directories are not checked for existence, matching resolveKnownWindowsCliDirs.

Why

A Finder launch starts the app with /usr/bin:/bin:/usr/sbin:/sbin. Both hydration paths repair that from the login shell, but the probe collapses failures and timeouts into an empty result, so a profile slower than the 5s timeout leaves PATH untouched. launchctl getenv PATH is unset on recent macOS, so the second probe returns nothing either. Every bare-name spawn then fails with ENOENT: #7618 counted 1246 failed gh spawns and zero successes over 14 hours, with gh auth status never running.

#1799 built this chain and added the launchctl probe as its last step. This adds the next step, for machines where that probe is also empty. Raising the timeout does not help, since the probe fails for reasons unrelated to how long it is given.

Both Windows paths already end in resolveKnownWindowsCliDirs. POSIX ended in nothing.

Closes#7618

Verification

  • vp test run apps/desktop/src/shell/DesktopShellEnvironment.test.ts packages/shared/src/shell.test.ts apps/server/src/os-jank.test.ts: 54 passed.
  • Typecheck for @t3tools/desktop, @t3tools/shared, and the server.
  • vp lint on the five changed files with --report-unused-disable-directives.
  • git diff --check: clean.
  • Seven added tests: the macOS and Linux fallbacks in both hydration paths, and guards that the known directories stay out of the merge when either probe answers. Reverting the source change fails the fallback tests and leaves the guards passing.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because nothing visual changed
  • A video is not applicable because no motion or interaction changed

Note

Medium Risk
Changes process PATH for all desktop and server POSIX startups when probes fail; behavior is intentional but affects every child-process spawn in those scenarios.

Overview
Adds shared resolveKnownPosixCliDirs (Homebrew/Linuxbrew, /usr/local/bin, and $HOME/.local/bin when HOME is set) as the last POSIX PATH fallback, mirroring the existing Windows known-CLI list.

DesktopinstallPosixEnvironment and serverhydratePosixPath now use it when the login-shell probe and (on macOS) launchctl getenv PATH both return nothing—e.g. GUI/Finder launches with only /usr/bin:/bin:… and slow or empty shell probes. A PATH from either probe is unchanged; the hardcoded dirs are not mixed in when a probe succeeds.

New tests cover macOS/Linux fallback merges, and guards that known dirs stay out when shell or launchctl answers.

Reviewed by Cursor Bugbot for commit 7bd0ba4. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add known CLI directory fallback to hydratePosixPath and installPosixEnvironment

  • Adds shared resolveKnownPosixCliDirs resolver that returns platform-specific CLI install directories (Homebrew on macOS, Linuxbrew on Linux, plus system-local and HOME-local bin).
  • Both desktop POSIX environment installation and server PATH hydration now prepend these known directories as a final fallback when neither the login shell nor launchctl produces a PATH.
  • A PATH from the login shell or launchctl remains preferred and is used directly without adding the fallback directories.
  • Risk: any caller relying on an empty PATH when probes fail will now receive a non-empty PATH composed of known CLI directories; the HOME-local entry is omitted when HOME is blank or unset.

Macroscope summarized 7bd0ba4.

POSIX PATH hydration had no fallback when both the login-shell and
launchctl probes returned nothing, so a slow shell profile left the
desktop app and the server on the bare Finder PATH and every bare-name
CLI spawn failed.
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 5d8d654

Macroscope's review found this PR approvable — This focused bug fix adds known POSIX CLI directories only when existing shell and launchctl PATH discovery fails, leaving successful probe paths unchanged. The implementation is small, isolated, and tested, with no schema, deployment, security-sensitive, or static-analysis configuration changes.

You can add or adjust custom eligibility rules. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: macOS Source Control reports installed Homebrew gh as unavailable

1 participant

@CyberStefNef
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): find user-installed CLIs when shell probing fails - #9232

Open
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback
Open

fix(desktop): find user-installed CLIs when shell probing fails#9232
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback

Conversation

@CyberStefNef

@CyberStefNefCyberStefNef commented Sep 2, 2026

Copy link
Copy Markdown

What Changed

resolveKnownPosixCliDirs in packages/shared/src/shell.ts returns the standard CLI directories for macOS and Linux, beside the existing resolveKnownWindowsCliDirs. Both POSIX PATH hydration paths now fall back to it when neither the login shell nor launchctl getenv PATH answers: installPosixEnvironment in apps/desktop/src/shell/DesktopShellEnvironment.ts and hydratePosixPath in apps/server/src/os-jank.ts.

The fallback is last in the chain, so a shell that did answer still decides the order. Directories are not checked for existence, matching resolveKnownWindowsCliDirs.

Why

A Finder launch starts the app with /usr/bin:/bin:/usr/sbin:/sbin. Both hydration paths repair that from the login shell, but the probe collapses failures and timeouts into an empty result, so a profile slower than the 5s timeout leaves PATH untouched. launchctl getenv PATH is unset on recent macOS, so the second probe returns nothing either. Every bare-name spawn then fails with ENOENT: #7618 counted 1246 failed gh spawns and zero successes over 14 hours, with gh auth status never running.

#1799 built this chain and added the launchctl probe as its last step. This adds the next step, for machines where that probe is also empty. Raising the timeout does not help, since the probe fails for reasons unrelated to how long it is given.

Both Windows paths already end in resolveKnownWindowsCliDirs. POSIX ended in nothing.

Closes#7618

Verification

  • vp test run apps/desktop/src/shell/DesktopShellEnvironment.test.ts packages/shared/src/shell.test.ts apps/server/src/os-jank.test.ts: 54 passed.
  • Typecheck for @t3tools/desktop, @t3tools/shared, and the server.
  • vp lint on the five changed files with --report-unused-disable-directives.
  • git diff --check: clean.
  • Seven added tests: the macOS and Linux fallbacks in both hydration paths, and guards that the known directories stay out of the merge when either probe answers. Reverting the source change fails the fallback tests and leaves the guards passing.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because nothing visual changed
  • A video is not applicable because no motion or interaction changed

Note

Medium Risk
Changes process PATH for all desktop and server POSIX startups when probes fail; behavior is intentional but affects every child-process spawn in those scenarios.

Overview
Adds shared resolveKnownPosixCliDirs (Homebrew/Linuxbrew, /usr/local/bin, and $HOME/.local/bin when HOME is set) as the last POSIX PATH fallback, mirroring the existing Windows known-CLI list.

DesktopinstallPosixEnvironment and serverhydratePosixPath now use it when the login-shell probe and (on macOS) launchctl getenv PATH both return nothing—e.g. GUI/Finder launches with only /usr/bin:/bin:… and slow or empty shell probes. A PATH from either probe is unchanged; the hardcoded dirs are not mixed in when a probe succeeds.

New tests cover macOS/Linux fallback merges, and guards that known dirs stay out when shell or launchctl answers.

Reviewed by Cursor Bugbot for commit 7bd0ba4. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add known CLI directory fallback to hydratePosixPath and installPosixEnvironment

  • Adds shared resolveKnownPosixCliDirs resolver that returns platform-specific CLI install directories (Homebrew on macOS, Linuxbrew on Linux, plus system-local and HOME-local bin).
  • Both desktop POSIX environment installation and server PATH hydration now prepend these known directories as a final fallback when neither the login shell nor launchctl produces a PATH.
  • A PATH from the login shell or launchctl remains preferred and is used directly without adding the fallback directories.
  • Risk: any caller relying on an empty PATH when probes fail will now receive a non-empty PATH composed of known CLI directories; the HOME-local entry is omitted when HOME is blank or unset.

Macroscope summarized 7bd0ba4.

POSIX PATH hydration had no fallback when both the login-shell and
launchctl probes returned nothing, so a slow shell profile left the
desktop app and the server on the bare Finder PATH and every bare-name
CLI spawn failed.
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 5d8d654

Macroscope's review found this PR approvable — This focused bug fix adds known POSIX CLI directories only when existing shell and launchctl PATH discovery fails, leaving successful probe paths unchanged. The implementation is small, isolated, and tested, with no schema, deployment, security-sensitive, or static-analysis configuration changes.

You can add or adjust custom eligibility rules. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: macOS Source Control reports installed Homebrew gh as unavailable

1 participant

@CyberStefNef
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(desktop): find user-installed CLIs when shell probing fails - #9232

Open
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback
Open

fix(desktop): find user-installed CLIs when shell probing fails#9232
CyberStefNef wants to merge 2 commits into
pingdotgg:mainfrom
CyberStefNef:fix/posix-cli-path-fallback

Conversation

@CyberStefNef

@CyberStefNefCyberStefNef commented Sep 2, 2026

Copy link
Copy Markdown

What Changed

resolveKnownPosixCliDirs in packages/shared/src/shell.ts returns the standard CLI directories for macOS and Linux, beside the existing resolveKnownWindowsCliDirs. Both POSIX PATH hydration paths now fall back to it when neither the login shell nor launchctl getenv PATH answers: installPosixEnvironment in apps/desktop/src/shell/DesktopShellEnvironment.ts and hydratePosixPath in apps/server/src/os-jank.ts.

The fallback is last in the chain, so a shell that did answer still decides the order. Directories are not checked for existence, matching resolveKnownWindowsCliDirs.

Why

A Finder launch starts the app with /usr/bin:/bin:/usr/sbin:/sbin. Both hydration paths repair that from the login shell, but the probe collapses failures and timeouts into an empty result, so a profile slower than the 5s timeout leaves PATH untouched. launchctl getenv PATH is unset on recent macOS, so the second probe returns nothing either. Every bare-name spawn then fails with ENOENT: #7618 counted 1246 failed gh spawns and zero successes over 14 hours, with gh auth status never running.

#1799 built this chain and added the launchctl probe as its last step. This adds the next step, for machines where that probe is also empty. Raising the timeout does not help, since the probe fails for reasons unrelated to how long it is given.

Both Windows paths already end in resolveKnownWindowsCliDirs. POSIX ended in nothing.

Closes#7618

Verification

  • vp test run apps/desktop/src/shell/DesktopShellEnvironment.test.ts packages/shared/src/shell.test.ts apps/server/src/os-jank.test.ts: 54 passed.
  • Typecheck for @t3tools/desktop, @t3tools/shared, and the server.
  • vp lint on the five changed files with --report-unused-disable-directives.
  • git diff --check: clean.
  • Seven added tests: the macOS and Linux fallbacks in both hydration paths, and guards that the known directories stay out of the merge when either probe answers. Reverting the source change fails the fallback tests and leaves the guards passing.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because nothing visual changed
  • A video is not applicable because no motion or interaction changed

Note

Medium Risk
Changes process PATH for all desktop and server POSIX startups when probes fail; behavior is intentional but affects every child-process spawn in those scenarios.

Overview
Adds shared resolveKnownPosixCliDirs (Homebrew/Linuxbrew, /usr/local/bin, and $HOME/.local/bin when HOME is set) as the last POSIX PATH fallback, mirroring the existing Windows known-CLI list.

DesktopinstallPosixEnvironment and serverhydratePosixPath now use it when the login-shell probe and (on macOS) launchctl getenv PATH both return nothing—e.g. GUI/Finder launches with only /usr/bin:/bin:… and slow or empty shell probes. A PATH from either probe is unchanged; the hardcoded dirs are not mixed in when a probe succeeds.

New tests cover macOS/Linux fallback merges, and guards that known dirs stay out when shell or launchctl answers.

Reviewed by Cursor Bugbot for commit 7bd0ba4. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add known CLI directory fallback to hydratePosixPath and installPosixEnvironment

  • Adds shared resolveKnownPosixCliDirs resolver that returns platform-specific CLI install directories (Homebrew on macOS, Linuxbrew on Linux, plus system-local and HOME-local bin).
  • Both desktop POSIX environment installation and server PATH hydration now prepend these known directories as a final fallback when neither the login shell nor launchctl produces a PATH.
  • A PATH from the login shell or launchctl remains preferred and is used directly without adding the fallback directories.
  • Risk: any caller relying on an empty PATH when probes fail will now receive a non-empty PATH composed of known CLI directories; the HOME-local entry is omitted when HOME is blank or unset.

Macroscope summarized 7bd0ba4.

POSIX PATH hydration had no fallback when both the login-shell and
launchctl probes returned nothing, so a slow shell profile left the
desktop app and the server on the bare Finder PATH and every bare-name
CLI spawn failed.
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 5d8d654

Macroscope's review found this PR approvable — This focused bug fix adds known POSIX CLI directories only when existing shell and launchctl PATH discovery fails, leaving successful probe paths unchanged. The implementation is small, isolated, and tested, with no schema, deployment, security-sensitive, or static-analysis configuration changes.

You can add or adjust custom eligibility rules. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: macOS Source Control reports installed Homebrew gh as unavailable

1 participant

@CyberStefNef