Skip to content

fastmcp-autodoc: add prompts + resources + templates#21

Merged
tony merged 18 commits intomainfrom
fastmcp-autodoc-prompts-resources
Apr 19, 2026
Merged

fastmcp-autodoc: add prompts + resources + templates#21
tony merged 18 commits intomainfrom
fastmcp-autodoc-prompts-resources

Conversation

@tony
Copy link
Copy Markdown
Member

@tony tony commented Apr 17, 2026

Summary

Mirror the existing {fastmcp-tool} autodoc surface for the other three
first-class FastMCP components: prompts, resources, and resource
templates
. Four new directives, one new collector strategy, new type
badges with a MIME pill for resources.

New directives

  • {fastmcp-prompt} <name> — card with the prompt name as signature + a prompt type badge + description from the Python docstring (first paragraph only).
  • {fastmcp-prompt-input} <name> — arguments table (name / type / required / description). Type is enriched from the Python signature so str, float etc. show up.
  • {fastmcp-resource} <name> — card with the URI as signature + resource type badge + MIME pill + facts row.
  • {fastmcp-resource-template} <name> — same shape but with a URI template (e.g. tmux://sessions/{session_name}{?socket_name}) + parameters table derived from the JSON schema.

Collector

New fastmcp_server_module config value points at a live FastMCP instance:

```python
conf["fastmcp_server_module"] = "libtmux_mcp.server:mcp"
```

The collector reads local_provider._components directly. The async _list_* helpers in FastMCP are trivial filters over that dict; iterating the dict avoids standing up an asyncio loop at Sphinx build time.

If the configured instance has zero components registered (common when a server module exposes _register_all() and only invokes it from run_server()), the collector calls register_all() / _register_all() on the same module to populate them.

Badge vocabulary

  • Type: prompt (💬), resource (🗂️), resource-template (🧭)
  • MIME: a compact pill with the type string (e.g. application/json, text/plain)
  • Tags: any tags on the registered component render as small pills

CSS classes follow the existing gp-sphinx-fastmcp__* BEM namespace.

Noise cleanup

  • Strip FastMCP's auto-appended \"Provide as a JSON string matching the following schema: {...}\" hint from prompt argument descriptions. It's aimed at LLMs; for human docs it's noise.
  • Trim descriptions to the first paragraph so the signature card doesn't spill into Parameters / Returns sections from NumPy-style docstrings.

DX choice

The prompt and resource directives emit the card inline (no enclosing <section>) so the surrounding ## markdown heading stays the anchor source of truth. That preserves the existing DX of pages like docs/tools/prompts.md, where each prompt has a visible ## run_and_wait heading followed by a mix of prose (**Use when**, **Why use this**, **Sample render**) and the autodoc block. Writers keep their editorial voice; the signature + args table stay in sync with the live server surface.

Test plan

  • uv run ruff check . && uv run ruff format --check .
  • uv run mypy
  • uv run pytest
  • Manual: built libtmux-mcp docs with the new fastmcp_server_module wired in; confirmed 4 prompts + 6 resource templates render with badges and clean descriptions. Before/after screenshots in the linked libtmux-mcp PR.

What this does NOT do

  • Live-enumerating completion (e.g. autocomplete of session_name from the real server) — completion providers are tracked separately, see libtmux-mcp's new docs/topics/completion.md for how the spec maps onto what FastMCP provides out of the box.
  • Write-hooks on resources (set_resource / unset_resource) — neither the MCP spec nor FastMCP exposes these; the autodoc surface is read-only.

@tony tony force-pushed the fastmcp-autodoc-prompts-resources branch from 1fc1f01 to b69aec2 Compare April 17, 2026 23:09
@tony

This comment has been minimized.

@codecov-commenter
Copy link
Copy Markdown

codecov-commenter commented Apr 18, 2026

Codecov Report

❌ Patch coverage is 79.38517% with 114 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.89%. Comparing base (977b8ca) to head (8834a5f).

Files with missing lines Patch % Lines
...c-fastmcp/src/sphinx_autodoc_fastmcp/_collector.py 42.77% 99 Missing ⚠️
...-fastmcp/src/sphinx_autodoc_fastmcp/_directives.py 90.97% 13 Missing ⚠️
...-fastmcp/src/sphinx_autodoc_fastmcp/_transforms.py 92.30% 1 Missing ⚠️
...rc/sphinx_autodoc_typehints_gp/_numpy_docstring.py 98.21% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main      #21      +/-   ##
==========================================
- Coverage   90.31%   89.89%   -0.42%     
==========================================
  Files         147      148       +1     
  Lines       12605    13134     +529     
==========================================
+ Hits        11384    11807     +423     
- Misses       1221     1327     +106     

☔ View full report in Codecov by Sentry.
📢 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.

@tony tony force-pushed the fastmcp-autodoc-prompts-resources branch from 6d62fd6 to 267a9e2 Compare April 19, 2026 09:04
@tony

This comment has been minimized.

@tony tony changed the title fastmcp-autodoc: add prompts + resources + templates (#21) fastmcp-autodoc: add prompts + resources + templates Apr 19, 2026
tony added a commit that referenced this pull request Apr 19, 2026
why: Document the user-visible effects of the seven preceding commits so the unreleased changelog reflects the final shape of the PR's surface.
what:
- Six bullets under Bug fixes covering: typed std-domain accessor + display-name fix, unconditional register-all hook, narrowed ImportError catch, tilde role shortener, bracket-aware Raises split, and scoped empty-rubric suppression
@tony tony force-pushed the fastmcp-autodoc-prompts-resources branch 2 times, most recently from 1ac5d44 to 75e15b3 Compare April 19, 2026 14:13
tony added a commit that referenced this pull request Apr 19, 2026
why: Document the user-visible effects of the seven preceding fixups so the
unreleased changelog reflects the final shape of the PR's surface area.

what:
- Six bullets under Bug fixes covering: typed std-domain accessor + display-name
  fix, unconditional register-all hook, narrowed ImportError catch, tilde role
  shortener, bracket-aware Raises split, and scoped empty-rubric suppression.
tony added a commit that referenced this pull request Apr 19, 2026
why: PR #21 added {fastmcp-prompt}, {fastmcp-prompt-input}, {fastmcp-resource},
and {fastmcp-resource-template} but had zero end-to-end coverage; the Weave
review flagged this as Critical. Lock in the rendered shape so future refactors
can't silently regress section IDs, sibling adoption, MIME pills, or {ref}
resolution.

what:
- Add tests/ext/fastmcp/test_directives_integration.py — one module-scoped
  SharedSphinxResult fixture builds a synthetic doc with all four directives
  against an injected FastMCP-shaped fake server (no real fastmcp dependency).
- Five @pytest.mark.integration tests assert: canonical fastmcp-{kind}-{name}
  section IDs, MIME pill class on resource cards, prompt argument table
  contents, parameter table inside the resource-template card section (sibling
  adoption), and {ref} cross-references resolve with zero "undefined label"
  warnings.
@tony tony force-pushed the fastmcp-autodoc-prompts-resources branch from 75e15b3 to f26270e Compare April 19, 2026 14:21
tony added 18 commits April 19, 2026 09:24
MCP prompts and resources now get the same autodoc surface tools do. Four
directives, rendered through the shared ``build_api_card_entry``
pipeline:

- ``{fastmcp-prompt}`` — name + description card with a ``prompt`` type badge
  and any tag pills.
- ``{fastmcp-prompt-input}`` — arguments table (name / type / required /
  description), type enriched from the Python signature.
- ``{fastmcp-resource}`` — URI + description + ``resource`` badge + MIME pill +
  facts row. For fixed-URI resources.
- ``{fastmcp-resource-template}`` — same shape but with the URI template as the
  signature and a parameters table derived from the JSON schema (path and query
  parameters).

Collector-wise, a new ``fastmcp_server_module`` config value
(``"pkg.server: mcp"``) points at a live FastMCP instance. The collector reads
``local_provider._components`` directly (the async ``_list_*`` helpers are
trivial filters over that dict, so we avoid standing up an event loop at Sphinx
build time). If the server instance has zero components registered, we attempt
the conventional ``register_all()`` / ``_register_all()`` hook on the same
module — so docs can enumerate the same surface as a running server even when
registration is gated behind ``run_server()``.

The collector strips FastMCP's auto-appended ``"Provide as a JSON string
matching the following schema: {...}"`` from prompt argument descriptions; it's
noise in human docs, useful only to LLM consumers. First-paragraph trimming on
the description field keeps the ``Parameters`` and ``Returns`` sections of
NumPy-style docstrings out of the signature card — they're rendered separately
in the arguments table instead.

The directives emit cards inline (no enclosing section), so the surrounding
``##`` markdown heading stays the source of truth for anchors and ToC ordering.
That's a different choice than the tool directive made (tools create
hidden-title inner sections because there's no outer ``##`` heading above them
on the canonical tools pages), but it matches how prompts and resources are
typically presented — one readable heading per recipe, with the card slotted
beneath.

Info dataclasses intentionally don't retain the underlying function. FastMCP
resources register closure-local functions via ``@mcp.resource`` inside a
``register()`` closure; those are not picklable into Sphinx's environment cache.
We extract ``docstring``, argument types, and everything else eagerly at collect
time and store only strings.
Prompts and resources now match the tool directive's DX:

- FastMCPPromptDirective creates nodes.section() with section_id (prompt.name
  with underscores → hyphens), registers it via note_explicit_target, and passes
  an api_permalink to the card entry. Callers no longer need outer ## headings —
  the hidden title populates the TOC sidebar and {ref} cross-refs resolve
  correctly.

- _build_resource_card() gains optional section_id / document params; when set
  it wraps the card in a nodes.section() with the same anchor+permalink pattern.
  FastMCPResourceDirective and FastMCPResourceTemplateDirective pass
  section_id=name.replace("_","-").

- sphinx_autodoc_fastmcp.css: add :root variables and selector rules for
  type-prompt (violet), type-resource (emerald), type-resource-template (cyan),
  mime (gray), and tag (gray) badges, with light and dark mode variants matching
  the existing safety/tool-type pattern. TOC hide rule extended to cover all
  four type badges.
collect_tool_section_content previously only ran for sections with
_CSS.TOOL_SECTION. Prompt and resource card sections were never adopted, so
prose between directives (Use when, Why use this, sample renders, argument
tables) floated outside the card container rather than being folded in.

Add _CARD_SECTION_CLASSES frozenset covering TOOL_SECTION, PROMPT_SECTION, and
RESOURCE_SECTION. The existing transform logic and _tool_content_container
helper are generic enough to handle all three — the section structure is
identical (api_component entry > content chain).
Mirrors the existing dl.gp-sphinx-api-container hide/show pattern for card
shells (tool, prompt, resource). Previously the ¶ link was always visible; now
it appears only on header hover or :focus-visible.
why: fastmcp is an intentional optional runtime dependency not declared in
project deps; mypy reported import-not-found for fastmcp.prompts.base,
fastmcp.resources.base, and fastmcp.resources.template with no way to suppress
them.
what:
- Add [[tool.mypy.overrides]] for ["fastmcp", "fastmcp.*"] with
  ignore_missing_imports = true in pyproject.toml
why: The # type: ignore[assignment] on the except-branch null assignment was
unused — mypy never generated an assignment error there because the imported
names were unbound in the except path.
what:
- Remove # type: ignore[assignment] from _collector.py line 486
… import

why: _first_paragraph() duplicated first_paragraph() already in _parsing.py
(identical split/strip/replace logic, no new behaviour); _parsing is already
imported in this module.
what:
- Add first_paragraph to the _parsing import line
- Delete private _first_paragraph() function
- Replace all three call-sites with first_paragraph()
why: CLAUDE.md requires working doctests on all functions; _strip_schema_note
and _template_params_from_schema were missing them. Also converts
_strip_schema_note to r\""" to satisfy ruff D301 (backslash in docstring).
what:
- Add Examples section with two assertions to _strip_schema_note; convert
  docstring to r\""" and adjust \\n -> \n accordingly
- Add Examples section with three assertions to _template_params_from_schema
  covering None, empty dict, and a minimal properties schema
why: Two bugs caused broken API docs in libtmux: 1. Notes sections
containing only `.. todo: :` showed an empty rubric (todo
     renders as invisible HTML without todo_include_todos=True).
  2. Raises sections using : exc:`ExcType` role syntax produced malformed RST
     like ':raises :exc:`exc.Foo`:' instead of a valid field list entry.

what:
- Add _ROLE_RE and _TODO_DIRECTIVE_RE compiled regex constants
- Add _strip_roles() to strip RST inline role markup from exception type names
- Add _filter_invisible_directives() to remove .. todo:: blocks and their
  indented body from generic section content
- Fix _fmt_raises() to strip roles from type_ and split comma-separated
  exception names into individual :raises ExcType: entries
- Fix _fmt_generic() to apply directive filtering and return [] (not [header,
  ""]) when filtered content is empty
- Add test fixtures for exc-role raises, comma-separated raises, empty Notes,
  and Notes-only-todo cases
…bels

- Register tool/prompt/resource section labels in std domain at parse time
  (directive run()) so {ref} resolves them on incremental builds where
  doctree-read hooks never fire
- Remove emoji icons from prompt and resource type badges; type text is
  self-sufficient (mirrors the existing tool badge pattern)
- Restore resource-template as a distinct badge (sky blue #0369a1) alongside
  resource (steel blue #1e40af) and prompt (violet #5b21b6)
- Refactor CSS to use CSS variables for all type badges; dark mode only
  overrides variables — selectors are written once
- Ghost outline MIME/tag pills (transparent bg, muted border)
- prompt/resource/resource-template keep light-mode colors in dark mode
…on DOM swap

Public hook so third-party widgets that bind to swapped DOM can re-initialise
after SPA navigation without a full page reload. Fires after the built-in reinit
(copybutton, scroll-spy, theme toggle) has
run. Payload: event.detail.url = the new page URL.

Event contract documented in packages/sphinx-gp-theme/README.md under a new
"JavaScript events" section (table + minimal listener pattern) and in CHANGES
under the unreleased Features block.
why: AGENTS.md mandates env.domains.standard_domain over env.get_domain("std").
The same package's _transforms.py already uses the typed accessor, so removing
the three # type: ignore[attr-defined] is mechanical. While here, fold the
round-trip section_id.replace("-", "_") display-name derivation back to the
original resource name, hoist the mid-file "import typing as t" to the top, and
drop function-local re-imports of names already imported at module top.
what:
- Annotate _register_section_label env parameter as BuildEnvironment; use
  env.domains.standard_domain (drops three # type: ignore[attr-defined])
- Thread display_name kwarg through _build_resource_card; resource/template
  directives now pass res.name / tpl.name verbatim
- Hoist "import typing as t" to top-of-file imports; drop the # noqa: E402
  placement
- Remove function-local re-imports of first_paragraph, parse_rst_inline,
  make_para, make_table, build_annotation_display_paragraph (already imported at
  top)
why: Three small correctness gaps in the Raises/Notes pipeline. (1) Sphinx
convention is that a leading ~ in a role target shows only the
last component (`: exc:`~mod.Foo`` -> `Foo`); _strip_roles preserved the tilde
verbatim, leaking it into rendered :raises: directives. (2) `type_.split(",")`
was naive and would mangle parameterised generics like `Dict[str, X]`. (3) The
earlier "drop empty Notes rubric" change incidentally suppressed Examples /
References / generic stub sections that intentionally render an empty rubric —
broader than the commit intent. The misnamed `_filter_invisible_directives` only
handled `..
todo: :`, so rename to reflect actual scope.
what:
- Add `_shorten_role_target` mirroring
  sphinx.domains.python.PyXRefRole.process_link; wire into _strip_roles via a
  sub() callback (drops leading ~ and keeps last dotted segment)
- Add `_split_top_level(s, sep)` bracket-depth-aware splitter; use in
  `_fmt_raises` so `Dict[str, X]` survives intact
- Rename `_filter_invisible_directives` -> `_filter_todo_directives`
  (single-directive scope reflected in name + docstring)
- Add `suppress_empty: bool = False` on `_fmt_generic`; only `Notes` passes
  True. Examples / References / generic admonitions regain their rubric for stub
  bodies
- Tests: new RaisesSectionFixture cases (tilde role, bracketed generic);
  refactor empty-rubric tests into a single GenericSectionEmptyFixture
  NamedTuple covering Notes (suppressed) and Examples / References (kept)
why: A FastMCP server may register some components at module-import time
(decorators) while leaving others to an explicit register_all() /
_register_all(). The previous `if not components` gate skipped the hook whenever
any component was already present, silently dropping the deferred ones from
autodoc.
what:
- _resolve_server_instance: drop the empty-components gate; invoke the first
  matching hook (`register_all` or `_register_all`) whenever the resolved object
  exposes `local_provider`
- Update inline comment to document the unconditional invocation
- Add two regression tests: hook fires when components are pre-populated; hook
  is skipped when no `local_provider` attribute exists
…ail-trim

why: The chain `text[:idx].rstrip().rstrip("\n").strip()` was redundant — the
leading rstrip() already removes trailing newlines, and the final strip() then
re-stripped both ends. The intent is parity with the no-marker branch's
`text.strip()`.
what:
- Replace the redundant chain with `text[:idx].strip()`
- Add a doctest case proving leading whitespace is stripped (parity with the
  marker-not-found branch)
why: A bare `except Exception` around the local fastmcp.* imports would silently
swallow real bugs (e.g. a SyntaxError in a fastmcp submodule, or runtime errors
in user code triggered during import). Sphinx's own optional-dependency pattern
(sphinx/util/images.py) catches ImportError specifically.
what:
- Narrow `except Exception` to `except ImportError` for the fastmcp.prompts /
  resources / template imports inside collect_prompts_and_resources
why: Document the user-visible effects of the seven preceding fixups so the
unreleased changelog reflects the final shape of the PR's surface area.

what:
- Six bullets under Bug fixes covering: typed std-domain accessor + display-name
  fix, unconditional register-all hook, narrowed ImportError catch, tilde role
  shortener, bracket-aware Raises split, and scoped empty-rubric suppression.
why: PR #21 added {fastmcp-prompt}, {fastmcp-prompt-input}, {fastmcp-resource},
and {fastmcp-resource-template} but had zero end-to-end coverage; the Weave
review flagged this as Critical. Lock in the rendered shape so future refactors
can't silently regress section IDs, sibling adoption, MIME pills, or {ref}
resolution.

what:
- Add tests/ext/fastmcp/test_directives_integration.py — one module-scoped
  SharedSphinxResult fixture builds a synthetic doc with all four directives
  against an injected FastMCP-shaped fake server (no real fastmcp dependency).
- Five @pytest.mark.integration tests assert: canonical fastmcp-{kind}-{name}
  section IDs, MIME pill class on resource cards, prompt argument table
  contents, parameter table inside the resource-template card section (sibling
  adoption), and {ref} cross-references resolve with zero "undefined label"
  warnings.
@tony tony force-pushed the fastmcp-autodoc-prompts-resources branch from f26270e to 8834a5f Compare April 19, 2026 14:24
@tony tony merged commit 11f1f15 into main Apr 19, 2026
40 checks passed
@tony tony deleted the fastmcp-autodoc-prompts-resources branch April 19, 2026 14:47
tony added a commit that referenced this pull request Apr 19, 2026
why: Cut alpha 9 covering the FastMCP prompts/resources autodoc surface
  and the companion typehints / theme / layout fixes merged in PR #21.
what:
- Bump every workspace package (gp-sphinx, sphinx-gp-theme,
  sphinx-fonts, sphinx-autodoc-typehints-gp, sphinx-autodoc-argparse,
  sphinx-autodoc-api-style, sphinx-autodoc-docutils,
  sphinx-autodoc-fastmcp, sphinx-autodoc-pytest-fixtures,
  sphinx-autodoc-sphinx, sphinx-ux-autodoc-layout, sphinx-ux-badges)
  and the workspace root from 0.0.1a8 to 0.0.1a9
- Refresh lockstep refs in gp-sphinx dependencies and uv.lock
- Update smoke-test version literal in scripts/ci/package_tools.py
- Update lockstep assertions in tests/ci/test_package_tools.py

Notable changes since 0.0.1a8 (#21):
- sphinx-autodoc-fastmcp: autodoc MCP prompts and resources end-to-end
  via four new directives ({fastmcp-prompt}, {fastmcp-prompt-input},
  {fastmcp-resource}, {fastmcp-resource-template}); new
  fastmcp_server_module config points the collector at a live FastMCP
  instance; URI-keyed env storage with name-index fallback for
  friendly directive lookup
- sphinx-autodoc-fastmcp: kind-prefixed canonical section IDs
  (fastmcp-{kind}-{name}) prevent tool/prompt/resource collisions in
  std.labels; tools keep the bare slug as a back-compat alias
- sphinx-autodoc-fastmcp: register-all hook safely re-invocable under
  FastMCP's default on_duplicate="error" via a temporary context
  manager; hook failure is fail-closed
- sphinx-autodoc-typehints-gp: Raises types strip the leading ~
  shortener (matching Sphinx PyXRefRole.process_link); comma split is
  bracket-depth aware so Dict[str, X] survives intact; empty Notes
  drops its rubric while Examples / References / generic stub sections
  keep theirs
- sphinx-gp-theme: dispatches gp-sphinx:navigated CustomEvent on
  document after every SPA-nav DOM swap so third-party widgets can
  re-initialise without a full page reload
- sphinx-ux-autodoc-layout: card-shell permalink hidden by default,
  revealed on hover or focus-visible
tony added a commit to tmux-python/libtmux that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin (gp-sphinx,
  sphinx-autodoc-api-style, sphinx-autodoc-pytest-fixtures) from
  0.0.1a8 to 0.0.1a9 in pyproject.toml
- uv.lock refreshed to match
tony added a commit to git-pull/gp-libs that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to vcs-python/g that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to vcs-python/libvcs that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to vcs-python/vcspull that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to tmux-python/libtmux-mcp that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to tmux-python/tmuxp that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to tony/django-docutils that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to tony/django-slugify-processor that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to cihai/cihai that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to cihai/cihai-cli that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to cihai/unihan-db that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
tony added a commit to cihai/unihan-etl that referenced this pull request Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the
  companion typehints / theme / layout fixes shipped in gp-sphinx
  PR #21 (git-pull/gp-sphinx#21).
what:
- Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in
  pyproject.toml
- uv.lock refreshed to match
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