Skip to content

Commit 82c10a5

Browse files
committed
docs: auto-generate API Reference nav from generated service pages
Adds scripts/gen-docs-nav.sh (rewrites the "API Reference" group in docs/docs.json from docs/sdks/<tag>/README.mdx, alphabetical, idempotent) and a standalone .github/workflows/docs-nav.yaml that runs it and commits docs.json when docs/sdks/** changes. New API sections appear in the sidebar automatically — no manual docs.json edits. Python's docs regenerate via the reusable sdk-generation-action (no local `speakeasy run` step to hook), so nav generation is a standalone workflow here rather than an inline step.
1 parent babeffc commit 82c10a5

3 files changed

Lines changed: 114 additions & 20 deletions

File tree

‎.github/workflows/docs-nav.yaml‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: Docs navigation
2+
3+
permissions:
4+
contents: write
5+
pull-requests: write
6+
7+
on:
8+
workflow_dispatch:
9+
pull_request:
10+
paths:
11+
- "docs/sdks/**"
12+
- "scripts/gen-docs-nav.sh"
13+
- ".github/workflows/docs-nav.yaml"
14+
15+
jobs:
16+
gen-docs-nav:
17+
runs-on: ubuntu-latest
18+
steps:
19+
- name: Checkout code
20+
uses: actions/checkout@v5
21+
with:
22+
ref: ${{ github.event.pull_request.head.ref }}
23+
token: ${{ secrets.GITHUB_TOKEN }}
24+
25+
# jq is preinstalled on GitHub-hosted ubuntu runners.
26+
- name: Regenerate docs navigation
27+
run: scripts/gen-docs-nav.sh
28+
29+
- name: Auto-commit docs.json navigation
30+
uses: int128/update-generated-files-action@v2
31+
with:
32+
commit-message: "Chore: regenerate docs navigation"

‎docs/docs.json‎

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,37 +11,39 @@
1111
"groups": [
1212
{
1313
"group": "Getting Started",
14-
"pages": ["overview"]
14+
"pages": [
15+
"overview"
16+
]
1517
},
1618
{
1719
"group": "API Reference",
1820
"pages": [
21+
"sdks/analytics/README",
22+
"sdks/apikeys/README",
23+
"sdks/benchmarks/README",
24+
"sdks/betaanalytics/README",
25+
"sdks/byok/README",
1926
"sdks/chat/README",
20-
"sdks/responses/README",
21-
"sdks/models/README",
22-
"sdks/embeddings/README",
23-
"sdks/rerank/README",
24-
"sdks/images/README",
25-
"sdks/tts/README",
26-
"sdks/stt/README",
27-
"sdks/videogeneration/README",
2827
"sdks/classifications/README",
29-
"sdks/generations/README",
30-
"sdks/endpoints/README",
31-
"sdks/providers/README",
3228
"sdks/credits/README",
33-
"sdks/apikeys/README",
34-
"sdks/oauth/README",
35-
"sdks/byok/README",
36-
"sdks/presets/README",
37-
"sdks/guardrails/README",
3829
"sdks/datasets/README",
30+
"sdks/embeddings/README",
31+
"sdks/endpoints/README",
3932
"sdks/files/README",
40-
"sdks/analytics/README",
41-
"sdks/betaanalytics/README",
42-
"sdks/benchmarks/README",
33+
"sdks/generations/README",
34+
"sdks/guardrails/README",
35+
"sdks/images/README",
36+
"sdks/models/README",
37+
"sdks/oauth/README",
4338
"sdks/observability/README",
4439
"sdks/organization/README",
40+
"sdks/presets/README",
41+
"sdks/providers/README",
42+
"sdks/rerank/README",
43+
"sdks/responses/README",
44+
"sdks/stt/README",
45+
"sdks/tts/README",
46+
"sdks/videogeneration/README",
4547
"sdks/workspaces/README"
4648
]
4749
}

‎scripts/gen-docs-nav.sh‎

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#!/usr/bin/env bash
2+
# Regenerate the "API Reference" navigation group in docs/docs.json from the
3+
# service pages Speakeasy emits under docs/sdks/<tag>/README.mdx.
4+
#
5+
# Run this after `speakeasy run` so new API sections appear in the sidebar
6+
# without hand-editing docs.json. Only the "API Reference" group's `pages`
7+
# array is rewritten; every other part of docs.json is preserved untouched.
8+
# Pages are listed alphabetically by tag. Idempotent: running with no doc
9+
# changes leaves docs.json byte-identical.
10+
#
11+
# Requires: bash, jq. No network, no toolchain.
12+
set -euo pipefail
13+
14+
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
15+
cd "$ROOT"
16+
17+
DOCS_JSON="docs/docs.json"
18+
GROUP="API Reference"
19+
20+
if [[ ! -f "$DOCS_JSON" ]]; then
21+
echo "missing $DOCS_JSON" >&2
22+
exit 1
23+
fi
24+
25+
# Collect service page paths (docs.json paths are repo-doc-root-relative and
26+
# carry no extension), sorted alphabetically by tag.
27+
pages=()
28+
while IFS= read -r readme; do
29+
# docs/sdks/<tag>/README.mdx -> sdks/<tag>/README
30+
rel="${readme#docs/}"
31+
pages+=("${rel%.mdx}")
32+
done < <(find docs/sdks -mindepth 2 -maxdepth 2 -name 'README.mdx' | sort)
33+
34+
if ((${#pages[@]} == 0)); then
35+
echo "no service pages found under docs/sdks/*/README.mdx" >&2
36+
exit 1
37+
fi
38+
39+
# Build a JSON array of the page paths.
40+
pages_json="$(printf '%s\n' "${pages[@]}" | jq -R . | jq -s .)"
41+
42+
# Rewrite only the matching group's pages. Fail loudly if the group is absent
43+
# so a renamed/missing group never silently produces an empty sidebar.
44+
tmp="$(mktemp)"
45+
jq --indent 2 \
46+
--arg group "$GROUP" \
47+
--argjson pages "$pages_json" '
48+
(.navigation.groups
49+
| map(select(.group == $group))
50+
| length) as $matches
51+
| if $matches == 0 then
52+
error("group \"" + $group + "\" not found in navigation.groups")
53+
else . end
54+
| .navigation.groups |= map(
55+
if .group == $group then .pages = $pages else . end
56+
)
57+
' "$DOCS_JSON" >"$tmp"
58+
59+
mv "$tmp" "$DOCS_JSON"
60+
echo "updated $DOCS_JSON: ${#pages[@]} pages in \"$GROUP\""

0 commit comments

Comments
 (0)