Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
126 commits
Select commit Hold shift + click to select a range
beab688
fix(web): import dependency-heavy Open VSX themes (#7642)
t3-code[bot] Aug 20, 2026
8824f8f
fix(web): retry failed thread bootstraps with a fresh id (#7664)
SunkenInTime Aug 20, 2026
21e80a0
fix(web): copy terminal selection instead of a blank clipboard (#7678)
sethwebster Aug 20, 2026
aa17ec6
revert(web): restore sparse hourly usage breakdown (#7718)
t3-code[bot] Aug 20, 2026
0929907
fix(server): reconcile orphaned provider sessions (#7719)
t3-code[bot] Aug 20, 2026
490f48e
fix(web): fix subagent row left border being cut off (#7207)
sameerr03 Aug 20, 2026
cd14b3e
fix(web): unify composer control rounding (#5957)
kototok903 Aug 20, 2026
5ff5f73
fix(web): show pointer on add project button (#5545)
incognitojam Aug 20, 2026
730ce9e
fix(server): enable the Cursor provider by default like every other p…
Rishet11 Aug 20, 2026
1afe554
fix(web): fix thread jumping after reorder (#7103)
ipanasenko Aug 20, 2026
4bdbd8c
fix(server): keep Daybreak models out of legacy models (#7659)
cn0ss Aug 20, 2026
fe87502
fix(contracts): reconcile provider default tests (#7725)
t3-code[bot] Aug 20, 2026
f0fb83a
fix(web): polish theme library buttons, search, and import dialog (#7…
UtkarshUsername Aug 20, 2026
7107a98
chore: vouch Seth Webster and pcstyle (#7728)
t3dotgg Aug 20, 2026
68966c1
fix(web): add space above composer task tabs (#7740)
Bil0000 Aug 21, 2026
e723501
feat(composer): list skills with slash commands (#7737)
maria-rcks Aug 21, 2026
6d3bf01
fix(web): show the full path in file link tooltips (#7741)
s243a Aug 21, 2026
820e563
fix(server): serve html assets with utf-8 charset (#6409)
talkingdonkeyz Aug 21, 2026
12c4970
fix(vcs): give `git worktree add` a longer timeout on large repos (#6…
ChamaruAmasara Aug 21, 2026
9167622
chore: move implementation plans out of repository (#7665)
t3-code[bot] Aug 21, 2026
45a2c4b
Update user count in AGENTS.md (#7658)
saphid Aug 21, 2026
20e5a33
fix(desktop): restrict editor deep links (#7697)
Lucenx9 Aug 21, 2026
6d5c6c4
fix(web): prevent pinned threads reshuffling after drop (#7676)
tarik02 Aug 21, 2026
18f6d03
fix(web): encode shifted characters correctly in the terminal (#7485)
chrisdeeming Aug 21, 2026
f3fcfe1
fix(web): resolve sidebar provider icons from the thread's own enviro…
vitalyiegorov Aug 21, 2026
ce8ca5b
fix(web): hide thread jump hints while the terminal is focused (#7277)
lnieuwenhuis Aug 21, 2026
e2697d6
fix(web): keep following the stream after scrolling back to the live …
lnieuwenhuis Aug 21, 2026
d7b9a68
perf(ci): parallelize the test suite and split out Rust checks (#7286)
t3dotgg Aug 21, 2026
8f7da3b
ci: only boot the macOS native lint runner when native sources change…
t3dotgg Aug 21, 2026
9f12eab
chore: stop committing pull request assets (#7762)
t3-code[bot] Aug 21, 2026
549201f
fix(clients): default GitHub clones to HTTPS (#7760)
t3-code[bot] Aug 21, 2026
be7d35a
perf(web): stop preview loading rerenders (#7561)
Bil0000 Aug 21, 2026
0a46daa
fix(web): keep messages clear of composer banners (#7792)
Bil0000 Aug 21, 2026
837f6b8
feat(web): double-click chat header title to rename thread (#7817)
UtkarshUsername Aug 21, 2026
292c6dd
fix(web): model picker no longer shows a double border (#7772)
RakshithBhat03 Aug 21, 2026
9b5d416
fix(web): give sidebar un-settle button a tooltip (#7796)
UtkarshUsername Aug 21, 2026
c3e3709
fix(web): render oversized terminal graphemes without crashing (#7809)
Lucenx9 Aug 21, 2026
e0b4f46
feat(web): cmd+enter to create thread in background (#7821)
extoci Aug 21, 2026
b381fdb
fix(web): launcher shortcuts no longer hijack the empty composer (#7794)
Lucenx9 Aug 21, 2026
44e4a70
feat(desktop): choose external project icons (#7823)
Bil0000 Aug 21, 2026
592c598
perf(web): dedupe terminal mouse motion reports (#7845)
t3-code[bot] Aug 21, 2026
421088c
fix(search): oversized thread queries no longer crash clients (#6633)
Lucenx9 Aug 22, 2026
035058a
fix(mobile): stop a directly-saved backend from hiding its T3 Connect…
Rishet11 Aug 22, 2026
11f0513
feat(analytics): threads and turns now know which client started them…
t3dotgg Aug 22, 2026
ce91284
fix(web): stop marking mixed tool runs as failed (#7893)
t3dotgg Aug 22, 2026
f34b9d3
fix(web): command-click spaced folder links (#6439)
SunkenInTime Aug 22, 2026
2274444
fix(chat): stop pushing follow-up messages to the top (#7897)
t3dotgg Aug 22, 2026
0ede2ed
test(desktop): remove redundant release note assertion (#7873)
t3-code[bot] Aug 22, 2026
2c4158f
fix(web): handle wide ordered-list marker edge cases (#7856)
abcdmku Aug 22, 2026
49c2b44
fix(ssh): restore user PATH for remote servers (#7213)
gbarros-dev Aug 22, 2026
d9c1732
fix(desktop): keep tailscale spawn defects from breaking advertised e…
Rishet11 Aug 22, 2026
dedcd99
fix(web): keep Codex service tier labels readable (#4503)
PixPMusic Aug 22, 2026
77c9d1e
fix: render workspace images in chat markdown (#6433)
SunkenInTime Aug 22, 2026
6c693ba
fix(clients): keep opening responses visible after turns settle (#7723)
t3dotgg Aug 22, 2026
6e9c57f
feat(web): add appearance contrast control (#7906)
t3-code[bot] Aug 22, 2026
4e00471
fix(server): stop completed Codex threads from staying stuck on worki…
t3dotgg Aug 22, 2026
5a7a7cf
fix(mobile): preserve markdown image dimensions (#7940)
SunkenInTime Aug 22, 2026
4e169df
fix(web): remove duplicate provider update progress (#7761)
naveed949 Aug 23, 2026
30be311
fix(server): fall back to the remote default branch instead of assumi…
Rishet11 Aug 23, 2026
fdd1572
fix(web): give sidebar project menu rows the same side padding as oth…
ishaanko Aug 23, 2026
afa8309
fix(clients): reconnect after credentials fail during remote server u…
t3dotgg Aug 23, 2026
3db38b8
feat(codex): submit thread feedback to OpenAI (#7949)
t3dotgg Aug 23, 2026
4d12e52
fix(server): stop kills lingering Claude work (#5891)
t3dotgg Aug 23, 2026
2433f4c
fix(ci): let Macroscope approve pull requests again (#7970)
t3dotgg Aug 23, 2026
f70eeee
fix(clients): move settled pinned threads into the settled section (#…
t3dotgg Aug 23, 2026
25dcee0
perf(ci): speed up release builds and Windows packaging (#7975)
t3dotgg Aug 23, 2026
ea8c9e5
fix(web): stop tool calls from leaving a blank page in threads (#7971)
t3dotgg Aug 23, 2026
b1670ac
fix(web): stop recovered tool failures from marking work logs red (#7…
t3dotgg Aug 23, 2026
55c9093
fix(mobile): isolate markdown image requests (#7942)
SunkenInTime Aug 23, 2026
9da0fab
feat(web): redesign skills in `$` menu and in `/` menu (#8009)
extoci Aug 23, 2026
09df91f
fix(web): restore right panel toggle clicks after closing on desktop …
UtkarshUsername Aug 23, 2026
5427ca0
fix(web): keep server update banners flush with the composer (#8000)
t3dotgg Aug 23, 2026
fa21900
perf(web): reuse work log rows during streaming (#8006)
Bil0000 Aug 23, 2026
a9cd94e
fix(web): keep provider badge legible in dark themes (#7968)
RakshithBhat03 Aug 23, 2026
69e5ad8
fix(web): treat configured urls with uppercase schemes as secure (#8005)
Lucenx9 Aug 23, 2026
b4be33f
fix(desktop): keep release notes visible while downloading (#6412)
extoci Aug 23, 2026
17dbe8d
fix(web): show only providers with usage in usage views (#7563)
tris203 Aug 24, 2026
643daa5
fix(web): prevent expanded tool calls from hiding thread content (#8052)
t3dotgg Aug 24, 2026
b60a2c0
test(server): remove no-op live activity tests (#8056)
t3-code[bot] Aug 24, 2026
10626c5
fix(web): clarify terminal sidebar grouping (#7967)
StiensWout Aug 24, 2026
7c6163c
fix(codex): show app access approval prompts (#8058)
t3dotgg Aug 24, 2026
e9f50c3
feat(web): upload image attachments before sending (#8048)
t3dotgg Aug 24, 2026
58ba559
fix(server): bound OpenCode skill discovery output (#7675)
Lucenx9 Aug 24, 2026
9eba125
fix(mobile): persist thread shelf collapse state (#5152)
PixPMusic Aug 24, 2026
2d2efff
fix(mobile): restore Android tablet thread controls, clean up header …
PixPMusic Aug 24, 2026
f9a726e
fix(mobile): land the first thread open above the composer on Android…
PollyGlot Aug 24, 2026
be3da50
fix(server): check out submodules in a new worktree (#7674)
Brechard Aug 24, 2026
ba30177
fix(server): preserve merged PR badges after branch deletion (#6216)
tris203 Aug 24, 2026
229b05d
fix(server): return fresh live pull request reads (#6472)
Adamulek123 Aug 24, 2026
6f5c951
fix(web): compare client and server versions as semver, not strings (…
spiky02plateau Aug 24, 2026
c0047c2
fix(web): stop follow-ups from leaving giant blank space (#8068)
t3dotgg Aug 24, 2026
e31e568
fix(marketing): stop automatic Vercel deployments on pull requests (#…
t3dotgg Aug 24, 2026
a002187
chore: vouch repeat contributors (#8071)
t3dotgg Aug 24, 2026
6a26082
fix(server): keep the authoritative subagent model when snapshots rac…
spiky02plateau Aug 24, 2026
04df98d
fix(server): honor auto-accept edits for the OpenCode provider (#7100)
Rishet11 Aug 24, 2026
3fd5064
fix(server): run the CLI on Node versions without import.meta.main (#…
CDVolvik Aug 24, 2026
17822fa
fix(server): recover from provider interrupt failures (#7412)
mrmg Aug 24, 2026
01fc7d2
fix(server): recreate a thread's worktree before starting a turn (#7839)
mackinleysmith Aug 24, 2026
e6a109b
fix(server): thread delete no longer fails on already-removed worktre…
t3dotgg Aug 24, 2026
f035a0f
fix(web): stop update notices showing through the composer (#8083)
t3dotgg Aug 24, 2026
5f1147c
fix(web): detect outdated nightly servers (#8124)
t3dotgg Aug 24, 2026
8287f2c
fix(web): align usage page skeleton layout (#8111)
tris203 Aug 24, 2026
883e1a3
fix(web): make terminal links appear clickable only when clickable (#…
flamboh Aug 24, 2026
a09f921
fix(web): make Windows file links clickable in chat (#8081)
t3dotgg Aug 24, 2026
a1379db
fix(web): sort usage models by token count (#8108)
RakshithBhat03 Aug 24, 2026
9996038
fix: open agent file links in the file viewer (#8098)
StiensWout Aug 24, 2026
c034f51
fix(server): stop routine events from rescanning thread history (#8150)
t3dotgg Aug 25, 2026
2394998
fix(deps): stop pnpm installs from changing the lockfile (#8163)
t3dotgg Aug 25, 2026
143341b
feat(web): settle and restore threads with a keyboard shortcut (#8089)
t3dotgg Aug 25, 2026
63eb042
perf(desktop): cut macOS signing calls by 81% (#8093)
t3dotgg Aug 25, 2026
3c75eb1
feat: link pull requests to threads (#8160)
t3dotgg Aug 25, 2026
bd9ed2b
feat(web): safely attach HEIC photos as JPEG images (#8161)
t3dotgg Aug 25, 2026
bce6809
feat(mobile): track device models and OS versions (#8169)
t3dotgg Aug 25, 2026
afc8342
fix(grok): bound cumulative tool output updates (#7279)
lnieuwenhuis Aug 25, 2026
e6d487e
fix(web): delay thread shortcut hints by 200 ms (#8172)
t3dotgg Aug 25, 2026
43f723f
fix(server): stop probing Cursor until enabled (#8175)
t3dotgg Aug 25, 2026
1a4a759
docs(release): verify remote updates with database migrations (#8177)
t3dotgg Aug 25, 2026
1baf991
fix(server): keep provider CLIs available in the macOS service (#8173)
t3dotgg Aug 25, 2026
c7222ca
feat(claude): compact old threads before they burn through usage (#8144)
t3dotgg Aug 25, 2026
589a9d0
fix(client-runtime): retry queries after connection interruption (#8117)
tris203 Aug 25, 2026
06de9e9
fix(server): keep previously used providers working after upgrades (#…
t3dotgg Aug 25, 2026
731bf63
merge: sync upstream through 06de9e90a
github-actions[bot] Aug 25, 2026
112650b
fix(sync): retarget fold, pin, and existence tests after the upstream…
github-actions[bot] Aug 25, 2026
a6b4d10
fix(web): classify markdown images before the attachment: fallback
github-actions[bot] Aug 25, 2026
56ce0ea
fix(sync): restore interrupt projection settle and retarget ledger tests
github-actions[bot] Aug 25, 2026
2efc055
fix(web): isolate attachment-upload tests so runtime mocks do not leak
github-actions[bot] Aug 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 0 additions & 1 deletion .github/pr-assets/6424-after.svg

This file was deleted.

1 change: 0 additions & 1 deletion .github/pr-assets/6424-before.svg

This file was deleted.

1 change: 0 additions & 1 deletion .github/pr-assets/6503-after.svg

This file was deleted.

183 changes: 169 additions & 14 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,21 @@ jobs:
!/.repos/
sparse-checkout-cone-mode: false

- name: Reject repository-owned PR assets
run: |
files="$(git ls-files .github/pr-assets)"
if test -n "$files"; then
printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2
exit 1
fi

- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: true
run-install: true

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt

- name: Ensure Electron runtime is installed
run: vp run --filter @t3tools/desktop ensure:electron

Expand All @@ -45,9 +48,6 @@ jobs:
- name: Typecheck
run: vpr typecheck

- name: Check resource monitor formatting
run: cargo fmt --manifest-path native/resource-monitor/Cargo.toml -- --check

- name: Build desktop pipeline
run: vp run build:desktop

Expand All @@ -57,6 +57,11 @@ jobs:
grep -nE "desktopBridge|getLocalEnvironmentBootstrap|PICK_FOLDER_CHANNEL|wsUrl" apps/desktop/dist-electron/preload.cjs
grep -n "__clerk_internal_electron_passkeys" apps/desktop/dist-electron/preload.cjs

# Everything except `t3` (apps/server). `--parallel` drops the package
# dependency ordering that `vp run` applies by default: these `test` tasks
# declare no `dependsOn` and resolve workspace deps from source, so ordering
# only bought us idle runners between dependency layers. The concurrency
# limit stays at the default 4 so peak load per runner is unchanged.
test:
name: Test
runs-on: ubuntu-24.04
Expand All @@ -77,20 +82,65 @@ jobs:
cache: true
run-install: true

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable

- name: Ensure Electron runtime is installed
run: vp run --filter @t3tools/desktop ensure:electron

- name: Test
run: vp run --parallel --concurrency-limit 4 --filter '!t3' --filter '!@t3tools/monorepo' test

# apps/server sets `fileParallelism: false`, so its 239 files run strictly
# one at a time. Sharding spreads them over separate runners instead of
# separate workers, so no two server test files ever share a machine and the
# isolation that flag buys is preserved exactly.
test_server:
name: Test Server ${{ matrix.shard }}
runs-on: ubuntu-24.04
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3]
steps:
- name: Checkout
uses: actions/checkout@v6
with:
sparse-checkout: |
/*
!/.repos/
sparse-checkout-cone-mode: false

- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: true
run-install: true

# No Electron setup here: `t3` (apps/server) has no Electron dependency
# and none of its tests touch the runtime. Only the non-server `test`
# job, which covers @t3tools/desktop, needs the download.
- name: Test
env:
T3CODE_TRANSFER_BUDGET_REPORT_PATH: ${{ runner.temp }}/t3code-transfer-budget.md
T3CODE_TRANSFER_BUDGET_RESULT_PATH: ${{ runner.temp }}/thread-transfer-result.json
run: vp run test
run: vp run --filter t3 test --shard ${{ matrix.shard }}/${{ strategy.job-total }}

- name: Publish transfer budget report
# src/server.test.ts writes the budget report, so exactly one shard
# produces these files. Gating the upload on their presence keeps a
# single `thread-transfer-results` artifact per run, which is the name
# thread-transfer-report.yml resolves.
- name: Detect transfer budget report
id: transfer_budget
if: always()
run: |
if test -f "${{ runner.temp }}/thread-transfer-result.json"; then
echo "present=true" >> "$GITHUB_OUTPUT"
else
echo "present=false" >> "$GITHUB_OUTPUT"
fi

- name: Publish transfer budget report
if: always() && steps.transfer_budget.outputs.present == 'true'
run: |
if test -f "${{ runner.temp }}/t3code-transfer-budget.md"; then
tee -a "$GITHUB_STEP_SUMMARY" < "${{ runner.temp }}/t3code-transfer-budget.md"
Expand All @@ -99,19 +149,124 @@ jobs:
fi

- name: Upload thread transfer result
if: always()
if: always() && steps.transfer_budget.outputs.present == 'true'
uses: actions/upload-artifact@v7
with:
name: thread-transfer-results
path: ${{ runner.temp }}/thread-transfer-result.json
if-no-files-found: ignore
retention-days: 30

# Split out of Check and Test: both paid ~7-9s to install a Rust toolchain
# for checks that take under 3s, on the critical path of every PR.
rust:
name: Rust
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v6
with:
sparse-checkout: |
/*
!/.repos/
sparse-checkout-cone-mode: false

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt

- name: Check resource monitor formatting
run: cargo fmt --manifest-path native/resource-monitor/Cargo.toml -- --check

- name: Test resource monitor
run: cargo test --locked --manifest-path native/resource-monitor/Cargo.toml

# The static analysis below needs a macOS runner, which bills ~6.7x a Linux
# minute, so gate it on the native sources it actually lints instead of paying
# for it on every push. Detection is API-only (no checkout) and fails open: if
# the diff cannot be resolved, the lint runs.
mobile_native_changes:
name: Mobile Native Changes
runs-on: ubuntu-24.04
timeout-minutes: 5
permissions:
contents: read
pull-requests: read
outputs:
changed: ${{ steps.detect.outputs.changed }}
steps:
- name: Detect mobile native changes
id: detect
env:
GH_TOKEN: ${{ github.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
BEFORE_SHA: ${{ github.event.before }}
run: |
set -uo pipefail

fail_open() {
echo "$* Running native static analysis."
echo "changed=true" >> "$GITHUB_OUTPUT"
exit 0
}

count_rows() {
printf '%s\n' "$1" | grep -c . || true
}

# One row per changed file, holding the new path and, for a rename,
# the path it replaced: renaming a matched file out of the matched
# paths removes a lint input just like editing it.
row='[.filename, (.previous_filename // empty)] | @tsv'

if [[ -n "${PR_NUMBER}" ]]; then
# The PR files endpoint stops at 3000 files and pagination cannot
# extend it, so cross-check against the count the PR itself reports.
expected=$(gh api "repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}" --jq '.changed_files') \
|| fail_open "Could not read the pull request."
rows=$(gh api "repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}/files" --paginate --jq ".[] | ${row}") \
|| fail_open "Could not resolve changed files."

listed=$(count_rows "$rows")
if [[ "$listed" -lt "$expected" ]]; then
fail_open "GitHub listed only ${listed} of ${expected} changed files."
fi
else
rows=$(gh api "repos/${GITHUB_REPOSITORY}/compare/${BEFORE_SHA}...${GITHUB_SHA}" --jq ".files[]? | ${row}") \
|| fail_open "Could not resolve changed files."

# The compare endpoint reports at most 300 files and pagination does
# not extend that list, so a full list may be hiding native changes.
listed=$(count_rows "$rows")
if [[ "$listed" -ge 300 ]]; then
fail_open "GitHub listed ${listed} changed files, the compare endpoint maximum."
fi
fi

paths=$(tr '\t' '\n' <<< "$rows")

# Sources scripts/mobile-native-static-check.ts lints, plus the tool
# and rule configuration that decides how it lints them, plus the
# root package.json that defines the lint:mobile command.
pattern='^apps/mobile/.*\.(swift|kt|kts)$|^apps/mobile/(\.swiftlint\.yml|detekt\.yml|\.editorconfig|Brewfile)$|^scripts/mobile-native-static-check\.ts$|^package\.json$|^\.github/workflows/ci\.yml$'

if grep -qE "$pattern" <<< "$paths"; then
echo "Native sources or lint configuration changed:"
grep -E "$pattern" <<< "$paths"
echo "changed=true" >> "$GITHUB_OUTPUT"
else
echo "No mobile native sources or lint configuration changed."
echo "changed=false" >> "$GITHUB_OUTPUT"
fi

mobile_native_static_analysis:
name: Mobile Native Static Analysis
needs: mobile_native_changes
# Skip only on an explicit "no": a gate job that failed or errored leaves the
# output empty, and that must run the lint rather than silently skip it.
if: ${{ !cancelled() && needs.mobile_native_changes.outputs.changed != 'false' }}
runs-on: macos-15
timeout-minutes: 10
steps:
Expand Down
84 changes: 64 additions & 20 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,6 @@ jobs:
cache: true
run-install: true

- name: Ensure Electron runtime is installed
run: vp run --filter @t3tools/desktop ensure:electron

- id: release_meta
name: Resolve release version
shell: bash
Expand Down Expand Up @@ -160,6 +157,40 @@ jobs:
fi
fi

- id: previous_tag
name: Resolve previous release tag
run: |
node scripts/resolve-previous-release-tag.ts \
--channel "${{ steps.release_meta.outputs.release_channel }}" \
--current-tag "${{ steps.release_meta.outputs.tag }}" \
--github-output

quality:
name: Release quality checks
needs: [preflight]
if: ${{ !failure() && !cancelled() && needs.preflight.result == 'success' }}
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: ${{ needs.preflight.outputs.ref }}
sparse-checkout: |
/*
!/.repos/
sparse-checkout-cone-mode: false

- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: true
run-install: true

- name: Ensure Electron runtime is installed
run: vp run --filter @t3tools/desktop ensure:electron

- name: Check
run: vp check

Expand All @@ -169,14 +200,6 @@ jobs:
- name: Test
run: vp run test

- id: previous_tag
name: Resolve previous release tag
run: |
node scripts/resolve-previous-release-tag.ts \
--channel "${{ steps.release_meta.outputs.release_channel }}" \
--current-tag "${{ steps.release_meta.outputs.tag }}" \
--github-output

relay_public_config:
name: Resolve T3 Connect public config
needs: preflight
Expand Down Expand Up @@ -388,14 +411,34 @@ jobs:
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: true
run-install: |
args:
- --filter=@t3tools/desktop...
- --filter=t3...
- --filter=@t3tools/scripts...
cache: ${{ matrix.platform != 'win' }}
run-install: false

- name: Resolve Windows package cache path
if: matrix.platform == 'win'
id: package_cache_path
shell: pwsh
run: '"path=$(vp pm cache dir)" >> $env:GITHUB_OUTPUT'

- name: Cache Windows packages
if: matrix.platform == 'win'
uses: actions/cache@v6
with:
path: ${{ steps.package_cache_path.outputs.path }}
key: windows-release-packages-v1-${{ matrix.arch }}-${{ hashFiles('pnpm-lock.yaml') }}

- name: Install desktop dependencies
run: vp install --filter=@t3tools/desktop... --filter=t3... --filter=@t3tools/scripts...

- name: Cache resource monitor
id: resource_monitor_cache
uses: actions/cache@v6
with:
path: native/resource-monitor/target/${{ matrix.rust_target }}/release/t3-resource-monitor${{ matrix.platform == 'win' && '.exe' || '' }}
key: resource-monitor-${{ matrix.rust_target }}-${{ hashFiles('native/resource-monitor/Cargo.lock', 'native/resource-monitor/Cargo.toml', 'native/resource-monitor/src/**') }}

- name: Setup Rust
if: steps.resource_monitor_cache.outputs.cache-hit != 'true'
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.rust_target }}
Expand Down Expand Up @@ -521,6 +564,7 @@ jobs:
- name: Build desktop artifact
shell: bash
env:
T3CODE_DESKTOP_REUSE_RESOURCE_MONITOR: ${{ steps.resource_monitor_cache.outputs.cache-hit == 'true' }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
Expand Down Expand Up @@ -667,9 +711,9 @@ jobs:

publish_cli:
name: Publish CLI to npm
needs: [preflight, relay_public_config, build]
if: ${{ !failure() && !cancelled() && inputs.artifacts_only != true && needs.preflight.result == 'success' && needs.relay_public_config.result == 'success' && needs.build.result == 'success' }}
runs-on: ubuntu-24.04 # ubuntu-24.04
needs: [preflight, relay_public_config, quality, build]
if: ${{ !failure() && !cancelled() && inputs.artifacts_only != true && needs.preflight.result == 'success' && needs.relay_public_config.result == 'success' && needs.quality.result == 'success' && needs.build.result == 'success' }}
runs-on: ubuntu-24.04
timeout-minutes: 10
permissions:
contents: read
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ __screenshots__/
squashfs-root/
.vercel
.gstack/
.plans/
dist-electron/
.electron-runtime/

Expand All @@ -34,6 +35,7 @@ dist-electron/
.showcase/
apps/mobile/.showcase/
artifacts/app-store/screenshots/
.github/pr-assets/
native/**/target/
node_modules/
.alchemy/
Expand Down
1 change: 1 addition & 0 deletions .macroscope/approvability.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Use Macroscope's default approvability criteria.
1 change: 1 addition & 0 deletions .macroscope/check-run-agents/effect-service-conventions.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ Review changed TypeScript and directly affected call sites for the conventions b
- Export direct schema predicates such as `export const isFoo = Schema.is(Foo)`. Flag a private `Schema.is` constant wrapped by a redundant function with the same signature.
- Do not introduce a large `switch` or lookup table in an error's `message` getter to model failures that deserve separate error classes.
- Catch statically known tagged failures with `Effect.catchTags({ ... })`, including when handling only one tag. Do not use `catchIf` with a schema predicate merely to recover one or more known `_tag` variants, and do not use `catchTag`. `Effect.catch` is appropriate when the entire error channel is intentionally handled; `catchIf` remains appropriate for genuinely structural predicates such as inspecting an underlying platform error code.
- For startup reconciliation that repairs multiple independent entities, preserve interruption rather than reducing it to a warning. Retry a transient per-entity repair before readiness, then isolate a persistent failure so one bad entity cannot abort global startup or prevent later entities from being repaired. Require tests for both the retry-success path and persistent-failure continuation.
- Do not add a helper whose only behavior is `(...args) => new SomeError({ ...args })`, including curried aliases used once with `mapError`. Construct the error at the failure boundary so its attributes and cause remain visible. Keep a mapper only when it performs real normalization, passes through existing domain errors, or adds reusable context/control flow.
- When a reusable error-to-error translation clearly belongs to the target error type, prefer a descriptive static factory on that error class over a detached production-side switch. Do not force a static method for one-off inline mappings.

Expand Down
Loading
Loading