Skip to content

fix(server): worktree setup no longer hangs when the shell is Nushell - #29461

Merged
juliusmarminge merged 6 commits into
pingdotgg:mainfrom
KenDJohnson:t3/fix-nushell-setup-status
Nov 12, 2026
Merged

juliusmarminge merged 6 commits into
pingdotgg:mainfrom
KenDJohnson:t3/fix-nushell-setup-status

Conversation

@KenDJohnson

@KenDJohnson KenDJohnson commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Problem

When the setup terminal's shell is Nushell, worktree setup and settle actions never finish. T3 types a POSIX wrapper, ( <command> ); printf '\n<sentinel>%s\n' "$?", and nu passes "$?" to printf literally, so the terminal prints __T3_SETUP_DONE___<token>:$?, which never matches the numeric completion pattern. When the command fails, nu stops before printf and prints nothing. Either way, a synchronous setup holds the thread forever.

Fixes https://git.cafe/pingdotgg/t3code/issues/24423 (reported on Linux; reproduced here on macOS with T3 Code v0.1.6 and Nushell 0.116.1).

Change

ProjectSetupScriptRunner now treats nu as its own completion shell and wraps the action in Nushell syntax:

let __t3c = try {
<command>
0 } catch {|e| if $e.exit_code? == null { print -e $e.rendered }; $e.exit_code? | default 1 }; print $"\n<sentinel>($__t3c)"

Nu skips the rest of the input after a failing command, so the status print only runs behind try. A failing external reports its own exit code ($e.exit_code). Other errors (command not found, error make) report 1 and are printed, since catch would otherwise hide them.

Like zsh and fish, nu's line editor enables bracketed paste, so the command is still typed only after that signal. The readiness check now names the shells that lack the signal (PowerShell, cmd) instead of the ones that have it.

Scope and approval

https://git.cafe/pingdotgg/t3code/issues/24423 reports this bug; it has not been triaged yet. This is a small, focused fix for an obvious bug: one new case in the existing shell switch, plus keeping nu on the existing line-editor wait. Setup and settle actions, including thread launches from MCP and scheduled tasks, all go through this runner. No contract, client, or docs changes are needed.

Verification

  • A new case in ProjectSetupScriptRunner.test.ts checks that nu waits for its line editor and receives the Nushell wrapper. It fails on main, where nu gets ( vp i\r); printf … "$?", and passes here. Reverting only the readiness change also fails it, because the command is typed before the line editor starts. vp run check:changed passes.
  • Real Nushell 0.116.1 in a PTY on macOS, typing the generated wrapper into an interactive login shell with a full user config:
    • echo setup-ok → 0; node -e "process.exit(7)" → 7
    • unknown command → 1, with nu's error shown; error make {msg: "boom"} → 1
    • multi-line commands and a trailing # comment → 0
    • external stdout stays a TTY
  • End to end on a dev server (macOS, SHELL set to a Nushell login wrapper, Replay provider), with a synchronous setup action on a scrap repo, via t3 thread start --worktree main --wait:
main    echo setup-ok               setup terminal: __T3_SETUP_DONE___767656c2…:$?   thread start still waiting at the 45s timeout
branch  echo setup-ok               setup terminal: __T3_SETUP_DONE___45e5f29b…:0    replay turn runs, CLI exits 0
branch  node -e "process.exit(3)"   "stopped with status failed: … Setup script exited with 3."   CLI exits 1

Not checked: Nushell on Linux or Windows, and Nushell versions older than 0.116. Setup actions must still be valid Nushell: POSIX-only syntax such as a && b fails to parse, so no status is printed, the same as a syntax error in a POSIX shell.

Model and harness: Claude Opus 5.5 through Claude Code in T3 Code.

Fixes #24423

Setup and settle actions typed a POSIX completion wrapper into Nushell,
which passes "$?" to printf literally, so the completion marker never
carried an exit code and synchronous setup waited forever. Nushell now
gets its own wrapper that reports the exit code through try/catch.
@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Nov 2, 2026
@macroscopeapp

macroscopeapp Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 62528d0

Macroscope's review found this PR approvable — Adds Nushell-compatible completion and error reporting for existing project setup scripts, preventing completion tracking from hanging. The change leaves script selection, execution triggers, and other shells’ behavior unchanged.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • Resume reviews
  • Trigger review

No actionable comments were generated in the recent review.

Walkthrough

The setup runner recognizes Nushell and wraps setup commands with Nushell-specific completion and exit-status handling. It waits for shell readiness before writing the wrapper. Tests cover default and custom commands, including special characters.

Changes: Nushell setup completion

Layer / File(s) Summary
Nushell completion flow
apps/server/src/project/ProjectSetupScriptRunner.ts, apps/server/src/project/ProjectSetupScriptRunner.test.ts
The runner maps nu to Nushell and waits for shell readiness before writing a Nushell-specific wrapper. The wrapper runs the command from the worktree, captures its exit status, attempts to remove its temporary script, and emits a completion sentinel. The test harness accepts a custom command and tests readiness and escaping.

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix · Severity of issue fixed: Medium

Sequence Diagram(s)

sequenceDiagram
  participant ProjectSetupScriptRunner
  participant Nushell
  participant SetupCommand
  Nushell->>ProjectSetupScriptRunner: Emit readiness marker
  ProjectSetupScriptRunner->>Nushell: Write completion wrapper
  Nushell->>SetupCommand: Run setup command
  Nushell->>ProjectSetupScriptRunner: Emit completion sentinel and exit status
Loading

Possibly related issues

  • pingdotgg/t3code#32556: Reports a fish setup command waiting indefinitely for a completion marker. This change does not add a fish wrapper or timeout.

Possibly related PRs

Suggested labels: bugfix

Suggested reviewers: t3dotgg

Merge Risk: Minimal · up to 893a6

Nushell setup commands now report completion and exit status instead of hanging. One narrow limitation remains: setup commands that rely on definitions loaded from Nushell autoload directories will fail in the setup shell, and users can work around it by defining them in config.nu. This does not block merging.

Pre-merge checks: Passed 4

Check name Status Explanation
Title check Passed The title names the main change: worktree setup no longer hangs when the shell is Nushell. It matches the summary and objectives, which add a Nushell completion wrapper and a readiness change in Proje…
Description check Passed The description follows the template. It has Problem, Change, Scope, and Verification sections, plus the model and harness line. The Problem section gives the failure mode and reproduction context. Th…
Linked Issues check Passed Objective [#24423]: with a Nushell setup terminal, the setup command must run and T3 must record its exit status without waiting for a marker that never matches.

Evidence at the reviewed head 893a673…
Out of Scope Changes check Passed All changed hunks connect to the Nushell completion fix for #24423:
- ProjectSetupScriptRunner.ts: the nu detection case, the nushell wrapper case, the readiness condition, and the bracketed-pas…
Full details: Title check

Explanation

The title names the main change: worktree setup no longer hangs when the shell is Nushell. It matches the summary and objectives, which add a Nushell completion wrapper and a readiness change in ProjectSetupScriptRunner. The title is a conventional commit with a clear scope, so it is specific enough for a teammate scanning history.

Full details: Description check

Explanation

The description follows the template. It has Problem, Change, Scope, and Verification sections, plus the model and harness line. The Problem section gives the failure mode and reproduction context. The Change section explains the Nushell wrapper and the readiness change. The Scope section links issue 24423 and explains why no triage is needed. The Verification section lists focused tests, real PTY checks on Nushell 0.116.1, an end-to-end run, and unchecked areas. The Problem section does not state an expected behavior explicitly, but the wording implies it. The description is complete enough to pass.

Full details: Linked Issues check

Explanation

Objective [#24423]: with a Nushell setup terminal, the setup command must run and T3 must record its exit status without waiting for a marker that never matches.

Evidence at the reviewed head 893a673 (merge base d8f3fef):

  • resolveCompletionShell maps nu to a new nushell case. Before this PR, nu mapped to posix.
  • wrapCommandForCompletion, nushell case: the wrapper sets $env.LAST_EXIT_CODE = 0, creates a temporary .nu file in $env.T3CODE_WORKTREE_PATH, writes the escaped command to it, and runs ^$nu.current-exe --login --commands with cd and source. A catch sets the status to 1 when it is still 0. The wrapper then removes the file and prints \n&lt;sentinel&gt;($__t3c). The sentinel is numeric, so the completion pattern can match it. A failing command does not stop the final print.
  • Readiness: the condition is now completionShell === "powershell" || completionShell === null for bypassing the wait. Nushell therefore waits for the line editor, as the PR description states.
  • ProjectSetupScriptRunner.test.ts keeps an escaped Nushell case. It checks that nothing is typed before \x1b[?2004h. It then checks the exact wrapper text for multi-line, quoted, and control-character input.

Differences to record: the PR description shows an inline let __t3c = try { ... } wrapper. The code at head uses the temporary-file wrapper. The description is stale for the wrapper form, so I used the head code as evidence. The PR summary and raw summary also differ from the head code in places. I used the head code as the evidence for this assessment.

Not verified by me: Nushell runtime behavior of mktemp, save --force --raw, source, nested exit-code propagation, and the $env.LAST_EXIT_CODE update after an external failure. The unit test confirms emitted text and the readiness wait, not Nushell runtime results. The PR reports macOS PTY and end-to-end runs, and a comment reports a Linux VM run. I did not reproduce those runs.

The optional explicit project-script shell in #24423 is an alternative, not a requirement. The PR objectives state that it is not in scope.

Full details: Out of Scope Changes check

Explanation

All changed hunks connect to the Nushell completion fix for #24423:

  • ProjectSetupScriptRunner.ts: the nu detection case, the nushell wrapper case, the readiness condition, and the bracketed-paste comment that lists nu.
  • ProjectSetupScriptRunner.test.ts: the optional command harness parameter and closeOnSettle stub, which support the Nushell test, and the consolidated Nushell test. The last commit removes a plain and an import-only Nushell case that the escaping case covers.

The temporary .nu file in the worktree is part of the Nushell wrapper. The PR objectives say it keeps relative source and use imports resolved from the worktree. The wrapper removes it after the run and on preparation errors, so this is not unrelated scope.

No contract, client, docs, or unrelated server changes appear in the diffs for these two files. Other changed paths were not inspected.

Finishing Touches

Generate unit tests (beta)

  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info

Run configuration

Commits

Reviewing files that changed from the base of the PR and between 4f7dc60 and 893a673.

Files selected for processing: 2

  • apps/server/src/project/ProjectSetupScriptRunner.test.ts
  • apps/server/src/project/ProjectSetupScriptRunner.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.

@coderabbitai coderabbitai Bot 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.

  • Fix comments: Fix CodeRabbit comments on this PR

Run observed scripts in a child of the current Nushell executable, loading
its login configuration. The parent reports LAST_EXIT_CODE after the child
finishes, including explicit exit commands, without relying on catch-record
fields that differ between Nushell versions.

Extend the existing mocked-terminal test to assert the complete wrapper,
including the failure fallback, sentinel, and quoting of multiline input.
The expanded test fails before the change.

Validation: vp run check:changed passes. Real PTY verification passed 40
cases across Nu 0.97.1, 0.98.0, 0.99.1, and 0.116.1 on macOS:

  echo setup-ok                     -> completion sentinel:0
  node -e "process.exit(7)"          -> completion sentinel:7
  open /t3-review-does-not-exist     -> error shown, completion sentinel:1
  error make {msg: "boom"}           -> error shown, completion sentinel:1
  exit 0                            -> completion sentinel:0
  exit 7                            -> completion sentinel:7

Configured commands, multiline input, quoting, and stdin/stdout/stderr TTY
behavior also passed on each version.

Model and harness: GPT-6.1 Sol through Codex in T3 Code.

@coderabbitai coderabbitai Bot 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.

  • Fix comments: Fix CodeRabbit comments on this PR

@maria-rcks

maria-rcks commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-6.1-sol on behalf of Maria

Verified in a real dev environment

verified on a linux boat vm with nushell 0.116.1, the dev web client in /usr/bin/google-chrome driven by the repo's playwright, and real codex gpt-6.1-sol turns. created a real git project, imported its synchronous setup action through the client, and launched worktree threads through the running server's t3 thread start --worktree main --wait path. no mocks, fixtures, or replay provider.

  • github/main at c3cfb5e1e3: setup printed setup-ok and returned to the prompt, but the completion marker ended in literal $?. the client remained on "setting up worktree" and codex did not start. stopped the baseline after reproducing this failure.
  • original pr head 31a7e9e00d: normal setup completed and codex read the output file. reproduced the review's directory bug with login.nu changing directory: setup reported success but wrote outside the worktree, and codex found the file missing.
  • fixed and pushed 7f9ac5916e for login-directory changes. further runtime verification found parser-time source resolution still used the login directory. the contributor addressed that in 4f7dc60f184e840e6bcc4c6169c411dee8b1b96d, which is the verified final head.
  • final head: with login.nu changing directory and a conflicting setup.nu in that directory, source ./setup.nu and use ./module.nu module-ok load the worktree's files. a command defined in config.nu also works. codex reads source-cwd.txt, and its contents match the new worktree and provider cwd.
  • neighboring behavior: exit 7 fails setup with status 7; error make fails with status 1. neither starts codex. multiline input, quotes, and a trailing comment complete with status 0. settling through the client runs the settle action and emits status 0.
  • setup runs git add -A: only source-cwd.txt is staged, with no .t3-setup-* file staged or left behind. the temporary script deletes itself before user commands run.
  • exact final wrapper also exercised directly with nushell 0.97.1: relative source/module imports succeed, exit 7 emits 7, and a native error emits 1. full app verification used 0.116.1.
  • blacksmith on the final head: vp run check:changed edc37c96c810d42761ab510c6a3e9d0a741547dc passed format, lint, knip, graphql, affected typechecks, and 12 tests in 2 files. cafe reports 28 successful checks and none pending or failing.

short runtime transcript:

main: setup-ok; __T3_SETUP_DONE___<token>:$?; thread remains preparing
final setup: source-from-worktree; module-from-worktree; configured-command
final setup: source-cwd.txt; quoted; __T3_SETUP_DONE___<token>:0
codex: source-cwd.txt and cwd = .../worktrees/nu-verification/verify-latest-source
codex: provider-ok
exit 7: Workspace preparation failed ... Setup script exited with 7.
error make: Workspace preparation failed ... Setup script exited with 1.
client settle: settled=true; __T3_SETUP_DONE___<token>:0
staged files: source-cwd.txt

before on main:

main hangs after successful nushell setup

after on the final head:

real codex reads setup output from the correct worktree and client settles

real codex turn completes and the client settles the thread

inspected the screenshots and recording, and exercised uploaded video playback and seeking.

Not verified

native desktop, ios, android, macos, windows, and scheduled-task launches were not exercised on this linux vm. older nushell received direct wrapper checks rather than a full client/provider pass. no performance comparison is claimed.

@coderabbitai coderabbitai Bot 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.

  • Fix comments: Fix CodeRabbit comments on this PR

Nushell parses --commands before evaluating its leading cd. If login.nu
changes directories, relative source and use statements can select files
from the login directory even when the action runs in the worktree.

Use Nu's mktemp, save, to nuon, source, and rm commands to load the action
from a temporary .nu file in the worktree. Relative imports resolve against
that file's directory, and the child retains the user's login definitions.
Remove the file before the action runs so it does not appear in git status;
clean it up in the parent when parsing fails. Preparation errors still
report a numeric completion status. Guard null catch arguments on older Nu.

Extend the existing mocked-terminal table with source/use input and assert
the complete native wrapper. The expanded assertion fails before the fix.
vp run check:changed passes, including 12 tests in two affected files.

Runtime: 60 PTY cases and eight preparation-failure cases passed on macOS
with Nushell 0.97.1, 0.98.0, 0.99.1, and 0.116.1. Login startup changes cwd;
both directories contain conflicting setup.nu and module.nu files:

  before: source ./setup.nu           -> SOURCE-WRONG, status 0
  before: use ./module.nu *; location -> MODULE-WRONG, status 0
  after:  source ./setup.nu           -> SOURCE-WORKTREE, status 0
  after:  use ./module.nu *; location -> MODULE-WORKTREE, status 0
  file present only in login cwd     -> diagnostic, status 1, no leftover
  exit 0 / exit 7 / error make        -> statuses 0 / 7 / 1

Nested imports, login-defined commands, multiline quoting, paths with spaces
and quotes, TTY input/output, and cleanup passed. Creation and save errors
show diagnostics and report status 1 without running the action.

Model and harness: GPT-6.1 Sol through Codex in T3 Code.
@KenDJohnson

Copy link
Copy Markdown
Contributor Author

@maria-rcks thanks for the review and tests on this, anything else that needs to happen here?

The plain and import-only cases repeat what the escaping case already
checks.

AI-assisted; verified with the tests and tools listed above.
@juliusmarminge

Copy link
Copy Markdown
Member

Evidence

Linux, Nushell 0.117.0, Chromium at 1280×800, light theme, fresh synthetic state. With SHELL pointing directly to Nushell, configure a synchronous worktree setup action, create a worktree thread, and inspect setup and its terminal. Repeat with echo setup-ok and node -e "process.exit(7)".

Before After
d8f3feff0c 893a673dd7
Before recording After recording
Success marker ends in literal $?; failure has no completion marker. Both threads remain on setup after 30 seconds. Success marker ends in :0 and the agent replies. Failure marker ends in :7 and setup promptly reports status 7.

Scenario driver · Required environment inheritance · Nushell prompt configuration · Reproduction instructions

Recordings are the primary evidence because this defect involves a live setup wait. AI-assisted; verified with the tests and tools listed above.

Not shown:

  • Import-only and escaping-sensitive Nushell setup commands were not exercised; these recordings cover the two requested commands.

@juliusmarminge
juliusmarminge merged commit 12a62ed into pingdotgg:main Nov 12, 2026
30 checks passed
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Nov 13, 2026
**v0.1.10-nightly.20261113.4616** · 143 changes from 68 contributors

- **Keep agents working.** Your computer stays awake while agents are running, preventing sleep from interrupting their work.
- **Codex cyber access.** Choose Standard or Daybreak cyber access for eligible Codex models.
- **Check secret references.** Verify a saved secret reference in Settings before starting a provider.
- **Faster Usage page.** See cost and token figures immediately while Usage refreshes them in the background.
- **Faster terminal opening.** Terminals with large histories attach faster over slow connections.
- **Preserve local PR commits.** Opening a pull request in a new worktree no longer drops unpushed commits on its local branch.
- **Protect nested repositories.** Worktree cleanup now preserves worktrees containing nested repositories and their uncommitted files.

### Plus 127 more bug fixes and performance improvements.

<details>
<summary>Full changelog</summary>

## What's Changed
* perf(usage): the Usage page shows cost and tokens at once instead of after a full scan by @Bil0000 in pingdotgg/t3code#33993
* feat(codex): choose a cyber access program for Daybreak-eligible models by @Mezzle in pingdotgg/t3code#27928
* fix(web): command palette footer hints wrap instead of clipping on narrow viewports by @imluckii in pingdotgg/t3code#29288
* feat(secrets): check a secret reference before saving it by @yordis in pingdotgg/t3code#31723
* fix(server): the Welcome page offers repositories you only worked on in worktrees by @dominikzabcik in pingdotgg/t3code#33923
* fix(web): a branch picked right after opening the picker no longer waits for its status read by @Yuruzuu in pingdotgg/t3code#33877
* perf(server): status refresh on a fork's default branch is 2.5x faster (median 7,826 to 3,168 ms) by @Yuruzuu in pingdotgg/t3code#33954
* fix(server): agents can see a thread's pending background work by @fjooord in pingdotgg/t3code#33858
* fix(ssh): timed-out SSH commands keep the output they already printed by @juliusmarminge in pingdotgg/t3code#35589
* fix(server): worktree dev servers no longer clean up real worktrees by @Lenoridev in pingdotgg/t3code#33902
* fix(server): server updates retry when a release download fails briefly by @shivamhwp in pingdotgg/t3code#33896
* fix(server): dev database seed no longer runs settle scripts in real worktrees by @Lenoridev in pingdotgg/t3code#33908
* perf(server): avoid loading provider drivers for terminal imports by @Adamulek123 in pingdotgg/t3code#33898
* fix(web): queued message preview keeps inline image labels in place by @Ragulsundaram in pingdotgg/t3code#33405
* fix(web): project settings can reach each checkout on one environment by @EmanuelMedinaAraujo in pingdotgg/t3code#29441
* perf(server,client): attaching to a terminal with a large history over a slow link drops from 5,555 ms to 751 ms median (7.4x) by @Yuruzuu in pingdotgg/t3code#33942
* fix(server): PR sync reads share GitHub requests again on busy servers by @only21mil in pingdotgg/t3code#28422
* ci: pin GitHub Actions to full commit SHAs by @yordis in pingdotgg/t3code#33696
* fix(mcp): answer MCP 2026-07-28 discovery instead of a 400 by @Phicks-debug in pingdotgg/t3code#28683
* fix(server): a server published through Tailscale Serve no longer reports itself as local-only by @juliusmarminge in pingdotgg/t3code#35543
* perf(server): save large agent recordings faster by @Yuruzuu in pingdotgg/t3code#33930
* fix(web): hand-started t3 servers get an update command that updates them by @hieu-lee in pingdotgg/t3code#29462
* fix(web): Select All then Copy in a read-only file preview copies the whole file by @whoisaldo in pingdotgg/t3code#33903
* perf(web): PDF Find jumps to the first match in long PDFs 3.1x faster (median) by @Yuruzuu in pingdotgg/t3code#33956
* fix(mobile): Keep a tall question's Submit button above Android's navigation bar by @mwolson in pingdotgg/t3code#33929
* fix(web): choosing a project icon again re-reads it from disk by @AlexSandilands in pingdotgg/t3code#28584
* fix(web): sidebar keeps the open thread active while Settings or Usage is open by @Mnigos in pingdotgg/t3code#28703
* fix(web): gitignore fences in the rich-text composer highlight as ini, as chat does by @juliusmarminge in pingdotgg/t3code#35603
* fix(web): keep later navigation when thread deletion completes by @Edge358 in pingdotgg/t3code#33953
* fix(server): Git status finds the default branch when the only remote isn't origin by @only21mil in pingdotgg/t3code#28815
* fix(pi): settle prompts consumed by input handlers by @Chinoman10 in pingdotgg/t3code#28798
* fix(cursor): honor HTTP/1.1 transport for proxy networks by @only21mil in pingdotgg/t3code#25338
* fix(client): hide Resume while a pending request blocks continuing the run by @only21mil in pingdotgg/t3code#28810
* fix(server): t3 doctor holds off server launches and names the holder by @only21mil in pingdotgg/t3code#24963
* fix(server): preserve filename whitespace when reading and saving files by @voltcrash in pingdotgg/t3code#29314
* fix(server): tool calls a released session cuts off no longer keep the thread Waiting by @NotReliable in pingdotgg/t3code#29036
* fix(server): keep thread tool responses small by default by @voltcrash in pingdotgg/t3code#29268
* fix(web): a chunk that fails after boot no longer reloads the page in a loop by @grodriguez-fr in pingdotgg/t3code#29306
* fix(opencode): keep ACP question choices and fold the custom answer by @QRpeachKZ in pingdotgg/t3code#25879
* fix(web): sent messages honor their theme foreground by @fancyboi999 in pingdotgg/t3code#26888
* perf(ci): run server test files in parallel on each shard by @juliusmarminge in pingdotgg/t3code#35618
* chore(deps): bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in pingdotgg/t3code#33945
* fix(server): keep worktrees containing nested repositories by @maria-rcks in pingdotgg/t3code#25241
* fix(shared): Windows-style paths stay out of the slash menu by @samkelly880 in pingdotgg/t3code#27851
* fix(acp): let agents that advertise /compact compact their own context by @ParasN in pingdotgg/t3code#28822
* test(acp-registry): subscribe to snapshot changes before triggering them by @juliusmarminge in pingdotgg/t3code#35627
* fix(web): diff colors follow appearance contrast by @voltcrash in pingdotgg/t3code#28947
* fix(web): keep the child thread open when its remote parent was deleted by @ScottN-PV in pingdotgg/t3code#27436
* fix(desktop): poll for updates every 4 hours, not 4 minutes by @tao12345666333 in pingdotgg/t3code#28481
* fix(usage): bill Codex requests whose cumulative counters rewind to an earlier snapshot by @jokaperes in pingdotgg/t3code#29366
* fix(server): persist terminal output without rewriting all history by @nateEc in pingdotgg/t3code#24019
* perf(server): stop serializing terminal chunks just to measure them by @bompus in pingdotgg/t3code#24179
* fix(web): stop opening a menu when a terminal selection ends by @fixfon in pingdotgg/t3code#24112
* fix(server): agents keep named browser profiles after a server restart by @only21mil in pingdotgg/t3code#23484
* fix(web): reveal full composer command descriptions by @voltcrash in pingdotgg/t3code#27414
* fix(server): restart the service after T3 home ownership clears by @maria-rcks in pingdotgg/t3code#25237
* fix(web): Enter on an empty prompt resumes an interrupted thread by @toni92-beep in pingdotgg/t3code#27079
* fix(shared): token counts just below a unit boundary use the next unit by @juliusmarminge in pingdotgg/t3code#35634
* fix(desktop): long annotation strokes stay cheap to draw by @only21mil in pingdotgg/t3code#24573
* fix(ssh): load remote profiles with the account login shell by @nabettu in pingdotgg/t3code#23934
* fix(server): terminals recreate a worktree removed by storage cleanup by @TonybynMp4 in pingdotgg/t3code#24156
* test(web): Mod+E bold-word test no longer drops its first arrow key by @juliusmarminge in pingdotgg/t3code#35646
* fix(server): access list keeps changes made while its stream opens by @juliusmarminge in pingdotgg/t3code#35640
* fix(server): a failed Git version probe no longer advises installing Git by @juliusmarminge in pingdotgg/t3code#35638
* fix(server): PR worktrees keep local commits on an existing branch by @only21mil in pingdotgg/t3code#24674
* fix(web): branch labels keep the space before a middle-truncated name by @guryanov-a in pingdotgg/t3code#23627
* fix(server): stale provider update results clear once the provider is up to date by @fixfon in pingdotgg/t3code#24338
* perf(server): merged-PR threads no longer re-read git state every minute by @Batuhan1999 in pingdotgg/t3code#24099
* fix(server): pending request reads keep question option previews by @juliusmarminge in pingdotgg/t3code#35644
* fix(opencode): preserve owned turns during server recovery by @maria-rcks in pingdotgg/t3code#25596
* fix(server): baseline existing pull request checks when watching by @vkpdeveloper in pingdotgg/t3code#23522
* fix(server): saved preview snapshot failures name the screenshot destination by @juliusmarminge in pingdotgg/t3code#35649
* fix(ssh): distinguish incompatible Node from a missing executable by @MasonNight in pingdotgg/t3code#35607
* fix(pi): stop offering extension-only models for text generation by @only21mil in pingdotgg/t3code#24110
* fix(server): new worktrees show submodule downloads instead of a stuck checkout by @GuardedAirplane in pingdotgg/t3code#33687
* fix(web): restore composer focus when returning to a thread by @voltcrash in pingdotgg/t3code#29179
* fix(server): linked calls fail fast when a peer stalls the MCP handshake by @only21mil in pingdotgg/t3code#28876
* fix(web,mobile): keep line breaks in pending question text by @StiensWout in pingdotgg/t3code#33353
* fix(mobile): opening a search result clears Home's search on iPhone by @only21mil in pingdotgg/t3code#28324
* fix(desktop): Escape during IME composition no longer cancels a preview annotation by @juliusmarminge in pingdotgg/t3code#35645
* fix(web): a click no longer lands on the sidebar row that just slid under it by @mkantautas in pingdotgg/t3code#23517
* fix(mcp): background wait fails when none of its task IDs exist by @onlydole in pingdotgg/t3code#29773
* fix(web): the collapsed mobile composer shows Stop while a turn runs by @TanJeeSchuan in pingdotgg/t3code#29959
* test(web): split the cloud voice cancel flow from the failed-then-saved setup by @juliusmarminge in pingdotgg/t3code#35665
* fix(desktop): nightly updates no longer depend on GitHub's tag order by @t3dotgg in pingdotgg/t3code#35599
* fix(web): PDF preview prerenders pages two viewports below the visible area by @juliusmarminge in pingdotgg/t3code#35666
* perf(server): uploading a large document with seven notebooks finishes 1.8x faster (median 823 ms -> 461 ms) by @Yuruzuu in pingdotgg/t3code#33946
* Typeset equations that fail only because of an unescaped percent by @meutex in pingdotgg/t3code#29511
* fix(server): wake PR watches when the merge queue drops a pull request by @only21mil in pingdotgg/t3code#24141
* fix(web): legacy collapsed project folders stay collapsed after a save by @juliusmarminge in pingdotgg/t3code#35659
* fix(server): explain how to close unclaimed browser tabs by @voltcrash in pingdotgg/t3code#29205
* fix(editors): JetBrains IDEs open file links in the thread's project by @only21mil in pingdotgg/t3code#33558
* fix(mobile): select part of a source file's text on iOS by @binjamshid in pingdotgg/t3code#33218
* fix(mobile): show loading until existing threads are known by @shivamhwp in pingdotgg/t3code#28663
* fix(web): streamed device toolbar starts at the panel size by @juliusmarminge in pingdotgg/t3code#35664
* fix(acp): preserve OMP single-choice questions and custom answers by @nateEc in pingdotgg/t3code#24012
* fix(server): workspace search leaves out files Git ignores outside .gitignore by @juliusmarminge in pingdotgg/t3code#35673
* fix(server): worktree setup no longer hangs when the shell is Nushell by @KenDJohnson in pingdotgg/t3code#29461
* fix(secrets): notify when a delegated agent asks for a secret by @zmievsa in pingdotgg/t3code#33585
* fix(web): Cursor threads keep a stored model the catalog doesn't list by @only21mil in pingdotgg/t3code#24872
* fix(server): workspace search keeps backslashes in POSIX file names by @juliusmarminge in pingdotgg/t3code#35672
* fix(provider): make readiness probe timeouts configurable by @johanjohnthomas in pingdotgg/t3code#33275
* fix(cursor): mcp.json servers using ${workspaceFolder} now start by @only21mil in pingdotgg/t3code#24505
* fix(server): workspace search ignore filter follows the host path separator by @juliusmarminge in pingdotgg/t3code#35697
* fix(server): t3 uninstall names another home's service it leaves installed by @juliusmarminge in pingdotgg/t3code#35684
* fix(client-runtime): long MCP app download names no longer split an emoji by @juliusmarminge in pingdotgg/t3code#35680
* fix(web): collapsed reasoning previews no longer split an emoji by @juliusmarminge in pingdotgg/t3code#35677
* fix(web): a question answer restored with undo is no longer sent twice by @ixmxvii-hash in pingdotgg/t3code#35574
* fix(server): reject PR watches when hosting dependencies are unavailable by @complynx in pingdotgg/t3code#33389
* fix(chat): requeued steers no longer look delivered by @Alb11747 in pingdotgg/t3code#23420
* fix(web): reuse timeline rows while thinking and plans stream by @Batuhan1999 in pingdotgg/t3code#24121
* fix(mobile): Back from a PR opened in a chat returns to the chat on Android by @bitmvk in pingdotgg/t3code#27653
* fix(mobile): tall iOS code blocks with long lines show their code by @Muzammil-Bit in pingdotgg/t3code#33243
* fix(mobile): refreshing a review diff keeps unfolded files open by @juliusmarminge in pingdotgg/t3code#35682
* fix(server): snooze no longer waits two minutes after a steered queued message by @juliusmarminge in pingdotgg/t3code#35661
* test(server): count leaked PR cache caller data without WeakRefs by @juliusmarminge in pingdotgg/t3code#35694
* fix(cli): t3 pair's protocol mismatch hint keeps --base-dir by @juliusmarminge in pingdotgg/t3code#35690
* fix(web): a dismissed provider banner stays dismissed when you switch threads by @torztomasz in pingdotgg/t3code#25513
* fix(cli): t3 status no longer suggests --no-lan under a T3CODE_HOST override by @juliusmarminge in pingdotgg/t3code#35691
* fix(desktop): wait for the server's database upgrade instead of reporting a failed start by @juliusmarminge in pingdotgg/t3code#35056
* fix(server): a C# dictionary term no longer rewrites standalone letters by @juliusmarminge in pingdotgg/t3code#35700
* fix(client-runtime): last user message sort ignores agent-posted messages by @juliusmarminge in pingdotgg/t3code#33873
* fix(web): long screen-reader announcements keep emoji whole at the cutoff by @juliusmarminge in pingdotgg/t3code#35681
* fix(server): Claude context meter honours CLAUDE_CODE_AUTO_COMPACT_WINDOW by @juliusmarminge in pingdotgg/t3code#33806
* feat(server): watched GitHub pull requests react when a check suite completes by @juliusmarminge in pingdotgg/t3code#35709
* fix(web): triple-click selects the whole line around links and file chips by @juliusmarminge in pingdotgg/t3code#32334
* fix(projects): preserve grouped renames to repository names by @maria-rcks in pingdotgg/t3code#25244
* fix(acp): agents get T3's runtime notes once per session, not on every message by @Radu028 in pingdotgg/t3code#26959
* feat(server): keep the computer awake while agents work by @juliusmarminge in pingdotgg/t3code#34128
* fix(web): find scheduled tasks in Settings search by @juliusmarminge in pingdotgg/t3code#35715
* fix(preview): bound stalled screenshot captures by @cabamarcos in pingdotgg/t3code#25862
* test(server): idle-resume replays wait for the session release before the next prompt by @juliusmarminge in pingdotgg/t3code#35720
* fix(server): archive refuses a thread with running delegated tasks by @SouthCarpet in pingdotgg/t3code#26078
* fix(web): minimap Next turn no longer sticks on adjacent user messages by @juliusmarminge in pingdotgg/t3code#33036
* fix(server): Claude background commands show how long they have run by @SunkenInTime in pingdotgg/t3code#26668
* fix(server): honor worktree prefixes when automatic naming fails by @juliusmarminge in pingdotgg/t3code#35718
* fix(git): refuse remote switches that would silently detach HEAD by @Kirat0201 in pingdotgg/t3code#35687
* fix(mobile): retain inline image zoom on iOS by @saphid in pingdotgg/t3code#33852
* fix(server): Claude's auto-compact setting now wins over CLAUDE_CODE_AUTO_COMPACT_WINDOW by @juliusmarminge in pingdotgg/t3code#35737
* fix(desktop): an SSH reconnect during a desktop update no longer locks the updated app out of its T3 home by @ajbarryiii in pingdotgg/t3code#26191
* fix(web): auto-balanced drafts recheck machine load before sending by @juliusmarminge in pingdotgg/t3code#35658
* fix(web): screen readers at Everything hear context compaction start by @juliusmarminge in pingdotgg/t3code#35739
* fix(server): t3_thread_read returns the newest items and fits in agent context by @darjss in pingdotgg/t3code#33428

## New Contributors
* @Mezzle made their first contribution in pingdotgg/t3code#27928
* @imluckii made their first contribution in pingdotgg/t3code#29288
* @dominikzabcik made their first contribution in pingdotgg/t3code#33923
* @fjooord made their first contribution in pingdotgg/t3code#33858
* @Ragulsundaram made their first contribution in pingdotgg/t3code#33405
* @EmanuelMedinaAraujo made their first contribution in pingdotgg/t3code#29441
* @Phicks-debug made their first contribution in pingdotgg/t3code#28683
* @AlexSandilands made their first contribution in pingdotgg/t3code#28584
* @Edge358 made their first contribution in pingdotgg/t3code#33953
* @Chinoman10 made their first contribution in pingdotgg/t3code#28798
* @NotReliable made their first contribution in pingdotgg/t3code#29036
* @grodriguez-fr made their first contribution in pingdotgg/t3code#29306
* @QRpeachKZ made their first contribution in pingdotgg/t3code#25879
* @fancyboi999 made their first contribution in pingdotgg/t3code#26888
* @ParasN made their first contribution in pingdotgg/t3code#28822
* @tao12345666333 made their first contribution in pingdotgg/t3code#28481
* @jokaperes made their first contribution in pingdotgg/t3code#29366
* @guryanov-a made their first contribution in pingdotgg/t3code#23627
* @vkpdeveloper made their first contribution in pingdotgg/t3code#23522
* @MasonNight made their first contribution in pingdotgg/t3code#35607
* @GuardedAirplane made their first contribution in pingdotgg/t3code#33687
* @meutex made their first contribution in pingdotgg/t3code#29511
* @KenDJohnson made their first contribution in pingdotgg/t3code#29461
* @zmievsa made their first contribution in pingdotgg/t3code#33585
* @johanjohnthomas made their first contribution in pingdotgg/t3code#33275
* @complynx made their first contribution in pingdotgg/t3code#33389
* @torztomasz made their first contribution in pingdotgg/t3code#25513
* @cabamarcos made their first contribution in pingdotgg/t3code#25862
* @ajbarryiii made their first contribution in pingdotgg/t3code#26191

**Full Changelog**: pingdotgg/t3code@v0.1.10-nightly.20261112.4606...v0.1.10-nightly.20261113.4616

</details>


Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.10-nightly.20261113.4616
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S 10-29 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Worktree setup fails with Nushell because completion tracking uses POSIX syntax

3 participants