Skip to content

docs(ci): Publish to libtmux.org alongside git-pull.com - #756

Open
tony wants to merge 69 commits into
docs-sitefrom
docs-site-deploy
Open

tony wants to merge 69 commits into
docs-sitefrom
docs-site-deploy

Conversation

@tony

@tony tony commented Sep 6, 2026 •

Copy link
Copy Markdown
Member

Stacked on #755. Keep this PR open while its reviewed branch revision is used to refresh libtmux.org.

Python's unified docs now build through the shared source-revision workflow, including the native Sphinx reference under api/. Pull requests build without publishing. A maintainer can dispatch an exact source ref, version and publication policy; publish defaults to false. Workflow changes are included in the documentation path filter.

libtmux.git-pull.com retains its standalone Sphinx build and publishes on default-branch pushes. Its sync follows symlinks directly from the build job. Each destination keeps its existing secrets and its own publication queue.

Both shared workflow references use the same reviewed docs commit. Python dependencies are installed from the selected source lock; the separate tmuxp and MCP source checkouts use the revisions recorded in the shared API model. Grouped weekly GitHub Actions updates are configured; a bot-generated docs-pin update has not been demonstrated.

Validation

  • Six documentation-configuration tests pass, covering standalone and nested Sphinx behavior.

  • The selected Python revision has been built locally with the shared shell and native Sphinx reference; the inventory, API index and current native branding were checked.

  • The caller passes actionlint with its unsupported queue: max diagnostic suppressed. The shared publishers already use that GitHub concurrency setting.

  • Successful build-only dispatch from the unmerged branch. Live publication remains a separate explicit dispatch.

  • Explicit publication succeeded for reviewed source f70faacd0bdc0a00211232e52ab768a98f7e6dd1; this PR remains unmerged.

  • Live permission probe confirms that the Python role rejects a direct job outside the approved reusable workflow and denies writes to another language prefix. The negative verdict passed, the deliberate denial job is red, and the target prefix remains empty.

The live library, MCP, workspace, example, Sphinx API pages and inventory match the selected-source artifact. The example source links name the reviewed commit. All 39 linked branding assets match their source bytes and expected content types.

Removed the extra blank line rejected by Ruff in src/libtmux/constants.py. Ruff 0.16.8 now formats all 135 files cleanly, and the targeted lint check passes. The published source revision remains the explicitly selected f70faacd0bdc0a00211232e52ab768a98f7e6dd1.

Publication provenance

Hosted publication proof passes at 843278f595d8a4495c18c9d9dbe8ab0b2bd50289: a clean Python build publishes, three controlled artifact violations fail before AWS, and an identical immutable rerun skips sync while retaining its original receipt. Ordinary hosted GETs return HTTP 200 and all 7,699 S3 objects match their recorded bytes. Dispatch to first receipt takes 434 seconds. The run is deliberately red because its three negative jobs fail. Durable evidence and completed cleanup preserve the checks after temporary artifacts expire. These measurements cover dispatch latency; release-event latency remains open.

@codecov

codecov Bot commented Sep 6, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.45%. Comparing base (0bfd31b) to head (deaec07).

Additional details and impacted files
@@            Coverage Diff             @@
##           docs-site     #756   +/-   ##
==========================================
  Coverage      52.45%   52.45%           
==========================================
  Files             26       26           
  Lines           3729     3729           
  Branches         747      747           
==========================================
  Hits            1956     1956           
  Misses          1469     1469           
  Partials         304      304           

☔ 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.

@tony tony changed the title docs(ci): Publish to libtmux.org under this port's prefix docs(ci): Publish to libtmux.org alongside git-pull.com Sep 6, 2026
@tony
tony marked this pull request as ready for review September 6, 2026 11:36
tony added 30 commits November 6, 2026 20:41
why: Deliver the shared API reference fixes through the owning
documentation publisher.

what:
- Bind the documentation builder and publisher to one revision
what:
- Bind the owning docs builder and publisher to the reviewed revision

why:
Deliver the reviewed API navigation, reference previews, initial styling,
and installation controls through the existing publication workflow.
what:
- Pin both documentation build and publication to the reviewed shared
  checkpoint.

why:
- Deliver the verified documentation wave through the existing owner
  workflow without changing the library or publication scope.
what:
- Change only the two shared workflow pins to 32de9876ff51cdb206acbb05785f946cc08f517a.

why:
- Publish with the reviewed shared documentation checkpoint.
what:
- Change only the two shared workflow pins to 8f304904465a15b929e139345d9b9e4672ecb7b3.

why:
- Publish with the reviewed shared documentation checkpoint.
what:
- Change only the two shared workflow pins to
  9f5cef954e3c52e7eb239a3da56a34f92b69f161.

why:
- Publish with the reviewed shared documentation checkpoint.
what:
- Add GitHub, package and external documentation menus to the site
  header, each row showing its destination's icon
- Show a parameter's type and optional marker against its name, print an
  overload note as "for <label>" without doubled parentheses, and keep
  the brackets of [source] links outside the link
- Finish page appearance before revealing it, and load pages with
  ordinary document loads instead of the client router
- Upload content-hashed assets before the HTML that names them, keep
  earlier hashes, and cache them as immutable
- Start optional Cloudflare Web Analytics after page load, only where
  the edge grants permission
- Outside Python, present available MCP and workspace companions as
  concept examples
- Wrap Python declarations at the 60-column reference width the way ruff
  format does
- Render a reST rubric with no body as a heading

why: The header carried no repository, package or off-site API reference
links. Only a port's landing and overview pages listed them together,
and every other page offered one footer GitHub link.

Shared source: libtmux/docs
From: 9f5cef954e3c52e7eb239a3da56a34f92b69f161
To:   7ffc04bceec2cada8149a32e46926cba9fa9ecd2
what:
- Draw every API kind mark on one system of six hue families in
  navigation trees, member lists, index cards, search results, hover
  cards and prose links, mark only the first mention of a name in a
  section, and draw modifiers as outlines
- Badge each product in the documentation picker and the solution menu
  with its release stage, or concept for a companion outside Python,
  behind a hover card that links to the support page, and head each
  product in the GitHub and Packages menus with a label
- Browse the tmux options, hooks and format variables of each pinned
  release in a catalog, and link and badge tmux commands, options, hooks
  and formats wherever guides, the manual, API docs and MCP descriptions
  name them
- Show tmux keys as key caps in the manual and guides, and list the CLI
  Manual, the tmux catalog and the C source reference in the tmux
  sidebar
- Link workspace commands, configuration keys, and MCP tool, prompt and
  resource names written in code to their reference rows, resolve Sphinx
  roles in MCP descriptions, and list MCP arguments in the API parameter
  style
- Document type parameters under their own heading with bounds and
  defaults, and link them from signatures, bounds and prose
- Keep the Members heading and the active group heading in view while a
  long member list scrolls
- Move the pages about the site under /meta/ with redirects from the old
  addresses, drop the cross-port /mcp/ overview, and point the header
  MCP chip at the current port's MCP home
- Rebuild the native tmux examples as a short concept and numbered steps
  that lead up to the complete script, each step quoting that script
- Title the home page "libtmux: pilot tmux in your language" and move a
  reference page's qualified name into its Source and package disclosure
- List the parameters of a Python function's implementation instead of
  each overload stub, whether or not a docstring describes them, and
  leave out an undocumented self or cls receiver
- Take the release stage of libtmux, tmuxp and libtmux-mcp from their
  PyPI Development Status classifiers

why: A reference page marked names with a different colour per kind,
tmux options, hooks and format variables linked nowhere and tmux keys
read as plain code, a long member list lost which group a member
belonged to, the menus showed no release stage, and several pages still
promised a tmux their ports now refuse.

Shared source: libtmux/docs
From: 7ffc04bceec2cada8149a32e46926cba9fa9ecd2
To:   4e891632a66a144bd9dd7747168cf9218eb32710
what:
- Read a package version or release tag as stable when it is exactly
  MAJOR.MINOR.PATCH, with an optional v and package label, so a final
  release such as v0.1.0 gets a stable badge instead of throwing, and
  word the stable badge line "Stable release." without naming a
  registry; a declared stage and a stable registry status still outrank
  the name
- Julia only: build the Julia port's docs with tmux 3.7c, the version
  Julia requires, compiled by the `build-tmux` command of the Julia
  checkout's matrix tool and put on PATH only after that build succeeds
- Julia only: show the Julia core, workspace and MCP install commands
  for the documented source revision when the build selects one and for
  the default branch otherwise, and state Julia 1.13.1 and tmux 3.7c or
  newer as the floor
- Julia only: pass the Documenter `@raw html` blocks of the Julia guides
  through as page HTML with their `../source/` links rewritten to the
  documented revision on GitHub, and keep the explicit API references
  and overviews of those guides inside the selected preview version

why: Go example pages opened on a whole program with no path from the
tmux commands to the code that runs them. The API extraction of the
TypeScript, Rust, Java, Kotlin, Scala and Swift references dropped the
`#` comment lines of shell, Python, Ruby and YAML examples in doc
comments as if they were rustdoc setup lines. Swift reference signatures
printed their parameter list twice, Ruby and Swift type keywords showed
as unresolved type names, and the publisher refused the PowerShell
port's .NET alpha.22 dependency against its alpha.20 navigation pin. The
stage resolver threw on the final release tag v0.1.0 of libtmux-julia.

Shared source: libtmux/docs
From: 4e891632a66a144bd9dd7747168cf9218eb32710
To:   de7abd597bd9205c54d01498d8cdcb0bb0ec37d9
what:
- Link a port's repository, its package host and, where the host serves
  one apart from the package page, its API reference straight from the
  page header (`HeaderLinks.astro`), replacing the GitHub, Packages and
  Docs menus; an unpublished package is never linked
- Add a Packages disclosure (`HeaderPicker.astro`) that lists every
  other package, module, product and companion of the port as source,
  package and API reference links from a typed inventory
  (`port-inventory.ts`), with a search over names, coordinates, import
  aliases, repository names, kinds and hosts
- Grow a related or In other ports chip with the lines of its name,
  keeping its kind mark one line tall on the first line, where a fixed
  height clipped a name that wrapped (`kind-marks.css`)
- List Elixir with the other ports in the port picker
  (`PagePortSwitcher.astro`) and, for every API reference entry that
  maps to a shared concept, in its In other ports list (`concepts.ts`),
  linking the Elixir counterpart or saying that none is recorded
- Python header: GitHub and PyPI links, and a Packages disclosure that
  now also reaches `pytest_plugin.py`, `libtmux.test` and the source of
  `libtmux-mcp` and `tmuxp`

why: The page header offered a port's repository, package host and API
reference only as three menus, and the menus listed just the
destinations spelled out by hand for each port. For Python, Julia, Go,
Java, Kotlin, Scala, C#, F#, C++ and Swift, the other packages, modules,
plugins, commands and extensions of the port had no link in the header.
A related chip had a fixed one-line height, so a name that wrapped
overflowed the chip.

Shared source: libtmux/docs
From: de7abd597bd9205c54d01498d8cdcb0bb0ec37d9
To:   fcf99651e5200b96af8d59a7d8b336904636aca8
what:
- Offer Outline, Focus and Grouped layouts in the reference sidebar's
  menu, on the API pages and the Reference pages of each product, and
  keep the reader's choice from page to page (`api-tree.ts`), with Up to
  the selected declaration's parent and Root to the reference index at
  the bottom of the menu (`ApiTree.astro`); every library's sidebar
  comes from one builder (`api-sidebar.ts`)
- Fold a sibling list longer than a window into "N more" rows around the
  selected row, so a page carries its ancestry and a window of the list
  instead of every member of its owner; a folded row opens on a click or
  from the keyboard and, without JavaScript, links to the first page it
  holds (`api-sidebar.ts`)
- Draw every hover card from one description that the page and the
  browser both render (`link-preview-card.ts`): the legend chip of the
  declaration's kind heads the card, followed by the owner and member in
  the language's own separator (`native-name.ts`)
- Label a related type with its owner when more than one type in the
  port carries its name (`api-labels.ts`)
- Name the tmux command a method sends, with its scope flag and C
  function, on the method's reference page, from records of each
  library's source (`ApiEntry.astro`, `tmux-library-usage.ts`)
- Land a standard-library or SDK link on the page and anchor of the
  symbol it names: a name is looked up among an inventory's symbols and
  not among the pages, command-line options and labels of its manual
  (`inventory.ts`), and neither a dollar-prefixed variable nor the
  placeholder text of a printed object links (`never-links.ts`)
- Group Elixir under BEAM, beside the JVM and .NET groups, in the port
  picker (`port-families.ts`)
- Build with `astro` 7.4.2 (was 7.3.5), `@astrojs/mdx` 8.1.1 for MDX
  pages, `@astrojs/markdown-remark` 7.3.4 for Markdown and
  `astro-expressive-code` 0.44.3 for code blocks, with the
  viewport-prefetch patch regenerated for the new Astro
  (`astro@7.4.2.patch`), and install with `pnpm` 12.15.0 (was 12.13.0)
- Refresh the formatter, linter and test tools: `@biomejs/biome` 2.6.2,
  `oxlint` 1.89.0, `vitest` 5.0.5 and `happy-dom` 21.0.4
- Link a name of the Python standard library to the page of the CPython
  3.15 manual that documents it, where functions, types, exceptions and
  constants moved under builtins (`python.entries.json`), and look up
  the dotted name before a trailing call or subscript (`link.ts`); the
  glossary links the same pages (`api-glossary.ts`)
- Give the assembled native Python pages the shared sidebar and its
  layout controls, keeping their article HTML and original URLs, and
  insert the shared header, sidebar and footer text literally instead of
  as a replacement pattern (`normalize-native-shell.mjs`)
- State tmuxp's tmux minimum as 3.2a, the floor of its libtmux
  dependency (`guides.md`, `installation.md`), link the tmux support
  guide from the workspace compatibility page and the MCP entry page
  (`compatibility.md`, `index.md`), and say the tmux filter grammar
  works on every supported tmux (`queries.md`)

why: The reference sidebar offered a single layout, so a reader could
not choose between declaration order, one owner at a time and grouped
categories. A standard-library or SDK link could land on a manual page,
a landing page or a neighbouring entry instead of the symbol it names.
Hover cards came from separate renderers that had drifted apart, and a
method page did not say which tmux command it sends.

Shared source: libtmux/docs
From: fcf99651e5200b96af8d59a7d8b336904636aca8
To:   00045828e6457d142d58933f603665a2ead35811
why: The site still presented libtmux as an alpha: badges, notices,
install commands and examples carried alpha pins and prerelease flags,
and a docs channel stood for a release state that no libtmux release
has. A Sphinx project had no inventory to link to, tmux commands and
cross-port links sat in small rows under each declaration, TypeScript
aliases showed no declaration, and native Python documentation pages
listed every page in one flat sidebar column.

what:
- Publish `objects.inv` and `targets.json` at the root of each port
  version, naming the pages, headings, workspace table rows, MCP schema
  fields, command options and API declarations the build rendered, and
  stop the build when an API declaration has no rendered target
  (`inventory.ts`, `inventory-publisher.ts`, `inventory-targets.ts`,
  `targets.ts`; libtmux/docs#166)
- Link the footer of a port page to the inventory of its port version,
  to the full inventory and to a guide on linking from Sphinx, and list
  the same inventory and target files in the `docs.json` manifest
  (`SiteFooter.astro`, `inventory-links.ts`, `docs.json.ts`;
  libtmux/docs#166)
- Export the rows of the shared workspace command and configuration
  tables as Sphinx option, setting and environment variable targets, and
  keep a page's identity across a move through `inventoryId` and
  `inventoryAliases` in its frontmatter (`rehype-row-anchors.ts`,
  `load.md`, `panes.md`, `environment.md`, `content.config.ts`;
  libtmux/docs#166)
- Link the AI policy, which the root site publishes at
  `/meta/ai-policy/`, from the footer (`SiteFooter.astro`,
  `ai-policy.md`; libtmux/docs#194)
- Show a final release on its badge as its series, 0.x for 0.1.0, with
  the line "Released; the API may change.", and replace the alpha notice
  with an early-release notice that returns once for a reader who
  dismissed it (`ports.ts`, `registry.json`, `PrereleaseNotice.astro`;
  libtmux/docs#200)
- Remove the stable docs channel: a release tag publishes at its own
  version, a prerelease also as `next`, and the newest final release tag
  is the default and indexed version, or `latest` while the port has
  none; an older tag pushed later does not take the default
  (`port-docs-identity.sh`, `publish-plan.mjs`, `gen-versions.mjs`,
  `versions.ts`; libtmux/docs#201)
- Leave a release-numbering label such as 0.1.N plain in prose instead
  of resolving it as an API name (`resolver.ts`; libtmux/docs#204)
- Give a symbol's tmux commands, tmux C declarations, hooks, options and
  formats, Guides and equivalents in other ports their own sections on
  its API reference page and in its Markdown export, ahead of Related
  types (`api-tmux-sections.ts`, `ApiTmuxSections.astro`,
  `ApiReference.astro`; libtmux/docs#202)
- Draw the nested guide line in every sidebar layout, set Grouped's
  group headings bold as Outline's are, and make the API glossary the
  last row of the reference sidebar and the last search result
  (`api-tree.css`, `ApiTree.astro`, `api-tree.ts`; libtmux/docs#208)
- Open the preview card of a glossary link only after the pointer rests
  on it for a second, and let Escape cancel a card that has not opened
  (`link-preview-browser.ts`; libtmux/docs#211)
- Let Tab move from the footer's inventory help link to the link in its
  tooltip at once (`SiteFooter.astro`; libtmux/docs#211)
- Set the title of an index-style reference page, such as API reference,
  in the sans face (`ApiReference.astro`; libtmux/docs#211)
- Start the permalink, source link and badges of a native Python
  declaration on its first signature line, so they stay level with it
  when the signature wraps (`native-sphinx.css`; libtmux/docs#198)
- Pin a top-level Python class declaration under the header while its
  members scroll, and offset an anchored member by the pinned row's
  measured height, none until it is measured, so it lands below the row
  (`native-sphinx.css`, `NativeSphinxScript.astro`; libtmux/docs#198,
  libtmux/docs#211)
- Show the Sphinx toctree in the sidebar of native Python documentation
  pages, with its captions as headings, branches that nest and open down
  to the current page, external rows that open in a new tab, and search
  results labelled by path (`native-shell-context.mjs`,
  `native-shell.ts`, `NativeShell.astro`; libtmux/docs#209)
- Set the section titles of the MCP reference in the sans face, and keep
  its sidebar guide line under the parent label and not through the
  row's own text (`ProtocolReference.astro`, `api-tree.css`;
  libtmux/docs#211)

Shared source: libtmux/docs
From: 00045828e6457d142d58933f603665a2ead35811
To:   e1ab401f7d6fca5ac9c418bc6c77ca382320cd2e
why: A cross-reference in an API doc comment gave no sign of the kind of
declaration it named, though a mention of the same name in a guide
already led with a kind badge. Search also read the mark of that badge
as part of the name beside it, so a name could be indexed with a stray
letter.

what:
- Lead a cross-reference in an API doc comment with the kind badge of
  the declaration it names, the first time an entry mentions that
  declaration; a later mention is the link alone and keeps its kind in
  the tooltip and the accessible name (`ApiDoc.astro`, `ApiEntry.astro`)
- Lead a tmux command, option, hook or format variable named in a doc
  comment with its tmux kind badge, whether it is named in prose or is
  the only name in a code span, under the same first-mention rule
  (`tmux-links.ts`)
- Exclude the kind badge from search text, for a guide mention and for a
  doc-comment cross-reference, so search does not read its mark as the
  first letter of the name beside it (`mention-badge.ts`)
- Lead a module, package or namespace named in a code span of a guide
  with its module kind badge, the first time a section mentions it; a
  later mention keeps its kind in the tooltip and the accessible name
  (`rehype-api-links.ts`)
- Lead each entry of the Workspace Manager and MCP reference index with
  its kind badge, so the list shows the kind of each declaration
  (`ProductApiIndex.astro`)
- Exclude the kind badge that leads a link in an MCP tool description
  from search text as well (`mcp-reference.ts`)
- Lead a code cross-reference on Python's native Sphinx pages with the
  kind badge of its target's declaration the first time a section
  mentions it, and let a later mention keep its kind in the tooltip and
  the accessible name; a property referenced as an attribute reads as a
  property and an exception referenced as a class reads as an exception,
  a target with no declaration, a link to another site and a signature
  stay plain, and a page that cannot be marked keeps its navigation
  (`native-xrefs.ts`, `native-shell-context.mjs`,
  `NativeSphinxScript.astro`)

Shared source: libtmux/docs
From: e1ab401f7d6fca5ac9c418bc6c77ca382320cd2e
To:   4648913190eb75e4b592db2ba14e15fdcf24174f
why: A cross-reference in a doc comment led with a kind badge, so a page
that names many methods read as a row of badges. The sidebar tree
indented a row's label but not its mark and drew only the guide of a
row's parent, and a linked type in a signature or a parameter row was
drawn in the ordinary link color. A code literal could also link to an
unrelated member: the argument of a call, a control-mode marker, a word
of a kebab-case name.

what:
- Indent a row of the reference sidebar tree as a whole, mark and label
  together, draw a guide from every ancestor level, and mark the current
  row by tint and weight alone (`api-tree.css`)
- Draw a cross-reference or a tmux name in a doc comment in the color of
  its kind with a dotted underline instead of a badge before it; the
  kind stays in the tooltip and the accessible name, and a linked method
  or function named by a plain path reads as a call (`ApiDoc.astro`,
  `api.css`)
- Highlight every other link to a name while a reader points at it or
  focuses it, in the doc comments, the member list, the directory chips
  and the sidebar tree (`cross-highlight.ts`)
- Draw a qualified name with a quiet path and its own name in the color
  of its kind, show the Declared in row as a code link in that color,
  and keep the copy button from making its row taller
  (`ApiQualifiedName.astro`, `ApiReference.astro`)
- Fold three or more guidance rows of a doc comment, each followed by
  the references it covers, into a two-column directory of chips, and
  draw a pipe table as a table (`api-directory.ts`, `api-prose.ts`)
- Keep a code literal from linking to an unrelated member: the bare
  argument of a call, a control-mode marker and a kebab-case word stay
  plain, and a path that matches no declaration links its longest prefix
  that is a type (`link.ts`)
- Show the permalink beside an API section heading, and a table row's,
  only on hover, focus or target for a fine pointer; touch and forced
  colors always show it (`api-headings.css`, `global.css`)
- Join the sticky Members and group bars into one toolbar, align each
  parameter's label with the first line of its value, and list the pages
  that discuss a symbol one to a line (`ApiPageContents.astro`,
  `ApiTmuxSections.astro`, `api.css`)
- Draw a parameter's name in the name color and a type it links in the
  type color, and mute the rest of the type (`api.css`)

Shared source: libtmux/docs
From: 4648913190eb75e4b592db2ba14e15fdcf24174f
To:   c6b76c7ef7a5a2cdd0513dcbd28ccb5184b61344
why: Reference prose wrote every linked method with call parentheses
whatever the language, so Ruby and Go read as Python does, and a code
literal such as a file path or a plain word could link to an unrelated
type's member. README badges stacked down the page instead of sitting in
one line, and a preview card opened after 180 ms and said to read the
reference when a declaration had no summary.

what:
- Write a linked symbol in a doc comment the way its language's own
  documentation writes it, from one table with an entry for each port;
  the text a reader sees and the accessible name are the same string
  (`symbol-form.ts`, `ApiDoc.astro`)
- Write a tmux command and an MCP tool without call parentheses, and an
  environment variable without the shell's dollar sign; a placeholder
  such as an expansion example keeps the sign (`symbol-form.ts`,
  `mcp-catalog.ts`)
- Leave a file path in a code literal unlinked, and link a plain
  lowercase word to a member of another type only when that type is one
  the page is about or the word is a call with arguments; a word that
  names a parameter of the page's own signature, and a member of the
  library's internals on a public page, never link (`link.ts`)
- Open a preview card after 450 ms of hover, open the next one 100 ms
  after a card is open or loading, and keep the glossary at 1000 ms
  (`link-preview-browser.ts`)
- Give a preview card's summary the same room above and below, and show
  only the signature when a declaration has no summary, with no filler
  line (`LinkPreview.astro`, `link-preview-card.ts`)
- Keep an image inside a line of prose, a list item or a table cell in
  the line, so a row of README badges sits on one line; a lone image, a
  figure and anything marked not-prose keep their block margin
  (`global.css`)
- Draw a member group's bar and list as one panel with one radius and
  one divider (`api.css`)
- Build the site with Astro 7.4.4, @astrojs/mdx 8.1.2 and
  @astrojs/markdown-remark 7.3.5, and carry the viewport prefetch patch
  over unchanged (`site/package.json`, `pnpm-workspace.yaml`)

Shared source: libtmux/docs
From: c6b76c7ef7a5a2cdd0513dcbd28ccb5184b61344
To:   d2d48767f0a1dc4367dd68944c992176128c28b5
why: A port's landing page listed its install commands under one heading
and showed no example of the code to run, so a reader met no code until
opening the examples.

what:
- Show a port's products on its landing page, each beside the install
  command of its package: tabs where the port ships an MCP server or a
  workspace package, one panel where it ships only the library, in place
  of the install commands under one heading (`PortLanding.astro`,
  `port-landing.ts`, `pages/index.astro`)
- Show Core API as the port's complete homepage program in its own
  language, with the install command of its package
  (`PortLanding.astro`)
- Offer MCP and Workspace Manager as tabs beside Core API, working
  without JavaScript, and carry the chosen tab in the address as the
  product parameter so a link shares it (`PortLanding.astro`,
  `landing-selection.ts`)
- Show the example of an MCP or Workspace Manager tab as an excerpt of a
  file that the port's own CI runs, naming under the code the file,
  linked at the revision it was read from, the CI command that runs it
  and its workflow (`PortLanding.astro`, `port-landing.ts`,
  `landing-examples.json`)
- Draw an MCP tool, prompt and resource page in the documentation
  layout, so the section menu stays in the sidebar, in place of a
  separate reference tree that replaced it (`ProtocolReference.astro`,
  `DocsLayout.astro`)
- Nest each protocol object of that menu under its group, with tools
  grouped by the area they work on, prompts as workflows and resources
  as fixed resources or resource templates
  (`documentation-navigation.ts`, `mcp-reference.ts`)
- Keep the sidebar's own text out of the site search, since it lists
  every protocol object (`DocsLayout.astro`)

Shared source: libtmux/docs
From: d2d48767f0a1dc4367dd68944c992176128c28b5
To:   9be37754afdeb80f043f6ef615254e0315fd2071
why: A port's Workspace page showed no workspace file that its tests
load and its MCP page listed no tool its server advertises, so a reader
had to open the reference to see what either product does, and the pages
were not named by their language.

what:
- Title the Workspace and MCP pages of a port by its language, for
  example "tmux workspace manager, forged in Rust" and "tmux MCP, built
  in Rust", in place of the title each had (`workspace/index.md`,
  `product-copy.ts`)
- Open each Workspace and MCP overview with a sentence about the product
  that names only the verbs, formats and MCP SDK the port's own sources
  show, and links the port's libtmux library (`ProductIntro.astro`,
  `product-copy.ts`, `product-copy.json`)
- Give the Workspace page a shorter title, such as "Rust-based tmux
  workspace manager", for the browser tab, the social tags and the agent
  files llms.txt and docs.json, and keep the longer title as the page's
  heading (`DocPage.astro`, `DocsLayout.astro`, `llms.ts`)
- Show on the Workspace page the workspace files that the port's own
  tests load, each as a YAML tab and a JSON tab beside a drawing of the
  panes every window builds, with its source file and the tests that
  load it, each told apart by whether it runs the command
  (`WorkspaceShowcase.astro`, `WorkspaceConfig.astro`,
  `workspace-showcase.ts`, `workspace-showcase.json`, `tmux-layout.ts`)
- Offer a searchable preset picker above the overview where the port has
  several workspace files: a tile of each preset's first window, a
  button for another at random, an address for each preset, the last
  choice kept for the next visit and the chosen preset set while the
  page is parsed (`WorkspacePicker.astro`, `workspace-picker.ts`)
- List the tools the server advertises on the MCP page, each as a link
  to its reference page with a one-line purpose from its own description
  (`McpShowcase.astro`, `mcp-showcase.ts`)
- Group those tools as Inspect, Manage, Execute and Teardown from the
  toolset the server declares for each, with a tier badge on every tool,
  tell the reader that the toolsets setting offers only some tiers, and
  say in the opening sentence that the server groups its tools
  (`McpShowcase.astro`, `mcp-showcase.ts`, `product-copy.ts`)
- Show a worked example on the MCP page: a prompt and the calls an agent
  makes for it, in the server's own tool names (`McpShowcase.astro`,
  `mcp-showcase.ts`)

Shared source: libtmux/docs
From: 9be37754afdeb80f043f6ef615254e0315fd2071
To:   84937633ac63297d2be2a71c7719d41109be5c63
why: A port's home page showed a tagline and a tab for each product, and
no page said what the library wraps or which capabilities it has, so a
reader met the products before seeing what any of them does.

what:
- Title a port's home page by its repository and language, as
  "libtmux-rs: Rust-based tmux client", and open it with "libtmux for
  Rust", a definition of the library and the repository and package
  links in the top right, in place of the tagline and the paragraph
  naming the version (`PortHero.astro`, `DocumentationHero.astro`,
  `ports.ts`)
- Add a Core Library home at core/ for each port: its Server, Session,
  Window and Pane types with the tmux object each wraps, and the
  capabilities it has, each linked to the symbol of the extracted API
  model that provides it and refused when the symbol does not back it
  (`CoreHome.astro`, `core-home.ts`, `core-home.json`)
- Show the language Home as one row above Core Library in the
  documentation picker (`documentation-navigation.ts`,
  `SurfacePicker.astro`)
- Hold a page steady while it loads: reserve the contents rail's column
  on the server, so the article column is final at first paint, keep the
  rail after the article in the source, so keyboard and screen-reader
  users reach the article first, and scroll to a fragment only when the
  browser has not already placed it (`DocsLayout.astro`, `anchors.js`)
- Read a release-number placeholder such as X.Y or X.Y-rcN in prose as
  text, not as a symbol to resolve (`resolver.ts`)
- Set the Workspace page's heading as "tmux workspace manager," with
  "forged in Rust." on its own line under it, a subtitle that the
  heading still reads whole to a search or a screen reader
  (`DocsLayout.astro`, `branding.ts`, `product-copy.ts`)
- Show on the home page's Workspace panel a workspace file one of the
  port's tests loads, the panes it builds, the test that loads it and,
  where a test runs the command, the command that loads it
  (`PortLanding.astro`, `WorkspaceWindows.astro`, `workspace-links.ts`)
- Preview a preset on hover in the preset picker without changing the
  choice, and show a window tab's full name in a tooltip when the strip
  clips it (`workspace-picker.ts`, `WorkspacePicker.astro`)
- Replay the MCP worked example on the MCP page and on the home page's
  MCP panel beside the tmux state each call leaves, with the result the
  server recorded under the call, drawn from the recorded session only
  (`McpReplay.astro`, `mcp-replay.ts`, `mcp-showcase.ts`)
- Make the recorded example split a window in two panes, run the tests
  in one and show a log in the other, then read the layout back
  (`mcp-examples.ts`)
- Read a capability directory in the port's own link syntax where its
  doc comments write one of their own: Python's roles, DocC's double
  backticks, ExDoc, KDoc and Scaladoc links, a name in a code span for
  C++ and Lua, YARD, Documenter and PowerShell's cmdlet names
  (`api-directory.ts`, `ApiProse.astro`)
- Break a shell command wider than 78 columns across lines with a
  trailing backslash in the MCP install panel, so the copied text still
  runs as one line (`install-matrix.ts`)

Shared source: libtmux/docs
From: 84937633ac63297d2be2a71c7719d41109be5c63
To:   c601a9f6712ee581d6520699feff76c0a8665285
why: A port's MCP page showed its worked example as requests only,
because the page took a recording only when the port's head was the
commit it was recorded at, and a port's own build regenerates the tool
list at that head. The Core showcase also refused a Ruby program that
indents its require inside a begin block, as libtmux-ruby does.

what:
- Keep a worked example's recorded MCP session on its page while the
  tools it called take and return the schemas they had when it was
  recorded and any list of tools in a result is the set the port
  advertises, so a page that documents another revision of the port
  still replays it, and say which revision the page documents and that
  the results there may differ (`mcp-showcase.ts`, `mcp-contract.ts`,
  `McpReplay.astro`)

Shared source: libtmux/docs
From: c601a9f6712ee581d6520699feff76c0a8665285
To:   ae091e4d45832b34550bf9471269df9689d3c2fa
why: The Ruby documentation build stopped at the Core showcase, which
listed control-mode APIs that Ruby's send-keys program no longer calls,
because the data the documentation held for Ruby, TypeScript and Rust
was bound to older revisions than the masters their builds read. For the
same reason the MCP replay of TypeScript and Rust fell back to requests
only.

what:
- Leave this port's pages as they are: this revision refreshes what the
  documentation holds for Ruby, TypeScript and Rust, and nothing it
  holds for this port changed

Shared source: libtmux/docs
From: ae091e4d45832b34550bf9471269df9689d3c2fa
To:   747f7193f8518e9f5bf54e46c85664b4d8010345
why: The MCP worked example drew only what each call returned, so a
split showed a step after the call that made it, and Julia's page showed
requests only. The recording now holds tmux's own state after every call
and Julia has one. Three Ruby programs stayed off their pages until the
Ruby example manifest named each program's tmux release, and the Rust
language icon was white on a light page when the device was dark and the
site Light.

what:
- Draw each step of the MCP worked example from the tmux state the
  recording read after that call, so a split or a new window appears
  with the call that made it, and show a call that only reads as leaving
  tmux unchanged (`mcp-replay.ts`, `McpReplay.astro`,
  `mcp-tmux-state.ts`)
- Record the Python worked example's MCP session again at libtmux-mcp
  800aebd26, its master, with the tool snapshot read at the same
  revision, so the page draws tmux as it stood after each call
  (`mcp-transcripts/py.json`)
- Say on the Third-party notices page that the Rust icon no longer
  carries its own dark-mode colors and that the page lightens the mark
  on a dark theme instead (`meta/third-party-notices.md`)

Shared source: libtmux/docs
From: 747f7193f8518e9f5bf54e46c85664b4d8010345
To:   d3b931be3e64c962f9a3ffa1117527b40ae19a79
why: The Core API example listed capabilities beside a program and left
the reader to imagine what each call does, and each port's landing page
showed a different program with a different output. Following a docs
link blanked the whole page for 160 to 760 ms, a swap into a code frame
shifted the layout, and catalogs over 10 MB reached readers
uncompressed, because CloudFront does not compress objects that large.

what:
- Play each port's Core API program call by call on its landing page and
  its Core overview: hovering or stepping a call marks it in the source
  and draws the tmux the call left, with what it returned and the tmux
  commands it sent (`CorePlayer.astro`, `CoreShowcase.astro`,
  `CoreHome.astro`, `core-player.ts`)
- Show the same quickstart on every port: a private server, session
  demo, an editor window split in two, a logs window and a command typed
  into the new pane, pinned to the library revision that carries it, so
  every page prints one tree (`home-examples.json`)
- Offer the preset picker on the landing page's Workspace tab, opening
  on a file a test loads with the command or else a layout classic, each
  preset with its own summary, load command and evidence
  (`PortLanding.astro`, `WorkspacePicker.astro`,
  `WorkspaceEvidence.astro`)
- Draw the MCP worked example with the Core player's own tmux screen and
  controls: a dot for tmux before the first call, a dashed placeholder
  for an empty screen, and no tool-count sentence above the example on
  the landing page (`McpReplay.astro`, `TmuxScreen.astro`,
  `ReplayControls.astro`, `PortLanding.astro`)
- Swap a docs page in place when a link inside the same tree is
  followed, instead of blanking the page while the next one loads; links
  to another tree, to a file and to the page's own fragments go to the
  browser (`BaseLayout.astro`, `router-guard.ts`)
- Keep a swapped page whole: the code stylesheet loads from the head,
  the search panel and the MCP install cooldown are set up again after a
  swap, the first frame waits for the header's menu panel, the agent
  prompt draws its version picker from the first frame, and the API
  tree's hold lifts after five seconds (`code-stylesheet.ts`,
  `SearchPanel.astro`, `mcp-install.js`, `BaseLayout.astro`,
  `AgentPrompt.astro`, `page-readiness.ts`)
- Publish each JSON file over 10,000,000 bytes gzip-encoded, since
  CloudFront does not compress an object that large, and decode it again
  where the immutable-tag check and the published inventory read it
  (`large-json.sh`, `reusable-deploy.yml`)

Shared source: libtmux/docs
From: d3b931be3e64c962f9a3ffa1117527b40ae19a79
To:   983db91693417c1c280895377b4428259867b240
why: The Core player drew the tmux of a program as a grid of tiles, one
per window of every session, which no tmux client shows, and a program
that made several windows shrank the drawing into small tiles. A call
and the type it returned were plain text, and the dots of the replay
track gave no visible hint of the call each stands for.

what:
- Draw the Core player's tmux as a client attached to the program's
  first session sees it: the current window of the oldest session under
  one status line of its windows, each window label and session name a
  button that shows that window until the player moves to another call,
  and a label drawn in the accent colour when the call added, renamed or
  selected its window or changed its panes out of sight
  (`CorePlayer.astro`, `TmuxScreen.astro`, `replay-player.ts`,
  `mcp-replay.css`)
- Link each call's name and the type it returned to their API reference
  pages, this build's version on the port's own site and the default
  version elsewhere, and start the note under the drawing with a link to
  the call it follows (`core-apis.ts`, `CorePlayer.astro`)
- Show a tooltip over each dot of the replay track, on hover or keyboard
  focus, naming the call and what it did (`ReplayControls.astro`,
  `replay-player.ts`, `CorePlayer.astro`, `mcp-replay.css`)

Shared source: libtmux/docs
From: 983db91693417c1c280895377b4428259867b240
To:   ff7b2e484b4503e599dc83c212ffd21f14c35dbe
why: An MCP overview put its worked example below Install, Start here
and the whole tool grid, so a reader of the overview rarely reached it,
and the call the replay shows was drawn like the one the pointer rests
on. The JSON a Core player call returned took the landing page's general
code size, larger than the program beside it, so the answer looked
heavier than the code that asked.

what:
- Open each MCP overview with its worked example, right after the intro
  and before Install, Start here and the tool grid, which now closes the
  page, and list the example first in the table of contents
  (`DocPage.astro`, `McpShowcase.astro`, `mcp-showcase.ts`)
- Mark the call the replay's tmux view shows with a 3px accent edge and
  a tint, so it stands out from the calls around it (`mcp-replay.css`)
- Set the JSON a Core player call returned at the size of the program
  beside it, in each view and when the window resizes
  (`CorePlayer.astro`, `core-player.css`)

Shared source: libtmux/docs
From: ff7b2e484b4503e599dc83c212ffd21f14c35dbe
To:   c5b56f2b90002281adb95616a3e523e0a192937c
why: A workspace or MCP API reference page drew its section headings
larger than a core page's, because its body sat inside the prose column,
and repeated each member as a full bordered entry under a bordered bar.
The reference of a product listed every declaration in one A to Z list
that mixed types, functions, constants and enums, so a reader could not
find a tool, a URI constant or an error type without scanning it. On a
cold load the Core player was drawn at its last call and the script
reset it to the first a moment later, and the controls bar appeared and
pushed the player down, so the page jumped. The MCP replay did the same:
the whole chat with every result open, then the bare prompt, and the
page grew when the controls appeared. Pages told a reader how they were
made (the revision, sandbox and generator of a recording, a library
revision under an example, a generator under an API page), which belongs
in the commit that refreshed the data. The headings "Worked example" and
"Try a preset" did not say what a reader gets: tmux driven through MCP
tools and tmux layouts and workspaces to try. The Core player's Error
handling and Cleanup toggles took a row of their own above the code, and
its step dots were spread across the controls bar, so on a tight bar a
long program's dots crowded until a finger could not tell them apart.
The MCP replay's step dots crowded the same way on a tight bar. Chrome
on iOS shrinks the window height under the on-screen keyboard, so the
API reference sidebar and the sticky member bars shrank when a reader
focused the search field. The site header's port picker and the ports
list offered only the ports that had documentation before OCaml,
Haskell, Perl, Clojure, Common Lisp and Erlang. The port build ran
GitHub actions by floating tag, so a retagged release would have changed
what builds this port's pages.

what:
- Draw the workspace and MCP API reference pages in the core API
  presentation: section headings at the size of a core page's, the body
  outside the prose column, and a type's members listed once, as its
  table and then linked rows, where each was also a full entry
  (`ProductApiPage.astro`, `ApiMemberList.astro`, `DocsLayout.astro`)
- Group the MCP API reference into sections in the sidebar, the
  documentation navigation and the reference index: Tools, Prompts,
  Resources and URIs, Views and results, Server and setup, Configuration
  and environment, Errors and Utilities, leaving out a section with
  nothing in it (`product-api-sections.ts`, `product-api.ts`,
  `ProductApiIndex.astro`); a section's row in the sidebar links to the
  page of its first entry, and a breadcrumb through it does too
  (`sidebar.ts`)
- Group the workspace API reference the same way: Workspace files,
  Building and freezing, Command line, Plugins and shell, Errors and
  Utilities, URLs unchanged (`product-api-sections.ts`,
  `product-api.ts`, `ProductApiIndex.astro`)
- Draw the Core player on the server at the frame its script first
  shows, the tmux before the first call, with its controls bar in place
  at its first count, so binding the script moves nothing; a reader with
  no script, and one who asked for less motion until the script binds,
  see the finished frame (`CorePlayer.astro`, `ReplayControls.astro`,
  `core-player.css`)
- Draw the MCP replay on the server at the prompt alone, the calls out
  of view marked and its head and controls bar in place, so binding the
  script moves nothing; the same finished fallbacks for no script and
  for reduced motion (`McpReplay.astro`, `mcp-replay.css`)
- Name the MCP overview's replay "tmux through MCP", where it was
  "Worked example" (links to the old anchor, worked-example, still
  land), and drop the paragraph under it on how the recording was made:
  its revision, sandbox, generation and shortened values
  (`McpReplay.astro`, `mcp-showcase.ts`)
- Drop the Core player's info button, its popover and its no-script note
  on how the run was recorded; the controls bar keeps its other buttons
  (`CorePlayer.astro`, `ReplayControls.astro`)
- Drop the "Library revision" line from an example's setup details and
  the "Generated from the source" line under the API pages that had one
  (`HomeExample.astro`, `[...slug].astro`)
- Head the workspace overview's preset picker "Explore tmux layout /
  workspace possibilities", where it was "Try a preset" (links to the
  old anchor, try-a-preset, still land) (`WorkspacePicker.astro`,
  `DocPage.astro`)
- Put the Core player's Error handling and Cleanup toggles in a toolbar
  row at the bottom of its code panel, below the code and outside the
  part that scrolls, where they sat in a row above it, so toggling moves
  no edge of the player; and let the step dots of its controls bar
  scroll inside a rail with a button at each end to page them, where
  they were spread across the bar and crowded on a tight one
  (`HomeExample.astro`, `core-player.css`, `ReplayControls.astro`,
  `replay-player.ts`, `mcp-replay.css`)
- Let the MCP replay's step dots scroll inside a rail with a button at
  each end to page them, keeping the shown call's dot in view, where
  they were spread across the bar and crowded on a tight one
  (`ReplayControls.astro`, `replay-player.ts`, `mcp-replay.css`)
- Keep the API reference sidebar and the sticky member bars at their
  height when an on-screen keyboard opens, where Chrome on iOS shrank
  the window under it and the sidebar and the bars shrank with it: while
  a field has focus the pages measure the tallest height seen at this
  width (`stable-viewport.ts`, `api-tree.ts`, `ApiPageContents.astro`)
- List OCaml among the ports of the site: in the port picker of the site
  header and in the Compiled & native group of the ports list; OCaml's
  own pages are published by its own repository, not by this caller
  (`shell.js`, `ports.ts`, `port-families.ts`)
- List Haskell among the ports of the site: in the port picker of the
  site header and in the Compiled & native group of the ports list;
  Haskell's own pages are published by its own repository, not by this
  caller (`shell.js`, `ports.ts`, `port-families.ts`)
- List Perl among the ports of the site: in the port picker of the site
  header and in the Scripting & web group of the ports list; Perl's own
  pages are published by its own repository, not by this caller
  (`shell.js`, `ports.ts`, `port-families.ts`)
- Pin the port build's GitHub actions to commits of the releases it used
  by tag (checkout v7.0.1, setup-node v7, pnpm/action-setup v6), and
  have the build ask the registry whether a port excludes MCP before it
  generates MCP data, which no existing port does (`port-docs.yml`,
  `build-site.sh`)
- List Clojure among the ports of the site: in the port picker of the
  site header and in the JVM group of the ports list; Clojure's own
  pages are published by its own repository, not by this caller
  (`shell.js`, `ports.ts`, `port-families.ts`)
- List Common Lisp among the ports of the site: in the port picker of
  the site header and in the Compiled & native group of the ports list;
  Common Lisp's own pages are published by its own repository, not by
  this caller (`shell.js`, `ports.ts`, `port-families.ts`)
- List Erlang among the ports of the site: in the port picker of the
  site header and in the BEAM group of the ports list; Erlang's own
  pages are published by its own repository, not by this caller
  (`shell.js`, `ports.ts`, `port-families.ts`)

Shared source: libtmux/docs
From: c5b56f2b90002281adb95616a3e523e0a192937c
To:   8245169584882f09e302881f136512df41aba2a4
why: The landing page ended with "All versions and install
instructions", a link to the port root, which redirects back to the page
the reader was on.

what:
- Drop the link at the end of the port's landing page back to the port
  root, whose address redirects to the landing page the reader is on
  (`index.astro`)

Shared source: libtmux/docs
From: 8245169584882f09e302881f136512df41aba2a4
To:   30af469ec547f55bd6121fdd7bcd1259928f81b0
why: A long program could widen the example panel's grid beyond a
phone's width, and a code block nested in the panel took the panel's
fixed height. Haskell gained an Examples page, and the linking guide
promised MCP contracts in the full export of every port.

what:
- Keep an example program's panel inside a narrow page: the grid that
  holds the program has a column that can shrink to the page, and the
  panel's fixed height, scrolling and column-fit type size apply to the
  program block itself, not to a code block nested in it
  (`CoreShowcase.astro`, `HomeExample.astro`)
- Offer Haskell's new Examples page in the language picker of an
  Examples page, where Haskell had none, and scope the linking guide's
  llms-full.txt row to ports with and without an MCP server
  (`linking.md`)

Shared source: libtmux/docs
From: 30af469ec547f55bd6121fdd7bcd1259928f81b0
To:   cfa8a14960f4b68c182c687672086f19840b1fc9
why: A bar hidden only after the page loaded would flash on every page a
reader had already dismissed it on. A link to another site grew its icon
after the page had loaded and pushed the text after it along. Every MCP
page opened with an admonition that a reader could not close, the same
sentence on every page of the product. The language picker of an MCP or
Workspace Manager overview offered the page of a port that has no such
product. A reader on a Server, Session, Window or Pane page could not
jump to the same concept in Haskell, and the Server page had no link to
Common Lisp's.

what:
- Read the product status bars a reader has dismissed in the page's
  head, with the theme settings every page applies before it paints, and
  hide a dismissed bar with one stylesheet rule per status, so a
  dismissed bar is never drawn (`ThemeScript.astro`, `global.css`)
- Draw the icon of a link that leaves the site in the first paint: the
  build writes the external-link marker into the HTML of every page, and
  of the native reference pages, so the icon no longer appears after the
  page loads and shifts the text after it (`external-links.ts`,
  `mark-external-links.mjs`, `build-site.sh`)
- Show the in-development status of the MCP server as a dismissible bar
  under the page header, on every MCP page, where each page opened with
  it as an admonition inside the article: dismissing a bar hides that
  note on every page that carries it, a reader without scripts keeps it,
  and a page's Markdown twin leads with the same sentence
  (`ProductNotice.astro`, `DocsLayout.astro`, `BaseLayout.astro`,
  `markdown-twins.ts`)
- Show "No matching page" with a link to the language home, in the
  language picker of an MCP or Workspace Manager overview, for a port
  that publishes no such product, where the row linked to a page that
  said the product was not published (`ports.ts`, `docs-paths.ts`)
- Link the Server, Session, Window and Pane reference pages to Haskell's
  counterpart, in the language picker and in the list of the same
  concept in other ports, and the Server page to Common Lisp's client
  (`concepts.ts`)

Shared source: libtmux/docs
From: cfa8a14960f4b68c182c687672086f19840b1fc9
To:   a914a82442dbd1be9d7b799d3019db203474ade3
why: libtmux/docs #316 (merged as 15786d72e) refreshes this port's pages
(registry versions and claims, package links, a port switcher that lists Raku) and lets the publisher
roles trust that revision; the port builds and publishes its docs
through the two reusable workflows at the pinned revision.
what:
- Repin port-docs.yml and reusable-deploy.yml from a914a8244 to
  15786d72e in .github/workflows/docs.yml
why: tmux-python/libtmux builds and publishes its docs through the two reusable workflows of libtmux/docs; they must pin the revision whose pages it should publish and whose publisher the IAM roles trust (15786d72e, docs #316).
what:
- Repin port-docs.yml and reusable-deploy.yml in .github/workflows/docs.yml to 15786d72e

This branch was successfully deployed

1 active deployment
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.

1 participant