fix: improve onboarding for macOS — bun PATH detection + provider auto-activation - #240

Open
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs
Open

fix: improve onboarding for macOS — bun PATH detection + provider auto-activation#240
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs

Conversation

@lairulan

Copy link
Copy Markdown

Problem

Three related issues that silently break the initial setup experience on macOS, especially for users who install Claude CLI via bun:

1. Claude CLI not detected when installed via bun (macOS)

macOS GUI apps (Electron) do not inherit the user's shell PATH from .zshrc / .bash_profile. The PATH expansion helpers (getExpandedShellPath in electron/main.ts and getExtraPathDirs / getClaudeCandidatePaths in src/lib/platform.ts) did not include ~/.bun/bin, so users who install claude via bun install -g @anthropic-ai/claude-code would always get "Claude CLI not found", even though it was correctly installed.

2. New API provider created with is_active = 0

createProvider() in src/lib/db.ts hard-coded is_active = 0 for every INSERT. Users who complete the setup wizard and add their first provider end up with a silently inactive provider — all subsequent calls fail with a cryptic error despite a successful-looking configuration flow. Additionally, there was no logic to deactivate existing providers before inserting the new one, which could leave multiple active providers in an inconsistent state.

3. Unhelpful error message for "exited with code 1"

The error message shown when Claude CLI exits with code 1 listed several possible causes but omitted the inactive-provider scenario introduced by bug #2, making it hard for users to self-diagnose.


Changes

FileChange
electron/main.tsAdd ~/.bun/bin to getExpandedShellPath()
src/lib/platform.tsAdd ~/.bun/bin to getExtraPathDirs(); add ~/.bun/bin/claude to getClaudeCandidatePaths()
src/lib/db.tscreateProvider(): deactivate all existing providers before INSERT; set is_active = 1 for the new provider
src/lib/claude-client.tsAdd provider-activation hint to the "exited with code 1" error message

Testing

  • Verified on macOS (Apple Silicon) with claude installed via bun install -g
  • Confirmed new provider is immediately active after creation without requiring a manual toggle
  • Error message now surfaces the inactive-provider cause alongside the existing hints

- electron/main.ts: add ~/.bun/bin to getExpandedShellPath() so Claude
CLI installed via bun is detectable in the Electron GUI context (macOS
GUI apps do not inherit shell PATH from .zshrc/.bash_profile)
- src/lib/platform.ts: add ~/.bun/bin to getExtraPathDirs() and
~/.bun/bin/claude to getClaudeCandidatePaths() for consistent PATH
expansion on both renderer and main process sides
- src/lib/db.ts (createProvider): set is_active=1 when inserting a new
provider and deactivate all existing providers first, so the newly
created provider is immediately usable without a manual toggle
- src/lib/claude-client.ts: add provider-activation hint to the
"exited with code 1" error message, helping users diagnose the silent
failure caused by an inactive provider
@vercel

vercelBot commented Mar 11, 2026

Copy link
Copy Markdown

@lairulan is attempting to deploy a commit to the op7418's projects Team on Vercel.

A member of the Team first needs to authorize it.

Replace the blanket "deactivate all then activate new" logic in
createProvider() with a more conservative approach:
- If no active provider exists (e.g. first-time onboarding), the new
provider is inserted with is_active = 1 so it works immediately
- If an active provider already exists, the new provider is inserted
with is_active = 0, leaving the existing selection untouched
This avoids silently deactivating a provider the user is already using
when they add a second/backup provider via Settings.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@lairulan
, '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: improve onboarding for macOS — bun PATH detection + provider auto-activation - #240

Open
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs
Open

fix: improve onboarding for macOS — bun PATH detection + provider auto-activation#240
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs

Conversation

@lairulan

Copy link
Copy Markdown

Problem

Three related issues that silently break the initial setup experience on macOS, especially for users who install Claude CLI via bun:

1. Claude CLI not detected when installed via bun (macOS)

macOS GUI apps (Electron) do not inherit the user's shell PATH from .zshrc / .bash_profile. The PATH expansion helpers (getExpandedShellPath in electron/main.ts and getExtraPathDirs / getClaudeCandidatePaths in src/lib/platform.ts) did not include ~/.bun/bin, so users who install claude via bun install -g @anthropic-ai/claude-code would always get "Claude CLI not found", even though it was correctly installed.

2. New API provider created with is_active = 0

createProvider() in src/lib/db.ts hard-coded is_active = 0 for every INSERT. Users who complete the setup wizard and add their first provider end up with a silently inactive provider — all subsequent calls fail with a cryptic error despite a successful-looking configuration flow. Additionally, there was no logic to deactivate existing providers before inserting the new one, which could leave multiple active providers in an inconsistent state.

3. Unhelpful error message for "exited with code 1"

The error message shown when Claude CLI exits with code 1 listed several possible causes but omitted the inactive-provider scenario introduced by bug #2, making it hard for users to self-diagnose.


Changes

FileChange
electron/main.tsAdd ~/.bun/bin to getExpandedShellPath()
src/lib/platform.tsAdd ~/.bun/bin to getExtraPathDirs(); add ~/.bun/bin/claude to getClaudeCandidatePaths()
src/lib/db.tscreateProvider(): deactivate all existing providers before INSERT; set is_active = 1 for the new provider
src/lib/claude-client.tsAdd provider-activation hint to the "exited with code 1" error message

Testing

  • Verified on macOS (Apple Silicon) with claude installed via bun install -g
  • Confirmed new provider is immediately active after creation without requiring a manual toggle
  • Error message now surfaces the inactive-provider cause alongside the existing hints

- electron/main.ts: add ~/.bun/bin to getExpandedShellPath() so Claude
CLI installed via bun is detectable in the Electron GUI context (macOS
GUI apps do not inherit shell PATH from .zshrc/.bash_profile)
- src/lib/platform.ts: add ~/.bun/bin to getExtraPathDirs() and
~/.bun/bin/claude to getClaudeCandidatePaths() for consistent PATH
expansion on both renderer and main process sides
- src/lib/db.ts (createProvider): set is_active=1 when inserting a new
provider and deactivate all existing providers first, so the newly
created provider is immediately usable without a manual toggle
- src/lib/claude-client.ts: add provider-activation hint to the
"exited with code 1" error message, helping users diagnose the silent
failure caused by an inactive provider
@vercel

vercelBot commented Mar 11, 2026

Copy link
Copy Markdown

@lairulan is attempting to deploy a commit to the op7418's projects Team on Vercel.

A member of the Team first needs to authorize it.

Replace the blanket "deactivate all then activate new" logic in
createProvider() with a more conservative approach:
- If no active provider exists (e.g. first-time onboarding), the new
provider is inserted with is_active = 1 so it works immediately
- If an active provider already exists, the new provider is inserted
with is_active = 0, leaving the existing selection untouched
This avoids silently deactivating a provider the user is already using
when they add a second/backup provider via Settings.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@lairulan
, '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: improve onboarding for macOS — bun PATH detection + provider auto-activation - #240

Open
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs
Open

fix: improve onboarding for macOS — bun PATH detection + provider auto-activation#240
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs

Conversation

@lairulan

Copy link
Copy Markdown

Problem

Three related issues that silently break the initial setup experience on macOS, especially for users who install Claude CLI via bun:

1. Claude CLI not detected when installed via bun (macOS)

macOS GUI apps (Electron) do not inherit the user's shell PATH from .zshrc / .bash_profile. The PATH expansion helpers (getExpandedShellPath in electron/main.ts and getExtraPathDirs / getClaudeCandidatePaths in src/lib/platform.ts) did not include ~/.bun/bin, so users who install claude via bun install -g @anthropic-ai/claude-code would always get "Claude CLI not found", even though it was correctly installed.

2. New API provider created with is_active = 0

createProvider() in src/lib/db.ts hard-coded is_active = 0 for every INSERT. Users who complete the setup wizard and add their first provider end up with a silently inactive provider — all subsequent calls fail with a cryptic error despite a successful-looking configuration flow. Additionally, there was no logic to deactivate existing providers before inserting the new one, which could leave multiple active providers in an inconsistent state.

3. Unhelpful error message for "exited with code 1"

The error message shown when Claude CLI exits with code 1 listed several possible causes but omitted the inactive-provider scenario introduced by bug #2, making it hard for users to self-diagnose.


Changes

FileChange
electron/main.tsAdd ~/.bun/bin to getExpandedShellPath()
src/lib/platform.tsAdd ~/.bun/bin to getExtraPathDirs(); add ~/.bun/bin/claude to getClaudeCandidatePaths()
src/lib/db.tscreateProvider(): deactivate all existing providers before INSERT; set is_active = 1 for the new provider
src/lib/claude-client.tsAdd provider-activation hint to the "exited with code 1" error message

Testing

  • Verified on macOS (Apple Silicon) with claude installed via bun install -g
  • Confirmed new provider is immediately active after creation without requiring a manual toggle
  • Error message now surfaces the inactive-provider cause alongside the existing hints

- electron/main.ts: add ~/.bun/bin to getExpandedShellPath() so Claude
CLI installed via bun is detectable in the Electron GUI context (macOS
GUI apps do not inherit shell PATH from .zshrc/.bash_profile)
- src/lib/platform.ts: add ~/.bun/bin to getExtraPathDirs() and
~/.bun/bin/claude to getClaudeCandidatePaths() for consistent PATH
expansion on both renderer and main process sides
- src/lib/db.ts (createProvider): set is_active=1 when inserting a new
provider and deactivate all existing providers first, so the newly
created provider is immediately usable without a manual toggle
- src/lib/claude-client.ts: add provider-activation hint to the
"exited with code 1" error message, helping users diagnose the silent
failure caused by an inactive provider
@vercel

vercelBot commented Mar 11, 2026

Copy link
Copy Markdown

@lairulan is attempting to deploy a commit to the op7418's projects Team on Vercel.

A member of the Team first needs to authorize it.

Replace the blanket "deactivate all then activate new" logic in
createProvider() with a more conservative approach:
- If no active provider exists (e.g. first-time onboarding), the new
provider is inserted with is_active = 1 so it works immediately
- If an active provider already exists, the new provider is inserted
with is_active = 0, leaving the existing selection untouched
This avoids silently deactivating a provider the user is already using
when they add a second/backup provider via Settings.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@lairulan
, '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: improve onboarding for macOS — bun PATH detection + provider auto-activation - #240

Open
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs
Open

fix: improve onboarding for macOS — bun PATH detection + provider auto-activation#240
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs

Conversation

@lairulan

Copy link
Copy Markdown

Problem

Three related issues that silently break the initial setup experience on macOS, especially for users who install Claude CLI via bun:

1. Claude CLI not detected when installed via bun (macOS)

macOS GUI apps (Electron) do not inherit the user's shell PATH from .zshrc / .bash_profile. The PATH expansion helpers (getExpandedShellPath in electron/main.ts and getExtraPathDirs / getClaudeCandidatePaths in src/lib/platform.ts) did not include ~/.bun/bin, so users who install claude via bun install -g @anthropic-ai/claude-code would always get "Claude CLI not found", even though it was correctly installed.

2. New API provider created with is_active = 0

createProvider() in src/lib/db.ts hard-coded is_active = 0 for every INSERT. Users who complete the setup wizard and add their first provider end up with a silently inactive provider — all subsequent calls fail with a cryptic error despite a successful-looking configuration flow. Additionally, there was no logic to deactivate existing providers before inserting the new one, which could leave multiple active providers in an inconsistent state.

3. Unhelpful error message for "exited with code 1"

The error message shown when Claude CLI exits with code 1 listed several possible causes but omitted the inactive-provider scenario introduced by bug #2, making it hard for users to self-diagnose.


Changes

FileChange
electron/main.tsAdd ~/.bun/bin to getExpandedShellPath()
src/lib/platform.tsAdd ~/.bun/bin to getExtraPathDirs(); add ~/.bun/bin/claude to getClaudeCandidatePaths()
src/lib/db.tscreateProvider(): deactivate all existing providers before INSERT; set is_active = 1 for the new provider
src/lib/claude-client.tsAdd provider-activation hint to the "exited with code 1" error message

Testing

  • Verified on macOS (Apple Silicon) with claude installed via bun install -g
  • Confirmed new provider is immediately active after creation without requiring a manual toggle
  • Error message now surfaces the inactive-provider cause alongside the existing hints

- electron/main.ts: add ~/.bun/bin to getExpandedShellPath() so Claude
CLI installed via bun is detectable in the Electron GUI context (macOS
GUI apps do not inherit shell PATH from .zshrc/.bash_profile)
- src/lib/platform.ts: add ~/.bun/bin to getExtraPathDirs() and
~/.bun/bin/claude to getClaudeCandidatePaths() for consistent PATH
expansion on both renderer and main process sides
- src/lib/db.ts (createProvider): set is_active=1 when inserting a new
provider and deactivate all existing providers first, so the newly
created provider is immediately usable without a manual toggle
- src/lib/claude-client.ts: add provider-activation hint to the
"exited with code 1" error message, helping users diagnose the silent
failure caused by an inactive provider
@vercel

vercelBot commented Mar 11, 2026

Copy link
Copy Markdown

@lairulan is attempting to deploy a commit to the op7418's projects Team on Vercel.

A member of the Team first needs to authorize it.

Replace the blanket "deactivate all then activate new" logic in
createProvider() with a more conservative approach:
- If no active provider exists (e.g. first-time onboarding), the new
provider is inserted with is_active = 1 so it works immediately
- If an active provider already exists, the new provider is inserted
with is_active = 0, leaving the existing selection untouched
This avoids silently deactivating a provider the user is already using
when they add a second/backup provider via Settings.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@lairulan
, '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: improve onboarding for macOS — bun PATH detection + provider auto-activation - #240

Open
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs
Open

fix: improve onboarding for macOS — bun PATH detection + provider auto-activation#240
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs

Conversation

@lairulan

Copy link
Copy Markdown

Problem

Three related issues that silently break the initial setup experience on macOS, especially for users who install Claude CLI via bun:

1. Claude CLI not detected when installed via bun (macOS)

macOS GUI apps (Electron) do not inherit the user's shell PATH from .zshrc / .bash_profile. The PATH expansion helpers (getExpandedShellPath in electron/main.ts and getExtraPathDirs / getClaudeCandidatePaths in src/lib/platform.ts) did not include ~/.bun/bin, so users who install claude via bun install -g @anthropic-ai/claude-code would always get "Claude CLI not found", even though it was correctly installed.

2. New API provider created with is_active = 0

createProvider() in src/lib/db.ts hard-coded is_active = 0 for every INSERT. Users who complete the setup wizard and add their first provider end up with a silently inactive provider — all subsequent calls fail with a cryptic error despite a successful-looking configuration flow. Additionally, there was no logic to deactivate existing providers before inserting the new one, which could leave multiple active providers in an inconsistent state.

3. Unhelpful error message for "exited with code 1"

The error message shown when Claude CLI exits with code 1 listed several possible causes but omitted the inactive-provider scenario introduced by bug #2, making it hard for users to self-diagnose.


Changes

FileChange
electron/main.tsAdd ~/.bun/bin to getExpandedShellPath()
src/lib/platform.tsAdd ~/.bun/bin to getExtraPathDirs(); add ~/.bun/bin/claude to getClaudeCandidatePaths()
src/lib/db.tscreateProvider(): deactivate all existing providers before INSERT; set is_active = 1 for the new provider
src/lib/claude-client.tsAdd provider-activation hint to the "exited with code 1" error message

Testing

  • Verified on macOS (Apple Silicon) with claude installed via bun install -g
  • Confirmed new provider is immediately active after creation without requiring a manual toggle
  • Error message now surfaces the inactive-provider cause alongside the existing hints

- electron/main.ts: add ~/.bun/bin to getExpandedShellPath() so Claude
CLI installed via bun is detectable in the Electron GUI context (macOS
GUI apps do not inherit shell PATH from .zshrc/.bash_profile)
- src/lib/platform.ts: add ~/.bun/bin to getExtraPathDirs() and
~/.bun/bin/claude to getClaudeCandidatePaths() for consistent PATH
expansion on both renderer and main process sides
- src/lib/db.ts (createProvider): set is_active=1 when inserting a new
provider and deactivate all existing providers first, so the newly
created provider is immediately usable without a manual toggle
- src/lib/claude-client.ts: add provider-activation hint to the
"exited with code 1" error message, helping users diagnose the silent
failure caused by an inactive provider
@vercel

vercelBot commented Mar 11, 2026

Copy link
Copy Markdown

@lairulan is attempting to deploy a commit to the op7418's projects Team on Vercel.

A member of the Team first needs to authorize it.

Replace the blanket "deactivate all then activate new" logic in
createProvider() with a more conservative approach:
- If no active provider exists (e.g. first-time onboarding), the new
provider is inserted with is_active = 1 so it works immediately
- If an active provider already exists, the new provider is inserted
with is_active = 0, leaving the existing selection untouched
This avoids silently deactivating a provider the user is already using
when they add a second/backup provider via Settings.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@lairulan
, '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: improve onboarding for macOS — bun PATH detection + provider auto-activation - #240

Open
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs
Open

fix: improve onboarding for macOS — bun PATH detection + provider auto-activation#240
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs

Conversation

@lairulan

Copy link
Copy Markdown

Problem

Three related issues that silently break the initial setup experience on macOS, especially for users who install Claude CLI via bun:

1. Claude CLI not detected when installed via bun (macOS)

macOS GUI apps (Electron) do not inherit the user's shell PATH from .zshrc / .bash_profile. The PATH expansion helpers (getExpandedShellPath in electron/main.ts and getExtraPathDirs / getClaudeCandidatePaths in src/lib/platform.ts) did not include ~/.bun/bin, so users who install claude via bun install -g @anthropic-ai/claude-code would always get "Claude CLI not found", even though it was correctly installed.

2. New API provider created with is_active = 0

createProvider() in src/lib/db.ts hard-coded is_active = 0 for every INSERT. Users who complete the setup wizard and add their first provider end up with a silently inactive provider — all subsequent calls fail with a cryptic error despite a successful-looking configuration flow. Additionally, there was no logic to deactivate existing providers before inserting the new one, which could leave multiple active providers in an inconsistent state.

3. Unhelpful error message for "exited with code 1"

The error message shown when Claude CLI exits with code 1 listed several possible causes but omitted the inactive-provider scenario introduced by bug #2, making it hard for users to self-diagnose.


Changes

FileChange
electron/main.tsAdd ~/.bun/bin to getExpandedShellPath()
src/lib/platform.tsAdd ~/.bun/bin to getExtraPathDirs(); add ~/.bun/bin/claude to getClaudeCandidatePaths()
src/lib/db.tscreateProvider(): deactivate all existing providers before INSERT; set is_active = 1 for the new provider
src/lib/claude-client.tsAdd provider-activation hint to the "exited with code 1" error message

Testing

  • Verified on macOS (Apple Silicon) with claude installed via bun install -g
  • Confirmed new provider is immediately active after creation without requiring a manual toggle
  • Error message now surfaces the inactive-provider cause alongside the existing hints

- electron/main.ts: add ~/.bun/bin to getExpandedShellPath() so Claude
CLI installed via bun is detectable in the Electron GUI context (macOS
GUI apps do not inherit shell PATH from .zshrc/.bash_profile)
- src/lib/platform.ts: add ~/.bun/bin to getExtraPathDirs() and
~/.bun/bin/claude to getClaudeCandidatePaths() for consistent PATH
expansion on both renderer and main process sides
- src/lib/db.ts (createProvider): set is_active=1 when inserting a new
provider and deactivate all existing providers first, so the newly
created provider is immediately usable without a manual toggle
- src/lib/claude-client.ts: add provider-activation hint to the
"exited with code 1" error message, helping users diagnose the silent
failure caused by an inactive provider
@vercel

vercelBot commented Mar 11, 2026

Copy link
Copy Markdown

@lairulan is attempting to deploy a commit to the op7418's projects Team on Vercel.

A member of the Team first needs to authorize it.

Replace the blanket "deactivate all then activate new" logic in
createProvider() with a more conservative approach:
- If no active provider exists (e.g. first-time onboarding), the new
provider is inserted with is_active = 1 so it works immediately
- If an active provider already exists, the new provider is inserted
with is_active = 0, leaving the existing selection untouched
This avoids silently deactivating a provider the user is already using
when they add a second/backup provider via Settings.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@lairulan
, '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: improve onboarding for macOS — bun PATH detection + provider auto-activation - #240

Open
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs
Open

fix: improve onboarding for macOS — bun PATH detection + provider auto-activation#240
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs

Conversation

@lairulan

Copy link
Copy Markdown

Problem

Three related issues that silently break the initial setup experience on macOS, especially for users who install Claude CLI via bun:

1. Claude CLI not detected when installed via bun (macOS)

macOS GUI apps (Electron) do not inherit the user's shell PATH from .zshrc / .bash_profile. The PATH expansion helpers (getExpandedShellPath in electron/main.ts and getExtraPathDirs / getClaudeCandidatePaths in src/lib/platform.ts) did not include ~/.bun/bin, so users who install claude via bun install -g @anthropic-ai/claude-code would always get "Claude CLI not found", even though it was correctly installed.

2. New API provider created with is_active = 0

createProvider() in src/lib/db.ts hard-coded is_active = 0 for every INSERT. Users who complete the setup wizard and add their first provider end up with a silently inactive provider — all subsequent calls fail with a cryptic error despite a successful-looking configuration flow. Additionally, there was no logic to deactivate existing providers before inserting the new one, which could leave multiple active providers in an inconsistent state.

3. Unhelpful error message for "exited with code 1"

The error message shown when Claude CLI exits with code 1 listed several possible causes but omitted the inactive-provider scenario introduced by bug #2, making it hard for users to self-diagnose.


Changes

FileChange
electron/main.tsAdd ~/.bun/bin to getExpandedShellPath()
src/lib/platform.tsAdd ~/.bun/bin to getExtraPathDirs(); add ~/.bun/bin/claude to getClaudeCandidatePaths()
src/lib/db.tscreateProvider(): deactivate all existing providers before INSERT; set is_active = 1 for the new provider
src/lib/claude-client.tsAdd provider-activation hint to the "exited with code 1" error message

Testing

  • Verified on macOS (Apple Silicon) with claude installed via bun install -g
  • Confirmed new provider is immediately active after creation without requiring a manual toggle
  • Error message now surfaces the inactive-provider cause alongside the existing hints

- electron/main.ts: add ~/.bun/bin to getExpandedShellPath() so Claude
CLI installed via bun is detectable in the Electron GUI context (macOS
GUI apps do not inherit shell PATH from .zshrc/.bash_profile)
- src/lib/platform.ts: add ~/.bun/bin to getExtraPathDirs() and
~/.bun/bin/claude to getClaudeCandidatePaths() for consistent PATH
expansion on both renderer and main process sides
- src/lib/db.ts (createProvider): set is_active=1 when inserting a new
provider and deactivate all existing providers first, so the newly
created provider is immediately usable without a manual toggle
- src/lib/claude-client.ts: add provider-activation hint to the
"exited with code 1" error message, helping users diagnose the silent
failure caused by an inactive provider
@vercel

vercelBot commented Mar 11, 2026

Copy link
Copy Markdown

@lairulan is attempting to deploy a commit to the op7418's projects Team on Vercel.

A member of the Team first needs to authorize it.

Replace the blanket "deactivate all then activate new" logic in
createProvider() with a more conservative approach:
- If no active provider exists (e.g. first-time onboarding), the new
provider is inserted with is_active = 1 so it works immediately
- If an active provider already exists, the new provider is inserted
with is_active = 0, leaving the existing selection untouched
This avoids silently deactivating a provider the user is already using
when they add a second/backup provider via Settings.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@lairulan
, '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: improve onboarding for macOS — bun PATH detection + provider auto-activation - #240

Open
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs
Open

fix: improve onboarding for macOS — bun PATH detection + provider auto-activation#240
lairulan wants to merge 2 commits into
op7418:mainfrom
lairulan:fix/onboarding-bugs

Conversation

@lairulan

Copy link
Copy Markdown

Problem

Three related issues that silently break the initial setup experience on macOS, especially for users who install Claude CLI via bun:

1. Claude CLI not detected when installed via bun (macOS)

macOS GUI apps (Electron) do not inherit the user's shell PATH from .zshrc / .bash_profile. The PATH expansion helpers (getExpandedShellPath in electron/main.ts and getExtraPathDirs / getClaudeCandidatePaths in src/lib/platform.ts) did not include ~/.bun/bin, so users who install claude via bun install -g @anthropic-ai/claude-code would always get "Claude CLI not found", even though it was correctly installed.

2. New API provider created with is_active = 0

createProvider() in src/lib/db.ts hard-coded is_active = 0 for every INSERT. Users who complete the setup wizard and add their first provider end up with a silently inactive provider — all subsequent calls fail with a cryptic error despite a successful-looking configuration flow. Additionally, there was no logic to deactivate existing providers before inserting the new one, which could leave multiple active providers in an inconsistent state.

3. Unhelpful error message for "exited with code 1"

The error message shown when Claude CLI exits with code 1 listed several possible causes but omitted the inactive-provider scenario introduced by bug #2, making it hard for users to self-diagnose.


Changes

FileChange
electron/main.tsAdd ~/.bun/bin to getExpandedShellPath()
src/lib/platform.tsAdd ~/.bun/bin to getExtraPathDirs(); add ~/.bun/bin/claude to getClaudeCandidatePaths()
src/lib/db.tscreateProvider(): deactivate all existing providers before INSERT; set is_active = 1 for the new provider
src/lib/claude-client.tsAdd provider-activation hint to the "exited with code 1" error message

Testing

  • Verified on macOS (Apple Silicon) with claude installed via bun install -g
  • Confirmed new provider is immediately active after creation without requiring a manual toggle
  • Error message now surfaces the inactive-provider cause alongside the existing hints

- electron/main.ts: add ~/.bun/bin to getExpandedShellPath() so Claude
CLI installed via bun is detectable in the Electron GUI context (macOS
GUI apps do not inherit shell PATH from .zshrc/.bash_profile)
- src/lib/platform.ts: add ~/.bun/bin to getExtraPathDirs() and
~/.bun/bin/claude to getClaudeCandidatePaths() for consistent PATH
expansion on both renderer and main process sides
- src/lib/db.ts (createProvider): set is_active=1 when inserting a new
provider and deactivate all existing providers first, so the newly
created provider is immediately usable without a manual toggle
- src/lib/claude-client.ts: add provider-activation hint to the
"exited with code 1" error message, helping users diagnose the silent
failure caused by an inactive provider
@vercel

vercelBot commented Mar 11, 2026

Copy link
Copy Markdown

@lairulan is attempting to deploy a commit to the op7418's projects Team on Vercel.

A member of the Team first needs to authorize it.

Replace the blanket "deactivate all then activate new" logic in
createProvider() with a more conservative approach:
- If no active provider exists (e.g. first-time onboarding), the new
provider is inserted with is_active = 1 so it works immediately
- If an active provider already exists, the new provider is inserted
with is_active = 0, leaving the existing selection untouched
This avoids silently deactivating a provider the user is already using
when they add a second/backup provider via Settings.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@lairulan