Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
a93b03c
feat(web): composer stays usable during approvals, and sending declin…
maria-rcks Oct 21, 2026
73daccf
docs(agents): name the fast commands and stop polling (#22711)
t3dotgg Oct 21, 2026
a5d66e2
fix(desktop): new worktrees install Electron from the local download …
t3dotgg Oct 21, 2026
dd8452a
test(server): split replay fixtures into per-provider files (#22717)
t3dotgg Oct 21, 2026
163bdea
fix(server): delegates finish when their leftover work settles, and G…
t3dotgg Oct 21, 2026
d0e427d
fix(server): storage cleanup no longer counts pnpm clones as freed sp…
t3dotgg Oct 21, 2026
a1dc856
build: upgrade Vite+ to 1.3 and cache typecheck (#22716)
t3dotgg Oct 21, 2026
8f66e67
test: local test runs use package configs and a clean env (#22714)
t3dotgg Oct 21, 2026
ca049dc
fix(mobile): restore low-latency decoding for simulator streams (#22733)
Yash-Singh1 Oct 21, 2026
ea1c494
fix(marketing): typecheck cache no longer misses when the shell env c…
t3dotgg Oct 21, 2026
618761a
build(setup): leaner installs on Mac and Linux, cross-device store wa…
t3dotgg Oct 21, 2026
f4a3843
build: upgrade pnpm to 12 for 4x faster installs (#22738)
t3dotgg Oct 21, 2026
76e4aac
refactor(web): the timeline minimap lives in its own file (#22662)
juliusmarminge Oct 21, 2026
bea8790
refactor(web): timeline work entry rows and tool icons live in their …
juliusmarminge Oct 21, 2026
9e672d0
refactor(web): timeline work group and live activity rows live in the…
juliusmarminge Oct 21, 2026
3e36c5e
refactor(web): timeline user message rows and context chips live in t…
juliusmarminge Oct 21, 2026
476e2c3
refactor(web): timeline assistant and orchestration event rows live i…
juliusmarminge Oct 21, 2026
bef9142
refactor(web): timeline row derivation, position restore and find rea…
juliusmarminge Oct 21, 2026
9ff8cdc
refactor(web): the command palette's theme items live in their own fi…
juliusmarminge Oct 21, 2026
767134a
refactor(web): the command palette's thread items come from their own…
juliusmarminge Oct 21, 2026
0b7c902
refactor(web): the command palette's project items and pure helpers l…
juliusmarminge Oct 21, 2026
28a8d2b
refactor(web): the command palette's add-project views are components…
juliusmarminge Oct 21, 2026
955b4cc
feat(cli): start, message, and read threads from the terminal with t3…
t3dotgg Oct 21, 2026
7781e52
refactor(web): composer attachment tiles live in their own component …
juliusmarminge Oct 21, 2026
9576c45
refactor(web): resting image previews and queued attachments are thei…
juliusmarminge Oct 21, 2026
94bce7f
refactor(web): composer mode controls and footer actions live in Comp…
juliusmarminge Oct 21, 2026
17e62e7
refactor(web): typing no longer re-renders the composer model picker …
juliusmarminge Oct 21, 2026
b7b905d
refactor(web): composer suggestion lists are built by useComposerMenu…
juliusmarminge Oct 21, 2026
00ceb2d
refactor(web): the sidebar's thread rows live in their own file (#22696)
juliusmarminge Oct 21, 2026
e7f62ef
refactor(web): sidebar list markers and draft rows live in their own …
juliusmarminge Oct 21, 2026
ad4f18d
feat(dev): first dev start seeds real data and warms deps (#22744)
t3dotgg Oct 21, 2026
09bd654
refactor(web): the pull requests column lives in its own component (#…
juliusmarminge Oct 21, 2026
b302290
refactor(web): the pull request header's crumbs, title editor and bas…
juliusmarminge Oct 21, 2026
8f7de11
refactor(web): the pull request header's actions live in their own co…
juliusmarminge Oct 21, 2026
5db0045
refactor(web): the pull request detail loader lives in its own hook (…
juliusmarminge Oct 21, 2026
787e0e4
refactor(web): the pull request list's rows read the speed-mode modif…
juliusmarminge Oct 21, 2026
5a31f4c
refactor(web): the pull requests page's scope and grouping hooks live…
juliusmarminge Oct 21, 2026
35b0566
refactor(web): the pull requests route only validates its search; the…
juliusmarminge Oct 21, 2026
57d7844
perf(web): Shift re-renders only each row's quick-action group (#22726)
juliusmarminge Oct 21, 2026
a003b73
refactor(web): the pull request list's grouping helper lives in a log…
juliusmarminge Oct 21, 2026
5f0a0d1
refactor(web): chat markdown code blocks live in their own module (#2…
juliusmarminge Oct 21, 2026
36bda3c
refactor(web): the Mermaid code block lives in its own component file…
juliusmarminge Oct 21, 2026
5c5d6ed
refactor(web): chat markdown tables and details live in their own com…
juliusmarminge Oct 21, 2026
827f6d4
refactor(web): chat markdown links and file chips live in their own m…
juliusmarminge Oct 21, 2026
7ffc3bb
refactor(web): chat markdown images and videos live in their own modu…
juliusmarminge Oct 21, 2026
9c3e743
refactor(web): ChatView's module-level helpers live in their own file…
juliusmarminge Oct 21, 2026
a97f7f8
refactor(web): ChatView's persistent terminal drawers live in their o…
juliusmarminge Oct 21, 2026
8da8f61
refactor(web): ChatView's right panel lives in its own component (#22…
juliusmarminge Oct 21, 2026
6b13e8f
refactor(web): ChatView's timeline follow and anchoring lives in useT…
juliusmarminge Oct 21, 2026
030be16
refactor(web): ChatView's machine and server-update banners live in u…
juliusmarminge Oct 21, 2026
bd7aab2
refactor(web): ChatView's subagent, goal, background-work and branch …
juliusmarminge Oct 21, 2026
91a0a29
refactor(web): ChatView's draft machine routing lives in useDraftEnvi…
juliusmarminge Oct 21, 2026
38b13e9
refactor(web): ChatView's send preparation is pure functions in ChatV…
juliusmarminge Oct 21, 2026
0b91504
refactor(web): the archived threads settings page lives in its own fi…
juliusmarminge Oct 21, 2026
568cbb4
refactor(web): the typography settings section lives in its own file …
juliusmarminge Oct 21, 2026
501f5c5
refactor(web): the appearance settings page lives in its own file (#2…
juliusmarminge Oct 21, 2026
381514e
refactor(web): the background activity setting and its dialog live in…
juliusmarminge Oct 21, 2026
9dc28a1
refactor(web): the connections page's pure helpers live in Connection…
juliusmarminge Oct 21, 2026
263eef2
refactor(web): authorized clients and endpoint rows live in their own…
juliusmarminge Oct 21, 2026
848e352
refactor(web): saved and T3 Connect environment rows live in their ow…
juliusmarminge Oct 21, 2026
efdda5e
perf(server): skip the macOS xcrun git shim (#22759)
t3dotgg Oct 21, 2026
6490a9e
docs(agents): read vendored .repos with git show when sparse-excluded…
t3dotgg Oct 21, 2026
21da306
fix(web): ⌘Z undoes a settle even when the composer has focus (#22607)
t3dotgg Oct 21, 2026
74541ba
feat(scripts): one command checks what the branch changed (#22767)
t3dotgg Oct 21, 2026
1f4eae7
fix(scripts): check:changed no longer skips knip after a removed impo…
t3dotgg Oct 21, 2026
1dfb572
perf(dev): faster first load for shared dev servers (#22776)
t3dotgg Oct 21, 2026
8fe4206
fix(server): stalled clones say "Stalled" instead of a frozen speed (…
t3dotgg Oct 21, 2026
a8bb769
fix(web): steers split a finished turn's work instead of stacking und…
t3dotgg Oct 21, 2026
e27a03e
fix(web): images on their own line no longer sit beside their label (…
t3dotgg Oct 21, 2026
688ee52
fix(release): include pnpm hook in Vercel uploads (#22813)
t3dotgg Oct 21, 2026
1688f96
fix(release): keep Vercel warnings out of deployment URLs (#22817)
t3dotgg Oct 21, 2026
96f09c6
fix(queue): send selected held messages when a thread is stopped (#22…
Yash-Singh1 Oct 21, 2026
ea96898
Merge remote-tracking branch 'upstream/main' into yordis/chore-sync-u…
yordis Oct 21, 2026
0dc0584
ci: pin the Electron download cache action so the fork's SHA-pinning …
yordis Oct 21, 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
6 changes: 5 additions & 1 deletion .github/scripts/ci-changes.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
// node ci-changes.cjs --paths <file> --full run every Linux job, gate only the macOS lint
// node ci-changes.cjs changed paths unknown: run everything
//
// scripts/check-changed.ts requires the same decisions so local runs match CI.
//
// Every changed path maps to workspace packages, which then pull in their
// dependents from package.json. A path this file does not recognize runs
// everything, so a new root file or directory can only cost minutes.
Expand Down Expand Up @@ -201,4 +203,6 @@ function main() {
for (const [key, value] of Object.entries(outputs)) console.log(`${key}=${value}`);
}

main();
module.exports = { readWorkspace, decide };

if (require.main === module) main();
27 changes: 27 additions & 0 deletions .github/scripts/ci-changes.d.cts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
interface WorkspacePackage {
readonly name: string;
readonly dir: string;
readonly hasTest: boolean;
readonly deps: ReadonlyArray<string>;
}

export function readWorkspace(): Array<WorkspacePackage>;

export function decide(
files: ReadonlyArray<string> | null,
packages: ReadonlyArray<WorkspacePackage>,
full: boolean,
): {
affected: Array<string>;
outputs: {
typecheck: boolean;
build: boolean;
test: boolean;
test_packages: string;
test_web: boolean;
test_server: boolean;
rust: boolean;
release_smoke: boolean;
mobile_native: boolean;
};
};
87 changes: 87 additions & 0 deletions .github/scripts/vercel-deployment-output.test.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
const assert = require("node:assert/strict");
const { spawnSync } = require("node:child_process");
const { mkdtempSync, readFileSync, rmSync, existsSync } = require("node:fs");
const { tmpdir } = require("node:os");
const { join } = require("node:path");
const { test } = require("node:test");

const release = readFileSync(join(__dirname, "../workflows/release.yml"), "utf8");
const preview = readFileSync(join(__dirname, "../workflows/web-preview.yml"), "utf8");
const stepPattern =
/ name: (?:Build staged deployment|Deploy preview)\n shell: bash\n run: \|\n((?: .*\n|\n)+)/g;
const steps = [
...Array.from(release.matchAll(stepPattern), (match, index) => [
index === 0 ? "hosted web" : "marketing",
match[1],
]),
...Array.from(preview.matchAll(stepPattern), (match) => ["web preview", match[1]]),
];
assert.equal(steps.length, 3, "Expected both release steps and the preview step");

const url = "https://t3code-fixture-pinglabs.vercel.app";
const warning = 'Error while parsing config file: "/runner/t3code/pnpm-lock.yaml"';

function runStep(script, stdout, exitCode = 0) {
const directory = mkdtempSync(join(tmpdir(), "t3-vercel-output-"));
const outputFile = join(directory, "output");
try {
const result = spawnSync(
"bash",
[
"-c",
'vp() { printf "%s\\n" "$FIXTURE_STDOUT"; return "$FIXTURE_EXIT"; }\n' +
'curl() { printf \'{"id":"fixture-project"}\\n\'; }\n' +
script.replace(/^ /gm, "").replace(/\$\{\{.*?\}\}/g, "fixture"),
],
{
encoding: "utf8",
env: {
PATH: process.env.PATH,
VERCEL_TOKEN: "fixture-token",
VERCEL_ORG_ID: "fixture-org",
VERCEL_PROJECT_ID: "fixture-project",
GITHUB_OUTPUT: outputFile,
FIXTURE_STDOUT: stdout,
FIXTURE_EXIT: String(exitCode),
},
},
);
assert.ifError(result.error);
return {
...result,
output: existsSync(outputFile) ? readFileSync(outputFile, "utf8") : "",
};
} finally {
rmSync(directory, { recursive: true, force: true });
}
}

for (const [name, script] of steps) {
for (const [label, stdout] of [
["plain URL", url],
["lockfile warning", `${warning}\n${url}`],
["trailing diagnostic", `${url}\nDone`],
]) {
test(`${name}: saves one deployment URL after ${label}`, () => {
const result = runStep(script, stdout);
assert.equal(result.status, 0, result.stderr);
assert.deepEqual(
result.output.split("\n").filter((line) => !line.startsWith("project_id=")),
[`deployment_url=${url}`, ""],
);
});
}

for (const [label, stdout, exitCode] of [
["missing URL", warning, 0],
["invalid URL", "https://example.invalid/deployment", 0],
["multiple URLs", `${url}\nhttps://other.vercel.app`, 0],
["failed deployment", url, 1],
]) {
test(`${name}: rejects ${label} without saving output`, () => {
const result = runStep(script, stdout, exitCode);
assert.notEqual(result.status, 0);
assert.equal(result.output, "");
});
}
}
26 changes: 25 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,14 @@ jobs:
- name: Setup Vite+
uses: ./.github/actions/setup-ci-deps

# electron's install.js (run by ensure:electron) reads this cache before it
# downloads from GitHub. The key changes only with the Electron version.
- name: Cache Electron download
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
with:
path: ~/.cache/electron
key: electron-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('node_modules/.pnpm/electron@*/node_modules/electron/package.json') }}

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

Expand Down Expand Up @@ -132,6 +140,14 @@ jobs:
- name: Setup Vite+
uses: ./.github/actions/setup-ci-deps

# electron's install.js (run by ensure:electron) reads this cache before it
# downloads from GitHub. The key changes only with the Electron version.
- name: Cache Electron download
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
with:
path: ~/.cache/electron
key: electron-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('node_modules/.pnpm/electron@*/node_modules/electron/package.json') }}

- name: Ensure Electron runtime is installed
id: electron
run: vp run --filter @t3tools/desktop ensure:electron
Expand Down Expand Up @@ -222,14 +238,22 @@ jobs:
- name: Setup Vite+
uses: ./.github/actions/setup-ci-deps

# electron's install.js (run by ensure:electron) reads this cache before it
# downloads from GitHub. The key changes only with the Electron version.
- name: Cache Electron download
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
with:
path: ~/.cache/electron
key: electron-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('node_modules/.pnpm/electron@*/node_modules/electron/package.json') }}

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

- name: Test preview artifact validation
run: python3 -B .github/scripts/stage-preview-bundle.test.py

- name: Test release checks
run: node --test .github/scripts/check-nightly-release.test.cjs
run: node --test .github/scripts/check-nightly-release.test.cjs .github/scripts/vercel-deployment-output.test.cjs

- name: Finish installing browser secret helper build libraries
timeout-minutes: 5
Expand Down
18 changes: 16 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1088,7 +1088,7 @@ jobs:
fi

echo "Building hosted web app for $channel_name channel."
deployment_url="$(
deployment_output="$(
vp dlx vercel@53.1.1 deploy \
--archive=tgz \
--prod \
Expand All @@ -1107,6 +1107,13 @@ jobs:
--build-env "VITE_HOSTED_APP_URL=$router_url" \
--build-env "VITE_HOSTED_APP_CHANNEL=$channel_name"
)"
printf '%s\n' "$deployment_output"
# Vercel can print lockfile warnings to stdout before the deployment URL.
deployment_url="$(printf '%s\n' "$deployment_output" | grep -E '^https://[[:alnum:].-]+\.vercel\.app$')"
if [[ "$deployment_url" == *$'\n'* ]]; then
echo "Vercel returned multiple deployment URLs." >&2
exit 1
fi
echo "Staged $deployment_url."
echo "deployment_url=$deployment_url" >> "$GITHUB_OUTPUT"

Expand Down Expand Up @@ -1235,7 +1242,7 @@ jobs:
)"
export VERCEL_PROJECT_ID

deployment_url="$(
deployment_output="$(
vp dlx vercel@53.1.1 deploy \
--archive=tgz \
--prod \
Expand All @@ -1244,6 +1251,13 @@ jobs:
--token "$VERCEL_TOKEN" \
--scope "${VERCEL_TEAM_SLUG:-$VERCEL_ORG_ID}"
)"
printf '%s\n' "$deployment_output"
# Vercel can print lockfile warnings to stdout before the deployment URL.
deployment_url="$(printf '%s\n' "$deployment_output" | grep -E '^https://[[:alnum:].-]+\.vercel\.app$')"
if [[ "$deployment_url" == *$'\n'* ]]; then
echo "Vercel returned multiple deployment URLs." >&2
exit 1
fi
echo "Staged $deployment_url."
echo "deployment_url=$deployment_url" >> "$GITHUB_OUTPUT"
echo "project_id=$VERCEL_PROJECT_ID" >> "$GITHUB_OUTPUT"
Expand Down
9 changes: 8 additions & 1 deletion .github/workflows/web-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,20 @@ jobs:

vercel_scope="${VERCEL_TEAM_SLUG:-$VERCEL_ORG_ID}"

deployment_url="$(
deployment_output="$(
vp dlx vercel@53.1.1 deploy \
--archive=tgz \
--yes \
--token "$VERCEL_TOKEN" \
--scope "$vercel_scope"
)"
printf '%s\n' "$deployment_output"
# Vercel can print lockfile warnings to stdout before the deployment URL.
deployment_url="$(printf '%s\n' "$deployment_output" | grep -E '^https://[[:alnum:].-]+\.vercel\.app$')"
if [[ "$deployment_url" == *$'\n'* ]]; then
echo "Vercel returned multiple deployment URLs." >&2
exit 1
fi

echo "Deployed $deployment_url"
echo "deployment_url=$deployment_url" >> "$GITHUB_OUTPUT"
Expand Down
21 changes: 21 additions & 0 deletions .pnpmfile.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Windows WSL dev mode runs the server under Linux from the same node_modules
// as the Windows client, so Windows installs also need Linux x64 glibc native
// modules. Other platforms install only their own binaries; setting this
// everywhere added ~2.2 GB of foreign binaries to every macOS install.
// Release scripts stage their own installs with explicit architectures.
module.exports = {
hooks: {
updateConfig(config) {
// oxlint-disable-next-line t3code/no-global-process-runtime -- pnpm loads this file before any Effect runtime exists.
if (process.platform !== "win32") return config;
return {
...config,
supportedArchitectures: {
os: ["current", "linux"],
cpu: ["current", "x64"],
libc: ["current", "glibc"],
},
};
},
},
};
2 changes: 2 additions & 0 deletions .vercelignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Vercel's default .pnp* rule also excludes pnpm's hook, whose checksum is in the lockfile.
!/.pnpmfile.cjs
14 changes: 10 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,24 +78,30 @@ The most common defect in this repo is a change that works on the path you teste
## Dev servers

- `vp i` installs. Worktrees get this from the t3.json setup script; if module resolution looks broken, it probably did not run.
- Setup runs in the background. While `.t3/setup-running` names a live PID, wait for it and do not run `vp i`. It ends with `.t3/setup-done` or `.t3/setup-failed` (with the error tail). With no marker at all, setup never ran here, so run `vp i` yourself.
- `vp run dev` starts server and web. In a worktree, state defaults to that worktree's gitignored `.t3`, which deliberately outranks an ambient `T3CODE_HOME` so you cannot land on shared state by accident. An explicit `--home-dir` still wins.
- Ports derive from the worktree path and are stable across restarts, but read the real ones from the `[dev-runner]` line since occupied ports shift.
- Sharing over the tailnet is three steps: run `vp run dev --share` in the background, wait for the `pairingUrl:` line in its output, then give that full URL to an unpaired browser. Do not wire up `tailscale serve` by hand, open the URL yourself, or consume the user's pairing link. A browser with the reusable dev cookie can use the bare origin. If a normal one-time token was consumed, mint a fresh one with `node apps/server/src/bin.ts pair`. It carries standard scopes, while the startup URL carries admin scopes needed for Connections settings.
- To reuse web dev auth across worktrees, configure one fixed `T3CODE_DEV_AUTH_TOKEN` in the main checkout's gitignored `.env`. The `t3.json` setup links that file into worktrees. Never commit or publish the token or a startup URL. See [Reusable dev credential](docs/operations/development.md#reusable-dev-credential).
- Stop what you started, by the PID you tracked. See rule 1.
- Need a second checkout? `git worktree add` it next to this worktree, not in `/tmp`. Remove it when done.

## Test data

An empty database is a bad test. Seed your worktree's `.t3` with a copy of real data instead of pointing at live state:

- Run `vp run migrate-dev-db` with your dev server stopped. It rebuilds `<worktree>/.t3/userdata/statev2.sqlite` from a read-only snapshot of `~/.t3/userdata/statev2.sqlite`, the developer's real data. It keeps recent projects and their stopped threads, and drops scheduled tasks, pending work, and auth sessions, so your dev server never runs the developer's agents. Raise `--projects` and `--threads-per-project` for more data.
- The first `vp run dev` in a worktree does this for you when its database is missing. `--no-seed` or `T3CODE_DEV_SEED=0` skips it.
- Run `vp run migrate-dev-db` with your dev server stopped to refresh. It rebuilds `<worktree>/.t3/userdata/statev2.sqlite` from a read-only snapshot of `~/.t3/userdata/statev2.sqlite`, the developer's real data. It keeps recent projects and their stopped threads, and drops scheduled tasks, pending work, and auth sessions, so your dev server never runs the developer's agents. Raise `--projects` and `--threads-per-project` for more data.
- Refresh `statev2.sqlite`, not `state.sqlite`. The server copies the V1 `state.sqlite` only when `statev2.sqlite` is missing.
- Bring `secrets` and `settings.json` only if the flow under test needs them.
- Copy in, never symlink. Data flows one way: into your sandbox, never back out.

## Verifying

- Smallest proof that the change works. `vp test run <files>` for the tests you touched, targeted lint and typecheck for the scope you changed.
- Before you push, run `vp run check:changed`. It runs CI's fast checks for changed files: format, lint, knip, typecheck of affected packages and dependents, and tests beside changes. CI still runs the full test suites.
- While you iterate, run `vp test run <files>`. For big files, add `-t "<name>"`.
- Do not use `npx tsc`. Use `vp run typecheck`; it uses tsc-rs, which is 3x faster.
- Run `node -e` snippets from `apps/server` or the owning package. `effect` does not resolve from the repo root.
- Test meaningful logic or observable behavior. Do not render components to static markup to assert props or attributes, or add tests that merely assert callback wiring or mirror the implementation.
- **Do not run repo-wide checks.** No `vp check`, no `vp run -r test`, no `vp run -r typecheck` unless I ask. CI owns the full suite.
- Backend behavior changes ship with focused tests for that behavior.
Expand Down Expand Up @@ -138,7 +144,7 @@ For authorized mobile verification, a missing or outdated native client is a bui
- UI changes need before/after images. Motion or timing needs a short video.
- Upload PR evidence to GitHub. Never commit PR-only screenshots or assets such as `.github/pr-assets/`.
- One request is one PR. Split it only when the maintainer asks. Outside contributions follow the stricter [one problem per PR](CONTRIBUTING.md#one-problem) rule.
- When babysitting: poll checks and comments newer than the last push, verify each bot finding against the source, fix real ones, dismiss false positives with a written reason. Stay quiet when nothing is new. Stop when the bots are green on the latest commit.
- When babysitting: call `watch_pull_request` and end your turn. T3 Code wakes you on checks, comments, or conflicts. Do not poll or sleep. Verify each bot finding against the source, fix real ones, dismiss false positives with a written reason. Stay quiet when nothing is new. Stop when the bots are green on the latest commit.

## Documentation

Expand Down Expand Up @@ -171,7 +177,7 @@ Architecture and its constraints: `docs/internals/overview.md`. Glossary: `docs/
- `packages/contracts` - Effect/Schema contracts plus small derived helpers. No heavy runtime logic.
- `packages/shared` - shared runtime utils, subpath exports, no barrel.
- `packages/client-runtime` - client code shared by web and mobile.
- `.repos/` - vendored read-only references. Prefer their patterns over invented ones. Never edit or import from them. Sync with `vpr sync:repos` when bumping the matching dependency.
- `.repos/` - vendored read-only references. Prefer their patterns over invented ones. Never edit or import from them. Sync with `vpr sync:repos` when bumping the matching dependency. If it is missing (sparse checkout), read a file with `git show origin/main:.repos/<path>`.

## Taste

Expand Down
1 change: 0 additions & 1 deletion apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
"ensure:electron": "node scripts/ensure-electron-runtime.mjs",
"start": "node scripts/start-electron.mjs",
"dev:stop": "node scripts/stop-dev-electron.mjs",
"typecheck": "tsc-rs --noEmit",
"test": "vp test run --passWithNoTests",
"smoke-test": "node scripts/smoke-test.mjs"
},
Expand Down
Loading
Loading