diff --git a/.agents/skills/impeccable/scripts/lib/open-system-browser.mjs b/.agents/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.agents/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.agents/skills/impeccable/scripts/serve-question.mjs b/.agents/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.agents/skills/impeccable/scripts/serve-question.mjs +++ b/.agents/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.claude/skills/impeccable/scripts/lib/open-system-browser.mjs b/.claude/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.claude/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.claude/skills/impeccable/scripts/serve-question.mjs b/.claude/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.claude/skills/impeccable/scripts/serve-question.mjs +++ b/.claude/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.cursor/skills/impeccable/scripts/lib/open-system-browser.mjs b/.cursor/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.cursor/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.cursor/skills/impeccable/scripts/serve-question.mjs b/.cursor/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.cursor/skills/impeccable/scripts/serve-question.mjs +++ b/.cursor/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.gemini/skills/impeccable/scripts/lib/open-system-browser.mjs b/.gemini/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.gemini/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.gemini/skills/impeccable/scripts/serve-question.mjs b/.gemini/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.gemini/skills/impeccable/scripts/serve-question.mjs +++ b/.gemini/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.github/skills/impeccable/scripts/lib/open-system-browser.mjs b/.github/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.github/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.github/skills/impeccable/scripts/serve-question.mjs b/.github/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.github/skills/impeccable/scripts/serve-question.mjs +++ b/.github/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.grok/skills/impeccable/scripts/lib/open-system-browser.mjs b/.grok/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.grok/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.grok/skills/impeccable/scripts/serve-question.mjs b/.grok/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.grok/skills/impeccable/scripts/serve-question.mjs +++ b/.grok/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.kiro/skills/impeccable/scripts/lib/open-system-browser.mjs b/.kiro/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.kiro/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.kiro/skills/impeccable/scripts/serve-question.mjs b/.kiro/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.kiro/skills/impeccable/scripts/serve-question.mjs +++ b/.kiro/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.opencode/skills/impeccable/scripts/lib/open-system-browser.mjs b/.opencode/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.opencode/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.opencode/skills/impeccable/scripts/serve-question.mjs b/.opencode/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.opencode/skills/impeccable/scripts/serve-question.mjs +++ b/.opencode/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.pi/skills/impeccable/scripts/lib/open-system-browser.mjs b/.pi/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.pi/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.pi/skills/impeccable/scripts/serve-question.mjs b/.pi/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.pi/skills/impeccable/scripts/serve-question.mjs +++ b/.pi/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.qoder/skills/impeccable/scripts/lib/open-system-browser.mjs b/.qoder/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.qoder/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.qoder/skills/impeccable/scripts/serve-question.mjs b/.qoder/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.qoder/skills/impeccable/scripts/serve-question.mjs +++ b/.qoder/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.rovodev/skills/impeccable/scripts/lib/open-system-browser.mjs b/.rovodev/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.rovodev/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.rovodev/skills/impeccable/scripts/serve-question.mjs b/.rovodev/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.rovodev/skills/impeccable/scripts/serve-question.mjs +++ b/.rovodev/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.trae-cn/skills/impeccable/scripts/lib/open-system-browser.mjs b/.trae-cn/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.trae-cn/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.trae-cn/skills/impeccable/scripts/serve-question.mjs b/.trae-cn/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.trae-cn/skills/impeccable/scripts/serve-question.mjs +++ b/.trae-cn/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.trae/skills/impeccable/scripts/lib/open-system-browser.mjs b/.trae/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.trae/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.trae/skills/impeccable/scripts/serve-question.mjs b/.trae/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.trae/skills/impeccable/scripts/serve-question.mjs +++ b/.trae/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/.vibe/skills/impeccable/scripts/lib/open-system-browser.mjs b/.vibe/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/.vibe/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/.vibe/skills/impeccable/scripts/serve-question.mjs b/.vibe/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/.vibe/skills/impeccable/scripts/serve-question.mjs +++ b/.vibe/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => { diff --git a/plugin/skills/impeccable/scripts/lib/open-system-browser.mjs b/plugin/skills/impeccable/scripts/lib/open-system-browser.mjs new file mode 100644 index 000000000..c44cd847a --- /dev/null +++ b/plugin/skills/impeccable/scripts/lib/open-system-browser.mjs @@ -0,0 +1,26 @@ +import { spawn } from 'node:child_process'; + +export function browserOpenCommand(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', +} = {}) { + if (platform === 'darwin') return { command: 'open', args: [url] }; + if (platform === 'win32') return { command: comspec, args: ['/c', 'start', '', url] }; + return { command: 'xdg-open', args: [url] }; +} + +export function openSystemBrowser(url, { + platform = process.platform, + comspec = process.env.ComSpec || process.env.COMSPEC || 'cmd.exe', + spawnImpl = spawn, +} = {}) { + const { command, args } = browserOpenCommand(url, { platform, comspec }); + try { + const child = spawnImpl(command, args, { stdio: 'ignore', detached: true }); + child.on('error', () => {}); + child.unref(); + return true; + } catch { + return false; + } +} diff --git a/plugin/skills/impeccable/scripts/serve-question.mjs b/plugin/skills/impeccable/scripts/serve-question.mjs index 25beaa759..2d8c24a6a 100644 --- a/plugin/skills/impeccable/scripts/serve-question.mjs +++ b/plugin/skills/impeccable/scripts/serve-question.mjs @@ -79,6 +79,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { spawn } from 'node:child_process'; import { fileURLToPath } from 'node:url'; +import { openSystemBrowser } from './lib/open-system-browser.mjs'; function arg(name, fallback = null) { const i = process.argv.indexOf(`--${name}`); @@ -976,8 +977,7 @@ server.listen(portArg, '127.0.0.1', () => { console.log('Waiting for the user to choose in the browser (Ctrl-C aborts)...'); } if (!hasFlag('no-open')) { - const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - try { spawn(opener, [url], { stdio: 'ignore', detached: true }).unref(); } catch { /* URL printed anyway */ } + openSystemBrowser(url); } if (timeoutSec > 0) { setTimeout(() => {