rebuild #971
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build & Deploy Docs (Pages) | |
| on: | |
| push: | |
| branches: [main] # deploy when aggregator changes | |
| workflow_dispatch: | |
| inputs: | |
| # optional per-repo overrides (branch/ref/SHA); leave empty to use defaults | |
| miden_base_ref: | |
| description: "Ref for 0xMiden/protocol" | |
| required: false | |
| miden_tutorials_ref: | |
| description: "Ref for 0xMiden/tutorials" | |
| required: false | |
| miden_client_ref: | |
| description: "Ref for 0xMiden/miden-client" | |
| required: false | |
| miden_node_ref: | |
| description: "Ref for 0xMiden/node" | |
| required: false | |
| note_transport_ref: | |
| description: "Ref for 0xMiden/note-transport-service" | |
| required: false | |
| bridge_portal_ref: | |
| description: "Ref for 0xMiden/bridge-portal" | |
| required: false | |
| miden_vm_ref: | |
| description: "Ref for 0xMiden/miden-vm" | |
| required: false | |
| compiler_ref: | |
| description: "Ref for 0xMiden/compiler" | |
| required: false | |
| guardian_ref: | |
| description: "Ref for OpenZeppelin/guardian" | |
| required: false | |
| repository_dispatch: | |
| types: [rebuild] | |
| permissions: | |
| contents: read | |
| pages: write | |
| id-token: write | |
| concurrency: | |
| group: "pages" | |
| cancel-in-progress: true | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| env: | |
| DEFAULT_REF: next | |
| DEFAULT_TUTORIALS_REF: main | |
| DEFAULT_NOTE_TRANSPORT_REF: main | |
| DEFAULT_BRIDGE_PORTAL_REF: main | |
| # Guardian is an external (OpenZeppelin) repo released by tag; pin to a tested | |
| # release rather than tracking a branch. Bump on each Guardian release. | |
| DEFAULT_GUARDIAN_REF: v0.15.0 | |
| steps: | |
| - name: Checkout docs site | |
| uses: actions/checkout@v4 | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20 | |
| cache: "npm" | |
| # Resolve refs per repo (inputs override DEFAULT_REF) | |
| - name: Resolve refs | |
| id: refs | |
| run: | | |
| set -e | |
| def="${DEFAULT_REF}" | |
| tutorials_def="${DEFAULT_TUTORIALS_REF}" | |
| note_transport_def="${DEFAULT_NOTE_TRANSPORT_REF}" | |
| bridge_portal_def="${DEFAULT_BRIDGE_PORTAL_REF}" | |
| # For each input: use it if set, else fallback to default ref | |
| base_ref='${{ inputs.miden_base_ref }}' | |
| [ -z "$base_ref" ] && base_ref="$def" | |
| echo "MIDEN_BASE_REF=$base_ref" >> $GITHUB_OUTPUT | |
| tutorials_ref='${{ inputs.miden_tutorials_ref }}' | |
| [ -z "$tutorials_ref" ] && tutorials_ref="$tutorials_def" | |
| echo "MIDEN_TUTORIALS_REF=$tutorials_ref" >> $GITHUB_OUTPUT | |
| client_ref='${{ inputs.miden_client_ref }}' | |
| [ -z "$client_ref" ] && client_ref="$def" | |
| echo "MIDEN_CLIENT_REF=$client_ref" >> $GITHUB_OUTPUT | |
| node_ref='${{ inputs.miden_node_ref }}' | |
| [ -z "$node_ref" ] && node_ref="$def" | |
| echo "MIDEN_NODE_REF=$node_ref" >> $GITHUB_OUTPUT | |
| note_transport_ref='${{ inputs.note_transport_ref }}' | |
| [ -z "$note_transport_ref" ] && note_transport_ref="$note_transport_def" | |
| echo "NOTE_TRANSPORT_REF=$note_transport_ref" >> $GITHUB_OUTPUT | |
| bridge_portal_ref='${{ inputs.bridge_portal_ref }}' | |
| [ -z "$bridge_portal_ref" ] && bridge_portal_ref="$bridge_portal_def" | |
| echo "BRIDGE_PORTAL_REF=$bridge_portal_ref" >> $GITHUB_OUTPUT | |
| vm_ref='${{ inputs.miden_vm_ref }}' | |
| [ -z "$vm_ref" ] && vm_ref="$def" | |
| echo "MIDEN_VM_REF=$vm_ref" >> $GITHUB_OUTPUT | |
| compiler_ref='${{ inputs.compiler_ref }}' | |
| [ -z "$compiler_ref" ] && compiler_ref="$def" | |
| echo "COMPILER_REF=$compiler_ref" >> $GITHUB_OUTPUT | |
| guardian_ref='${{ inputs.guardian_ref }}' | |
| [ -z "$guardian_ref" ] && guardian_ref="${DEFAULT_GUARDIAN_REF}" | |
| echo "GUARDIAN_REF=$guardian_ref" >> $GITHUB_OUTPUT | |
| echo "Resolved refs:" | |
| echo " protocol: $base_ref" | |
| echo " tutorials: $tutorials_ref" | |
| echo " miden-client: $client_ref" | |
| echo " node: $node_ref" | |
| echo " note-transport: $note_transport_ref" | |
| echo " bridge-portal: $bridge_portal_ref" | |
| echo " miden-vm: $vm_ref" | |
| echo " compiler: $compiler_ref" | |
| echo " guardian: $guardian_ref" | |
| # Check out each source repo into vendor/* | |
| - name: Checkout 0xMiden/protocol | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 0xMiden/protocol | |
| ref: ${{ steps.refs.outputs.MIDEN_BASE_REF }} | |
| path: vendor/protocol | |
| - name: Checkout 0xMiden/tutorials | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 0xMiden/tutorials | |
| ref: ${{ steps.refs.outputs.MIDEN_TUTORIALS_REF }} | |
| path: vendor/tutorials | |
| - name: Checkout 0xMiden/miden-client | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 0xMiden/miden-client | |
| ref: ${{ steps.refs.outputs.MIDEN_CLIENT_REF }} | |
| path: vendor/miden-client | |
| - name: Checkout 0xMiden/node | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 0xMiden/node | |
| ref: ${{ steps.refs.outputs.MIDEN_NODE_REF }} | |
| path: vendor/node | |
| - name: Checkout 0xMiden/note-transport-service | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 0xMiden/note-transport-service | |
| ref: ${{ steps.refs.outputs.NOTE_TRANSPORT_REF }} | |
| path: vendor/note-transport-service | |
| - name: Checkout 0xMiden/bridge-portal | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 0xMiden/bridge-portal | |
| ref: ${{ steps.refs.outputs.BRIDGE_PORTAL_REF }} | |
| path: vendor/bridge-portal | |
| - name: Checkout 0xMiden/miden-vm | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 0xMiden/miden-vm | |
| ref: ${{ steps.refs.outputs.MIDEN_VM_REF }} | |
| path: vendor/miden-vm | |
| - name: Checkout 0xMiden/compiler | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 0xMiden/compiler | |
| ref: ${{ steps.refs.outputs.COMPILER_REF }} | |
| path: vendor/compiler | |
| - name: Checkout OpenZeppelin/guardian | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: OpenZeppelin/guardian | |
| ref: ${{ steps.refs.outputs.GUARDIAN_REF }} | |
| path: vendor/guardian | |
| # ============================================================ | |
| # v0.4 IA: Aggregate into nested structure | |
| # - Reference docs (protocol, miden-vm, compiler, node) → docs/reference/ | |
| # - Builder docs (tutorials, miden-client) → docs/builder/ | |
| # ============================================================ | |
| - name: Aggregate docs into single docs tree | |
| run: | | |
| echo "Aggregating vendor docs into v0.4 IA structure..." | |
| # Clean directories that will be re-synced (v0.4 nested paths) | |
| rm -rf docs/reference/protocol docs/reference/miden-vm docs/reference/node docs/reference/compiler | |
| # tools/clients: only clean ingested subdirs; preserve locally-authored web-client/, react-sdk/, index.md | |
| rm -rf docs/builder/tools/clients/rust-client | |
| rm -rf docs/builder/tools/clients/img | |
| rm -rf docs/builder/tools/clients/theme | |
| rm -f docs/builder/tools/clients/common-errors.md | |
| rm -f docs/builder/tools/clients/_category_.yml | |
| rm -rf docs/builder/tools/cli | |
| rm -rf docs/builder/tools/bridging | |
| # tutorials: only clean ingested subdirs/files; preserve locally-authored rust-compiler/, index.md, _category_.json, recipes/_category_.json, recipes/{rust,web}/_category_.json | |
| rm -rf docs/builder/tutorials/miden-bank | |
| rm -rf docs/builder/tutorials/components | |
| rm -rf docs/builder/tutorials/img | |
| rm -rf docs/builder/tutorials/theme | |
| rm -f docs/builder/tutorials/miden_node_setup.md | |
| # Recipes: remove everything under recipes/rust|web except _category_.json (restored via git checkout after re-ingest) | |
| for d in docs/builder/tutorials/recipes/rust docs/builder/tutorials/recipes/web; do | |
| if [ -d "$d" ]; then | |
| find "$d" -mindepth 1 ! -name _category_.json -exec rm -rf {} + 2>/dev/null || true | |
| fi | |
| done | |
| rm -rf docs/builder/tutorials/recipes/img | |
| # Reference docs → docs/reference/* | |
| if [ -d "vendor/protocol/docs/src" ]; then | |
| mkdir -p docs/reference/protocol | |
| cp -r vendor/protocol/docs/src/* docs/reference/protocol/ | |
| echo "Synced protocol → docs/reference/protocol" | |
| fi | |
| if [ -d "vendor/miden-vm/docs/src" ]; then | |
| mkdir -p docs/reference/miden-vm | |
| cp -r vendor/miden-vm/docs/src/* docs/reference/miden-vm/ | |
| echo "Synced miden-vm → docs/reference/miden-vm" | |
| fi | |
| if [ -d "vendor/node/docs/external/src" ]; then | |
| mkdir -p docs/reference/node | |
| cp -r vendor/node/docs/external/src/* docs/reference/node/ | |
| echo "Synced node → docs/reference/node" | |
| fi | |
| if [ -d "vendor/compiler/docs/external/src" ]; then | |
| mkdir -p docs/reference/compiler | |
| cp -r vendor/compiler/docs/external/src/* docs/reference/compiler/ | |
| echo "Synced compiler → docs/reference/compiler" | |
| fi | |
| # Rebase root-absolute internal links in ingested reference sections. | |
| # Each section is ingested from a repo whose docs are their own standalone | |
| # Docusaurus site (baseUrl "/"), so internal links are authored | |
| # root-absolute (e.g. "/full-node/installation"). Mounted here under | |
| # /reference/<section>/ and served per-version, those links lose the mount | |
| # prefix and version segment and 404. The script converts them to | |
| # version-safe relative .md links (resolved + validated by Docusaurus). | |
| # A no-op for sections that already use relative links (protocol, miden-vm). | |
| for section in protocol miden-vm node compiler; do | |
| [ -d "docs/reference/$section" ] || continue | |
| node scripts/rebase-ingested-links.mjs "docs/reference/$section" | |
| done | |
| # Builder docs → docs/builder/* | |
| # Sync tutorials into tutorials — selective ingest. | |
| # rust-compiler/, index.md, miden-bank/index.md, recipes/_category_.json, | |
| # recipes/rust/_category_.json, recipes/web/_category_.json, and the | |
| # parent _category_.json are locally authored in the docs repo and | |
| # preserved through this clean/ingest cycle. | |
| # Vendor's rust-client/ and web-client/ are renamed at ingest to | |
| # recipes/rust/ and recipes/web/ respectively (see docs repo | |
| # tutorials IA redesign). plugin-client-redirects is configured in | |
| # docusaurus.config.ts to keep old URLs pointing at the new ones. | |
| # lib.rs and vendor's _category_.yml are deliberately NOT ingested. | |
| if [ -d "vendor/tutorials/docs/src" ]; then | |
| mkdir -p docs/builder/tutorials | |
| for name in miden-bank components img theme; do | |
| src="vendor/tutorials/docs/src/$name" | |
| [ -d "$src" ] && cp -r "$src" docs/builder/tutorials/ | |
| done | |
| for name in miden_node_setup.md; do | |
| src="vendor/tutorials/docs/src/$name" | |
| [ -f "$src" ] && cp "$src" docs/builder/tutorials/ | |
| done | |
| # Rename rust-client → recipes/rust, web-client → recipes/web. | |
| # Copy CONTENTS (using /. and ensuring the target dir exists) so | |
| # the locally-authored _category_.json already in recipes/{rust,web}/ | |
| # isn't shadowed by a nested rust-client/ or web-client/ subdir. | |
| mkdir -p docs/builder/tutorials/recipes/rust | |
| mkdir -p docs/builder/tutorials/recipes/web | |
| if [ -d "vendor/tutorials/docs/src/rust-client" ]; then | |
| cp -r vendor/tutorials/docs/src/rust-client/. docs/builder/tutorials/recipes/rust/ | |
| rm -f docs/builder/tutorials/recipes/rust/_category_.yml | |
| fi | |
| if [ -d "vendor/tutorials/docs/src/web-client" ]; then | |
| cp -r vendor/tutorials/docs/src/web-client/. docs/builder/tutorials/recipes/web/ | |
| rm -f docs/builder/tutorials/recipes/web/_category_.yml | |
| fi | |
| # Ingested recipe pages use relative image paths like ../img/... | |
| # which now resolves under recipes/img/. Mirror the tutorials/img | |
| # dir into recipes/img/ so those refs keep working after the rename. | |
| if [ -d "vendor/tutorials/docs/src/img" ]; then | |
| cp -r vendor/tutorials/docs/src/img docs/builder/tutorials/recipes/ | |
| fi | |
| # Rebase links whose source paths changed when mounted under the | |
| # docs IA (recipe depth and Miden Bank card targets). | |
| node scripts/fix-ingested-tutorial-links.mjs docs/builder/tutorials | |
| # Restore locally-authored files over vendor versions. | |
| git checkout HEAD -- docs/builder/tutorials/miden-bank/index.md 2>/dev/null || true | |
| git checkout HEAD -- docs/builder/tutorials/recipes/_category_.json 2>/dev/null || true | |
| git checkout HEAD -- docs/builder/tutorials/recipes/rust/_category_.json 2>/dev/null || true | |
| git checkout HEAD -- docs/builder/tutorials/recipes/web/_category_.json 2>/dev/null || true | |
| echo "Synced tutorials (miden-bank, components, img, theme, miden_node_setup.md, recipes/rust, recipes/web) → docs/builder/tutorials" | |
| fi | |
| if [ -d "vendor/miden-client/docs/external/src" ]; then | |
| mkdir -p docs/builder/tools/clients | |
| # Selective ingestion: only subdirs/files we still auto-sync from miden-client. | |
| # web-client/, react-sdk/, and top-level index.md are locally authored in the docs repo | |
| # — they are preserved through this clean/ingest cycle. | |
| for name in rust-client img theme; do | |
| src="vendor/miden-client/docs/external/src/$name" | |
| [ -d "$src" ] && cp -r "$src" docs/builder/tools/clients/ | |
| done | |
| for name in common-errors.md _category_.yml; do | |
| src="vendor/miden-client/docs/external/src/$name" | |
| [ -f "$src" ] && cp "$src" docs/builder/tools/clients/ | |
| done | |
| echo "Synced miden-client (rust-client, img, theme, common-errors, _category_) → docs/builder/tools/clients" | |
| fi | |
| if [ -d "vendor/note-transport-service/docs/external/src" ]; then | |
| rm -rf docs/builder/tools/note-transport | |
| mkdir -p docs/builder/tools/note-transport | |
| cp -r vendor/note-transport-service/docs/external/src/* docs/builder/tools/note-transport/ | |
| echo "Synced note-transport-service → docs/builder/tools/note-transport" | |
| fi | |
| if [ -d "vendor/bridge-portal/docs/external/src/bridging" ]; then | |
| mkdir -p docs/builder/tools/bridging | |
| cp -r vendor/bridge-portal/docs/external/src/bridging/. docs/builder/tools/bridging/ | |
| echo "Synced bridge-portal → docs/builder/tools/bridging" | |
| fi | |
| # Guardian (OpenZeppelin/guardian) docs are raw GitHub-README markdown, not | |
| # Docusaurus-ready, so transform via scripts/ingest-guardian.mjs (filter infra | |
| # files, inject frontmatter, sanitize MDX, rewrite links into folders) rather | |
| # than a plain copy. The script self-cleans the target but preserves the | |
| # authored index.md, which we restore from HEAD afterward to be safe. | |
| if [ -d "vendor/guardian/docs" ]; then | |
| node scripts/ingest-guardian.mjs vendor/guardian/docs docs/builder/miden-guardian "${{ steps.refs.outputs.GUARDIAN_REF }}" | |
| git checkout HEAD -- docs/builder/miden-guardian/index.md 2>/dev/null || true | |
| echo "Synced guardian → docs/builder/miden-guardian" | |
| fi | |
| echo "Content aggregation complete. Final docs structure:" | |
| ls -la docs/ | |
| echo "Reference subdirs:" | |
| ls -la docs/reference/ || true | |
| echo "Builder subdirs:" | |
| ls -la docs/builder/ || true | |
| echo "Tutorials subdirs:" | |
| ls -la docs/builder/tutorials/ || true | |
| - name: Install deps | |
| run: npm install --frozen-lockfile | |
| - name: Build site | |
| env: | |
| NODE_OPTIONS: "--max-old-space-size=12288" # 12GB | |
| run: | | |
| echo "Building Docusaurus site" | |
| npm run build | |
| - name: Add CNAME | |
| run: echo docs.miden.xyz > build/CNAME | |
| - name: Upload artifact | |
| uses: actions/upload-pages-artifact@v3 | |
| with: | |
| path: build | |
| - name: Deploy to GitHub Pages | |
| uses: actions/deploy-pages@v4 |