diff --git a/.github/workflows/prune-see-also.yml b/.github/workflows/prune-see-also.yml new file mode 100644 index 00000000..6cdd69a4 --- /dev/null +++ b/.github/workflows/prune-see-also.yml @@ -0,0 +1,69 @@ +name: Prune stale See also links + +# Companion to regenerate-see-also.yml's scheduled full regeneration: that +# job only fires once enough docs have changed (see the threshold there) and +# always does a full re-embed. This workflow instead runs on every PR that +# deletes or renames a docs page and does the cheap part immediately -- +# dropping (or, for a rename, remapping) the affected doc id in +# src/data/see_also.json -- so a reader never sees a "See also" section drop +# a link (or worse, keep showing one) for longer than it takes this job to +# run, without waiting on the next scheduled full regeneration. +# +# scripts/prune_see_also.py has no heavy dependencies (no numpy/torch/ +# sentence-transformers) -- it's pure git-diff + JSON bookkeeping -- so this +# is cheap enough to run on every relevant PR, unlike the full embed. +on: + pull_request: + types: [opened, synchronize] + paths: + - 'docs/**/*.md' + - 'docs/**/*.mdx' + +# A fast-follow push to the same PR shouldn't race a still-running prune from +# the previous push -- same reasoning (and same pattern) as +# translate-ja-docs.yml's concurrency group. +concurrency: + group: prune-see-also-${{ github.head_ref }} + cancel-in-progress: true + +permissions: + contents: write + +jobs: + prune: + # Fork PRs get a read-only GITHUB_TOKEN against this repo (a deliberate + # GitHub security boundary), so the push step below can never succeed + # for one -- skip cleanly instead of failing on a permissions error that + # has nothing to do with the contributor's actual change. A fork PR that + # deletes/renames a page just relies on the scheduled full regeneration + # (regenerate-see-also.yml) to catch up -- safe, since a stale id is + # dropped at render time (src/components/SeeAlso), never rendered as a + # dead link. + if: github.event.pull_request.head.repo.full_name == github.repository + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.head_ref }} + + - uses: actions/setup-python@v5 + with: { python-version: '3.12' } + + - name: Prune deleted/renamed doc ids from see_also.json + run: | + BASE="${{ github.event.pull_request.base.sha }}" + git diff --name-status -M "$BASE" HEAD -- docs \ + | python3 scripts/prune_see_also.py + + - name: Commit if anything changed + run: | + git config user.name "bitrise-docs-bot" + git config user.email "docs-bot@bitrise.io" + git add src/data/see_also.json + if ! git diff --cached --quiet; then + git commit -m "docs(see-also): prune stale ids after page delete/rename [skip ci]" + git push + else + echo "No see_also.json changes to commit." + fi diff --git a/.github/workflows/regenerate-see-also.yml b/.github/workflows/regenerate-see-also.yml new file mode 100644 index 00000000..b991bddc --- /dev/null +++ b/.github/workflows/regenerate-see-also.yml @@ -0,0 +1,168 @@ +name: Regenerate See also links + +# Full re-embed of the "See also" relatedness graph (scripts/generate_see_also.py). +# Unlike prune-see-also.yml (cheap, runs on every relevant PR), this installs +# sentence-transformers/torch and re-embeds the whole docs corpus -- real +# cost, so it's gated to run only when enough has actually changed. +# +# The gate job is dependency-free and cheap: it counts docs files +# changed since the last regeneration (scripts/see_also_sync_state.json's +# last_embedded_sha), excluding generated API reference pages, and only lets +# the expensive `regenerate` job proceed once that count reaches the +# threshold below. Measured: ~40 changed files corresponds to roughly once +# a week at this repo's edit pace, with no more than ~2 weeks between +# regenerations even in a slow stretch -- deliberately erring towards fewer, +# cheaper runs. Staleness in between is safe, not just tolerated: a stale or +# removed id is silently dropped at render time (src/components/SeeAlso), +# and prune-see-also.yml already keeps deletions/renames from ever showing a +# dead link. This job exists purely to keep relatedness itself fresh, not to +# prevent breakage. +on: + schedule: + - cron: '0 7 * * *' # 07:00 UTC daily -- the gate below decides if anything actually runs + workflow_dispatch: + +concurrency: + group: regenerate-see-also + cancel-in-progress: false + +env: + CHANGED_FILES_THRESHOLD: 40 + +jobs: + gate: + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.check.outputs.should_run }} + changed_count: ${{ steps.check.outputs.changed_count }} + since_sha: ${{ steps.check.outputs.since_sha }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - id: check + run: | + STATE_FILE="scripts/see_also_sync_state.json" + LAST_SHA="" + if [ -f "$STATE_FILE" ]; then + LAST_SHA=$(python3 -c "import json; print(json.load(open('$STATE_FILE')).get('last_embedded_sha', ''))") + fi + + if [ -z "$LAST_SHA" ] || ! git cat-file -e "$LAST_SHA" 2>/dev/null; then + echo "No valid prior state -- running a first regeneration to establish one." + echo "should_run=true" >> "$GITHUB_OUTPUT" + echo "changed_count=n/a (no prior state)" >> "$GITHUB_OUTPUT" + echo "since_sha=n/a (first run)" >> "$GITHUB_OUTPUT" + exit 0 + fi + + CHANGED=$(git diff --name-only "$LAST_SHA" HEAD -- docs \ + | grep -v -E '^docs/(bitrise-api|bitrise-rde-api)/api-reference/' \ + | wc -l | tr -d ' ') + + echo "Docs files changed since last embed ($LAST_SHA): $CHANGED (threshold: $CHANGED_FILES_THRESHOLD)" + echo "changed_count=$CHANGED" >> "$GITHUB_OUTPUT" + echo "since_sha=${LAST_SHA:0:10}" >> "$GITHUB_OUTPUT" + if [ "$CHANGED" -ge "$CHANGED_FILES_THRESHOLD" ]; then + echo "should_run=true" >> "$GITHUB_OUTPUT" + else + echo "should_run=false" >> "$GITHUB_OUTPUT" + fi + + regenerate: + needs: gate + if: needs.gate.outputs.should_run == 'true' + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Cache node_modules + uses: actions/cache@v4 + with: + path: | + node_modules + !node_modules/.cache + key: node-modules-${{ runner.os }}-node20-${{ hashFiles('package-lock.json') }} + + - uses: actions/setup-python@v5 + with: { python-version: '3.12' } + + - name: Cache pip packages + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: pip-see-also-${{ runner.os }}-${{ hashFiles('scripts/requirements-see-also.txt') }} + + - name: Cache Hugging Face model weights + uses: actions/cache@v4 + with: + path: ~/.cache/huggingface + key: hf-model-all-mpnet-base-v2 + + - name: Install Python dependencies + run: | + # sentence-transformers depends on torch; installing the CPU-only + # wheel first (this runner has no GPU) means the second command + # below finds a satisfying torch already present instead of + # pulling the much larger CUDA-enabled build. requirements-see-also.txt + # doesn't pin a torch version, so a future bump to the + # sentence-transformers pin could require a newer torch than + # what's already installed here -- passing the CPU wheel index as + # an *extra* index (not the sole index) on the second command too + # means that re-resolution can still find a CPU build instead of + # silently falling back to the default (CUDA) one. + pip install --index-url https://download.pytorch.org/whl/cpu torch + pip install -r scripts/requirements-see-also.txt --extra-index-url https://download.pytorch.org/whl/cpu + + - run: npm install + + - name: Build the English locale + run: npx docusaurus build --locale en + + - name: Regenerate see_also.json + run: python3 scripts/generate_see_also.py + + - name: Update sync state + run: | + python3 -c " + import json + from pathlib import Path + Path('scripts/see_also_sync_state.json').write_text( + json.dumps({'last_embedded_sha': '${{ github.sha }}'}, indent=2) + '\n' + ) + " + + - name: Open PR + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ secrets.DOCS_SYNC_TOKEN || github.token }} + base: main + branch: auto/see-also-regen + delete-branch: true + add-paths: | + src/data/see_also.json + scripts/see_also_sync_state.json + commit-message: 'docs: regenerate See also links' + title: 'docs: regenerate See also links' + labels: | + automated + documentation + body: | + Automated full re-embedding of the "See also" relatedness graph. + + - Docs files changed (excluding generated API reference pages): ${{ needs.gate.outputs.changed_count }} + - Threshold: ${{ env.CHANGED_FILES_THRESHOLD }} + - Since commit: ${{ needs.gate.outputs.since_sha }} + + See `scripts/generate_see_also.py`. + + Triggered by `.github/workflows/regenerate-see-also.yml`. diff --git a/.github/workflows/test-see-also.yml b/.github/workflows/test-see-also.yml new file mode 100644 index 00000000..e4be94f4 --- /dev/null +++ b/.github/workflows/test-see-also.yml @@ -0,0 +1,36 @@ +name: Test See also pipeline + +# Runs scripts/test_prune_see_also.py whenever the "See also" pipeline's own +# code changes -- not on ordinary docs content changes, which never touch +# this code at all (that's what prune-see-also.yml and regenerate-see-also.yml +# exercise, against real data, not the logic itself). +# +# Plain stdlib unittest, no dependencies to install, so this has nothing to +# set up and finishes in well under a second. No special permissions needed +# either (read-only: checkout + run), so unlike prune-see-also.yml this runs +# the same way for fork PRs too. +on: + pull_request: + paths: + - 'scripts/generate_see_also.py' + - 'scripts/prune_see_also.py' + - 'scripts/see_also_common.py' + - 'scripts/test_prune_see_also.py' + push: + branches: [main] + paths: + - 'scripts/generate_see_also.py' + - 'scripts/prune_see_also.py' + - 'scripts/see_also_common.py' + - 'scripts/test_prune_see_also.py' + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: { python-version: '3.12' } + + - run: python3 scripts/test_prune_see_also.py -v diff --git a/.gitignore b/.gitignore index 74f1000e..65d9ad36 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,6 @@ # Python bytecode (scripts/) __pycache__/ *.pyc + +# Python virtualenv +.venv/ diff --git a/package-lock.json b/package-lock.json index f4da7f84..2f110c2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -172,6 +172,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.52.1.tgz", "integrity": "sha512-gA8oJOV1LnQQkDf91iebNnFInHuW0gRPEgLSOQ7EfipCEjYTHm5swm1DlH9H5RaRw4RrHuzHBegnlzc0MAstcg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.52.1", "@algolia/requester-browser-xhr": "5.52.1", @@ -413,6 +414,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -2288,6 +2290,7 @@ "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-3.35.0.tgz", "integrity": "sha512-qzfRNLwxKjxx2IXjBj6uz1nYI+pKsq6uwHxO619+hx1OzNNuwLIjEHJxnDfBzoynO7sPCBlubMwFWb1e1PrXzw==", "license": "MIT", + "peer": true, "dependencies": { "@ark-ui/react": "5.36.2", "@emotion/is-prop-valid": "^1.4.0", @@ -2576,6 +2579,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2598,6 +2602,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2707,6 +2712,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3128,6 +3134,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3958,6 +3965,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz", "integrity": "sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/babel": "3.10.1", "@docusaurus/bundler": "3.10.1", @@ -4146,6 +4154,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz", "integrity": "sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.10.1", "@docusaurus/logger": "3.10.1", @@ -4374,6 +4383,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz", "integrity": "sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.10.1", "@docusaurus/logger": "3.10.1", @@ -4415,6 +4425,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.1.tgz", "integrity": "sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/mdx-loader": "3.10.1", "@docusaurus/module-type-aliases": "3.10.1", @@ -4531,6 +4542,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.1.tgz", "integrity": "sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/logger": "3.10.1", "@docusaurus/types": "3.10.1", @@ -4576,6 +4588,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz", "integrity": "sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/logger": "3.10.1", "@docusaurus/utils": "3.10.1", @@ -4674,6 +4687,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -5792,6 +5806,7 @@ "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.0.tgz", "integrity": "sha512-/PyIMzK29jtXaGU23qTvNZxvBXRtKbNnGDFD+PY6CZw/Y8Ex8pFUzkuCJCG9aOqmShjqhS9mPqP6Dk5onQY8rQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/helpers": "^0.5.0" } @@ -6346,6 +6361,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -7395,6 +7411,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -8073,18 +8090,6 @@ } } }, - "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/tree-sitter": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.4.tgz", - "integrity": "sha512-usbHZP9/oxNsUY65MQUsduGRqDHQOou1cagUSwjhoSYAmSahjQDAVsh9s+SlZkn8X8+O1FULRGwHu7AFP3kjzg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - } - }, "node_modules/@swagger-api/apidom-reference": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.11.2.tgz", @@ -8438,7 +8443,8 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/mdast": { "version": "4.0.4", @@ -8525,6 +8531,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -9837,6 +9844,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -9926,6 +9934,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -9985,6 +9994,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.52.1.tgz", "integrity": "sha512-fHA8+kXTbjagw3jkLiaS7KKrH8qe2DyOsiUhGlN4cdT77PEsfqXZl7ewDk1hsg+pJnPlnE50XtLxjR91iJOpmg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.18.1", "@algolia/client-abtesting": "5.52.1", @@ -10625,6 +10635,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -11811,6 +11822,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -13572,6 +13584,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14929,6 +14942,7 @@ "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.3.tgz", "integrity": "sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -18643,6 +18657,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -19486,6 +19501,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -20389,6 +20405,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -21280,6 +21297,7 @@ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/ramda" @@ -21385,6 +21403,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -21423,6 +21442,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -21460,6 +21480,7 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.78.0.tgz", "integrity": "sha512-EEZqc+N23moyzTlz61Pj+JvcXo76ICkpfOZo8JZw+sM4+wLQGh6nI2Ms+PdMOYNluFu0ghlM7B8mCzhRYtJCnA==", "license": "MIT", + "peer": true, "engines": { "node": ">=18.0.0" }, @@ -21552,6 +21573,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -21629,6 +21651,7 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", "license": "MIT", + "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -21652,6 +21675,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -21851,7 +21875,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/redux-immutable": { "version": "4.0.0", @@ -22502,6 +22527,7 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.101.0.tgz", "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==", "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", @@ -24020,6 +24046,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -24114,18 +24141,6 @@ "tslib": "2" } }, - "node_modules/tree-sitter": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", - "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.8.0" - } - }, "node_modules/tree-sitter-json": { "version": "0.24.8", "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.24.8.tgz", @@ -24214,7 +24229,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsyringe": { "version": "4.10.0", @@ -24297,6 +24313,7 @@ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -24327,6 +24344,7 @@ "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "pathe": "^2.0.3" } @@ -24713,6 +24731,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -25003,6 +25022,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -25407,6 +25427,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "bin": { "workerd": "bin/workerd" }, diff --git a/scripts/generate_see_also.py b/scripts/generate_see_also.py new file mode 100644 index 00000000..208312e6 --- /dev/null +++ b/scripts/generate_see_also.py @@ -0,0 +1,280 @@ +#!/usr/bin/env python3 +"""Generate 'See also' related-links data for every docs page. + +Embeds each page locally (sentence-transformers, no external API calls) and +picks, per page, the top 5 nearest neighbors by cosine similarity, dropping +any below a floor score so unrelated pages don't get forced matches, and +capping how many picks can come from the same directory so a tightly-related +cluster (e.g. the Bazel build-cache pages) doesn't crowd out cross-cutting +matches. + +Writers can override the automatic picks per page via frontmatter: + + see_also: [/bitrise-ci/testing/running-xcode-tests-on-bitrise, ...] + see_also_exclude: [/bitrise-ci/some-loosely-related-page] + +`see_also` fully replaces the automatic picks for that page. `see_also_exclude` +removes specific candidates from the automatic picks (ignored if `see_also` is +also set). Entries are a bare path, exactly as it would appear in a Markdown +link (e.g. `/bitrise-ci/testing/running-xcode-tests-on-bitrise`) -- this +resolves to the target's stable doc id, which is all that gets written to the +output. A locale-prefixed permalink (`/en/...`, `/ja/...`) also resolves, for +anything pasted from a browser URL, but isn't the form to write -- this +repo's cross-reference convention is bare, locale-less paths (see CLAUDE.md). + +The output maps each page's doc id to a list of its related pages' doc ids -- +no titles, no hrefs. Display data (title, locale-correct permalink) is +resolved live at render time by via Docusaurus's own per-locale doc +data, so the same relatedness graph serves every locale correctly without +regenerating per locale, and a page whose id no longer exists by the time a +reader loads it is just skipped rather than rendered as a dead link. + +Requires a Docusaurus *production build* cache to exist (for authoritative +ids/permalinks, since ~1/3 of pages compute their slug implicitly rather than +declaring it in frontmatter). Build the English locale specifically -- +`npx docusaurus build --locale en`, not the multi-locale `npm run build`: +building every configured locale in one invocation leaves the cache +reflecting whichever locale happened to build last, which would make the +embedding corpus's structural data (id, draft/unlisted, sourceDirName) depend +on build order rather than being deterministic. Also not `npm start`: dev-mode +metadata includes draft/unlisted docs that a production build (and therefore +the live site) excludes, which would otherwise let a draft page leak into +see_also.json as a link that 404s once published. + +Usage: + pip install -r scripts/requirements-see-also.txt + npx docusaurus build --locale en + python scripts/generate_see_also.py +""" +import json +import re +import sys +from pathlib import Path + +import numpy as np +import yaml +from sentence_transformers import SentenceTransformer + +from see_also_common import EXCLUDED_SOURCE_DIRS + +REPO_ROOT = Path(__file__).resolve().parent.parent +DOCS_ROOT = REPO_ROOT / "docs" +CONTENT_DOCS_CACHE = REPO_ROOT / ".docusaurus" / "docusaurus-plugin-content-docs" / "default" +OUTPUT_PATH = REPO_ROOT / "src" / "data" / "see_also.json" + +MODEL_NAME = "all-mpnet-base-v2" +TOP_K = 5 +FLOOR = 0.45 +MAX_PER_SOURCE_DIR = 2 + +# Top-level product landing pages (e.g. /en/bitrise-ci/) are built entirely +# from a component, so once the JSX is stripped there's +# almost no real prose left to embed -- they end up as near-empty vectors +# that loosely match each other by accident rather than by genuine relevance. +# Excluded both as candidates (no See also section on them) and as targets +# (never suggested from other pages). +LANDING_PAGE_MARKER = "]*/?>") +ADMONITION_RE = re.compile(r":::\w+(\[[^\]]*\])?") +CODE_BLOCK_RE = re.compile(r"```.*?```", re.DOTALL) +INLINE_CODE_RE = re.compile(r"`[^`]*`") +MD_LINK_RE = re.compile(r"\[([^\]]*)\]\([^)]*\)") +MD_IMAGE_RE = re.compile(r"!\[[^\]]*\]\([^)]*\)") +HTML_COMMENT_RE = re.compile(r"", re.DOTALL) +HEADING_HASH_RE = re.compile(r"^#{1,6}\s*", re.MULTILINE) + +_partial_text_cache = {} + + +def _load_partial_text(rel_path: str) -> str: + """Reusable content fragments (src/partials/*.mdx, see CLAUDE.md) are the + biggest authoring lever in this repo -- pages just reference them as + . Without resolving them, the actual instructions they + contain would never reach the embedder, only an empty placeholder tag.""" + if rel_path not in _partial_text_cache: + raw = (REPO_ROOT / rel_path).read_text(encoding="utf-8") + _partial_text_cache[rel_path] = IMPORT_RE.sub("", raw) + return _partial_text_cache[rel_path] + + +def resolve_partials(body: str) -> str: + for name, rel_path in PARTIAL_IMPORT_RE.findall(body): + partial_text = _load_partial_text(rel_path) + body = re.sub(rf"<{name}\s*/>", lambda m: partial_text, body) + return body + + +def clean_body(raw: str) -> str: + fm_match = FRONTMATTER_RE.match(raw) + body = raw[fm_match.end():] if fm_match else raw + body = resolve_partials(body) + body = IMPORT_RE.sub("", body) + body = CODE_BLOCK_RE.sub(" ", body) + body = MD_IMAGE_RE.sub("", body) + body = HTML_COMMENT_RE.sub(" ", body) + body = JSX_TAG_RE.sub(" ", body) + body = ADMONITION_RE.sub(" ", body) + body = INLINE_CODE_RE.sub(" ", body) + body = MD_LINK_RE.sub(r"\1", body) + body = HEADING_HASH_RE.sub("", body) + return re.sub(r"\s+", " ", body).strip() + + +def _is_draft_or_unlisted(path: Path) -> bool: + fm_match = FRONTMATTER_RE.match(path.read_text(encoding="utf-8")) + if not fm_match: + return False + front_matter = yaml.safe_load(fm_match.group(1)) or {} + return bool(front_matter.get("draft") or front_matter.get("unlisted")) + + +def check_cache_is_fresh(cache_files): + """Warn if the docs on disk and the cache entries loaded from + .docusaurus disagree -- the symptom of forgetting to rebuild the cache + (`npx docusaurus build --locale en`) after adding, removing, or renaming + pages. A production build cache legitimately omits draft/unlisted pages + entirely, so those are excluded from the disk side of the comparison + rather than flagged.""" + disk_paths = { + p.relative_to(REPO_ROOT).as_posix() + for p in list(DOCS_ROOT.rglob("*.md")) + list(DOCS_ROOT.rglob("*.mdx")) + if not _is_draft_or_unlisted(p) + } + cache_paths = set() + for f in cache_files: + meta = json.loads(f.read_text(encoding="utf-8")) + source = meta.get("source", "") + if source.startswith("@site/docs/"): + cache_paths.add(source.removeprefix("@site/")) + + missing_from_cache = disk_paths - cache_paths + stale_in_cache = cache_paths - disk_paths + if missing_from_cache or stale_in_cache: + print("WARNING: docs on disk and the Docusaurus cache disagree -- rebuild with `npx docusaurus build --locale en` first.", file=sys.stderr) + for p in sorted(missing_from_cache): + print(f" on disk but not in cache: {p}", file=sys.stderr) + for p in sorted(stale_in_cache): + print(f" in cache but not on disk: {p}", file=sys.stderr) + + +def load_doc_metadata(): + """Read Docusaurus's own generated per-doc metadata: authoritative + id, source path, permalink, title, and description for every page. + + Returns (docs, lookup): `docs` is the filtered list used for embedding; + `lookup` maps every page's slug and permalink (including pages excluded + from `docs`, e.g. API reference) to its doc id, so frontmatter overrides + can reference any page in the site by the same human-friendly slug/ + permalink a Markdown link would use. + """ + if not CONTENT_DOCS_CACHE.is_dir(): + raise SystemExit( + f"No Docusaurus cache found at {CONTENT_DOCS_CACHE}.\n" + "Run `npx docusaurus build --locale en` once first, then re-run this script." + ) + + cache_files = sorted(CONTENT_DOCS_CACHE.glob("site-docs-*.json")) + check_cache_is_fresh(cache_files) + + docs = [] + lookup = {} + for f in cache_files: + meta = json.loads(f.read_text(encoding="utf-8")) + source = meta["source"] # e.g. "@site/docs/bitrise-ci/foo.mdx" + if not source.startswith("@site/docs/"): + continue + + doc_id = meta["id"] + lookup[meta["permalink"]] = doc_id + if meta.get("slug"): + lookup[meta["slug"]] = doc_id + + if meta.get("draft") or meta.get("unlisted"): + # Belt-and-suspenders: a production build cache already excludes + # these, but a dev-mode (`npm start`) cache wouldn't. + continue + if meta.get("sourceDirName", "") in EXCLUDED_SOURCE_DIRS: + continue + rel_path = source.removeprefix("@site/") + raw = (REPO_ROOT / rel_path).read_text(encoding="utf-8") + if LANDING_PAGE_MARKER in raw: + continue + + front_matter = meta.get("frontMatter", {}) or {} + docs.append({ + "id": doc_id, + "source": source, + "raw": raw, + "title": meta["title"], + "description": meta.get("description", ""), + "sourceDirName": meta.get("sourceDirName", ""), + "see_also_override": front_matter.get("see_also") or [], + "see_also_exclude": front_matter.get("see_also_exclude") or [], + }) + return docs, lookup + + +def resolve_refs(refs, lookup, doc_source): + """Resolve frontmatter slug/permalink references to doc ids, warning + (not failing) on typos or renamed pages.""" + resolved = [] + for ref in refs: + doc_id = lookup.get(ref) + if doc_id is None: + print(f"WARNING: {doc_source} references unknown page '{ref}' in frontmatter -- skipping.", file=sys.stderr) + continue + resolved.append(doc_id) + return resolved + + +def main(): + docs, lookup = load_doc_metadata() + print(f"Loaded metadata for {len(docs)} pages") + + texts = [] + for doc in docs: + body = clean_body(doc["raw"]) + texts.append(f"{doc['title']}. {doc['description']}. {body}"[:4000]) + + model = SentenceTransformer(MODEL_NAME) + embeddings = model.encode(texts, batch_size=32, show_progress_bar=True, normalize_embeddings=True) + + sims = embeddings @ embeddings.T + np.fill_diagonal(sims, -1) + + output = {} + for i, doc in enumerate(docs): + if doc["see_also_override"]: + neighbor_ids = resolve_refs(doc["see_also_override"], lookup, doc["source"]) + else: + excluded_ids = set(resolve_refs(doc["see_also_exclude"], lookup, doc["source"])) + order = np.argsort(-sims[i]) + neighbor_ids = [] + dir_counts = {} + for j in order: + if sims[i][j] < FLOOR or len(neighbor_ids) >= TOP_K: + break + candidate = docs[j] + if candidate["id"] in excluded_ids: + continue + subdir = candidate["sourceDirName"] + if dir_counts.get(subdir, 0) >= MAX_PER_SOURCE_DIR: + continue + neighbor_ids.append(candidate["id"]) + dir_counts[subdir] = dir_counts.get(subdir, 0) + 1 + + if neighbor_ids: + output[doc["id"]] = neighbor_ids + + OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True) + OUTPUT_PATH.write_text(json.dumps(output, indent=2) + "\n") + print(f"Wrote {len(output)} pages with related links to {OUTPUT_PATH}") + print(f"{len(docs) - len(output)} pages had no match above the {FLOOR} floor") + + +if __name__ == "__main__": + main() diff --git a/scripts/prune_see_also.py b/scripts/prune_see_also.py new file mode 100644 index 00000000..f4d7447b --- /dev/null +++ b/scripts/prune_see_also.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python3 +"""Prune or remap doc ids in see_also.json after a page is deleted or renamed. + +Cheap, dependency-free companion to generate_see_also.py: dropping a dead +reference, or updating one to match a rename, doesn't require re-embedding +anything -- it's pure JSON bookkeeping. This script never imports numpy/ +torch/sentence-transformers, so it's fast enough to run on every PR that +touches docs/, not just the ones a full regeneration is scheduled for. + +Reads a `git diff --name-status -M` listing from stdin (the same format +translate_docs.py already reads changed files from), restricted to docs/: + + git diff --name-status -M -- docs \ + | python3 scripts/prune_see_also.py + +For each deleted path (status D), the corresponding doc id is dropped from +its own top-level entry and from every other page's related-ids list. For +each renamed path (status R), the old id is rewritten to the new id +everywhere it appears instead of being dropped -- the content didn't change, +so a page shouldn't lose a "See also" link just because a file moved. + +-M (rename detection) matters: without it, a rename shows up as an unpaired +delete plus an unpaired add, and this script still behaves safely -- it just +falls back to dropping the old id rather than remapping it to the new one. + +Doc ids are derived the same way Docusaurus derives them by default: the +path relative to docs/, minus its extension. A page with a custom `id:` +frontmatter override won't match this derivation, so a change to that page +is silently skipped here -- that's fine, not a correctness gap: the +render-time skip in already treats any stale id as safe to drop, +and the next scheduled full regeneration (see generate_see_also.py) fixes +the underlying data for real. + +API reference pages (see_also_common.EXCLUDED_SOURCE_DIRS) are ignored: +they're generated, not embedded, so their churn isn't a "See also" event. +""" +import json +import sys +from pathlib import Path +from typing import Optional + +from see_also_common import EXCLUDED_SOURCE_DIRS + +REPO_ROOT = Path(__file__).resolve().parent.parent +DATA_PATH = REPO_ROOT / "src" / "data" / "see_also.json" +DOCS_PREFIX = "docs/" +DOC_EXTENSIONS = (".mdx", ".md") + + +def path_to_id(path: str) -> Optional[str]: + """Mirror Docusaurus's default doc id derivation: the path relative to + docs/, minus its extension. None for anything outside docs/, without a + doc extension, or in an excluded (generated) directory.""" + if not path.startswith(DOCS_PREFIX): + return None + rel = path[len(DOCS_PREFIX):] + for ext in DOC_EXTENSIONS: + if rel.endswith(ext): + rel = rel[: -len(ext)] + break + else: + return None + if rel.startswith(EXCLUDED_SOURCE_DIRS): + return None + return rel + + +def parse_changes(lines): + """Parse `git diff --name-status -M` lines into (deleted_ids, renamed_ids) + -- renamed_ids maps old id -> new id. Lines that don't resolve to a doc + id (wrong extension, outside docs/, excluded dir) are ignored.""" + deleted = set() + renamed = {} + for line in lines: + line = line.rstrip("\n") + if not line: + continue + parts = line.split("\t") + status = parts[0] + if status == "D" and len(parts) >= 2: + doc_id = path_to_id(parts[1]) + if doc_id: + deleted.add(doc_id) + elif status.startswith("R") and len(parts) >= 3: + old_id = path_to_id(parts[1]) + new_id = path_to_id(parts[2]) + if old_id and new_id and old_id != new_id: + renamed[old_id] = new_id + return deleted, renamed + + +def prune(data, deleted, renamed): + """Mutates and returns (data, changed).""" + changed = False + + for doc_id in deleted: + if data.pop(doc_id, None) is not None: + changed = True + + for old_id, new_id in renamed.items(): + if old_id in data: + data[new_id] = data.pop(old_id) + changed = True + + for doc_id, related_ids in list(data.items()): + new_related_ids = [] + for related_id in related_ids: + if related_id in deleted: + changed = True + continue + if related_id in renamed: + related_id = renamed[related_id] + changed = True + new_related_ids.append(related_id) + + if new_related_ids: + data[doc_id] = new_related_ids + else: + del data[doc_id] + changed = True + + return data, changed + + +def main(): + deleted, renamed = parse_changes(sys.stdin) + if not deleted and not renamed: + print("No deleted or renamed docs pages -- nothing to prune.") + return + + data = json.loads(DATA_PATH.read_text(encoding="utf-8")) + data, changed = prune(data, deleted, renamed) + + if not changed: + print("No matching ids found in see_also.json -- nothing to prune.") + return + + DATA_PATH.write_text(json.dumps(data, indent=2) + "\n") + print( + f"Pruned {len(deleted)} deleted and remapped {len(renamed)} renamed " + f"doc id(s) in {DATA_PATH.relative_to(REPO_ROOT)}." + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/requirements-see-also.txt b/scripts/requirements-see-also.txt new file mode 100644 index 00000000..2c5c68d8 --- /dev/null +++ b/scripts/requirements-see-also.txt @@ -0,0 +1,3 @@ +sentence-transformers==5.6.0 +numpy==2.4.6 +PyYAML==6.0.3 diff --git a/scripts/see_also_common.py b/scripts/see_also_common.py new file mode 100644 index 00000000..37a05733 --- /dev/null +++ b/scripts/see_also_common.py @@ -0,0 +1,15 @@ +"""Shared constants for the see-also pipeline. + +Kept separate (and dependency-free -- no numpy/torch/sentence-transformers +imports here) so the embedding generator, the delete/rename pruner, and the +CI gate's file-count threshold all agree on which directories don't count, +without needing to import the heavy generator module just to read a constant. +""" + +# Generated API reference docs: auto-generated from OpenAPI specs (not +# hand-written prose), and per-operation pages embed as near-duplicates of +# each other. Excluded from the embedding corpus, from every file-count used +# to decide whether to re-run it, and from the delete/rename pruner (a +# generated page being added/removed by a spec sync is not a "See also" +# event). +EXCLUDED_SOURCE_DIRS = ("bitrise-api/api-reference", "bitrise-rde-api/api-reference") diff --git a/scripts/see_also_sync_state.json b/scripts/see_also_sync_state.json new file mode 100644 index 00000000..aacae71e --- /dev/null +++ b/scripts/see_also_sync_state.json @@ -0,0 +1,3 @@ +{ + "last_embedded_sha": "3c18bd4d6da99e42b309773f0f54073906125b1a" +} diff --git a/scripts/test_prune_see_also.py b/scripts/test_prune_see_also.py new file mode 100644 index 00000000..beb7de37 --- /dev/null +++ b/scripts/test_prune_see_also.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +"""Tests for prune_see_also.py's pure logic -- id derivation, diff parsing, +and the actual prune/remap. No git, no filesystem, no network: everything +here is plain data in, plain data out. + +Deliberately plain stdlib unittest, not pytest -- this repo has no other +Python test tooling, and these three functions don't need fixtures or +parametrize to stay readable. + +Usage: + python3 scripts/test_prune_see_also.py +""" +import unittest + +from prune_see_also import parse_changes, path_to_id, prune + + +class PathToIdTests(unittest.TestCase): + def test_mdx_page(self): + self.assertEqual( + path_to_id("docs/bitrise-ci/foo.mdx"), + "bitrise-ci/foo", + ) + + def test_md_page(self): + self.assertEqual(path_to_id("docs/bitrise-ci/foo.md"), "bitrise-ci/foo") + + def test_outside_docs_dir(self): + self.assertIsNone(path_to_id("src/components/SeeAlso/index.tsx")) + + def test_non_doc_extension(self): + self.assertIsNone(path_to_id("docs/img/foo.png")) + + def test_excluded_api_reference_dir(self): + self.assertIsNone( + path_to_id("docs/bitrise-api/api-reference/activity-list.api.mdx") + ) + self.assertIsNone( + path_to_id("docs/bitrise-rde-api/api-reference/some-endpoint.api.mdx") + ) + + +class ParseChangesTests(unittest.TestCase): + def test_delete(self): + deleted, renamed = parse_changes(["D\tdocs/bitrise-ci/foo.mdx"]) + self.assertEqual(deleted, {"bitrise-ci/foo"}) + self.assertEqual(renamed, {}) + + def test_rename(self): + deleted, renamed = parse_changes( + ["R100\tdocs/bitrise-ci/foo.mdx\tdocs/bitrise-ci/bar.mdx"] + ) + self.assertEqual(deleted, set()) + self.assertEqual(renamed, {"bitrise-ci/foo": "bitrise-ci/bar"}) + + def test_rename_without_minus_m_falls_back_to_delete(self): + # Without -M, git reports an unpaired delete + add instead of one R + # line. Should behave as a plain delete, not silently do nothing. + deleted, renamed = parse_changes( + [ + "D\tdocs/bitrise-ci/foo.mdx", + "A\tdocs/bitrise-ci/bar.mdx", + ] + ) + self.assertEqual(deleted, {"bitrise-ci/foo"}) + self.assertEqual(renamed, {}) + + def test_rename_to_same_id_is_ignored(self): + # e.g. only the extension changed (.mdx -> .md); same doc id either way. + deleted, renamed = parse_changes( + ["R100\tdocs/bitrise-ci/foo.mdx\tdocs/bitrise-ci/foo.md"] + ) + self.assertEqual(renamed, {}) + + def test_excluded_and_malformed_lines_are_ignored(self): + lines = [ + "", + "M\tdocs/bitrise-ci/foo.mdx", + "D\tdocs/bitrise-api/api-reference/activity-list.api.mdx", + "D\tsrc/components/SeeAlso/index.tsx", + "not-a-real-diff-line", + ] + deleted, renamed = parse_changes(lines) + self.assertEqual(deleted, set()) + self.assertEqual(renamed, {}) + + +class PruneTests(unittest.TestCase): + def test_delete_removes_own_entry_and_all_references(self): + data = { + "a": ["b", "c"], + "b": ["a"], + "c": ["a", "b"], + } + data, changed = prune(data, deleted={"b"}, renamed={}) + self.assertTrue(changed) + self.assertNotIn("b", data) + self.assertEqual(data["a"], ["c"]) + self.assertEqual(data["c"], ["a"]) + + def test_rename_remaps_own_entry_and_all_references(self): + data = { + "a": ["b", "c"], + "b": ["a"], + "c": ["a", "b"], + } + data, changed = prune(data, deleted=set(), renamed={"b": "b2"}) + self.assertTrue(changed) + self.assertNotIn("b", data) + self.assertEqual(data["b2"], ["a"]) + self.assertEqual(data["a"], ["b2", "c"]) + self.assertEqual(data["c"], ["a", "b2"]) + + def test_page_with_no_related_ids_left_is_dropped(self): + data = {"a": ["b"], "b": ["a"]} + data, changed = prune(data, deleted={"b"}, renamed={}) + self.assertTrue(changed) + # "a" only ever pointed to "b", which is now gone -- no entry left to show. + self.assertNotIn("a", data) + self.assertNotIn("b", data) + + def test_no_matching_ids_is_a_no_op(self): + data = {"a": ["b", "c"]} + original = {"a": ["b", "c"]} + data, changed = prune(data, deleted={"z"}, renamed={"y": "y2"}) + self.assertFalse(changed) + self.assertEqual(data, original) + + +if __name__ == "__main__": + unittest.main() diff --git a/src/components/SeeAlso/index.tsx b/src/components/SeeAlso/index.tsx new file mode 100644 index 00000000..b7f47de3 --- /dev/null +++ b/src/components/SeeAlso/index.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import Link from '@docusaurus/Link'; +import {useDocsVersion, useDocsData} from '@docusaurus/plugin-content-docs/client'; +import IconBook from '@site/src/images/icon-book-16px.svg'; +import seeAlso from '@site/src/data/see_also.json'; +import styles from './styles.module.css'; + +const relatedIdsByDoc: Record = seeAlso as Record; + +type ResolvedLink = {id: string; title: string; permalink: string}; + +/** + * `see_also.json` maps a doc id to its related pages' doc ids -- no titles, + * no hrefs. Both are resolved here, live, from Docusaurus's own per-locale + * doc data, so the same relatedness graph renders the correct title and + * permalink under any locale without regenerating per locale: + * - `useDocsVersion().docs[id]` carries the locale-correct title, but no + * permalink -- the route-level doc data doesn't include one. + * - `useDocsData(pluginId)`'s global data carries the locale-correct + * permalink (`path`), keyed by the same id, but no title. + * A related id missing from either -- the page was deleted or renamed since + * the last regeneration -- is dropped rather than rendered as a dead link. + */ +export default function SeeAlso({id}: {id?: string}): React.JSX.Element | null { + const relatedIds = id ? relatedIdsByDoc[id] : undefined; + const version = useDocsVersion(); + const pluginData = useDocsData(version.pluginId); + + if (!relatedIds || relatedIds.length === 0) { + return null; + } + + const globalVersion = + pluginData.versions.find((v) => v.name === version.version) ?? pluginData.versions[0]; + + const links: ResolvedLink[] = relatedIds + .map((relatedId): ResolvedLink | null => { + const doc = version.docs[relatedId]; + const globalDoc = globalVersion?.docs.find((d) => d.id === relatedId); + return doc && globalDoc ? {id: relatedId, title: doc.title, permalink: globalDoc.path} : null; + }) + .filter((link): link is ResolvedLink => link !== null); + + if (links.length === 0) { + return null; + } + + return ( +
+
+

+ + See also +

+
    + {links.map((link) => ( +
  • + + {link.title} + +
  • + ))} +
+
+ ); +} diff --git a/src/components/SeeAlso/styles.module.css b/src/components/SeeAlso/styles.module.css new file mode 100644 index 00000000..5e27b15e --- /dev/null +++ b/src/components/SeeAlso/styles.module.css @@ -0,0 +1,66 @@ +.seeAlso { + margin-top: 3rem; +} + +.divider { + margin-bottom: 1.5rem; + border-color: var(--ifm-color-emphasis-300); +} + +.heading { + display: flex; + align-items: center; + gap: 0.4rem; + font-size: var(--ifm-h4-font-size); + margin-bottom: 0.75rem; +} + +.icon { + flex-shrink: 0; +} + +.list { + position: relative; + display: flex; + flex-direction: column; + margin-bottom: 0; + padding-left: 0; + padding-top: 1px; + list-style: none; +} + +.list::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 50%; + border-top: 1px solid var(--ifm-color-emphasis-200); +} + +.item { + position: relative; +} + +.item::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 50%; + border-bottom: 1px solid var(--ifm-color-emphasis-200); +} + +.link { + display: block; + padding: 0.75rem 0.25rem; + color: var(--ifm-link-color); + font-weight: 600; + text-decoration: none; +} + +.link:hover { + background: var(--ifm-color-emphasis-100); + color: var(--ifm-link-hover-color); + text-decoration: underline; +} diff --git a/src/data/see_also.json b/src/data/see_also.json new file mode 100644 index 00000000..2036ba2e --- /dev/null +++ b/src/data/see_also.json @@ -0,0 +1,2903 @@ +{ + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-local-builds": [ + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment", + "bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch" + ], + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments": [ + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-bazel/remote-build-execution-for-bazel", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment" + ], + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment": [ + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments", + "bitrise-build-cache/build-cache-for-bazel/remote-build-execution-for-bazel", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments" + ], + "bitrise-build-cache/build-cache-for-bazel/remote-build-execution-for-bazel": [ + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-platform/infrastructure/configuring-runner-pools" + ], + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds": [ + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment" + ], + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments": [ + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments", + "bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache" + ], + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment": [ + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments", + "bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment" + ], + "bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache": [ + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle" + ], + "bitrise-build-cache/build-cache-for-gradle/gradle-execution-reason-diagnostic-builds": [ + "insights/available-metrics-in-insights/command-metrics", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache", + "bitrise-build-cache/getting-started-with-the-build-cache/invocations" + ], + "bitrise-build-cache/build-cache-for-react-native/build-cache-for-react-native-overview": [ + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-local-builds", + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview", + "bitrise-ci/dependencies-and-caching/react-native-dependencies" + ], + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-local-builds": [ + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-non-bitrise-ci-environments", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-ci/dependencies-and-caching/react-native-dependencies", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects" + ], + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-non-bitrise-ci-environments": [ + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-local-builds", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments" + ], + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment": [ + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-non-bitrise-ci-environments", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-local-builds", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment" + ], + "bitrise-build-cache/build-cache-for-react-native/react-native-cache-faq": [ + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-local-builds", + "bitrise-build-cache/build-cache-for-react-native/build-cache-for-react-native-overview", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-build-cache/build-cache-for-xcode/xcode-compilation-cache-faq", + "bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers" + ], + "bitrise-build-cache/build-cache-for-react-native/wrapping-native-build-commands": [ + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-non-bitrise-ci-environments", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-local-builds", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-ci/dependencies-and-caching/react-native-dependencies", + "bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps" + ], + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-local-builds": [ + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment" + ], + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments": [ + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-local-builds", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment" + ], + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment": [ + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-local-builds", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment" + ], + "bitrise-build-cache/build-cache-for-xcode/xcode-compilation-cache-faq": [ + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-local-builds", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-non-bitrise-ci-environments", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm", + "bitrise-build-cache/build-cache-for-react-native/react-native-cache-faq", + "bitrise-build-cache/build-cache-for-react-native/build-cache-for-react-native-overview" + ], + "bitrise-build-cache/getting-started-with-the-build-cache/at-rest-encryption-for-the-build-cache": [ + "bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching", + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-encrypted-files-in-your-builds", + "bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache", + "bitrise-platform/infrastructure/customizable-enterprise-build-platforms", + "bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives" + ], + "bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache": [ + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache", + "bitrise-platform/infrastructure/build-machines/freeing-up-storage-space-on-build-machines", + "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment" + ], + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache": [ + "bitrise-build-cache/build-cache-for-react-native/build-cache-for-react-native-overview", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment", + "bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds", + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview" + ], + "bitrise-build-cache/getting-started-with-the-build-cache/invocations": [ + "bitrise-build-cache/insights", + "insights/available-metrics-in-insights/command-metrics", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details", + "insights/available-metrics-in-insights/build-cache-metrics", + "bitrise-ci/getting-started/key-bitrise-concepts" + ], + "bitrise-build-cache/getting-started-with-the-build-cache/maven-central-repository-manager": [ + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-other-ci-environments", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-local-builds", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching", + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview" + ], + "bitrise-build-cache/insights": [ + "insights/available-metrics-in-insights/build-cache-metrics", + "insights/available-metrics-in-insights/bitrise-ci-metrics", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details", + "insights/getting-started-with-insights", + "bitrise-build-cache/getting-started-with-the-build-cache/invocations" + ], + "bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview": [ + "bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions", + "bitrise-platform/repository-access/github-app-integration", + "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise", + "bitrise-ci/workflows-and-pipelines/workflows/default-workflows", + "bitrise-ci/api/triggering-and-aborting-builds" + ], + "bitrise-build-hub/build-hub-for-github-actions/configuring-build-hub-for-github-actions": [ + "bitrise-build-hub/build-hub-for-github-actions/build-hub-for-github-actions-overview", + "bitrise-rde/configuration/github-integration", + "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-platform/integrations/webhooks/adding-incoming-webhooks" + ], + "bitrise-build-hub/infrastructure/build-machine-types": [ + "bitrise-platform/infrastructure/build-machines/build-machine-types", + "bitrise-platform/infrastructure/build-machines/about-build-machines", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-platform/infrastructure/customizable-enterprise-build-platforms" + ], + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks": [ + "bitrise-platform/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/infrastructure-overview", + "bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment", + "bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds", + "bitrise-platform/infrastructure/build-machines/about-build-machines" + ], + "bitrise-build-hub/infrastructure/build-stacks/changelog": [ + "bitrise-platform/infrastructure/build-stacks/changelog", + "bitrise-platform/infrastructure/build-stacks/macos-stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy" + ], + "bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy": [ + "bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching" + ], + "bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy": [ + "bitrise-platform/infrastructure/build-stacks/macos-stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/changelog", + "bitrise-build-hub/infrastructure/build-stacks/changelog", + "bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy", + "bitrise-ci/workflows-and-pipelines/steps/step-versions" + ], + "bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy": [ + "bitrise-platform/infrastructure/build-stacks/stack-deprecation-and-removal-policy", + "bitrise-build-hub/infrastructure/build-stacks/stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/changelog", + "bitrise-platform/infrastructure/infrastructure-overview" + ], + "bitrise-build-hub/infrastructure/build-stacks/stack-update-policy": [ + "bitrise-platform/infrastructure/build-stacks/stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/infrastructure-overview" + ], + "bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines": [ + "bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines", + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/integrations/connecting-to-a-vpn-during-a-build", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise" + ], + "bitrise-ci/api/adding-and-managing-apps": [ + "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-platform/repository-access/configuring-ssh-keys", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-platform/integrations/about-integrations" + ], + "bitrise-ci/api/api-overview": [ + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-ci/references/bitrise-tools", + "bitrise-ci/api/authenticating-with-the-bitrise-api", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally", + "bitrise-platform/infrastructure/running-your-build-locally-in-docker" + ], + "bitrise-ci/api/authenticating-with-the-bitrise-api": [ + "bitrise-platform/workspaces/workspace-api-token", + "bitrise-platform/accounts/personal-access-tokens", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise" + ], + "bitrise-ci/api/github-app-configuration-api": [ + "bitrise-rde/configuration/github-integration", + "bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-platform/integrations/the-service-credential-user", + "bitrise-ci/api/adding-and-managing-apps" + ], + "bitrise-ci/api/identifying-workspaces-and-apps-with-their-slugs": [ + "bitrise-platform/workspaces/workspace-api-token", + "bitrise-ci/api/authenticating-with-the-bitrise-api", + "bitrise-platform/workspaces/creating-workspaces", + "bitrise-ci/getting-started/the-bitrise-dashboard", + "bitrise-ci/api/adding-and-managing-apps" + ], + "bitrise-ci/api/incoming-and-outgoing-webhooks": [ + "release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management", + "bitrise-platform/integrations/webhooks/webhooks-overview", + "bitrise-platform/integrations/webhooks/adding-incoming-webhooks", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-ci/api/adding-and-managing-apps" + ], + "bitrise-ci/api/managing-an-apps-builds": [ + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs", + "bitrise-ci/api/managing-build-artifacts", + "bitrise-ci/run-and-analyze-builds/finding-a-specific-build", + "bitrise-ci/api/triggering-and-aborting-builds", + "bitrise-ci/run-and-analyze-builds/bitrise-desktop-app-for-macos" + ], + "bitrise-ci/api/managing-android-keystore-files": [ + "bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise", + "bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file", + "bitrise-ci/api/managing-ios-code-signing-files", + "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning" + ], + "bitrise-ci/api/managing-build-artifacts": [ + "bitrise-ci/api/managing-an-apps-builds", + "bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy", + "release-management/installable-artifacts", + "bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online", + "bitrise-ci/api/triggering-and-aborting-builds" + ], + "bitrise-ci/api/managing-files-in-generic-file-storage": [ + "bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds", + "bitrise-ci/api/managing-build-artifacts", + "bitrise-ci/api/adding-and-managing-apps", + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds", + "bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project" + ], + "bitrise-ci/api/managing-ios-code-signing-files": [ + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key", + "release-management/codepush/code-signing-with-codepush" + ], + "bitrise-ci/api/managing-secrets-with-the-api": [ + "bitrise-ci/configure-builds/secrets", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally", + "bitrise-ci/api/adding-and-managing-apps", + "bitrise-ci/bitrise-cli/managing-secrets-locally", + "bitrise-ci/api/managing-an-apps-builds" + ], + "bitrise-ci/api/pagination-of-api-calls": [ + "bitrise-ci/api/api-overview", + "bitrise-ci/api/authenticating-with-the-bitrise-api", + "bitrise-platform/ai/bitrise-mcp/tools", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs", + "release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management" + ], + "bitrise-ci/api/triggering-and-aborting-builds": [ + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/run-and-analyze-builds/build-statuses", + "bitrise-ci/api/managing-an-apps-builds" + ], + "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli": [ + "bitrise-ci/api/adding-and-managing-apps", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch" + ], + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally": [ + "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform" + ], + "bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli": [ + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-ci/run-and-analyze-builds/bitrise-desktop-app-for-macos", + "bitrise-platform/infrastructure/running-your-build-locally-in-docker", + "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli" + ], + "bitrise-ci/bitrise-cli/installing-and-upgrading-the-offline-workflow-editor": [ + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-platform/infrastructure/configuring-runner-pools", + "bitrise-ci/workflows-and-pipelines/workflows/copying-workflows-from-one-app-to-another" + ], + "bitrise-ci/bitrise-cli/managing-secrets-locally": [ + "bitrise-ci/configure-builds/secrets", + "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally", + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli" + ], + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli": [ + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally", + "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-platform/infrastructure/configuring-runner-pools", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise" + ], + "bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle": [ + "bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio", + "bitrise-ci/api/managing-android-keystore-files", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning" + ], + "bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step": [ + "bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle", + "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab", + "bitrise-ci/api/managing-android-keystore-files", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning" + ], + "bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio": [ + "bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects" + ], + "bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file": [ + "bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle", + "bitrise-ci/api/managing-android-keystore-files", + "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning" + ], + "bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise": [ + "bitrise-ci/code-signing/android-code-signing/downloading-a-keystore-file", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step", + "bitrise-ci/api/managing-android-keystore-files", + "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning" + ], + "bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects": [ + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication" + ], + "bitrise-ci/code-signing/ios-code-signing/exporting-ios-code-signing-files-without-codesigndoc": [ + "bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files", + "bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects", + "bitrise-ci/api/managing-ios-code-signing-files", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators" + ], + "bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files": [ + "bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators", + "bitrise-ci/code-signing/ios-code-signing/ios-code-signing" + ], + "bitrise-ci/code-signing/ios-code-signing/ios-code-signing-for-ionic-and-cordova-projects": [ + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ioniccordova-projects", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio" + ], + "bitrise-ci/code-signing/ios-code-signing/ios-code-signing": [ + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/api/managing-ios-code-signing-files" + ], + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning": [ + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-ci/code-signing/ios-code-signing/ios-code-signing", + "bitrise-ci/api/managing-ios-code-signing-files", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio" + ], + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning": [ + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-ci/code-signing/ios-code-signing/ios-code-signing", + "bitrise-ci/api/managing-ios-code-signing-files", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio" + ], + "bitrise-ci/code-signing/ios-code-signing/protecting-your-code-signing-files": [ + "bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio" + ], + "bitrise-ci/code-signing/ios-code-signing/signing-an-ipa-with-multiple-code-signing-identities": [ + "bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing" + ], + "bitrise-ci/code-signing/ios-code-signing/troubleshooting-ios-code-signing": [ + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine" + ], + "bitrise-ci/configure-builds/configuration-yaml/accessing-a-builds-bitriseyml-file": [ + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview", + "bitrise-ci/references/glossary", + "bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning" + ], + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview": [ + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/configure-builds/configuration-yaml/storing-an-apps-configuration-yaml", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/references/glossary", + "bitrise-ci/getting-started/key-bitrise-concepts" + ], + "bitrise-ci/configure-builds/configuration-yaml/customizing-your-configuration-yaml": [ + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/configure-builds/secrets", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions" + ], + "bitrise-ci/configure-builds/configuration-yaml/editing-a-modular-configuration-in-the-workflow-editor": [ + "bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration", + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/workflows-and-pipelines/ai-configuration-assistant", + "bitrise-ci/references/glossary" + ], + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file": [ + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/configure-builds/configuration-yaml/accessing-a-builds-bitriseyml-file", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers" + ], + "bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration": [ + "bitrise-ci/configure-builds/configuration-yaml/editing-a-modular-configuration-in-the-workflow-editor", + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview", + "bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/references/glossary" + ], + "bitrise-ci/configure-builds/configuration-yaml/storing-an-apps-configuration-yaml": [ + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise", + "bitrise-ci/bitrise-cli/managing-secrets-locally" + ], + "bitrise-ci/configure-builds/configuring-build-settings/build-priority": [ + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/workflows-and-pipelines/workflows/managing-workflows", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview" + ], + "bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications": [ + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks", + "bitrise-ci/run-and-analyze-builds/build-statuses", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider", + "bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds" + ], + "bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration": [ + "bitrise-platform/workspaces/workspace-slack-integration", + "bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands", + "release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications", + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks", + "bitrise-platform/integrations/webhooks/webhooks-overview" + ], + "bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions": [ + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file" + ], + "bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider": [ + "bitrise-ci/run-and-analyze-builds/build-statuses", + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks", + "insights/git-insights", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds" + ], + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds": [ + "bitrise-ci/api/triggering-and-aborting-builds", + "bitrise-ci/run-and-analyze-builds/build-statuses", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger", + "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers" + ], + "bitrise-ci/configure-builds/configuring-build-settings/selective-builds": [ + "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/api/triggering-and-aborting-builds", + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually" + ], + "bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds": [ + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-platform/infrastructure/configuring-runner-pools" + ], + "bitrise-ci/configure-builds/configuring-build-settings/setting-your-git-credentials-on-build-machines": [ + "bitrise-rde/configuration/github-integration", + "bitrise-platform/integrations/the-service-credential-user", + "bitrise-platform/repository-access/configuring-https-authorization-credentials", + "bitrise-platform/repository-access/about-repository-access", + "bitrise-ci/api/github-app-configuration-api" + ], + "bitrise-ci/configure-builds/environment-variables": [ + "bitrise-ci/references/available-environment-variables", + "bitrise-ci/configure-builds/secrets", + "bitrise-ci/references/steps-reference/step-outputs-reference", + "bitrise-ci/bitrise-cli/managing-secrets-locally", + "bitrise-ci/configure-builds/configuration-yaml/customizing-your-configuration-yaml" + ], + "bitrise-ci/configure-builds/secrets": [ + "bitrise-ci/bitrise-cli/managing-secrets-locally", + "bitrise-ci/configure-builds/environment-variables", + "bitrise-ci/references/available-environment-variables", + "bitrise-ci/references/steps-reference/step-inputs-reference", + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview" + ], + "bitrise-ci/dependencies-and-caching/android-dependencies": [ + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects", + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview", + "bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-in-gradle" + ], + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview": [ + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm", + "bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers", + "bitrise-ci/dependencies-and-caching/android-dependencies", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-ci/dependencies-and-caching/react-native-dependencies" + ], + "bitrise-ci/dependencies-and-caching/flutter-dependencies": [ + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects", + "bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise", + "bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps", + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview", + "bitrise-ci/dependencies-and-caching/android-dependencies" + ], + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage": [ + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods", + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment" + ], + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods": [ + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm", + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects" + ], + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm": [ + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-carthage", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-cocoapods", + "bitrise-build-cache/build-cache-for-xcode/configuring-the-build-cache-for-xcode-in-the-bitrise-ci-environment" + ], + "bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives": [ + "bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching", + "bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-the-bitrise-ci-environment", + "bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache", + "bitrise-build-cache/build-cache-for-gradle/configuring-the-build-cache-for-gradle-in-the-bitrise-ci-environment" + ], + "bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers": [ + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview", + "bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-ci/dependencies-and-caching/ios-dependencies/managing-dependencies-with-spm", + "bitrise-build-cache/build-cache-for-react-native/build-cache-for-react-native-overview" + ], + "bitrise-ci/dependencies-and-caching/key-based-caching/using-key-based-caching": [ + "bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers", + "bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching", + "bitrise-build-cache/build-cache-for-react-native/react-native-cache-faq", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-local-builds" + ], + "bitrise-ci/dependencies-and-caching/migrating-from-branch-based-caching-to-key-based-caching": [ + "bitrise-ci/dependencies-and-caching/key-based-caching/dedicated-caching-steps-for-dependency-managers", + "bitrise-ci/dependencies-and-caching/key-based-caching/accessing-key-based-cache-archives", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache", + "bitrise-build-cache/build-cache-for-gradle/gradle-configuration-cache", + "bitrise-build-cache/build-cache-for-bazel/configuring-the-build-cache-for-bazel-in-other-ci-environments" + ], + "bitrise-ci/dependencies-and-caching/react-native-dependencies": [ + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects", + "bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps", + "bitrise-ci/dependencies-and-caching/dependencies-and-caching-overview", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-local-builds" + ], + "bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play": [ + "bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise", + "release-management/releases/managing-the-release-process/google-play-upload-stage", + "bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects", + "bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles" + ], + "bitrise-ci/deploying/android-deployment/deploying-apps-to-huawei-appgallery": [ + "bitrise-ci/deploying/deploying-apps-to-applivery", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise", + "bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play", + "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect" + ], + "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab": [ + "bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step", + "bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise", + "bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles", + "bitrise-ci/api/managing-android-keystore-files", + "release-management/getting-started-with-release-management/getting-started-with-release-management" + ], + "bitrise-ci/deploying/android-deployment/generate-and-deploy-multiple-flavor-apks-in-a-single-workflow": [ + "bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-using-the-android-sign-step", + "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab", + "bitrise-platform/projects/creating-white-label-app-versions", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform" + ], + "bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles": [ + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects", + "bitrise-ci/deploying/android-deployment/exporting-a-universal-apk-from-an-aab", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play", + "bitrise-ci/deploying/bitrise-ota-app-deployment" + ], + "bitrise-ci/deploying/bitrise-ota-app-deployment": [ + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "release-management/build-distribution/distributing-builds-to-testers", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise", + "bitrise-platform/mobile-devops-platform", + "bitrise-ci/deploying/deploying-apps-to-applivery" + ], + "bitrise-ci/deploying/deploying-apps-to-applivery": [ + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/deploying/deploying-to-testfairy-with-bitrise" + ], + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise": [ + "bitrise-ci/deploying/deploying-apps-to-applivery", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect", + "release-management/build-distribution/distributing-builds-to-testers", + "bitrise-ci/deploying/bitrise-ota-app-deployment" + ], + "bitrise-ci/deploying/deploying-to-testfairy-with-bitrise": [ + "bitrise-ci/deploying/deploying-apps-to-applivery", + "release-management/build-distribution/distributing-builds-to-testers", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect", + "release-management/releases/managing-the-release-process/testflight-upload-stage", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise" + ], + "bitrise-ci/deploying/deploying-your-app-to-appaloosa": [ + "bitrise-ci/deploying/deploying-apps-to-applivery", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise", + "release-management/build-distribution/distributing-builds-to-testers", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect", + "release-management/getting-started-with-release-management/getting-started-with-release-management" + ], + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing": [ + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning" + ], + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators": [ + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing", + "bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing", + "bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects" + ], + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect": [ + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/deploying/deploying-apps-to-applivery", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication" + ], + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio": [ + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page", + "bitrise-ci/testing/testing-ios-apps/registering-a-test-device", + "bitrise-ci/code-signing/ios-code-signing/creating-a-signed-ipa-for-xcode-projects" + ], + "bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page": [ + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/testing/testing-ios-apps/registering-a-test-device", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "release-management/getting-started-with-release-management/getting-started-with-release-management" + ], + "bitrise-ci/getting-started/adding-a-new-project": [ + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform", + "bitrise-ci/api/adding-and-managing-apps", + "release-management/releases/managing-the-release-process/selecting-a-release-candidate", + "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli" + ], + "bitrise-ci/getting-started/getting-started": [ + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform", + "bitrise-platform/mobile-devops-platform", + "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform", + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise", + "bitrise-ci/getting-started/adding-a-new-project" + ], + "bitrise-ci/getting-started/key-bitrise-concepts": [ + "bitrise-ci/references/glossary", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments" + ], + "bitrise-ci/getting-started/migrating-to-bitrise/about-migrating-to-bitrise": [ + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise", + "bitrise-ci/getting-started/getting-started", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform", + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise", + "bitrise-ci/getting-started/key-bitrise-concepts" + ], + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise": [ + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform", + "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform", + "bitrise-platform/workspaces/workspace-faq", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci" + ], + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise": [ + "bitrise-ci/getting-started/migrating-to-bitrise/about-migrating-to-bitrise", + "bitrise-ci/getting-started/getting-started", + "bitrise-platform/mobile-devops-platform", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-web-ci" + ], + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects": [ + "bitrise-ci/deploying/android-deployment/generating-and-deploying-android-app-bundles", + "bitrise-ci/dependencies-and-caching/android-dependencies", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects", + "bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play", + "bitrise-ci/code-signing/android-code-signing/uploading-android-keystore-files-to-bitrise" + ], + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects": [ + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects", + "release-management/codepush/configuring-your-app-for-codepush", + "bitrise-ci/dependencies-and-caching/react-native-dependencies", + "bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment" + ], + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects": [ + "bitrise-ci/dependencies-and-caching/flutter-dependencies", + "bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps", + "bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects", + "bitrise-ci/testing/deploying-and-viewing-test-results" + ], + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ioniccordova-projects": [ + "bitrise-ci/code-signing/ios-code-signing/ios-code-signing-for-ionic-and-cordova-projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects", + "bitrise-ci/deploying/bitrise-ota-app-deployment", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio" + ], + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects": [ + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps" + ], + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects": [ + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/run-and-analyze-builds/bitrise-desktop-app-for-macos", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication" + ], + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects": [ + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects", + "bitrise-ci/dependencies-and-caching/react-native-dependencies", + "release-management/codepush/configuring-your-app-for-codepush", + "bitrise-build-cache/build-cache-for-react-native/configuring-the-build-cache-for-react-native-in-the-bitrise-ci-environment", + "bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps" + ], + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-web-ci": [ + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/references/glossary", + "bitrise-platform/projects/projects-overview", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform" + ], + "bitrise-ci/getting-started/the-bitrise-dashboard": [ + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform", + "bitrise-ci/run-and-analyze-builds/bitrise-desktop-app-for-macos", + "insights/getting-started-with-insights", + "bitrise-platform/projects/projects-overview" + ], + "bitrise-ci/getting-started/unity-on-bitrise": [ + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/run-and-analyze-builds/bitrise-desktop-app-for-macos", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "bitrise-platform/infrastructure/running-your-build-locally-in-docker", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects" + ], + "bitrise-ci/references/available-environment-variables": [ + "bitrise-ci/configure-builds/environment-variables", + "bitrise-ci/references/steps-reference/step-outputs-reference", + "bitrise-ci/configure-builds/secrets", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/references/steps-reference/step-inputs-reference" + ], + "bitrise-ci/references/bitrise-tools": [ + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise" + ], + "bitrise-ci/references/configuration-yaml-reference": [ + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/references/glossary", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions" + ], + "bitrise-ci/references/glossary": [ + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-platform/projects/projects-overview", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner", + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview" + ], + "bitrise-ci/references/steps-reference/about-step-code": [ + "bitrise-ci/references/steps-reference/step-properties-reference", + "bitrise-ci/references/steps-reference/step-outputs-reference", + "bitrise-ci/workflows-and-pipelines/steps/step-inputs", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step" + ], + "bitrise-ci/references/steps-reference/step-data-in-the-bitriseyml-file": [ + "bitrise-ci/references/steps-reference/step-inputs-reference", + "bitrise-ci/references/steps-reference/step-referenceid-format", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step" + ], + "bitrise-ci/references/steps-reference/step-inputs-reference": [ + "bitrise-ci/references/steps-reference/step-data-in-the-bitriseyml-file", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/references/steps-reference/step-outputs-reference", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/configure-builds/secrets" + ], + "bitrise-ci/references/steps-reference/step-outputs-reference": [ + "bitrise-ci/references/available-environment-variables", + "bitrise-ci/references/steps-reference/step-inputs-reference", + "bitrise-ci/references/steps-reference/step-data-in-the-bitriseyml-file", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/configure-builds/environment-variables" + ], + "bitrise-ci/references/steps-reference/step-properties-reference": [ + "bitrise-ci/references/steps-reference/about-step-code", + "bitrise-ci/references/steps-reference/step-outputs-reference", + "bitrise-ci/workflows-and-pipelines/steps/step-inputs", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview" + ], + "bitrise-ci/references/steps-reference/step-referenceid-format": [ + "bitrise-ci/references/steps-reference/step-data-in-the-bitriseyml-file", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users", + "bitrise-ci/references/configuration-yaml-reference" + ], + "bitrise-ci/run-and-analyze-builds/bitrise-desktop-app-for-macos": [ + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli", + "bitrise-ci/getting-started/the-bitrise-dashboard", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally" + ], + "bitrise-ci/run-and-analyze-builds/build-annotations": [ + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/references/bitrise-tools", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step" + ], + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer": [ + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine", + "bitrise-platform/ai/ai-features-on-bitrise", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers" + ], + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary": [ + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details", + "bitrise-ci/getting-started/the-bitrise-dashboard", + "bitrise-platform/ai/ai-features-on-bitrise", + "bitrise-ci/run-and-analyze-builds/build-statuses" + ], + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github": [ + "bitrise-platform/repository-access/github-app-integration", + "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise", + "bitrise-rde/configuration/github-integration", + "bitrise-ci/api/github-app-configuration-api", + "bitrise-platform/integrations/about-integrations" + ], + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs": [ + "bitrise-ci/run-and-analyze-builds/finding-a-specific-build", + "bitrise-ci/api/managing-an-apps-builds", + "bitrise-ci/run-and-analyze-builds/build-statuses", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine" + ], + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details": [ + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs", + "bitrise-build-cache/insights", + "bitrise-ci/run-and-analyze-builds/build-statuses", + "insights/getting-started-with-insights" + ], + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine": [ + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/code-signing/ios-code-signing/troubleshooting-ios-code-signing", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs", + "bitrise-ci/run-and-analyze-builds/bitrise-desktop-app-for-macos", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli" + ], + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build": [ + "bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages", + "bitrise-ci/workflows-and-pipelines/steps/skipping-steps", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file" + ], + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access": [ + "bitrise-rde/rde-options/bitrise-vscode-plugin", + "bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project", + "bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines", + "bitrise-platform/infrastructure/build-machines/about-build-machines", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine" + ], + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments": [ + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/debugging-your-build-on-your-own-machine", + "bitrise-ci/run-and-analyze-builds/build-annotations", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/run-and-analyze-builds/build-statuses" + ], + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/viewing-html-reports": [ + "bitrise-ci/testing/deploying-and-viewing-test-results", + "bitrise-ci/getting-started/the-bitrise-dashboard", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/reporting-build-problems-in-pr-comments" + ], + "bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning": [ + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "release-management/releases/managing-the-release-process/selecting-a-release-candidate", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file" + ], + "bitrise-ci/run-and-analyze-builds/build-statuses": [ + "bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider", + "bitrise-ci/api/triggering-and-aborting-builds", + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually" + ], + "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers": [ + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers", + "bitrise-ci/configure-builds/configuring-build-settings/selective-builds", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/api/triggering-and-aborting-builds" + ], + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers": [ + "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers", + "bitrise-ci/api/triggering-and-aborting-builds", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner" + ], + "bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers": [ + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers", + "bitrise-ci/configure-builds/configuring-build-settings/selective-builds", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow" + ], + "bitrise-ci/run-and-analyze-builds/build-triggers/skipping-a-given-commit-or-pull-request": [ + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds", + "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers", + "bitrise-ci/configure-builds/configuring-build-settings/selective-builds", + "bitrise-ci/api/triggering-and-aborting-builds", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually" + ], + "bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger": [ + "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers", + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds", + "bitrise-ci/api/triggering-and-aborting-builds", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually" + ], + "bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands": [ + "bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration", + "bitrise-platform/workspaces/workspace-slack-integration", + "bitrise-platform/integrations/webhooks/webhooks-overview", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers" + ], + "bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers": [ + "bitrise-ci/run-and-analyze-builds/build-triggers/about-build-triggers", + "bitrise-ci/run-and-analyze-builds/build-triggers/legacy-project-based-triggers", + "bitrise-ci/configure-builds/configuration-yaml/modular-yaml-configuration", + "bitrise-ci/configure-builds/configuring-build-settings/selective-builds", + "bitrise-ci/configure-builds/configuration-yaml/storing-an-apps-configuration-yaml" + ], + "bitrise-ci/run-and-analyze-builds/finding-a-specific-build": [ + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs", + "bitrise-ci/api/managing-an-apps-builds", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details", + "bitrise-ci/api/managing-build-artifacts", + "bitrise-ci/run-and-analyze-builds/build-statuses" + ], + "bitrise-ci/run-and-analyze-builds/managing-build-files/artifact-retention-policy": [ + "bitrise-ci/api/managing-build-artifacts", + "bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online", + "release-management/installable-artifacts", + "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs" + ], + "bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online": [ + "release-management/installable-artifacts", + "bitrise-ci/api/managing-build-artifacts", + "release-management/releases/managing-the-release-process/selecting-a-release-candidate", + "bitrise-ci/deploying/bitrise-ota-app-deployment", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/build-logs" + ], + "bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds": [ + "bitrise-ci/code-signing/ios-code-signing/protecting-your-code-signing-files", + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/api/managing-files-in-generic-file-storage", + "bitrise-ci/api/triggering-and-aborting-builds" + ], + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-encrypted-files-in-your-builds": [ + "bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally", + "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments", + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds", + "bitrise-ci/code-signing/ios-code-signing/protecting-your-code-signing-files" + ], + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-files-in-your-builds": [ + "bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-ci/run-and-analyze-builds/managing-build-files/using-encrypted-files-in-your-builds", + "bitrise-ci/api/managing-files-in-generic-file-storage", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow" + ], + "bitrise-ci/run-and-analyze-builds/starting-builds/approving-pull-request-builds": [ + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/run-and-analyze-builds/build-triggers/skipping-a-given-commit-or-pull-request", + "bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds", + "bitrise-platform/integrations/ai-code-reviewer", + "bitrise-platform/projects/public-projects" + ], + "bitrise-ci/run-and-analyze-builds/starting-builds/scheduling-builds": [ + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/api/triggering-and-aborting-builds", + "bitrise-ci/run-and-analyze-builds/build-statuses", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli" + ], + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually": [ + "bitrise-ci/api/triggering-and-aborting-builds", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch", + "bitrise-ci/run-and-analyze-builds/bitrise-desktop-app-for-macos" + ], + "bitrise-ci/run-and-analyze-builds/utility-builds": [ + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks", + "bitrise-ci/run-and-analyze-builds/build-statuses", + "bitrise-platform/infrastructure/customizable-enterprise-build-platforms", + "bitrise-build-hub/infrastructure/build-machine-types" + ], + "bitrise-ci/testing/deploying-and-viewing-test-results": [ + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps", + "bitrise-ci/testing/testing-android-apps/android-unit-tests", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds", + "bitrise-ci/run-and-analyze-builds/bitrise-desktop-app-for-macos" + ], + "bitrise-ci/testing/detecting-and-quarantining-flaky-tests": [ + "insights/insights-tutorials/tracking-flaky-tests", + "insights/insights-tutorials/tracking-test-failure-rate", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform" + ], + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android": [ + "bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps", + "bitrise-ci/testing/testing-android-apps/android-unit-tests", + "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios" + ], + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios": [ + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing", + "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps", + "bitrise-ci/deploying/deploying-to-testfairy-with-bitrise" + ], + "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps": [ + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios", + "bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps", + "bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing" + ], + "bitrise-ci/testing/measuring-your-code-coverage-with-codecov": [ + "bitrise-ci/testing/deploying-and-viewing-test-results", + "insights/getting-started-with-insights", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps", + "bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner" + ], + "bitrise-ci/testing/test-sharding": [ + "bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform", + "bitrise-ci/run-and-analyze-builds/build-triggers/starting-parallel-builds-with-a-single-trigger", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner" + ], + "bitrise-ci/testing/testing-android-apps/android-unit-tests": [ + "bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android", + "bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps", + "bitrise-ci/testing/deploying-and-viewing-test-results", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform" + ], + "bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps": [ + "bitrise-ci/testing/testing-android-apps/android-unit-tests", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform", + "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps", + "bitrise-ci/testing/testing-android-apps/testing-your-app-with-browserstacks-app-automate" + ], + "bitrise-ci/testing/testing-android-apps/running-lint-for-your-android-apps": [ + "bitrise-ci/testing/testing-android-apps/android-unit-tests", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects", + "bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps", + "bitrise-ci/dependencies-and-caching/android-dependencies", + "bitrise-ci/code-signing/android-code-signing/android-code-signing-with-android-studio" + ], + "bitrise-ci/testing/testing-android-apps/testing-your-app-with-browserstacks-app-automate": [ + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android", + "bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps", + "bitrise-ci/testing/testing-android-apps/android-unit-tests", + "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform" + ], + "bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise": [ + "bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects", + "bitrise-ci/dependencies-and-caching/flutter-dependencies", + "bitrise-ci/testing/deploying-and-viewing-test-results", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-android-projects" + ], + "bitrise-ci/testing/testing-flutter-apps/running-unit-and-ui-tests-on-flutter-apps": [ + "bitrise-ci/testing/testing-flutter-apps/running-the-dart-analyzer-on-bitrise", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-flutter-projects", + "bitrise-ci/dependencies-and-caching/flutter-dependencies", + "bitrise-ci/testing/deploying-and-viewing-test-results", + "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps" + ], + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-a-simulator": [ + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps", + "bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-ios-projects" + ], + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing": [ + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-simulators", + "bitrise-ci/code-signing/ios-code-signing/generating-ios-code-signing-files" + ], + "bitrise-ci/testing/testing-ios-apps/registering-a-test-device": [ + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/deploying/ios-deployment/installing-an-ipa-file-from-the-public-install-page", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps" + ], + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps": [ + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-macos-projects" + ], + "bitrise-ci/testing/testing-ios-apps/viewing-xcode-test-results-in-rich-html-format": [ + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-ios", + "bitrise-ci/testing/deploying-and-viewing-test-results" + ], + "bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise": [ + "bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps", + "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects", + "bitrise-ci/dependencies-and-caching/react-native-dependencies", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps" + ], + "bitrise-ci/testing/testing-react-native-apps/running-unit-and-ui-tests-for-react-native-apps": [ + "bitrise-ci/testing/testing-react-native-apps/running-detox-tests-on-bitrise", + "bitrise-ci/testing/device-testing-with-firebase/running-device-tests-with-firebase-for-multiplatform-apps", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects", + "bitrise-ci/dependencies-and-caching/react-native-dependencies", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects" + ], + "bitrise-ci/workflows-and-pipelines/ai-configuration-assistant": [ + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/references/glossary", + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview", + "bitrise-platform/ai/ai-features-on-bitrise", + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp" + ], + "bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines": [ + "bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline", + "bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview" + ], + "bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq": [ + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build", + "bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/workflows-and-pipelines/build-pipelines/about-pipelines" + ], + "bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline": [ + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages", + "bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq", + "bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/workflows-and-pipelines/workflows/managing-workflows" + ], + "bitrise-ci/workflows-and-pipelines/build-pipelines/converting-a-pipeline-with-stages-into-a-graph-pipeline": [ + "bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages", + "bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow" + ], + "bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines": [ + "bitrise-ci/workflows-and-pipelines/workflows/default-workflows", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds", + "bitrise-ci/getting-started/key-bitrise-concepts" + ], + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds": [ + "release-management/build-distribution/distributing-builds-to-testers", + "release-management/releases/managing-the-release-process/selecting-a-release-candidate", + "release-management/installable-artifacts", + "bitrise-ci/api/triggering-and-aborting-builds", + "bitrise-ci/workflows-and-pipelines/workflows/default-workflows" + ], + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages": [ + "bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline", + "bitrise-ci/workflows-and-pipelines/build-pipelines/build-pipelines-faq", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions" + ], + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform": [ + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform", + "bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines", + "bitrise-ci/testing/device-testing-with-firebase/device-testing-for-android", + "bitrise-ci/testing/testing-android-apps/running-instrumented-tests-for-android-apps", + "bitrise-ci/testing/testing-android-apps/android-unit-tests" + ], + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform": [ + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform", + "bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines", + "bitrise-ci/workflows-and-pipelines/workflows/default-workflows", + "bitrise-ci/testing/testing-ios-apps/running-unit-and-ui-tests-for-ios-apps", + "bitrise-ci/testing/testing-ios-apps/building-an-ios-app-for-testing" + ], + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/creating-your-own-bitrise-project-scanner": [ + "bitrise-ci/references/glossary", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/references/bitrise-tools" + ], + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step": [ + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow", + "bitrise-ci/references/steps-reference/step-referenceid-format", + "bitrise-ci/getting-started/key-bitrise-concepts" + ], + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users": [ + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/references/steps-reference/step-referenceid-format", + "bitrise-ci/references/bitrise-tools", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow" + ], + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/verified-steps": [ + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/sharing-steps-with-all-bitrise-users", + "bitrise-ci/references/steps-reference/step-referenceid-format", + "bitrise-ci/references/bitrise-tools" + ], + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow": [ + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview", + "bitrise-ci/getting-started/key-bitrise-concepts" + ], + "bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps": [ + "bitrise-ci/workflows-and-pipelines/steps/skipping-steps", + "bitrise-ci/run-and-analyze-builds/build-statuses", + "bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps", + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build" + ], + "bitrise-ci/workflows-and-pipelines/steps/disabling-third-party-steps-in-a-workspace": [ + "bitrise-ci/workflows-and-pipelines/steps/skipping-steps", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow", + "bitrise-ci/run-and-analyze-builds/managing-build-files/uploading-files-for-your-builds", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step" + ], + "bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally": [ + "bitrise-ci/workflows-and-pipelines/steps/disabling-third-party-steps-in-a-workspace", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages", + "bitrise-ci/workflows-and-pipelines/steps/skipping-steps", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/workflows-and-pipelines/workflows/managing-workflows" + ], + "bitrise-ci/workflows-and-pipelines/steps/setting-a-time-limit-for-steps": [ + "bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps", + "bitrise-ci/workflows-and-pipelines/steps/skipping-steps", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/configuring-a-pipeline-with-stages", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build", + "insights/insights-tutorials/tracking-build-failure-rate" + ], + "bitrise-ci/workflows-and-pipelines/steps/skipping-steps": [ + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/rebuilding-a-failed-build", + "bitrise-ci/workflows-and-pipelines/steps/detecting-and-aborting-hanging-steps", + "bitrise-ci/workflows-and-pipelines/steps/disabling-third-party-steps-in-a-workspace", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview", + "bitrise-ci/getting-started/key-bitrise-concepts" + ], + "bitrise-ci/workflows-and-pipelines/steps/step-bundles": [ + "bitrise-ci/references/steps-reference/about-step-code", + "bitrise-ci/workflows-and-pipelines/steps/step-inputs", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/workflows-and-pipelines/workflows/managing-workflows" + ], + "bitrise-ci/workflows-and-pipelines/steps/step-inputs": [ + "bitrise-ci/references/steps-reference/about-step-code", + "bitrise-ci/references/steps-reference/step-outputs-reference", + "bitrise-ci/workflows-and-pipelines/steps/step-bundles", + "bitrise-ci/configure-builds/environment-variables", + "bitrise-ci/workflows-and-pipelines/steps/enabling-or-disabling-a-step-conditionally" + ], + "bitrise-ci/workflows-and-pipelines/steps/step-versions": [ + "bitrise-ci/references/steps-reference/step-referenceid-format", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow", + "bitrise-platform/projects/creating-white-label-app-versions" + ], + "bitrise-ci/workflows-and-pipelines/steps/steps-overview": [ + "bitrise-ci/workflows-and-pipelines/developing-your-own-bitrise-step/developing-a-new-step", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow", + "bitrise-ci/references/bitrise-tools", + "bitrise-ci/references/steps-reference/step-data-in-the-bitriseyml-file" + ], + "bitrise-ci/workflows-and-pipelines/workflows/copying-workflows-from-one-app-to-another": [ + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow", + "bitrise-ci/configure-builds/configuration-yaml/configuration-yaml-overview" + ], + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow": [ + "bitrise-ci/workflows-and-pipelines/workflows/managing-workflows", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview", + "bitrise-ci/run-and-analyze-builds/build-triggers/configuring-build-triggers", + "bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline" + ], + "bitrise-ci/workflows-and-pipelines/workflows/default-workflows": [ + "bitrise-ci/workflows-and-pipelines/build-pipelines/default-pipelines", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-ios-platform", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow" + ], + "bitrise-ci/workflows-and-pipelines/workflows/managing-workflows": [ + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview", + "bitrise-ci/workflows-and-pipelines/build-pipelines/configuring-a-bitrise-pipeline", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow", + "bitrise-ci/configure-builds/configuring-build-settings/build-priority" + ], + "bitrise-ci/workflows-and-pipelines/workflows/workflows-overview": [ + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/workflows-and-pipelines/workflows/managing-workflows", + "bitrise-ci/workflows-and-pipelines/steps/steps-overview" + ], + "bitrise-platform/accounts/accounts-overview": [ + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/integrations/about-integrations", + "bitrise-platform/getting-started/signing-up-for-bitrise", + "bitrise-rde/configuration/github-integration" + ], + "bitrise-platform/accounts/deleting-your-bitrise-account": [ + "bitrise-platform/accounts/editing-your-profile-settings", + "bitrise-platform/accounts/resetting-your-password", + "release-management/configuring-connected-apps/deleting-a-connected-app", + "bitrise-platform/projects/changing-the-owner-of-a-project", + "bitrise-platform/workspaces/creating-workspaces" + ], + "bitrise-platform/accounts/editing-your-profile-settings": [ + "bitrise-platform/accounts/deleting-your-bitrise-account", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/workspaces/creating-workspaces" + ], + "bitrise-platform/accounts/github-token-scanning": [ + "bitrise-platform/repository-access/github-app-integration", + "bitrise-rde/configuration/github-integration", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github", + "bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies", + "bitrise-ci/api/github-app-configuration-api" + ], + "bitrise-platform/accounts/personal-access-tokens": [ + "bitrise-platform/workspaces/workspace-api-token", + "bitrise-ci/api/authenticating-with-the-bitrise-api", + "bitrise-platform/accounts/two-factor-authentication", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/accounts/accounts-overview" + ], + "bitrise-platform/accounts/resetting-your-password": [ + "bitrise-platform/accounts/two-factor-authentication", + "bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise", + "bitrise-ci/api/authenticating-with-the-bitrise-api" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/accounts/accounts-overview" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-entra-id-scim-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/integrations/oidc-authentication/oidc-for-aws", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/logging-in-via-saml-sso": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/accounts/resetting-your-password" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ad-fs-sso-for-bitrise": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/accounts/accounts-overview" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-azure-ad-sso-for-bitrise": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-entra-id-scim-for-bitrise": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/configuring-scim", + "bitrise-platform/accounts/saml-sso-in-bitrise/configuring-saml-sso-on-bitrise", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/workspaces/workspace-api-token", + "bitrise-platform/workspaces/creating-workspaces" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/workspaces/workspace-api-token" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-idaptive-saml-sso-for-bitrise": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-okta-sso-for-bitrise": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise" + ], + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-ping-identity-sso-for-bitrise": [ + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-onelogin-sso-for-bitrise", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/workspaces/workspace-api-token" + ], + "bitrise-platform/accounts/two-factor-authentication": [ + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/accounts/resetting-your-password", + "bitrise-ci/api/authenticating-with-the-bitrise-api", + "bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services", + "bitrise-platform/repository-access/repository-access-with-oauth" + ], + "bitrise-platform/ai/ai-faq-how-bitrise-leverages-ai-technologies-in-its-features-and-services": [ + "bitrise-platform/ai/ai-features-on-bitrise", + "bitrise-ci/api/api-overview", + "bitrise-ci/workflows-and-pipelines/ai-configuration-assistant", + "bitrise-platform/getting-started/signing-up-for-bitrise", + "bitrise-platform/integrations/ai-code-reviewer" + ], + "bitrise-platform/ai/ai-features-on-bitrise": [ + "bitrise-platform/integrations/ai-code-reviewer", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-fixer", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary", + "bitrise-platform/getting-started/signing-up-for-bitrise", + "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform" + ], + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp": [ + "bitrise-rde/rde-options/bitrise-rde-mcp-server", + "bitrise-ci/references/bitrise-tools", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-other-copilot-ides", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-kiro", + "bitrise-rde/rde-options/bitrise-rde-cli" + ], + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-claude": [ + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-cursor", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-gemini-cli", + "bitrise-rde/rde-options/bitrise-rde-ui", + "bitrise-rde/getting-started/quickstart", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally" + ], + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-cursor": [ + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-claude", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-gemini-cli", + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally", + "release-management/codepush/codepush-cli/setting-up-the-codepush-cli" + ], + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-gemini-cli": [ + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-claude", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-cursor", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally", + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp", + "bitrise-platform/integrations/oidc-authentication/oidc-for-gcp" + ], + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-kiro": [ + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-windsurf", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-gemini-cli" + ], + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-other-copilot-ides": [ + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-vscode", + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp", + "bitrise-rde/rde-options/bitrise-vscode-plugin", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-kiro", + "bitrise-rde/rde-options/bitrise-rde-cli" + ], + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-vscode": [ + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-other-copilot-ides", + "bitrise-rde/rde-options/bitrise-vscode-plugin", + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp", + "bitrise-rde/rde-options/connecting-to-a-session", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access" + ], + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-windsurf": [ + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-gemini-cli", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-cursor", + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally" + ], + "bitrise-platform/ai/bitrise-mcp/tools": [ + "bitrise-ci/api/adding-and-managing-apps", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/api/github-app-configuration-api", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key", + "bitrise-platform/infrastructure/configuring-runner-pools" + ], + "bitrise-platform/ai/enabling-ai-features-on-bitrise": [ + "bitrise-platform/workspaces/creating-workspaces", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/ai-build-summary", + "bitrise-platform/getting-started/signing-up-for-bitrise", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-platform/accounts/two-factor-authentication" + ], + "bitrise-platform/ai/onboarding-for-agents": [ + "bitrise-platform/getting-started/signing-up-for-bitrise", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-rde/configuration/github-integration", + "bitrise-platform/integrations/about-integrations" + ], + "bitrise-platform/getting-started/collaboration": [ + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/workspaces/workspace-faq", + "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups", + "bitrise-platform/projects/managing-user-access-to-a-project" + ], + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform": [ + "bitrise-ci/getting-started/getting-started", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform", + "bitrise-platform/workspaces/creating-workspaces", + "bitrise-platform/projects/projects-overview" + ], + "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform": [ + "bitrise-platform/mobile-devops-platform", + "bitrise-platform/projects/projects-overview", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform", + "bitrise-platform/getting-started/collaboration", + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise" + ], + "bitrise-platform/getting-started/signing-up-for-bitrise": [ + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform", + "bitrise-platform/integrations/about-integrations", + "bitrise-platform/repository-access/about-repository-access" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/aws-cloudformation-templates": [ + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/troubleshooting-the-cloud-controller", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/integrations/oidc-authentication/oidc-for-aws", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/bitrise-on-aws-overview": [ + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching", + "bitrise-platform/infrastructure/build-machines/about-build-machines", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/subscribing-to-the-bitrise-on-aws-ami" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/configuring-a-machine-pool": [ + "bitrise-platform/infrastructure/configuring-runner-pools", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller": [ + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/troubleshooting-the-cloud-controller", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/configuring-a-machine-pool", + "bitrise-platform/infrastructure/configuring-runner-pools" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/subscribing-to-the-bitrise-on-aws-ami": [ + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/troubleshooting-the-cloud-controller", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller", + "bitrise-platform/integrations/oidc-authentication/oidc-for-aws" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/troubleshooting-the-cloud-controller": [ + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/subscribing-to-the-bitrise-on-aws-ami", + "bitrise-platform/infrastructure/configuring-runner-pools" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/advanced-options-for-ec2-instances": [ + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/subscribing-to-the-bitrise-on-aws-ami", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/troubleshooting-the-cloud-controller", + "bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/allocating-a-dedicated-host-for-mac-instances": [ + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/advanced-options-for-ec2-instances", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/subscribing-to-the-bitrise-on-aws-ami", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/bitrise-on-aws-overview", + "bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview": [ + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/subscribing-to-the-bitrise-on-aws-ami", + "bitrise-platform/infrastructure/configuring-runner-pools" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami": [ + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/subscribing-to-the-bitrise-on-aws-ami", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/advanced-options-for-ec2-instances", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller", + "bitrise-platform/infrastructure/configuring-runner-pools" + ], + "bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching": [ + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/bitrise-on-aws-overview", + "bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/infrastructure/build-stacks/stack-update-policy" + ], + "bitrise-platform/infrastructure/build-machines/about-build-machines": [ + "bitrise-platform/infrastructure/customizable-enterprise-build-platforms", + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/infrastructure-overview", + "bitrise-build-hub/infrastructure/build-machine-types" + ], + "bitrise-platform/infrastructure/build-machines/build-machine-types": [ + "bitrise-build-hub/infrastructure/build-machine-types", + "bitrise-platform/infrastructure/build-machines/about-build-machines", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-platform/infrastructure/customizable-enterprise-build-platforms" + ], + "bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines": [ + "bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines", + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/integrations/about-integrations", + "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise", + "bitrise-platform/integrations/connecting-to-a-vpn-during-a-build" + ], + "bitrise-platform/infrastructure/build-machines/freeing-up-storage-space-on-build-machines": [ + "bitrise-build-cache/getting-started-with-the-build-cache/clearing-the-build-cache", + "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments", + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/running-your-build-locally-in-docker" + ], + "bitrise-platform/infrastructure/build-stacks/about-build-stacks": [ + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/infrastructure-overview", + "bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment", + "bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds", + "bitrise-platform/infrastructure/build-machines/about-build-machines" + ], + "bitrise-platform/infrastructure/build-stacks/changelog": [ + "bitrise-build-hub/infrastructure/build-stacks/changelog", + "bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/macos-stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/stack-deprecation-and-removal-policy" + ], + "bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy": [ + "bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching" + ], + "bitrise-platform/infrastructure/build-stacks/macos-stack-update-policy": [ + "bitrise-build-hub/infrastructure/build-stacks/macos-stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/changelog", + "bitrise-platform/infrastructure/build-stacks/changelog", + "bitrise-platform/infrastructure/build-stacks/stack-deprecation-and-removal-policy", + "bitrise-ci/workflows-and-pipelines/steps/step-versions" + ], + "bitrise-platform/infrastructure/build-stacks/managing-java-versions": [ + "bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions", + "bitrise-ci/references/configuration-yaml-reference", + "bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/configure-builds/configuring-build-settings/setting-the-stack-for-your-builds" + ], + "bitrise-platform/infrastructure/build-stacks/preinstalled-tools-on-bitrise-stacks": [ + "bitrise-platform/infrastructure/build-stacks/stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy", + "bitrise-ci/references/bitrise-tools" + ], + "bitrise-platform/infrastructure/build-stacks/stack-deprecation-and-removal-policy": [ + "bitrise-build-hub/infrastructure/build-stacks/stack-deprecation-and-removal-policy", + "bitrise-platform/infrastructure/build-stacks/stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/changelog", + "bitrise-platform/infrastructure/infrastructure-overview" + ], + "bitrise-platform/infrastructure/build-stacks/stack-update-policy": [ + "bitrise-build-hub/infrastructure/build-stacks/stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/linux-stack-update-policy", + "bitrise-build-hub/infrastructure/build-stacks/linux-stack-update-policy", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/infrastructure-overview" + ], + "bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment": [ + "bitrise-platform/infrastructure/running-your-build-locally-in-docker", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks", + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise", + "bitrise-platform/infrastructure/code-security" + ], + "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments": [ + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/bitrise-cli/managing-secrets-locally", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-platform/infrastructure/code-security", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise" + ], + "bitrise-platform/infrastructure/code-security": [ + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks", + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/cleaning-up-persistent-build-environments" + ], + "bitrise-platform/infrastructure/configuring-runner-pools": [ + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/configuring-a-machine-pool", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller" + ], + "bitrise-platform/infrastructure/customizable-enterprise-build-platforms": [ + "bitrise-platform/infrastructure/build-machines/about-build-machines", + "bitrise-platform/infrastructure/infrastructure-overview", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-platform/mobile-devops-platform", + "bitrise-platform/infrastructure/build-machines/build-machine-types" + ], + "bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise": [ + "bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers", + "bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment", + "bitrise-platform/infrastructure/running-your-build-locally-in-docker", + "bitrise-ci/getting-started/key-bitrise-concepts" + ], + "bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image": [ + "bitrise-platform/infrastructure/running-your-build-locally-in-docker", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment" + ], + "bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers": [ + "bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/configuring-a-machine-pool", + "bitrise-platform/infrastructure/configuring-runner-pools" + ], + "bitrise-platform/infrastructure/docker-containers-on-bitrise/service-containers": [ + "bitrise-platform/infrastructure/docker-containers-on-bitrise/execution-containers", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/about-docker-containers-on-bitrise", + "bitrise-platform/infrastructure/configuring-runner-pools", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/configuring-a-machine-pool", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise" + ], + "bitrise-platform/infrastructure/infrastructure-overview": [ + "bitrise-build-hub/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/build-stacks/about-build-stacks", + "bitrise-platform/infrastructure/build-machines/about-build-machines", + "bitrise-platform/mobile-devops-platform", + "bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment" + ], + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise": [ + "bitrise-platform/infrastructure/configuring-runner-pools", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview", + "bitrise-platform/infrastructure/running-your-build-locally-in-docker", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally" + ], + "bitrise-platform/infrastructure/running-your-build-locally-in-docker": [ + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise", + "bitrise-platform/infrastructure/docker-containers-on-bitrise/building-your-own-docker-image", + "bitrise-platform/infrastructure/build-stacks/the-androidlinuxdocker-environment", + "bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview" + ], + "bitrise-platform/integrations/about-integrations": [ + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-platform/accounts/accounts-overview", + "bitrise-rde/configuration/github-integration", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform" + ], + "bitrise-platform/integrations/ai-code-reviewer": [ + "bitrise-platform/ai/ai-features-on-bitrise", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github", + "bitrise-platform/getting-started/signing-up-for-bitrise", + "bitrise-ci/run-and-analyze-builds/starting-builds/approving-pull-request-builds", + "bitrise-platform/repository-access/github-app-integration" + ], + "bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services": [ + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/accounts/two-factor-authentication", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning" + ], + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key": [ + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning" + ], + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id": [ + "bitrise-platform/integrations/apple-services-connection/about-connecting-to-apple-services", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing" + ], + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-step-inputs": [ + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id", + "release-management/getting-started-with-release-management/connecting-an-app", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing" + ], + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication": [ + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-bitriseio", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-apple-id" + ], + "bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise": [ + "bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise", + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key" + ], + "bitrise-platform/integrations/connecting-to-a-vpn-during-a-build": [ + "bitrise-build-hub/infrastructure/ip-addresses-for-the-build-machines", + "bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines", + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/repository-access/configuring-https-authorization-credentials", + "bitrise-platform/integrations/about-integrations" + ], + "bitrise-platform/integrations/endpoint-detection-and-response": [ + "bitrise-platform/infrastructure/customizable-enterprise-build-platforms", + "bitrise-platform/infrastructure/bitrise-on-aws-os-security-patching", + "bitrise-ci/getting-started/key-bitrise-concepts", + "bitrise-ci/references/bitrise-tools", + "bitrise-platform/mobile-devops-platform" + ], + "bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview": [ + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/integrations/oidc-authentication/oidc-for-aws", + "bitrise-platform/workspaces/workspace-api-token", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key", + "bitrise-platform/accounts/accounts-overview" + ], + "bitrise-platform/integrations/oidc-authentication/oidc-for-aws": [ + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview", + "bitrise-platform/infrastructure/bitrise-on-aws-cloud-controller/creating-and-configuring-a-controller", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/launching-an-ec2-instance-for-the-bitrise-ami", + "bitrise-platform/infrastructure/bitrise-on-aws-manual-setup/aws-manual-setup-overview" + ], + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise": [ + "bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview", + "bitrise-platform/integrations/oidc-authentication/oidc-for-aws", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-ci/api/authenticating-with-the-bitrise-api", + "bitrise-platform/accounts/personal-access-tokens" + ], + "bitrise-platform/integrations/oidc-authentication/oidc-for-gcp": [ + "bitrise-platform/integrations/oidc-authentication/oidc-authentication-overview", + "bitrise-platform/integrations/oidc-authentication/oidc-for-bitrise", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-gemini-cli", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-google-sso-for-bitrise", + "bitrise-platform/workspaces/workspace-api-token" + ], + "bitrise-platform/integrations/the-service-credential-user": [ + "bitrise-platform/repository-access/about-repository-access", + "bitrise-ci/api/github-app-configuration-api", + "bitrise-platform/repository-access/configuring-https-authorization-credentials", + "bitrise-platform/accounts/accounts-overview", + "bitrise-platform/integrations/about-integrations" + ], + "bitrise-platform/integrations/webhooks/adding-incoming-webhooks": [ + "bitrise-platform/integrations/webhooks/webhooks-overview", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-ci/api/incoming-and-outgoing-webhooks", + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually" + ], + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks": [ + "bitrise-platform/integrations/webhooks/adding-incoming-webhooks", + "bitrise-platform/integrations/webhooks/webhooks-overview", + "bitrise-ci/api/incoming-and-outgoing-webhooks", + "bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider", + "release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management" + ], + "bitrise-platform/integrations/webhooks/webhooks-overview": [ + "bitrise-platform/integrations/webhooks/adding-incoming-webhooks", + "bitrise-ci/api/incoming-and-outgoing-webhooks", + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands" + ], + "bitrise-platform/mobile-devops-platform": [ + "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform", + "bitrise-ci/getting-started/getting-started", + "bitrise-platform/projects/projects-overview", + "bitrise-ci/references/glossary", + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise" + ], + "bitrise-platform/projects/changing-the-owner-of-a-project": [ + "bitrise-platform/workspaces/changing-the-owners-of-a-workspace", + "bitrise-platform/projects/managing-user-access-to-a-project", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci", + "bitrise-platform/workspaces/workspace-faq" + ], + "bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch": [ + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/repository-access/configuring-https-authorization-credentials", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli" + ], + "bitrise-platform/projects/creating-white-label-app-versions": [ + "bitrise-ci/configure-builds/configuring-build-settings/configuring-tool-versions", + "bitrise-ci/workflows-and-pipelines/steps/adding-steps-to-a-workflow", + "bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning", + "bitrise-ci/bitrise-cli/running-your-first-local-build-with-the-cli", + "bitrise-ci/api/triggering-and-aborting-builds" + ], + "bitrise-platform/projects/embedding-a-project-status-badge": [ + "bitrise-ci/run-and-analyze-builds/bitrise-desktop-app-for-macos", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github", + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks", + "bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning", + "bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider" + ], + "bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project": [ + "bitrise-platform/projects/managing-user-access-to-a-project", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci", + "bitrise-platform/getting-started/collaboration", + "bitrise-platform/accounts/accounts-overview" + ], + "bitrise-platform/projects/managing-user-access-to-a-project": [ + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/getting-started/collaboration", + "bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project", + "bitrise-platform/projects/changing-the-owner-of-a-project", + "bitrise-platform/workspaces/workspace-faq" + ], + "bitrise-platform/projects/projects-overview": [ + "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform", + "bitrise-ci/references/glossary", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-platform/mobile-devops-platform" + ], + "bitrise-platform/projects/public-projects": [ + "bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project", + "bitrise-platform/integrations/about-integrations", + "bitrise-platform/infrastructure/build-machines/configuring-your-network-to-access-our-build-machines", + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies" + ], + "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci": [ + "release-management/configuring-connected-apps/release-management-roles-and-permissions", + "bitrise-platform/getting-started/collaboration", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups", + "bitrise-platform/projects/enabling-the-bitrise-support-user-for-your-project" + ], + "bitrise-platform/repository-access/about-repository-access": [ + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-platform/integrations/about-integrations", + "bitrise-platform/repository-access/configuring-ssh-keys", + "bitrise-rde/configuration/github-integration", + "bitrise-platform/accounts/accounts-overview" + ], + "bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies": [ + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/repository-access/configuring-ssh-keys", + "bitrise-platform/integrations/about-integrations", + "bitrise-ci/api/github-app-configuration-api", + "bitrise-rde/configuration/github-integration" + ], + "bitrise-platform/repository-access/configuring-https-authorization-credentials": [ + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-rde/configuration/github-integration", + "bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch", + "bitrise-platform/integrations/about-integrations" + ], + "bitrise-platform/repository-access/configuring-ssh-keys": [ + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/repository-access/apps-with-submodules-or-private-repo-dependencies", + "bitrise-platform/integrations/about-integrations", + "bitrise-rde/configuration/github-integration", + "bitrise-ci/api/adding-and-managing-apps" + ], + "bitrise-platform/repository-access/connecting-bitbucket-server-instances": [ + "bitrise-platform/repository-access/configuring-https-authorization-credentials", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-platform/projects/configuring-the-repository-url-and-the-default-branch", + "bitrise-rde/configuration/github-integration", + "bitrise-platform/integrations/about-integrations" + ], + "bitrise-platform/repository-access/connecting-self-hosted-gitlab-instances": [ + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/integrations/about-integrations", + "bitrise-rde/configuration/github-integration", + "bitrise-ci/api/github-app-configuration-api" + ], + "bitrise-platform/repository-access/github-app-integration": [ + "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github", + "bitrise-platform/integrations/about-integrations", + "bitrise-rde/configuration/github-integration", + "bitrise-platform/repository-access/about-repository-access" + ], + "bitrise-platform/repository-access/integrating-github-enterprise-with-bitrise": [ + "bitrise-platform/repository-access/github-app-integration", + "bitrise-platform/repository-access/about-repository-access", + "bitrise-rde/configuration/github-integration", + "bitrise-platform/integrations/about-integrations", + "bitrise-ci/api/adding-and-managing-apps" + ], + "bitrise-platform/repository-access/repository-access-with-oauth": [ + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/repository-access/configuring-https-authorization-credentials", + "bitrise-platform/integrations/about-integrations", + "bitrise-rde/configuration/github-integration", + "bitrise-platform/accounts/accounts-overview" + ], + "bitrise-platform/workspaces/changing-the-owners-of-a-workspace": [ + "bitrise-platform/projects/changing-the-owner-of-a-project", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/workspaces/workspace-faq", + "bitrise-platform/projects/managing-user-access-to-a-project", + "bitrise-platform/workspaces/creating-workspaces" + ], + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces": [ + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups", + "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci", + "release-management/configuring-connected-apps/release-management-roles-and-permissions", + "bitrise-platform/workspaces/workspace-faq", + "bitrise-platform/getting-started/collaboration" + ], + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration": [ + "bitrise-platform/getting-started/collaboration", + "bitrise-platform/projects/managing-user-access-to-a-project", + "bitrise-platform/workspaces/workspace-faq", + "bitrise-platform/workspaces/workspaces-overview", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform" + ], + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups": [ + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces", + "bitrise-platform/workspaces/workspace-faq", + "bitrise-platform/getting-started/collaboration", + "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration" + ], + "bitrise-platform/workspaces/creating-workspaces": [ + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform", + "bitrise-platform/workspaces/workspaces-overview", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally" + ], + "bitrise-platform/workspaces/workspace-api-token": [ + "bitrise-ci/api/authenticating-with-the-bitrise-api", + "bitrise-platform/accounts/personal-access-tokens", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-auth0-sso-for-bitrise", + "bitrise-platform/workspaces/creating-workspaces" + ], + "bitrise-platform/workspaces/workspace-billing-and-invoicing": [ + "bitrise-platform/workspaces/changing-the-owners-of-a-workspace", + "bitrise-platform/workspaces/creating-workspaces", + "bitrise-platform/accounts/saml-sso-in-bitrise/setting-up-entra-id-scim-for-bitrise", + "bitrise-platform/accounts/deleting-your-bitrise-account", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration" + ], + "bitrise-platform/workspaces/workspace-faq": [ + "bitrise-platform/workspaces/workspaces-overview", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/getting-started/collaboration", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups", + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-app-center-to-bitrise" + ], + "bitrise-platform/workspaces/workspace-slack-integration": [ + "bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration", + "release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications", + "bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands", + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks", + "bitrise-platform/workspaces/workspace-api-token" + ], + "bitrise-platform/workspaces/workspaces-overview": [ + "bitrise-platform/workspaces/workspace-faq", + "bitrise-platform/workspaces/creating-workspaces", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-collaboration", + "bitrise-platform/getting-started/collaboration", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform" + ], + "bitrise-rde/configuration/github-integration": [ + "bitrise-platform/repository-access/about-repository-access", + "bitrise-platform/repository-access/repository-access-with-oauth", + "bitrise-ci/api/github-app-configuration-api", + "bitrise-platform/integrations/about-integrations", + "bitrise-platform/accounts/accounts-overview" + ], + "bitrise-rde/configuration/managing-rde-access": [ + "bitrise-rde/configuration/rde-api", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups", + "bitrise-rde/getting-started/remote-dev-environments-overview", + "bitrise-rde/rde-options/bitrise-rde-ui", + "bitrise-rde/getting-started/key-concepts" + ], + "bitrise-rde/configuration/rde-api": [ + "bitrise-rde/configuration/managing-rde-access", + "bitrise-rde/getting-started/key-concepts", + "bitrise-rde/getting-started/remote-dev-environments-overview", + "bitrise-rde/configuration/templates", + "bitrise-rde/rde-options/bitrise-rde-cli" + ], + "bitrise-rde/configuration/saved-inputs": [ + "bitrise-rde/rde-options/bitrise-rde-ui", + "bitrise-rde/getting-started/quickstart", + "bitrise-rde/configuration/github-integration", + "bitrise-platform/repository-access/configuring-ssh-keys", + "bitrise-rde/rde-options/connecting-to-a-session" + ], + "bitrise-rde/configuration/templates": [ + "bitrise-rde/getting-started/key-concepts", + "bitrise-rde/configuration/rde-api", + "bitrise-rde/getting-started/remote-dev-environments-overview", + "bitrise-rde/configuration/managing-rde-access", + "bitrise-rde/rde-options/connecting-to-a-session" + ], + "bitrise-rde/getting-started/key-concepts": [ + "bitrise-rde/configuration/rde-api", + "bitrise-rde/configuration/templates", + "bitrise-rde/getting-started/remote-dev-environments-overview", + "bitrise-rde/rde-options/connecting-to-a-session" + ], + "bitrise-rde/getting-started/quickstart": [ + "bitrise-rde/rde-options/bitrise-rde-ui", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-claude", + "bitrise-rde/rde-options/bitrise-vscode-plugin", + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp", + "bitrise-platform/getting-started/getting-started-with-the-bitrise-platform" + ], + "bitrise-rde/getting-started/remote-dev-environments-overview": [ + "bitrise-rde/configuration/rde-api", + "bitrise-platform/infrastructure/build-machines/about-build-machines", + "bitrise-rde/getting-started/quickstart", + "bitrise-rde/rde-options/bitrise-rde-cli", + "bitrise-ci/getting-started/migrating-to-bitrise/migrating-from-jenkins-to-bitrise" + ], + "bitrise-rde/rde-options/bitrise-rde-cli": [ + "bitrise-rde/rde-options/bitrise-rde-ui", + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp", + "bitrise-rde/getting-started/quickstart", + "bitrise-rde/rde-options/bitrise-vscode-plugin", + "bitrise-platform/workspaces/creating-workspaces" + ], + "bitrise-rde/rde-options/bitrise-rde-mcp-server": [ + "bitrise-platform/ai/bitrise-mcp/bitrise-mcp", + "bitrise-rde/rde-options/bitrise-rde-cli", + "bitrise-rde/getting-started/quickstart", + "bitrise-rde/rde-options/bitrise-rde-ui", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-vscode" + ], + "bitrise-rde/rde-options/bitrise-rde-ui": [ + "bitrise-rde/rde-options/bitrise-rde-cli", + "bitrise-rde/getting-started/quickstart", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-claude", + "bitrise-rde/rde-options/bitrise-vscode-plugin", + "bitrise-rde/configuration/saved-inputs" + ], + "bitrise-rde/rde-options/bitrise-vscode-plugin": [ + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-vscode", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access", + "bitrise-rde/rde-options/connecting-to-a-session", + "bitrise-rde/getting-started/quickstart", + "bitrise-rde/rde-options/bitrise-rde-cli" + ], + "bitrise-rde/rde-options/connecting-to-a-session": [ + "bitrise-rde/rde-options/bitrise-vscode-plugin", + "bitrise-platform/ai/bitrise-mcp/installing-the-bitrise-mcp-server/install-vscode", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/remote-access", + "bitrise-rde/rde-options/bitrise-rde-cli", + "bitrise-rde/getting-started/quickstart" + ], + "bitrise-rde/recipes/building-a-slack-native-coding-agent-recipe": [ + "bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration", + "bitrise-platform/workspaces/workspace-slack-integration", + "bitrise-platform/integrations/ai-code-reviewer", + "bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands", + "release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications" + ], + "changelogs/bitrise-api": [ + "changelogs/bitrise-platform", + "changelogs/insights", + "bitrise-ci/api/api-overview", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/references/bitrise-tools" + ], + "changelogs/bitrise-build-cache": [ + "changelogs/bitrise-platform", + "changelogs/insights", + "bitrise-ci/api/api-overview", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/references/bitrise-tools" + ], + "changelogs/bitrise-build-hub": [ + "changelogs/bitrise-platform", + "changelogs/insights", + "bitrise-ci/api/api-overview", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/references/bitrise-tools" + ], + "changelogs/bitrise-ci": [ + "changelogs/bitrise-platform", + "changelogs/insights", + "bitrise-ci/api/api-overview", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/references/bitrise-tools" + ], + "changelogs/bitrise-platform": [ + "changelogs/bitrise-ci", + "changelogs/insights", + "bitrise-ci/api/api-overview", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/references/bitrise-tools" + ], + "changelogs/bitrise-rde": [ + "changelogs/bitrise-ci", + "changelogs/insights", + "bitrise-ci/api/api-overview", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/references/bitrise-tools" + ], + "changelogs/insights": [ + "changelogs/bitrise-ci", + "changelogs/bitrise-rde", + "bitrise-ci/api/api-overview", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/references/bitrise-tools" + ], + "changelogs/release-management": [ + "changelogs/bitrise-ci", + "changelogs/bitrise-rde", + "bitrise-ci/api/api-overview", + "bitrise-ci/workflows-and-pipelines/workflows/creating-a-workflow", + "bitrise-ci/references/bitrise-tools" + ], + "insights/available-metrics-in-insights/bitrise-ci-metrics": [ + "insights/getting-started-with-insights", + "bitrise-build-cache/insights", + "insights/available-metrics-in-insights/build-cache-metrics", + "insights/available-metrics-in-insights/command-metrics", + "bitrise-ci/getting-started/the-bitrise-dashboard" + ], + "insights/available-metrics-in-insights/build-cache-metrics": [ + "bitrise-build-cache/insights", + "insights/available-metrics-in-insights/bitrise-ci-metrics", + "insights/available-metrics-in-insights/command-metrics", + "insights/getting-started-with-insights", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details" + ], + "insights/available-metrics-in-insights/command-metrics": [ + "bitrise-build-cache/insights", + "insights/available-metrics-in-insights/bitrise-ci-metrics", + "insights/available-metrics-in-insights/build-cache-metrics", + "insights/getting-started-with-insights", + "bitrise-build-cache/getting-started-with-the-build-cache/invocations" + ], + "insights/configuring-alerts-in-insights": [ + "insights/getting-started-with-insights", + "release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-email-notifications", + "insights/available-metrics-in-insights/bitrise-ci-metrics", + "bitrise-platform/workspaces/workspace-slack-integration" + ], + "insights/getting-started-with-insights": [ + "insights/available-metrics-in-insights/bitrise-ci-metrics", + "bitrise-ci/getting-started/the-bitrise-dashboard", + "bitrise-build-cache/insights", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/checking-build-details", + "insights/available-metrics-in-insights/build-cache-metrics" + ], + "insights/git-insights": [ + "bitrise-ci/configure-builds/configuring-build-settings/reporting-the-build-status-to-your-git-hosting-provider", + "bitrise-ci/getting-started/the-bitrise-dashboard", + "insights/available-metrics-in-insights/bitrise-ci-metrics", + "bitrise-platform/repository-access/github-app-integration", + "bitrise-ci/run-and-analyze-builds/build-data-and-troubleshooting/bitrise-checks-on-github" + ], + "insights/insights-tutorials/credit-usage": [ + "insights/getting-started-with-insights", + "insights/configuring-alerts-in-insights", + "bitrise-ci/getting-started/the-bitrise-dashboard", + "bitrise-platform/ai/ai-features-on-bitrise", + "bitrise-build-cache/insights" + ], + "insights/insights-tutorials/monitoring-and-optimizing-your-slowest-mobile-builds": [ + "insights/insights-tutorials/tracking-build-failure-rate", + "insights/insights-tutorials/tracking-test-failure-rate", + "bitrise-ci/testing/detecting-and-quarantining-flaky-tests", + "bitrise-ci/run-and-analyze-builds/utility-builds", + "bitrise-build-cache/getting-started-with-the-build-cache/getting-started-with-the-build-cache" + ], + "insights/insights-tutorials/tracking-build-failure-rate": [ + "insights/insights-tutorials/tracking-test-failure-rate", + "insights/insights-tutorials/monitoring-and-optimizing-your-slowest-mobile-builds", + "bitrise-ci/run-and-analyze-builds/build-statuses", + "insights/available-metrics-in-insights/bitrise-ci-metrics", + "insights/getting-started-with-insights" + ], + "insights/insights-tutorials/tracking-flaky-tests": [ + "bitrise-ci/testing/detecting-and-quarantining-flaky-tests", + "insights/insights-tutorials/tracking-test-failure-rate", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipelines-with-stages/currently-supported-use-cases-for-the-android-platform", + "bitrise-ci/testing/deploying-and-viewing-test-results", + "bitrise-ci/testing/testing-android-apps/android-unit-tests" + ], + "insights/insights-tutorials/tracking-test-failure-rate": [ + "insights/insights-tutorials/tracking-build-failure-rate", + "insights/insights-tutorials/tracking-flaky-tests", + "bitrise-ci/testing/detecting-and-quarantining-flaky-tests", + "bitrise-ci/deploying/deploying-to-testfairy-with-bitrise", + "bitrise-build-cache/build-cache-for-gradle/gradle-execution-reason-diagnostic-builds" + ], + "release-management/build-distribution/distributing-builds-to-testers": [ + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "release-management/releases/managing-the-release-process/testflight-upload-stage", + "bitrise-ci/deploying/bitrise-ota-app-deployment", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds" + ], + "release-management/build-distribution/tester-groups": [ + "release-management/build-distribution/distributing-builds-to-testers", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "release-management/releases/managing-the-release-process/testflight-upload-stage", + "release-management/installable-artifacts" + ], + "release-management/codepush/about-codepush": [ + "release-management/codepush/configuring-your-app-for-codepush", + "release-management/codepush/creating-a-codepush-deployment", + "release-management/codepush/codepush-cli/about-the-codepush-cli", + "bitrise-ci/deploying/bitrise-ota-app-deployment", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects" + ], + "release-management/codepush/code-signing-with-codepush": [ + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-automatic-provisioning", + "bitrise-platform/integrations/apple-services-connection/steps-requiring-apple-authentication", + "release-management/codepush/creating-and-releasing-codepush-updates", + "bitrise-ci/code-signing/ios-code-signing/managing-ios-code-signing-files-manual-provisioning", + "bitrise-ci/api/managing-ios-code-signing-files" + ], + "release-management/codepush/codepush-cli/about-the-codepush-cli": [ + "release-management/codepush/codepush-cli/setting-up-the-codepush-cli", + "release-management/codepush/codepush-updates-with-bitrise-ci", + "release-management/codepush/codepush-cli/codepush-cli-authentication", + "release-management/codepush/creating-and-releasing-codepush-updates", + "bitrise-ci/getting-started/key-bitrise-concepts" + ], + "release-management/codepush/codepush-cli/codepush-cli-authentication": [ + "release-management/codepush/codepush-cli/setting-up-the-codepush-cli", + "release-management/codepush/codepush-cli/about-the-codepush-cli", + "release-management/codepush/codepush-updates-with-bitrise-ci", + "bitrise-ci/api/authenticating-with-the-bitrise-api", + "bitrise-platform/accounts/personal-access-tokens" + ], + "release-management/codepush/codepush-cli/codepush-cli-reference": [ + "release-management/codepush/codepush-cli/about-the-codepush-cli", + "release-management/codepush/codepush-cli/using-the-codepush-cli", + "release-management/releases/configuring-a-release/release-automation", + "bitrise-ci/run-and-analyze-builds/build-triggers/yaml-syntax-for-build-triggers", + "release-management/codepush/codepush-updates-with-bitrise-ci" + ], + "release-management/codepush/codepush-cli/setting-up-the-codepush-cli": [ + "release-management/codepush/codepush-cli/about-the-codepush-cli", + "release-management/codepush/codepush-cli/codepush-cli-authentication", + "bitrise-ci/bitrise-cli/installing-and-updating-the-bitrise-cli", + "bitrise-ci/bitrise-cli/adding-a-new-project-from-a-cli", + "bitrise-platform/infrastructure/running-bitrise-builds-on-premise" + ], + "release-management/codepush/codepush-cli/using-the-codepush-cli": [ + "release-management/codepush/creating-a-codepush-deployment", + "release-management/codepush/configuring-your-app-for-codepush", + "release-management/codepush/codepush-cli/about-the-codepush-cli", + "release-management/codepush/codepush-cli/codepush-cli-reference", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise" + ], + "release-management/codepush/codepush-updates-with-bitrise-ci": [ + "release-management/codepush/creating-and-releasing-codepush-updates", + "release-management/codepush/codepush-cli/about-the-codepush-cli", + "release-management/codepush/creating-a-codepush-deployment", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management" + ], + "release-management/codepush/configuring-your-app-for-codepush": [ + "release-management/codepush/about-codepush", + "release-management/codepush/creating-a-codepush-deployment", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-react-native-projects", + "bitrise-ci/getting-started/quick-start-guides/getting-started-with-expo-projects", + "release-management/codepush/codepush-cli/using-the-codepush-cli" + ], + "release-management/codepush/creating-a-codepush-deployment": [ + "release-management/codepush/configuring-your-app-for-codepush", + "release-management/codepush/about-codepush", + "release-management/codepush/codepush-cli/using-the-codepush-cli", + "bitrise-ci/deploying/bitrise-ota-app-deployment", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise" + ], + "release-management/codepush/creating-and-releasing-codepush-updates": [ + "release-management/codepush/codepush-updates-with-bitrise-ci", + "release-management/codepush/creating-a-codepush-deployment", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "bitrise-platform/integrations/apple-services-connection/connecting-to-an-apple-service-with-api-key", + "release-management/codepush/codepush-cli/about-the-codepush-cli" + ], + "release-management/configuring-connected-apps/about-connected-apps": [ + "release-management/getting-started-with-release-management/connecting-an-app", + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management", + "release-management/release-management-api", + "release-management/configuring-connected-apps/configuring-connected-app-integration", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise" + ], + "release-management/configuring-connected-apps/changing-connected-app-appearance": [ + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "release-management/releases/adding-a-new-release", + "release-management/releases/release-presets", + "bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning", + "bitrise-ci/getting-started/adding-a-new-project" + ], + "release-management/configuring-connected-apps/configuring-connected-app-integration": [ + "release-management/getting-started-with-release-management/connecting-an-app", + "release-management/configuring-connected-apps/about-connected-apps", + "release-management/releases/adding-a-new-release", + "release-management/getting-started-with-release-management/managing-licenses", + "bitrise-platform/integrations/connecting-a-google-service-account-to-bitrise" + ], + "release-management/configuring-connected-apps/deleting-a-connected-app": [ + "release-management/releases/configuring-a-release/deleting-a-release", + "release-management/releases/managing-the-release-process/stop-managing-a-release", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "bitrise-platform/accounts/deleting-your-bitrise-account", + "release-management/releases/adding-a-new-release" + ], + "release-management/configuring-connected-apps/integrating-launchdarkly-feature-flags": [ + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "bitrise-ci/configure-builds/configuration-yaml/editing-an-apps-bitriseyml-file", + "bitrise-ci/api/adding-and-managing-apps", + "bitrise-ci/bitrise-cli/initializing-a-bitrise-project-locally", + "bitrise-ci/getting-started/adding-a-new-project" + ], + "release-management/configuring-connected-apps/release-management-roles-and-permissions": [ + "bitrise-platform/projects/roles-and-permissions-for-bitrise-ci", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/roles-and-permissions-in-workspaces", + "bitrise-platform/workspaces/collaboration-and-permissions-in-workspaces/workspace-groups", + "bitrise-platform/getting-started/collaboration", + "bitrise-platform/getting-started/key-concepts-of-the-bitrise-platform" + ], + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management": [ + "bitrise-ci/getting-started/adding-a-new-project", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management", + "release-management/releases/adding-a-new-release", + "release-management/releases/managing-the-release-process/selecting-a-release-candidate" + ], + "release-management/getting-started-with-release-management/connecting-an-app": [ + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "release-management/configuring-connected-apps/about-connected-apps", + "release-management/configuring-connected-apps/configuring-connected-app-integration", + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management", + "release-management/releases/adding-a-new-release" + ], + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management": [ + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "bitrise-ci/getting-started/adding-a-new-project", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "release-management/configuring-connected-apps/about-connected-apps", + "release-management/releases/managing-the-release-process/selecting-a-release-candidate" + ], + "release-management/getting-started-with-release-management/getting-started-with-release-management": [ + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "release-management/build-distribution/distributing-builds-to-testers", + "release-management/releases/adding-a-new-release", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise", + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management" + ], + "release-management/getting-started-with-release-management/managing-licenses": [ + "release-management/configuring-connected-apps/configuring-connected-app-integration", + "release-management/releases/adding-a-new-release", + "release-management/getting-started-with-release-management/connecting-an-app", + "release-management/configuring-connected-apps/about-connected-apps", + "release-management/getting-started-with-release-management/release-management-concepts" + ], + "release-management/getting-started-with-release-management/release-management-concepts": [ + "release-management/releases/managing-the-release-process/about-the-release-process", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "release-management/releases/adding-a-new-release", + "release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review", + "release-management/release-management-api" + ], + "release-management/installable-artifacts": [ + "release-management/releases/managing-the-release-process/selecting-a-release-candidate", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "bitrise-ci/run-and-analyze-builds/managing-build-files/build-artifacts-online", + "bitrise-ci/api/managing-build-artifacts", + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management" + ], + "release-management/release-management-api": [ + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "release-management/configuring-connected-apps/about-connected-apps", + "release-management/releases/adding-a-new-release", + "bitrise-ci/api/managing-an-apps-builds" + ], + "release-management/releases/adding-a-new-release": [ + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "release-management/releases/release-presets", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "release-management/releases/managing-the-release-process/google-play-upload-stage", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise" + ], + "release-management/releases/configuring-a-release/configuring-auto-upload": [ + "release-management/releases/managing-the-release-process/google-play-upload-stage", + "release-management/releases/managing-the-release-process/testflight-upload-stage", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise", + "release-management/releases/adding-a-new-release", + "release-management/getting-started-with-release-management/getting-started-with-release-management" + ], + "release-management/releases/configuring-a-release/configuring-slack-and-teams-notifications": [ + "bitrise-platform/workspaces/workspace-slack-integration", + "bitrise-ci/configure-builds/configuring-build-settings/configuring-slack-integration", + "bitrise-ci/run-and-analyze-builds/build-triggers/triggering-builds-by-slack-commands", + "insights/configuring-alerts-in-insights", + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks" + ], + "release-management/releases/configuring-a-release/deleting-a-release": [ + "release-management/configuring-connected-apps/deleting-a-connected-app", + "release-management/releases/managing-the-release-process/stop-managing-a-release", + "release-management/releases/adding-a-new-release", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management" + ], + "release-management/releases/configuring-a-release/editing-the-description-of-a-release": [ + "release-management/releases/adding-a-new-release", + "release-management/releases/release-presets", + "release-management/configuring-connected-apps/changing-connected-app-appearance", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review" + ], + "release-management/releases/configuring-a-release/outgoing-webhooks-in-release-management": [ + "bitrise-ci/api/incoming-and-outgoing-webhooks", + "bitrise-platform/integrations/webhooks/adding-outgoing-webhooks", + "bitrise-platform/integrations/webhooks/webhooks-overview", + "bitrise-ci/api/api-overview", + "bitrise-platform/repository-access/github-app-integration" + ], + "release-management/releases/configuring-a-release/release-automation": [ + "bitrise-ci/api/triggering-and-aborting-builds", + "release-management/releases/release-presets", + "bitrise-ci/workflows-and-pipelines/build-pipelines/pipeline-builds", + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds", + "bitrise-ci/configure-builds/configuring-build-settings/selective-builds" + ], + "release-management/releases/managing-the-release-process/about-the-release-process": [ + "release-management/getting-started-with-release-management/release-management-concepts", + "release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review", + "release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store", + "release-management/releases/adding-a-new-release", + "release-management/getting-started-with-release-management/getting-started-with-release-management" + ], + "release-management/releases/managing-the-release-process/creating-tasks-for-the-approvals-stage": [ + "release-management/releases/managing-the-release-process/about-the-release-process", + "release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review", + "release-management/getting-started-with-release-management/release-management-concepts", + "bitrise-ci/deploying/deploying-apps-to-deploygate-from-bitrise", + "release-management/releases/adding-a-new-release" + ], + "release-management/releases/managing-the-release-process/google-play-upload-stage": [ + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "bitrise-ci/deploying/android-deployment/deploying-android-apps-to-bitrise-and-google-play", + "release-management/releases/managing-the-release-process/releasing-your-app-on-google-play", + "release-management/releases/adding-a-new-release", + "release-management/releases/configuring-a-release/configuring-auto-upload" + ], + "release-management/releases/managing-the-release-process/releasing-your-app-on-google-play": [ + "release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store", + "release-management/releases/managing-the-release-process/google-play-upload-stage", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "release-management/releases/adding-a-new-release", + "release-management/getting-started-with-release-management/release-management-concepts" + ], + "release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store": [ + "release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review", + "release-management/releases/managing-the-release-process/releasing-your-app-on-google-play", + "release-management/getting-started-with-release-management/release-management-concepts", + "release-management/releases/adding-a-new-release", + "bitrise-ci/deploying/deploying-your-app-to-appaloosa" + ], + "release-management/releases/managing-the-release-process/selecting-a-release-candidate": [ + "release-management/installable-artifacts", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "bitrise-ci/getting-started/adding-a-new-project", + "bitrise-ci/run-and-analyze-builds/starting-builds/starting-builds-manually", + "release-management/getting-started-with-release-management/connecting-another-ci-service-to-release-management" + ], + "release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review": [ + "release-management/releases/managing-the-release-process/about-the-release-process", + "release-management/releases/managing-the-release-process/releasing-your-app-on-the-app-store", + "release-management/getting-started-with-release-management/release-management-concepts", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect", + "release-management/releases/adding-a-new-release" + ], + "release-management/releases/managing-the-release-process/stop-managing-a-release": [ + "release-management/releases/configuring-a-release/deleting-a-release", + "release-management/configuring-connected-apps/deleting-a-connected-app", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "bitrise-ci/configure-builds/configuring-build-settings/rolling-builds" + ], + "release-management/releases/managing-the-release-process/testflight-upload-stage": [ + "release-management/build-distribution/distributing-builds-to-testers", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-to-app-store-connect", + "bitrise-ci/deploying/ios-deployment/deploying-an-ios-app-for-external-testing", + "release-management/releases/managing-the-release-process/sending-your-app-to-app-store-review" + ], + "release-management/releases/release-presets": [ + "release-management/releases/adding-a-new-release", + "release-management/getting-started-with-release-management/adding-a-new-app-to-release-management", + "release-management/releases/managing-the-release-process/selecting-a-release-candidate", + "release-management/getting-started-with-release-management/getting-started-with-release-management", + "bitrise-ci/run-and-analyze-builds/build-numbering-and-app-versioning" + ] +} diff --git a/src/theme/DocItem/Paginator/index.js b/src/theme/DocItem/Paginator/index.js new file mode 100644 index 00000000..8c38de02 --- /dev/null +++ b/src/theme/DocItem/Paginator/index.js @@ -0,0 +1,24 @@ +import React from 'react'; +import OriginalDocItemPaginator from '@theme-original/DocItem/Paginator'; +import { useDoc } from '@docusaurus/plugin-content-docs/client'; +import SeeAlso from '@site/src/components/SeeAlso'; + +/** + * Swizzled to render the auto-generated section (src/data/see_also.json) + * between the article content/footer and the Previous/Next buttons, rather than + * after them — See also is content the reader should still be in reading mode for, + * Previous/Next is page-turning chrome that should stay last. + * + * Shared by both regular docs (DocItem/Layout) and API reference pages + * (ApiItem/Layout), but API reference pages are excluded from the embedding + * corpus (see scripts/generate_see_also.py), so SeeAlso renders nothing there. + */ +export default function DocItemPaginator(props) { + const { metadata } = useDoc(); + return ( + <> + + + + ); +} diff --git a/src/theme/DocItem/index.js b/src/theme/DocItem/index.js index f7bf4f62..4c975817 100644 --- a/src/theme/DocItem/index.js +++ b/src/theme/DocItem/index.js @@ -10,6 +10,10 @@ import { HtmlClassNameProvider } from '@docusaurus/theme-common'; * * Also adds `api-reference-page` to the element so CSS can target * API pages specifically (e.g. to expand the content column to full width). + * + * (The auto-generated section lives in the DocItem/Paginator + * swizzle, so it renders between the article content and the Previous/Next + * buttons rather than after them.) */ export default function DocItem(props) { const { api } = props.content.frontMatter ?? {};