Skip to content

feat(docs): co-locate multilingual docs source#186

Merged
danko-nobre merged 4 commits into
mainfrom
feat/spec-077-colocated-docs-i18n
Jul 4, 2026
Merged

feat(docs): co-locate multilingual docs source#186
danko-nobre merged 4 commits into
mainfrom
feat/spec-077-colocated-docs-i18n

Conversation

@danko-nobre

@danko-nobre danko-nobre commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

What changed

Co-locate each docs page's languages under docs/ as <name>-en.md / <name>-pt.md (31 pairs), with the addon chrome in docs/_i18n/chrome-<lang>.json (en and pt-BR both explicit). A Node sync (apps/docs/scripts/sync-i18n.mjs) fans that source out into the Docusaurus i18n/<locale>/ trees for both locales; apps/docs/i18n/ is now gitignored and regenerated on prebuild, and the committed pt-BR tree is removed. English is a generated pack like every other language: docs.path and the search index read i18n/en/, not docs/ directly, and editUrl maps each generated page back to its co-located source.

Why

The shipped spec-072 layout put the pt-BR translations in a distant i18n/pt-BR/ mirror, far from the English source. Co-location lets a page's languages be edited side by side, and makes adding a third language a matter of -<lang> files plus one row in the sync's language-to-locale map. Spec 077.

How to test

  • pnpm --dir apps/docs test - 8 sync unit tests (node --test): suffix stripping, sidecar + asset copy, chrome split, the codegen @site re-anchor, and the coverage guard.
  • pnpm --dir apps/docs build - both locales build clean (the sync runs on prebuild); no broken-link or module-not-found warnings.
  • pnpm --dir apps/docs typecheck - green.
  • Spot-check: the locale dropdown switches en <-> pt-BR; pt-BR navbar + sidebar render Portuguese; Edit-this-page opens docs/<path>-<lang>.md.

Notes

  • The codegen schema pages under content/ import the JSON schema by a path relative to the old docs/content/ depth; the sync re-anchors that import at @site in the generated copies only, so the committed docs/content/ stays byte-identical (the codegen committed-match test is untouched). A cleaner follow-on is emitting the @site anchor from the codegen itself.
  • docs/README.md became README-en.md, so the GitHub folder view of docs/ loses its auto-rendered README (cosmetic).

Checklist

  • Per-language lint and format pass (docs app; no Python touched)
  • Per-language typecheck passes (tsc)
  • Tests pass for the affected app (8/8 sync tests; both locales build)
  • Schemas validate against examples and fixtures (n/a - no schema change)
  • If format_version changed, migration documented (n/a)

Spec: specs/077-colocated-docs-i18n/

Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Documentation now uses generated English and Portuguese content packs, with localized navigation, footer, and sidebar text.
    • Added automated sync support to keep translated docs in sync during builds and starts.
  • Bug Fixes

    • Improved edit links so they point to the correct language version of each doc.
  • Documentation

    • Added the new docs localization plan and updated the spec index to include the multilingual docs work.

danko-nobre and others added 2 commits July 4, 2026 17:17
Restructure the docs half of spec 072: co-locate each page's languages under docs/ as <name>-en.md / <name>-pt.md, with the Docusaurus i18n/<locale>/ trees generated and gitignored. English becomes an equal generated pack, not the implicit default.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Every hand-authored page now lives side by side as docs/<name>-en.md and docs/<name>-pt.md; chrome moves to docs/_i18n/chrome-<lang>.json with en and pt-BR both explicit. A Node sync (apps/docs/scripts/sync-i18n.mjs, run on prebuild/prestart, tested with node --test) generates the i18n/en/ and i18n/pt-BR/ trees Docusaurus consumes and guards language coverage; apps/docs/i18n/ is gitignored and the committed pt-BR tree is removed. docs.path and the search index read the generated en pack; editUrl maps back to the co-located source. The codegen schema import is re-anchored at @site in the generated copies (the committed docs/content/ is unchanged).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@danko-nobre, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 36 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ce3585bc-eeff-4121-af32-942f0336aeed

📥 Commits

Reviewing files that changed from the base of the PR and between 066b769 and e2b3291.

📒 Files selected for processing (3)
  • apps/docs/scripts/sync-i18n.mjs
  • apps/docs/scripts/sync-i18n.test.mjs
  • tests/test_help_topics.py
📝 Walkthrough

Walkthrough

Introduces a co-located docs i18n workflow: a new sync-i18n.mjs script generates Docusaurus locale trees from docs/ sources with a coverage guard, Docusaurus config and build scripts are wired to consume generated output, new chrome-en/pt.json translation sources are added, previously committed generated pt-BR i18n JSON is removed, and specs/gitignore/cspell are updated.

Changes

Docs i18n sync tooling and config

Layer / File(s) Summary
sync-i18n script core logic
apps/docs/scripts/sync-i18n.mjs
Adds listSource, stripSuffix, copyContentTree, assertCoverage, generate, and the exported sync({docsDir, outDir, check}) function plus a CLI runner, generating locale trees from co-located docs with a coverage guard and chrome/code splitting.
sync-i18n test suite
apps/docs/scripts/sync-i18n.test.mjs
Adds end-to-end tests covering locale generation, suffix stripping, single-language asset copying, sidecar handling, import rewriting, chrome migration, and coverage-guard failure cases.
Docusaurus config and build script wiring
apps/docs/docusaurus.config.ts, apps/docs/package.json
Points docsDir/docs.path to a generated English pack, computes editUrl per locale, and runs sync-i18n before start/build with new sync-i18n/test scripts.
Chrome translation sources and removed generated i18n
docs/_i18n/chrome-en.json, docs/_i18n/chrome-pt.json, apps/docs/i18n/pt-BR/docusaurus-plugin-content-docs/current.json, apps/docs/i18n/pt-BR/docusaurus-theme-classic/footer.json, apps/docs/i18n/pt-BR/docusaurus-theme-classic/navbar.json
Adds source-of-truth navbar/footer/sidebar translation JSON for EN and PT, and removes the previously committed generated pt-BR Docusaurus i18n JSON files.
Gitignore, cspell terms, and spec docs
.gitignore, .cspell/ecosystem-terms.txt, specs/077-colocated-docs-i18n/STUDY.md, specs/077-colocated-docs-i18n/TODO.md, specs/index.md
Ignores generated /apps/docs/i18n/ output, adds prebuild/prestart/worktree cspell terms, and documents the restructure via new STUDY/TODO specs and a spec index entry.

Estimated code review effort: 3 (Moderate) | ~30 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Developer
  participant BuildScript as npm build/start
  participant SyncI18n as sync-i18n.mjs
  participant DocsSource as docs/
  participant OutDir as apps/docs/i18n/
  participant Docusaurus

  Developer->>BuildScript: run start or build
  BuildScript->>SyncI18n: node scripts/sync-i18n.mjs
  SyncI18n->>DocsSource: scan pages, sidecars, chrome files
  SyncI18n->>SyncI18n: assertCoverage (fail if -en/-pt missing)
  SyncI18n->>OutDir: write locale trees (pages, assets, chrome json)
  SyncI18n-->>BuildScript: exit 0 or exit 1 with error
  BuildScript->>Docusaurus: launch with generated docs
  Docusaurus->>OutDir: read locale content and chrome strings
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: moving multilingual docs source files to a co-located structure.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/spec-077-colocated-docs-i18n
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch feat/spec-077-colocated-docs-i18n

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/docs/scripts/sync-i18n.mjs (1)

100-113: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Coverage key includes the file extension, so mixed .md/.mdx across languages false-fails.

The grouping key comes from stripSuffix(rel, m), which retains the extension. If a page is authored as guide-en.md but its translation as guide-pt.mdx, the two land in separate groups (guide.md, guide.mdx) and the guard reports both as missing their sibling — even though Docusaurus resolves each locale tree independently and both would produce the same route. Consider keying by the extension-stripped stem so .md/.mdx pairs are treated as one page.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/docs/scripts/sync-i18n.mjs` around lines 100 - 113, The coverage
grouping in assertCoverage currently uses stripSuffix(rel, m), which keeps the
file extension and can split the same page into separate buckets when locales
mix .md and .mdx. Update the grouping key in assertCoverage to use the
extension-stripped page stem so variants like guide-en.md and guide-pt.mdx are
treated as one page across languages, while keeping the existing LANG_RE and
suffix validation flow intact.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@apps/docs/scripts/sync-i18n.mjs`:
- Around line 100-113: The coverage grouping in assertCoverage currently uses
stripSuffix(rel, m), which keeps the file extension and can split the same page
into separate buckets when locales mix .md and .mdx. Update the grouping key in
assertCoverage to use the extension-stripped page stem so variants like
guide-en.md and guide-pt.mdx are treated as one page across languages, while
keeping the existing LANG_RE and suffix validation flow intact.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 33931912-2ef8-4d69-8342-8697fa207cd3

📥 Commits

Reviewing files that changed from the base of the PR and between a5534de and 066b769.

📒 Files selected for processing (77)
  • .cspell/ecosystem-terms.txt
  • .gitignore
  • apps/docs/docusaurus.config.ts
  • apps/docs/i18n/pt-BR/docusaurus-plugin-content-docs/current.json
  • apps/docs/i18n/pt-BR/docusaurus-theme-classic/footer.json
  • apps/docs/i18n/pt-BR/docusaurus-theme-classic/navbar.json
  • apps/docs/package.json
  • apps/docs/scripts/sync-i18n.mjs
  • apps/docs/scripts/sync-i18n.test.mjs
  • docs/00-guides/00-getting-started/index-en.md
  • docs/00-guides/00-getting-started/index-pt.md
  • docs/00-guides/01-basic/01-photoshop-en.md
  • docs/00-guides/01-basic/01-photoshop-pt.md
  • docs/00-guides/01-basic/02-blender-en.md
  • docs/00-guides/01-basic/02-blender-pt.md
  • docs/00-guides/01-basic/03-godot-en.md
  • docs/00-guides/01-basic/03-godot-pt.md
  • docs/00-guides/01-basic/index-en.md
  • docs/00-guides/01-basic/index-pt.md
  • docs/00-guides/02-advanced/01-photoshop-en.md
  • docs/00-guides/02-advanced/01-photoshop-pt.md
  • docs/00-guides/02-advanced/02-blender-en.md
  • docs/00-guides/02-advanced/02-blender-pt.md
  • docs/00-guides/02-advanced/03-godot-en.md
  • docs/00-guides/02-advanced/03-godot-pt.md
  • docs/00-guides/02-advanced/index-en.md
  • docs/00-guides/02-advanced/index-pt.md
  • docs/00-guides/03-iterate-en.md
  • docs/00-guides/03-iterate-pt.md
  • docs/00-guides/index-en.md
  • docs/00-guides/index-pt.md
  • docs/01-project/01-architecture-en.md
  • docs/01-project/01-architecture-pt.md
  • docs/01-project/03-comparison-en.md
  • docs/01-project/03-comparison-pt.md
  • docs/01-project/04-deferred-en.md
  • docs/01-project/04-deferred-pt.md
  • docs/01-project/index-en.md
  • docs/01-project/index-pt.md
  • docs/02-tools/blender-addon/01-outliner-en.md
  • docs/02-tools/blender-addon/01-outliner-pt.md
  • docs/02-tools/blender-addon/02-element-en.md
  • docs/02-tools/blender-addon/02-element-pt.md
  • docs/02-tools/blender-addon/03-slots-en.md
  • docs/02-tools/blender-addon/03-slots-pt.md
  • docs/02-tools/blender-addon/04-skeleton-en.md
  • docs/02-tools/blender-addon/04-skeleton-pt.md
  • docs/02-tools/blender-addon/05-mesh-generation-en.md
  • docs/02-tools/blender-addon/05-mesh-generation-pt.md
  • docs/02-tools/blender-addon/06-weight-paint-en.md
  • docs/02-tools/blender-addon/06-weight-paint-pt.md
  • docs/02-tools/blender-addon/07-animation-en.md
  • docs/02-tools/blender-addon/07-animation-pt.md
  • docs/02-tools/blender-addon/08-atlas-en.md
  • docs/02-tools/blender-addon/08-atlas-pt.md
  • docs/02-tools/blender-addon/09-manual-mesh-en.md
  • docs/02-tools/blender-addon/09-manual-mesh-pt.md
  • docs/02-tools/blender-addon/10-pipeline-en.md
  • docs/02-tools/blender-addon/10-pipeline-pt.md
  • docs/02-tools/blender-addon/11-helpers-en.md
  • docs/02-tools/blender-addon/11-helpers-pt.md
  • docs/02-tools/blender-addon/index-en.md
  • docs/02-tools/blender-addon/index-pt.md
  • docs/02-tools/godot-plugin/index-en.md
  • docs/02-tools/godot-plugin/index-pt.md
  • docs/02-tools/index-en.md
  • docs/02-tools/index-pt.md
  • docs/02-tools/photoshop-plugin/index-en.md
  • docs/02-tools/photoshop-plugin/index-pt.md
  • docs/README-en.md
  • docs/README-pt.md
  • docs/_i18n/chrome-en.json
  • docs/_i18n/chrome-pt.json
  • docs/_i18n/code-pt.json
  • specs/077-colocated-docs-i18n/STUDY.md
  • specs/077-colocated-docs-i18n/TODO.md
  • specs/index.md
💤 Files with no reviewable changes (3)
  • apps/docs/i18n/pt-BR/docusaurus-plugin-content-docs/current.json
  • apps/docs/i18n/pt-BR/docusaurus-theme-classic/footer.json
  • apps/docs/i18n/pt-BR/docusaurus-theme-classic/navbar.json
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
  • GitHub Check: Analyze (python)
⚠️ CI failures not shown inline (6)

GitHub Actions: SonarCloud / SonarCloud: feat(docs): co-locate multilingual docs source

Conclusion: failure

View job details

##[group]Run uv run pytest tests/ --cov=apps/blender --cov=packages --cov=scripts --cov-report=xml:coverage.xml
 �[36;1muv run pytest tests/ --cov=apps/blender --cov=packages --cov=scripts --cov-report=xml:coverage.xml�[0m
 shell: /usr/bin/bash -e {0}
 env:
   UV_PYTHON_INSTALL_DIR: /home/runner/work/_temp/uv-python-dir
   UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
 ##[endgroup]
 ============================= test session starts ==============================
 platform linux -- Python 3.12.3, pytest-9.1.1, pluggy-1.6.0
 rootdir: /home/runner/work/proscenio/proscenio
 configfile: pyproject.toml
 plugins: cov-7.1.0
 collected 1002 items
 tests/automesh/test_contour.py ......................................    [  3%]
 tests/automesh/test_contour_islands.py ......                            [  4%]
 tests/automesh/test_cut_geometry.py ...........                          [  5%]
 tests/automesh/test_density.py ......................................... [  9%]
 ..                                                                       [  9%]
 tests/automesh/test_extra_edges_cdt.py ........                          [ 10%]
 tests/automesh/test_geometry.py .................................        [ 13%]
 tests/automesh/test_interior_mode.py ...                                 [ 14%]
 tests/automesh/test_open_stroke_pen.py ..........                        [ 15%]
 tests/automesh/test_outer_splice.py ................                     [ 16%]
 tests/automesh/test_stroke_geometry.py ................................. [ 20%]
 ...                                                                      [ 20%]
 tests/automesh/test_stroke_pick.py ....                                  [ 20%]
 tests/automesh/test_vertex_pen.py ..................                     [ 22%]
 tests/codegen/test_discriminated_union.py ...........                    [ 23%]
 tests/codegen/test_godot_emit.py ..s...                                  [ 24%]
 tests/codegen/test_psd_manifest.py ......      ...

GitHub Actions: SonarCloud / 0_SonarCloud.txt: feat(docs): co-locate multilingual docs source

Conclusion: failure

View job details

##[group]Run uv run pytest tests/ --cov=apps/blender --cov=packages --cov=scripts --cov-report=xml:coverage.xml
 �[36;1muv run pytest tests/ --cov=apps/blender --cov=packages --cov=scripts --cov-report=xml:coverage.xml�[0m
 shell: /usr/bin/bash -e {0}
 env:
   UV_PYTHON_INSTALL_DIR: /home/runner/work/_temp/uv-python-dir
   UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
 ##[endgroup]
 ============================= test session starts ==============================
 platform linux -- Python 3.12.3, pytest-9.1.1, pluggy-1.6.0
 rootdir: /home/runner/work/proscenio/proscenio
 configfile: pyproject.toml
 plugins: cov-7.1.0
 collected 1002 items
 tests/automesh/test_contour.py ......................................    [  3%]
 tests/automesh/test_contour_islands.py ......                            [  4%]
 tests/automesh/test_cut_geometry.py ...........                          [  5%]
 tests/automesh/test_density.py ......................................... [  9%]
 ..                                                                       [  9%]
 tests/automesh/test_extra_edges_cdt.py ........                          [ 10%]
 tests/automesh/test_geometry.py .................................        [ 13%]
 tests/automesh/test_interior_mode.py ...                                 [ 14%]
 tests/automesh/test_open_stroke_pen.py ..........                        [ 15%]
 tests/automesh/test_outer_splice.py ................                     [ 16%]
 tests/automesh/test_stroke_geometry.py ................................. [ 20%]
 ...                                                                      [ 20%]
 tests/automesh/test_stroke_pick.py ....                                  [ 20%]
 tests/automesh/test_vertex_pen.py ..................                     [ 22%]
 tests/codegen/test_discriminated_union.py ...........                    [ 23%]
 tests/codegen/test_godot_emit.py ..s...                                  [ 24%]
 tests/codegen/test_psd_manifest.py ......      ...

GitHub Actions: CI / test-blender: feat(docs): co-locate multilingual docs source

Conclusion: failure

View job details

##[group]Run ~/blender/blender --background \
 �[36;1m~/blender/blender --background \�[0m
 �[36;1m  --python packages/validator/scripts/validate_automesh.py \�[0m
 �[36;1m  -- --ci-only�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 Traceback (most recent call last):
   File "/home/runner/work/proscenio/proscenio/packages/validator/scripts/validate_automesh.py", line 50, in <module>
     from proscenio_validator.cli import main  # noqa: E402
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/home/runner/work/proscenio/proscenio/packages/validator/src/proscenio_validator/cli.py", line 16, in <module>
     from .measurement import load_fixture, run_validation
   File "/home/runner/work/proscenio/proscenio/packages/validator/src/proscenio_validator/measurement.py", line 18, in <module>
     from .coverage import measure_coverage
   File "/home/runner/work/proscenio/proscenio/packages/validator/src/proscenio_validator/coverage.py", line 17, in <module>
     from core.geometry_2d import point_in_triangle_xz
 ModuleNotFoundError: No module named 'core.geometry_2d'
 Blender 5.1.1 (hash b70da489d7f4 built )
 Blender quit

GitHub Actions: CI / lint-python: feat(docs): co-locate multilingual docs source

Conclusion: failure

View job details

##[group]Run uv run pytest tests/
 �[36;1muv run pytest tests/�[0m
 shell: /usr/bin/bash -e {0}
 env:
   UV_PYTHON_INSTALL_DIR: /home/runner/work/_temp/uv-python-dir
   UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
 ##[endgroup]
 ============================= test session starts ==============================
 platform linux -- Python 3.12.3, pytest-9.1.1, pluggy-1.6.0
 rootdir: /home/runner/work/proscenio/proscenio
 configfile: pyproject.toml
 plugins: cov-7.1.0
 collected 1002 items
 tests/automesh/test_contour.py ......................................    [  3%]
 tests/automesh/test_contour_islands.py ......                            [  4%]
 tests/automesh/test_cut_geometry.py ...........                          [  5%]
 tests/automesh/test_density.py ......................................... [  9%]
 ..                                                                       [  9%]
 tests/automesh/test_extra_edges_cdt.py ........                          [ 10%]
 tests/automesh/test_geometry.py .................................        [ 13%]
 tests/automesh/test_interior_mode.py ...                                 [ 14%]
 tests/automesh/test_open_stroke_pen.py ..........                        [ 15%]
 tests/automesh/test_outer_splice.py ................                     [ 16%]
 tests/automesh/test_stroke_geometry.py ................................. [ 20%]
 ...                                                                      [ 20%]
 tests/automesh/test_stroke_pick.py ....                                  [ 20%]
 tests/automesh/test_vertex_pen.py ..................                     [ 22%]
 tests/codegen/test_discriminated_union.py ...........                    [ 23%]
 tests/codegen/test_godot_emit.py ..s...                                  [ 24%]
 tests/codegen/test_psd_manifest.py ......                                [ 24%]
 tests/codegen/test_schema_roundtrip.py ......................            [ 27%]
 tests/codegen/test_ts_emit.py .          ...

GitHub Actions: CI / 1_test-blender.txt: feat(docs): co-locate multilingual docs source

Conclusion: failure

View job details

Current runner version: '2.335.1'
 ##[group]Runner Image Provisioner
 Hosted Compute Agent
 Version: 20260624.560
 Commit: 925d229a51159bc391ae97e54a2dd1fe20af789d
 Build Date:
 Worker ID: {efb36a95-7013-4db4-94d2-e3b190ded529}
 Azure Region: eastus
 ##[endgroup]
 ##[group]Operating System
 Ubuntu
 24.04.4
 LTS
 ##[endgroup]
 ##[group]Runner Image
 Image: ubuntu-24.04
 Version: 20260628.225.1
 Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260628.225/images/ubuntu/Ubuntu2404-Readme.md
 Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260628.225
 ##[endgroup]
 ##[group]GITHUB_TOKEN Permissions
 Contents: read
 Metadata: read
 ##[endgroup]
 Secret source: Actions
 Prepare workflow directory
 Prepare all required actions
 Getting action download info
 Download action repository 'actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0' (SHA:9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0)
 Download action repository 'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9)
 Complete job name: test-blender
 ##[group]Run actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
 with:
   lfs: true
   repository: firebound/proscenio
   ***REDACTED***
   ssh-strict: true
   ssh-user: git
   persist-credentials: true
   clean: true
   sparse-checkout-cone-mode: true
   fetch-depth: 1
   fetch-tags: false
   show-progress: true
   submodules: false
   set-safe-directory: true
   allow-unsafe-pr-checkout: false
 ##[endgroup]
 Syncing repository: firebound/proscenio
 ##[group]Getting Git version info
 Working directory is '/home/runner/work/proscenio/proscenio'
 [command]/usr/bin/git version
 git version 2.54.0
 [command]/usr/bin/git lfs version
 git-lfs/3.7.1 (GitHub; linux amd64; go 1.24.4)
 ##[endgroup]
 Temporarily overriding HOME='/home/runner/work/_temp/5ec166a6-afc9-4988-a568-ba4f5ab0e808' before making global git config changes
 Adding repository directory to the te...

GitHub Actions: CI / 4_lint-python.txt: feat(docs): co-locate multilingual docs source

Conclusion: failure

View job details

##[group]Run uv run pytest tests/
 �[36;1muv run pytest tests/�[0m
 shell: /usr/bin/bash -e {0}
 env:
   UV_PYTHON_INSTALL_DIR: /home/runner/work/_temp/uv-python-dir
   UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
 ##[endgroup]
 ============================= test session starts ==============================
 platform linux -- Python 3.12.3, pytest-9.1.1, pluggy-1.6.0
 rootdir: /home/runner/work/proscenio/proscenio
 configfile: pyproject.toml
 plugins: cov-7.1.0
 collected 1002 items
 tests/automesh/test_contour.py ......................................    [  3%]
 tests/automesh/test_contour_islands.py ......                            [  4%]
 tests/automesh/test_cut_geometry.py ...........                          [  5%]
 tests/automesh/test_density.py ......................................... [  9%]
 ..                                                                       [  9%]
 tests/automesh/test_extra_edges_cdt.py ........                          [ 10%]
 tests/automesh/test_geometry.py .................................        [ 13%]
 tests/automesh/test_interior_mode.py ...                                 [ 14%]
 tests/automesh/test_open_stroke_pen.py ..........                        [ 15%]
 tests/automesh/test_outer_splice.py ................                     [ 16%]
 tests/automesh/test_stroke_geometry.py ................................. [ 20%]
 ...                                                                      [ 20%]
 tests/automesh/test_stroke_pick.py ....                                  [ 20%]
 tests/automesh/test_vertex_pen.py ..................                     [ 22%]
 tests/codegen/test_discriminated_union.py ...........                    [ 23%]
 tests/codegen/test_godot_emit.py ..s...                                  [ 24%]
 tests/codegen/test_psd_manifest.py ......                                [ 24%]
 tests/codegen/test_schema_roundtrip.py ......................            [ 27%]
 tests/codegen/test_ts_emit.py .          ...
🧰 Additional context used
🪛 LanguageTool
specs/077-colocated-docs-i18n/TODO.md

[grammar] ~37-~37: Ensure spelling is correct
Context: ...framework theme-UI strings; the sync re-emits it). ### B3. Retire the committed i18n tree - [ ...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[uncategorized] ~58-~58: The official name of this software platform is spelled with a capital “H”.
Context: ...../apps, ../packages, ../specs -> github.com) and relative image paths still res...

(GITHUB)

specs/077-colocated-docs-i18n/STUDY.md

[uncategorized] ~27-~27: The official name of this software platform is spelled with a capital “H”.
Context: ...must survive the migration. - Deploy: [.github/workflows/docs-deploy.yml](../../.githu...

(GITHUB)


[uncategorized] ~27-~27: The official name of this software platform is spelled with a capital “H”.
Context: ...ploy: .github/workflows/docs-deploy.yml is a Node/pn...

(GITHUB)

🔇 Additional comments (14)
apps/docs/scripts/sync-i18n.mjs (3)

48-95: LGTM!


130-182: LGTM!


184-209: LGTM!

apps/docs/scripts/sync-i18n.test.mjs (1)

1-201: LGTM!

apps/docs/docusaurus.config.ts (2)

11-17: LGTM!

Also applies to: 46-46, 96-100


110-119: 🎯 Functional Correctness | ⚡ Quick win

Confirm the editUrl rewrite matches Docusaurus' docPath contract.

This assumes docPath is always a source-relative .md/.mdx path; if the callback ever receives a different shape for translated or generated docs, these GitHub links will point at the wrong file.

apps/docs/package.json (1)

7-18: LGTM!

docs/_i18n/chrome-en.json (1)

1-112: LGTM!

docs/_i18n/chrome-pt.json (1)

1-112: LGTM!

specs/index.md (1)

165-165: LGTM!

.cspell/ecosystem-terms.txt (1)

389-391: LGTM!

.gitignore (1)

103-107: LGTM!

specs/077-colocated-docs-i18n/STUDY.md (1)

1-60: LGTM!

specs/077-colocated-docs-i18n/TODO.md (1)

1-73: LGTM!

danko-nobre and others added 2 commits July 4, 2026 17:41
… pages

The spec-077 co-location renamed docs/02-tools/blender-addon/*.md to <name>-en.md / <name>-pt.md, so the on-disk panel mirror read outliner-en / outliner-pt instead of the bare slug and drifted. Glob the canonical -en pages and strip the -en/-pt language suffix in the slug; the online doc URLs are unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The coverage grouping keyed on the page path with its extension, so a page authored as guide-en.md with a guide-pt.mdx translation split into two half-missing groups even though Docusaurus routes both to the same slug. Key by the path minus the -<lang>.<ext> so mixed .md/.mdx pairs group as one page. Surfaced by CodeRabbit on PR #186.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud

sonarqubecloud Bot commented Jul 4, 2026

Copy link
Copy Markdown

@danko-nobre danko-nobre merged commit 98ada2b into main Jul 4, 2026
11 checks passed
@danko-nobre danko-nobre deleted the feat/spec-077-colocated-docs-i18n branch July 4, 2026 20:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant