Prevent live thread branches from regressing to temp worktree names - #1995

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix
Apr 13, 2026
Merged

Prevent live thread branches from regressing to temp worktree names#1995
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

  • Preserve semantic thread branch names when the current git status reports a temporary t3code/<sha> worktree branch.
  • Add a guard in resolveLiveThreadBranchUpdate so live thread branch updates only adopt temporary worktree names when the thread branch is already temporary.
  • Cover the regression with a logic test for semantic thread branches.

Testing

  • Not run (not requested).

Note

Low Risk
Low risk: small, targeted change to resolveLiveThreadBranchUpdate that only blocks adopting temporary worktree branch names, plus a regression test.

Overview
Prevents live thread branch metadata from being overwritten by temporary worktree branch names (t3code/<sha>) when a semantic branch name is already stored.

Adds a guard in resolveLiveThreadBranchUpdate using isTemporaryWorktreeBranch and covers the scenario with a new unit test to avoid regressions.

Reviewed by Cursor Bugbot for commit c1a7e53. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prevent resolveLiveThreadBranchUpdate from regressing semantic thread branches to temporary worktree names

When a thread already has a semantic branch name (e.g. t3code/github-query-rate-limit), resolveLiveThreadBranchUpdate in GitActionsControl.logic.ts now returns null if the live git status reports a temporary worktree branch (e.g. t3code/bda76797), blocking the regression. A corresponding test case is added in GitActionsControl.logic.test.ts to cover this guard.

Macroscope summarized c1a7e53.

@coderabbitai

coderabbitaiBot commented Apr 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 82f34733-d33e-4629-b6d4-6344decd160e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/branch-rename-fix

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Apr 13, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Duplicated worktree branch detection logic across packages
    • Moved TEMP_WORKTREE_BRANCH_PATTERN and isTemporaryWorktreeBranch into @t3tools/shared/git and updated both apps/web and apps/server to import from the shared module, eliminating the duplication.

Create PR

Or push these changes by commenting:

@cursor push 8913a6c37b
Preview (8913a6c37b)
diff --git a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts--- a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts+++ b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts@@ -14,6 +14,8 @@
import { Cache, Cause, Duration, Effect, Equal, Layer, Option, Schema, Stream } from "effect";
import { makeDrainableWorker } from "@t3tools/shared/DrainableWorker";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";+
import { resolveThreadWorkspaceCwd } from "../../checkpointing/Utils.ts";
import { GitCore } from "../../git/Services/GitCore.ts";
import { increment, orchestrationEventsProcessedTotal } from "../../observability/Metrics.ts";
@@ -73,7 +75,6 @@
const HANDLED_TURN_START_KEY_TTL = Duration.minutes(30);
const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access";
const WORKTREE_BRANCH_PREFIX = "t3code";
-const TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\/[0-9a-f]{8}$`);
const DEFAULT_THREAD_TITLE = "New thread";
function canReplaceThreadTitle(currentTitle: string, titleSeed?: string): boolean {
@@ -119,10 +120,6 @@
return `Stale pending ${requestKind} request: ${requestId}. Provider callback state does not survive app restarts or recovered sessions. Restart the turn to continue.`;
}
-function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
function buildGeneratedWorktreeBranchName(raw: string): string {
const normalized = raw
.trim()
diff --git a/apps/web/src/components/GitActionsControl.logic.ts b/apps/web/src/components/GitActionsControl.logic.ts--- a/apps/web/src/components/GitActionsControl.logic.ts+++ b/apps/web/src/components/GitActionsControl.logic.ts@@ -3,6 +3,7 @@
GitStackedAction,
GitStatusResult,
} from "@t3tools/contracts";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";
export type GitActionIconName = "commit" | "push" | "pr";
@@ -37,12 +38,6 @@
| "commit_push"
| "commit_push_pr";
-const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;--function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
export function buildGitActionProgressStages(input: {
action: GitStackedAction;
hasCustomCommitMessage: boolean;
diff --git a/packages/shared/src/git.ts b/packages/shared/src/git.ts--- a/packages/shared/src/git.ts+++ b/packages/shared/src/git.ts@@ -242,6 +242,16 @@
};
}
+const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;++/**+ * Returns true when the branch name matches the temporary worktree naming+ * convention used when a worktree is first created (`t3code/<8-hex-chars>`).+ */+export function isTemporaryWorktreeBranch(branch: string): boolean {+ return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());+}+
const EMPTY_GIT_STATUS_REMOTE: GitStatusRemoteResult = {
hasUpstream: false,
aheadCount: 0,

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit 63092f5. Configure here.

Comment threadapps/web/src/components/GitActionsControl.logic.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Small, focused bug fix that adds a guard to prevent overwriting meaningful branch names with temporary worktree names. The change uses an existing utility function and includes a unit test. Clear intent with minimal scope.

You can customize Macroscope's approvability policy. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Apr 13, 2026
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 63092f5 to 23127c3CompareApril 13, 2026 18:56
- Keep live thread branches stable when git status reports a temporary worktree branch
- Use the shared temporary worktree branch helper in web logic
- Add regression test for semantic branch renames
Co-authored-by: codex <codex@users.noreply.github.com>
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 23127c3 to c1a7e53CompareApril 13, 2026 19:00
@macroscopeapp
macroscopeappBot dismissed their stale reviewApril 13, 2026 19:00

Dismissing prior approval to re-evaluate c1a7e53

@juliusmarminge
juliusmarminge enabled auto-merge (squash) April 13, 2026 19:04
@juliusmarminge
juliusmarminge merged commit 77fcad3 into mainApr 13, 2026
12 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/branch-rename-fix branch April 13, 2026 19:04
juliusmarminge added a commit that referenced this pull request Apr 13, 2026
…1995)
Co-authored-by: codex <codex@users.noreply.github.com>
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Apr 16, 2026
Integrates upstream/main (d22c6f5) into the fork while preserving all
multi-provider support (codex, claudeAgent, copilot, cursor, opencode,
geminiCli, amp, kilo) and fork UI/UX additions.
Highlights adopted from upstream:
- Nightly release channel + update channel selector (pingdotgg#2012, pingdotgg#2049, pingdotgg#1969)
- Filesystem browse API + command palette project picker (pingdotgg#2024)
- Launch Args setting for Claude provider (pingdotgg#1971)
- Kiro editor support in open picker (pingdotgg#1974)
- Claude plan events for TodoWrite during input streaming (pingdotgg#1541)
- Lost provider session recovery (pingdotgg#1938)
- Cache provider status and gate desktop startup (pingdotgg#1962)
- LegendList migration for chat scrolling and branch lists (pingdotgg#1953)
- Shell snapshot queries + backfill migration (pingdotgg#1973, pingdotgg#2004)
- PATH hydration + fallback detection (pingdotgg#1799)
- Warm sidebar thread subscriptions (pingdotgg#2001)
- Full thread title tooltip (pingdotgg#1994)
- Markdown file link UX (pingdotgg#1956), composer polish (pingdotgg#1944, pingdotgg#1992, pingdotgg#1985)
- Worktree/branch state + draft reuse fixes (pingdotgg#2005, pingdotgg#2003, pingdotgg#1995, pingdotgg#1936)
- Window controls overlay for Windows/Linux (pingdotgg#1969)
- Backend readiness timeout 10s→30s (pingdotgg#1979)
- Clear tracked RPCs on reconnect, live stream subscriptions (pingdotgg#2000, pingdotgg#1972)
- Various misc fixes (pingdotgg#2051, pingdotgg#2052, pingdotgg#2025, pingdotgg#2027, pingdotgg#2049, pingdotgg#1997, pingdotgg#1975)
Fork features preserved and reconciled:
- All 8 provider adapters + conformance tests
- Extended ProviderKind union across contracts/model/settings/provider
- appearance/accentColor/themeConfig/ProviderLogo UI system
- customModels + gitTextGeneration + providerModelOptions
- Migration IDs 23 (NormalizeLegacyProviderKinds) and 24
(RepairProjectionThreadProposedPlanImplementationColumns) kept; new
upstream migrations registered at IDs 25-26 to avoid breaking deployed
fork databases
- DesktopBridge: log directory channels (LOG_DIR/LIST/READ/OPEN_DIR)
retained; getWsUrl replaced by upstream's getAppBranding
- PROVIDER_CACHE_IDS extended to all 8 providers
youpele52 referenced this pull request in youpele52/bigbud Jun 17, 2026
…#1995)
Co-authored-by: codex <codex@users.noreply.github.com>
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

Prevent live thread branches from regressing to temp worktree names - #1995

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix
Apr 13, 2026
Merged

Prevent live thread branches from regressing to temp worktree names#1995
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

  • Preserve semantic thread branch names when the current git status reports a temporary t3code/<sha> worktree branch.
  • Add a guard in resolveLiveThreadBranchUpdate so live thread branch updates only adopt temporary worktree names when the thread branch is already temporary.
  • Cover the regression with a logic test for semantic thread branches.

Testing

  • Not run (not requested).

Note

Low Risk
Low risk: small, targeted change to resolveLiveThreadBranchUpdate that only blocks adopting temporary worktree branch names, plus a regression test.

Overview
Prevents live thread branch metadata from being overwritten by temporary worktree branch names (t3code/<sha>) when a semantic branch name is already stored.

Adds a guard in resolveLiveThreadBranchUpdate using isTemporaryWorktreeBranch and covers the scenario with a new unit test to avoid regressions.

Reviewed by Cursor Bugbot for commit c1a7e53. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prevent resolveLiveThreadBranchUpdate from regressing semantic thread branches to temporary worktree names

When a thread already has a semantic branch name (e.g. t3code/github-query-rate-limit), resolveLiveThreadBranchUpdate in GitActionsControl.logic.ts now returns null if the live git status reports a temporary worktree branch (e.g. t3code/bda76797), blocking the regression. A corresponding test case is added in GitActionsControl.logic.test.ts to cover this guard.

Macroscope summarized c1a7e53.

@coderabbitai

coderabbitaiBot commented Apr 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 82f34733-d33e-4629-b6d4-6344decd160e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/branch-rename-fix

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Apr 13, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Duplicated worktree branch detection logic across packages
    • Moved TEMP_WORKTREE_BRANCH_PATTERN and isTemporaryWorktreeBranch into @t3tools/shared/git and updated both apps/web and apps/server to import from the shared module, eliminating the duplication.

Create PR

Or push these changes by commenting:

@cursor push 8913a6c37b
Preview (8913a6c37b)
diff --git a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts--- a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts+++ b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts@@ -14,6 +14,8 @@
import { Cache, Cause, Duration, Effect, Equal, Layer, Option, Schema, Stream } from "effect";
import { makeDrainableWorker } from "@t3tools/shared/DrainableWorker";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";+
import { resolveThreadWorkspaceCwd } from "../../checkpointing/Utils.ts";
import { GitCore } from "../../git/Services/GitCore.ts";
import { increment, orchestrationEventsProcessedTotal } from "../../observability/Metrics.ts";
@@ -73,7 +75,6 @@
const HANDLED_TURN_START_KEY_TTL = Duration.minutes(30);
const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access";
const WORKTREE_BRANCH_PREFIX = "t3code";
-const TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\/[0-9a-f]{8}$`);
const DEFAULT_THREAD_TITLE = "New thread";
function canReplaceThreadTitle(currentTitle: string, titleSeed?: string): boolean {
@@ -119,10 +120,6 @@
return `Stale pending ${requestKind} request: ${requestId}. Provider callback state does not survive app restarts or recovered sessions. Restart the turn to continue.`;
}
-function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
function buildGeneratedWorktreeBranchName(raw: string): string {
const normalized = raw
.trim()
diff --git a/apps/web/src/components/GitActionsControl.logic.ts b/apps/web/src/components/GitActionsControl.logic.ts--- a/apps/web/src/components/GitActionsControl.logic.ts+++ b/apps/web/src/components/GitActionsControl.logic.ts@@ -3,6 +3,7 @@
GitStackedAction,
GitStatusResult,
} from "@t3tools/contracts";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";
export type GitActionIconName = "commit" | "push" | "pr";
@@ -37,12 +38,6 @@
| "commit_push"
| "commit_push_pr";
-const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;--function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
export function buildGitActionProgressStages(input: {
action: GitStackedAction;
hasCustomCommitMessage: boolean;
diff --git a/packages/shared/src/git.ts b/packages/shared/src/git.ts--- a/packages/shared/src/git.ts+++ b/packages/shared/src/git.ts@@ -242,6 +242,16 @@
};
}
+const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;++/**+ * Returns true when the branch name matches the temporary worktree naming+ * convention used when a worktree is first created (`t3code/<8-hex-chars>`).+ */+export function isTemporaryWorktreeBranch(branch: string): boolean {+ return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());+}+
const EMPTY_GIT_STATUS_REMOTE: GitStatusRemoteResult = {
hasUpstream: false,
aheadCount: 0,

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit 63092f5. Configure here.

Comment threadapps/web/src/components/GitActionsControl.logic.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Small, focused bug fix that adds a guard to prevent overwriting meaningful branch names with temporary worktree names. The change uses an existing utility function and includes a unit test. Clear intent with minimal scope.

You can customize Macroscope's approvability policy. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Apr 13, 2026
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 63092f5 to 23127c3CompareApril 13, 2026 18:56
- Keep live thread branches stable when git status reports a temporary worktree branch
- Use the shared temporary worktree branch helper in web logic
- Add regression test for semantic branch renames
Co-authored-by: codex <codex@users.noreply.github.com>
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 23127c3 to c1a7e53CompareApril 13, 2026 19:00
@macroscopeapp
macroscopeappBot dismissed their stale reviewApril 13, 2026 19:00

Dismissing prior approval to re-evaluate c1a7e53

@juliusmarminge
juliusmarminge enabled auto-merge (squash) April 13, 2026 19:04
@juliusmarminge
juliusmarminge merged commit 77fcad3 into mainApr 13, 2026
12 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/branch-rename-fix branch April 13, 2026 19:04
juliusmarminge added a commit that referenced this pull request Apr 13, 2026
…1995)
Co-authored-by: codex <codex@users.noreply.github.com>
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Apr 16, 2026
Integrates upstream/main (d22c6f5) into the fork while preserving all
multi-provider support (codex, claudeAgent, copilot, cursor, opencode,
geminiCli, amp, kilo) and fork UI/UX additions.
Highlights adopted from upstream:
- Nightly release channel + update channel selector (pingdotgg#2012, pingdotgg#2049, pingdotgg#1969)
- Filesystem browse API + command palette project picker (pingdotgg#2024)
- Launch Args setting for Claude provider (pingdotgg#1971)
- Kiro editor support in open picker (pingdotgg#1974)
- Claude plan events for TodoWrite during input streaming (pingdotgg#1541)
- Lost provider session recovery (pingdotgg#1938)
- Cache provider status and gate desktop startup (pingdotgg#1962)
- LegendList migration for chat scrolling and branch lists (pingdotgg#1953)
- Shell snapshot queries + backfill migration (pingdotgg#1973, pingdotgg#2004)
- PATH hydration + fallback detection (pingdotgg#1799)
- Warm sidebar thread subscriptions (pingdotgg#2001)
- Full thread title tooltip (pingdotgg#1994)
- Markdown file link UX (pingdotgg#1956), composer polish (pingdotgg#1944, pingdotgg#1992, pingdotgg#1985)
- Worktree/branch state + draft reuse fixes (pingdotgg#2005, pingdotgg#2003, pingdotgg#1995, pingdotgg#1936)
- Window controls overlay for Windows/Linux (pingdotgg#1969)
- Backend readiness timeout 10s→30s (pingdotgg#1979)
- Clear tracked RPCs on reconnect, live stream subscriptions (pingdotgg#2000, pingdotgg#1972)
- Various misc fixes (pingdotgg#2051, pingdotgg#2052, pingdotgg#2025, pingdotgg#2027, pingdotgg#2049, pingdotgg#1997, pingdotgg#1975)
Fork features preserved and reconciled:
- All 8 provider adapters + conformance tests
- Extended ProviderKind union across contracts/model/settings/provider
- appearance/accentColor/themeConfig/ProviderLogo UI system
- customModels + gitTextGeneration + providerModelOptions
- Migration IDs 23 (NormalizeLegacyProviderKinds) and 24
(RepairProjectionThreadProposedPlanImplementationColumns) kept; new
upstream migrations registered at IDs 25-26 to avoid breaking deployed
fork databases
- DesktopBridge: log directory channels (LOG_DIR/LIST/READ/OPEN_DIR)
retained; getWsUrl replaced by upstream's getAppBranding
- PROVIDER_CACHE_IDS extended to all 8 providers
youpele52 referenced this pull request in youpele52/bigbud Jun 17, 2026
…#1995)
Co-authored-by: codex <codex@users.noreply.github.com>
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

Prevent live thread branches from regressing to temp worktree names - #1995

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix
Apr 13, 2026
Merged

Prevent live thread branches from regressing to temp worktree names#1995
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

  • Preserve semantic thread branch names when the current git status reports a temporary t3code/<sha> worktree branch.
  • Add a guard in resolveLiveThreadBranchUpdate so live thread branch updates only adopt temporary worktree names when the thread branch is already temporary.
  • Cover the regression with a logic test for semantic thread branches.

Testing

  • Not run (not requested).

Note

Low Risk
Low risk: small, targeted change to resolveLiveThreadBranchUpdate that only blocks adopting temporary worktree branch names, plus a regression test.

Overview
Prevents live thread branch metadata from being overwritten by temporary worktree branch names (t3code/<sha>) when a semantic branch name is already stored.

Adds a guard in resolveLiveThreadBranchUpdate using isTemporaryWorktreeBranch and covers the scenario with a new unit test to avoid regressions.

Reviewed by Cursor Bugbot for commit c1a7e53. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prevent resolveLiveThreadBranchUpdate from regressing semantic thread branches to temporary worktree names

When a thread already has a semantic branch name (e.g. t3code/github-query-rate-limit), resolveLiveThreadBranchUpdate in GitActionsControl.logic.ts now returns null if the live git status reports a temporary worktree branch (e.g. t3code/bda76797), blocking the regression. A corresponding test case is added in GitActionsControl.logic.test.ts to cover this guard.

Macroscope summarized c1a7e53.

@coderabbitai

coderabbitaiBot commented Apr 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 82f34733-d33e-4629-b6d4-6344decd160e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/branch-rename-fix

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Apr 13, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Duplicated worktree branch detection logic across packages
    • Moved TEMP_WORKTREE_BRANCH_PATTERN and isTemporaryWorktreeBranch into @t3tools/shared/git and updated both apps/web and apps/server to import from the shared module, eliminating the duplication.

Create PR

Or push these changes by commenting:

@cursor push 8913a6c37b
Preview (8913a6c37b)
diff --git a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts--- a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts+++ b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts@@ -14,6 +14,8 @@
import { Cache, Cause, Duration, Effect, Equal, Layer, Option, Schema, Stream } from "effect";
import { makeDrainableWorker } from "@t3tools/shared/DrainableWorker";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";+
import { resolveThreadWorkspaceCwd } from "../../checkpointing/Utils.ts";
import { GitCore } from "../../git/Services/GitCore.ts";
import { increment, orchestrationEventsProcessedTotal } from "../../observability/Metrics.ts";
@@ -73,7 +75,6 @@
const HANDLED_TURN_START_KEY_TTL = Duration.minutes(30);
const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access";
const WORKTREE_BRANCH_PREFIX = "t3code";
-const TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\/[0-9a-f]{8}$`);
const DEFAULT_THREAD_TITLE = "New thread";
function canReplaceThreadTitle(currentTitle: string, titleSeed?: string): boolean {
@@ -119,10 +120,6 @@
return `Stale pending ${requestKind} request: ${requestId}. Provider callback state does not survive app restarts or recovered sessions. Restart the turn to continue.`;
}
-function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
function buildGeneratedWorktreeBranchName(raw: string): string {
const normalized = raw
.trim()
diff --git a/apps/web/src/components/GitActionsControl.logic.ts b/apps/web/src/components/GitActionsControl.logic.ts--- a/apps/web/src/components/GitActionsControl.logic.ts+++ b/apps/web/src/components/GitActionsControl.logic.ts@@ -3,6 +3,7 @@
GitStackedAction,
GitStatusResult,
} from "@t3tools/contracts";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";
export type GitActionIconName = "commit" | "push" | "pr";
@@ -37,12 +38,6 @@
| "commit_push"
| "commit_push_pr";
-const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;--function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
export function buildGitActionProgressStages(input: {
action: GitStackedAction;
hasCustomCommitMessage: boolean;
diff --git a/packages/shared/src/git.ts b/packages/shared/src/git.ts--- a/packages/shared/src/git.ts+++ b/packages/shared/src/git.ts@@ -242,6 +242,16 @@
};
}
+const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;++/**+ * Returns true when the branch name matches the temporary worktree naming+ * convention used when a worktree is first created (`t3code/<8-hex-chars>`).+ */+export function isTemporaryWorktreeBranch(branch: string): boolean {+ return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());+}+
const EMPTY_GIT_STATUS_REMOTE: GitStatusRemoteResult = {
hasUpstream: false,
aheadCount: 0,

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit 63092f5. Configure here.

Comment threadapps/web/src/components/GitActionsControl.logic.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Small, focused bug fix that adds a guard to prevent overwriting meaningful branch names with temporary worktree names. The change uses an existing utility function and includes a unit test. Clear intent with minimal scope.

You can customize Macroscope's approvability policy. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Apr 13, 2026
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 63092f5 to 23127c3CompareApril 13, 2026 18:56
- Keep live thread branches stable when git status reports a temporary worktree branch
- Use the shared temporary worktree branch helper in web logic
- Add regression test for semantic branch renames
Co-authored-by: codex <codex@users.noreply.github.com>
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 23127c3 to c1a7e53CompareApril 13, 2026 19:00
@macroscopeapp
macroscopeappBot dismissed their stale reviewApril 13, 2026 19:00

Dismissing prior approval to re-evaluate c1a7e53

@juliusmarminge
juliusmarminge enabled auto-merge (squash) April 13, 2026 19:04
@juliusmarminge
juliusmarminge merged commit 77fcad3 into mainApr 13, 2026
12 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/branch-rename-fix branch April 13, 2026 19:04
juliusmarminge added a commit that referenced this pull request Apr 13, 2026
…1995)
Co-authored-by: codex <codex@users.noreply.github.com>
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Apr 16, 2026
Integrates upstream/main (d22c6f5) into the fork while preserving all
multi-provider support (codex, claudeAgent, copilot, cursor, opencode,
geminiCli, amp, kilo) and fork UI/UX additions.
Highlights adopted from upstream:
- Nightly release channel + update channel selector (pingdotgg#2012, pingdotgg#2049, pingdotgg#1969)
- Filesystem browse API + command palette project picker (pingdotgg#2024)
- Launch Args setting for Claude provider (pingdotgg#1971)
- Kiro editor support in open picker (pingdotgg#1974)
- Claude plan events for TodoWrite during input streaming (pingdotgg#1541)
- Lost provider session recovery (pingdotgg#1938)
- Cache provider status and gate desktop startup (pingdotgg#1962)
- LegendList migration for chat scrolling and branch lists (pingdotgg#1953)
- Shell snapshot queries + backfill migration (pingdotgg#1973, pingdotgg#2004)
- PATH hydration + fallback detection (pingdotgg#1799)
- Warm sidebar thread subscriptions (pingdotgg#2001)
- Full thread title tooltip (pingdotgg#1994)
- Markdown file link UX (pingdotgg#1956), composer polish (pingdotgg#1944, pingdotgg#1992, pingdotgg#1985)
- Worktree/branch state + draft reuse fixes (pingdotgg#2005, pingdotgg#2003, pingdotgg#1995, pingdotgg#1936)
- Window controls overlay for Windows/Linux (pingdotgg#1969)
- Backend readiness timeout 10s→30s (pingdotgg#1979)
- Clear tracked RPCs on reconnect, live stream subscriptions (pingdotgg#2000, pingdotgg#1972)
- Various misc fixes (pingdotgg#2051, pingdotgg#2052, pingdotgg#2025, pingdotgg#2027, pingdotgg#2049, pingdotgg#1997, pingdotgg#1975)
Fork features preserved and reconciled:
- All 8 provider adapters + conformance tests
- Extended ProviderKind union across contracts/model/settings/provider
- appearance/accentColor/themeConfig/ProviderLogo UI system
- customModels + gitTextGeneration + providerModelOptions
- Migration IDs 23 (NormalizeLegacyProviderKinds) and 24
(RepairProjectionThreadProposedPlanImplementationColumns) kept; new
upstream migrations registered at IDs 25-26 to avoid breaking deployed
fork databases
- DesktopBridge: log directory channels (LOG_DIR/LIST/READ/OPEN_DIR)
retained; getWsUrl replaced by upstream's getAppBranding
- PROVIDER_CACHE_IDS extended to all 8 providers
youpele52 referenced this pull request in youpele52/bigbud Jun 17, 2026
…#1995)
Co-authored-by: codex <codex@users.noreply.github.com>
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

Prevent live thread branches from regressing to temp worktree names - #1995

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix
Apr 13, 2026
Merged

Prevent live thread branches from regressing to temp worktree names#1995
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

  • Preserve semantic thread branch names when the current git status reports a temporary t3code/<sha> worktree branch.
  • Add a guard in resolveLiveThreadBranchUpdate so live thread branch updates only adopt temporary worktree names when the thread branch is already temporary.
  • Cover the regression with a logic test for semantic thread branches.

Testing

  • Not run (not requested).

Note

Low Risk
Low risk: small, targeted change to resolveLiveThreadBranchUpdate that only blocks adopting temporary worktree branch names, plus a regression test.

Overview
Prevents live thread branch metadata from being overwritten by temporary worktree branch names (t3code/<sha>) when a semantic branch name is already stored.

Adds a guard in resolveLiveThreadBranchUpdate using isTemporaryWorktreeBranch and covers the scenario with a new unit test to avoid regressions.

Reviewed by Cursor Bugbot for commit c1a7e53. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prevent resolveLiveThreadBranchUpdate from regressing semantic thread branches to temporary worktree names

When a thread already has a semantic branch name (e.g. t3code/github-query-rate-limit), resolveLiveThreadBranchUpdate in GitActionsControl.logic.ts now returns null if the live git status reports a temporary worktree branch (e.g. t3code/bda76797), blocking the regression. A corresponding test case is added in GitActionsControl.logic.test.ts to cover this guard.

Macroscope summarized c1a7e53.

@coderabbitai

coderabbitaiBot commented Apr 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 82f34733-d33e-4629-b6d4-6344decd160e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/branch-rename-fix

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Apr 13, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Duplicated worktree branch detection logic across packages
    • Moved TEMP_WORKTREE_BRANCH_PATTERN and isTemporaryWorktreeBranch into @t3tools/shared/git and updated both apps/web and apps/server to import from the shared module, eliminating the duplication.

Create PR

Or push these changes by commenting:

@cursor push 8913a6c37b
Preview (8913a6c37b)
diff --git a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts--- a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts+++ b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts@@ -14,6 +14,8 @@
import { Cache, Cause, Duration, Effect, Equal, Layer, Option, Schema, Stream } from "effect";
import { makeDrainableWorker } from "@t3tools/shared/DrainableWorker";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";+
import { resolveThreadWorkspaceCwd } from "../../checkpointing/Utils.ts";
import { GitCore } from "../../git/Services/GitCore.ts";
import { increment, orchestrationEventsProcessedTotal } from "../../observability/Metrics.ts";
@@ -73,7 +75,6 @@
const HANDLED_TURN_START_KEY_TTL = Duration.minutes(30);
const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access";
const WORKTREE_BRANCH_PREFIX = "t3code";
-const TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\/[0-9a-f]{8}$`);
const DEFAULT_THREAD_TITLE = "New thread";
function canReplaceThreadTitle(currentTitle: string, titleSeed?: string): boolean {
@@ -119,10 +120,6 @@
return `Stale pending ${requestKind} request: ${requestId}. Provider callback state does not survive app restarts or recovered sessions. Restart the turn to continue.`;
}
-function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
function buildGeneratedWorktreeBranchName(raw: string): string {
const normalized = raw
.trim()
diff --git a/apps/web/src/components/GitActionsControl.logic.ts b/apps/web/src/components/GitActionsControl.logic.ts--- a/apps/web/src/components/GitActionsControl.logic.ts+++ b/apps/web/src/components/GitActionsControl.logic.ts@@ -3,6 +3,7 @@
GitStackedAction,
GitStatusResult,
} from "@t3tools/contracts";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";
export type GitActionIconName = "commit" | "push" | "pr";
@@ -37,12 +38,6 @@
| "commit_push"
| "commit_push_pr";
-const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;--function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
export function buildGitActionProgressStages(input: {
action: GitStackedAction;
hasCustomCommitMessage: boolean;
diff --git a/packages/shared/src/git.ts b/packages/shared/src/git.ts--- a/packages/shared/src/git.ts+++ b/packages/shared/src/git.ts@@ -242,6 +242,16 @@
};
}
+const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;++/**+ * Returns true when the branch name matches the temporary worktree naming+ * convention used when a worktree is first created (`t3code/<8-hex-chars>`).+ */+export function isTemporaryWorktreeBranch(branch: string): boolean {+ return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());+}+
const EMPTY_GIT_STATUS_REMOTE: GitStatusRemoteResult = {
hasUpstream: false,
aheadCount: 0,

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit 63092f5. Configure here.

Comment threadapps/web/src/components/GitActionsControl.logic.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Small, focused bug fix that adds a guard to prevent overwriting meaningful branch names with temporary worktree names. The change uses an existing utility function and includes a unit test. Clear intent with minimal scope.

You can customize Macroscope's approvability policy. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Apr 13, 2026
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 63092f5 to 23127c3CompareApril 13, 2026 18:56
- Keep live thread branches stable when git status reports a temporary worktree branch
- Use the shared temporary worktree branch helper in web logic
- Add regression test for semantic branch renames
Co-authored-by: codex <codex@users.noreply.github.com>
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 23127c3 to c1a7e53CompareApril 13, 2026 19:00
@macroscopeapp
macroscopeappBot dismissed their stale reviewApril 13, 2026 19:00

Dismissing prior approval to re-evaluate c1a7e53

@juliusmarminge
juliusmarminge enabled auto-merge (squash) April 13, 2026 19:04
@juliusmarminge
juliusmarminge merged commit 77fcad3 into mainApr 13, 2026
12 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/branch-rename-fix branch April 13, 2026 19:04
juliusmarminge added a commit that referenced this pull request Apr 13, 2026
…1995)
Co-authored-by: codex <codex@users.noreply.github.com>
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Apr 16, 2026
Integrates upstream/main (d22c6f5) into the fork while preserving all
multi-provider support (codex, claudeAgent, copilot, cursor, opencode,
geminiCli, amp, kilo) and fork UI/UX additions.
Highlights adopted from upstream:
- Nightly release channel + update channel selector (pingdotgg#2012, pingdotgg#2049, pingdotgg#1969)
- Filesystem browse API + command palette project picker (pingdotgg#2024)
- Launch Args setting for Claude provider (pingdotgg#1971)
- Kiro editor support in open picker (pingdotgg#1974)
- Claude plan events for TodoWrite during input streaming (pingdotgg#1541)
- Lost provider session recovery (pingdotgg#1938)
- Cache provider status and gate desktop startup (pingdotgg#1962)
- LegendList migration for chat scrolling and branch lists (pingdotgg#1953)
- Shell snapshot queries + backfill migration (pingdotgg#1973, pingdotgg#2004)
- PATH hydration + fallback detection (pingdotgg#1799)
- Warm sidebar thread subscriptions (pingdotgg#2001)
- Full thread title tooltip (pingdotgg#1994)
- Markdown file link UX (pingdotgg#1956), composer polish (pingdotgg#1944, pingdotgg#1992, pingdotgg#1985)
- Worktree/branch state + draft reuse fixes (pingdotgg#2005, pingdotgg#2003, pingdotgg#1995, pingdotgg#1936)
- Window controls overlay for Windows/Linux (pingdotgg#1969)
- Backend readiness timeout 10s→30s (pingdotgg#1979)
- Clear tracked RPCs on reconnect, live stream subscriptions (pingdotgg#2000, pingdotgg#1972)
- Various misc fixes (pingdotgg#2051, pingdotgg#2052, pingdotgg#2025, pingdotgg#2027, pingdotgg#2049, pingdotgg#1997, pingdotgg#1975)
Fork features preserved and reconciled:
- All 8 provider adapters + conformance tests
- Extended ProviderKind union across contracts/model/settings/provider
- appearance/accentColor/themeConfig/ProviderLogo UI system
- customModels + gitTextGeneration + providerModelOptions
- Migration IDs 23 (NormalizeLegacyProviderKinds) and 24
(RepairProjectionThreadProposedPlanImplementationColumns) kept; new
upstream migrations registered at IDs 25-26 to avoid breaking deployed
fork databases
- DesktopBridge: log directory channels (LOG_DIR/LIST/READ/OPEN_DIR)
retained; getWsUrl replaced by upstream's getAppBranding
- PROVIDER_CACHE_IDS extended to all 8 providers
youpele52 referenced this pull request in youpele52/bigbud Jun 17, 2026
…#1995)
Co-authored-by: codex <codex@users.noreply.github.com>
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

Prevent live thread branches from regressing to temp worktree names - #1995

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix
Apr 13, 2026
Merged

Prevent live thread branches from regressing to temp worktree names#1995
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

  • Preserve semantic thread branch names when the current git status reports a temporary t3code/<sha> worktree branch.
  • Add a guard in resolveLiveThreadBranchUpdate so live thread branch updates only adopt temporary worktree names when the thread branch is already temporary.
  • Cover the regression with a logic test for semantic thread branches.

Testing

  • Not run (not requested).

Note

Low Risk
Low risk: small, targeted change to resolveLiveThreadBranchUpdate that only blocks adopting temporary worktree branch names, plus a regression test.

Overview
Prevents live thread branch metadata from being overwritten by temporary worktree branch names (t3code/<sha>) when a semantic branch name is already stored.

Adds a guard in resolveLiveThreadBranchUpdate using isTemporaryWorktreeBranch and covers the scenario with a new unit test to avoid regressions.

Reviewed by Cursor Bugbot for commit c1a7e53. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prevent resolveLiveThreadBranchUpdate from regressing semantic thread branches to temporary worktree names

When a thread already has a semantic branch name (e.g. t3code/github-query-rate-limit), resolveLiveThreadBranchUpdate in GitActionsControl.logic.ts now returns null if the live git status reports a temporary worktree branch (e.g. t3code/bda76797), blocking the regression. A corresponding test case is added in GitActionsControl.logic.test.ts to cover this guard.

Macroscope summarized c1a7e53.

@coderabbitai

coderabbitaiBot commented Apr 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 82f34733-d33e-4629-b6d4-6344decd160e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/branch-rename-fix

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Apr 13, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Duplicated worktree branch detection logic across packages
    • Moved TEMP_WORKTREE_BRANCH_PATTERN and isTemporaryWorktreeBranch into @t3tools/shared/git and updated both apps/web and apps/server to import from the shared module, eliminating the duplication.

Create PR

Or push these changes by commenting:

@cursor push 8913a6c37b
Preview (8913a6c37b)
diff --git a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts--- a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts+++ b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts@@ -14,6 +14,8 @@
import { Cache, Cause, Duration, Effect, Equal, Layer, Option, Schema, Stream } from "effect";
import { makeDrainableWorker } from "@t3tools/shared/DrainableWorker";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";+
import { resolveThreadWorkspaceCwd } from "../../checkpointing/Utils.ts";
import { GitCore } from "../../git/Services/GitCore.ts";
import { increment, orchestrationEventsProcessedTotal } from "../../observability/Metrics.ts";
@@ -73,7 +75,6 @@
const HANDLED_TURN_START_KEY_TTL = Duration.minutes(30);
const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access";
const WORKTREE_BRANCH_PREFIX = "t3code";
-const TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\/[0-9a-f]{8}$`);
const DEFAULT_THREAD_TITLE = "New thread";
function canReplaceThreadTitle(currentTitle: string, titleSeed?: string): boolean {
@@ -119,10 +120,6 @@
return `Stale pending ${requestKind} request: ${requestId}. Provider callback state does not survive app restarts or recovered sessions. Restart the turn to continue.`;
}
-function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
function buildGeneratedWorktreeBranchName(raw: string): string {
const normalized = raw
.trim()
diff --git a/apps/web/src/components/GitActionsControl.logic.ts b/apps/web/src/components/GitActionsControl.logic.ts--- a/apps/web/src/components/GitActionsControl.logic.ts+++ b/apps/web/src/components/GitActionsControl.logic.ts@@ -3,6 +3,7 @@
GitStackedAction,
GitStatusResult,
} from "@t3tools/contracts";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";
export type GitActionIconName = "commit" | "push" | "pr";
@@ -37,12 +38,6 @@
| "commit_push"
| "commit_push_pr";
-const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;--function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
export function buildGitActionProgressStages(input: {
action: GitStackedAction;
hasCustomCommitMessage: boolean;
diff --git a/packages/shared/src/git.ts b/packages/shared/src/git.ts--- a/packages/shared/src/git.ts+++ b/packages/shared/src/git.ts@@ -242,6 +242,16 @@
};
}
+const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;++/**+ * Returns true when the branch name matches the temporary worktree naming+ * convention used when a worktree is first created (`t3code/<8-hex-chars>`).+ */+export function isTemporaryWorktreeBranch(branch: string): boolean {+ return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());+}+
const EMPTY_GIT_STATUS_REMOTE: GitStatusRemoteResult = {
hasUpstream: false,
aheadCount: 0,

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit 63092f5. Configure here.

Comment threadapps/web/src/components/GitActionsControl.logic.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Small, focused bug fix that adds a guard to prevent overwriting meaningful branch names with temporary worktree names. The change uses an existing utility function and includes a unit test. Clear intent with minimal scope.

You can customize Macroscope's approvability policy. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Apr 13, 2026
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 63092f5 to 23127c3CompareApril 13, 2026 18:56
- Keep live thread branches stable when git status reports a temporary worktree branch
- Use the shared temporary worktree branch helper in web logic
- Add regression test for semantic branch renames
Co-authored-by: codex <codex@users.noreply.github.com>
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 23127c3 to c1a7e53CompareApril 13, 2026 19:00
@macroscopeapp
macroscopeappBot dismissed their stale reviewApril 13, 2026 19:00

Dismissing prior approval to re-evaluate c1a7e53

@juliusmarminge
juliusmarminge enabled auto-merge (squash) April 13, 2026 19:04
@juliusmarminge
juliusmarminge merged commit 77fcad3 into mainApr 13, 2026
12 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/branch-rename-fix branch April 13, 2026 19:04
juliusmarminge added a commit that referenced this pull request Apr 13, 2026
…1995)
Co-authored-by: codex <codex@users.noreply.github.com>
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Apr 16, 2026
Integrates upstream/main (d22c6f5) into the fork while preserving all
multi-provider support (codex, claudeAgent, copilot, cursor, opencode,
geminiCli, amp, kilo) and fork UI/UX additions.
Highlights adopted from upstream:
- Nightly release channel + update channel selector (pingdotgg#2012, pingdotgg#2049, pingdotgg#1969)
- Filesystem browse API + command palette project picker (pingdotgg#2024)
- Launch Args setting for Claude provider (pingdotgg#1971)
- Kiro editor support in open picker (pingdotgg#1974)
- Claude plan events for TodoWrite during input streaming (pingdotgg#1541)
- Lost provider session recovery (pingdotgg#1938)
- Cache provider status and gate desktop startup (pingdotgg#1962)
- LegendList migration for chat scrolling and branch lists (pingdotgg#1953)
- Shell snapshot queries + backfill migration (pingdotgg#1973, pingdotgg#2004)
- PATH hydration + fallback detection (pingdotgg#1799)
- Warm sidebar thread subscriptions (pingdotgg#2001)
- Full thread title tooltip (pingdotgg#1994)
- Markdown file link UX (pingdotgg#1956), composer polish (pingdotgg#1944, pingdotgg#1992, pingdotgg#1985)
- Worktree/branch state + draft reuse fixes (pingdotgg#2005, pingdotgg#2003, pingdotgg#1995, pingdotgg#1936)
- Window controls overlay for Windows/Linux (pingdotgg#1969)
- Backend readiness timeout 10s→30s (pingdotgg#1979)
- Clear tracked RPCs on reconnect, live stream subscriptions (pingdotgg#2000, pingdotgg#1972)
- Various misc fixes (pingdotgg#2051, pingdotgg#2052, pingdotgg#2025, pingdotgg#2027, pingdotgg#2049, pingdotgg#1997, pingdotgg#1975)
Fork features preserved and reconciled:
- All 8 provider adapters + conformance tests
- Extended ProviderKind union across contracts/model/settings/provider
- appearance/accentColor/themeConfig/ProviderLogo UI system
- customModels + gitTextGeneration + providerModelOptions
- Migration IDs 23 (NormalizeLegacyProviderKinds) and 24
(RepairProjectionThreadProposedPlanImplementationColumns) kept; new
upstream migrations registered at IDs 25-26 to avoid breaking deployed
fork databases
- DesktopBridge: log directory channels (LOG_DIR/LIST/READ/OPEN_DIR)
retained; getWsUrl replaced by upstream's getAppBranding
- PROVIDER_CACHE_IDS extended to all 8 providers
youpele52 referenced this pull request in youpele52/bigbud Jun 17, 2026
…#1995)
Co-authored-by: codex <codex@users.noreply.github.com>
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

Prevent live thread branches from regressing to temp worktree names - #1995

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix
Apr 13, 2026
Merged

Prevent live thread branches from regressing to temp worktree names#1995
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

  • Preserve semantic thread branch names when the current git status reports a temporary t3code/<sha> worktree branch.
  • Add a guard in resolveLiveThreadBranchUpdate so live thread branch updates only adopt temporary worktree names when the thread branch is already temporary.
  • Cover the regression with a logic test for semantic thread branches.

Testing

  • Not run (not requested).

Note

Low Risk
Low risk: small, targeted change to resolveLiveThreadBranchUpdate that only blocks adopting temporary worktree branch names, plus a regression test.

Overview
Prevents live thread branch metadata from being overwritten by temporary worktree branch names (t3code/<sha>) when a semantic branch name is already stored.

Adds a guard in resolveLiveThreadBranchUpdate using isTemporaryWorktreeBranch and covers the scenario with a new unit test to avoid regressions.

Reviewed by Cursor Bugbot for commit c1a7e53. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prevent resolveLiveThreadBranchUpdate from regressing semantic thread branches to temporary worktree names

When a thread already has a semantic branch name (e.g. t3code/github-query-rate-limit), resolveLiveThreadBranchUpdate in GitActionsControl.logic.ts now returns null if the live git status reports a temporary worktree branch (e.g. t3code/bda76797), blocking the regression. A corresponding test case is added in GitActionsControl.logic.test.ts to cover this guard.

Macroscope summarized c1a7e53.

@coderabbitai

coderabbitaiBot commented Apr 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 82f34733-d33e-4629-b6d4-6344decd160e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/branch-rename-fix

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Apr 13, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Duplicated worktree branch detection logic across packages
    • Moved TEMP_WORKTREE_BRANCH_PATTERN and isTemporaryWorktreeBranch into @t3tools/shared/git and updated both apps/web and apps/server to import from the shared module, eliminating the duplication.

Create PR

Or push these changes by commenting:

@cursor push 8913a6c37b
Preview (8913a6c37b)
diff --git a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts--- a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts+++ b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts@@ -14,6 +14,8 @@
import { Cache, Cause, Duration, Effect, Equal, Layer, Option, Schema, Stream } from "effect";
import { makeDrainableWorker } from "@t3tools/shared/DrainableWorker";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";+
import { resolveThreadWorkspaceCwd } from "../../checkpointing/Utils.ts";
import { GitCore } from "../../git/Services/GitCore.ts";
import { increment, orchestrationEventsProcessedTotal } from "../../observability/Metrics.ts";
@@ -73,7 +75,6 @@
const HANDLED_TURN_START_KEY_TTL = Duration.minutes(30);
const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access";
const WORKTREE_BRANCH_PREFIX = "t3code";
-const TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\/[0-9a-f]{8}$`);
const DEFAULT_THREAD_TITLE = "New thread";
function canReplaceThreadTitle(currentTitle: string, titleSeed?: string): boolean {
@@ -119,10 +120,6 @@
return `Stale pending ${requestKind} request: ${requestId}. Provider callback state does not survive app restarts or recovered sessions. Restart the turn to continue.`;
}
-function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
function buildGeneratedWorktreeBranchName(raw: string): string {
const normalized = raw
.trim()
diff --git a/apps/web/src/components/GitActionsControl.logic.ts b/apps/web/src/components/GitActionsControl.logic.ts--- a/apps/web/src/components/GitActionsControl.logic.ts+++ b/apps/web/src/components/GitActionsControl.logic.ts@@ -3,6 +3,7 @@
GitStackedAction,
GitStatusResult,
} from "@t3tools/contracts";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";
export type GitActionIconName = "commit" | "push" | "pr";
@@ -37,12 +38,6 @@
| "commit_push"
| "commit_push_pr";
-const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;--function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
export function buildGitActionProgressStages(input: {
action: GitStackedAction;
hasCustomCommitMessage: boolean;
diff --git a/packages/shared/src/git.ts b/packages/shared/src/git.ts--- a/packages/shared/src/git.ts+++ b/packages/shared/src/git.ts@@ -242,6 +242,16 @@
};
}
+const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;++/**+ * Returns true when the branch name matches the temporary worktree naming+ * convention used when a worktree is first created (`t3code/<8-hex-chars>`).+ */+export function isTemporaryWorktreeBranch(branch: string): boolean {+ return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());+}+
const EMPTY_GIT_STATUS_REMOTE: GitStatusRemoteResult = {
hasUpstream: false,
aheadCount: 0,

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit 63092f5. Configure here.

Comment threadapps/web/src/components/GitActionsControl.logic.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Small, focused bug fix that adds a guard to prevent overwriting meaningful branch names with temporary worktree names. The change uses an existing utility function and includes a unit test. Clear intent with minimal scope.

You can customize Macroscope's approvability policy. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Apr 13, 2026
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 63092f5 to 23127c3CompareApril 13, 2026 18:56
- Keep live thread branches stable when git status reports a temporary worktree branch
- Use the shared temporary worktree branch helper in web logic
- Add regression test for semantic branch renames
Co-authored-by: codex <codex@users.noreply.github.com>
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 23127c3 to c1a7e53CompareApril 13, 2026 19:00
@macroscopeapp
macroscopeappBot dismissed their stale reviewApril 13, 2026 19:00

Dismissing prior approval to re-evaluate c1a7e53

@juliusmarminge
juliusmarminge enabled auto-merge (squash) April 13, 2026 19:04
@juliusmarminge
juliusmarminge merged commit 77fcad3 into mainApr 13, 2026
12 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/branch-rename-fix branch April 13, 2026 19:04
juliusmarminge added a commit that referenced this pull request Apr 13, 2026
…1995)
Co-authored-by: codex <codex@users.noreply.github.com>
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Apr 16, 2026
Integrates upstream/main (d22c6f5) into the fork while preserving all
multi-provider support (codex, claudeAgent, copilot, cursor, opencode,
geminiCli, amp, kilo) and fork UI/UX additions.
Highlights adopted from upstream:
- Nightly release channel + update channel selector (pingdotgg#2012, pingdotgg#2049, pingdotgg#1969)
- Filesystem browse API + command palette project picker (pingdotgg#2024)
- Launch Args setting for Claude provider (pingdotgg#1971)
- Kiro editor support in open picker (pingdotgg#1974)
- Claude plan events for TodoWrite during input streaming (pingdotgg#1541)
- Lost provider session recovery (pingdotgg#1938)
- Cache provider status and gate desktop startup (pingdotgg#1962)
- LegendList migration for chat scrolling and branch lists (pingdotgg#1953)
- Shell snapshot queries + backfill migration (pingdotgg#1973, pingdotgg#2004)
- PATH hydration + fallback detection (pingdotgg#1799)
- Warm sidebar thread subscriptions (pingdotgg#2001)
- Full thread title tooltip (pingdotgg#1994)
- Markdown file link UX (pingdotgg#1956), composer polish (pingdotgg#1944, pingdotgg#1992, pingdotgg#1985)
- Worktree/branch state + draft reuse fixes (pingdotgg#2005, pingdotgg#2003, pingdotgg#1995, pingdotgg#1936)
- Window controls overlay for Windows/Linux (pingdotgg#1969)
- Backend readiness timeout 10s→30s (pingdotgg#1979)
- Clear tracked RPCs on reconnect, live stream subscriptions (pingdotgg#2000, pingdotgg#1972)
- Various misc fixes (pingdotgg#2051, pingdotgg#2052, pingdotgg#2025, pingdotgg#2027, pingdotgg#2049, pingdotgg#1997, pingdotgg#1975)
Fork features preserved and reconciled:
- All 8 provider adapters + conformance tests
- Extended ProviderKind union across contracts/model/settings/provider
- appearance/accentColor/themeConfig/ProviderLogo UI system
- customModels + gitTextGeneration + providerModelOptions
- Migration IDs 23 (NormalizeLegacyProviderKinds) and 24
(RepairProjectionThreadProposedPlanImplementationColumns) kept; new
upstream migrations registered at IDs 25-26 to avoid breaking deployed
fork databases
- DesktopBridge: log directory channels (LOG_DIR/LIST/READ/OPEN_DIR)
retained; getWsUrl replaced by upstream's getAppBranding
- PROVIDER_CACHE_IDS extended to all 8 providers
youpele52 referenced this pull request in youpele52/bigbud Jun 17, 2026
…#1995)
Co-authored-by: codex <codex@users.noreply.github.com>
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

Prevent live thread branches from regressing to temp worktree names - #1995

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix
Apr 13, 2026
Merged

Prevent live thread branches from regressing to temp worktree names#1995
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

  • Preserve semantic thread branch names when the current git status reports a temporary t3code/<sha> worktree branch.
  • Add a guard in resolveLiveThreadBranchUpdate so live thread branch updates only adopt temporary worktree names when the thread branch is already temporary.
  • Cover the regression with a logic test for semantic thread branches.

Testing

  • Not run (not requested).

Note

Low Risk
Low risk: small, targeted change to resolveLiveThreadBranchUpdate that only blocks adopting temporary worktree branch names, plus a regression test.

Overview
Prevents live thread branch metadata from being overwritten by temporary worktree branch names (t3code/<sha>) when a semantic branch name is already stored.

Adds a guard in resolveLiveThreadBranchUpdate using isTemporaryWorktreeBranch and covers the scenario with a new unit test to avoid regressions.

Reviewed by Cursor Bugbot for commit c1a7e53. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prevent resolveLiveThreadBranchUpdate from regressing semantic thread branches to temporary worktree names

When a thread already has a semantic branch name (e.g. t3code/github-query-rate-limit), resolveLiveThreadBranchUpdate in GitActionsControl.logic.ts now returns null if the live git status reports a temporary worktree branch (e.g. t3code/bda76797), blocking the regression. A corresponding test case is added in GitActionsControl.logic.test.ts to cover this guard.

Macroscope summarized c1a7e53.

@coderabbitai

coderabbitaiBot commented Apr 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 82f34733-d33e-4629-b6d4-6344decd160e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/branch-rename-fix

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Apr 13, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Duplicated worktree branch detection logic across packages
    • Moved TEMP_WORKTREE_BRANCH_PATTERN and isTemporaryWorktreeBranch into @t3tools/shared/git and updated both apps/web and apps/server to import from the shared module, eliminating the duplication.

Create PR

Or push these changes by commenting:

@cursor push 8913a6c37b
Preview (8913a6c37b)
diff --git a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts--- a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts+++ b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts@@ -14,6 +14,8 @@
import { Cache, Cause, Duration, Effect, Equal, Layer, Option, Schema, Stream } from "effect";
import { makeDrainableWorker } from "@t3tools/shared/DrainableWorker";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";+
import { resolveThreadWorkspaceCwd } from "../../checkpointing/Utils.ts";
import { GitCore } from "../../git/Services/GitCore.ts";
import { increment, orchestrationEventsProcessedTotal } from "../../observability/Metrics.ts";
@@ -73,7 +75,6 @@
const HANDLED_TURN_START_KEY_TTL = Duration.minutes(30);
const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access";
const WORKTREE_BRANCH_PREFIX = "t3code";
-const TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\/[0-9a-f]{8}$`);
const DEFAULT_THREAD_TITLE = "New thread";
function canReplaceThreadTitle(currentTitle: string, titleSeed?: string): boolean {
@@ -119,10 +120,6 @@
return `Stale pending ${requestKind} request: ${requestId}. Provider callback state does not survive app restarts or recovered sessions. Restart the turn to continue.`;
}
-function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
function buildGeneratedWorktreeBranchName(raw: string): string {
const normalized = raw
.trim()
diff --git a/apps/web/src/components/GitActionsControl.logic.ts b/apps/web/src/components/GitActionsControl.logic.ts--- a/apps/web/src/components/GitActionsControl.logic.ts+++ b/apps/web/src/components/GitActionsControl.logic.ts@@ -3,6 +3,7 @@
GitStackedAction,
GitStatusResult,
} from "@t3tools/contracts";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";
export type GitActionIconName = "commit" | "push" | "pr";
@@ -37,12 +38,6 @@
| "commit_push"
| "commit_push_pr";
-const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;--function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
export function buildGitActionProgressStages(input: {
action: GitStackedAction;
hasCustomCommitMessage: boolean;
diff --git a/packages/shared/src/git.ts b/packages/shared/src/git.ts--- a/packages/shared/src/git.ts+++ b/packages/shared/src/git.ts@@ -242,6 +242,16 @@
};
}
+const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;++/**+ * Returns true when the branch name matches the temporary worktree naming+ * convention used when a worktree is first created (`t3code/<8-hex-chars>`).+ */+export function isTemporaryWorktreeBranch(branch: string): boolean {+ return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());+}+
const EMPTY_GIT_STATUS_REMOTE: GitStatusRemoteResult = {
hasUpstream: false,
aheadCount: 0,

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit 63092f5. Configure here.

Comment threadapps/web/src/components/GitActionsControl.logic.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Small, focused bug fix that adds a guard to prevent overwriting meaningful branch names with temporary worktree names. The change uses an existing utility function and includes a unit test. Clear intent with minimal scope.

You can customize Macroscope's approvability policy. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Apr 13, 2026
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 63092f5 to 23127c3CompareApril 13, 2026 18:56
- Keep live thread branches stable when git status reports a temporary worktree branch
- Use the shared temporary worktree branch helper in web logic
- Add regression test for semantic branch renames
Co-authored-by: codex <codex@users.noreply.github.com>
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 23127c3 to c1a7e53CompareApril 13, 2026 19:00
@macroscopeapp
macroscopeappBot dismissed their stale reviewApril 13, 2026 19:00

Dismissing prior approval to re-evaluate c1a7e53

@juliusmarminge
juliusmarminge enabled auto-merge (squash) April 13, 2026 19:04
@juliusmarminge
juliusmarminge merged commit 77fcad3 into mainApr 13, 2026
12 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/branch-rename-fix branch April 13, 2026 19:04
juliusmarminge added a commit that referenced this pull request Apr 13, 2026
…1995)
Co-authored-by: codex <codex@users.noreply.github.com>
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Apr 16, 2026
Integrates upstream/main (d22c6f5) into the fork while preserving all
multi-provider support (codex, claudeAgent, copilot, cursor, opencode,
geminiCli, amp, kilo) and fork UI/UX additions.
Highlights adopted from upstream:
- Nightly release channel + update channel selector (pingdotgg#2012, pingdotgg#2049, pingdotgg#1969)
- Filesystem browse API + command palette project picker (pingdotgg#2024)
- Launch Args setting for Claude provider (pingdotgg#1971)
- Kiro editor support in open picker (pingdotgg#1974)
- Claude plan events for TodoWrite during input streaming (pingdotgg#1541)
- Lost provider session recovery (pingdotgg#1938)
- Cache provider status and gate desktop startup (pingdotgg#1962)
- LegendList migration for chat scrolling and branch lists (pingdotgg#1953)
- Shell snapshot queries + backfill migration (pingdotgg#1973, pingdotgg#2004)
- PATH hydration + fallback detection (pingdotgg#1799)
- Warm sidebar thread subscriptions (pingdotgg#2001)
- Full thread title tooltip (pingdotgg#1994)
- Markdown file link UX (pingdotgg#1956), composer polish (pingdotgg#1944, pingdotgg#1992, pingdotgg#1985)
- Worktree/branch state + draft reuse fixes (pingdotgg#2005, pingdotgg#2003, pingdotgg#1995, pingdotgg#1936)
- Window controls overlay for Windows/Linux (pingdotgg#1969)
- Backend readiness timeout 10s→30s (pingdotgg#1979)
- Clear tracked RPCs on reconnect, live stream subscriptions (pingdotgg#2000, pingdotgg#1972)
- Various misc fixes (pingdotgg#2051, pingdotgg#2052, pingdotgg#2025, pingdotgg#2027, pingdotgg#2049, pingdotgg#1997, pingdotgg#1975)
Fork features preserved and reconciled:
- All 8 provider adapters + conformance tests
- Extended ProviderKind union across contracts/model/settings/provider
- appearance/accentColor/themeConfig/ProviderLogo UI system
- customModels + gitTextGeneration + providerModelOptions
- Migration IDs 23 (NormalizeLegacyProviderKinds) and 24
(RepairProjectionThreadProposedPlanImplementationColumns) kept; new
upstream migrations registered at IDs 25-26 to avoid breaking deployed
fork databases
- DesktopBridge: log directory channels (LOG_DIR/LIST/READ/OPEN_DIR)
retained; getWsUrl replaced by upstream's getAppBranding
- PROVIDER_CACHE_IDS extended to all 8 providers
youpele52 referenced this pull request in youpele52/bigbud Jun 17, 2026
…#1995)
Co-authored-by: codex <codex@users.noreply.github.com>
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

Prevent live thread branches from regressing to temp worktree names - #1995

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix
Apr 13, 2026
Merged

Prevent live thread branches from regressing to temp worktree names#1995
juliusmarminge merged 1 commit into
mainfrom
t3code/branch-rename-fix

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

  • Preserve semantic thread branch names when the current git status reports a temporary t3code/<sha> worktree branch.
  • Add a guard in resolveLiveThreadBranchUpdate so live thread branch updates only adopt temporary worktree names when the thread branch is already temporary.
  • Cover the regression with a logic test for semantic thread branches.

Testing

  • Not run (not requested).

Note

Low Risk
Low risk: small, targeted change to resolveLiveThreadBranchUpdate that only blocks adopting temporary worktree branch names, plus a regression test.

Overview
Prevents live thread branch metadata from being overwritten by temporary worktree branch names (t3code/<sha>) when a semantic branch name is already stored.

Adds a guard in resolveLiveThreadBranchUpdate using isTemporaryWorktreeBranch and covers the scenario with a new unit test to avoid regressions.

Reviewed by Cursor Bugbot for commit c1a7e53. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prevent resolveLiveThreadBranchUpdate from regressing semantic thread branches to temporary worktree names

When a thread already has a semantic branch name (e.g. t3code/github-query-rate-limit), resolveLiveThreadBranchUpdate in GitActionsControl.logic.ts now returns null if the live git status reports a temporary worktree branch (e.g. t3code/bda76797), blocking the regression. A corresponding test case is added in GitActionsControl.logic.test.ts to cover this guard.

Macroscope summarized c1a7e53.

@coderabbitai

coderabbitaiBot commented Apr 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 82f34733-d33e-4629-b6d4-6344decd160e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/branch-rename-fix

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Apr 13, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Duplicated worktree branch detection logic across packages
    • Moved TEMP_WORKTREE_BRANCH_PATTERN and isTemporaryWorktreeBranch into @t3tools/shared/git and updated both apps/web and apps/server to import from the shared module, eliminating the duplication.

Create PR

Or push these changes by commenting:

@cursor push 8913a6c37b
Preview (8913a6c37b)
diff --git a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts--- a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts+++ b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts@@ -14,6 +14,8 @@
import { Cache, Cause, Duration, Effect, Equal, Layer, Option, Schema, Stream } from "effect";
import { makeDrainableWorker } from "@t3tools/shared/DrainableWorker";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";+
import { resolveThreadWorkspaceCwd } from "../../checkpointing/Utils.ts";
import { GitCore } from "../../git/Services/GitCore.ts";
import { increment, orchestrationEventsProcessedTotal } from "../../observability/Metrics.ts";
@@ -73,7 +75,6 @@
const HANDLED_TURN_START_KEY_TTL = Duration.minutes(30);
const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access";
const WORKTREE_BRANCH_PREFIX = "t3code";
-const TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\/[0-9a-f]{8}$`);
const DEFAULT_THREAD_TITLE = "New thread";
function canReplaceThreadTitle(currentTitle: string, titleSeed?: string): boolean {
@@ -119,10 +120,6 @@
return `Stale pending ${requestKind} request: ${requestId}. Provider callback state does not survive app restarts or recovered sessions. Restart the turn to continue.`;
}
-function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
function buildGeneratedWorktreeBranchName(raw: string): string {
const normalized = raw
.trim()
diff --git a/apps/web/src/components/GitActionsControl.logic.ts b/apps/web/src/components/GitActionsControl.logic.ts--- a/apps/web/src/components/GitActionsControl.logic.ts+++ b/apps/web/src/components/GitActionsControl.logic.ts@@ -3,6 +3,7 @@
GitStackedAction,
GitStatusResult,
} from "@t3tools/contracts";
+import { isTemporaryWorktreeBranch } from "@t3tools/shared/git";
export type GitActionIconName = "commit" | "push" | "pr";
@@ -37,12 +38,6 @@
| "commit_push"
| "commit_push_pr";
-const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;--function isTemporaryWorktreeBranch(branch: string): boolean {- return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());-}-
export function buildGitActionProgressStages(input: {
action: GitStackedAction;
hasCustomCommitMessage: boolean;
diff --git a/packages/shared/src/git.ts b/packages/shared/src/git.ts--- a/packages/shared/src/git.ts+++ b/packages/shared/src/git.ts@@ -242,6 +242,16 @@
};
}
+const TEMP_WORKTREE_BRANCH_PATTERN = /^t3code\/[0-9a-f]{8}$/;++/**+ * Returns true when the branch name matches the temporary worktree naming+ * convention used when a worktree is first created (`t3code/<8-hex-chars>`).+ */+export function isTemporaryWorktreeBranch(branch: string): boolean {+ return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());+}+
const EMPTY_GIT_STATUS_REMOTE: GitStatusRemoteResult = {
hasUpstream: false,
aheadCount: 0,

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit 63092f5. Configure here.

Comment threadapps/web/src/components/GitActionsControl.logic.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Small, focused bug fix that adds a guard to prevent overwriting meaningful branch names with temporary worktree names. The change uses an existing utility function and includes a unit test. Clear intent with minimal scope.

You can customize Macroscope's approvability policy. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Apr 13, 2026
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 63092f5 to 23127c3CompareApril 13, 2026 18:56
- Keep live thread branches stable when git status reports a temporary worktree branch
- Use the shared temporary worktree branch helper in web logic
- Add regression test for semantic branch renames
Co-authored-by: codex <codex@users.noreply.github.com>
@juliusmarminge
juliusmarmingeforce-pushed the t3code/branch-rename-fix branch from 23127c3 to c1a7e53CompareApril 13, 2026 19:00
@macroscopeapp
macroscopeappBot dismissed their stale reviewApril 13, 2026 19:00

Dismissing prior approval to re-evaluate c1a7e53

@juliusmarminge
juliusmarminge enabled auto-merge (squash) April 13, 2026 19:04
@juliusmarminge
juliusmarminge merged commit 77fcad3 into mainApr 13, 2026
12 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/branch-rename-fix branch April 13, 2026 19:04
juliusmarminge added a commit that referenced this pull request Apr 13, 2026
…1995)
Co-authored-by: codex <codex@users.noreply.github.com>
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Apr 16, 2026
Integrates upstream/main (d22c6f5) into the fork while preserving all
multi-provider support (codex, claudeAgent, copilot, cursor, opencode,
geminiCli, amp, kilo) and fork UI/UX additions.
Highlights adopted from upstream:
- Nightly release channel + update channel selector (pingdotgg#2012, pingdotgg#2049, pingdotgg#1969)
- Filesystem browse API + command palette project picker (pingdotgg#2024)
- Launch Args setting for Claude provider (pingdotgg#1971)
- Kiro editor support in open picker (pingdotgg#1974)
- Claude plan events for TodoWrite during input streaming (pingdotgg#1541)
- Lost provider session recovery (pingdotgg#1938)
- Cache provider status and gate desktop startup (pingdotgg#1962)
- LegendList migration for chat scrolling and branch lists (pingdotgg#1953)
- Shell snapshot queries + backfill migration (pingdotgg#1973, pingdotgg#2004)
- PATH hydration + fallback detection (pingdotgg#1799)
- Warm sidebar thread subscriptions (pingdotgg#2001)
- Full thread title tooltip (pingdotgg#1994)
- Markdown file link UX (pingdotgg#1956), composer polish (pingdotgg#1944, pingdotgg#1992, pingdotgg#1985)
- Worktree/branch state + draft reuse fixes (pingdotgg#2005, pingdotgg#2003, pingdotgg#1995, pingdotgg#1936)
- Window controls overlay for Windows/Linux (pingdotgg#1969)
- Backend readiness timeout 10s→30s (pingdotgg#1979)
- Clear tracked RPCs on reconnect, live stream subscriptions (pingdotgg#2000, pingdotgg#1972)
- Various misc fixes (pingdotgg#2051, pingdotgg#2052, pingdotgg#2025, pingdotgg#2027, pingdotgg#2049, pingdotgg#1997, pingdotgg#1975)
Fork features preserved and reconciled:
- All 8 provider adapters + conformance tests
- Extended ProviderKind union across contracts/model/settings/provider
- appearance/accentColor/themeConfig/ProviderLogo UI system
- customModels + gitTextGeneration + providerModelOptions
- Migration IDs 23 (NormalizeLegacyProviderKinds) and 24
(RepairProjectionThreadProposedPlanImplementationColumns) kept; new
upstream migrations registered at IDs 25-26 to avoid breaking deployed
fork databases
- DesktopBridge: log directory channels (LOG_DIR/LIST/READ/OPEN_DIR)
retained; getWsUrl replaced by upstream's getAppBranding
- PROVIDER_CACHE_IDS extended to all 8 providers
youpele52 referenced this pull request in youpele52/bigbud Jun 17, 2026
…#1995)
Co-authored-by: codex <codex@users.noreply.github.com>
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge