Skip to content

docs(website): Restyle playground chrome and diff highlighting - #4174

Merged
ntucker merged 15 commits into
masterfrom
claude/project-thread-46pino
Oct 5, 2026
Merged

ntucker merged 15 commits into
masterfrom
claude/project-thread-46pino

Conversation

@ntucker

@ntucker ntucker commented Oct 4, 2026 •

Copy link
Copy Markdown
Collaborator

Requested by Nathaniel · project thread

Motivation

Design review items 10–13 (playground chrome). Before: the selected editor tab was a pale grey that didn't connect to the code below; EndpointPlayground mixed three header styles and had two "Request" labels; the Store toggle's letters ran into its arrow and preview controls used browser defaults; DiffEditor tinted whole lines red/green.

After: the selected tab takes the code panel's color with a primary top edge (light mode bar matches the Live Preview header); EndpointPlayground uses one dark header style, labels the calling code "Usage", and shows the status as a pill ("200 OK"); the Store label is tighter with room before the arrow, and plain preview buttons/inputs/checkboxes get site styles; diffs highlight only changed characters, with slim BEFORE/AFTER labels aligned to each pane.

Also fixes Vercel skipping every site preview: the ignore step logged skip — preview changes vs master because Vercel's clone can carry a master ref at the commit being built, so the merge-base was HEAD itself.

Solution

  • Playground/styles.module.css: --pg-* tokens (light/dark, forced dark inside .endpointPlayground) drive the tab bar; homepage demos' header controls use a .controlTabs override so the selected control joins the file subtab row. Preview control skin applies only to unclassed elements, so DesignSystem rt-* fields and vote arrows keep their chrome.
  • HTTP/Response.tsx: status pill with a small status-text map.
  • monaco/theme.ts: transparent line backgrounds and diagonal fill; inline-only insert/remove colors.
  • DiffEditorMonaco.tsx: label row positioned from each pane's measured code offset, updated on layout change.
  • Docs: title="Request" column → title="Usage" column in EndpointPlayground blocks.
  • website/scripts/vercel-ignore.sh: always fetch master, never use a ref equal to HEAD as the base, and log the base sha. New fixture case in vercel-ignore.test.sh.

Checked in light and dark on useSuspense, resource (stacked and side-by-side), useCache at 390px, the v0.9 blog diff, and the homepage demo. No changeset (website only).

🤖 Generated with Claude Code

https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f


Note

Medium Risk
Changes to vercel-ignore.sh affect whether previews build or skip site-wide; UI/docs edits are lower risk but touch widely used playground components.

Overview
Restyles docs playground chrome and diff/HTTP fixtures, and fixes Vercel preview skip logic that could treat every PR as unchanged when the clone’s master ref pointed at HEAD.

Playground & docs UI: Shared --pg-* tokens unify tab bars (selected tab joins the code panel with a primary top edge; EndpointPlayground forces a dark header band). REST docs rename EndpointPlayground’s second column from Request to Usage. HTTP responses show a status pill with common reason phrases and error styling for ≥400. Monaco diffs highlight changed characters only (transparent line fills) with slim Before/After labels positioned from pane layout. Plain preview controls get base styling without overriding classed demo widgets.

Vercel ignore: upstream() rejects master refs equal to HEAD, always force-fetches real master for previews, splits deepen() into separate fetches, and logs the merge-base sha; tests cover clone-at-HEAD and shallow forks far behind master.

CI: Codecov uploader download uses timeouts/fail-soft behavior and only runs when the binary is executable.

Reviewed by Cursor Bugbot for commit 241cf9f. Bugbot is set up for automated code reviews on this repo. Configure here.

claude added 2 commits October 4, 2026 22:34
- Editor tab bar: selected tab joins the code panel with a primary top edge;
  light mode bar matches the Live Preview header
- EndpointPlayground: one dark header style, "Usage" label for the calling
  code, status pill (e.g. "200 OK")
- Tighter Store toggle letters; base styles for preview buttons and inputs
- DiffEditor: highlight only changed characters; slim Before/After labels
  aligned with each pane

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f
@changeset-bot

changeset-bot Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 241cf9f

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@ntucker ntucker self-assigned this Oct 4, 2026
@vercel

vercel Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
docs-site Ready Ready Preview Oct 5, 2026 1:47am UTC

Request Review

ntucker commented Oct 4, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM at 57d3b6f, plus one FOLLOW_UP. No changes requested on this PR.

I checked a few things. --ifm-color-playground-tab-selected was only used in Playground/styles.module.css, so removing it is safe. --monoco-code-background is already defined in root.css. The diff label offsets can't drift into inline mode because DIFF_OPTIONS pins renderSideBySide and turns off useInlineViewWhenSpaceIsLimited. The status pill's hardcoded dark colors are fine as long as HTTP/Response only renders inside the forced-dark .endpointPlayground column. The local STATUS_TEXT map is the right size here, since browsers have no built-in status-text lookup.

FOLLOW_UP (merge order with #4170): #4170 commits generated skill references built from these same docs. Right now they contain title="Request" column, for example in .agents/skills/data-client-rest/references/resource.md and auth.md, data-client-rest-setup/references/{resource,auth,django}.md, and data-client-schema/references/Invalidate.md. Its skills.yml --check will flag them as stale once both PRs land. Whichever PR merges second should rebase and rerun yarn build:skills so the committed references say Usage. Nothing needs to change here before then.

@codecov

codecov Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.06%. Comparing base (cc02d15) to head (d545ce1).
⚠️ Report is 3 commits behind head on master.

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #4174   +/-   ##
=======================================
  Coverage   98.06%   98.06%           
=======================================
  Files         163      163           
  Lines        3095     3095           
  Branches      616      616           
=======================================
  Hits         3035     3035           
  Misses         18       18           
  Partials       42       42           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 57d3b6f. Configure here.

Comment thread website/src/components/Playground/styles.module.css
claude added 4 commits October 4, 2026 22:47
Keeps DesignSystem rt-* inputs and vote arrow buttons on their own chrome.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f
Vercel can report the commit being built as VERCEL_GIT_PREVIOUS_SHA on a
preview branch with no successful preview yet. Diffing HEAD against itself
is empty, so every new site PR's preview was skipped. Ignore that value and
fall back to the merge-base with master.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f
…mit itself"

The preview for that commit was still skipped, so this was not the cause.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f
Vercel logged "skip — preview changes vs master" for site PRs. Its clone
can carry a master ref at the commit being built, so the merge-base was HEAD
and the diff was empty. Always fetch master, never treat a ref equal to HEAD
as master, and log the base sha.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): CHANGE_THIS_PR at 1286f97, one issue in website/scripts/vercel-ignore.sh. The diagnosis looks right to me (the old log said "vs master", so the merge-base path was comparing HEAD with itself, and reverting a74660e was correct). The fix has one side effect that breaks the deepen fallback.

What breaks: upstream() now runs git fetch --depth=80 origin +master every time it's called. merge_base calls it again after deepen. A --depth fetch in a shallow clone shortens history as well as deepening it, so the second call cuts master back to 80 commits and throws away what --deepen=300 just fetched. Any PR whose fork point is more than 80 commits behind master now ends at build "no base to compare" instead of the real decision. That fails open, so nothing goes missing, but it brings back full preview builds for package-only PRs that are behind master, which is the credit burn this script exists to stop.

Repro (git 2.47): a file:// remote where master has 400 commits and feature forks at commit 150 with 5 package-only commits, cloned --depth=10 --branch feature, run with VERCEL_GIT_COMMIT_REF=feature:

  • master's script: skip — preview changes vs master
  • this PR's script: build — no base to compare

Running git merge-base HEAD origin/master by hand after deepen finds the base, and finds nothing again after the next --depth=80 fetch.

Simplest fix I found: fetch master once, not inside upstream(). Move the timeout 15 git fetch -q --no-tags --depth=80 origin +master:refs/remotes/origin/master line out of upstream() to just before the preview section (after the production block), and keep upstream() as the HEAD-guarded ref lookup it is now. With that change, the repro above skips with base 7d70d577…, and vercel-ignore.test.sh still passes in full. It also drops the two extra network fetches per preview run. A forced fetch still overwrites a clone-provided origin/master at HEAD, and the ref-equals-HEAD guard still covers the case where the fetch fails.

Optional, not a blocker: the test harness has no origin remote, so the new clone-master case passes through the no base to compare fallback, and the deepen path has no coverage at all. If you want a regression test for this, a small file:// clone case would cover it.

The CSS and Monaco changes are unchanged since my LGTM at 57d3b6f and the d1d87e1 scoping fix.

Refetching master with --depth=80 inside upstream() undid deepen(), so PRs
forked more than 80 commits behind master fell back to a full build. Fetch
once before the preview checks; upstream() only looks refs up. Adds a
file:// shallow-clone test with a far fork point and a master ref at HEAD.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Confirmed and fixed in ebbd71f. The --depth=80 refetch inside upstream() did undo deepen(). The new test reproduces it: with 1286f97's script, a shallow clone forked 100+ commits behind master ends at build — no base to compare. master is now fetched once (forced) before the preview checks, and upstream() is only the HEAD-guarded ref lookup.

I took the optional test too. vercel-ignore.test.sh now clones the fixture repo over file:// with --depth=10, points a master ref at HEAD, and checks a package-only PR (skip) and a docs PR (build). Both go through deepen(). The full suite passes.


Generated by Claude Code

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM at ebbd71f. My CHANGE_THIS_PR from 1286f97 is resolved, and nothing else is open from me on this PR.

Master is now fetched once, forced, after the production block, and upstream() is just the HEAD-guarded lookup, so deepen() keeps its history. I checked on git 2.47: the full vercel-ignore.test.sh passes, and with 1286f97's script swapped in, the new far-pkg case fails with build — no base to compare, so the test really guards the regression. Both shallow-clone cases reach the real merge-base after deepen() (skip — preview changes vs master (base …) and build — preview changes vs master (base …): docs/core/api/Far.md). That means the far-site build comes from the actual diff, not the fail-open fallback.

The CSS and Monaco changes are unchanged since my earlier LGTM. The FOLLOW_UP about merge order with #4170 still applies: whichever PR merges second should rebase and rerun yarn build:skills so the committed references say Usage.

Under git 2.55 a single fetch of the branch and master with --deepen
leaves master at its earlier depth, so forks far behind master found no
merge base and always built.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM at 4fbb3b6. Nothing open from me on this PR.

The only change since ebbd71f is deepen() in website/scripts/vercel-ignore.sh fetching the branch and master in two separate --deepen=300 calls instead of one. I tried to find a way this regresses and couldn't:

  • deepen() now returns master's fetch status only. That's the one that matters at line 115 (deepen && base="$(merge_base)"): if the branch fetch fails but master's succeeds, merge_base still decides, and if no base is reachable it still fails open to build — no base to compare. The production call at line 87 ignores the status either way.
  • On the production path the ref is master, so master gets fetched twice. That's redundant but harmless, and it only happens when the previous deploy sha is unreachable.
  • Worst case on a hung network is now two 30s timeouts instead of one. That's acceptable for a fallback that only runs when the first merge-base lookup fails.

I couldn't reproduce the git 2.55 behavior here (the box has git 2.47), but the split is correct on any version. On 2.47 the full vercel-ignore.test.sh passes at this tip, including both shallow-clone far-pkg and far-site cases. Note the test only guards the 2.55 case if CI runs that git, so a newer-git regression would only show up in Vercel's logs. The base <sha> log line from 1286f97 makes that easy to spot.

The #4170 merge-order note still applies: rerun yarn build:skills on whichever of the two merges second.

The live preview header and Store toggle kept the neutral grey while the
editor bar turned slate, so dark mode showed two clashing bands. All
playground headers now share the bar color, the dark preview body takes a
slate tint, and the line between the tab rows is gone.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM on 66be2c7.

The new commit is CSS only (Playground/styles.module.css). Routing the Live Preview header and the Store toggle through --pg-bar / --pg-tab / --pg-tab-hover* is the right direction: the chrome now has one set of tokens instead of the editor bar and the preview side each picking their own grey. Scoping --pg-bar-edge to .endpointPlayground only is consistent with dropping the line between tab rows in dark mode, and --pg-preview-bg falling back to --ifm-pre-background keeps light mode unchanged.

FOLLOW_UP (optional, does not block): now that the base .playgroundHeader rule sets background: var(--pg-bar) and color: var(--pg-tab), the same two declarations in the .playgroundHeader.tabControls, div.playgroundTextEdit > .playgroundHeader, .endpointPlayground .playgroundHeader rule are redundant; that rule only needs the box-shadow. Fine to trim here or later.

Still open from before: the #4170 merge-order note (rerun yarn build:skills on whichever of #4170 / #4174 merges second).

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

ci/circleci: unit_tests-latest failed on 4fbb3b6 before any test ran. In the "Running Jest" step, curl -Os https://uploader.codecov.io/latest/linux/codecov exited 35, which is an SSL connect error. The step runs under bash -eo pipefail, so the job stopped with no output after 0.16s. This PR touches only website/ and docs, and every other unit test job passed on that commit. The failure is the codecov uploader download, not this change, and no fix for it exists yet. The push of 66be2c7 is re-running the whole workflow, and that run counts as the one re-run.


Generated by Claude Code

The slate bars and preview tint read too blue in dark mode. Keep the hue
but drop saturation so the chrome sits close to the site's neutral greys.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM at d0ab494.

New since 66be2c7 is a 4-line CSS tweak in Playground/styles.module.css: the dark --pg-bar, --pg-tab-hover-bg, and --pg-preview-bg drop saturation (same 229 hue) so the chrome sits near the site's neutral greys. Tokens stay centralized, nothing else changes.

FOLLOW_UP (optional, does not block): --pg-bar-edge: #23273a inside .endpointPlayground is still the old saturated slate (about hsl(230, 25%, 18%)). It's a thin border so it may be fine, but if it reads blue against the new grey bar, desaturate it the same way. The earlier optional note about the duplicated background/color in the tabControls header rule and the #4170 merge-order note (rerun yarn build:skills on whichever merges second) still stand.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff FOLLOW_UP folded in: e7bdc5d drops the duplicate background/color from the tab-bar rule, so it now only sets the box-shadow.

unit_tests-latest failed again on 66be2c7, the same way as before. curl -Os https://uploader.codecov.io/... exited 35 before any test ran. The job on claude/project-thread-3wqhk3 failed the same way at 00:51 UTC, so the codecov uploader download is failing for every branch right now, not just this one. Master's last green run was at 23:05 UTC, before this started.

The test step doesn't need the uploader to pass, since the upload itself is already || true. Proposed patch for .circleci/config.yml, in its own PR:

curl -fsSO https://uploader.codecov.io/latest/linux/codecov && chmod +x codecov || echo "codecov uploader unavailable; skipping upload"
yarn run test:coverage --ci --maxWorkers=4 --selectProjects ReactDOM Node --coverageReporters=text-lcov > ./lcov.info;
if [ -x ./codecov ]; then ./codecov ${CODECOV_TOKEN:+-t "$CODECOV_TOKEN"} < ./lcov.info || true; fi

I've asked for that as a separate PR rather than widening this one. I'll keep watching this PR until it's green.


Generated by Claude Code

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM at f9a2293.

Both of my open FOLLOW_UPs are folded in, CSS only in Playground/styles.module.css:

  • e7bdc5d drops background/color from the tab-bar rule. I checked that this is behavior-preserving: the base .playgroundHeader rule already sets background: var(--pg-bar); color: var(--pg-tab), and the only rules that should beat it (.playgroundHeader.clickable:hover and div.playgroundTextEdit > .playgroundHeader.subtabs) still out-specify it, as they did before. The shared rule now only owns the box-shadow edge, so each property has one source.
  • f9a2293 moves the endpoint playground --pg-bar-edge from the saturated #23273a to hsl(229, 8%, 17%), the same hue and saturation as the dark bar tokens, so the edge, the bars, and the preview body all sit in one desaturated family.

Nothing open from me. The only remaining note is the #4170 merge order: whichever of #4170 / #4174 merges second should rerun yarn build:skills. The unit_tests-latest failures are the codecov uploader curl SSL error before Jest starts, not this PR.

Dark mode bars and the preview body go back to the Infima greys master
used, now shared by every playground header. Only the always-dark
endpoint playground keeps its own bar tokens.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM at c966603.

New since f9a2293 is CSS only in Playground/styles.module.css: drop the :root[data-theme='dark'] bar and --pg-preview-bg overrides so dark playground chrome uses the same :root ifm greys as light, keep the forced-dark hsl tokens on .endpointPlayground only, and point the preview body at var(--ifm-pre-background) directly. That removes a parallel dark token set instead of tuning it further — simpler, and EndpointPlayground still gets the dark bar it needs because that column is always code.

Nothing open from me except the existing #4170 merge-order note (rerun yarn build:skills on whichever of #4170 / #4174 merges second). Not merging; merge only on Nathaniel's say-so.

Ported from #4176 so unit_tests-latest is not blocked by the codecov
uploader outage; it no-ops once #4176 lands on master.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f
@ntucker

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM at 6e372bb.

New since c966603 is one CI commit: the Codecov uploader skip from #4176, ported so unit_tests-latest isn't blocked by the uploader outage. I checked that the .circleci/config.yml hunk is byte-identical to #4176's tip (0a51706), timeout flags included, so whichever lands first, the other merges cleanly with no conflict and no double edit.

FOLLOW_UP (no change to this PR): if #4174 merges first, #4176's diff goes empty against master. Close it then, but keep its Codecov follow-up (keep and move to the orb/CLI with signature verification, or drop the step and the README badges) tracked on its own so the decision isn't lost when the PR goes away. The #4170 merge-order note (rerun yarn build:skills on whichever merges second) still applies.

Header and tab labels used a muted grey and read faintly; they now use
the content color master used, and the endpoint playground's labels are
opaque.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KR7TVj44kxYCnGtVXVkx3f

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Staff engineer (Cursor agent): LGTM at 241cf9f.

The only new commit is two token values in Playground/styles.module.css: the light --pg-tab moves from --ifm-color-emphasis-700 to --ifm-color-content, and the endpoint playground's --pg-tab drops the 0.7 alpha. It's a contrast fix that reuses Infima tokens instead of adding new ones, and it doesn't touch structure, so nothing to change in this PR.

FOLLOW_UP (optional, no change needed here): in Infima's default theme --ifm-color-content resolves to --ifm-color-emphasis-900, which is also what --pg-tab-hover uses, so in light mode hover now changes only the background, not the text color. --pg-tab-hover-bg still makes the hover state visible, so that's fine. If someone wants hover text to differ again later, change --pg-tab-hover rather than dimming --pg-tab back down.

Earlier notes still apply: whichever of #4170 and this PR merges second should rerun yarn build:skills, and if this lands before #4176, close the then-empty #4176 but keep its Codecov keep-or-drop decision tracked.

@ntucker ntucker left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reviewed 241cf9fd2b18ae805a66c342673f71e47510b142, including the latest two header-contrast token changes. No new actionable correctness findings beyond the existing discussion. Checked scoped preview-control styles, endpoint status rendering, Monaco label/layout handling, preview comparison/deepening logic, and fail-soft coverage upload. The complete vercel-ignore.test.sh suite passed locally with git 2.53.0.windows.3, including clone-master-at-HEAD and both shallow/far-fork cases; the tested scripts are unchanged at this head. I did not run website build/browser visual checks or live CircleCI/Vercel deployment tests.

@ntucker
ntucker merged commit e12b52a into master Oct 5, 2026
22 checks passed
@ntucker
ntucker deleted the claude/project-thread-46pino branch October 5, 2026 01:54
ntucker pushed a commit that referenced this pull request Oct 5, 2026
Ported from #4176 (already on master via #4174) so unit_tests-latest isn't
blocked by the Codecov uploader outage; it no-ops once this branch
reaches master.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

ntucker commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

Sol review bot (GPT-6.1 Sol, High): I posted this review of commit 241cf9fd2b18.

ntucker added a commit that referenced this pull request Oct 6, 2026
)

* docs(skills): Generate skill references from the docs

Skill references were symlinks to docs MDX, so agents saw raw :::react/:::vue
blocks, never saw imported partials (e.g. the install code in
_installation.mdx), and Vue skills shipped React-only pages.

Each skill now lists its docs in references.json; `yarn build:skills`
renders them per framework into plain markdown (website/framework-docs/
docsToMarkdown.mjs, reusing remarkFramework.js and Docusaurus' MDX
preprocessing), writing <name>.vue.md where the Vue page differs. A
`skills` workflow fails on drift, and Cursor/Claude Code edit hooks
regenerate automatically.

Also fixes docs this surfaced: :::react blocks whose nested admonition had
more colons rendered a stray ":::" on React pages, and several relative
links in rest docs pointed at missing pages. The Vue testing skill now
imports from @data-client/vue/test and no longer ships the React-only
hooks testing guide.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tec5Fuv98wJacsP97Sg2H

* docs(skills): Add skills-sync rule and dead reference link check

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tec5Fuv98wJacsP97Sg2H

* fix(skills): Generate references from docs only, keep <name>.md for any framework

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tec5Fuv98wJacsP97Sg2H

* ci(skills): Check on lockfile bumps and master; reject symlinks and unmentioned variants

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tec5Fuv98wJacsP97Sg2H

* docs(skills): Bundle protocol setup guides into data-client-setup

references.json can now list `skills` to bundle. `yarn build:skills`
copies each bundled skill's SKILL.md body to references/<skill>.md and
its references and scripts under references/<skill>/, so
data-client-setup works without the REST, GraphQL or endpoint setup
skills installed. The --check drift check covers the copies.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* internal(skills): Simplify skill bundling

Reuse the front matter regex, memoize skill generation, rewrite every
relative link in a bundled SKILL.md, and only rerun the edit hook for
skills another skill bundles.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* docs(skills): Word setup guides to read right when bundled

Setup skills describe themselves as guides used after provider setup,
since data-client-setup now carries them. The bundler keeps a script's
shebang first and leaves links in fenced code alone.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* internal(skills): Drop duplicated comment

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* internal(skills): Regenerate bundles when the axios codemod changes

data-client-rest-setup symlinks its codemod from website/static/codemods,
so the skills check and edit hook now watch that folder too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* internal(skills): Regenerate references once per agent turn instead of per edit

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tec5Fuv98wJacsP97Sg2H

* docs(skills): Regenerate references for master's Vue concept docs

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tec5Fuv98wJacsP97Sg2H

* internal(skills): Tell the agent about skill problems at end of turn; survive stale stamps

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tec5Fuv98wJacsP97Sg2H

* internal(skills): Regenerate references before agent pushes instead of every turn

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018tec5Fuv98wJacsP97Sg2H

* docs(skills): Don't require data-client-rest before REST setup

data-client-setup bundles the REST setup guide but not data-client-rest,
so the guide now points at its own RestEndpoint and resource references
and treats data-client-rest as optional.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* ci: Skip Codecov upload when the uploader download fails

Ported from #4176 (already on master via #4174) so unit_tests-latest isn't
blocked by the Codecov uploader outage; it no-ops once this branch
reaches master.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* internal(skills): Follow git symlinks in checkouts without symlink support

With core.symlinks=false, git writes the axios codemod symlink as a file
holding its target path, so bundling copied the path instead of the
codemod. Resolve paths git tracks as symlinks either way.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* Move bundled-skill push inputs into pre-push.js

Master folded build-skills.js into pre-push.js; the merge had kept the old
file, which no hook runs. Bundled skills' files and the codemods they
symlink now trigger regeneration from pre-push.js.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* Simplify skill bundling: reuse index.js walk and FM, skip generated files before reading

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* Add GraphQL and custom async rows to setup's skills table

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

* Simplify skillReferences: generateSkill reads its own manifest, one git helper

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfViJqNPeWjfhvq9wLhPZ3

---------

Co-authored-by: Claude <noreply@anthropic.com>
ntucker pushed a commit that referenced this pull request Oct 6, 2026
The playground chrome restyle (#4174) sized preview checkboxes to 1rem, so
checkbox plus margins grew past the 21px the text field's width left for
it, and the field wrapped onto its own line under the checkbox. The row
now lays out as flex so the field fills whatever space the checkbox leaves.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmdXndvDqaKsZGyYx6hw63
ntucker added a commit that referenced this pull request Oct 6, 2026
* fix(website): Keep the new-todo text field next to its checkbox

The playground chrome restyle (#4174) sized preview checkboxes to 1rem, so
checkbox plus margins grew past the 21px the text field's width left for
it, and the field wrapped onto its own line under the checkbox. The row
now lays out as flex so the field fills whatever space the checkbox leaves.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmdXndvDqaKsZGyYx6hw63

* fix(website): Polish the new-todo field's hover and focus look

In dark mode the hovered or focused field was a near-black well with a pale
border on the lighter preview panel. It now lifts slightly over the panel and
focuses with the same blue as the checked checkboxes. Typed text uses the
same font as the todo titles, and the row can no longer overflow when that
font makes the input's intrinsic width larger.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmdXndvDqaKsZGyYx6hw63

---------

Co-authored-by: Claude <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — 241cf9fd Deployed Oct 5, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants