Skip to content

Commit 5bdfd3a

Browse files
Merge upstream/main into main
Brings in 694 upstream commits on top of the fork's account pools, independent CLI account sign-in, and provider account sync. Twenty-three files conflicted where upstream's provider and orchestrator refactors met those features. Upstream's shapes were adopted (Effect.fn wrappers, the split queued-run promotion, the rebuilt test harnesses) and the fork's logic re-applied inside them. Four fork tests were adapted to upstream behaviour: a snapshot refresh now resolves maintenance fresh and probes, so the managed Codex executable is acquired twice; Windows launcher fixtures compare the executable path case-insensitively because PATHEXT candidates match on a case-insensitive host; the ws config test mocks the published-provider registry methods; installation start is a function. Sixteen fork closures were converted to Effect.fn for upstream's new prefer-effect-fn rule, and one browser test's lifecycle hooks became per-test setup with disposable spies. Conflict resolution by Claude Opus 5.5 (orchestrator core), GPT-6 Astra via Codex (Codex driver and adapter), and Claude Sonnet 5.5 (Claude driver and adapter, web provider files, Effect.fn conversions), integrated and verified by Claude Fable 5.1 in Claude Code. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2 parents b45a69f + ca140c4 commit 5bdfd3a

1,808 files changed

Lines changed: 154815 additions & 47414 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.gitattributes‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# Batch files need CRLF for cmd.exe to parse them reliably.
44
*.cmd text eol=crlf
55
*.bat text eol=crlf
6-
# GitHub's GraphQL schema and the operations graphqlgen writes from it.
6+
# GitHub's and Expo's GraphQL schemas and the operations graphqlgen writes from them.
77
packages/source-control-github/schema/** linguist-generated
8+
apps/server/schema/** linguist-generated
89
**/*.graphql.ts linguist-generated

‎.github/actions/setup-ci-deps/action.yml‎

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,34 @@ runs:
1818
path: ~/.vite-plus
1919
key: vite-plus-home-v1-${{ runner.os }}-${{ runner.arch }}-${{ steps.vp.outputs.version }}
2020

21+
- name: Setup Vite+
22+
uses: voidzero-dev/setup-vp@v1
23+
with:
24+
node-version-file: package.json
25+
cache: false
26+
run-install: false
27+
28+
- name: Resolve pnpm store path
29+
id: pnpm_store
30+
shell: bash
31+
run: |
32+
store_path="$(vp pm cache dir)"
33+
echo "path=$store_path" >> "$GITHUB_OUTPUT"
34+
35+
# setup-vp's shared cache key ignores install filters. Keep full installs in a
36+
# separate namespace, including fallback restores.
2137
# The pnpm store stays a cache tarball on the runner's own disk. A store on a
2238
# Blacksmith sticky disk mounts in under a second, but pnpm then copies every
2339
# package across filesystems instead of hard-linking it: install took 28-49s
2440
# against 9s plus an 11s restore.
25-
- name: Setup Vite+
26-
uses: voidzero-dev/setup-vp@v1
41+
- name: Cache full pnpm store
42+
uses: actions/cache@v6
2743
with:
28-
node-version-file: package.json
29-
cache: true
30-
run-install: true
44+
path: ${{ steps.pnpm_store.outputs.path }}
45+
key: pnpm-full-v1-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml', 'package.json') }}
46+
restore-keys: |
47+
pnpm-full-v1-${{ runner.os }}-${{ runner.arch }}-
48+
49+
- name: Install dependencies
50+
shell: bash
51+
run: vp install

‎.github/scripts/ci-changes.cjs‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const EXTRA_OWNERS = [
3636
// scripts/build-desktop-artifact.ts reads the GNOME extension manifest.
3737
[/^apps\/desktop\/gnome-extension\//, ["@t3tools/scripts"]],
3838
[/^native\/browser-secret\//, ["@t3tools/desktop"]],
39+
[/^native\/kde-snap-shot\//, ["@t3tools/desktop"]],
3940
[/^native\/libghostty-vt\//, ["@t3tools/web"]],
4041
];
4142
const RUST = /^native\/(resource-monitor|kde-snap-shot|hyprland-snap-shot)\//;
@@ -112,10 +113,10 @@ function ownersOf(file, packages) {
112113
// A manifest can change dependencies or versions other packages read.
113114
if (path.posix.basename(file) === "package.json") return null;
114115
if (RUNS_EVERYTHING.some((pattern) => pattern.test(file))) return null;
116+
const extra = EXTRA_OWNERS.flatMap(([pattern, names]) => (pattern.test(file) ? names : []));
115117
// scripts/build-desktop-artifact.test.ts reads the crates' sources.
116-
if (RUST.test(file)) return ["@t3tools/scripts"];
118+
if (RUST.test(file)) return ["@t3tools/scripts", ...extra];
117119

118-
const extra = EXTRA_OWNERS.flatMap(([pattern, names]) => (pattern.test(file) ? names : []));
119120
const owner = packages
120121
.filter((pkg) => file.startsWith(`${pkg.dir}/`))
121122
.sort((a, b) => b.dir.length - a.dir.length)[0];

‎.github/scripts/thread-transfer-report.cjs‎

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,26 @@ async function resolve({ github, context, core }) {
244244

245245
let pullNumber = source.pull_requests?.[0]?.number;
246246
if (!pullNumber) {
247-
const associated = await github.paginate(
248-
github.rest.repos.listPullRequestsAssociatedWithCommit,
249-
{ owner, repo, commit_sha: source.head_sha, per_page: 100 },
250-
);
247+
let associated;
248+
try {
249+
associated = await github.paginate(github.rest.repos.listPullRequestsAssociatedWithCommit, {
250+
owner,
251+
repo,
252+
commit_sha: source.head_sha,
253+
per_page: 100,
254+
});
255+
} catch (error) {
256+
// A force-pushed or deleted PR head can disappear before this workflow runs.
257+
if (
258+
error.status === 422 &&
259+
error.response?.data?.message === `No commit found for SHA: ${source.head_sha}`
260+
) {
261+
core.info(`Skipping CI result for unavailable commit ${source.head_sha}.`);
262+
core.setOutput("publish", "false");
263+
return;
264+
}
265+
throw error;
266+
}
251267
const matchingPulls = associated.filter(
252268
(pull) =>
253269
pull.state === "open" &&

‎.github/scripts/thread-transfer-report.test.cjs‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,47 @@ test("does not guess when a fallback commit belongs to multiple PRs", async () =
216216
assert.equal(fetchedPull, false);
217217
});
218218

219+
test("skips a missing PR commit but preserves other lookup failures", async () => {
220+
for (const [status, message, shouldSkip] of [
221+
[422, "No commit found for SHA: old-head", true],
222+
[422, "Validation Failed", false],
223+
[403, "API rate limit exceeded", false],
224+
]) {
225+
const outputs = {};
226+
const error = Object.assign(new Error(message), {
227+
status,
228+
response: { data: { message } },
229+
});
230+
const run = resolve({
231+
github: {
232+
paginate: async () => {
233+
throw error;
234+
},
235+
rest: { repos: { listPullRequestsAssociatedWithCommit: () => {} } },
236+
},
237+
context: {
238+
repo: { owner: "pingdotgg", repo: "t3code" },
239+
payload: {
240+
workflow_run: { event: "pull_request", head_sha: "old-head", pull_requests: [] },
241+
},
242+
},
243+
core: {
244+
info: () => {},
245+
setOutput: (key, value) => {
246+
outputs[key] = value;
247+
},
248+
},
249+
});
250+
if (shouldSkip) {
251+
await run;
252+
assert.equal(outputs.publish, "false");
253+
} else {
254+
await assert.rejects(run, (caught) => caught === error);
255+
assert.deepEqual(outputs, {});
256+
}
257+
}
258+
});
259+
219260
test("does not report a passing run that skipped the server tests", async () => {
220261
const outputs = {};
221262
const listWorkflowRunArtifacts = () => {};

‎.github/workflows/ci.yml‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ jobs:
9393
- name: Check generated GitHub GraphQL operations
9494
run: vp run --filter @t3tools/source-control-github generate --check
9595

96+
- name: Check generated Expo GraphQL operations
97+
run: vp run --filter t3 generate --check
98+
9699
- name: Check
97100
run: vp check
98101

@@ -482,8 +485,6 @@ jobs:
482485
!/apps/mobile/modules/t3-terminal/Vendor/**/*.a
483486
sparse-checkout-cone-mode: false
484487

485-
# A full install: a filtered one that misses the cache first saves its
486-
# partial store under the shared lockfile key for every later job.
487488
- name: Setup Vite+
488489
uses: ./.github/actions/setup-ci-deps
489490

‎.github/workflows/cursor-hygiene-webhook.yml‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ name: Forward to Cursor hygiene
33
on:
44
push:
55
branches: [main]
6-
pull_request:
6+
# Use trusted workflow code and repository secrets for fork PRs.
7+
# Keep this job payload-only: never check out or run PR code.
8+
pull_request_target:
79
types: [opened, reopened, ready_for_review]
810
issues:
911
types: [opened, closed, reopened]
@@ -34,7 +36,7 @@ jobs:
3436
--output /dev/null --write-out '%{http_code}' \
3537
-H "Authorization: $AUTH" \
3638
-H "Content-Type: application/json" \
37-
-H "X-GitHub-Event: ${{ github.event_name }}" \
39+
-H "X-GitHub-Event: ${{ github.event_name == 'pull_request_target' && 'pull_request' || github.event_name }}" \
3840
-H "X-GitHub-Delivery: ${{ github.run_id }}-${{ github.run_attempt }}" \
3941
--data-binary @"${{ github.event_path }}") || curl_status=$?
4042
if [ "$curl_status" -eq 0 ]; then

‎.github/workflows/deploy-relay.yml‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
deploy_relay:
2828
name: Deploy production relay
2929
# A manual run from another branch would deploy that branch to production.
30-
if: github.ref == 'refs/heads/main'
30+
if: github.repository == 'pingdotgg/t3code' && github.ref == 'refs/heads/main'
3131
runs-on: blacksmith-8vcpu-ubuntu-2404
3232
timeout-minutes: 15
3333
environment:
@@ -41,6 +41,8 @@ jobs:
4141
RELAY_TUNNEL_ZONE_NAME: ${{ vars.RELAY_TUNNEL_ZONE_NAME }}
4242
RELAY_TUNNEL_CLEANUP_MODE: ${{ vars.RELAY_TUNNEL_CLEANUP_MODE }}
4343
RELAY_LEGACY_TUNNEL_CLEANUP_MODE: ${{ vars.RELAY_LEGACY_TUNNEL_CLEANUP_MODE }}
44+
RELAY_ALERT_NOTIFIER_ID: ${{ vars.RELAY_ALERT_NOTIFIER_ID }}
45+
RELAY_WARNING_NOTIFIER_ID: ${{ vars.RELAY_WARNING_NOTIFIER_ID }}
4446
CLERK_PUBLISHABLE_KEY: ${{ vars.CLERK_PUBLISHABLE_KEY }}
4547
CLERK_JWT_AUDIENCE: ${{ vars.CLERK_JWT_AUDIENCE }}
4648
APNS_ENVIRONMENT: ${{ vars.APNS_ENVIRONMENT }}

‎.github/workflows/mobile-android-apk.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ concurrency:
1515
jobs:
1616
mirror:
1717
name: Mirror beta APK
18+
if: github.repository == 'pingdotgg/t3code'
1819
runs-on: blacksmith-2vcpu-ubuntu-2404
1920
timeout-minutes: 10
2021
permissions:

‎.github/workflows/mobile-eas-production.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ concurrency:
7575
jobs:
7676
production:
7777
name: EAS ${{ inputs.profile || 'production' }} ${{ github.event_name == 'push' && 'auto' || inputs.mode }}
78+
if: github.repository == 'pingdotgg/t3code'
7879
runs-on: blacksmith-8vcpu-ubuntu-2404
7980
permissions:
8081
contents: read

0 commit comments

Comments
 (0)