Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
198 commits
Select commit Hold shift + click to select a range
8be19ed
fix(pi): short-lived Pi processes no longer lose rotated OAuth tokens…
astarktc Nov 3, 2026
e27e12d
feat(web): add refresh to provider status banners (#24861)
UtkarshUsername Nov 3, 2026
55ea365
fix(server): side chats no longer open with a model switch from the p…
saphid Nov 3, 2026
b7ab02e
fix(web): copied code blocks keep their blank lines in lists, quotes …
saphid Nov 3, 2026
42cf5a1
fix(web): compact model picker row indicators (#26415)
UtkarshUsername Nov 3, 2026
911212b
fix(web): open project picker from boring sidebar's header (#26495)
UtkarshUsername Nov 3, 2026
171f78b
fix(client): project removal counts only listed threads, not side cha…
saphid Nov 3, 2026
68c38b9
fix(opencode): text generation errors explain known provider failures…
saphid Nov 3, 2026
bec3f2d
fix(mobile): multi-file patches show every changed file (#29878)
saphid Nov 3, 2026
e5d0710
fix(server): handoff context names every file of a multi-file patch (…
saphid Nov 3, 2026
e86dc78
fix(server): commits and PR text see changes outside a subfolder proj…
saphid Nov 3, 2026
12ec17c
fix(web): opening a project from the command palette no longer lands …
saphid Nov 3, 2026
3ee5515
fix(web): device host checks show the error without a stack trace (#2…
saphid Nov 3, 2026
3d369d5
feat(web): open full access menu from the new thread context strip (#…
Yash-Singh1 Nov 3, 2026
e53672d
fix(web): long server lists in thread details now page 4 at a time (#…
Bil0000 Nov 3, 2026
115739c
fix(web): keep the project filter menu aligned with its trigger
Yash-Singh1 Nov 3, 2026
30724e2
fix(github): Rebase stack no longer conflicts after a lower layer is …
saphid Nov 3, 2026
abf8998
fix(server): changing a task's wake policy no longer reverts a checkp…
juliusmarminge Nov 3, 2026
a760f37
perf(server): settled PR lookups stop re-spawning git every sweep (#2…
juliusmarminge Nov 3, 2026
4a09502
fix(server): generated commit and PR text ignores git signature outpu…
saphid Nov 3, 2026
ea68f2a
fix(web): picking a branch in a subfolder project keeps the thread in…
saphid Nov 3, 2026
499727d
fix(mobile): close and reopen pull requests from the actions menu (#2…
juliusmarminge Nov 3, 2026
ac10bb4
fix(web): mouse wheel over the thread minimap glides instead of jumpi…
flamboh Nov 3, 2026
7ab237f
fix(server): managed policy covers Kiro (#29915)
juliusmarminge Nov 3, 2026
7681605
fix(server): t3 update installs from the policy's update mirror (#29911)
juliusmarminge Nov 3, 2026
a50fe10
fix(desktop): Ctrl+R on macOS reaches the preview page instead of rel…
saphid Nov 3, 2026
3f48896
fix(server): native forks after an undo no longer copy later turns (#…
saphid Nov 3, 2026
7f17f51
fix(server): idle compaction still runs after a queued message is rem…
saphid Nov 3, 2026
a9468da
fix(server): guests of a forked thread can open files on the messages…
saphid Nov 3, 2026
1a3f76e
fix(evals): resume browser verification after unavailable status (#30…
Yash-Singh1 Nov 3, 2026
bff68fb
fix(shared): saving one source control token no longer drops the othe…
yordis Nov 3, 2026
dd24b37
fix(desktop): a policy that stops startup no longer points at another…
juliusmarminge Nov 3, 2026
15707a8
docs: pin an absolute binary path under a permission cap (#29916)
juliusmarminge Nov 3, 2026
c756eba
fix(mobile): Android follow-up menu shows in full with the keyboard o…
juliusmarminge Nov 3, 2026
7239986
fix(web): deleting the open thread no longer opens a snoozed or settl…
juliusmarminge Nov 3, 2026
31eb1d0
fix(web): closing Settings or Usage no longer jumps back to a quote's…
juliusmarminge Nov 3, 2026
3040f91
fix(server): squash-merged branches no longer offer push & create PR …
juliusmarminge Nov 3, 2026
cf90825
fix(mobile): settings providers show the ACP registry icon (#28135)
juliusmarminge Nov 3, 2026
7b666f3
fix(server): Grok usage limits tell Legacy-mode xAI accounts to switc…
juliusmarminge Nov 3, 2026
58cf69c
fix(usage): label a proxied Claude account by its e-mail, and drop .j…
juliusmarminge Nov 3, 2026
9def583
fix(gitlab): a signed-out default glab host no longer hides other sig…
juliusmarminge Nov 3, 2026
550c5fa
perf(server): prune events the projections already cover (#29806)
juliusmarminge Nov 3, 2026
260297b
fix(server): GPT-6.1 Sol no longer compacts after every tool call on …
maria-rcks Nov 3, 2026
bd48d8c
feat(policy): admins set managed policy from a Group Policy template …
juliusmarminge Nov 3, 2026
2c99914
perf(server): bound streaming recovery reads by active runs (#30357)
Yash-Singh1 Nov 3, 2026
0b5600b
perf(server): read pull request metadata from a lightweight snapshot
Yash-Singh1 Nov 3, 2026
c3c15f7
fix(server): cancelling worktree setup no longer leaves its new branc…
saphid Nov 3, 2026
d1ec71e
feat(mobile): add on-device Android dictation (#26734)
PixPMusic Nov 3, 2026
a104909
feat(server): read usage limit source keys from a secret provider (#2…
yordis Nov 3, 2026
bd3cc5c
feat(device): read the EAS access token from a secret provider (#27763)
yordis Nov 3, 2026
aee76a8
fix(server): route missing read-only queries to readers
Yash-Singh1 Nov 3, 2026
96e887b
perf(server): index delegated recovery candidates (#30359)
Yash-Singh1 Nov 3, 2026
251369d
feat(server,web,mobile,desktop): Copy thread copies a link that opens…
juliusmarminge Nov 3, 2026
b183048
feat(mobile,web): copied thread links open the mobile app (#29815)
juliusmarminge Nov 3, 2026
7c22e24
fix(antigravity): rate-limited turns keep their reset time (#29594)
saphid Nov 3, 2026
da3f972
fix(server): startup no longer hangs on a shell stuck in the kernel (…
AdEx-Partners-DE Nov 3, 2026
ac97602
fix(server): reverting files before the first commit no longer leaves…
Abhishek-B-R Nov 3, 2026
eee9525
fix(server): truncated Claude task output no longer starts with a rep…
Abhishek-B-R Nov 3, 2026
65efae1
fix(shared): relative file links with routing punctuation open as fil…
Abhishek-B-R Nov 3, 2026
7a03a74
fix(server): messages cut by a restart no longer stay marked as strea…
Abhishek-B-R Nov 3, 2026
b6bd84d
fix(server): Antigravity Auto asks instead of approving every request…
parmartejass Nov 3, 2026
a445272
fix(server): Codex threads open in another client are no longer silen…
derektrimm Nov 3, 2026
ef99d3f
fix(server): WSL servers avoid ports already used by Windows (#22962)
tylerjenningsw Nov 3, 2026
d61058d
perf(web): reuse repeated inline skill lookups (#29008)
luke2x Nov 3, 2026
10cd1a5
fix(opencode): expand home-relative executable paths (#29326)
voltcrash Nov 3, 2026
476a99c
fix(server): title regeneration works after a thread's worktree is cl…
saphid Nov 3, 2026
b7add5a
fix(server): dev servers a Codex agent starts show under its thread (…
saphid Nov 3, 2026
8ee7cf9
fix(server): status no longer fetches a remote named after a local tr…
saphid Nov 3, 2026
5bdc2af
fix(server): preview snapshots no longer cut an emoji in half (#29600)
saphid Nov 3, 2026
bbaa535
fix(server): restart notes no longer split an emoji in a long backgro…
saphid Nov 3, 2026
21e4f98
fix(acp): Always allow no longer cancels the turn when an agent only …
MarcoDotIO Nov 3, 2026
9c89424
fix(server): forking a Codex thread archived outside T3 Code no longe…
saphid Nov 3, 2026
acad1d5
perf(shared): stop single-token message search at the best hit (#28930)
hieu-lee Nov 3, 2026
c185d78
fix(preview): a dropped stream withdraws its stale file picker (#29655)
saphid Nov 3, 2026
b156a7d
fix(provider-acp): ACP threads keep receiving events after a rollback…
trevoedwards Nov 3, 2026
2f8de8d
perf(opencode): provider event logs skip per-token reply deltas (#29673)
saphid Nov 3, 2026
300101f
fix(web): open files from Claude and ACP tool-call diffs (#29309)
Jo2234 Nov 3, 2026
04aed8f
fix(server): files tree labels ignored folders inside git submodules …
saphid Nov 3, 2026
eee8ed4
fix(server): server updates reclaim partial database backups left by …
MarcoDotIO Nov 3, 2026
b63adbf
fix(server): PR watch wakes no longer split an emoji in a long commen…
saphid Nov 3, 2026
30f7600
fix(server): pinning a settled thread stamps its return to the active…
saphid Nov 3, 2026
6016aac
fix(server): Claude's commands no longer run Electron apps as Node (#…
u9g Nov 3, 2026
ddca6b1
docs: keybindings guide lists the rightPanelOpen when key (#29677)
saphid Nov 3, 2026
0a86e15
perf(shared): avoid redundant visibility work on status updates (#28965)
hieu-lee Nov 3, 2026
b113eb0
fix(desktop): failed settings saves no longer leave temp files behind…
saphid Nov 3, 2026
6d80df5
fix(acp): a final agent message without a trailing newline is no long…
saphid Nov 3, 2026
594532a
fix(server): terminal history keeps output after an unterminated OSC …
saphid Nov 3, 2026
df2dfde
fix(cli): t3 up's pairing hint keeps --base-dir (#29684)
saphid Nov 3, 2026
1b6336d
fix(shared): preserve omitted components in zero-major caret ranges (…
Jo2234 Nov 3, 2026
4f58294
fix(server): thread titles use linked PR context when the URL is foll…
saphid Nov 3, 2026
2b4d6a3
fix(source-control): remotes like github.com:owner/repo reach their h…
MarcoDotIO Nov 3, 2026
663cd08
fix(server): terminal history keeps text with C1 characters (#29649)
saphid Nov 3, 2026
ce89cd1
fix(server): worktree handoff follows the project's start-from-origin…
saphid Nov 3, 2026
4461b84
fix(server): review keeps tracked changes when untracked files overfl…
saphid Nov 3, 2026
e91595b
fix(server): browser setup advice names the server's T3 home (#29646)
saphid Nov 3, 2026
48e73f6
fix: honor generic MIME aliases in attachment previews (#29360)
Jo2234 Nov 3, 2026
ee265cc
fix(client-runtime): terminals fit their pane again after a reconnect…
saphid Nov 3, 2026
c64117d
fix(server): Run now on a scheduled task says why it was refused (#29…
saphid Nov 3, 2026
8ca8fdd
fix(server): a preview_open whose first load fails no longer leaves a…
saphid Nov 3, 2026
47057a3
fix(cursor): Cursor text generation names usage-limit failures (#29748)
saphid Nov 3, 2026
54223c3
fix(server): review diffs keep working with untracked files outside t…
saphid Nov 3, 2026
136fe43
fix(opencode): nested custom commands like /git/commit run as command…
saphid Nov 3, 2026
8bfe94a
fix(source-control): renamed files in GitHub, GitLab and Azure DevOps…
saphid Nov 3, 2026
0992f51
fix(opencode): a command that exits non-zero is stored as failed, not…
saphid Nov 3, 2026
ddaf999
fix(server): linked environments pick up the other machine's new name…
saphid Nov 3, 2026
b8fb45e
fix(server): document text skips tracked deletions and field codes (#…
saphid Nov 3, 2026
cedcc31
fix(server): OTLP export settings survive a saved token streaming mod…
saphid Nov 3, 2026
eb30336
fix(server): Word text boxes are no longer extracted twice for agents…
saphid Nov 3, 2026
9f7b2ee
fix(server): new projects are created when core.safecrlf refuses LF f…
saphid Nov 3, 2026
228e289
fix(web): drafts saved by older versions load instead of being wiped …
saphid Nov 3, 2026
9d7f771
fix(server): Antigravity text generation shows sign-in and setup erro…
saphid Nov 3, 2026
92388d5
fix(web): picking a custom model named like a Codex alias keeps that …
saphid Nov 3, 2026
940afd6
fix(server): turn checkpoints keep LF files when core.safecrlf is tru…
saphid Nov 3, 2026
31564de
fix(shared): find in thread matches a word typed with a curly apostro…
saphid Nov 3, 2026
2f2e81f
fix(server): review rows for nested repositories load in large diffs …
saphid Nov 3, 2026
0a41bbc
fix(server): t3_worktree_list lists refs after storage cleanup remove…
saphid Nov 3, 2026
2ad6712
fix(provider-core): text generation context cuts no longer split an e…
saphid Nov 3, 2026
7767a95
fix(server): html_preview no longer splits an emoji in a long console…
saphid Nov 3, 2026
0673e7e
fix(server): diffs keep submodule changes under diff.submodule=log (#…
saphid Nov 3, 2026
5e53057
fix(opencode): OpenCode 2 titles for image messages skip images the s…
saphid Nov 3, 2026
aeaf363
fix(server): orchestrator_capabilities no longer offers providers the…
saphid Nov 3, 2026
77b948e
fix(web): big terminal selections no longer break sending (#29804)
saphid Nov 3, 2026
fcad9de
test(web): file editor dismissal test waits for the editor to render …
juliusmarminge Nov 3, 2026
fb8e6d8
test(web): worked-for heading test clicks once the list is revealed (…
juliusmarminge Nov 3, 2026
19a2bad
fix(azure-devops): legacy DefaultCollection pull request URLs can be …
saphid Nov 3, 2026
8704966
fix(shared): preview_open reports about: and mailto: as unsupported i…
saphid Nov 3, 2026
67861fd
fix(server): delegated threads no longer share one provider event log…
onlydole Nov 3, 2026
6049196
fix(server): a queued provider switch no longer ends background work …
juliusmarminge Nov 3, 2026
8198b2e
fix(kiro): slow kiro-cli starts no longer show Kiro as unavailable (#…
saphid Nov 3, 2026
480eb8d
fix(client): mark unread sticks on a thread reopened within ten minut…
saphid Nov 3, 2026
d7ee7b3
fix(pi): extension errors name folder extensions instead of "index" (…
saphid Nov 3, 2026
40aba09
fix(github): Enterprise Server pull request URLs can be pasted to che…
saphid Nov 3, 2026
b7fcb7c
fix(server): a peer refusing one call no longer marks its link as fai…
saphid Nov 3, 2026
0bd447e
perf(server): Claude skill discovery resolves each repository root on…
onlydole Nov 3, 2026
99ccd47
fix(server): t3 service uninstall leaves another T3 home's service al…
saphid Nov 3, 2026
b95ff11
fix(server): PR watches wake again when a push leaves the branch conf…
saphid Nov 3, 2026
1f87f64
fix(muse): the thread error banner no longer shows unredacted failure…
saphid Nov 3, 2026
655977a
fix(server): provider settings changed mid-refresh no longer revert t…
saphid Nov 3, 2026
e1cd7f0
fix(shared): accept whitespace after engine range operators (#29730)
romil-bijarnia Nov 3, 2026
93b0db1
perf(server): stop tracing per-event live coalescer work (#29758)
onlydole Nov 3, 2026
ece461e
test(desktop): the Windows shell kill test waits for each spawn befor…
maria-rcks Nov 3, 2026
7f92cb0
fix(shared): ignore unsupported command output control parameters (#2…
romil-bijarnia Nov 3, 2026
2b37449
fix(cli): t3 update no longer says a service awaiting restart runs th…
saphid Nov 3, 2026
76f2966
fix(mcp): accept CR and mixed line endings in response streams (#29727)
romil-bijarnia Nov 3, 2026
350dcf4
fix(server): preview tabs that fail during setup no longer leave thei…
saphid Nov 3, 2026
86b7dc6
fix(provider-core): long subagent titles no longer end in a broken ch…
saphid Nov 3, 2026
16ca47b
fix(shared): ignore unsupported command output erase modes (#29737)
romil-bijarnia Nov 3, 2026
741bcae
fix(server): a failed scheduled run shows its error without a stack t…
saphid Nov 3, 2026
ebfca09
perf(web): long threads stream with 70% less work-row derivation (#29…
Entrpi Nov 3, 2026
5c72faa
fix(pi): send SIGTERM before closing Pi's stdin on teardown (#30025)
yaacovcorcos Nov 3, 2026
b6307ee
fix(server): clean up child worktrees after their parent settles (#30…
voltcrash Nov 3, 2026
7fd859a
fix(server): Claude context meter shows the window for models outside…
hahhforest Nov 3, 2026
ece6322
fix(server): quitting no longer waits on an unreachable telemetry end…
levelorbit Nov 3, 2026
dd8c122
fix(client): keep snoozed failures hidden without completion times (#…
voltcrash Nov 3, 2026
ffa39e2
perf(server): PR sync stops reading pull requests closed over a day a…
advaitpaliwal Nov 3, 2026
ddd36a5
fix(acp): file changes show the patch of every diff in a tool call (#…
Abhishek-B-R Nov 3, 2026
d075bed
fix(server): Antigravity sign-in no longer blames the network while t…
wenshen18643 Nov 3, 2026
4a23e9e
fix(relay): read migrations in checkout paths with spaces (#30080)
domvox Nov 3, 2026
bf046e3
fix(cli): validate npm runtime before caching it (#30099)
voltcrash Nov 3, 2026
b9d7239
fix(server): SSH device host no longer reconnects on a single slow he…
gyurix Nov 3, 2026
8bc344b
fix(server): read continued core.bare values during onboarding (#30174)
imharjot Nov 3, 2026
6ea23bd
fix(server): published repos fall back to HTTPS when SSH is refused (…
saphid Nov 3, 2026
5ad00e9
fix(opencode): fail stalled event subscriptions promptly (#30201)
voltcrash Nov 3, 2026
c609500
fix(server): a link card the user moved past no longer blocks auto-se…
saphid Nov 3, 2026
2863ede
fix(server): deleting a thread also removes its agent preview recordi…
saphid Nov 3, 2026
e1cf10b
fix(server): review guides no longer fail on the repository's checkou…
saphid Nov 3, 2026
ad4bb6d
fix(desktop): bump Electron to 44.10.1 for October Chromium security …
valuin Nov 3, 2026
57ca5cc
chore(repos): sync reference repos from shallow clones (#30472)
juliusmarminge Nov 4, 2026
43bf0ba
chore(repos): sync Effect 4.1.2 and Alchemy beta.85, rename effect-sm…
juliusmarminge Nov 4, 2026
66e6217
Revert "fix(web): terminal controls no longer cover the first line" (…
juliusmarminge Nov 4, 2026
322f654
feat(web): show a newly created pairing link without expanding the cl…
juliusmarminge Nov 4, 2026
5e6c4d9
refactor(android): every header goes through AppBar, so the filter st…
juliusmarminge Nov 4, 2026
3caec1a
refactor(mobile): one inspector column, declared with <Inspector> (#2…
juliusmarminge Nov 4, 2026
29db71b
refactor(mobile): a pane's bar draws its own sidebar toggle (#27086)
juliusmarminge Nov 4, 2026
d1b9b23
refactor(mobile): Android's sidebar is the Home route in the sidebar …
juliusmarminge Nov 4, 2026
6df3584
feat(mobile): medium windows float the sidebar over the page (#27088)
juliusmarminge Nov 4, 2026
c6114b0
feat(mobile): without an inspector column, the inspector is a sheet (…
juliusmarminge Nov 4, 2026
0444aae
docs(mobile): the five layers of the mobile layout, with x-ray diagra…
juliusmarminge Nov 4, 2026
7448ad8
refactor(mobile): the inspector's bar is its pane's AppBar (#27205)
juliusmarminge Nov 4, 2026
e3a97f5
fix(mobile): the iPad inspector hides the sidebar where the page woul…
juliusmarminge Nov 4, 2026
e04464d
fix(mobile): iPad workspace tabs live in the sidebar and leave with i…
juliusmarminge Nov 4, 2026
9aa80a0
fix(mobile): the drawer surface is only for a sidebar beside a page (…
juliusmarminge Nov 4, 2026
dd69b31
feat(server): list Claude models reported by Claude Code (#30511)
juliusmarminge Nov 4, 2026
87f3d93
fix(relay): production deploys no longer hang while computing the pla…
juliusmarminge Nov 4, 2026
a185dd9
fix(web): give dialog titles a readable line height (#30527)
Yash-Singh1 Nov 4, 2026
d51bc58
fix(tools): show images from MCP and OpenCode outputs (#30389)
Yash-Singh1 Nov 4, 2026
7ccd02c
fix(mobile): smoother Settings and composer transitions on wide Andro…
juliusmarminge Nov 4, 2026
eb1db29
fix(mobile): the Android split slides as one strip, so sidebar and de…
juliusmarminge Nov 4, 2026
737afe2
fix(server): retry unstarted runs after recovery (#30560)
Yash-Singh1 Nov 4, 2026
b3011e9
perf(server): narrow agent awareness startup reads (#30561)
Yash-Singh1 Nov 4, 2026
059804d
fix(web): validate terminal links against filesystem metadata (#30526)
Yash-Singh1 Nov 4, 2026
647bd14
fix(server): avoid message ordering scans during recovery and settlem…
Yash-Singh1 Nov 4, 2026
567a105
fix(client-runtime): expire missing file metadata per thread (#30606)
Yash-Singh1 Nov 4, 2026
3368dd7
fix(web): align usage table padding and thread status rows
Yash-Singh1 Nov 4, 2026
e68e19d
fix(mobile): every Android content pane gets its rounded card from Sc…
juliusmarminge Nov 4, 2026
bb4afa5
chore(release): prepare v0.1.7
t3-code-bot[bot] Nov 4, 2026
8b44f42
fix(web): load selected diff metadata before file patches (#30567)
Yash-Singh1 Nov 4, 2026
c58f9b2
Merge upstream pingdotgg/t3code main through 8b44f42b into fork
eyeveil Nov 4, 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
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
17 changes: 11 additions & 6 deletions .agents/skills/test-t3-app/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ description: Test T3 Code's web and desktop UI through its built-in Browser pane

# Test T3 web and desktop

Use T3's built-in Browser panel for verification. If its tools are absent or
the panel reports unavailable, explain the blocker and stop verification.
Do not install or switch to another automation system. For native mobile
testing, use [test-t3-mobile](../test-t3-mobile/SKILL.md).
Use T3's built-in Browser panel for verification. Follow the recovery steps
below before declaring it unavailable. Do not install or switch to another
automation system. For native mobile testing, use
[test-t3-mobile](../test-t3-mobile/SKILL.md).

## Start the app

Expand Down Expand Up @@ -36,8 +36,13 @@ model, such as Haiku for Claude or Luna for Codex.

## Use the Browser panel

Call `preview_status`, then `preview_open` if the Browser panel is
closed. Navigate to the complete startup pairing URL once with
Call `preview_status`. If no tab can be automated, call `preview_open`, including
when status reports `available: false` or `tabId: null`. Status can report
unavailable simply because no tab exists yet; opening a tab needs no user action.
Stop verification and explain the blocker only if the tools are absent or
`preview_open` reports unavailable or fails.

Navigate to the complete startup pairing URL once with
`preview_navigate`, then use `preview_snapshot` and T3's interaction tools.
If the token was consumed or expired, run `node apps/server/src/bin.ts pair`
for a fresh one. Keep using the same tab.
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -272,12 +272,18 @@ jobs:
env:
TEST_PACKAGES: ${{ needs.changes.outputs.test_packages }}
run: |
set -o pipefail
filters=(--filter '!t3' --filter '!@t3tools/monorepo' --filter '!@t3tools/web')
if [[ -n "$TEST_PACKAGES" ]]; then
filters=()
for package in $TEST_PACKAGES; do filters+=(--filter "$package"); done
fi
vp run --parallel --concurrency-limit 4 "${filters[@]}" test
# The runner's trace writer can crash on surrogate pairs in test output.
vp run --parallel --concurrency-limit 4 "${filters[@]}" test 2>&1 | python3 -u -c '
import sys
for line in sys.stdin:
sys.stdout.write(line.encode("ascii", "backslashreplace").decode("ascii"))
'

# The web suite is the largest outside the server. In the shared Test job it
# started last and ran alone for about 40s after everything else finished.
Expand Down
987 changes: 987 additions & 0 deletions .repos/alchemy-effect/.agents/skills/alchemy-provider/SKILL.md

Large diffs are not rendered by default.

205 changes: 205 additions & 0 deletions .repos/alchemy-effect/.agents/skills/alchemy-provider/docs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
# Provider docs

A provider ships two kinds of docs, and both have a bar:

- **The API reference**, generated from JSDoc by `pnpm docs:gen` into
`website/src/content/docs/providers/<P>/`. Never edit it by hand.
- **The hub**, hand-written pages under
`website/src/content/docs/<provider>/`.

## API reference (JSDoc)

The generated reference page is the first thing a user reads about a
resource, and it is only as good as the JSDoc on the source. The bar
depends on how much the resource is used. Compare every runtime and
fat-head resource side by side with its AWS or Cloudflare counterpart
before you call it done.

Azure missed this bar. `Azure.Functions.Function` shipped with two
examples, an HTTP handler and a schedule, while `AWS.Lambda.Function`
has 21 across eleven sections. Its fat-head resources had 2–5 examples
each, against 10–21 for S3 Bucket, SQS Queue and R2 Bucket.

### Runtimes

Copy the shape of `packages/aws/src/Lambda/Function.ts` and
`packages/cloudflare/src/Workers/Worker.ts`. A runtime's JSDoc has:

- **An intro** that says what the runtime is, what Alchemy creates and
owns for you (role or identity, registry, plan), what it does not own,
and the forms it takes (async, Effect, image). Link to the hub's
compute page.
- **`:::caution` callouts** for platform behavior that will bite
(finalizers and response timing, cold starts, read-only file systems,
size limits), each with a link to the hub page that explains it.
- **One section per form**: `### Async …` with the stack declaration and
the handler file, `### Effect …` with a construction/runtime split, and
a section for container images if the runtime takes them.
- **`### Configuration`**: one example per common setup (public URL and
its auth, networking, scaling and concurrency, retries and failure
destinations, architecture, environment).
- **Packaging**: bundling options and native packages, or the Dockerfile
contract.
- **One `### <Service> Bindings` section per service** with bindings the
runtime uses (storage, database, queue, topic, secrets), each showing
the binding in construction and its call at runtime.
- **`### Event Sources`**: one example per trigger the runtime supports.
- **Storage mounts, networking, and other attachments** the runtime
supports, one section each.

Aim for ten or more examples. If you have fewer, find which section is
missing.

### Fat-head resources

The 10–20 resources most apps use (see the PR description in step 10).
Copy `packages/aws/src/S3/Bucket.ts`, `packages/aws/src/SQS/Queue.ts`
and `packages/cloudflare/src/R2/Bucket.ts`:

- **An intro**: what it is in user terms, the secure defaults Alchemy
applies, and what replacing it costs (data loss, downtime).
- **`### Creating …`**: the minimal declaration, then the common
variants (sizes, tiers, regions, serverless vs provisioned).
- **One section per feature users configure**: encryption, lifecycle or
retention, CORS, dead-letter queues, custom domains, networking,
backups, scaling. Each is a heading with one or more examples.
- **`### Binding to a runtime`**: the binding inside a host, with its
`Effect.provide(...)` layer, and the role or grant it gives.
- **`### Runtime operations`**: the calls users make through the binding.
- **`### Event sources`** when the resource triggers runtimes.
- **Adoption and deletion** when they behave in a way users must know
(`forceDestroy`, retained data, soft delete, name reuse windows).

Aim for five sections or more.

### Long tail

Everything else gets, at minimum:

- An intro naming the cloud's resource type (the ARM type, API resource,
or console name), what it's for, and a docs link.
- One realistic creation example that declares or names every value it
uses.
- A `:::caution` for each prop whose change replaces the resource, and
for each prerequisite a fresh account trips on (a feature to register,
a quota, a parent resource that must exist).

### Every page

- Every prop and attribute has JSDoc with its unit, allowed values,
`@default`, and whether changing it replaces the resource.
- Every snippet either declares what it uses or is clearly a fragment
inside a host (`// init` and `// runtime` comments, as on Lambda).
- Every `@binding` example shows the host and its `Effect.provide(...)`
layer.
- Section headings are `###`, examples are `**Example:**`, and the
generator tags (`@resource`, `@binding`, `@category`, …) come last;
run `pnpm docs:check-jsdoc`.

## The hub

The hub copies the AWS hub (`website/src/content/docs/aws/`), not the
order the provider was built in. GCP's first hub was four long "guides"
that walked the examples end to end. It had no tutorial, no per-service
pages, prose that narrated internals, and snippets without imports. It
was rebuilt to match AWS in alchemy-run/alchemy#2374. Use the rebuilt
GCP hub (`website/src/content/docs/gcp/`) as the model, and compare each
page with its AWS sibling before you write it.

### Structure

```
<P>
├─ Overview · Setup
├─ Tutorial Part 1–5: first resource → first runtime → Testing → Stages → CI/CD
├─ Compute Choosing a runtime · one page per runtime
├─ Frontend Overview (websites) + one page per framework
├─ APIs Effect HTTP · Effect RPC
├─ Data one page per database / storage service
├─ AI one page per AI service
├─ Messaging one page per queue / topic / event source
├─ Security IAM & bindings · secrets and keys
├─ Observability logging and monitoring
└─ Networking networks, private services, custom domains
```

Leave out a section only when the provider has nothing for it, and pick
section names that fit the provider: a section name must tell its pages
apart from the rest of the hub, so a database-only provider has no
"Data" section. Every page except Overview and Setup sits in a section.
There is no `guides/` directory.

| Path | Content |
| --- | --- |
| `index.mdx` | Overview: one sentence on what the user gets, one complete runtime-plus-binding snippet, links to Setup and the tutorial, then a link list per section |
| `setup.mdx` | credentials, the profile command, CI env vars |
| `tutorial/part-1.mdx` … `part-5.mdx` | the same five parts as AWS: "Your First Stack" (one storage resource), "Add a <Runtime>" (bind it, GET/PUT routes), "Testing", "Stages", "CI/CD" (the cloud's keyless CI auth, e.g. OIDC or Workload Identity Federation) |
| `compute/choosing-a-runtime.mdx` | one line per runtime, then a table comparing entry point, triggers, cost, packaging, and deploy time |
| `compute/<runtime>.mdx` | one per runtime the provider hosts |
| `frontend/websites.mdx` + `frontend/<framework>.mdx` | one per `<P>.Website.<Framework>` (step 7), same file names as `aws/frontend/` |
| `apis/effect-http-api.mdx`, `apis/effect-rpc.mdx` | Effect HTTP and RPC servers on the default runtime |
| `<section>/<service>.mdx` | one page per service a user builds with |

### Every hub page

- **Code comes from what's tested**: the `examples/<provider>-*` projects
and the resource JSDoc examples. If a page needs code no example has,
add it to an example and deploy it first.
- **Whole files.** Every block with `import` lines is a complete file
with a `// path` comment on its first line. No `...` elisions, no
`yield*` at module scope. Declare resources as module-scope consts and
pass the declaration straight to bindings and props.
- **Small steps.** Each `##` heading does one thing: one or two short
lines, then the snippet. A follow-up change is a `diff lang="typescript"`
block whose first line is a column-0 context line (the `// path`
comment), or the website build rejects it.
- **Talk to the reader.** Second person, present tense, an instruction or
something they'll see: "Run `alchemy deploy`. `site.url` is the service
URL." Don't narrate what Alchemy does inside, why a limitation exists,
or the docs' own structure ("this page", "Part 3 is where"). Use plain
words: create, not mint/provision.
- **State the grant.** Every binding section says which role it grants
and that it only covers the bound resource.
- **No dumps.** No "three ideas" framing, no bullet lists explaining one
snippet (split it into headings), no whole-file embeds as explanation.
Tables only where they map things, like the runtime comparison.
- **Frontmatter**: `title` and a one-sentence `description` that says
what the reader does on the page. Tutorial parts add `sidebar.order`.

A data or messaging page follows `gcp/data/firestore.mdx`: create the
resource, bind it to a service with the Read/Write/ReadWrite choice and
the role it grants, then one heading per operation (read, write, update,
query, delete), each a short block inside the handler.

A framework page follows `gcp/frontend/astro.mdx`: install the build
integration as a dev dependency (`<PackageManagers dev=… />`), deploy the
site from `alchemy.run.ts`, then one heading per option (env, assets,
domain, `alchemy dev`).

### Wiring

- `website/astro.config.ts`: the hub's sidebar. Overview, Setup,
`Tutorial` (autogenerated from `<provider>/tutorial`), one group per
section, `sortFrontendItems([...])` for Frontend, and
`providerResourcesEntry("<P>")` last.
- `website/src/docs-icons.ts`: every new section label has an icon in
`GROUP_ICONS`.
- `website/src/docs-tabs.ts` and
`website/src/components/ProviderDirectory.astro`: the hub's tab and its
card.
- `website/scripts/generate-llms-txt.ts`: a "start here" section
(`<provider>/index`, `<provider>/setup`), then one
`{ heading: "<P> — <Section>", pages: { directory: "<provider>/<section>" } }`
per section.
- `website/src/worker.ts` `REDIRECTS`: when a page moves or is removed,
map the old path to its closest new page.

## Check

```sh
pnpm docs:check-jsdoc && pnpm docs:gen
pnpm docs:check # builds the website, including the diff-block and link checks
```

Then read the hub next to AWS's sidebar: every AWS section either has a
`<P>` counterpart or the provider has nothing for it.
Loading
Loading