diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 0d6231b..94b93a8 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -19,74 +19,97 @@ concurrency: jobs: build: name: Build and validate site - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 + timeout-minutes: 15 + defaults: + run: + working-directory: repos/emulebb-pages env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true' + EMULEBB_WORKSPACE_ROOT: ${{ github.workspace }} steps: - name: Checkout organization website - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + path: repos/emulebb-pages + persist-credentials: false - name: Checkout public-presence authority - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: repository: emulebb/emulebb-tooling - path: .local/emulebb-tooling + ref: 027dcf32aab5ed2d1e3441b6231e8e500cc2e945 + path: repos/emulebb-tooling + persist-credentials: false - name: Set up Python - uses: actions/setup-python@v7 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7 with: - python-version: '3.x' + python-version: '3.15.2' cache: pip - cache-dependency-path: requirements.txt + cache-dependency-path: repos/emulebb-pages/requirements.txt - name: Install renderer dependencies - run: python -m pip install -r requirements.txt + run: python -B -m pip install -r requirements.txt + + - name: Prepare owned artifact boundary + env: + EMULEBB_WORKSPACE_OUTPUT_ROOT: ${{ runner.temp }}/emulebb-output + run: | + mkdir -p "$EMULEBB_WORKSPACE_OUTPUT_ROOT" + printf 'EMULEBB_WORKSPACE_OUTPUT_ROOT=%s\n' "$EMULEBB_WORKSPACE_OUTPUT_ROOT" >> "$GITHUB_ENV" + + - name: Test renderer staging and locale preservation + run: python -B -m unittest discover -s tests -v - name: Validate public-presence contract - run: python .local/emulebb-tooling/helpers/public-presence.py validate + run: python -B ../emulebb-tooling/helpers/public-presence.py validate - name: Check committed generated pages run: | committed_lastmod="$(grep -m1 -o '[^<]*' sitemap.xml | cut -d '>' -f2)" - python tools/render_pages.py \ - --contract .local/emulebb-tooling/manifests/public-presence.v1.json \ + python -B tools/render_pages.py \ + --contract ../emulebb-tooling/manifests/public-presence.v1.json \ --lastmod "$committed_lastmod" \ --check - name: Render clean site artifact run: | - python tools/render_pages.py \ - --contract .local/emulebb-tooling/manifests/public-presence.v1.json \ + python -B tools/render_pages.py \ + --contract ../emulebb-tooling/manifests/public-presence.v1.json \ --lastmod "$(date -u +%F)" \ - --output-root .local/site + --workspace-output-root "$EMULEBB_WORKSPACE_OUTPUT_ROOT" \ + --output-root "$EMULEBB_WORKSPACE_OUTPUT_ROOT/artifacts/public-presence/${{ github.run_id }}-${{ github.run_attempt }}/site" - name: Validate site and documentation links run: | - python .local/emulebb-tooling/helpers/pages-site-tools.py --pages-root .local/site validate - python .local/emulebb-tooling/helpers/check-tooling-doclinks.py \ - --docs-root .local/emulebb-tooling/docs \ - .local/site + site="$EMULEBB_WORKSPACE_OUTPUT_ROOT/artifacts/public-presence/${{ github.run_id }}-${{ github.run_attempt }}/site" + python -B ../emulebb-tooling/helpers/pages-site-tools.py --pages-root "$site" validate + python -B ../emulebb-tooling/helpers/check-tooling-doclinks.py \ + --docs-root ../emulebb-tooling/docs \ + "$site" - name: Verify stable installer checksum - working-directory: .local/site + working-directory: ${{ runner.temp }}/emulebb-output/artifacts/public-presence/${{ github.run_id }}-${{ github.run_attempt }}/site run: sha256sum --check install.ps1.sha256 - name: Configure GitHub Pages if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' }} - uses: actions/configure-pages@v6 + uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6 - name: Upload GitHub Pages artifact if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' }} - uses: actions/upload-pages-artifact@v5 + uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5 with: - path: .local/site + path: ${{ runner.temp }}/emulebb-output/artifacts/public-presence/${{ github.run_id }}-${{ github.run_attempt }}/site deploy: name: Deploy organization website if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' }} needs: build - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 + timeout-minutes: 10 env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true' permissions: @@ -100,4 +123,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v5 + uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5 diff --git a/AGENTS.md b/AGENTS.md index d71c5f7..984ecf3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,11 +13,12 @@ edition. Everything below is this repo's local deltas only. ## Hard Rules -- Keep every HTML page text-only. Do not publish in-page logos, mascots, - screenshots, copied application artwork, or other raster assets. The browser - favicon at `assets/brand/emulebb-favicon.ico` is the only image exception. -- Use the text wordmark `eMuleBB` in page headers. Do not add logo or image - fields to metadata or structured data unless this policy changes first. +- Use the `eMuleBB` text wordmark with only the operator-approved proposal-1 + Rust donkey assets recorded in the public-presence contract. Do not publish + screenshots, unrelated artwork, or unapproved image variants. +- Give approved in-page images explicit dimensions and appropriate alt text. + The approved social card may appear in Open Graph/Twitter metadata. Keep the + favicon at `assets/brand/emulebb-favicon.ico`; do not regenerate brand assets. - Treat `emulebb-tooling` active/reference docs as the source of truth. Pages summarizes and links; it does not invent feature or release facts. - Treat `..\emulebb-tooling\manifests\public-presence.v1.json` as the source @@ -56,8 +57,9 @@ edition. Everything below is this repo's local deltas only. pages and `python tools\render_pages.py --lastmod YYYY-MM-DD --check` to confirm committed HTML is up to date with the templates and public-presence contract. -- Use `python tools\render_pages.py --lastmod YYYY-MM-DD --output-root - .local\site` to stage the bounded deployment artifact. +- The supported manager stages deployment artifacts below inherited + `EMULEBB_WORKSPACE_OUTPUT_ROOT`; the renderer refuses source-local staging. + `--capabilities` advertises the supported output protocol without writing. - Use `python ..\emulebb-tooling\helpers\pages-site-tools.py --pages-root . validate` before publishing locale, metadata, sitemap, asset-policy, or navigation changes. diff --git a/README.md b/README.md index 2cbb3aa..3fafeb1 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,17 @@ # eMuleBB organization website -This repository publishes the organization GitHub Pages site. The public front -door presents CI-gated `emulebb-rust` nightly builds as the primary active-beta -testing channel and eMuleBB MFC `0.7.x` as the maintained Windows line. Beta 3 -is expected after a few more weeks of implementation and stabilization. Rust -development is best-effort, and contributors are welcome. +The public front door for eMuleBB Rust gives equal space to using the client +and developing with its REST API. CI-gated nightly packages are the active-beta +testing channel; Beta 3 is the next development target. + +**Contents:** [Read the site](#read-the-site) · [Maintain the source](#static-page-production) · [Validate and publish](#validation-and-publication) + +## Read the site + +- [Use eMuleBB Rust](https://emulebb.github.io/emulebb-tooling/products/emulebb-rust/reference/GUIDE-GETTING-STARTED/) +- [Choose a platform and package](https://emulebb.github.io/emulebb-tooling/products/emulebb-rust/reference/GUIDE-DOWNLOADS-PLATFORMS/) +- [Develop with the client](https://emulebb.github.io/emulebb-tooling/products/emulebb-rust/reference/GUIDE-CONTRIBUTING/) +- [Build against the REST API](https://emulebb.github.io/emulebb-tooling/products/emulebb-rust/api/GUIDE-API-CONSUMERS/) The homepage is the single canonical product page. `/rust/` is retained only as a no-index compatibility redirect. Only the homepage and FAQ have localized @@ -22,25 +29,34 @@ fallback, but source edits go through the Jinja2 renderer and the shared `emulebb-tooling\manifests\public-presence.v1.json` contract: ```powershell -python -m pip install -r requirements.txt -python ..\emulebb-tooling\helpers\public-presence.py validate +python -B ..\emulebb-tooling\helpers\public-presence.py validate $lastmod = Get-Date -Format yyyy-MM-dd -python tools\render_pages.py --lastmod $lastmod -python tools\render_pages.py --lastmod $lastmod --check -python tools\render_pages.py --lastmod $lastmod --output-root .local\site +python -B tools\render_pages.py --lastmod $lastmod +python -B tools\render_pages.py --lastmod $lastmod --check ``` Run the validation helper before publishing: ```powershell -python ..\emulebb-tooling\helpers\pages-site-tools.py --pages-root .local\site validate -python ..\emulebb-tooling\helpers\check-tooling-doclinks.py --docs-root ..\emulebb-tooling\docs .local\site +python -B ..\emulebb-tooling\helpers\pages-site-tools.py --pages-root . validate +python -B ..\emulebb-tooling\helpers\check-tooling-doclinks.py --docs-root ..\emulebb-tooling\docs . ``` -`.github/workflows/pages.yml` repeats these checks, verifies -`install.ps1.sha256`, uploads only `.local/site`, and deploys through GitHub -Pages Actions on `main`. Scheduled runs validate contract drift without -publishing. +## Validation and publication + +The workspace manager probes `tools/render_pages.py --capabilities` and stages +the site in a fresh owned `OUTPUT/artifacts/public-presence//site` +directory. Explicit staging requires both `--output-root` and +`--workspace-output-root`; the latter must match the inherited output boundary. +Existing site directories and redirected paths are refused. Keep generated +scratch outside the checkout and leave inherited workspace variables unchanged. + +The proposal-1 identity derivatives are supplied assets. Preserve their bytes, +dimensions and recorded SHA-256 values; do not regenerate them. + +`.github/workflows/pages.yml` repeats the checks, verifies +`install.ps1.sha256`, uploads only the staged site, and deploys through GitHub +Pages Actions on `main`. Scheduled runs validate without publishing. ## Markdown Documentation Publishing diff --git a/ar-ae/faq/index.html b/ar-ae/faq/index.html index 11cff40..ea33bb4 100644 --- a/ar-ae/faq/index.html +++ b/ar-ae/faq/index.html @@ -1,5 +1,5 @@ - + @@ -110,8 +110,9 @@ +