diff --git a/.github/workflows/api-docs.yml b/.github/workflows/api-docs.yml
index 11a28c3..1b9f882 100644
--- a/.github/workflows/api-docs.yml
+++ b/.github/workflows/api-docs.yml
@@ -400,6 +400,80 @@ jobs:
rm -rf "${target:?}"/*
cp -R "${OUTPUT_DIR}/." "$target/"
+ - name: Splice _pages.json into docs.json nav
+ # Mintlify only routes pages registered in docs.json. The
+ # _pages.json artifact lists every generated Markdown path;
+ # rewrite the matching language sub-group under the
+ # 'Generated API Reference' group so all pages are
+ # discoverable, in-content cross-links resolve, and direct
+ # URLs work.
+ working-directory: docs-checkout
+ run: |
+ python3 - <<'PYINNER'
+ import json
+ import pathlib
+
+ PREFIX = "sdks/dotnet/api"
+ LANG_LABEL = ".NET"
+
+ docs_path = pathlib.Path("docs.json")
+ docs = json.loads(docs_path.read_text())
+ pages_path = pathlib.Path(PREFIX) / "_pages.json"
+ if not pages_path.exists():
+ raise SystemExit(f"missing {pages_path}")
+ raw = json.loads(pages_path.read_text())
+
+ # Build hierarchical groups by path segments. Each
+ # `
/README` becomes the dir's group entry rather than
+ # a duplicate leaf.
+ tree: dict = {}
+
+ def insert(node, parts, full_id):
+ if len(parts) == 1:
+ node.setdefault("_files", []).append((parts[0], full_id))
+ return
+ head, *rest = parts
+ insert(node.setdefault("_dirs", {}).setdefault(head, {}), rest, full_id)
+
+ for p in raw:
+ if p == "README":
+ continue
+ # Mintlify auto-redirects `/path/README` to `/path`, so
+ # register the directory form (page id without trailing
+ # /README). Files that don't end in /README keep their
+ # path verbatim.
+ if p.endswith("/README"):
+ full_id = f"{PREFIX}/{p[: -len('/README')]}"
+ parts = full_id[len(PREFIX) + 1:].split("/")
+ else:
+ full_id = f"{PREFIX}/{p}"
+ parts = p.split("/")
+ insert(tree, parts, full_id)
+
+ def to_mintlify(node, group_name):
+ pages = []
+ for fname, full_id in sorted(node.get("_files", [])):
+ pages.append(full_id)
+ for dname, sub in sorted(node.get("_dirs", {}).items()):
+ pages.append(to_mintlify(sub, dname))
+ return pages if group_name is None else {"group": group_name, "pages": pages}
+
+ new_pages = [f"{PREFIX}/README"] + to_mintlify(tree, None)
+
+ en = next(l for l in docs["navigation"]["languages"] if l["language"] == "en")
+ sdks_tab = next(t for t in en["tabs"] if t["tab"] == "SDKs")
+ gen_group = next(g for g in sdks_tab["groups"] if g["group"] == "Generated API Reference")
+ for sub in gen_group["pages"]:
+ if isinstance(sub, dict) and sub.get("group") == LANG_LABEL:
+ sub["pages"] = new_pages
+ break
+ else:
+ gen_group["pages"].append({"group": LANG_LABEL, "pages": new_pages})
+
+ docs_path.write_text(json.dumps(docs, indent=2, ensure_ascii=False))
+ print(f"Updated {LANG_LABEL} sub-group with {len(raw)} pages")
+ PYINNER
+
- name: Open PR in docs repo
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with: