From a2d453d5f9439da3ce87fdd513250508a340df01 Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 12:21:52 +0530 Subject: [PATCH 01/12] ci: configure multi-OS testing matrix for Linux, Windows, and macOS --- .github/workflows/ci.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 65f74cc..c618b9b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,8 +11,13 @@ permissions: jobs: validate: - name: Lint & Verify - runs-on: ubuntu-latest + name: Lint & Verify (${{ matrix.os }}, Python ${{ matrix.python-version }}) + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + python-version: ["3.11", "3.12"] + runs-on: ${{ matrix.os }} timeout-minutes: 10 steps: @@ -24,7 +29,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: ${{ matrix.python-version }} - name: Verify accessible SVG contract run: python3 scripts/test-lint-a11y.py From a38ebd6616c7d56f7d0b4ff932685598849f528c Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 12:22:13 +0530 Subject: [PATCH 02/12] ci: standardize cross-platform Python executable invocation across runners --- .github/workflows/ci.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c618b9b..ec0a4db 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,19 +32,20 @@ jobs: python-version: ${{ matrix.python-version }} - name: Verify accessible SVG contract - run: python3 scripts/test-lint-a11y.py + run: python scripts/test-lint-a11y.py - name: Run skin linter - run: python3 scripts/lint-skin.py --all --baseline + run: python scripts/lint-skin.py --all --baseline - name: Verify sequence OAuth specs - run: python3 scripts/verify-sequence-oauth.py + run: python scripts/verify-sequence-oauth.py - name: Verify draw.io import script - run: python3 scripts/verify-drawio-import.py + run: python scripts/verify-drawio-import.py - name: Verify Mermaid import script - run: python3 scripts/verify-mermaid-import.py + run: python scripts/verify-mermaid-import.py + - name: Verify generated icon assets run: | From c96cb2cabc5157a5fa07058f096e6719d1293bc5 Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 12:22:30 +0530 Subject: [PATCH 03/12] ci: add OS-aware Playwright browser provisioning step for matrix runners --- .github/workflows/ci.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec0a4db..e423ea8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,10 +46,20 @@ jobs: - name: Verify Mermaid import script run: python scripts/verify-mermaid-import.py + - name: Install Playwright & Chromium + shell: bash + run: | + python -m pip install playwright + if [ "${{ runner.os }}" = "Linux" ]; then + python -m playwright install --with-deps chromium + else + python -m playwright install chromium + fi - name: Verify generated icon assets + shell: bash run: | - python3 scripts/build-icons.py + python scripts/build-icons.py git diff --ignore-space-at-eol --exit-code -- \ skills/diagram-design/assets/icons.html \ skills/diagram-design/references/primitive-icons.md From 11559e0a3b99a14379d0a5266bbc12821edcebeb Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 12:22:49 +0530 Subject: [PATCH 04/12] ci: add automated visual artifact packaging and upload on linter failures --- .github/workflows/ci.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e423ea8..1cd2950 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,3 +63,12 @@ jobs: git diff --ignore-space-at-eol --exit-code -- \ skills/diagram-design/assets/icons.html \ skills/diagram-design/references/primitive-icons.md + + - name: Upload linter failure artifacts + if: failure() + uses: actions/upload-artifact@v4 + with: + name: linter-failure-artifacts-${{ matrix.os }}-python-${{ matrix.python-version }} + path: | + scripts/fixtures/ + skills/diagram-design/assets/ From 5076d38a97f175732b39e625c745aec8301caf87 Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 12:23:06 +0530 Subject: [PATCH 05/12] docs(ci): document multi-OS matrix strategy and visual failure artifact reporting --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f9b938e..7879883 100644 --- a/README.md +++ b/README.md @@ -361,7 +361,7 @@ If you touch the Mermaid import path, `python3 scripts/verify-mermaid-import.py` it covers all supported grammars, multi-block Markdown, adversarial labels, trust-boundary behavior, resource caps, named failures, and reference/command wiring. -All pull requests and pushes are automatically validated via GitHub Actions CI (`.github/workflows/ci.yml`). +All pull requests and pushes are automatically validated across Linux, Windows, and macOS runners via GitHub Actions CI (`.github/workflows/ci.yml`). Failure artifacts are automatically packaged and uploaded for visual debugging. ### What loads when From 58fc09269bced720631fca157a3f5d20422205f9 Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 12:57:30 +0530 Subject: [PATCH 06/12] fix(ci): set PYTHONIOENCODING utf-8 environment variable for Windows matrix runners --- .github/workflows/ci.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1cd2950..f7df632 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,9 @@ on: permissions: contents: read +env: + PYTHONIOENCODING: utf-8 + jobs: validate: name: Lint & Verify (${{ matrix.os }}, Python ${{ matrix.python-version }}) @@ -46,6 +49,9 @@ jobs: - name: Verify Mermaid import script run: python scripts/verify-mermaid-import.py + - name: Verify onboarding CLI script + run: python scripts/verify-onboarding.py + - name: Install Playwright & Chromium shell: bash run: | @@ -56,6 +62,9 @@ jobs: python -m playwright install chromium fi + - name: Verify render layout validator self-test + run: python scripts/lint-render.py --self-test + - name: Verify generated icon assets shell: bash run: | From e46196a007a5618e19cd320b83f323365b5c34e9 Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 13:10:30 +0530 Subject: [PATCH 07/12] fix(ci): wrap optional feature scripts in file presence checks for independent PR branches --- .github/workflows/ci.yml | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f7df632..86f31db 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,21 +49,31 @@ jobs: - name: Verify Mermaid import script run: python scripts/verify-mermaid-import.py - - name: Verify onboarding CLI script - run: python scripts/verify-onboarding.py - - - name: Install Playwright & Chromium + - name: Verify onboarding CLI script (if present) shell: bash run: | - python -m pip install playwright - if [ "${{ runner.os }}" = "Linux" ]; then - python -m playwright install --with-deps chromium - else - python -m playwright install chromium + if [ -f scripts/verify-onboarding.py ]; then + python scripts/verify-onboarding.py fi - - name: Verify render layout validator self-test - run: python scripts/lint-render.py --self-test + - name: Install Playwright & Chromium (if linter present) + shell: bash + run: | + if [ -f scripts/lint-render.py ]; then + python -m pip install playwright + if [ "${{ runner.os }}" = "Linux" ]; then + python -m playwright install --with-deps chromium + else + python -m playwright install chromium + fi + fi + + - name: Verify render layout validator self-test (if present) + shell: bash + run: | + if [ -f scripts/lint-render.py ]; then + python scripts/lint-render.py --self-test + fi - name: Verify generated icon assets shell: bash From f73ef478cc0ffc649d1b2a124acd3be5c69794f3 Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 13:12:49 +0530 Subject: [PATCH 08/12] fix(ci): fix Windows line-ending CRLF diff issues in build-icons script and git checkout --- .github/workflows/ci.yml | 3 +++ scripts/build-icons.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 86f31db..212f01c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,9 @@ jobs: with: persist-credentials: false + - name: Configure git line endings + run: git config --global core.autocrlf false + - name: Set up Python uses: actions/setup-python@v5 with: diff --git a/scripts/build-icons.py b/scripts/build-icons.py index b191b2a..4ee8d63 100644 --- a/scripts/build-icons.py +++ b/scripts/build-icons.py @@ -566,11 +566,11 @@ def main() -> int: md_chunks, gallery_chunks, misses = build() MD_OUT.parent.mkdir(parents=True, exist_ok=True) - MD_OUT.write_text("".join(md_chunks), encoding="utf-8") + MD_OUT.write_bytes("".join(md_chunks).replace("\r\n", "\n").encode("utf-8")) HTML_OUT.parent.mkdir(parents=True, exist_ok=True) html = GALLERY_TEMPLATE.replace("{SECTIONS}", "\n".join(gallery_chunks)) - HTML_OUT.write_text(html, encoding="utf-8") + HTML_OUT.write_bytes(html.replace("\r\n", "\n").encode("utf-8")) total = sum(len(items) for items in ICONS.values()) print(f"\nDone. {total - len(misses)}/{total} fetched.", file=sys.stderr) From 5f3aa8fddac2f2e43d80c12820cfad18dfd05b50 Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 13:20:58 +0530 Subject: [PATCH 09/12] fix(ci): enable Python UTF-8 mode globally and enforce utf-8 encoding in subprocess verify scripts for Windows --- .github/workflows/ci.yml | 1 + scripts/verify-drawio-import.py | 2 ++ scripts/verify-mermaid-import.py | 2 ++ 3 files changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 212f01c..6eeb8fe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,7 @@ permissions: env: PYTHONIOENCODING: utf-8 + PYTHONUTF8: "1" jobs: validate: diff --git a/scripts/verify-drawio-import.py b/scripts/verify-drawio-import.py index c8e0ecc..bb27586 100644 --- a/scripts/verify-drawio-import.py +++ b/scripts/verify-drawio-import.py @@ -48,6 +48,8 @@ def run_extract(args: list[str]) -> str: [sys.executable, str(EXTRACT), *args], capture_output=True, text=True, + encoding="utf-8", + errors="replace", ) if proc.returncode != 0: fail(f"extractor exited {proc.returncode} for {args}: {proc.stderr.strip()}") diff --git a/scripts/verify-mermaid-import.py b/scripts/verify-mermaid-import.py index 78418e1..969bfa9 100644 --- a/scripts/verify-mermaid-import.py +++ b/scripts/verify-mermaid-import.py @@ -43,6 +43,8 @@ def invoke(args: list[str]) -> subprocess.CompletedProcess[str]: [sys.executable, str(EXTRACT), *args], capture_output=True, text=True, + encoding="utf-8", + errors="replace", ) From b337d0fcf48e5cf1dcbb9f78523e3d10ad4d6cc7 Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 13:25:34 +0530 Subject: [PATCH 10/12] ci: add GitHub Step Summary table generation for matrix run results --- .github/workflows/ci.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6eeb8fe..14e3fbd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,3 +95,17 @@ jobs: path: | scripts/fixtures/ skills/diagram-design/assets/ + + - name: Generate CI execution summary table + if: always() + shell: bash + run: | + echo "### 📊 CI Verification Summary (${{ matrix.os }}, Python ${{ matrix.python-version }})" >> $GITHUB_STEP_SUMMARY + echo "| Verification Gate | Status |" >> $GITHUB_STEP_SUMMARY + echo "|---|---|" >> $GITHUB_STEP_SUMMARY + echo "| SVG Accessibility Contract | ✅ Passed |" >> $GITHUB_STEP_SUMMARY + echo "| Color Palette & Skin Linter | ✅ Passed |" >> $GITHUB_STEP_SUMMARY + echo "| Sequence Diagram Grammar | ✅ Passed |" >> $GITHUB_STEP_SUMMARY + echo "| Draw.io Import Extractor | ✅ Passed |" >> $GITHUB_STEP_SUMMARY + echo "| Mermaid Import Extractor | ✅ Passed |" >> $GITHUB_STEP_SUMMARY + echo "| Primitive Icons & Documentation | ✅ Passed |" >> $GITHUB_STEP_SUMMARY From 8fed3d26b40f7231d0c0104846a99cd7ba59fd01 Mon Sep 17 00:00:00 2001 From: Praveen Bishnoi Date: Wed, 12 Aug 2026 14:12:06 +0530 Subject: [PATCH 11/12] fix(ci): address maintainer review feedback with checkout ordering, dynamic outcomes, and Playwright screenshots --- .github/workflows/ci.yml | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14e3fbd..652b45b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,38 +22,45 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] python-version: ["3.11", "3.12"] runs-on: ${{ matrix.os }} - timeout-minutes: 10 + timeout-minutes: 20 steps: - name: Checkout repository uses: actions/checkout@v4 + env: + GIT_CONFIG_COUNT: "1" + GIT_CONFIG_KEY_0: "core.autocrlf" + GIT_CONFIG_VALUE_0: "false" with: persist-credentials: false - - name: Configure git line endings - run: git config --global core.autocrlf false - - name: Set up Python uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Verify accessible SVG contract + id: a11y run: python scripts/test-lint-a11y.py - name: Run skin linter + id: skin run: python scripts/lint-skin.py --all --baseline - name: Verify sequence OAuth specs + id: oauth run: python scripts/verify-sequence-oauth.py - name: Verify draw.io import script + id: drawio run: python scripts/verify-drawio-import.py - name: Verify Mermaid import script + id: mermaid run: python scripts/verify-mermaid-import.py - name: Verify onboarding CLI script (if present) + id: onboard shell: bash run: | if [ -f scripts/verify-onboarding.py ]; then @@ -61,6 +68,7 @@ jobs: fi - name: Install Playwright & Chromium (if linter present) + id: playwright_install shell: bash run: | if [ -f scripts/lint-render.py ]; then @@ -73,13 +81,15 @@ jobs: fi - name: Verify render layout validator self-test (if present) + id: lint_render shell: bash run: | if [ -f scripts/lint-render.py ]; then - python scripts/lint-render.py --self-test + python scripts/lint-render.py --self-test --screenshot-dir failure-screenshots fi - name: Verify generated icon assets + id: icons shell: bash run: | python scripts/build-icons.py @@ -93,6 +103,7 @@ jobs: with: name: linter-failure-artifacts-${{ matrix.os }}-python-${{ matrix.python-version }} path: | + failure-screenshots/ scripts/fixtures/ skills/diagram-design/assets/ @@ -101,11 +112,11 @@ jobs: shell: bash run: | echo "### 📊 CI Verification Summary (${{ matrix.os }}, Python ${{ matrix.python-version }})" >> $GITHUB_STEP_SUMMARY - echo "| Verification Gate | Status |" >> $GITHUB_STEP_SUMMARY + echo "| Verification Gate | Outcome |" >> $GITHUB_STEP_SUMMARY echo "|---|---|" >> $GITHUB_STEP_SUMMARY - echo "| SVG Accessibility Contract | ✅ Passed |" >> $GITHUB_STEP_SUMMARY - echo "| Color Palette & Skin Linter | ✅ Passed |" >> $GITHUB_STEP_SUMMARY - echo "| Sequence Diagram Grammar | ✅ Passed |" >> $GITHUB_STEP_SUMMARY - echo "| Draw.io Import Extractor | ✅ Passed |" >> $GITHUB_STEP_SUMMARY - echo "| Mermaid Import Extractor | ✅ Passed |" >> $GITHUB_STEP_SUMMARY - echo "| Primitive Icons & Documentation | ✅ Passed |" >> $GITHUB_STEP_SUMMARY + echo "| SVG Accessibility Contract | ${{ steps.a11y.outcome == 'success' && '✅ Passed' || (steps.a11y.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY + echo "| Color Palette & Skin Linter | ${{ steps.skin.outcome == 'success' && '✅ Passed' || (steps.skin.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY + echo "| Sequence Diagram Grammar | ${{ steps.oauth.outcome == 'success' && '✅ Passed' || (steps.oauth.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY + echo "| Draw.io Import Extractor | ${{ steps.drawio.outcome == 'success' && '✅ Passed' || (steps.drawio.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY + echo "| Mermaid Import Extractor | ${{ steps.mermaid.outcome == 'success' && '✅ Passed' || (steps.mermaid.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY + echo "| Primitive Icons & Documentation | ${{ steps.icons.outcome == 'success' && '✅ Passed' || (steps.icons.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY From 86dda261a3a80cc040480778bb24570929a8a224 Mon Sep 17 00:00:00 2001 From: Cathryn Lavery Date: Wed, 12 Aug 2026 10:08:08 -0700 Subject: [PATCH 12/12] ci: align matrix with current verification gates --- .github/workflows/ci.yml | 51 +++++++--------------------------------- CONTRIBUTING.md | 4 ++-- README.md | 2 +- scripts/build-icons.py | 4 ++-- 4 files changed, 14 insertions(+), 47 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c2d6d5..d71447c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,13 +44,16 @@ jobs: run: python scripts/test-lint-a11y.py - name: Verify URL SVG normalization - run: python3 scripts/test-build-icons-quoted-attributes.py + id: url_icons + run: python scripts/test-build-icons-quoted-attributes.py - name: Verify Devicon normalization - run: python3 scripts/test-build-icons-devicon.py + id: devicon + run: python scripts/test-build-icons-devicon.py - name: Verify mojibake repair utility - run: python3 scripts/test-fix-mojibake.py + id: mojibake + run: python scripts/test-fix-mojibake.py - name: Run skin linter id: skin @@ -68,35 +71,6 @@ jobs: id: mermaid run: python scripts/verify-mermaid-import.py - - name: Verify onboarding CLI script (if present) - id: onboard - shell: bash - run: | - if [ -f scripts/verify-onboarding.py ]; then - python scripts/verify-onboarding.py - fi - - - name: Install Playwright & Chromium (if linter present) - id: playwright_install - shell: bash - run: | - if [ -f scripts/lint-render.py ]; then - python -m pip install playwright - if [ "${{ runner.os }}" = "Linux" ]; then - python -m playwright install --with-deps chromium - else - python -m playwright install chromium - fi - fi - - - name: Verify render layout validator self-test (if present) - id: lint_render - shell: bash - run: | - if [ -f scripts/lint-render.py ]; then - python scripts/lint-render.py --self-test --screenshot-dir failure-screenshots - fi - - name: Verify generated icon assets id: icons shell: bash @@ -106,16 +80,6 @@ jobs: skills/diagram-design/assets/icons.html \ skills/diagram-design/references/primitive-icons.md - - name: Upload linter failure artifacts - if: failure() - uses: actions/upload-artifact@v4 - with: - name: linter-failure-artifacts-${{ matrix.os }}-python-${{ matrix.python-version }} - path: | - failure-screenshots/ - scripts/fixtures/ - skills/diagram-design/assets/ - - name: Generate CI execution summary table if: always() shell: bash @@ -124,6 +88,9 @@ jobs: echo "| Verification Gate | Outcome |" >> $GITHUB_STEP_SUMMARY echo "|---|---|" >> $GITHUB_STEP_SUMMARY echo "| SVG Accessibility Contract | ${{ steps.a11y.outcome == 'success' && '✅ Passed' || (steps.a11y.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY + echo "| URL SVG Normalization | ${{ steps.url_icons.outcome == 'success' && '✅ Passed' || (steps.url_icons.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY + echo "| Devicon Normalization | ${{ steps.devicon.outcome == 'success' && '✅ Passed' || (steps.devicon.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY + echo "| Mojibake Repair Utility | ${{ steps.mojibake.outcome == 'success' && '✅ Passed' || (steps.mojibake.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY echo "| Color Palette & Skin Linter | ${{ steps.skin.outcome == 'success' && '✅ Passed' || (steps.skin.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY echo "| Sequence Diagram Grammar | ${{ steps.oauth.outcome == 'success' && '✅ Passed' || (steps.oauth.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY echo "| Draw.io Import Extractor | ${{ steps.drawio.outcome == 'success' && '✅ Passed' || (steps.drawio.outcome == 'skipped' && '⏭️ Skipped' || '❌ Failed') }} |" >> $GITHUB_STEP_SUMMARY diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e6e6e2d..3264c57 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,7 +19,7 @@ See [README.md](README.md) for the full picture, including the design system and - **Create an issue first** for anything non-trivial (new type, behavior change, import grammar work). Small fixes and docs can go straight to a PR. - **Work on a branch** — never commit directly to `main`. - **Keep the scope tight.** One PR = one concern. Mixing a new diagram type with a docs rewrite makes review slow. -- **Python 3.10+ is required** for the development scripts (CI runs 3.11). +- **Python 3.10+ is required** for the development scripts (CI runs 3.11 and 3.12 across Linux, Windows, and macOS). --- @@ -133,4 +133,4 @@ A good PR: ## Questions? -Open a discussion or comment on the relevant issue. If it's about security, use the private reporting path in [SECURITY.md](SECURITY.md). \ No newline at end of file +Open a discussion or comment on the relevant issue. If it's about security, use the private reporting path in [SECURITY.md](SECURITY.md). diff --git a/README.md b/README.md index e41ae32..181c55d 100644 --- a/README.md +++ b/README.md @@ -361,7 +361,7 @@ If you touch the Mermaid import path, `python3 scripts/verify-mermaid-import.py` it covers all supported grammars, multi-block Markdown, adversarial labels, trust-boundary behavior, resource caps, named failures, and reference/command wiring. -All pull requests and pushes are automatically validated across Linux, Windows, and macOS runners via GitHub Actions CI (`.github/workflows/ci.yml`). Failure artifacts are automatically packaged and uploaded for visual debugging. +All pull requests and pushes are automatically validated across Linux, Windows, and macOS runners via GitHub Actions CI (`.github/workflows/ci.yml`). ### What loads when diff --git a/scripts/build-icons.py b/scripts/build-icons.py index b146842..5cca93f 100644 --- a/scripts/build-icons.py +++ b/scripts/build-icons.py @@ -600,11 +600,11 @@ def main() -> int: md_chunks, gallery_chunks, misses = build() MD_OUT.parent.mkdir(parents=True, exist_ok=True) - MD_OUT.write_bytes("".join(md_chunks).replace("\r\n", "\n").encode("utf-8")) + MD_OUT.write_text("".join(md_chunks), encoding="utf-8") HTML_OUT.parent.mkdir(parents=True, exist_ok=True) html = GALLERY_TEMPLATE.replace("{SECTIONS}", "\n".join(gallery_chunks)) - HTML_OUT.write_bytes(html.replace("\r\n", "\n").encode("utf-8")) + HTML_OUT.write_text(html, encoding="utf-8") total = sum(len(items) for items in ICONS.values()) print(f"\nDone. {total - len(misses)}/{total} fetched.", file=sys.stderr)