feat(desktop): headless visual-smoke capture, no foreground window - #161

Merged
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless
Jun 23, 2026
Merged

feat(desktop): headless visual-smoke capture, no foreground window#161
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Make the visual-smoke screenshot harness headless, worktree-runnable, and crash-fast.

Why

Captures launched a real Electron window that grabbed foreground focus on every (scenario × variant), so the harness was intrusive to run during interactive work — and it could not run from a git worktree at all. A stale build also crashed each capture with a blocking native error dialog and a ~60s marker timeout.

Changes

  • Headless capture (apps/desktop/src/main/main.ts): under MAKA_VISUAL_SMOKE_FIXTURE, the window is created with show: false and the macOS dock icon is hidden, so the capture process never shows a window or steals focus. capturePage() still returns a painted frame on a hidden window (paintWhenInitiallyHidden defaults to true).
  • Crash-fast (main.ts): an unknown scenario (stale build whose scenario set lags the capture script, or a typo'd env) now logs [visual-smoke] fatal: … and exits immediately, instead of throwing during top-level module evaluation → blocking native error dialog → ~60s marker timeout.
  • Worktree-runnable (scripts/capture-screenshots.mjs): resolve the electron binary via Node's upward module resolution instead of hard-requiring REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules holds only the workspace's own @maka/* packages) finds electron in the parent checkout.

All branches are gated behind MAKA_VISUAL_SMOKE_FIXTURE; real (non-capture) runs are unchanged.

Verification

  • Headless capture across empty / modal (command palette, permission) / settings scenarios — all render correctly, no foreground window, no dock bounce, ~1.0–1.3s each.
  • Capture runs from a git worktree with no electron symlink (upward resolution).
  • Bogus scenario exits in <1s with [visual-smoke] fatal … and no dialog (previously 60s + native dialog).
  • npm -w @maka/desktop run typecheck clean; desktop suite 1466 pass / 0 fail.

Visual-smoke captures launched a real Electron window that took
foreground focus on every (scenario × variant), so the harness was
intrusive to run during interactive work — and it could not run from a
git worktree at all.
- main: under MAKA_VISUAL_SMOKE_FIXTURE, create the window with
`show: false` and hide the macOS dock icon, so the capture process
never shows a window or steals focus. `capturePage()` still returns a
painted frame on a hidden window (paintWhenInitiallyHidden defaults to
true). Verified across empty / modal / settings scenarios.
- main: resolve the fixture defensively. An unknown scenario (a stale
build whose scenario set lags the capture script, or a typo'd env)
previously threw during top-level module evaluation, which surfaced a
blocking native error dialog and made the driver wait out its full
~60s marker timeout. It now logs a parseable line and exits fast with
no dialog.
- scripts/capture-screenshots: resolve the electron binary via Node's
upward module resolution instead of hard-requiring
REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules
holds only the workspace's own @maka/* packages) finds electron in the
parent checkout.
Real (non-capture) runs are unchanged — every branch is gated behind
MAKA_VISUAL_SMOKE_FIXTURE.
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

@Astro-Han
, '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

feat(desktop): headless visual-smoke capture, no foreground window - #161

Merged
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless
Jun 23, 2026
Merged

feat(desktop): headless visual-smoke capture, no foreground window#161
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Make the visual-smoke screenshot harness headless, worktree-runnable, and crash-fast.

Why

Captures launched a real Electron window that grabbed foreground focus on every (scenario × variant), so the harness was intrusive to run during interactive work — and it could not run from a git worktree at all. A stale build also crashed each capture with a blocking native error dialog and a ~60s marker timeout.

Changes

  • Headless capture (apps/desktop/src/main/main.ts): under MAKA_VISUAL_SMOKE_FIXTURE, the window is created with show: false and the macOS dock icon is hidden, so the capture process never shows a window or steals focus. capturePage() still returns a painted frame on a hidden window (paintWhenInitiallyHidden defaults to true).
  • Crash-fast (main.ts): an unknown scenario (stale build whose scenario set lags the capture script, or a typo'd env) now logs [visual-smoke] fatal: … and exits immediately, instead of throwing during top-level module evaluation → blocking native error dialog → ~60s marker timeout.
  • Worktree-runnable (scripts/capture-screenshots.mjs): resolve the electron binary via Node's upward module resolution instead of hard-requiring REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules holds only the workspace's own @maka/* packages) finds electron in the parent checkout.

All branches are gated behind MAKA_VISUAL_SMOKE_FIXTURE; real (non-capture) runs are unchanged.

Verification

  • Headless capture across empty / modal (command palette, permission) / settings scenarios — all render correctly, no foreground window, no dock bounce, ~1.0–1.3s each.
  • Capture runs from a git worktree with no electron symlink (upward resolution).
  • Bogus scenario exits in <1s with [visual-smoke] fatal … and no dialog (previously 60s + native dialog).
  • npm -w @maka/desktop run typecheck clean; desktop suite 1466 pass / 0 fail.

Visual-smoke captures launched a real Electron window that took
foreground focus on every (scenario × variant), so the harness was
intrusive to run during interactive work — and it could not run from a
git worktree at all.
- main: under MAKA_VISUAL_SMOKE_FIXTURE, create the window with
`show: false` and hide the macOS dock icon, so the capture process
never shows a window or steals focus. `capturePage()` still returns a
painted frame on a hidden window (paintWhenInitiallyHidden defaults to
true). Verified across empty / modal / settings scenarios.
- main: resolve the fixture defensively. An unknown scenario (a stale
build whose scenario set lags the capture script, or a typo'd env)
previously threw during top-level module evaluation, which surfaced a
blocking native error dialog and made the driver wait out its full
~60s marker timeout. It now logs a parseable line and exits fast with
no dialog.
- scripts/capture-screenshots: resolve the electron binary via Node's
upward module resolution instead of hard-requiring
REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules
holds only the workspace's own @maka/* packages) finds electron in the
parent checkout.
Real (non-capture) runs are unchanged — every branch is gated behind
MAKA_VISUAL_SMOKE_FIXTURE.
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

@Astro-Han
, '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

feat(desktop): headless visual-smoke capture, no foreground window - #161

Merged
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless
Jun 23, 2026
Merged

feat(desktop): headless visual-smoke capture, no foreground window#161
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Make the visual-smoke screenshot harness headless, worktree-runnable, and crash-fast.

Why

Captures launched a real Electron window that grabbed foreground focus on every (scenario × variant), so the harness was intrusive to run during interactive work — and it could not run from a git worktree at all. A stale build also crashed each capture with a blocking native error dialog and a ~60s marker timeout.

Changes

  • Headless capture (apps/desktop/src/main/main.ts): under MAKA_VISUAL_SMOKE_FIXTURE, the window is created with show: false and the macOS dock icon is hidden, so the capture process never shows a window or steals focus. capturePage() still returns a painted frame on a hidden window (paintWhenInitiallyHidden defaults to true).
  • Crash-fast (main.ts): an unknown scenario (stale build whose scenario set lags the capture script, or a typo'd env) now logs [visual-smoke] fatal: … and exits immediately, instead of throwing during top-level module evaluation → blocking native error dialog → ~60s marker timeout.
  • Worktree-runnable (scripts/capture-screenshots.mjs): resolve the electron binary via Node's upward module resolution instead of hard-requiring REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules holds only the workspace's own @maka/* packages) finds electron in the parent checkout.

All branches are gated behind MAKA_VISUAL_SMOKE_FIXTURE; real (non-capture) runs are unchanged.

Verification

  • Headless capture across empty / modal (command palette, permission) / settings scenarios — all render correctly, no foreground window, no dock bounce, ~1.0–1.3s each.
  • Capture runs from a git worktree with no electron symlink (upward resolution).
  • Bogus scenario exits in <1s with [visual-smoke] fatal … and no dialog (previously 60s + native dialog).
  • npm -w @maka/desktop run typecheck clean; desktop suite 1466 pass / 0 fail.

Visual-smoke captures launched a real Electron window that took
foreground focus on every (scenario × variant), so the harness was
intrusive to run during interactive work — and it could not run from a
git worktree at all.
- main: under MAKA_VISUAL_SMOKE_FIXTURE, create the window with
`show: false` and hide the macOS dock icon, so the capture process
never shows a window or steals focus. `capturePage()` still returns a
painted frame on a hidden window (paintWhenInitiallyHidden defaults to
true). Verified across empty / modal / settings scenarios.
- main: resolve the fixture defensively. An unknown scenario (a stale
build whose scenario set lags the capture script, or a typo'd env)
previously threw during top-level module evaluation, which surfaced a
blocking native error dialog and made the driver wait out its full
~60s marker timeout. It now logs a parseable line and exits fast with
no dialog.
- scripts/capture-screenshots: resolve the electron binary via Node's
upward module resolution instead of hard-requiring
REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules
holds only the workspace's own @maka/* packages) finds electron in the
parent checkout.
Real (non-capture) runs are unchanged — every branch is gated behind
MAKA_VISUAL_SMOKE_FIXTURE.
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

@Astro-Han
, '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

feat(desktop): headless visual-smoke capture, no foreground window - #161

Merged
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless
Jun 23, 2026
Merged

feat(desktop): headless visual-smoke capture, no foreground window#161
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Make the visual-smoke screenshot harness headless, worktree-runnable, and crash-fast.

Why

Captures launched a real Electron window that grabbed foreground focus on every (scenario × variant), so the harness was intrusive to run during interactive work — and it could not run from a git worktree at all. A stale build also crashed each capture with a blocking native error dialog and a ~60s marker timeout.

Changes

  • Headless capture (apps/desktop/src/main/main.ts): under MAKA_VISUAL_SMOKE_FIXTURE, the window is created with show: false and the macOS dock icon is hidden, so the capture process never shows a window or steals focus. capturePage() still returns a painted frame on a hidden window (paintWhenInitiallyHidden defaults to true).
  • Crash-fast (main.ts): an unknown scenario (stale build whose scenario set lags the capture script, or a typo'd env) now logs [visual-smoke] fatal: … and exits immediately, instead of throwing during top-level module evaluation → blocking native error dialog → ~60s marker timeout.
  • Worktree-runnable (scripts/capture-screenshots.mjs): resolve the electron binary via Node's upward module resolution instead of hard-requiring REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules holds only the workspace's own @maka/* packages) finds electron in the parent checkout.

All branches are gated behind MAKA_VISUAL_SMOKE_FIXTURE; real (non-capture) runs are unchanged.

Verification

  • Headless capture across empty / modal (command palette, permission) / settings scenarios — all render correctly, no foreground window, no dock bounce, ~1.0–1.3s each.
  • Capture runs from a git worktree with no electron symlink (upward resolution).
  • Bogus scenario exits in <1s with [visual-smoke] fatal … and no dialog (previously 60s + native dialog).
  • npm -w @maka/desktop run typecheck clean; desktop suite 1466 pass / 0 fail.

Visual-smoke captures launched a real Electron window that took
foreground focus on every (scenario × variant), so the harness was
intrusive to run during interactive work — and it could not run from a
git worktree at all.
- main: under MAKA_VISUAL_SMOKE_FIXTURE, create the window with
`show: false` and hide the macOS dock icon, so the capture process
never shows a window or steals focus. `capturePage()` still returns a
painted frame on a hidden window (paintWhenInitiallyHidden defaults to
true). Verified across empty / modal / settings scenarios.
- main: resolve the fixture defensively. An unknown scenario (a stale
build whose scenario set lags the capture script, or a typo'd env)
previously threw during top-level module evaluation, which surfaced a
blocking native error dialog and made the driver wait out its full
~60s marker timeout. It now logs a parseable line and exits fast with
no dialog.
- scripts/capture-screenshots: resolve the electron binary via Node's
upward module resolution instead of hard-requiring
REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules
holds only the workspace's own @maka/* packages) finds electron in the
parent checkout.
Real (non-capture) runs are unchanged — every branch is gated behind
MAKA_VISUAL_SMOKE_FIXTURE.
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

@Astro-Han
, '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

feat(desktop): headless visual-smoke capture, no foreground window - #161

Merged
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless
Jun 23, 2026
Merged

feat(desktop): headless visual-smoke capture, no foreground window#161
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Make the visual-smoke screenshot harness headless, worktree-runnable, and crash-fast.

Why

Captures launched a real Electron window that grabbed foreground focus on every (scenario × variant), so the harness was intrusive to run during interactive work — and it could not run from a git worktree at all. A stale build also crashed each capture with a blocking native error dialog and a ~60s marker timeout.

Changes

  • Headless capture (apps/desktop/src/main/main.ts): under MAKA_VISUAL_SMOKE_FIXTURE, the window is created with show: false and the macOS dock icon is hidden, so the capture process never shows a window or steals focus. capturePage() still returns a painted frame on a hidden window (paintWhenInitiallyHidden defaults to true).
  • Crash-fast (main.ts): an unknown scenario (stale build whose scenario set lags the capture script, or a typo'd env) now logs [visual-smoke] fatal: … and exits immediately, instead of throwing during top-level module evaluation → blocking native error dialog → ~60s marker timeout.
  • Worktree-runnable (scripts/capture-screenshots.mjs): resolve the electron binary via Node's upward module resolution instead of hard-requiring REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules holds only the workspace's own @maka/* packages) finds electron in the parent checkout.

All branches are gated behind MAKA_VISUAL_SMOKE_FIXTURE; real (non-capture) runs are unchanged.

Verification

  • Headless capture across empty / modal (command palette, permission) / settings scenarios — all render correctly, no foreground window, no dock bounce, ~1.0–1.3s each.
  • Capture runs from a git worktree with no electron symlink (upward resolution).
  • Bogus scenario exits in <1s with [visual-smoke] fatal … and no dialog (previously 60s + native dialog).
  • npm -w @maka/desktop run typecheck clean; desktop suite 1466 pass / 0 fail.

Visual-smoke captures launched a real Electron window that took
foreground focus on every (scenario × variant), so the harness was
intrusive to run during interactive work — and it could not run from a
git worktree at all.
- main: under MAKA_VISUAL_SMOKE_FIXTURE, create the window with
`show: false` and hide the macOS dock icon, so the capture process
never shows a window or steals focus. `capturePage()` still returns a
painted frame on a hidden window (paintWhenInitiallyHidden defaults to
true). Verified across empty / modal / settings scenarios.
- main: resolve the fixture defensively. An unknown scenario (a stale
build whose scenario set lags the capture script, or a typo'd env)
previously threw during top-level module evaluation, which surfaced a
blocking native error dialog and made the driver wait out its full
~60s marker timeout. It now logs a parseable line and exits fast with
no dialog.
- scripts/capture-screenshots: resolve the electron binary via Node's
upward module resolution instead of hard-requiring
REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules
holds only the workspace's own @maka/* packages) finds electron in the
parent checkout.
Real (non-capture) runs are unchanged — every branch is gated behind
MAKA_VISUAL_SMOKE_FIXTURE.
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

@Astro-Han
, '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

feat(desktop): headless visual-smoke capture, no foreground window - #161

Merged
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless
Jun 23, 2026
Merged

feat(desktop): headless visual-smoke capture, no foreground window#161
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Make the visual-smoke screenshot harness headless, worktree-runnable, and crash-fast.

Why

Captures launched a real Electron window that grabbed foreground focus on every (scenario × variant), so the harness was intrusive to run during interactive work — and it could not run from a git worktree at all. A stale build also crashed each capture with a blocking native error dialog and a ~60s marker timeout.

Changes

  • Headless capture (apps/desktop/src/main/main.ts): under MAKA_VISUAL_SMOKE_FIXTURE, the window is created with show: false and the macOS dock icon is hidden, so the capture process never shows a window or steals focus. capturePage() still returns a painted frame on a hidden window (paintWhenInitiallyHidden defaults to true).
  • Crash-fast (main.ts): an unknown scenario (stale build whose scenario set lags the capture script, or a typo'd env) now logs [visual-smoke] fatal: … and exits immediately, instead of throwing during top-level module evaluation → blocking native error dialog → ~60s marker timeout.
  • Worktree-runnable (scripts/capture-screenshots.mjs): resolve the electron binary via Node's upward module resolution instead of hard-requiring REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules holds only the workspace's own @maka/* packages) finds electron in the parent checkout.

All branches are gated behind MAKA_VISUAL_SMOKE_FIXTURE; real (non-capture) runs are unchanged.

Verification

  • Headless capture across empty / modal (command palette, permission) / settings scenarios — all render correctly, no foreground window, no dock bounce, ~1.0–1.3s each.
  • Capture runs from a git worktree with no electron symlink (upward resolution).
  • Bogus scenario exits in <1s with [visual-smoke] fatal … and no dialog (previously 60s + native dialog).
  • npm -w @maka/desktop run typecheck clean; desktop suite 1466 pass / 0 fail.

Visual-smoke captures launched a real Electron window that took
foreground focus on every (scenario × variant), so the harness was
intrusive to run during interactive work — and it could not run from a
git worktree at all.
- main: under MAKA_VISUAL_SMOKE_FIXTURE, create the window with
`show: false` and hide the macOS dock icon, so the capture process
never shows a window or steals focus. `capturePage()` still returns a
painted frame on a hidden window (paintWhenInitiallyHidden defaults to
true). Verified across empty / modal / settings scenarios.
- main: resolve the fixture defensively. An unknown scenario (a stale
build whose scenario set lags the capture script, or a typo'd env)
previously threw during top-level module evaluation, which surfaced a
blocking native error dialog and made the driver wait out its full
~60s marker timeout. It now logs a parseable line and exits fast with
no dialog.
- scripts/capture-screenshots: resolve the electron binary via Node's
upward module resolution instead of hard-requiring
REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules
holds only the workspace's own @maka/* packages) finds electron in the
parent checkout.
Real (non-capture) runs are unchanged — every branch is gated behind
MAKA_VISUAL_SMOKE_FIXTURE.
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

@Astro-Han
, '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

feat(desktop): headless visual-smoke capture, no foreground window - #161

Merged
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless
Jun 23, 2026
Merged

feat(desktop): headless visual-smoke capture, no foreground window#161
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Make the visual-smoke screenshot harness headless, worktree-runnable, and crash-fast.

Why

Captures launched a real Electron window that grabbed foreground focus on every (scenario × variant), so the harness was intrusive to run during interactive work — and it could not run from a git worktree at all. A stale build also crashed each capture with a blocking native error dialog and a ~60s marker timeout.

Changes

  • Headless capture (apps/desktop/src/main/main.ts): under MAKA_VISUAL_SMOKE_FIXTURE, the window is created with show: false and the macOS dock icon is hidden, so the capture process never shows a window or steals focus. capturePage() still returns a painted frame on a hidden window (paintWhenInitiallyHidden defaults to true).
  • Crash-fast (main.ts): an unknown scenario (stale build whose scenario set lags the capture script, or a typo'd env) now logs [visual-smoke] fatal: … and exits immediately, instead of throwing during top-level module evaluation → blocking native error dialog → ~60s marker timeout.
  • Worktree-runnable (scripts/capture-screenshots.mjs): resolve the electron binary via Node's upward module resolution instead of hard-requiring REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules holds only the workspace's own @maka/* packages) finds electron in the parent checkout.

All branches are gated behind MAKA_VISUAL_SMOKE_FIXTURE; real (non-capture) runs are unchanged.

Verification

  • Headless capture across empty / modal (command palette, permission) / settings scenarios — all render correctly, no foreground window, no dock bounce, ~1.0–1.3s each.
  • Capture runs from a git worktree with no electron symlink (upward resolution).
  • Bogus scenario exits in <1s with [visual-smoke] fatal … and no dialog (previously 60s + native dialog).
  • npm -w @maka/desktop run typecheck clean; desktop suite 1466 pass / 0 fail.

Visual-smoke captures launched a real Electron window that took
foreground focus on every (scenario × variant), so the harness was
intrusive to run during interactive work — and it could not run from a
git worktree at all.
- main: under MAKA_VISUAL_SMOKE_FIXTURE, create the window with
`show: false` and hide the macOS dock icon, so the capture process
never shows a window or steals focus. `capturePage()` still returns a
painted frame on a hidden window (paintWhenInitiallyHidden defaults to
true). Verified across empty / modal / settings scenarios.
- main: resolve the fixture defensively. An unknown scenario (a stale
build whose scenario set lags the capture script, or a typo'd env)
previously threw during top-level module evaluation, which surfaced a
blocking native error dialog and made the driver wait out its full
~60s marker timeout. It now logs a parseable line and exits fast with
no dialog.
- scripts/capture-screenshots: resolve the electron binary via Node's
upward module resolution instead of hard-requiring
REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules
holds only the workspace's own @maka/* packages) finds electron in the
parent checkout.
Real (non-capture) runs are unchanged — every branch is gated behind
MAKA_VISUAL_SMOKE_FIXTURE.
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

@Astro-Han
, '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

feat(desktop): headless visual-smoke capture, no foreground window - #161

Merged
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless
Jun 23, 2026
Merged

feat(desktop): headless visual-smoke capture, no foreground window#161
Astro-Han merged 1 commit into
mainfrom
claude/visual-smoke-headless

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Make the visual-smoke screenshot harness headless, worktree-runnable, and crash-fast.

Why

Captures launched a real Electron window that grabbed foreground focus on every (scenario × variant), so the harness was intrusive to run during interactive work — and it could not run from a git worktree at all. A stale build also crashed each capture with a blocking native error dialog and a ~60s marker timeout.

Changes

  • Headless capture (apps/desktop/src/main/main.ts): under MAKA_VISUAL_SMOKE_FIXTURE, the window is created with show: false and the macOS dock icon is hidden, so the capture process never shows a window or steals focus. capturePage() still returns a painted frame on a hidden window (paintWhenInitiallyHidden defaults to true).
  • Crash-fast (main.ts): an unknown scenario (stale build whose scenario set lags the capture script, or a typo'd env) now logs [visual-smoke] fatal: … and exits immediately, instead of throwing during top-level module evaluation → blocking native error dialog → ~60s marker timeout.
  • Worktree-runnable (scripts/capture-screenshots.mjs): resolve the electron binary via Node's upward module resolution instead of hard-requiring REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules holds only the workspace's own @maka/* packages) finds electron in the parent checkout.

All branches are gated behind MAKA_VISUAL_SMOKE_FIXTURE; real (non-capture) runs are unchanged.

Verification

  • Headless capture across empty / modal (command palette, permission) / settings scenarios — all render correctly, no foreground window, no dock bounce, ~1.0–1.3s each.
  • Capture runs from a git worktree with no electron symlink (upward resolution).
  • Bogus scenario exits in <1s with [visual-smoke] fatal … and no dialog (previously 60s + native dialog).
  • npm -w @maka/desktop run typecheck clean; desktop suite 1466 pass / 0 fail.

Visual-smoke captures launched a real Electron window that took
foreground focus on every (scenario × variant), so the harness was
intrusive to run during interactive work — and it could not run from a
git worktree at all.
- main: under MAKA_VISUAL_SMOKE_FIXTURE, create the window with
`show: false` and hide the macOS dock icon, so the capture process
never shows a window or steals focus. `capturePage()` still returns a
painted frame on a hidden window (paintWhenInitiallyHidden defaults to
true). Verified across empty / modal / settings scenarios.
- main: resolve the fixture defensively. An unknown scenario (a stale
build whose scenario set lags the capture script, or a typo'd env)
previously threw during top-level module evaluation, which surfaced a
blocking native error dialog and made the driver wait out its full
~60s marker timeout. It now logs a parseable line and exits fast with
no dialog.
- scripts/capture-screenshots: resolve the electron binary via Node's
upward module resolution instead of hard-requiring
REPO_ROOT/node_modules/electron, so a git worktree (whose node_modules
holds only the workspace's own @maka/* packages) finds electron in the
parent checkout.
Real (non-capture) runs are unchanged — every branch is gated behind
MAKA_VISUAL_SMOKE_FIXTURE.
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

@Astro-Han