chore(tooling): replace Node markdown tooling with rumdl#394
Conversation
- Switch Markdown checks and Codacy configuration from markdownlint/npx to rumdl. - Add dprint/pretty_yaml YAML formatting and wire yaml-check/yaml-fix through dprint plus yamllint. - Format generated changelog archives with rumdl after git-cliff postprocessing. - Add Semgrep guards for check-before-fix docs and pinned, allowlisted GitHub Actions.
Up to standards ✅🟢 Issues
|
| Metric | Results |
|---|---|
| Complexity | 46 |
🟢 Coverage ∅ diff coverage · +0.00% coverage variation
Metric Results Coverage variation ✅ +0.00% coverage variation (-1.00%) Diff coverage ✅ ∅ diff coverage Coverage variation details
Coverable lines Covered lines Coverage Common ancestor commit (48935d5) 61626 55767 90.49% Head commit (5e32561) 61626 (+0) 55768 (+1) 90.49% (+0.00%) Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch:
<coverage of head commit> - <coverage of common ancestor commit>Diff coverage details
Coverable lines Covered lines Diff coverage Pull request (#394) 0 0 ∅ (not applicable) Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified:
<covered lines added or modified>/<coverable lines added or modified> * 100%
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (1)
WalkthroughRepository-wide migration from Node-based Markdown/YAML tooling to rumdl/dprint; CI and justfile updated to install/pin new tools; changelog postprocessing and archive normalization refactored (with tests); Semgrep rules and fixtures added; extensive docs and archive formatting edits and small config tweaks. ChangesNode→Rust Documentation and Config Tool Migration
Estimated code review effort 🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related issues
Possibly related PRs
✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Actionable comments posted: 7
🤖 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.
Inline comments:
In `@CODE_OF_CONDUCT.md`:
- Line 148: The mailto link reference labeled "[maintainer]" is malformed: it
currently uses mailto:<adam@adamgetchell.org> which is invalid Markdown; update
the reference for the "[maintainer]" link (the link target for the maintainer
reference) to a valid URI such as mailto:adam@adamgetchell.org or wrap the
entire URI in angle brackets e.g. <mailto:adam@adamgetchell.org> so Markdown
parsers resolve the contact link correctly.
In `@CONTRIBUTING.md`:
- Line 1232: Update the reference-style link target for [maintainer-email] so
the entire URI is wrapped in angle brackets; replace the current malformed
mailto:<adam@adamgetchell.org> with the correct form
<mailto:adam@adamgetchell.org> so Markdown treats it as a valid mailto URI for
the [maintainer-email] reference.
In `@docs/archive/changelog/0.5.md`:
- Around line 330-352: Several in-entry headings (e.g., "Duplicate Vertex
Handling", "Property Test Improvements", "Serialization Test Fixes", "New
Property Tests") are using level-2/level-3 marks inside an existing release
subsection; update those heading markers from `##` or `###` to `####` (or
convert to bullet/list text) so they are demoted to level-4 and preserve
changelog hierarchy and lint rules; apply the same demotion to the other
indicated sections (around the ranges noted in the review: 403-428, 437-450,
469-494, 520-550, 563-575) ensuring each in-entry heading now uses `####` or
list form.
In `@docs/archive/phase_3c_action_plan.md`:
- Around line 193-198: The Markdown table in
docs/archive/phase_3c_action_plan.md has inconsistent column counts because each
row ends with an extra trailing empty cell ("| |") while the header already
accounts for the leading empty column; fix this by removing the trailing empty
"| |" from the header and each row (the lines showing "Task 1:
InsertionAlgorithm trait", "Task 2: ConvexHull module", "Task 3: Test updates",
"Test consolidation", and the "**Total**" row) so all rows have the same number
of pipe-separated columns and the table renders correctly.
In `@docs/numerical_robustness_guide.md`:
- Line 268: The markdown line "computed during Hilbert index generation). It
removes the vast majority of exact and" exceeds the 80-char limit; wrap this
sentence into shorter lines (<=80 chars) so the markdown linter passes, e.g.,
break after a natural phrase boundary to create two lines (maintain original
wording and punctuation) in the paragraph where this text appears.
In `@semgrep.yaml`:
- Around line 615-618: Add explicit exclusions for the test fixtures to the
three action-policy Semgrep rules by excluding the tests/semgrep/** path in
their "exclude" or "paths-ignore" settings so the intentional violations in
tests/semgrep/.github/workflows/action_policy.yml are not scanned; update the
three rule blocks that reference "/.github/workflows/**/*.yml" or
"/.github/workflows/**/*.yaml" (the action-policy rule entries around the
include/patterns sections) to add the exclusion and then update
docs/dev/tooling-alignment.md with a brief comparison and rationale describing
why tests/semgrep/** is excluded from these rules.
- Around line 598-603: The current pattern-regex entries (the lines matching
"just fix" followed immediately by "just check", "just python-fix" / "just
python-check", etc.) fail when there are blank lines or comment-only lines
between commands; update each pattern-regex to use the DOTALL flag (?s) and
replace the strict immediate newline sequence with a construct that allows any
number of intermediate lines that are either blank or contain only comments
before the follow-up command. In practice, prepend (?s) to each pattern and
change the "\n\s*" separator between the "fix" and "check" halves to a
non-greedy match that accepts zero-or-more lines consisting only of whitespace
or comment tokens so patterns like the ones for "just fix"/"just check", "just
python-fix"/"just python-check", "just yaml-fix"/"just yaml-check", "just
markdown-fix"/"just markdown-check", "just toml-fix"/"just toml-check", and
"just shell-fix"/"just shell-check" will permit blank/comment lines in between.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yml
Review profile: CHILL
Plan: Pro
Run ID: 226b6706-7031-489a-9740-5d7adaa91e56
📒 Files selected for processing (41)
.codacy.yml.github/workflows/audit.yml.github/workflows/ci.yml.github/workflows/codacy.yml.github/workflows/profiling-benchmarks.yml.markdownlint.jsonAGENTS.mdCHANGELOG.mdCODE_OF_CONDUCT.mdCONTRIBUTING.mddocs/archive/OPTIMIZATION_ROADMAP.mddocs/archive/changelog/0.2.mddocs/archive/changelog/0.3.mddocs/archive/changelog/0.4.mddocs/archive/changelog/0.5.mddocs/archive/changelog/0.6.mddocs/archive/fix-delaunay.mddocs/archive/invariant_validation_plan.mddocs/archive/issue_120_investigation.mddocs/archive/issue_204_investigation.mddocs/archive/known_issues_4d_2026-04-23.mddocs/archive/optimization_recommendations_historical.mddocs/archive/phase2_bowyer_watson_optimization.mddocs/archive/phase4.mddocs/archive/phase_3a_implementation_guide.mddocs/archive/phase_3c_action_plan.mddocs/archive/topology_integration_design_historical.mddocs/code_organization.mddocs/dev/commands.mddocs/dev/tooling-alignment.mddocs/invariants.mddocs/numerical_robustness_guide.mddocs/validation.mddprint.jsonjustfilepyproject.tomlscripts/postprocess_changelog.pyscripts/tests/test_postprocess_changelog.pysemgrep.yamltests/semgrep/.github/workflows/action_policy.ymltests/semgrep/docs/command_order.sh
💤 Files with no reviewable changes (5)
- .markdownlint.json
- .github/workflows/profiling-benchmarks.yml
- .github/workflows/audit.yml
- .codacy.yml
- docs/archive/changelog/0.2.md
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #394 +/- ##
=======================================
Coverage 90.48% 90.48%
=======================================
Files 61 61
Lines 61422 61422
=======================================
+ Hits 55577 55578 +1
+ Misses 5845 5844 -1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
- Scope Codacy markdownlint to active Markdown docs while keeping the 120-column MD013 threshold managed in Codacy's Code Patterns UI. - Normalize CodeRabbit docstring review length to the same 120-column policy. - Teach changelog postprocessing to demote entry-local headings in existing archived changelogs without rewriting unrelated archive formatting. - Fix malformed mailto references, archived Markdown hierarchy, table structure, and Semgrep fixture exclusions that caused review noise.
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 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.
Inline comments:
In @.coderabbit.yml:
- Line 54: The docstrings.threshold value is set to 120 which violates the
schema's 0..100 bound; update the docstrings.threshold entry (the threshold: 120
line) to a valid integer within 0..100 (e.g., threshold: 100 or another
appropriate value) so the config passes schema validation and re-run validation
to confirm.
In `@CONTRIBUTING.md`:
- Line 577: The "Documentation Analysis" bullet is over 120 columns; edit that
Markdown list item so it wraps under 120 characters while preserving content and
formatting (keep the bold label and inline code markers for `rumdl` and
`pyproject.toml`); break the sentence into two lines (e.g., after "rumdl" or
before "`pyproject.toml`") to satisfy the markdown lint rule and ensure the
wrapped lines remain a single list item.
In `@docs/archive/changelog/0.5.md`:
- Line 558: The heading text contains asterisks causing Markdown lint MD037
errors; update the heading so the identifiers saturating_* and bbox_* are
rendered as inline code by wrapping each in backticks (e.g., `saturating_*` and
`bbox_*`) so the line reads "Documentation: Rename `saturating_*` helpers to
`bbox_*` and clarify float semantics" and avoids emphasis parsing.
- Line 544: The file contains a duplicate markdown heading "#### Performance
Optimization" which triggers MD024; locate the duplicated heading in
docs/archive/changelog/0.5.md and rename this instance to a distinct heading
(e.g., "#### Performance Improvements" or "#### Performance Optimizations -
Additional Changes") so the heading text is unique while preserving the same
semantic level.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: c0e1c5bc-b9f3-4e30-a98b-0b53c91cbad2
📒 Files selected for processing (14)
.codacy.yml.coderabbit.ymlCODE_OF_CONDUCT.mdCONTRIBUTING.mddocs/archive/changelog/0.5.mddocs/archive/phase_3c_action_plan.mddocs/dev/tooling-alignment.mddocs/numerical_robustness_guide.mdscripts/archive_changelog.pyscripts/postprocess_changelog.pyscripts/tests/test_archive_changelog.pyscripts/tests/test_postprocess_changelog.pysemgrep.yamltests/semgrep/docs/command_order.sh
✅ Files skipped from review due to trivial changes (3)
- CODE_OF_CONDUCT.md
- docs/numerical_robustness_guide.md
- docs/dev/tooling-alignment.md
🚧 Files skipped from review as they are similar to previous changes (3)
- docs/archive/phase_3c_action_plan.md
- tests/semgrep/docs/command_order.sh
- semgrep.yaml
- Normalize local Python, Markdown, YAML, and review line-length settings to the 160-column policy while keeping CodeRabbit docstring checks schema-valid. - Scope Codacy Bandit to production Python scripts so security checks skip test fixtures with intentional assertions. - Teach changelog postprocessing to preserve archive heading hierarchy and render wildcard helper names as inline code in generated changelog output.
- Scope Codacy Ruff to production Python scripts so script test fixtures do not produce pull-request quality findings. - Document that Codacy Python engines exclude scripts/tests while local and CI checks remain the source of truth for the full Python test suite.
There was a problem hiding this comment.
🧹 Nitpick comments (1)
.codacy.yml (1)
23-27: 💤 Low valueRemove redundant exclude_paths pattern from engine-specific configurations.
The pattern
scripts/tests/**is specified in both the top-levelexclude_paths(line 78) and engine-specific configurations forbandit(line 27) andruff(line 68). Since Codacy applies both top-level and engine-specific exclusions additively, this duplication has no functional effect. Consolidate by removing the engine-specificexclude_pathsentries and relying solely on the top-level configuration.🤖 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 @.codacy.yml around lines 23 - 27, Remove the redundant engine-specific exclude_paths entries under the bandit and ruff blocks and rely on the top-level exclude_paths instead; specifically, delete the exclude_paths key (and its value "scripts/tests/**") from the bandit and ruff sections in .codacy.yml so only the global exclude_paths remains, ensuring no functional change and eliminating duplication.
🤖 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 @.codacy.yml:
- Around line 23-27: Remove the redundant engine-specific exclude_paths entries
under the bandit and ruff blocks and rely on the top-level exclude_paths
instead; specifically, delete the exclude_paths key (and its value
"scripts/tests/**") from the bandit and ruff sections in .codacy.yml so only the
global exclude_paths remains, ensuring no functional change and eliminating
duplication.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yml
Review profile: CHILL
Plan: Pro
Run ID: 782429a9-c16b-4863-8f53-2185cf1fdc74
📒 Files selected for processing (2)
.codacy.ymldocs/dev/tooling-alignment.md
🚧 Files skipped from review as they are similar to previous changes (1)
- docs/dev/tooling-alignment.md
- Rely on the top-level Codacy exclusion for Python script tests instead of repeating the same path under individual Python engines. - Keep contributor tooling documentation wrapped for external Markdown review thresholds without changing the documented policy. - Make generated archived changelog headings distinct when historical entry-local body headings repeat within the same release section.
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
.codacy.yml (1)
17-17: 💤 Low valueClarify "Ruff/ty" reference.
The term "Ruff/ty" is ambiguous. Consider clarifying:
- If referring to type checking generally: "redundant with Ruff and type checking"
- If referring to a specific tool: "redundant with Ruff/Mypy" or "redundant with Ruff and mypy"
- If "ty" is intentional: add a brief explanation of what it refers to
This will help contributors understand which tools provide redundant coverage.
🤖 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 @.codacy.yml at line 17, Replace the ambiguous "Ruff/ty" phrase in the comment string "prospector, pylintpython3: redundant with Ruff/ty" with a clear reference to the tools or meanings intended; update it to either "redundant with Ruff and type checking" if you mean generic type checking, or "redundant with Ruff and mypy" (or "redundant with Ruff/Mypy") if you mean the specific Mypy tool, or add a brief parenthetical explanation if "ty" is intentional so contributors understand the exact overlap.
🤖 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.
Inline comments:
In @.codacy.yml:
- Around line 9-11: The comment in .codacy.yml listing "bandit" and
"markdownlint" as recommended enabled tools conflicts with CONTRIBUTING.md which
marks them disabled; reconcile by either updating the .codacy.yml comment to
indicate bandit and markdownlint are disabled (adjust the lines that currently
name bandit and markdownlint) or by editing CONTRIBUTING.md to remove them from
the "Disabled Tools" section and the "Codacy Markdownlint is disabled" note so
both files consistently state the tools' enabled/disabled status; ensure the
same tool names (bandit, markdownlint) appear identically in both files so
contributors see a single source of truth.
In `@CONTRIBUTING.md`:
- Around line 575-578: The CONTRIBUTING.md tool lists contradict .codacy.yml:
inspect .codacy.yml for the "Bandit" and "Markdownlint" entries (the Recommended
enabled tool blocks), then reconcile CONTRIBUTING.md's Enabled/Disabled Tools
section so it matches the repo config—either mark Bandit and Markdownlint as
enabled with a short parenthetical noting their configured
include/exclude/options from .codacy.yml, or update .codacy.yml to truly disable
them; ensure the Documentation Analysis line clarifies that Markdown checks use
rumdl per pyproject.toml if you choose to keep Markdownlint disabled.
---
Nitpick comments:
In @.codacy.yml:
- Line 17: Replace the ambiguous "Ruff/ty" phrase in the comment string
"prospector, pylintpython3: redundant with Ruff/ty" with a clear reference to
the tools or meanings intended; update it to either "redundant with Ruff and
type checking" if you mean generic type checking, or "redundant with Ruff and
mypy" (or "redundant with Ruff/Mypy") if you mean the specific Mypy tool, or add
a brief parenthetical explanation if "ty" is intentional so contributors
understand the exact overlap.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yml
Review profile: CHILL
Plan: Pro
Run ID: e38037ad-5f72-49f0-8773-e5525a466736
📒 Files selected for processing (6)
.codacy.ymlCHANGELOG.mdCONTRIBUTING.mddocs/archive/changelog/0.5.mdscripts/postprocess_changelog.pyscripts/tests/test_postprocess_changelog.py
✅ Files skipped from review due to trivial changes (1)
- docs/archive/changelog/0.5.md
🚧 Files skipped from review as they are similar to previous changes (2)
- scripts/tests/test_postprocess_changelog.py
- scripts/postprocess_changelog.py
- Mark bandit and markdownlint consistently as enabled in the Codacy contributor guidance to match the repository Codacy configuration. - Clarify that Codacy markdownlint is path-scoped in `.codacy.yml` while MD013 remains managed in the Codacy UI. - Spell out that Prospector and Pylint overlap with Ruff and ty type checking.
Closes #379