chore(upstream): sync marcode through bab4b6f02b8b - #35
Conversation
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…otgg#4844) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com>
…isting, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039) Co-authored-by: Julius Marminge <julius0216@outlook.com>
…ingdotgg#6330) Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
…6393) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6423) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…ngdotgg#6495) Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com> Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
…ingdotgg#6520) Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…show (pingdotgg#4986) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com>
…g#4197) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com>
…gdotgg#5989) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com>
…7081) Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
pingdotgg#7132) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…#6392) Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Merges 158 upstream commits (b73232b..bab4b6f) into Marcode. 41 paths conflicted; every one was resolved by hand, combining both intents. Conflict decisions ------------------ Retired surfaces (Marcode owns the removal) - apps/web/src/components/files/{FileBrowserPanel,FilePreviewPanel}.tsx: kept deleted. Upstream only restyled them and added remote-open; that feature is taken in OpenInPicker instead. - RightPanelTabs.tsx: took upstream's `desktopByTabId` threading (it now feeds the preview-tab favicon) and its Button-based add-panel trigger; dropped `theme`/`PierreEntryIcon`, which exist only for the retired `file` surface icon. Trimmed the matching props from upstream's new RightPanelTabs.test.tsx. - ChatView.tsx: took upstream's pull-request tab-status keying fix (keyed by the shown surface, not a key rebuilt from the status) and their workspace file drag-and-drop; dropped `activeFileSurface`. - ChatMarkdown.tsx / diffFileActions.ts: kept upstream's call shape and repointed the shared producer at the floating editor. diffFileActions keeps upstream's new `resolveDiffPathForWorkspace` (a real fix for repository-relative diff paths in nested projects) and feeds the result to the editor rather than the right panel; its tests now assert on the editor store. Navigation and shell (FloatingPillNav owns brand/nav/settings) - AppSidebarLayout.tsx, sidebar/SidebarChrome.tsx: kept Marcode's no-op SidebarControl and update-only footer. Upstream's SidebarBrand / T3Wordmark / footer nav would ship a second copy of controls the pill nav already renders, and threadSidebarWidth.test.ts asserts that removal. - threadSidebarWidth.test.ts: kept Marcode's brand-removal assertion over upstream's wordmark assertion. - chat/ChatHeader.tsx: kept Marcode's title-only header (no thread action menu / inline rename); took upstream's remote-open imports. - ui/tooltip.tsx: kept Marcode's inline FLOATING_SURFACE_Z stacking; upstream's `z-[140]` utility bump is subsumed by it. Styling refactor followed, behavior kept (index.css) - Adopted upstream's nested `@variant dark`, `@layer base` stage-art defaults, `alert-glass` utility and theme-id palettes. Ported Marcode's monochrome `.stage-blueprint` override onto the renamed `--stage-art-*` tokens; kept Marcode's dark palette, sidebar surface rules and floating chrome. Dropped the now-dead `.workspace-topbar`. - Followed upstream's class retirements at their call sites: `.chat-composer-glass` -> `surface-glass` (ChatComposer, PullRequestCodeTab), `.workspace-titlebar-controls` and `.chat-composer-horizontal-inset` -> inline utilities (ChatView). Those classes no longer exist, so keeping them would have been a silent no-op. - Pull-request panels/UsagePage: took upstream's Button refactor inside Marcode's Tooltip wrappers rather than choosing one side. Behavior merged by hand - threadSettled.ts: combined upstream's new `autoSettleOnMerge` setting with Marcode's warm-window guard, so a merged/closed PR settles a thread only once it has been idle. Rewrote upstream's new test to the combined rule and added a test pinning the warm-window half. - ThreadTerminalDrawer.tsx: Marcode keeps xterm (for its search addon) where upstream runs the Ghostty WASM surface, so upstream's two fixes were ported by hand rather than merged: right-click paste (pingdotgg#5240) and the Ctrl+C selection-clear guard (pingdotgg#5638). Ghostty's `pasteFromClipboard` race claim has no xterm equivalent, so the same race is settled against the request id in the drawer; the context menu is bound to the mount element instead of a surface option. Branding and identity - BitbucketSourceControlProvider.ts: kept MARCODE_* env names, took upstream's added "user read" scope wording. - desktopUpdate.logic.ts: took upstream's removal of the Windows-only install warning (their copy decision, and the `platform` parameter is gone from every caller); kept Marcode wording. - ConnectionsSettings.tsx: took upstream's `window.desktopBridge` gate (the toggle should not show in the web app); kept "Marcode Connect". - MobileClientsUserProfilePage.tsx: adopted upstream's shared ClerkUserProfilePage/Row primitives, rebranded to Marcode. - _chat.pull-requests.tsx: took upstream's plural copy for the new multi-environment view, rebranded. - README.md / AGENTS.md: kept Marcode's. Upstream's additions were either their distribution channel (AUR) or duplicates of sections Marcode already has. - docs/internals/scripts.md, packages/shared/package.json, commandInvariants.test.ts, build-desktop-artifact.ts: additive on both sides, combined. - mobile-showcase.test.ts, infra/relay/scripts/deploy.test.ts: kept the Marcode tests upstream deleted — they pin the `marcode://` scheme and MARCODE_RELAY_URL — and restored the imports upstream removed. - pnpm-lock.yaml: regenerated with pnpm, not hand-merged. Fork-boundary breaks that merged cleanly (no conflict) -------------------------------------------------------- - .agents/skills/test-t3-mobile/scripts/pair-client.sh: upstream's new pairing helper used T3CODE_PORT, the `t3code-dev` scheme and `com.t3tools.t3code.dev`. Marcode uses MARCODE_PORT, `marcode-dev` and `com.t3tools.marcode.dev`, so the helper could not have paired a single device. Fixed, along with three stale `t3code-dev` references already in that skill's SKILL.md. - .github/workflows/release.yml: upstream wired publish_aur into the release pipeline. Marcode does not own the `t3code-bin` AUR packages and the PKGBUILDs fetch from pingdotgg/t3code releases, so a Marcode release would have failed on the missing secret or pushed upstream's package. Removed the call site only, leaving publish-aur.yml and packaging/aur untouched so future syncs do not conflict on them, and added scripts/release-fork-boundary.test.ts to pin the removal. - apps/desktop/resources/dmg/*.svg: upstream's new DMG installer artwork read "T3 CODE" / "Drag T3 Code to Applications". Rebranded. - clerk/T3ConnectUserProfilePage.tsx + T3ConnectSidebarSignIn.tsx: a new user-visible account page and tab labelled "T3 Connect". Rebranded to Marcode Connect; the `t3-connect` route slug and file names stay upstream-shaped. - apps/mobile/src/lib/mobileTheme.ts: the new built-in theme picker labelled the default palette "T3 Code". Relabelled to Marcode; the persisted `t3-code` id is deliberately unchanged. - docs/user/mobile-appearance.md: new doc, rebranded to match. - .github/ISSUE_TEMPLATE/* and CONTRIBUTING.md: upstream moved to a Discussions-first model and pointed contributors at pingdotgg/t3code/discussions. Marcode tracks everything in its own Issues, so the issues-first wording is kept and the cross-repo contact link dropped. - scripts/build-desktop-artifact.test.ts: upstream's new DMG assertion hard-coded their productName. Repointed at Marcode's. - Verified clean: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the `t3` package name and `t3code:` storage keys remain upstream-shaped on purpose; MARCODE_HOME still drives the service launcher; no `t3code/<hex>` branch fixtures leaked past the renamed WORKTREE_BRANCH_PREFIX. Verification ------------ - typecheck: web, server, desktop, mobile, contracts, shared, client-runtime — all clean. - vp test run over the touched surfaces: 435 tests pass. - vp fmt --check and vp lint on the changed files/dirs: clean (warnings only, all pre-existing). - Not run here: ThreadTerminalDrawer.test.ts and FloatingTerminalShell.test.ts. Both fail to resolve @aliimam/icons in this container; the same failure reproduces on origin/main, and that import is unchanged by this merge. CI covers them, and the hand-ported terminal paste path has had no runtime verification. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
Upstream's new DesktopWslServerTree test seeds its DesktopConfig layer with T3CODE_HOME and T3CODE_MODE. Marcode reads MARCODE_HOME and MARCODE_MODE, so `marcodeHome` stayed unset, the desktop state dir resolved off the test's temp tree, and the sweep assertions never saw the stale version directory they set up. Another clean-merge fork-boundary break from the bab4b6f sync: the file is new upstream, so it arrived without a conflict marker. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
Upstream added an `isPublicFaviconHost` guard to `faviconUrlForOrigin`, so it no longer sends private, loopback, or reserved-TLD hostnames to Google's s2 favicon endpoint. That guard is a privacy fix and is kept. Marcode's unified workspace tree resolves URL shortcut icons through the same helper, and its capability-flag test asserted a favicon for a `http://localhost:3000` shortcut — which is exactly the case upstream now refuses. Repointed that assertion at a public host and added a test pinning the new behaviour, since a leaked hostname is invisible in the UI: the sidebar renders its globe fallback either way. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
|
Two CI rounds, two more clean-merge fork-boundary breaks — both fixed, and one correction to the description above.
That second one is worth a look during review. It is a behaviour change for anyone who has a URL shortcut pointing at a dev server or an intranet host — those rows lose their favicon and fall back to the globe. That is the correct outcome, but it is user-visible. Correction to the "Not verified" sectionI reported that What remains genuinely unverified is narrower than I said: no live client pass on any UI surface, and no interactive exercise of the right-click paste path against a real pty. One local-only failure worth naming so nobody chases it: Generated by Claude Code |
What Changed
Merges 158 upstream commits,
b73232bd..bab4b6f0, intomainas one two-parent merge commit (791d415c), plus two follow-up fixes for breaks CI caught. 41 paths conflicted and every one was resolved by hand, combining both intents — no whole-file ours/theirs, noreset/restore/stash/clean, no force push.Supersedes #29 (through
9e201941), #31 (through184d8ef3), and #33 (throughad117235) — all three of those SHAs are ancestors ofbab4b6f0, and all four branches share the same base. Closing them in favour of this one is your call. Resolves theupstream-sync-blockedissue #34.Conflict decisions
Retired surfaces (Marcode owns the removal)
files/{FileBrowserPanel,FilePreviewPanel}.tsx— kept deleted. Upstream only restyled them and added remote-open; that feature is taken inOpenInPickerinstead.RightPanelTabs.tsx— took upstream'sdesktopByTabIdthreading (it now feeds the preview-tab favicon) and their Button-based add-panel trigger; droppedtheme/PierreEntryIcon, which exist only for the retiredfilesurface icon. Trimmed the matching props from upstream's newRightPanelTabs.test.tsx.ChatView.tsx— took upstream's PR tab-status keying fix (keyed by the shown surface, not a key rebuilt from the status) and their workspace file drag-and-drop; droppedactiveFileSurface.ChatMarkdown.tsx/diffFileActions.ts— kept upstream's call shape and repointed the shared producer at the floating editor.diffFileActionskeeps upstream's newresolveDiffPathForWorkspace(a real fix for repository-relative diff paths in nested projects) and feeds the result to the editor rather than the right panel; its tests now assert on the editor store.Navigation and shell —
AppSidebarLayout.tsxandsidebar/SidebarChrome.tsxkeep Marcode's no-opSidebarControland update-only footer; upstream'sSidebarBrand/T3Wordmark/footer nav would ship a second copy of controls FloatingPillNav already renders, andthreadSidebarWidth.test.tsasserts that removal.chat/ChatHeader.tsxkeeps the title-only header but takes upstream's remote-open imports.ui/tooltip.tsxkeeps Marcode's inlineFLOATING_SURFACE_Zstacking, which subsumes upstream'sz-[140]bump.Styling refactor followed, behaviour kept —
index.cssadopts upstream's nested@variant dark,@layer basestage-art defaults,alert-glassutility and theme-id palettes; Marcode's monochrome.stage-blueprintoverride is ported onto the renamed--stage-art-*tokens, and its dark palette, sidebar surface rules and floating chrome are kept. Upstream's class retirements were followed at their call sites (.chat-composer-glass→surface-glass,.workspace-titlebar-controlsand.chat-composer-horizontal-inset→ inline utilities) — those classes no longer exist, so keeping them would have been a silent no-op. Pull-request panels andUsagePagetake upstream'sButtonrefactor inside Marcode'sTooltipwrappers.Behaviour merged by hand
threadSettled.ts— combined upstream's newautoSettleOnMergesetting with Marcode's warm-window guard, so a merged/closed PR settles a thread only once it has gone idle. Upstream's new test was rewritten to the combined rule, plus a new test pinning the warm-window half.ThreadTerminalDrawer.tsx— Marcode keeps xterm (for its search addon) where upstream runs the Ghostty WASM surface, so upstream's two fixes were ported by hand rather than merged: right-click paste (fix(terminal): right-click paste works in the terminal pingdotgg/t3code#5240) and the Ctrl+C selection-clear guard (fix(web): add copying terminal selection with ctrl+c in the web app pingdotgg/t3code#5638). Ghostty'spasteFromClipboardrace claim has no xterm equivalent, so the same race is settled against the request id in the drawer, and the context menu binds to the mount element instead of a surface option.Branding/identity conflicts (
BitbucketSourceControlProvider,desktopUpdate.logic,ConnectionsSettings,MobileClientsUserProfilePage,_chat.pull-requests,README,AGENTS.md) all kept Marcode's product identity while taking the upstream fix in the same hunk — notably upstream'swindow.desktopBridgegate so the Connect toggle stops showing in the web app, and their removal of the Windows-only update warning (theplatformparameter is gone from every caller).mobile-showcase.test.tsandinfra/relay/scripts/deploy.test.tskeep the Marcode tests upstream deleted — they pin themarcode://scheme andMARCODE_RELAY_URL— with the imports upstream removed restored.pnpm-lock.yamlwas regenerated with pnpm, not hand-merged.Fork-boundary breaks that merged cleanly (no conflict)
These are the dangerous ones — they produced no marker and would have shipped silently. Two of the nine were caught by CI rather than by the pre-push sweep.
pair-client.sh— upstream's new mobile pairing helper usedT3CODE_PORT, thet3code-devscheme andcom.t3tools.t3code.dev. Marcode usesMARCODE_PORT,marcode-dev,com.t3tools.marcode.dev, so it could not have paired a single device. Fixed, along with three stalet3code-devreferences already sitting in that skill'sSKILL.md.release.ymlwiredpublish_aurinto the release pipeline. Marcode does not own thet3code-binAUR packages, and the PKGBUILDs fetch frompingdotgg/t3codereleases — a Marcode release would have failed on the missingAUR_SSH_PRIVATE_KEYor pushed upstream's package. Removed the call site only, leavingpublish-aur.ymlandpackaging/auruntouched so future syncs don't conflict on them, and addedscripts/release-fork-boundary.test.tsto pin the removal.DesktopWslServerTree.test.tsseeded its config layer withT3CODE_HOME/T3CODE_MODE(new upstream file, so no marker). Marcode readsMARCODE_HOME/MARCODE_MODE, somarcodeHomestayed unset, the desktop state dir resolved off the test's temp tree, and its sweep assertions never saw the directories they set up. Caught by CI — fixed in9bc1a299.isPublicFaviconHostguard tofaviconUrlForOrigin, so it stops sending private, loopback and reserved-TLD hostnames to Google's s2 favicon endpoint. That is a privacy fix and is kept — Marcode's unified workspace tree resolves URL-shortcut icons through the same helper, so it was leaking internal hostnames too. Its capability-flag test asserted a favicon for ahttp://localhost:3000shortcut, exactly the case upstream now refuses. Caught by CI — fixed incf90a76c, with a new test pinning the behaviour because the leak is invisible in the UI (the sidebar renders its globe fallback either way).T3ConnectUserProfilePage.tsx,T3ConnectSidebarSignIn.tsx). Rebranded to Marcode Connect; thet3-connectroute slug and file names stay upstream-shaped.t3-codeid is deliberately unchanged so upgrades don't reset anyone's theme.docs/user/mobile-appearance.mdrebranded to match.CONTRIBUTING.mdmoved to a Discussions-first model pointing atpingdotgg/t3code/discussions. Marcode tracks everything in its own Issues, so the issues-first wording is kept and the cross-repo contact link dropped.build-desktop-artifact.test.tshard-coded upstream'sproductNamein a new DMG assertion. Repointed at Marcode's.Verified still correct on purpose:
T3_BOOT_SERVICE_UNIT,T3_SERVICE_LAUNCHER_CONTEXT,@t3tools/*, thet3package name andt3code:storage keys remain upstream-shaped;MARCODE_HOMEstill drives the service launcher; not3code/<hex>branch fixtures leaked past the renamedWORKTREE_BRANCH_PREFIX. After #3, every file this merge touched was re-swept for aT3CODE_*name whoseMARCODE_*twin is what actually gets read — the only remaining mismatches are inelectron-launcher.mjsanddev-electron.mjs, both byte-identical tomainand listed under pre-existing findings below.Why
Scheduled upstream sync. The delta was too large to land as a clean auto-merge, and several of the resolutions are product decisions (which surface owns file editing, whether a merged PR buries a warm thread, which terminal implementation Marcode carries) rather than mechanical ones.
UI Changes
Not captured — the sync container has no display, and the touched surfaces (sidebar chrome, floating editor entry points, PR panels, terminal drawer, usage page, Connect account page) need a real client. Per the runbook this needs a
test-t3-apppass at 390px and 820px before the PR leaves draft.Checklist
Verification
CI is green on
cf90a76c— all four required checks passed:Check,Test,Mobile Native Static Analysis,Release Smoke(plusclaude-review). Thread transfer stays within every enforced ceiling.Native fingerprint diffis queued rather than complete; it is not a required check.Locally: typecheck clean across web, server, desktop, mobile, contracts, shared and client-runtime; the full web suite passes (274 files, 2795 tests);
vp fmt --checkandvp lintclean on the changed files and directories (warnings only, all pre-existing).Still unverified — please read before marking ready
ThreadTerminalDrawer.test.ts, but has never been exercised interactively against a real pty.One local-only failure, named so nobody chases it:
packages/sharedNet.test.ts› "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passespackages/sharedon this commit, and this merge only adds a method toNet.tswithout touchingfindAvailablePort.Pre-existing findings, deliberately not fixed here
Not caused by this merge; flagging rather than widening the diff:
build-desktop-artifact.tsregistersschemes: ["t3code", "t3code-dev"]andname: "T3 Code"for packaged Linux builds, while macOS usesmarcode. Changing it is an OAuth deep-link migration for existing installs, not a rename.electron-launcher.mjsanddev-electron.mjsforwardT3CODE_PORT,T3CODE_HOME,T3CODE_COMMIT_HASH,T3CODE_OTLP_*andT3CODE_DESKTOP_APP_USER_MODEL_ID, while the server andDesktopConfigread theMARCODE_*names. Same class of bug as upstream sync blocked: pingdotgg/t3code@6154b46cb86b #3 above, but it predates this merge.desktopUpdate.logic.tspointsDESKTOP_RELEASE_TAG_URLatpingdotgg/t3code/releases/tag.ThemePreviewCircles.tsxlabels the web standard theme "T3 Code" (the mobile twin was fixed here because this merge introduced it).docs/user/**still says "T3 Code" throughout, andinstall.mdpoints at upstream's Homebrew cask and AUR packages.