Skip to content
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
f511d3c
docs: replace MkDocs with Zensical
claude Jul 7, 2026
4793412
docs: fix serve-docs.sh usage text
claude Jul 7, 2026
9e87ecb
docs: single-source the Zensical build recipe in scripts/docs/build.sh
maxisbey Jul 9, 2026
bb164d1
docs: fail the docs build when the nav references a missing page
maxisbey Jul 9, 2026
4b13682
docs: correct stale comments and the nav type alias
maxisbey Jul 9, 2026
13b42dc
docs: relock for zensical 0.0.48
maxisbey Jul 9, 2026
3786d39
docs: fix the PERF401 lint error in gen_ref_pages.py
maxisbey Jul 9, 2026
6ef1f84
docs: pin the API index rendering for cross-package re-exports
maxisbey Jul 9, 2026
eb1ffae
docs: restore watch and drop the stale banner env
maxisbey Jul 9, 2026
a05482d
docs: catch the failure modes zensical builds green
maxisbey Jul 9, 2026
5464185
docs: fix summary truncation and harden the API generator
maxisbey Jul 9, 2026
878e21e
docs: trim dead config knobs and clarify the griffelib dependency
maxisbey Jul 9, 2026
d629160
docs: preload cross-package alias targets in the compact index stub
maxisbey Jul 9, 2026
e927853
docs: port the sidebar styling to Zensical's nav and restore the slat…
maxisbey Jul 9, 2026
153d384
docs: give generated API stubs explicit page titles
maxisbey Jul 9, 2026
7d3d1dd
docs: fix the sidebar rule cascade and print scheme scoping
maxisbey Jul 9, 2026
de9d8fa
docs: align top-level nav pages and the API Reference label flush left
maxisbey Jul 9, 2026
c8449b7
docs: rebuild the sidebar styling as one coordinate system
maxisbey Jul 9, 2026
0d3ef49
docs: put the pill inset on the elements that paint it
maxisbey Jul 9, 2026
b0dc3d9
docs: composite inline code over admonition tints
maxisbey Jul 9, 2026
0fc3242
docs: replace the llms_txt link regexes with a total classifier
maxisbey Jul 10, 2026
a483385
docs: validate crossrefs and inventories from the built site
maxisbey Jul 10, 2026
72f1d97
docs: compact-index every package that re-exports from outside its su…
maxisbey Jul 10, 2026
029a47c
docs: restore the markdown extensions pymdownx.extra bundled
maxisbey Jul 10, 2026
d479b22
docs: fail the build on pages missing from the nav
maxisbey Jul 10, 2026
f7db9d9
docs: pin the Zensical toolchain exactly
maxisbey Jul 10, 2026
57f9e0a
docs: bump zensical to 0.0.50 to fix search
maxisbey Jul 10, 2026
d90f709
docs: compact every module that re-exports from outside its subtree
maxisbey Jul 10, 2026
8acb8dd
docs: tighten the prose extractor and link classifier edge cases
maxisbey Jul 10, 2026
f978b68
docs: close nav containment, HTML-comment, and whitespace link gaps
maxisbey Jul 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions .github/workflows/deploy-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ on:
- src/mcp/**
- src/mcp-types/**
- scripts/build-docs.sh
- scripts/docs/**
- pyproject.toml
- uv.lock
- .github/workflows/deploy-docs.yml
Expand Down Expand Up @@ -49,9 +50,6 @@ jobs:

- name: Build combined docs (v1.x at /, main at /v2/)
run: bash scripts/build-docs.sh site
env:
# Silence mkdocs-material's MkDocs 2.0 warning banner in CI logs.
NO_MKDOCS_2_WARNING: "1"

- name: Configure Pages
uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0
Expand Down
20 changes: 8 additions & 12 deletions .github/workflows/shared.yml
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,13 @@ jobs:
- name: Check README snippets are up to date
run: uv run --frozen scripts/update_readme_snippets.py --check

# `mkdocs.yml` sets `strict: true` and `pymdownx.snippets: check_paths: true`,
# but until this job existed the docs were only ever built post-merge by
# `deploy-docs.yml`, so a broken link, a missing nav target, or a deleted
# `docs_src/` include went green on the PR and broke the next deploy of main.
# This is the check path; `deploy-docs.yml` stays the deploy path.
# `zensical build --strict` fails on broken links / missing nav targets and
# `pymdownx.snippets: check_paths: true` fails on a deleted `docs_src/`
# include; the llms_txt step additionally re-resolves every snippet and link.
# Until this job existed the docs were only ever built post-merge by
# `deploy-docs.yml`, so those failures went green on the PR and broke the next
# deploy of main. This is the check path; `deploy-docs.yml` stays the deploy
# path.
Comment thread
claude[bot] marked this conversation as resolved.
Outdated
docs:
runs-on: ubuntu-latest
steps:
Expand All @@ -168,11 +170,5 @@ jobs:
enable-cache: true
version: 0.9.5

- name: Install dependencies
run: uv sync --frozen --all-extras --python 3.10

- name: Build the docs in strict mode
run: uv run --frozen --no-sync mkdocs build --strict
env:
# Silence mkdocs-material's MkDocs 2.0 warning banner in CI logs.
NO_MKDOCS_2_WARNING: "1"
run: bash scripts/docs/build.sh
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,13 @@ venv.bak/
# Rope project settings
.ropeproject

# mkdocs documentation
# documentation
/site
/.worktrees/
# Generated at build time by scripts/docs/ (the API reference tree and the
# concrete Zensical config spliced from mkdocs.yml).
/docs/api/
/mkdocs.gen.yml

# mypy
.mypy_cache/
Expand Down
94 changes: 61 additions & 33 deletions docs/extra.css
Original file line number Diff line number Diff line change
@@ -1,26 +1,52 @@
/* Sidebar hierarchy + density for MkDocs Material 9.7.x.
All rules scoped to the desktop sidebar breakpoint (>= 76.25em), matching
Material's own scoping for navigation.sections, so the mobile drill-down
drawer keeps stock styling. Colors use Material tokens, so the light and
slate schemes both work without extra palette handling. */
/* Sidebar hierarchy + density for Zensical's UI (Material-compatible md-*
DOM, but different stock spacing: nav links are 8px-radius pills with
7px 16px padding). All rules scoped to the desktop sidebar breakpoint
(>= 76.25em) so the mobile drill-down drawer keeps stock styling. Colors
use the md-* tokens, so the light and slate schemes both work without
extra palette handling. */

@media screen and (min-width: 76.25em) {
/* Section labels: smaller, uppercase, letter-spaced, muted. Covers both the
clickable index-page headers and the bare API Reference label. */
/* Tighten vertical rhythm: the stock pill rows (7px 16px padding plus
6.3px top margins) read too airy for a deep nav; keep the pill shape
and active highlight, just denser. Group rows that link to an index
page wrap their anchor in an .md-nav__container div whose stock
padding is 0 — densify the inner anchor, not the wrapper. The
section items are excluded outright: their label is styled by the
section rules below, and the :not() classes here would otherwise
out-rank those on specificity. */
.md-sidebar--primary .md-nav__item:not(.md-nav__item--section) > .md-nav__link:not(.md-nav__container) {
padding: 4px 10px;
margin-top: 2px;
}
.md-sidebar--primary .md-nav__item:not(.md-nav__item--section) > .md-nav__container {
margin-top: 2px;
}
.md-sidebar--primary .md-nav__container > .md-nav__link {
padding: 4px 10px;
}
.md-sidebar--primary .md-nav__item--section {
margin: 1em 0;
}

/* Section labels: smaller, uppercase, letter-spaced, muted, and flush
with the guide line below them. The label is a container whose inner
anchor carries the stock pill padding; zero both so the label text
starts at the section's left edge. */
.md-sidebar--primary .md-nav__item--section > .md-nav__link {
margin-top: 0;
margin-left: 0;
padding: 2px 0;
font-size: 0.62rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--md-default-fg-color--light);
}
.md-sidebar--primary .md-nav__item--section > .md-nav__link > a {
padding: 2px 0;
}

/* Indent section children and hang a guide line. Material outdents section
children with [dir=ltr] ... margin-left: -0.6rem, which is why they sit
flush under the header; restoring the margin re-exposes the stock 0.6rem
list padding. The logical property ties Material's physical one at
(0,3,0) specificity and wins on source order (extra_css loads last),
while staying direction-agnostic. */
/* Indent section children slightly and hang a guide line. */
.md-sidebar--primary .md-nav__item--section > .md-nav {
margin-inline-start: 0.1rem;
border-inline-start: 0.05rem solid var(--md-default-fg-color--lightest);
Expand All @@ -32,26 +58,20 @@
border-inline-start: 0.05rem solid var(--md-default-fg-color--lightest);
}

/* Tighten vertical rhythm (stock: 0.625em link margins, 1.25em sections).
The child combinator keeps this off anchors inside md-nav__container,
which carry their own margin-top: 0 stock rule. */
.md-sidebar--primary .md-nav__item > .md-nav__link {
margin-top: 0.45em;
}
.md-sidebar--primary .md-nav__item--section {
margin: 1em 0;
}
.md-sidebar--primary .md-nav__item--section > .md-nav__link {
margin-top: 0;
}

/* The current page stands out from its siblings. 700 because Material only
loads Inter at 300/400/700; a 600 would silently substitute the 700 face
anyway, but render lighter on the system-font fallback stack. */
/* The current page stands out from its siblings (on top of the stock
pill highlight). 700 because only Inter 300/400/700 are loaded. */
.md-sidebar--primary .md-nav__link--active {
font-weight: 700;
}

/* Top-level pages outside any section (the homepage entry, Protocol
versions, Troubleshooting, ...) share the left edge with the section
labels: pull the link box left by its own pill padding, so the text
is flush and the hover/active pill overhangs into the gutter. */
.md-sidebar--primary .md-nav--primary > .md-nav__list > .md-nav__item:not(.md-nav__item--section) > .md-nav__link:not(.md-nav__container) {
margin-inline-start: -10px;
}

/* The sidebar repeats the site name right above the homepage nav entry;
drop the title row on desktop (the mobile drawer still needs it for its
drill-down back-navigation, hence the media-query scope). */
Expand All @@ -60,10 +80,18 @@
}
}

/* Headings: Material's 300-weight light-gray defaults read washed out; use
the full foreground color and a solid weight instead. 700, not 600: the
Google Fonts request only carries Inter 300/400/700 (see the nav__link
note above). */
/* Dark scheme: Zensical's slate canvas is near-black (hsla(225,15%,5%)),
harsher than the Material slate this site shipped with; restore that
blue-grey. Code blocks and other surfaces keep Zensical's own tokens. */
@media screen {
[data-md-color-scheme="slate"] {
--md-default-bg-color: #1e2129;
}
}

/* Headings: the 300-weight light-gray defaults read washed out; use the
full foreground color and a solid weight instead. 700, not 600: only
Inter 300/400/700 are loaded (see the nav__link note above). */
.md-typeset h1,
.md-typeset h2 {
font-weight: 700;
Expand Down
40 changes: 0 additions & 40 deletions docs/hooks/gen_ref_pages.py

This file was deleted.

Loading
Loading