Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors - #12

Merged
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg
Jul 31, 2026
Merged

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors#12
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg

Conversation

@enisze

Copy link
Copy Markdown
Owner

Summary

  • fix(web): with word wrap on, the diff virtualizer under-counted total height (each wrapped line estimated as one row), so the scrollbar bottomed out before the last file's trailing lines could be scrolled into view. Over-estimate the row height only in wrap mode; it self-corrects via measured deltas.
  • feat(web): add a worktree chat tab row beneath the chat header (one tab per chat in the active thread's worktree, click-to-switch, plus a new-chat button), and collapse the Open and Add action header controls into a single "…" overflow menu to free header space.
  • fix(server): merging a PR could fail with the opaque "GitHub CLI command failed." — especially with multiple accounts where the project's selected account isn't a collaborator. Classify exits into permission-denied / merge-blocked and surface clear, actionable messages. Raw stderr is still never retained (no secret leakage).

Testing

  • tsgo typecheck: web, server (t3), contracts — pass
  • vitest VcsProcess (12) and sourceControl (119) suites — pass
  • Verified live in the running app: overflow "…" menu opens and the Add-action dialog works from inside it; diff scroll reachability confirmed by measuring scrollHeight.

🤖 Generated with Claude Code

eniszeand others added 3 commits July 31, 2026 10:09
In wrap mode a long line spans several visual rows, but the virtualizer
estimates every off-screen line at a single row. That under-counts total
height, so the scrollbar bottoms out before the last file's trailing
lines can be scrolled into view. Over-estimate the row height only in
wrap mode; the library shrinks it back via measured deltas as items
render, so the last file stays reachable without a permanent gap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a tab row beneath the chat header listing every chat in the active
thread's worktree, with the current one highlighted, click-to-switch,
and a trailing button to start a new chat in the same worktree.
Collapse the "Open in editor" and "Add action" header controls behind a
single "…" overflow menu so the header keeps room for the project and
thread identity. The controls render unchanged inside the popover, so
their dropdowns and add/edit dialogs keep working.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merging a PR could fail with the opaque "GitHub CLI command failed.",
which was especially confusing with multiple GitHub accounts where the
account selected for a project isn't a collaborator on its repo.
Classify non-zero VCS exits into two new safe buckets — permission-denied
and merge-blocked — from stderr patterns, and map them to clear GitHub
errors ("the selected account lacks permission…", "GitHub wouldn't merge
this PR — conflicts, failing checks, branch protection, or a disallowed
merge method"). Raw stderr is still never retained, so no secret it might
contain can leak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@enisze
enisze merged commit 9221e57 into mainJul 31, 2026
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

@enisze
, '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

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors - #12

Merged
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg
Jul 31, 2026
Merged

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors#12
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg

Conversation

@enisze

Copy link
Copy Markdown
Owner

Summary

  • fix(web): with word wrap on, the diff virtualizer under-counted total height (each wrapped line estimated as one row), so the scrollbar bottomed out before the last file's trailing lines could be scrolled into view. Over-estimate the row height only in wrap mode; it self-corrects via measured deltas.
  • feat(web): add a worktree chat tab row beneath the chat header (one tab per chat in the active thread's worktree, click-to-switch, plus a new-chat button), and collapse the Open and Add action header controls into a single "…" overflow menu to free header space.
  • fix(server): merging a PR could fail with the opaque "GitHub CLI command failed." — especially with multiple accounts where the project's selected account isn't a collaborator. Classify exits into permission-denied / merge-blocked and surface clear, actionable messages. Raw stderr is still never retained (no secret leakage).

Testing

  • tsgo typecheck: web, server (t3), contracts — pass
  • vitest VcsProcess (12) and sourceControl (119) suites — pass
  • Verified live in the running app: overflow "…" menu opens and the Add-action dialog works from inside it; diff scroll reachability confirmed by measuring scrollHeight.

🤖 Generated with Claude Code

eniszeand others added 3 commits July 31, 2026 10:09
In wrap mode a long line spans several visual rows, but the virtualizer
estimates every off-screen line at a single row. That under-counts total
height, so the scrollbar bottoms out before the last file's trailing
lines can be scrolled into view. Over-estimate the row height only in
wrap mode; the library shrinks it back via measured deltas as items
render, so the last file stays reachable without a permanent gap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a tab row beneath the chat header listing every chat in the active
thread's worktree, with the current one highlighted, click-to-switch,
and a trailing button to start a new chat in the same worktree.
Collapse the "Open in editor" and "Add action" header controls behind a
single "…" overflow menu so the header keeps room for the project and
thread identity. The controls render unchanged inside the popover, so
their dropdowns and add/edit dialogs keep working.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merging a PR could fail with the opaque "GitHub CLI command failed.",
which was especially confusing with multiple GitHub accounts where the
account selected for a project isn't a collaborator on its repo.
Classify non-zero VCS exits into two new safe buckets — permission-denied
and merge-blocked — from stderr patterns, and map them to clear GitHub
errors ("the selected account lacks permission…", "GitHub wouldn't merge
this PR — conflicts, failing checks, branch protection, or a disallowed
merge method"). Raw stderr is still never retained, so no secret it might
contain can leak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@enisze
enisze merged commit 9221e57 into mainJul 31, 2026
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

@enisze
, '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

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors - #12

Merged
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg
Jul 31, 2026
Merged

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors#12
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg

Conversation

@enisze

Copy link
Copy Markdown
Owner

Summary

  • fix(web): with word wrap on, the diff virtualizer under-counted total height (each wrapped line estimated as one row), so the scrollbar bottomed out before the last file's trailing lines could be scrolled into view. Over-estimate the row height only in wrap mode; it self-corrects via measured deltas.
  • feat(web): add a worktree chat tab row beneath the chat header (one tab per chat in the active thread's worktree, click-to-switch, plus a new-chat button), and collapse the Open and Add action header controls into a single "…" overflow menu to free header space.
  • fix(server): merging a PR could fail with the opaque "GitHub CLI command failed." — especially with multiple accounts where the project's selected account isn't a collaborator. Classify exits into permission-denied / merge-blocked and surface clear, actionable messages. Raw stderr is still never retained (no secret leakage).

Testing

  • tsgo typecheck: web, server (t3), contracts — pass
  • vitest VcsProcess (12) and sourceControl (119) suites — pass
  • Verified live in the running app: overflow "…" menu opens and the Add-action dialog works from inside it; diff scroll reachability confirmed by measuring scrollHeight.

🤖 Generated with Claude Code

eniszeand others added 3 commits July 31, 2026 10:09
In wrap mode a long line spans several visual rows, but the virtualizer
estimates every off-screen line at a single row. That under-counts total
height, so the scrollbar bottoms out before the last file's trailing
lines can be scrolled into view. Over-estimate the row height only in
wrap mode; the library shrinks it back via measured deltas as items
render, so the last file stays reachable without a permanent gap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a tab row beneath the chat header listing every chat in the active
thread's worktree, with the current one highlighted, click-to-switch,
and a trailing button to start a new chat in the same worktree.
Collapse the "Open in editor" and "Add action" header controls behind a
single "…" overflow menu so the header keeps room for the project and
thread identity. The controls render unchanged inside the popover, so
their dropdowns and add/edit dialogs keep working.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merging a PR could fail with the opaque "GitHub CLI command failed.",
which was especially confusing with multiple GitHub accounts where the
account selected for a project isn't a collaborator on its repo.
Classify non-zero VCS exits into two new safe buckets — permission-denied
and merge-blocked — from stderr patterns, and map them to clear GitHub
errors ("the selected account lacks permission…", "GitHub wouldn't merge
this PR — conflicts, failing checks, branch protection, or a disallowed
merge method"). Raw stderr is still never retained, so no secret it might
contain can leak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@enisze
enisze merged commit 9221e57 into mainJul 31, 2026
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

@enisze
, '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

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors - #12

Merged
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg
Jul 31, 2026
Merged

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors#12
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg

Conversation

@enisze

Copy link
Copy Markdown
Owner

Summary

  • fix(web): with word wrap on, the diff virtualizer under-counted total height (each wrapped line estimated as one row), so the scrollbar bottomed out before the last file's trailing lines could be scrolled into view. Over-estimate the row height only in wrap mode; it self-corrects via measured deltas.
  • feat(web): add a worktree chat tab row beneath the chat header (one tab per chat in the active thread's worktree, click-to-switch, plus a new-chat button), and collapse the Open and Add action header controls into a single "…" overflow menu to free header space.
  • fix(server): merging a PR could fail with the opaque "GitHub CLI command failed." — especially with multiple accounts where the project's selected account isn't a collaborator. Classify exits into permission-denied / merge-blocked and surface clear, actionable messages. Raw stderr is still never retained (no secret leakage).

Testing

  • tsgo typecheck: web, server (t3), contracts — pass
  • vitest VcsProcess (12) and sourceControl (119) suites — pass
  • Verified live in the running app: overflow "…" menu opens and the Add-action dialog works from inside it; diff scroll reachability confirmed by measuring scrollHeight.

🤖 Generated with Claude Code

eniszeand others added 3 commits July 31, 2026 10:09
In wrap mode a long line spans several visual rows, but the virtualizer
estimates every off-screen line at a single row. That under-counts total
height, so the scrollbar bottoms out before the last file's trailing
lines can be scrolled into view. Over-estimate the row height only in
wrap mode; the library shrinks it back via measured deltas as items
render, so the last file stays reachable without a permanent gap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a tab row beneath the chat header listing every chat in the active
thread's worktree, with the current one highlighted, click-to-switch,
and a trailing button to start a new chat in the same worktree.
Collapse the "Open in editor" and "Add action" header controls behind a
single "…" overflow menu so the header keeps room for the project and
thread identity. The controls render unchanged inside the popover, so
their dropdowns and add/edit dialogs keep working.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merging a PR could fail with the opaque "GitHub CLI command failed.",
which was especially confusing with multiple GitHub accounts where the
account selected for a project isn't a collaborator on its repo.
Classify non-zero VCS exits into two new safe buckets — permission-denied
and merge-blocked — from stderr patterns, and map them to clear GitHub
errors ("the selected account lacks permission…", "GitHub wouldn't merge
this PR — conflicts, failing checks, branch protection, or a disallowed
merge method"). Raw stderr is still never retained, so no secret it might
contain can leak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@enisze
enisze merged commit 9221e57 into mainJul 31, 2026
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

@enisze
, '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

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors - #12

Merged
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg
Jul 31, 2026
Merged

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors#12
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg

Conversation

@enisze

Copy link
Copy Markdown
Owner

Summary

  • fix(web): with word wrap on, the diff virtualizer under-counted total height (each wrapped line estimated as one row), so the scrollbar bottomed out before the last file's trailing lines could be scrolled into view. Over-estimate the row height only in wrap mode; it self-corrects via measured deltas.
  • feat(web): add a worktree chat tab row beneath the chat header (one tab per chat in the active thread's worktree, click-to-switch, plus a new-chat button), and collapse the Open and Add action header controls into a single "…" overflow menu to free header space.
  • fix(server): merging a PR could fail with the opaque "GitHub CLI command failed." — especially with multiple accounts where the project's selected account isn't a collaborator. Classify exits into permission-denied / merge-blocked and surface clear, actionable messages. Raw stderr is still never retained (no secret leakage).

Testing

  • tsgo typecheck: web, server (t3), contracts — pass
  • vitest VcsProcess (12) and sourceControl (119) suites — pass
  • Verified live in the running app: overflow "…" menu opens and the Add-action dialog works from inside it; diff scroll reachability confirmed by measuring scrollHeight.

🤖 Generated with Claude Code

eniszeand others added 3 commits July 31, 2026 10:09
In wrap mode a long line spans several visual rows, but the virtualizer
estimates every off-screen line at a single row. That under-counts total
height, so the scrollbar bottoms out before the last file's trailing
lines can be scrolled into view. Over-estimate the row height only in
wrap mode; the library shrinks it back via measured deltas as items
render, so the last file stays reachable without a permanent gap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a tab row beneath the chat header listing every chat in the active
thread's worktree, with the current one highlighted, click-to-switch,
and a trailing button to start a new chat in the same worktree.
Collapse the "Open in editor" and "Add action" header controls behind a
single "…" overflow menu so the header keeps room for the project and
thread identity. The controls render unchanged inside the popover, so
their dropdowns and add/edit dialogs keep working.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merging a PR could fail with the opaque "GitHub CLI command failed.",
which was especially confusing with multiple GitHub accounts where the
account selected for a project isn't a collaborator on its repo.
Classify non-zero VCS exits into two new safe buckets — permission-denied
and merge-blocked — from stderr patterns, and map them to clear GitHub
errors ("the selected account lacks permission…", "GitHub wouldn't merge
this PR — conflicts, failing checks, branch protection, or a disallowed
merge method"). Raw stderr is still never retained, so no secret it might
contain can leak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@enisze
enisze merged commit 9221e57 into mainJul 31, 2026
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

@enisze
, '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

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors - #12

Merged
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg
Jul 31, 2026
Merged

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors#12
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg

Conversation

@enisze

Copy link
Copy Markdown
Owner

Summary

  • fix(web): with word wrap on, the diff virtualizer under-counted total height (each wrapped line estimated as one row), so the scrollbar bottomed out before the last file's trailing lines could be scrolled into view. Over-estimate the row height only in wrap mode; it self-corrects via measured deltas.
  • feat(web): add a worktree chat tab row beneath the chat header (one tab per chat in the active thread's worktree, click-to-switch, plus a new-chat button), and collapse the Open and Add action header controls into a single "…" overflow menu to free header space.
  • fix(server): merging a PR could fail with the opaque "GitHub CLI command failed." — especially with multiple accounts where the project's selected account isn't a collaborator. Classify exits into permission-denied / merge-blocked and surface clear, actionable messages. Raw stderr is still never retained (no secret leakage).

Testing

  • tsgo typecheck: web, server (t3), contracts — pass
  • vitest VcsProcess (12) and sourceControl (119) suites — pass
  • Verified live in the running app: overflow "…" menu opens and the Add-action dialog works from inside it; diff scroll reachability confirmed by measuring scrollHeight.

🤖 Generated with Claude Code

eniszeand others added 3 commits July 31, 2026 10:09
In wrap mode a long line spans several visual rows, but the virtualizer
estimates every off-screen line at a single row. That under-counts total
height, so the scrollbar bottoms out before the last file's trailing
lines can be scrolled into view. Over-estimate the row height only in
wrap mode; the library shrinks it back via measured deltas as items
render, so the last file stays reachable without a permanent gap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a tab row beneath the chat header listing every chat in the active
thread's worktree, with the current one highlighted, click-to-switch,
and a trailing button to start a new chat in the same worktree.
Collapse the "Open in editor" and "Add action" header controls behind a
single "…" overflow menu so the header keeps room for the project and
thread identity. The controls render unchanged inside the popover, so
their dropdowns and add/edit dialogs keep working.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merging a PR could fail with the opaque "GitHub CLI command failed.",
which was especially confusing with multiple GitHub accounts where the
account selected for a project isn't a collaborator on its repo.
Classify non-zero VCS exits into two new safe buckets — permission-denied
and merge-blocked — from stderr patterns, and map them to clear GitHub
errors ("the selected account lacks permission…", "GitHub wouldn't merge
this PR — conflicts, failing checks, branch protection, or a disallowed
merge method"). Raw stderr is still never retained, so no secret it might
contain can leak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@enisze
enisze merged commit 9221e57 into mainJul 31, 2026
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

@enisze
, '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

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors - #12

Merged
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg
Jul 31, 2026
Merged

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors#12
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg

Conversation

@enisze

Copy link
Copy Markdown
Owner

Summary

  • fix(web): with word wrap on, the diff virtualizer under-counted total height (each wrapped line estimated as one row), so the scrollbar bottomed out before the last file's trailing lines could be scrolled into view. Over-estimate the row height only in wrap mode; it self-corrects via measured deltas.
  • feat(web): add a worktree chat tab row beneath the chat header (one tab per chat in the active thread's worktree, click-to-switch, plus a new-chat button), and collapse the Open and Add action header controls into a single "…" overflow menu to free header space.
  • fix(server): merging a PR could fail with the opaque "GitHub CLI command failed." — especially with multiple accounts where the project's selected account isn't a collaborator. Classify exits into permission-denied / merge-blocked and surface clear, actionable messages. Raw stderr is still never retained (no secret leakage).

Testing

  • tsgo typecheck: web, server (t3), contracts — pass
  • vitest VcsProcess (12) and sourceControl (119) suites — pass
  • Verified live in the running app: overflow "…" menu opens and the Add-action dialog works from inside it; diff scroll reachability confirmed by measuring scrollHeight.

🤖 Generated with Claude Code

eniszeand others added 3 commits July 31, 2026 10:09
In wrap mode a long line spans several visual rows, but the virtualizer
estimates every off-screen line at a single row. That under-counts total
height, so the scrollbar bottoms out before the last file's trailing
lines can be scrolled into view. Over-estimate the row height only in
wrap mode; the library shrinks it back via measured deltas as items
render, so the last file stays reachable without a permanent gap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a tab row beneath the chat header listing every chat in the active
thread's worktree, with the current one highlighted, click-to-switch,
and a trailing button to start a new chat in the same worktree.
Collapse the "Open in editor" and "Add action" header controls behind a
single "…" overflow menu so the header keeps room for the project and
thread identity. The controls render unchanged inside the popover, so
their dropdowns and add/edit dialogs keep working.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merging a PR could fail with the opaque "GitHub CLI command failed.",
which was especially confusing with multiple GitHub accounts where the
account selected for a project isn't a collaborator on its repo.
Classify non-zero VCS exits into two new safe buckets — permission-denied
and merge-blocked — from stderr patterns, and map them to clear GitHub
errors ("the selected account lacks permission…", "GitHub wouldn't merge
this PR — conflicts, failing checks, branch protection, or a disallowed
merge method"). Raw stderr is still never retained, so no secret it might
contain can leak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@enisze
enisze merged commit 9221e57 into mainJul 31, 2026
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

@enisze
, '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

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors - #12

Merged
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg
Jul 31, 2026
Merged

Diff wrap cutoff fix, worktree chat tabs, and actionable gh merge errors#12
enisze merged 3 commits into
mainfrom
t3code/create-new-dmg

Conversation

@enisze

Copy link
Copy Markdown
Owner

Summary

  • fix(web): with word wrap on, the diff virtualizer under-counted total height (each wrapped line estimated as one row), so the scrollbar bottomed out before the last file's trailing lines could be scrolled into view. Over-estimate the row height only in wrap mode; it self-corrects via measured deltas.
  • feat(web): add a worktree chat tab row beneath the chat header (one tab per chat in the active thread's worktree, click-to-switch, plus a new-chat button), and collapse the Open and Add action header controls into a single "…" overflow menu to free header space.
  • fix(server): merging a PR could fail with the opaque "GitHub CLI command failed." — especially with multiple accounts where the project's selected account isn't a collaborator. Classify exits into permission-denied / merge-blocked and surface clear, actionable messages. Raw stderr is still never retained (no secret leakage).

Testing

  • tsgo typecheck: web, server (t3), contracts — pass
  • vitest VcsProcess (12) and sourceControl (119) suites — pass
  • Verified live in the running app: overflow "…" menu opens and the Add-action dialog works from inside it; diff scroll reachability confirmed by measuring scrollHeight.

🤖 Generated with Claude Code

eniszeand others added 3 commits July 31, 2026 10:09
In wrap mode a long line spans several visual rows, but the virtualizer
estimates every off-screen line at a single row. That under-counts total
height, so the scrollbar bottoms out before the last file's trailing
lines can be scrolled into view. Over-estimate the row height only in
wrap mode; the library shrinks it back via measured deltas as items
render, so the last file stays reachable without a permanent gap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a tab row beneath the chat header listing every chat in the active
thread's worktree, with the current one highlighted, click-to-switch,
and a trailing button to start a new chat in the same worktree.
Collapse the "Open in editor" and "Add action" header controls behind a
single "…" overflow menu so the header keeps room for the project and
thread identity. The controls render unchanged inside the popover, so
their dropdowns and add/edit dialogs keep working.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merging a PR could fail with the opaque "GitHub CLI command failed.",
which was especially confusing with multiple GitHub accounts where the
account selected for a project isn't a collaborator on its repo.
Classify non-zero VCS exits into two new safe buckets — permission-denied
and merge-blocked — from stderr patterns, and map them to clear GitHub
errors ("the selected account lacks permission…", "GitHub wouldn't merge
this PR — conflicts, failing checks, branch protection, or a disallowed
merge method"). Raw stderr is still never retained, so no secret it might
contain can leak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@enisze
enisze merged commit 9221e57 into mainJul 31, 2026
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

@enisze