feat(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3) - #259

Merged
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back
Aug 23, 2026
Merged

feat(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3)#259
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Completes #121 (tracks 1+4 landed in #254).

Merge back (thread menu + palette, worktree sessions only) — precondition matrix, all refusals localized, the user checkout is never overwritten:

  • missing worktree / dirty worktree (never auto-commits) / detached or dirty destination → refuse with instructions;
  • descendant branch → --ff-only merge; clean divergence → --no-ff --no-edit merge; conflict → merge --abort, destination left pristine (test asserts empty porcelain status and no MERGE_HEAD);
  • runs off the UI thread through the existing host paths; success/failure via localized runtime notices; the worktree itself is left alone (deletion flow already offers removal).

Orchestrate child worktrees (opt-in):

  • OrchestrateSettings.child_worktrees (default false) + per-dispatch worktree override on the dispatch tool;
  • enabled + cwd is a repo root ⇒ child gets a seeded tcode/<child-id> worktree, diff/terminal bind through the existing session machinery, dispatch reply reports worktree_path + worktree_branch;
  • non-git cwd or creation failure ⇒ plain cwd + warning in the reply, dispatch never fails on isolation;
  • deletion reuses the worktree-removal flow; crash residue is covered by the startup orphan cleanup from feat(worktree): .worktreeinclude seeding + lifecycle hardening (#121 tracks 1+4) #254.

Tests: merge-back matrix in services (ff / diverged / refusals / conflict-abort), settings serde+patch round-trips, dispatch-path worktree resolution, bilingual notice rendering.

Rebased over #255's update-check changes (severity plumbing unified: Warning now covers provider messages and merge-back failures in one place).

Gates: fmt / clippy -D warnings / full workspace tests — green locally after rebase.

Closes#121

🤖 Generated with Claude Code

Tracks 2+3 of #121. Merge back appears on worktree threads (menu +
palette): refuses on missing/dirty worktree, dirty or detached
destination — never auto-commits or touches the user checkout;
ff-merges descendants, no-ff merges clean divergence, aborts conflicted
merges leaving the destination pristine. Orchestrate gains
child_worktrees (default off) plus a per-dispatch worktree override:
children get seeded tcode/<child-id> worktrees when the cwd is a repo
root, bind diff/terminal through existing session machinery, report
worktree path+branch in the dispatch reply, and fall back to the plain
cwd (with a warning in the reply) rather than failing dispatch.
Closes#121
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks enabled auto-merge (squash) August 22, 2026 18:12
Tryanksand others added 2 commits August 23, 2026 03:26
Production merge-back creates commits in the destination repo; CI
runners have no global identity, so the fixture repos set one locally.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n_until_parked
Dispatch replies come from a real blocking thread that run_until_parked
does not wait for; the try_recv right after it was a pre-existing flake
(seen on #250) that worktree resolution made more likely.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks merged commit 734ecf7 into mainAug 23, 2026
3 checks passed
@Tryanks
Tryanks deleted the feat/121-merge-back branch August 23, 2026 05:59
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.

Worktree isolation follow-ups: ignored files, merge-back, and orchestrate children

1 participant

@Tryanks
, '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(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3) - #259

Merged
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back
Aug 23, 2026
Merged

feat(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3)#259
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Completes #121 (tracks 1+4 landed in #254).

Merge back (thread menu + palette, worktree sessions only) — precondition matrix, all refusals localized, the user checkout is never overwritten:

  • missing worktree / dirty worktree (never auto-commits) / detached or dirty destination → refuse with instructions;
  • descendant branch → --ff-only merge; clean divergence → --no-ff --no-edit merge; conflict → merge --abort, destination left pristine (test asserts empty porcelain status and no MERGE_HEAD);
  • runs off the UI thread through the existing host paths; success/failure via localized runtime notices; the worktree itself is left alone (deletion flow already offers removal).

Orchestrate child worktrees (opt-in):

  • OrchestrateSettings.child_worktrees (default false) + per-dispatch worktree override on the dispatch tool;
  • enabled + cwd is a repo root ⇒ child gets a seeded tcode/<child-id> worktree, diff/terminal bind through the existing session machinery, dispatch reply reports worktree_path + worktree_branch;
  • non-git cwd or creation failure ⇒ plain cwd + warning in the reply, dispatch never fails on isolation;
  • deletion reuses the worktree-removal flow; crash residue is covered by the startup orphan cleanup from feat(worktree): .worktreeinclude seeding + lifecycle hardening (#121 tracks 1+4) #254.

Tests: merge-back matrix in services (ff / diverged / refusals / conflict-abort), settings serde+patch round-trips, dispatch-path worktree resolution, bilingual notice rendering.

Rebased over #255's update-check changes (severity plumbing unified: Warning now covers provider messages and merge-back failures in one place).

Gates: fmt / clippy -D warnings / full workspace tests — green locally after rebase.

Closes#121

🤖 Generated with Claude Code

Tracks 2+3 of #121. Merge back appears on worktree threads (menu +
palette): refuses on missing/dirty worktree, dirty or detached
destination — never auto-commits or touches the user checkout;
ff-merges descendants, no-ff merges clean divergence, aborts conflicted
merges leaving the destination pristine. Orchestrate gains
child_worktrees (default off) plus a per-dispatch worktree override:
children get seeded tcode/<child-id> worktrees when the cwd is a repo
root, bind diff/terminal through existing session machinery, report
worktree path+branch in the dispatch reply, and fall back to the plain
cwd (with a warning in the reply) rather than failing dispatch.
Closes#121
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks enabled auto-merge (squash) August 22, 2026 18:12
Tryanksand others added 2 commits August 23, 2026 03:26
Production merge-back creates commits in the destination repo; CI
runners have no global identity, so the fixture repos set one locally.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n_until_parked
Dispatch replies come from a real blocking thread that run_until_parked
does not wait for; the try_recv right after it was a pre-existing flake
(seen on #250) that worktree resolution made more likely.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks merged commit 734ecf7 into mainAug 23, 2026
3 checks passed
@Tryanks
Tryanks deleted the feat/121-merge-back branch August 23, 2026 05:59
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.

Worktree isolation follow-ups: ignored files, merge-back, and orchestrate children

1 participant

@Tryanks
, '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(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3) - #259

Merged
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back
Aug 23, 2026
Merged

feat(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3)#259
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Completes #121 (tracks 1+4 landed in #254).

Merge back (thread menu + palette, worktree sessions only) — precondition matrix, all refusals localized, the user checkout is never overwritten:

  • missing worktree / dirty worktree (never auto-commits) / detached or dirty destination → refuse with instructions;
  • descendant branch → --ff-only merge; clean divergence → --no-ff --no-edit merge; conflict → merge --abort, destination left pristine (test asserts empty porcelain status and no MERGE_HEAD);
  • runs off the UI thread through the existing host paths; success/failure via localized runtime notices; the worktree itself is left alone (deletion flow already offers removal).

Orchestrate child worktrees (opt-in):

  • OrchestrateSettings.child_worktrees (default false) + per-dispatch worktree override on the dispatch tool;
  • enabled + cwd is a repo root ⇒ child gets a seeded tcode/<child-id> worktree, diff/terminal bind through the existing session machinery, dispatch reply reports worktree_path + worktree_branch;
  • non-git cwd or creation failure ⇒ plain cwd + warning in the reply, dispatch never fails on isolation;
  • deletion reuses the worktree-removal flow; crash residue is covered by the startup orphan cleanup from feat(worktree): .worktreeinclude seeding + lifecycle hardening (#121 tracks 1+4) #254.

Tests: merge-back matrix in services (ff / diverged / refusals / conflict-abort), settings serde+patch round-trips, dispatch-path worktree resolution, bilingual notice rendering.

Rebased over #255's update-check changes (severity plumbing unified: Warning now covers provider messages and merge-back failures in one place).

Gates: fmt / clippy -D warnings / full workspace tests — green locally after rebase.

Closes#121

🤖 Generated with Claude Code

Tracks 2+3 of #121. Merge back appears on worktree threads (menu +
palette): refuses on missing/dirty worktree, dirty or detached
destination — never auto-commits or touches the user checkout;
ff-merges descendants, no-ff merges clean divergence, aborts conflicted
merges leaving the destination pristine. Orchestrate gains
child_worktrees (default off) plus a per-dispatch worktree override:
children get seeded tcode/<child-id> worktrees when the cwd is a repo
root, bind diff/terminal through existing session machinery, report
worktree path+branch in the dispatch reply, and fall back to the plain
cwd (with a warning in the reply) rather than failing dispatch.
Closes#121
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks enabled auto-merge (squash) August 22, 2026 18:12
Tryanksand others added 2 commits August 23, 2026 03:26
Production merge-back creates commits in the destination repo; CI
runners have no global identity, so the fixture repos set one locally.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n_until_parked
Dispatch replies come from a real blocking thread that run_until_parked
does not wait for; the try_recv right after it was a pre-existing flake
(seen on #250) that worktree resolution made more likely.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks merged commit 734ecf7 into mainAug 23, 2026
3 checks passed
@Tryanks
Tryanks deleted the feat/121-merge-back branch August 23, 2026 05:59
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.

Worktree isolation follow-ups: ignored files, merge-back, and orchestrate children

1 participant

@Tryanks
, '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(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3) - #259

Merged
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back
Aug 23, 2026
Merged

feat(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3)#259
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Completes #121 (tracks 1+4 landed in #254).

Merge back (thread menu + palette, worktree sessions only) — precondition matrix, all refusals localized, the user checkout is never overwritten:

  • missing worktree / dirty worktree (never auto-commits) / detached or dirty destination → refuse with instructions;
  • descendant branch → --ff-only merge; clean divergence → --no-ff --no-edit merge; conflict → merge --abort, destination left pristine (test asserts empty porcelain status and no MERGE_HEAD);
  • runs off the UI thread through the existing host paths; success/failure via localized runtime notices; the worktree itself is left alone (deletion flow already offers removal).

Orchestrate child worktrees (opt-in):

  • OrchestrateSettings.child_worktrees (default false) + per-dispatch worktree override on the dispatch tool;
  • enabled + cwd is a repo root ⇒ child gets a seeded tcode/<child-id> worktree, diff/terminal bind through the existing session machinery, dispatch reply reports worktree_path + worktree_branch;
  • non-git cwd or creation failure ⇒ plain cwd + warning in the reply, dispatch never fails on isolation;
  • deletion reuses the worktree-removal flow; crash residue is covered by the startup orphan cleanup from feat(worktree): .worktreeinclude seeding + lifecycle hardening (#121 tracks 1+4) #254.

Tests: merge-back matrix in services (ff / diverged / refusals / conflict-abort), settings serde+patch round-trips, dispatch-path worktree resolution, bilingual notice rendering.

Rebased over #255's update-check changes (severity plumbing unified: Warning now covers provider messages and merge-back failures in one place).

Gates: fmt / clippy -D warnings / full workspace tests — green locally after rebase.

Closes#121

🤖 Generated with Claude Code

Tracks 2+3 of #121. Merge back appears on worktree threads (menu +
palette): refuses on missing/dirty worktree, dirty or detached
destination — never auto-commits or touches the user checkout;
ff-merges descendants, no-ff merges clean divergence, aborts conflicted
merges leaving the destination pristine. Orchestrate gains
child_worktrees (default off) plus a per-dispatch worktree override:
children get seeded tcode/<child-id> worktrees when the cwd is a repo
root, bind diff/terminal through existing session machinery, report
worktree path+branch in the dispatch reply, and fall back to the plain
cwd (with a warning in the reply) rather than failing dispatch.
Closes#121
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks enabled auto-merge (squash) August 22, 2026 18:12
Tryanksand others added 2 commits August 23, 2026 03:26
Production merge-back creates commits in the destination repo; CI
runners have no global identity, so the fixture repos set one locally.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n_until_parked
Dispatch replies come from a real blocking thread that run_until_parked
does not wait for; the try_recv right after it was a pre-existing flake
(seen on #250) that worktree resolution made more likely.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks merged commit 734ecf7 into mainAug 23, 2026
3 checks passed
@Tryanks
Tryanks deleted the feat/121-merge-back branch August 23, 2026 05:59
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.

Worktree isolation follow-ups: ignored files, merge-back, and orchestrate children

1 participant

@Tryanks
, '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(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3) - #259

Merged
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back
Aug 23, 2026
Merged

feat(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3)#259
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Completes #121 (tracks 1+4 landed in #254).

Merge back (thread menu + palette, worktree sessions only) — precondition matrix, all refusals localized, the user checkout is never overwritten:

  • missing worktree / dirty worktree (never auto-commits) / detached or dirty destination → refuse with instructions;
  • descendant branch → --ff-only merge; clean divergence → --no-ff --no-edit merge; conflict → merge --abort, destination left pristine (test asserts empty porcelain status and no MERGE_HEAD);
  • runs off the UI thread through the existing host paths; success/failure via localized runtime notices; the worktree itself is left alone (deletion flow already offers removal).

Orchestrate child worktrees (opt-in):

  • OrchestrateSettings.child_worktrees (default false) + per-dispatch worktree override on the dispatch tool;
  • enabled + cwd is a repo root ⇒ child gets a seeded tcode/<child-id> worktree, diff/terminal bind through the existing session machinery, dispatch reply reports worktree_path + worktree_branch;
  • non-git cwd or creation failure ⇒ plain cwd + warning in the reply, dispatch never fails on isolation;
  • deletion reuses the worktree-removal flow; crash residue is covered by the startup orphan cleanup from feat(worktree): .worktreeinclude seeding + lifecycle hardening (#121 tracks 1+4) #254.

Tests: merge-back matrix in services (ff / diverged / refusals / conflict-abort), settings serde+patch round-trips, dispatch-path worktree resolution, bilingual notice rendering.

Rebased over #255's update-check changes (severity plumbing unified: Warning now covers provider messages and merge-back failures in one place).

Gates: fmt / clippy -D warnings / full workspace tests — green locally after rebase.

Closes#121

🤖 Generated with Claude Code

Tracks 2+3 of #121. Merge back appears on worktree threads (menu +
palette): refuses on missing/dirty worktree, dirty or detached
destination — never auto-commits or touches the user checkout;
ff-merges descendants, no-ff merges clean divergence, aborts conflicted
merges leaving the destination pristine. Orchestrate gains
child_worktrees (default off) plus a per-dispatch worktree override:
children get seeded tcode/<child-id> worktrees when the cwd is a repo
root, bind diff/terminal through existing session machinery, report
worktree path+branch in the dispatch reply, and fall back to the plain
cwd (with a warning in the reply) rather than failing dispatch.
Closes#121
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks enabled auto-merge (squash) August 22, 2026 18:12
Tryanksand others added 2 commits August 23, 2026 03:26
Production merge-back creates commits in the destination repo; CI
runners have no global identity, so the fixture repos set one locally.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n_until_parked
Dispatch replies come from a real blocking thread that run_until_parked
does not wait for; the try_recv right after it was a pre-existing flake
(seen on #250) that worktree resolution made more likely.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks merged commit 734ecf7 into mainAug 23, 2026
3 checks passed
@Tryanks
Tryanks deleted the feat/121-merge-back branch August 23, 2026 05:59
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.

Worktree isolation follow-ups: ignored files, merge-back, and orchestrate children

1 participant

@Tryanks
, '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(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3) - #259

Merged
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back
Aug 23, 2026
Merged

feat(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3)#259
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Completes #121 (tracks 1+4 landed in #254).

Merge back (thread menu + palette, worktree sessions only) — precondition matrix, all refusals localized, the user checkout is never overwritten:

  • missing worktree / dirty worktree (never auto-commits) / detached or dirty destination → refuse with instructions;
  • descendant branch → --ff-only merge; clean divergence → --no-ff --no-edit merge; conflict → merge --abort, destination left pristine (test asserts empty porcelain status and no MERGE_HEAD);
  • runs off the UI thread through the existing host paths; success/failure via localized runtime notices; the worktree itself is left alone (deletion flow already offers removal).

Orchestrate child worktrees (opt-in):

  • OrchestrateSettings.child_worktrees (default false) + per-dispatch worktree override on the dispatch tool;
  • enabled + cwd is a repo root ⇒ child gets a seeded tcode/<child-id> worktree, diff/terminal bind through the existing session machinery, dispatch reply reports worktree_path + worktree_branch;
  • non-git cwd or creation failure ⇒ plain cwd + warning in the reply, dispatch never fails on isolation;
  • deletion reuses the worktree-removal flow; crash residue is covered by the startup orphan cleanup from feat(worktree): .worktreeinclude seeding + lifecycle hardening (#121 tracks 1+4) #254.

Tests: merge-back matrix in services (ff / diverged / refusals / conflict-abort), settings serde+patch round-trips, dispatch-path worktree resolution, bilingual notice rendering.

Rebased over #255's update-check changes (severity plumbing unified: Warning now covers provider messages and merge-back failures in one place).

Gates: fmt / clippy -D warnings / full workspace tests — green locally after rebase.

Closes#121

🤖 Generated with Claude Code

Tracks 2+3 of #121. Merge back appears on worktree threads (menu +
palette): refuses on missing/dirty worktree, dirty or detached
destination — never auto-commits or touches the user checkout;
ff-merges descendants, no-ff merges clean divergence, aborts conflicted
merges leaving the destination pristine. Orchestrate gains
child_worktrees (default off) plus a per-dispatch worktree override:
children get seeded tcode/<child-id> worktrees when the cwd is a repo
root, bind diff/terminal through existing session machinery, report
worktree path+branch in the dispatch reply, and fall back to the plain
cwd (with a warning in the reply) rather than failing dispatch.
Closes#121
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks enabled auto-merge (squash) August 22, 2026 18:12
Tryanksand others added 2 commits August 23, 2026 03:26
Production merge-back creates commits in the destination repo; CI
runners have no global identity, so the fixture repos set one locally.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n_until_parked
Dispatch replies come from a real blocking thread that run_until_parked
does not wait for; the try_recv right after it was a pre-existing flake
(seen on #250) that worktree resolution made more likely.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks merged commit 734ecf7 into mainAug 23, 2026
3 checks passed
@Tryanks
Tryanks deleted the feat/121-merge-back branch August 23, 2026 05:59
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.

Worktree isolation follow-ups: ignored files, merge-back, and orchestrate children

1 participant

@Tryanks
, '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(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3) - #259

Merged
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back
Aug 23, 2026
Merged

feat(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3)#259
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Completes #121 (tracks 1+4 landed in #254).

Merge back (thread menu + palette, worktree sessions only) — precondition matrix, all refusals localized, the user checkout is never overwritten:

  • missing worktree / dirty worktree (never auto-commits) / detached or dirty destination → refuse with instructions;
  • descendant branch → --ff-only merge; clean divergence → --no-ff --no-edit merge; conflict → merge --abort, destination left pristine (test asserts empty porcelain status and no MERGE_HEAD);
  • runs off the UI thread through the existing host paths; success/failure via localized runtime notices; the worktree itself is left alone (deletion flow already offers removal).

Orchestrate child worktrees (opt-in):

  • OrchestrateSettings.child_worktrees (default false) + per-dispatch worktree override on the dispatch tool;
  • enabled + cwd is a repo root ⇒ child gets a seeded tcode/<child-id> worktree, diff/terminal bind through the existing session machinery, dispatch reply reports worktree_path + worktree_branch;
  • non-git cwd or creation failure ⇒ plain cwd + warning in the reply, dispatch never fails on isolation;
  • deletion reuses the worktree-removal flow; crash residue is covered by the startup orphan cleanup from feat(worktree): .worktreeinclude seeding + lifecycle hardening (#121 tracks 1+4) #254.

Tests: merge-back matrix in services (ff / diverged / refusals / conflict-abort), settings serde+patch round-trips, dispatch-path worktree resolution, bilingual notice rendering.

Rebased over #255's update-check changes (severity plumbing unified: Warning now covers provider messages and merge-back failures in one place).

Gates: fmt / clippy -D warnings / full workspace tests — green locally after rebase.

Closes#121

🤖 Generated with Claude Code

Tracks 2+3 of #121. Merge back appears on worktree threads (menu +
palette): refuses on missing/dirty worktree, dirty or detached
destination — never auto-commits or touches the user checkout;
ff-merges descendants, no-ff merges clean divergence, aborts conflicted
merges leaving the destination pristine. Orchestrate gains
child_worktrees (default off) plus a per-dispatch worktree override:
children get seeded tcode/<child-id> worktrees when the cwd is a repo
root, bind diff/terminal through existing session machinery, report
worktree path+branch in the dispatch reply, and fall back to the plain
cwd (with a warning in the reply) rather than failing dispatch.
Closes#121
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks enabled auto-merge (squash) August 22, 2026 18:12
Tryanksand others added 2 commits August 23, 2026 03:26
Production merge-back creates commits in the destination repo; CI
runners have no global identity, so the fixture repos set one locally.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n_until_parked
Dispatch replies come from a real blocking thread that run_until_parked
does not wait for; the try_recv right after it was a pre-existing flake
(seen on #250) that worktree resolution made more likely.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks merged commit 734ecf7 into mainAug 23, 2026
3 checks passed
@Tryanks
Tryanks deleted the feat/121-merge-back branch August 23, 2026 05:59
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.

Worktree isolation follow-ups: ignored files, merge-back, and orchestrate children

1 participant

@Tryanks
, '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(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3) - #259

Merged
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back
Aug 23, 2026
Merged

feat(worktree): merge-back flow + opt-in orchestrate child worktrees (#121 tracks 2+3)#259
Tryanks merged 3 commits into
mainfrom
feat/121-merge-back

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Completes #121 (tracks 1+4 landed in #254).

Merge back (thread menu + palette, worktree sessions only) — precondition matrix, all refusals localized, the user checkout is never overwritten:

  • missing worktree / dirty worktree (never auto-commits) / detached or dirty destination → refuse with instructions;
  • descendant branch → --ff-only merge; clean divergence → --no-ff --no-edit merge; conflict → merge --abort, destination left pristine (test asserts empty porcelain status and no MERGE_HEAD);
  • runs off the UI thread through the existing host paths; success/failure via localized runtime notices; the worktree itself is left alone (deletion flow already offers removal).

Orchestrate child worktrees (opt-in):

  • OrchestrateSettings.child_worktrees (default false) + per-dispatch worktree override on the dispatch tool;
  • enabled + cwd is a repo root ⇒ child gets a seeded tcode/<child-id> worktree, diff/terminal bind through the existing session machinery, dispatch reply reports worktree_path + worktree_branch;
  • non-git cwd or creation failure ⇒ plain cwd + warning in the reply, dispatch never fails on isolation;
  • deletion reuses the worktree-removal flow; crash residue is covered by the startup orphan cleanup from feat(worktree): .worktreeinclude seeding + lifecycle hardening (#121 tracks 1+4) #254.

Tests: merge-back matrix in services (ff / diverged / refusals / conflict-abort), settings serde+patch round-trips, dispatch-path worktree resolution, bilingual notice rendering.

Rebased over #255's update-check changes (severity plumbing unified: Warning now covers provider messages and merge-back failures in one place).

Gates: fmt / clippy -D warnings / full workspace tests — green locally after rebase.

Closes#121

🤖 Generated with Claude Code

Tracks 2+3 of #121. Merge back appears on worktree threads (menu +
palette): refuses on missing/dirty worktree, dirty or detached
destination — never auto-commits or touches the user checkout;
ff-merges descendants, no-ff merges clean divergence, aborts conflicted
merges leaving the destination pristine. Orchestrate gains
child_worktrees (default off) plus a per-dispatch worktree override:
children get seeded tcode/<child-id> worktrees when the cwd is a repo
root, bind diff/terminal through existing session machinery, report
worktree path+branch in the dispatch reply, and fall back to the plain
cwd (with a warning in the reply) rather than failing dispatch.
Closes#121
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks enabled auto-merge (squash) August 22, 2026 18:12
Tryanksand others added 2 commits August 23, 2026 03:26
Production merge-back creates commits in the destination repo; CI
runners have no global identity, so the fixture repos set one locally.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n_until_parked
Dispatch replies come from a real blocking thread that run_until_parked
does not wait for; the try_recv right after it was a pre-existing flake
(seen on #250) that worktree resolution made more likely.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Tryanks
Tryanks merged commit 734ecf7 into mainAug 23, 2026
3 checks passed
@Tryanks
Tryanks deleted the feat/121-merge-back branch August 23, 2026 05:59
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.

Worktree isolation follow-ups: ignored files, merge-back, and orchestrate children

1 participant

@Tryanks