feat: simple-git.napi.rs website (landing + docs + Cloudflare deploy)#146
Conversation
Design spec for simple-git.napi.rs — a marketing + docs site modeled on image.napi.rs (void + Vite + React 19 + Tailwind v4 + Shiki, deployed to Cloudflare). Landing + Getting Started, teal-on-slate theme, animated benchmark + doc-site 'last updated' showcase (no WASM playground). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Executable task breakdown for subagent-driven-development, cloning the image.napi.rs void site for @napi-rs/simple-git. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…utes Task 1 of the marketing+docs site: add a minimal void (VoidZero) workspace under website/ that installs, builds, and serves two placeholder routes. - website/package.json (@napi-rs/simple-git-website), void.json, vite.config.ts, tsconfig.json, pages/index.tsx (<h1>), pages/docs/index.md. - Root package.json: add "workspaces": ["website"] (rewrites yarn.lock). - .gitignore: website build artifacts (.void/.wrangler/test-results/etc). No theme/content, no playground, no WASM — those come in later tasks. The native library is untouched (still require()s cleanly). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ep root .gitignore untouched) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Resolves the plan-internal contradiction Codex flagged in the Task 1 review. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…i, header/footer) Task 2 visual foundation for the @napi-rs/simple-git site (dark-only, teal-cyan): - app.css: Tailwind v4 @theme tokens (cool slate near-black + teal accent), fluid clamp() type-scale, film-grain overlay, @layer components helpers (.container-page/.site-header/.eyebrow/.reveal), CSS-only mobile-nav rules, and self-hosted @font-face for the three variable fonts. - lib/highlight.ts: workerd-safe Shiki JS-regex-engine singleton (github-dark). - public/favicon.svg: new git-branch mark, teal on #04211f. - public/fonts/*.woff2: latin-subset variable fonts sourced from @fontsource-variable, preloaded via void.json head.link (stable paths). - pages/layout.tsx + pages/_components/Footer.tsx: sticky blurred header with JetBrains-Mono wordmark + Docs/GitHub/npm nav, CSS-only mobile drawer, and footer (brand + tagline + links + "Built with napi-rs · MIT licensed"). No analytics. - tsconfig.json: include lib/. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add the content + primitives layer the landing sections (tasks 4-5) consume:
_data modules:
- samples.ts — hero + 5 tab code samples, byte-verbatim from README.md
- benchmarks.ts — 1.9 s vs 65 ms (1000×), ~29× derived
- features.ts — the 9 feature cards
- platforms.ts — 15 napi triples grouped by OS (cross-checked vs package.json), Node >= 10
- docSites.ts — Nextra/Docusaurus/Starlight/Fumadocs/Rspress (name + URL + text glyph)
index.server.ts — loader pre-highlights every sample server-side (Shiki JS-regex
engine, no runtime WASM) and returns HTML as props; head (title + description).
_components — reusable UI: CodeBlock (server-rendered highlighted HTML) plus the
_-prefixed interactive islands _CopyButton, _InstallSwitcher, _CountUp, _Reveal,
_TabbedCodeBlock. Landing is a regular Void route (full hydration), so islands need
no `with { island }` — matches the reference/Task 2 convention.
No-JS safe (code + reveals visible without JS); no analytics; no WASM.
index.tsx untouched — section wiring is Task 4.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Build the first three landing sections and wire them into pages/index.tsx (Task 4). Remaining sections land in Task 5. - Hero: eyebrow, "Git for Node, at native speed." (accent "native"), tagline, Get started/GitHub/npm buttons, InstallSwitcher, heroHtml CodeBlock, and three CountUp stat tiles (29× / 15 / 0 — all grounded in _data + package.json). - Benchmark: "~30× faster than shelling out"; IntersectionObserver bar animation (git CLI 1.9 s full bar vs simple-git 65 ms sliver, proportional to ms); big 29× CountUp; caption from _data/benchmarks.ts (README Performance · performance.mjs). - DocSiteShowcase: "Powers 'Last updated on' for your docs"; mock doc footer stamp "Last updated on Jul 6, 2026 by LongYinan"; getFilesLatestModified bulk CodeBlock (new docSiteSample, byte-verbatim from README, highlighted via the loader); row of the 5 generators from _data/docSites.ts (text-glyph monograms, no remote logos). Shared presentational components: SectionHeader, Button, Chip (un-prefixed, no client state). Interactive pieces reuse the Task 3 islands (_CountUp/_Reveal/ _InstallSwitcher) via the regular-route full-hydration model — no island markers. No-JS safe: all copy, code, benchmark labels/values and generator names are in the SSR HTML; bars render at final proportional widths and CountUp shows final values with JS off; reveals are gated behind html.js. No WASM, no analytics, no remote images. Verify: tsc --noEmit clean; void:prepare + vite build succeed (SSR + client); dev SSR renders all three sections with 0 console errors; reveals fire on scroll. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…opy to spec Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… copy Renders '29× faster / 15 platforms / 0 dependencies' in the approved lower case (numbers still sourced from benchSpeedup / platformCount / 0). tsc + build pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rix, CtaBand Append the remaining four landing sections after Hero/Benchmark/DocSiteShowcase so pages/index.tsx is complete end-to-end (Hero → Benchmark → DocSiteShowcase → Features → CodeSample → PlatformMatrix → CtaBand; Footer from layout). - Features: 3×3 responsive card grid from _data/features.ts (9 cards). - CodeSample: _TabbedCodeBlock over statusHtml/commitHtml/blameHtml/pushHtml/errorsHtml ([Status] [Stage & commit] [Blame] [Push] [Typed errors]); first tab visible with JS off. - PlatformMatrix: 15 triples grouped by 6 OS from _data/platforms.ts; count + Node engine derived. - CtaBand: centered InstallSwitcher + [Read the docs]->/docs and [GitHub] buttons. All reuse existing shared/island components + data modules; no island markers, no forbidden tech, no-JS safe (all content in SSR HTML). tsc/void:prepare/build clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the Task-1 placeholder with the full Getting Started content and add a centered prose layout for the /docs route. - docs/layout.tsx: single-column .void-md prose shell (header/footer come from the root layout). @void/md applies the prose theme; code is highlighted at build time by voidMarkdown() with Shiki's pure-JS regex engine — no runtime WASM, page reads fully with JS disabled. - docs/index.md: Install (npm/yarn/pnpm/bun), 15 prebuilt triples + Node >= 10, 60-second example, flagship getFilesLatestModified doc-site "last updated", async & AbortSignal, typed errors (isGitError/GitErrorCode), dispose()/free()/ using, and Full API links to the GitHub README + npm. In-page [[toc]]. All code/API grounded in README.md and index.d.ts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ction Full API now links GitHub README + type definitions (index.d.ts) + npm, matching the plan/spec requirement. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…de feature cards Task 7 of the @napi-rs/simple-git website build. - .github/workflows/void-deploy.yml: mirror ../Image deploy workflow, only changing the project to napi-simple-git. Push to main on website/** changes, Node 24, corepack, root `yarn install --immutable`, `yarn void deploy --project napi-simple-git` in website/, GitHub OIDC (id-token: write). - website/playwright.config.ts + website/e2e/smoke.spec.ts: deterministic smoke test over the Vite/Void SSR dev server. Asserts `/` 200 + hero H1 "Git for Node, at native speed." + "01 — BENCHMARK" eyebrow, and `/docs` 200 + the "Getting Started" heading. 2 passed. - website/pages/_components/Features.tsx: render backtick-delimited API names in feature `desc` strings as styled inline <code> (split on backtick, wrap odd segments). No markdown lib, no data change; server-rendered and no-JS safe. Responsive pass verified empirically (Chromium 320/360/375/414 on / and /docs): no horizontal body scroll, wide content scrolls within its own overflow-x:auto container, mobile drawer + tap targets work. No CSS changes needed. tsc clean; void:prepare + build succeed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…out JS) The API section's tabbed code block hid inactive panels with the HTML `hidden` attribute and required JS to switch tabs, so with JavaScript disabled only the first of five code samples was ever visible. Emit all five panels with no `hidden` attribute and drive show/hide from app.css, gated on the existing `html.js` class (set before first paint by the layout's inline script, the same mechanism `.reveal` uses). Without JS the tab bar is hidden and every panel shows stacked, each with a visible per-panel label; with JS only the active panel (data-active) shows and clicking a tab swaps instantly, with no flash of all five before hydration. ARIA tablist/tab/tabpanel wiring is preserved. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_50e3ca30-6d54-4b19-bd3f-9930b438dfbd) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ad61cd7ee0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Grounded in the multi-agent SEO audit findings (verified). Covers head/social meta, canonical, JSON-LD, robots/sitemap, prerender/CWV, and a11y — all inside website/. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ts, sitemap) Add the static asset layer the SEO/meta tags will reference: - public/og.png (1200x630) on-brand social share card - public/apple-touch-icon.png (180x180) + public/favicon.png (32x32) from favicon.svg - public/robots.txt + public/sitemap.xml (/, /docs @ lastmod 2026-07-06) - scripts/gen-og.mjs: reproducible generator using the installed Playwright chromium (no new dependency), fonts embedded as data URIs Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…l/og Move route-invariant tags (charset, theme-color, og:type/site_name/image*, twitter:card/image, apple-touch-icon + PNG favicon fallback) into the void.json base head; add per-route canonical + og:url and benefit-copy og:title on home, and rewrite the description const. Delete the tags that moved to base so each renders exactly once (void appends links, overrides meta by name/property). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…escription)
SEO Task 3: give /docs its own canonical + og:url and a right-length
description via a co-located server head, since void markdown frontmatter
silently drops head/link/og keys.
- Add website/pages/docs/index.server.ts head export:
- re-declares title 'Getting Started' and the docs description (a server
head REPLACES the frontmatter-derived head)
- link canonical https://simple-git.napi.rs/docs (non-trailing-slash form)
- meta description + og:title/og:description + og:url .../docs
- Trim description to 146 chars (was 175, clipped in SERPs) by dropping the
trailing "Powered by libgit2 and Rust." clause; keep index.md frontmatter
in sync. Docs body unchanged.
Void's head merge keeps every route-invariant base social tag (og:type,
og:site_name, twitter:card, og:image, theme-color, charset) and wraps the
title with the "%s | @napi-rs/simple-git" template.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SEO Task 4: emit two schema.org JSON-LD blocks from the root layout so both / and /docs are eligible for rich results. Fields grounded in package.json (name, version 1.0.0, MIT, repo, npm) and the 15 napi targets (OS list). Serialized via JSON.stringify; server-only, no client JS. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…eable
Both landing (/) and docs (/docs) carry no request- or time-varying data yet
were re-rendered per request (prerender=false + routing.revalidate {"*":0}),
re-running Shiki on every hit. Switch both to prerender=true so they render
once per deploy and serve from the edge cache, and drop the revalidate:0 block
that (per void's "TTL 0 is skipped" rule) would otherwise suppress prerender.
Islands (CountUp/InstallSwitcher/tabs) still hydrate client-side; no-JS render
and the /docs/ 308 redirect are unchanged.
Worker asset precedence (run_worker_first: ["/**"]) is generated by void and
NOT exposed via void.json (worker/routing are additionalProperties:false, no
assets knob); left as-is per brief, to raise upstream. See task-5 report.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…els, new-tab cues, hero LCP, font/grain) - Skip link (first fragment child) + <main id="main-content"> (WCAG A) - Zero-specificity :where() :focus-visible ring in app.css Base (WCAG 2.4.7) - aria-label="Primary" on desktop + drawer navs, "Footer" on footer nav - Centralized "opens in a new tab" sr-only cue: Button (target=_blank), layout NAV, Footer links, DocSiteShowcase used-by row; rel="noreferrer" kept - Hero above-fold code column: <Reveal> -> plain <div> so LCP isn't opacity:0 JS-gated; dropped unused Reveal import; below-fold reveals untouched - Removed mix-blend-mode: soft-light from body::after film grain - font-display: swap -> optional on all three @font-face blocks (no mid-view swap => no CLS) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_dfe040d5-2bd6-47db-bdb8-37b9f6aaccee) |
SEO pass (added to this branch)Following a multi-agent SEO audit of the site, wired the full share/discovery layer (all inside
One item needs an upstream/deploy change (not in-repo actionable)The generated 🤖 Generated with Claude Code |
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Expose the site to LLM agents via the llmstxt.org convention: - website/public/llms.txt — curated map (summary, docs links, grounded Core API surface, install commands); every API name verified against index.d.ts, facts (1.0.0, MIT, 15 targets, Node >= 10) per package.json. - website/public/llms-full.txt — full Getting Started docs in one plain markdown fetch, derived from pages/docs/index.md (frontmatter + [[toc]] stripped, retitled, code blocks intact). - website/public/robots.txt — comment pointer to /llms.txt after Sitemap. All served at web root (dist/client). Build + Playwright e2e green; library untouched; only website/public/ changed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…I ref part A)
Codex grounding gate flagged prose beyond the JSDoc for three thin-doc
methods. init now states only what README ("init a git repository") +
the signature support; findTree/findCommit keep the null-if-not-found
note but tie it explicitly to their `T | null` return type (also
grounded by the README's `findTree(oid)!` / `findCommit(oid)!` usage).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Document the second half of the Repository class in website/pages/docs/api.md: state & inspection, config/signature, remotes, branches/checkout/references, tags, diffs, revwalk and resource cleanup. Signatures copied verbatim from index.d.ts; prose grounded in JSDoc/signatures/README. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…claim (API ref objects) Codex gate: (1) the TreeIter fence now shows the complete verbatim class declaration from index.d.ts (incl. the body and next()); (2) removed the "msg is recorded in the reflog" note on Reference.rename — true in libgit2 but not stated in the rename JSDoc or README, so ungrounded. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Final codex nit ([low]): index.d.ts emits a blank line after the TreeIter class opening brace; mirror it so the fenced declaration is byte-identical. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_d3085bc0-8554-43a5-816d-af2740c0a966) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1408fe0d05
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…classes Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ref) The RevWalk entry dumped the entire class body (with all JSDoc) as one fence AND repeated every member in its own #### section — a Task-4 over-correction. The prose one-liner already states the `extends Iterator<string, void, void>` inheritance and each member is documented individually, so the giant fence was pure redundancy. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codex gate: the Diff class intro claimed deltas "between two trees, or a tree and the working directory", but the only Diff-producing APIs are diffTreeToWorkdir and diffTreeToWorkdirWithIndex (both tree-to-workdir); there is no tree-to-tree diff method. Dropped the ungrounded "two trees". Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… ref) Codex gate [low]: the options-class constructors asserted default states (default clone/fetch/push settings, no proxy, no callbacks) that aren't in the constructor JSDoc/README. Reduced each to "Create a new X." — grounded in the bare constructor signature; the setters below document configuration. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_c21908f2-3e21-410c-bf26-f5b2a6a4b80c) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 280d48f433
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…PI ref) Codex gate: the DiffFlags enum note said "flags on a DiffFile", but the flags are exposed via DiffDelta.flags() (index.d.ts:349-356) and DiffFile has no flags() accessor. Corrected the lead to DiffDelta (the rest of the sentence already referenced DiffDelta.flags()). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_665c34d2-e280-4286-92d4-5fcb739a5624) |
…lish Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The typed-error try/catch example branched on GitErrorCode.NotFound after
calling repo.findRemote('does-not-exist'), but findRemote returns
Remote | null (index.d.ts:1091) — it never throws for a missing remote,
so the catch would not fire. Replace the call with a neutral placeholder
(matching the README's error-handling example) in the new /docs/api
Error handling section AND in the pre-existing Getting Started page +
llms-full.txt where the same broken example had shipped.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_5e6c6e05-8a0a-4862-927c-1e96d4d27b4c) |
The website's build/test:e2e were only ever exercised via `yarn void deploy`, which is gated to push-to-main — so a PR breaking the Vite/TS/ markdown build passed native CI and only failed at deploy. Add a `website` job (build + Playwright smoke of / , /docs, /docs/api) that runs whenever website-affecting paths change, on PRs and pushes alike. The `changes` gate now fires for all triggers (not just main pushes) so it can drive the PR gate; `deploy` gains an explicit push+main guard to stay main-only. The website has no dependency on the native .node binary (library imports appear only inside doc code fences), so the job needs no Rust build. Addresses codex review finding on PR #146 (website not built in PR CI). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_c80bd087-5b1b-4f88-b45f-234f72fab533) |
The API Reference was a follow-on sub-project of the website, tracked in
its own spec/plan pair. Fold each into its website parent so there is one
spec and one plan for the whole site:
- spec: API-reference design becomes §11 of the website design spec; the
superseded "no full API-reference" non-goal and the route list updated.
- plan: API-reference tasks become Phase 3 (7 tasks + constraints + done
criteria) of the website plan; intro now says three phases.
Deletes the two standalone -api-reference-{design,plan}.md files. No
content lost — merged verbatim, re-leveled to fit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_311022d0-7dc6-40de-8cbf-24537a42bdbd) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3fbf66bce5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
`deploy` only had `needs: changes`, the same as the `website` job — so on a push to main both started in parallel once change-detection finished, and `void deploy` could publish before the Playwright smoke (/ , /docs, /docs/api) even finished, let alone passed. A later e2e failure then left a broken site already live. Add `website` to deploy's `needs` so the build + smoke must succeed first. When website changed the website job always runs (needs satisfiable); when it didn't, deploy's existing push+main+website==true `if` skips it regardless, so no deadlock. Addresses codex review finding on PR #146 (deploy not gated on e2e). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_9d8b70c2-a300-463d-9e4a-6a4acb9c86de) |
What
Adds a marketing + docs website for
@napi-rs/simple-git—simple-git.napi.rs— modeled on image.napi.rs. Built as a self-containedwebsite/Yarn workspace; the library is untouched (only change to rootpackage.jsonis theworkspacesfield).Highlights
1.9 svs65 ms, 1000×getFileLatestModifiedDate, ~29×). Content is grounded in the README /index.d.ts/package.json— code samples are byte-verbatim from the README; the 15 prebuilt platform triples andNode >= 10come frompackage.json.AbortSignal· typed errors · resource cleanup) inside a two-column sidebar shell./docs/api) — a hand-authored, comprehensive reference (~3,000 lines, 257 members): the wholeRepositoryclass, all 24 other object/handle classes, the 13 option/result interfaces, all 18 enums (with theGitErrorCodemeanings table), the 3 standalone functions, and error handling. Every signature is verbatim fromindex.d.tsand every claim is grounded in its JSDoc / the README — built task-by-task with a per-task codex grounding gate (which caught, among others, an invented tree-to-tree diff, a bogus reflog side-effect, and a brokenfindRemoteerror example that had also shipped in Getting Started).SEO & discovery
From a multi-agent SEO audit (6 dimensions, adversarially verified), all landed in this PR:
og.png(1200×630, viascripts/gen-og.mjs),theme-color, apple-touch-icon.og:urlon both routes; route-invariant tags invoid.json, per-route tags in each*.server.tshead.SoftwareApplication+WebSite(schema.org) in the root layout, matched topackage.json/LICENSE.robots.txt+sitemap.xml;prerender=trueon both routes (static HTML, no per-request Shiki).focus-visiblerings, nav labels, new-tab cues; hero LCP no longer reveal-gated;font-display: optional.Agent-friendly (llms.txt)
llms.txt— llmstxt.org-conformant map: H1 + summary + install/API detail, then a single link-list## DocumentationH2 (docs · full-text · README · types · npm).llms-full.txt— the complete Getting Started guide as one self-contained file, kept in sync with the docs body.robots.txtpoints crawlers at/llms.txt.index.d.ts— including the typed-error contract (git-layer errors carry aGitErrorCode, narrowable withisGitError; an aborted*Asynccall rejects with napi'sAbortErrorcode === 'Cancelled', whichisGitErrordoes not match).Testing
tsc --noEmitvoid:prepare+vite buildtest:e2e)ava)require('./index.js')Notes
CI.ymlgates the website by changed paths (achangesjob using dorny/paths-filter, scoped towebsite/**plus the shared root package-manager filesyarn.lock,package.json,.yarnrc.yml,.yarn/releases/**):websitejob runsvoid:prepare+vite build+ the Playwright smoke (/,/docs,/docs/api), so a broken site fails the PR before merge instead of only at deploy time.main— the same gate additionally runs adeployjob (void deploy --project simple-git, GitHub OIDC, no long-lived secret) — live at https://simple-git.void.app (custom domainsimple-git.napi.rsmapped separately), independently of the native build/test jobs (noneedson them).deployneeds: [changes, website], so the build + Playwright smoke must pass before it publishes — production is never updated ahead of the e2e gate..node(library imports appear only inside doc code fences), so neither job needs a Rust build. The workflow's push trigger uses a positivepathsfilter that re-includeswebsite/**, so website-markdown-only changes still build/deploy.website/is excluded from the npm tarball by the existingfiles/.npmignore, so publishing is unaffected.docs/superpowers/{specs,plans}/2026-07-06-simple-git-website-*.md(same convention as prior features in this repo).assets.run_worker_first, so static assets route through the SSR Worker first — to fix at deploy or upstream, not in-repo.Review
Built via subagent-driven development; each task and the whole branch were reviewed with
codex:adversarial-review. Automated Codex bot comments were verified against the real CI run and addressed:b7b6fd5(root package-manager files added to the deploypaths).enableScripts: false, so no dep postinstall runs; Build FreeBSD passes and the full CI run is green (install overhead ≈ +20s). The only fix would touch nativeCI.yml, conflicting with the "native build untouched" constraint — not worth it.GitErrorCode; scoped it to Git-layer errors + theAbortErrorcancellation path (561cea7), consistent with the docs / llms.txt /index.d.ts.CI.yml, the workflow-levelpaths-ignore: **/*.mdwould skip the run before the deploy gate; replaced with a positivepathsfilter that re-includeswebsite/**(82afc64).napi-simple-gitdoesn't exist; corrected tosimple-git(720bec5), verified by a successful manualvoid deploy.void deploy(push-to-main) built the site, so a PR with a broken build passed native CI and failed only at deploy; added a PR-gatedwebsitebuild + e2e job (58fd576).deployonlyneeds: changes, so on push-to-main it ran in parallel with thewebsitejob and could publish before Playwright finished; addedwebsiteto deploy'sneeds(c693a25).🤖 Generated with Claude Code