Skip to content
Merged
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
774cff9
ci(github): add pull request size labels (#901)
binbandit Mar 12, 2026
a01d712
fix(web): resolve preferred editor from available editors & introduce…
mbuvarp Mar 12, 2026
a33cc8c
fix: diff panel unclosable after retainSearchParams middleware (#937)
eggfriedrice24 Mar 12, 2026
c3bfcc3
feat: add selective file staging to commit dialog (#872)
GuilhermeVieiraDev Mar 12, 2026
5e23e9c
add Ymit24 to vouched list (#959)
nmggithub Mar 12, 2026
ed4be2c
fix: Fix response duration for agent to no longer always be 1ms (#866)
Noojuno Mar 12, 2026
b60a34e
fix: fix logo aligment regression on macOS (#960)
nmggithub Mar 12, 2026
f63cda2
fix: improve business logic in prompt editor and fix cursor bugs in P…
nmggithub Mar 12, 2026
ab0002f
update project removal copy (#981)
donnes Mar 12, 2026
fcbf3f3
Fix new-thread shortcuts when terminal is focused
juliusmarminge Mar 12, 2026
c52ad29
Fix mod+N new thread flow and terminal split limits
juliusmarminge Mar 12, 2026
d9d0216
fix pr size workflow
juliusmarminge Mar 12, 2026
581d242
remove triggers
juliusmarminge Mar 12, 2026
85c174a
fix: Linux icon now shows up (#807)
alexsch01 Mar 12, 2026
224aceb
fix(web): add pointer cursor to running stop-generation button (#900)
binbandit Mar 12, 2026
74c2262
chore: update actions/checkout and actions/github-script (#956)
Bashamega Mar 12, 2026
b6eba33
fix: add logging for WebSocket errors (#948)
hobostay Mar 12, 2026
724f54c
fix: clean up timeout in PlanSidebar to prevent memory leaks (#949)
hobostay Mar 12, 2026
b496ae8
fix: add error logging for code highlighting failures (#951)
hobostay Mar 12, 2026
db17ff3
fix syntax errors from bad merge
juliusmarminge Mar 12, 2026
1e27657
feat: add fuzzy workspace entry search (#256)
maskdotdev Mar 12, 2026
dcd2e5c
fix: don't restart the app on normal exists in dev runner (#986)
nmggithub Mar 12, 2026
727c0cf
feat: Allow Overriding Timestamp Format in Settings (#855)
huxcrux Mar 12, 2026
5c03fb6
Add Antigravity to supported editors in Open menu (macOS, Windows, an…
WilgotM Mar 12, 2026
71a7473
fix: composer @file autocomplete cursor and spacing bugs (#936)
chuks-qua Mar 12, 2026
a14debc
fix: block image uploads during plan mode questions (#621)
chuks-qua Mar 13, 2026
36473f7
feat: replace worktree toggle with discoverable Select dropdown (#1001)
zortos293 Mar 13, 2026
ae4ae99
chore: update @vitejs/plugin-react to 6.0.0 (#1002)
Noojuno Mar 13, 2026
64dc07a
Add compact Codex tool-call icons and details to the chat timeline (#…
zortos293 Mar 13, 2026
dfd62cf
fix(desktop): show dialog after "Check for Updates" menu action (#955)
dpav02 Mar 13, 2026
995a266
chore: Upgrade marketing app to Astro 6 (#1005)
Noojuno Mar 13, 2026
d0ae0ad
fix(web): add default thread env mode setting (#892)
binbandit Mar 13, 2026
ac0d1f5
fix(web): defer diff worker startup until diff opens (#934)
binbandit Mar 13, 2026
876bbd7
Extract reusable clipboard hook and standardize media queries (#1006)
juliusmarminge Mar 13, 2026
89ffcf4
Upgrade oxfmt and oxlint tooling versions (#1010)
juliusmarminge Mar 13, 2026
c43e0f4
Merge upstream pingdotgg/t3code main (35 commits)
aaditagrawal Mar 13, 2026
dc2c5f9
Fix CodeRabbit review issues from PR #11 round 1
aaditagrawal Mar 13, 2026
1a04a06
Fix CodeRabbit review issues from PR #11 round 2
aaditagrawal Mar 13, 2026
790e315
Fix CodeRabbit review issues from PR #11 round 3
aaditagrawal Mar 13, 2026
f19e590
Fix CodeRabbit review issues from PR #11 round 4
aaditagrawal Mar 13, 2026
02036ca
Fix useLocalStorage fallback shim and cross-instance ping-pong loop
aaditagrawal Mar 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,4 @@ github:PatrickBauer
github:realAhmedRoach
github:shiroyasha9
github:Yash-Singh1
github:Ymit24
14 changes: 7 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,20 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: package.json

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version-file: package.json

- name: Cache Bun and Turbo
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: |
~/.bun/install/cache
Expand All @@ -35,7 +35,7 @@ jobs:
${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}-

- name: Cache Playwright browsers
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ hashFiles('bun.lock') }}
Expand Down Expand Up @@ -78,17 +78,17 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: package.json

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version-file: package.json

- name: Exercise release-only workflow steps
run: node scripts/release-smoke.ts
run: bun run scripts/release-smoke.ts
202 changes: 202 additions & 0 deletions .github/workflows/pr-size.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
name: PR Size

on:
pull_request_target:
types: [opened, reopened, synchronize, ready_for_review, converted_to_draft]
Comment on lines +3 to +5
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Make the label-definition sync job reachable.

Line 60 can never pass because this workflow only listens to pull_request_target. That leaves the label job assuming the size:* labels already exist, so a fresh repo state or deleted label set won't recover automatically.

Suggested fix
   sync-label-definitions:
     name: Sync PR size label definitions
     needs: prepare-config
-    if: github.event_name != 'pull_request_target'
+    if: github.event_name == 'pull_request_target'
     runs-on: ubuntu-24.04
     permissions:
       contents: read
       issues: write
@@
   label:
     name: Label PR size
-    needs: prepare-config
+    needs:
+      - prepare-config
+      - sync-label-definitions
     if: github.event_name == 'pull_request_target'
     runs-on: ubuntu-24.04

Also applies to: 57-60, 115-130

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/pr-size.yml around lines 3 - 5, The workflow only listens
to pull_request_target so the label-definition sync job ('label' job) can never
create missing size:* labels on fresh repos; update the workflow triggers and
conditional checks so the job is reachable: add pull_request (and/or
workflow_dispatch) to the top-level on: map so events delivered to the label
job, and update any job if: expressions that currently gate execution (the
checks around lines referenced 57-60 and 115-130) to include github.event_name
== 'pull_request' or github.event_name == 'workflow_dispatch' (or remove the
overly strict event-name guard) so the 'label' job can run and create labels
when needed. Ensure the 'label' job id/name remains the same so downstream steps
keep references.


permissions:
contents: read

jobs:
prepare-config:
name: Prepare PR size config
runs-on: ubuntu-24.04
outputs:
labels_json: ${{ steps.config.outputs.labels_json }}
steps:
- id: config
name: Build PR size label config
uses: actions/github-script@v8
with:
result-encoding: string
script: |
const managedLabels = [
{
name: "size:XS",
color: "0e8a16",
description: "0-9 changed lines (additions + deletions).",
},
{
name: "size:S",
color: "5ebd3e",
description: "10-29 changed lines (additions + deletions).",
},
{
name: "size:M",
color: "fbca04",
description: "30-99 changed lines (additions + deletions).",
},
{
name: "size:L",
color: "fe7d37",
description: "100-499 changed lines (additions + deletions).",
},
{
name: "size:XL",
color: "d93f0b",
description: "500-999 changed lines (additions + deletions).",
},
{
name: "size:XXL",
color: "b60205",
description: "1,000+ changed lines (additions + deletions).",
},
];

core.setOutput("labels_json", JSON.stringify(managedLabels));
sync-label-definitions:
name: Sync PR size label definitions
needs: prepare-config
if: github.event_name == 'pull_request_target'
runs-on: ubuntu-24.04
permissions:
contents: read
issues: write
steps:
- name: Ensure PR size labels exist
uses: actions/github-script@v8
env:
PR_SIZE_LABELS_JSON: ${{ needs.prepare-config.outputs.labels_json }}
with:
script: |
const managedLabels = JSON.parse(process.env.PR_SIZE_LABELS_JSON ?? "[]");

for (const label of managedLabels) {
try {
const { data: existing } = await github.rest.issues.getLabel({
owner: context.repo.owner,
repo: context.repo.repo,
name: label.name,
});

if (
existing.color !== label.color ||
(existing.description ?? "") !== label.description
) {
await github.rest.issues.updateLabel({
owner: context.repo.owner,
repo: context.repo.repo,
name: label.name,
color: label.color,
description: label.description,
});
}
} catch (error) {
if (error.status !== 404) {
throw error;
}

try {
await github.rest.issues.createLabel({
owner: context.repo.owner,
repo: context.repo.repo,
name: label.name,
color: label.color,
description: label.description,
});
} catch (createError) {
if (createError.status !== 422) {
throw createError;
}
}
}
}
label:
name: Label PR size
needs: [prepare-config, sync-label-definitions]
if: github.event_name == 'pull_request_target'
runs-on: ubuntu-24.04
permissions:
contents: read
issues: read
pull-requests: write
concurrency:
group: pr-size-${{ github.event.pull_request.number }}
cancel-in-progress: true
steps:
- name: Sync PR size label
uses: actions/github-script@v8
env:
PR_SIZE_LABELS_JSON: ${{ needs.prepare-config.outputs.labels_json }}
with:
script: |
const issueNumber = context.payload.pull_request.number;
const additions = context.payload.pull_request.additions ?? 0;
const deletions = context.payload.pull_request.deletions ?? 0;
const changedLines = additions + deletions;
const managedLabels = JSON.parse(process.env.PR_SIZE_LABELS_JSON ?? "[]");

const managedLabelNames = new Set(managedLabels.map((label) => label.name));

const resolveSizeLabel = (totalChangedLines) => {
if (totalChangedLines < 10) {
return "size:XS";
}

if (totalChangedLines < 30) {
return "size:S";
}

if (totalChangedLines < 100) {
return "size:M";
}

if (totalChangedLines < 500) {
return "size:L";
}

if (totalChangedLines < 1000) {
return "size:XL";
}

return "size:XXL";
};

const nextLabelName = resolveSizeLabel(changedLines);

const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
per_page: 100,
});

for (const label of currentLabels) {
if (!managedLabelNames.has(label.name) || label.name === nextLabelName) {
continue;
}

try {
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
name: label.name,
});
} catch (removeError) {
if (removeError.status !== 404) {
throw removeError;
}
}
}

if (!currentLabels.some((label) => label.name === nextLabelName)) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
labels: [nextLabelName],
});
}

core.info(`PR #${issueNumber}: ${changedLines} changed lines -> ${nextLabelName}`);
62 changes: 43 additions & 19 deletions .github/workflows/pr-vouch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
targets: ${{ steps.collect.outputs.targets }}
steps:
- id: collect
uses: actions/github-script@v7
uses: actions/github-script@v8
with:
script: |
if (context.eventName === "pull_request_target") {
Expand Down Expand Up @@ -85,7 +85,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Sync PR labels
uses: actions/github-script@v7
uses: actions/github-script@v8
env:
PR_NUMBER: ${{ matrix.target.number }}
VOUCH_STATUS: ${{ steps.vouch.outputs.status }}
Expand All @@ -111,7 +111,7 @@ jobs:
},
];

const managedLabelNames = managedLabels.map((label) => label.name);
const managedLabelNames = new Set(managedLabels.map((label) => label.name));

for (const label of managedLabels) {
try {
Expand All @@ -138,13 +138,19 @@ jobs:
throw error;
}

await github.rest.issues.createLabel({
owner: context.repo.owner,
repo: context.repo.repo,
name: label.name,
color: label.color,
description: label.description,
});
try {
await github.rest.issues.createLabel({
owner: context.repo.owner,
repo: context.repo.repo,
name: label.name,
color: label.color,
description: label.description,
});
} catch (createError) {
if (createError.status !== 422) {
throw createError;
}
}
}
}

Expand All @@ -159,17 +165,35 @@ jobs:
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
per_page: 100,
});

const preservedLabels = currentLabels
.map((label) => label.name)
.filter((name) => !managedLabelNames.includes(name));
for (const label of currentLabels) {
if (!managedLabelNames.has(label.name) || label.name === nextLabelName) {
continue;
}

await github.rest.issues.setLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
labels: [...preservedLabels, nextLabelName],
});
try {
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
name: label.name,
});
} catch (removeError) {
if (removeError.status !== 404) {
throw removeError;
}
}
}

if (!currentLabels.some((label) => label.name === nextLabelName)) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
labels: [nextLabelName],
});
}

core.info(`PR #${issueNumber}: ${status} -> ${nextLabelName}`);
Loading
Loading