menard 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. menard-0.2.0/.claude/skills/audit.md +198 -0
  2. menard-0.2.0/.github/PULL_REQUEST_TEMPLATE.md +21 -0
  3. menard-0.2.0/.github/branding/BRANDING.md +30 -0
  4. menard-0.2.0/.github/branding/cover.png +0 -0
  5. menard-0.2.0/.github/branding/profile.png +0 -0
  6. menard-0.2.0/.github/branding/vector/default-monochrome-black.svg +1 -0
  7. menard-0.2.0/.github/branding/vector/default-monochrome-white.svg +1 -0
  8. menard-0.2.0/.github/branding/vector/default-monochrome.svg +1 -0
  9. menard-0.2.0/.github/dependabot.yml +26 -0
  10. menard-0.2.0/.github/workflows/ci.yml +48 -0
  11. menard-0.2.0/.github/workflows/docs.yml +49 -0
  12. menard-0.2.0/.github/workflows/release.yml +106 -0
  13. menard-0.2.0/.gitignore +51 -0
  14. menard-0.2.0/.menard/donttouch +21 -0
  15. menard-0.2.0/.menard/links.toml +51 -0
  16. menard-0.2.0/.pre-commit-config.yaml +49 -0
  17. menard-0.2.0/.python-version +1 -0
  18. menard-0.2.0/CHANGELOG.md +139 -0
  19. menard-0.2.0/CLAUDE.md +84 -0
  20. menard-0.2.0/LICENSE +201 -0
  21. menard-0.2.0/PKG-INFO +59 -0
  22. menard-0.2.0/README.md +49 -0
  23. menard-0.2.0/docs/assets/favicon.png +0 -0
  24. menard-0.2.0/docs/assets/logo-white.svg +1 -0
  25. menard-0.2.0/docs/assets/menard-logo/cover.png +0 -0
  26. menard-0.2.0/docs/assets/menard-logo/info.txt +11 -0
  27. menard-0.2.0/docs/assets/menard-logo/profile.png +0 -0
  28. menard-0.2.0/docs/assets/menard-logo/vector/default-monochrome-black.svg +1 -0
  29. menard-0.2.0/docs/assets/menard-logo/vector/default-monochrome-white.svg +1 -0
  30. menard-0.2.0/docs/assets/menard-logo/vector/default-monochrome.svg +1 -0
  31. menard-0.2.0/docs/cli/reference.md +506 -0
  32. menard-0.2.0/docs/configuration.md +217 -0
  33. menard-0.2.0/docs/contributing.md +27 -0
  34. menard-0.2.0/docs/getting-started.md +172 -0
  35. menard-0.2.0/docs/index.md +126 -0
  36. menard-0.2.0/docs/skills.md +56 -0
  37. menard-0.2.0/docs/stylesheets/extra.css +23 -0
  38. menard-0.2.0/mkdocs.yml +66 -0
  39. menard-0.2.0/pyproject.toml +102 -0
  40. menard-0.2.0/src/menard/__init__.py +1 -0
  41. menard-0.2.0/src/menard/cache.py +123 -0
  42. menard-0.2.0/src/menard/cli.py +1655 -0
  43. menard-0.2.0/src/menard/config.py +51 -0
  44. menard-0.2.0/src/menard/coverage.py +293 -0
  45. menard-0.2.0/src/menard/donttouch.py +397 -0
  46. menard-0.2.0/src/menard/graph.py +100 -0
  47. menard-0.2.0/src/menard/hook.py +288 -0
  48. menard-0.2.0/src/menard/imports.py +226 -0
  49. menard-0.2.0/src/menard/reviewed.py +163 -0
  50. menard-0.2.0/src/menard/sections.py +139 -0
  51. menard-0.2.0/src/menard/staleness.py +602 -0
  52. menard-0.2.0/src/menard/symbols.py +288 -0
  53. menard-0.2.0/src/menard/toml_links.py +207 -0
  54. menard-0.2.0/tests/__init__.py +0 -0
  55. menard-0.2.0/tests/conftest.py +0 -0
  56. menard-0.2.0/tests/test_auto_generated.py +444 -0
  57. menard-0.2.0/tests/test_cache.py +72 -0
  58. menard-0.2.0/tests/test_cli_fix.py +767 -0
  59. menard-0.2.0/tests/test_cli_simple.py +210 -0
  60. menard-0.2.0/tests/test_config.py +85 -0
  61. menard-0.2.0/tests/test_detect_source.py +395 -0
  62. menard-0.2.0/tests/test_donttouch.py +334 -0
  63. menard-0.2.0/tests/test_graph.py +172 -0
  64. menard-0.2.0/tests/test_hook_simple.py +95 -0
  65. menard-0.2.0/tests/test_imports.py +298 -0
  66. menard-0.2.0/tests/test_integration_toml.py +235 -0
  67. menard-0.2.0/tests/test_reviewed.py +336 -0
  68. menard-0.2.0/tests/test_sections.py +284 -0
  69. menard-0.2.0/tests/test_staleness.py +165 -0
  70. menard-0.2.0/tests/test_staleness_enriched.py +401 -0
  71. menard-0.2.0/tests/test_symbols.py +217 -0
  72. menard-0.2.0/tests/test_toml_links.py +250 -0
  73. menard-0.2.0/uv.lock +1062 -0
@@ -0,0 +1,198 @@
1
+ # menard audit
2
+
3
+ Analyze documentation for menard trackability and suggest improvements.
4
+
5
+ ## When to Use
6
+
7
+ Use this skill when:
8
+ - Onboarding a new repo to menard (`menard init` → `menard audit`)
9
+ - Periodic health checks on documentation coverage
10
+ - After adding new docs that need links.toml entries
11
+ - When docs feel "messy" and need restructuring for trackability
12
+
13
+ ## What This Skill Does
14
+
15
+ Score docs on **deterministic verifiability** — how well menard can track and enforce them.
16
+
17
+ ### Scoring Signals
18
+
19
+ **Good structure (increase score):**
20
+ - Tables with file paths, commands, or config values (machine-parseable)
21
+ - Code blocks with actual commands or config snippets
22
+ - Sections with clear single-file scope (heading maps to one code file)
23
+ - Explicit source-of-truth pointers ("see X for canonical version")
24
+ - Short, factual assertions ("CLI entry point: `foo` → `bar:baz`")
25
+ - Already covered by `links.toml` entries
26
+ - Protected by `donttouch` rules where appropriate
27
+
28
+ **Poor structure (decrease score):**
29
+ - Long prose blocks with no code references or tables
30
+ - Sections referencing many code files without clear boundaries
31
+ - Implicit file references (mentions `auth.py` in prose but not in links.toml)
32
+ - Assertions that could be checked against code but aren't linked
33
+ - No heading structure (flat wall of text)
34
+ - Terminology inconsistencies
35
+
36
+ ## Workflow
37
+
38
+ ### Step 1: Gather Context
39
+
40
+ ```bash
41
+ # Check current menard configuration
42
+ cat pyproject.toml | grep -A 20 "\[tool.menard\]"
43
+
44
+ # See existing links
45
+ cat .menard/links.toml
46
+
47
+ # See existing protections
48
+ cat .menard/donttouch 2>/dev/null || echo "No donttouch file"
49
+
50
+ # Run coverage to see current state
51
+ menard coverage
52
+ ```
53
+
54
+ ### Step 2: Scan Documentation
55
+
56
+ Read all docs matching `doc_paths` from config (typically `docs/**/*.md`, `README.md`).
57
+
58
+ For each doc file, analyze:
59
+ 1. **Structure**: Headings, tables, code blocks, prose ratio
60
+ 2. **File references**: Backtick-quoted paths like `src/foo.py`
61
+ 3. **Section scope**: Does each section map to identifiable code?
62
+ 4. **Protected content**: License blocks, version pins, critical terminology
63
+
64
+ ### Step 3: Generate Report
65
+
66
+ Output per-file, per-section scores with specific issues:
67
+
68
+ ```
69
+ # docs/api.md
70
+ Overall: 6/10 (partially trackable)
71
+
72
+ ## Authentication (8/10)
73
+ ✓ Contains code examples
74
+ ✓ References src/auth.py
75
+ ⚠ src/auth.py not in links.toml — SUGGEST ADD
76
+
77
+ ## Data Pipeline (3/10)
78
+ ✗ 400 words of prose, no tables or code blocks
79
+ ✗ References 7 code files, none in links.toml
80
+ ✗ No clear single-file scope — consider splitting
81
+
82
+ ## License (9/10)
83
+ ✓ Short, assertable content
84
+ ⚠ Not in donttouch — SUGGEST PROTECT
85
+ ```
86
+
87
+ ### Step 4: Generate Suggestions
88
+
89
+ #### links.toml suggestions
90
+
91
+ Extract file path mentions from prose and suggest entries:
92
+
93
+ ```toml
94
+ # SUGGESTED: Add to .menard/links.toml
95
+
96
+ [[link]]
97
+ code = "src/auth.py"
98
+ docs = ["docs/api.md#Authentication"]
99
+
100
+ [[link]]
101
+ code = "src/pipeline.py"
102
+ docs = ["docs/api.md#Data Pipeline"]
103
+ ```
104
+
105
+ #### donttouch suggestions
106
+
107
+ Detect protected content patterns:
108
+
109
+ ```
110
+ # SUGGESTED: Add to .menard/donttouch
111
+
112
+ # License section should not change
113
+ README.md#License
114
+
115
+ # License identifier must exist
116
+ "Apache-2.0"
117
+
118
+ # Version pins
119
+ pyproject.toml: "python >= 3.10"
120
+ ```
121
+
122
+ #### Restructuring suggestions
123
+
124
+ For low-scoring sections, suggest concrete improvements:
125
+
126
+ ```
127
+ ## Data Pipeline (score: 3/10)
128
+
129
+ SUGGEST: Split into per-file sections
130
+ This section references: src/pipeline.py, src/transform.py, src/loader.py
131
+
132
+ Proposed structure:
133
+ ## Pipeline Overview (keep as brief intro)
134
+ ## Transform Step → links to src/transform.py
135
+ ## Loading Step → links to src/loader.py
136
+
137
+ SUGGEST: Convert prose to table
138
+ Current (78 words): "The pipeline supports several output formats..."
139
+ Proposed:
140
+ | Format | Type | Handler |
141
+ |--------|------|---------|
142
+ | JSON | Output | `src/formats/json.py` |
143
+ | CSV | Output | `src/formats/csv.py` |
144
+ ```
145
+
146
+ ### Step 5: Apply (Interactive)
147
+
148
+ **Safe to auto-apply:**
149
+ - `links.toml` additions (purely additive)
150
+ - `donttouch` additions (purely additive)
151
+
152
+ **Require confirmation:**
153
+ - Restructuring changes (modify doc content)
154
+ - Section splits
155
+ - Prose-to-table conversions
156
+
157
+ ## Output Formats
158
+
159
+ ### Human-readable (default)
160
+ ```bash
161
+ menard audit
162
+ ```
163
+
164
+ ### JSON (for programmatic use)
165
+ ```bash
166
+ menard audit --format json
167
+ ```
168
+
169
+ ### Suggestions only
170
+ ```bash
171
+ menard audit --suggest
172
+ ```
173
+
174
+ ### Apply safe changes
175
+ ```bash
176
+ menard audit --apply
177
+ ```
178
+
179
+ ## Key Principles
180
+
181
+ 1. **Heuristic, not AI-powered scoring** — Pattern matching: count tables, count prose length, grep for file paths, check links.toml coverage. Deterministic and fast.
182
+
183
+ 2. **AI for restructuring suggestions** — The skill (Claude) adds value by proposing how to restructure prose into tables, how to split sections, etc.
184
+
185
+ 3. **links.toml and donttouch suggestions are deterministic** — Inferred from file path mentions, heading structure, content patterns.
186
+
187
+ 4. **Two-audience awareness** — If repo has both `docs/` and `CLAUDE.md`/`context/`, score them differently. AI-oriented docs should be denser, more structured.
188
+
189
+ ## Integration with menard init
190
+
191
+ Ideal onboarding flow:
192
+ ```bash
193
+ menard init # Creates config, .menard/ directory
194
+ menard audit --suggest # "Here's what your docs look like"
195
+ menard audit --apply # Auto-generate links.toml + donttouch
196
+ menard bootstrap # Fill in convention-based links
197
+ menard install-hook # Start enforcing
198
+ ```
@@ -0,0 +1,21 @@
1
+ ## Summary
2
+
3
+ <!-- What does this PR do? -->
4
+
5
+ ## Changes
6
+
7
+ <!-- List key changes -->
8
+
9
+ -
10
+ -
11
+
12
+ ## Testing
13
+
14
+ ```bash
15
+ uv run pytest # Tests pass
16
+ uv run ruff check . # Linting passes
17
+ ```
18
+
19
+ ## Closes
20
+
21
+ <!-- Link related issues: Closes #123 -->
@@ -0,0 +1,30 @@
1
+ # menard Brand Assets
2
+
3
+ ## Colors
4
+
5
+ | Element | Hex | Preview |
6
+ |---------|-----|---------|
7
+ | Background | `#7730E1` | ![#7730E1](https://via.placeholder.com/20/7730E1/7730E1.png) Purple |
8
+ | Icon/Text | `#DBDF24` | ![#DBDF24](https://via.placeholder.com/20/DBDF24/DBDF24.png) Lime |
9
+ | Font | `#FFFFFF` | ![#FFFFFF](https://via.placeholder.com/20/FFFFFF/FFFFFF.png) White |
10
+
11
+ ## Typography
12
+
13
+ - **Font**: [Ubuntu Light](https://fonts.google.com/specimen/Ubuntu)
14
+ - **Author**: [Dalton Maag](http://www.daltonmaag.com/)
15
+
16
+ ## Assets
17
+
18
+ | File | Usage |
19
+ |------|-------|
20
+ | `profile.png` | Square logo (avatars, favicons) |
21
+ | `cover.png` | Banner/header images |
22
+ | `vector/default-monochrome.svg` | Scalable logo (lime on transparent) |
23
+ | `vector/default-monochrome-black.svg` | Black version for light backgrounds |
24
+ | `vector/default-monochrome-white.svg` | White version for dark backgrounds |
25
+
26
+ ## Usage Guidelines
27
+
28
+ - Use the purple background (`#7730E1`) as the primary brand color
29
+ - The lime accent (`#DBDF24`) should be used sparingly for emphasis
30
+ - Prefer SVG assets for print and high-resolution displays
Binary file
@@ -0,0 +1 @@
1
+ <svg data-v-423bf9ae="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.39999389648438 60" class="font"><!----><!----><!----><g data-v-423bf9ae="" id="5bb69352-7c31-4922-bb8f-dba5d2173159" fill="black" transform="matrix(4.44444465637207,0,0,4.44444465637207,-3.422229528427124,-9.688892364501953)"><path d="M6.96 2.18L6.96 12.82Q6.55 12.96 5.92 13.09Q5.29 13.22 4.33 13.22L4.33 13.22Q3.53 13.22 2.88 12.96Q2.23 12.70 1.76 12.21Q1.29 11.72 1.03 11.02Q0.77 10.32 0.77 9.44L0.77 9.44Q0.77 8.61 0.99 7.92Q1.20 7.22 1.62 6.72Q2.04 6.22 2.65 5.94Q3.26 5.66 4.05 5.66L4.05 5.66Q4.76 5.66 5.29 5.86Q5.81 6.06 6.05 6.24L6.05 6.24L6.05 2.35L6.96 2.18ZM6.05 12.19L6.05 7.13Q5.92 7.03 5.73 6.92Q5.54 6.80 5.29 6.71Q5.04 6.61 4.75 6.54Q4.45 6.48 4.13 6.48L4.13 6.48Q3.46 6.48 3.00 6.72Q2.55 6.96 2.27 7.36Q1.99 7.76 1.86 8.29Q1.74 8.83 1.74 9.44L1.74 9.44Q1.74 10.86 2.45 11.63Q3.16 12.39 4.34 12.39L4.34 12.39Q5.01 12.39 5.42 12.33Q5.84 12.26 6.05 12.19L6.05 12.19ZM15.54 9.44L15.54 9.44Q15.54 10.29 15.30 10.99Q15.05 11.69 14.61 12.18Q14.17 12.67 13.57 12.94Q12.96 13.22 12.24 13.22L12.24 13.22Q11.51 13.22 10.91 12.94Q10.30 12.67 9.86 12.18Q9.42 11.69 9.18 10.99Q8.93 10.29 8.93 9.44L8.93 9.44Q8.93 8.58 9.18 7.88Q9.42 7.18 9.86 6.68Q10.30 6.19 10.91 5.92Q11.51 5.64 12.24 5.64L12.24 5.64Q12.96 5.64 13.57 5.92Q14.17 6.19 14.61 6.68Q15.05 7.18 15.30 7.88Q15.54 8.58 15.54 9.44ZM14.57 9.44L14.57 9.44Q14.57 8.08 13.94 7.27Q13.31 6.47 12.24 6.47L12.24 6.47Q11.16 6.47 10.53 7.27Q9.90 8.08 9.90 9.44L9.90 9.44Q9.90 10.79 10.53 11.59Q11.16 12.39 12.24 12.39L12.24 12.39Q13.31 12.39 13.94 11.59Q14.57 10.79 14.57 9.44ZM20.51 13.20L20.51 13.20Q19.67 13.20 19.03 12.94Q18.38 12.67 17.96 12.17Q17.53 11.68 17.30 10.98Q17.08 10.29 17.08 9.45L17.08 9.45Q17.08 8.60 17.31 7.90Q17.54 7.20 17.98 6.69Q18.41 6.19 19.03 5.92Q19.64 5.64 20.41 5.64L20.41 5.64Q21.00 5.64 21.51 5.74Q22.02 5.84 22.30 5.99L22.30 5.99L22.06 6.78Q21.78 6.64 21.43 6.55Q21.08 6.47 20.50 6.47L20.50 6.47Q19.29 6.47 18.67 7.25Q18.05 8.02 18.05 9.45L18.05 9.45Q18.05 10.09 18.19 10.63Q18.33 11.17 18.64 11.56Q18.96 11.94 19.45 12.16Q19.95 12.38 20.66 12.38L20.66 12.38Q21.25 12.38 21.65 12.24Q22.05 12.11 22.23 12.01L22.23 12.01L22.43 12.80Q22.18 12.94 21.64 13.07Q21.10 13.20 20.51 13.20ZM25.44 12.40L25.44 12.40Q26.22 12.40 26.73 12.14Q27.24 11.89 27.24 11.27L27.24 11.27Q27.24 10.98 27.15 10.77Q27.06 10.56 26.85 10.39Q26.64 10.22 26.30 10.07Q25.96 9.91 25.45 9.70L25.45 9.70Q25.05 9.53 24.68 9.36Q24.32 9.18 24.04 8.95Q23.76 8.72 23.59 8.40Q23.42 8.08 23.42 7.62L23.42 7.62Q23.42 6.73 24.09 6.19Q24.75 5.64 25.91 5.64L25.91 5.64Q26.66 5.64 27.14 5.77Q27.62 5.89 27.82 5.99L27.82 5.99L27.61 6.80Q27.44 6.72 27.04 6.58Q26.64 6.44 25.87 6.44L25.87 6.44Q25.56 6.44 25.29 6.50Q25.02 6.57 24.81 6.70Q24.60 6.83 24.47 7.04Q24.35 7.24 24.35 7.53L24.35 7.53Q24.35 7.83 24.46 8.04Q24.57 8.25 24.79 8.41Q25.00 8.57 25.32 8.71Q25.63 8.85 26.04 9.02L26.04 9.02Q26.46 9.18 26.85 9.36Q27.23 9.53 27.52 9.78Q27.82 10.02 28.00 10.37Q28.18 10.71 28.18 11.23L28.18 11.23Q28.18 12.21 27.45 12.71Q26.71 13.22 25.44 13.22L25.44 13.22Q24.49 13.22 23.98 13.05Q23.48 12.89 23.31 12.81L23.31 12.81L23.55 11.98Q23.59 12.01 23.73 12.07Q23.87 12.14 24.11 12.21Q24.35 12.29 24.68 12.35Q25.00 12.40 25.44 12.40ZM31.92 13.20L31.92 13.20Q31.46 12.35 31.03 11.42Q30.60 10.50 30.23 9.55Q29.86 8.61 29.55 7.67Q29.25 6.72 29.02 5.81L29.02 5.81L29.99 5.81Q30.14 6.48 30.38 7.26Q30.62 8.04 30.92 8.86Q31.22 9.69 31.58 10.56Q31.95 11.42 32.37 12.26L32.37 12.26Q32.68 11.40 32.91 10.63Q33.15 9.86 33.36 9.09Q33.56 8.33 33.75 7.53Q33.94 6.73 34.15 5.81L34.15 5.81L35.06 5.81Q34.61 7.84 34.03 9.76Q33.46 11.68 32.79 13.27L32.79 13.27Q32.52 13.90 32.24 14.36Q31.96 14.81 31.62 15.11Q31.28 15.40 30.82 15.54Q30.37 15.68 29.75 15.68L29.75 15.68Q29.40 15.68 29.11 15.60Q28.83 15.51 28.76 15.47L28.76 15.47L28.94 14.71Q28.99 14.76 29.25 14.83Q29.51 14.91 29.79 14.91L29.79 14.91Q30.18 14.91 30.50 14.83Q30.81 14.74 31.07 14.54Q31.32 14.34 31.52 14.01Q31.72 13.69 31.92 13.20ZM36.58 13.05L36.58 6.06Q36.99 5.95 37.67 5.81Q38.36 5.67 39.35 5.67L39.35 5.67Q40.18 5.67 40.73 5.91Q41.29 6.15 41.62 6.59Q41.94 7.03 42.08 7.64Q42.22 8.26 42.22 9.00L42.22 9.00L42.22 13.05L41.31 13.05L41.31 9.30Q41.31 8.53 41.21 7.99Q41.10 7.46 40.86 7.13Q40.61 6.79 40.22 6.64Q39.82 6.50 39.21 6.50L39.21 6.50Q38.57 6.50 38.10 6.57Q37.63 6.64 37.49 6.69L37.49 6.69L37.49 13.05L36.58 13.05ZM47.54 13.20L47.54 13.20Q46.70 13.20 46.06 12.94Q45.42 12.67 44.99 12.17Q44.56 11.68 44.34 10.98Q44.11 10.29 44.11 9.45L44.11 9.45Q44.11 8.60 44.35 7.90Q44.58 7.20 45.01 6.69Q45.44 6.19 46.06 5.92Q46.68 5.64 47.45 5.64L47.45 5.64Q48.03 5.64 48.55 5.74Q49.06 5.84 49.34 5.99L49.34 5.99L49.10 6.78Q48.82 6.64 48.47 6.55Q48.12 6.47 47.53 6.47L47.53 6.47Q46.33 6.47 45.70 7.25Q45.08 8.02 45.08 9.45L45.08 9.45Q45.08 10.09 45.22 10.63Q45.36 11.17 45.68 11.56Q45.99 11.94 46.49 12.16Q46.98 12.38 47.70 12.38L47.70 12.38Q48.29 12.38 48.69 12.24Q49.08 12.11 49.27 12.01L49.27 12.01L49.46 12.80Q49.21 12.94 48.67 13.07Q48.13 13.20 47.54 13.20Z"></path></g><!----><!----></svg>
@@ -0,0 +1 @@
1
+ <svg data-v-423bf9ae="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.39999389648438 60" class="font"><!----><!----><!----><g data-v-423bf9ae="" id="32f21d0e-779d-4d3d-8009-5d07ef2ec971" fill="white" transform="matrix(4.44444465637207,0,0,4.44444465637207,-3.422229528427124,-9.688892364501953)"><path d="M6.96 2.18L6.96 12.82Q6.55 12.96 5.92 13.09Q5.29 13.22 4.33 13.22L4.33 13.22Q3.53 13.22 2.88 12.96Q2.23 12.70 1.76 12.21Q1.29 11.72 1.03 11.02Q0.77 10.32 0.77 9.44L0.77 9.44Q0.77 8.61 0.99 7.92Q1.20 7.22 1.62 6.72Q2.04 6.22 2.65 5.94Q3.26 5.66 4.05 5.66L4.05 5.66Q4.76 5.66 5.29 5.86Q5.81 6.06 6.05 6.24L6.05 6.24L6.05 2.35L6.96 2.18ZM6.05 12.19L6.05 7.13Q5.92 7.03 5.73 6.92Q5.54 6.80 5.29 6.71Q5.04 6.61 4.75 6.54Q4.45 6.48 4.13 6.48L4.13 6.48Q3.46 6.48 3.00 6.72Q2.55 6.96 2.27 7.36Q1.99 7.76 1.86 8.29Q1.74 8.83 1.74 9.44L1.74 9.44Q1.74 10.86 2.45 11.63Q3.16 12.39 4.34 12.39L4.34 12.39Q5.01 12.39 5.42 12.33Q5.84 12.26 6.05 12.19L6.05 12.19ZM15.54 9.44L15.54 9.44Q15.54 10.29 15.30 10.99Q15.05 11.69 14.61 12.18Q14.17 12.67 13.57 12.94Q12.96 13.22 12.24 13.22L12.24 13.22Q11.51 13.22 10.91 12.94Q10.30 12.67 9.86 12.18Q9.42 11.69 9.18 10.99Q8.93 10.29 8.93 9.44L8.93 9.44Q8.93 8.58 9.18 7.88Q9.42 7.18 9.86 6.68Q10.30 6.19 10.91 5.92Q11.51 5.64 12.24 5.64L12.24 5.64Q12.96 5.64 13.57 5.92Q14.17 6.19 14.61 6.68Q15.05 7.18 15.30 7.88Q15.54 8.58 15.54 9.44ZM14.57 9.44L14.57 9.44Q14.57 8.08 13.94 7.27Q13.31 6.47 12.24 6.47L12.24 6.47Q11.16 6.47 10.53 7.27Q9.90 8.08 9.90 9.44L9.90 9.44Q9.90 10.79 10.53 11.59Q11.16 12.39 12.24 12.39L12.24 12.39Q13.31 12.39 13.94 11.59Q14.57 10.79 14.57 9.44ZM20.51 13.20L20.51 13.20Q19.67 13.20 19.03 12.94Q18.38 12.67 17.96 12.17Q17.53 11.68 17.30 10.98Q17.08 10.29 17.08 9.45L17.08 9.45Q17.08 8.60 17.31 7.90Q17.54 7.20 17.98 6.69Q18.41 6.19 19.03 5.92Q19.64 5.64 20.41 5.64L20.41 5.64Q21.00 5.64 21.51 5.74Q22.02 5.84 22.30 5.99L22.30 5.99L22.06 6.78Q21.78 6.64 21.43 6.55Q21.08 6.47 20.50 6.47L20.50 6.47Q19.29 6.47 18.67 7.25Q18.05 8.02 18.05 9.45L18.05 9.45Q18.05 10.09 18.19 10.63Q18.33 11.17 18.64 11.56Q18.96 11.94 19.45 12.16Q19.95 12.38 20.66 12.38L20.66 12.38Q21.25 12.38 21.65 12.24Q22.05 12.11 22.23 12.01L22.23 12.01L22.43 12.80Q22.18 12.94 21.64 13.07Q21.10 13.20 20.51 13.20ZM25.44 12.40L25.44 12.40Q26.22 12.40 26.73 12.14Q27.24 11.89 27.24 11.27L27.24 11.27Q27.24 10.98 27.15 10.77Q27.06 10.56 26.85 10.39Q26.64 10.22 26.30 10.07Q25.96 9.91 25.45 9.70L25.45 9.70Q25.05 9.53 24.68 9.36Q24.32 9.18 24.04 8.95Q23.76 8.72 23.59 8.40Q23.42 8.08 23.42 7.62L23.42 7.62Q23.42 6.73 24.09 6.19Q24.75 5.64 25.91 5.64L25.91 5.64Q26.66 5.64 27.14 5.77Q27.62 5.89 27.82 5.99L27.82 5.99L27.61 6.80Q27.44 6.72 27.04 6.58Q26.64 6.44 25.87 6.44L25.87 6.44Q25.56 6.44 25.29 6.50Q25.02 6.57 24.81 6.70Q24.60 6.83 24.47 7.04Q24.35 7.24 24.35 7.53L24.35 7.53Q24.35 7.83 24.46 8.04Q24.57 8.25 24.79 8.41Q25.00 8.57 25.32 8.71Q25.63 8.85 26.04 9.02L26.04 9.02Q26.46 9.18 26.85 9.36Q27.23 9.53 27.52 9.78Q27.82 10.02 28.00 10.37Q28.18 10.71 28.18 11.23L28.18 11.23Q28.18 12.21 27.45 12.71Q26.71 13.22 25.44 13.22L25.44 13.22Q24.49 13.22 23.98 13.05Q23.48 12.89 23.31 12.81L23.31 12.81L23.55 11.98Q23.59 12.01 23.73 12.07Q23.87 12.14 24.11 12.21Q24.35 12.29 24.68 12.35Q25.00 12.40 25.44 12.40ZM31.92 13.20L31.92 13.20Q31.46 12.35 31.03 11.42Q30.60 10.50 30.23 9.55Q29.86 8.61 29.55 7.67Q29.25 6.72 29.02 5.81L29.02 5.81L29.99 5.81Q30.14 6.48 30.38 7.26Q30.62 8.04 30.92 8.86Q31.22 9.69 31.58 10.56Q31.95 11.42 32.37 12.26L32.37 12.26Q32.68 11.40 32.91 10.63Q33.15 9.86 33.36 9.09Q33.56 8.33 33.75 7.53Q33.94 6.73 34.15 5.81L34.15 5.81L35.06 5.81Q34.61 7.84 34.03 9.76Q33.46 11.68 32.79 13.27L32.79 13.27Q32.52 13.90 32.24 14.36Q31.96 14.81 31.62 15.11Q31.28 15.40 30.82 15.54Q30.37 15.68 29.75 15.68L29.75 15.68Q29.40 15.68 29.11 15.60Q28.83 15.51 28.76 15.47L28.76 15.47L28.94 14.71Q28.99 14.76 29.25 14.83Q29.51 14.91 29.79 14.91L29.79 14.91Q30.18 14.91 30.50 14.83Q30.81 14.74 31.07 14.54Q31.32 14.34 31.52 14.01Q31.72 13.69 31.92 13.20ZM36.58 13.05L36.58 6.06Q36.99 5.95 37.67 5.81Q38.36 5.67 39.35 5.67L39.35 5.67Q40.18 5.67 40.73 5.91Q41.29 6.15 41.62 6.59Q41.94 7.03 42.08 7.64Q42.22 8.26 42.22 9.00L42.22 9.00L42.22 13.05L41.31 13.05L41.31 9.30Q41.31 8.53 41.21 7.99Q41.10 7.46 40.86 7.13Q40.61 6.79 40.22 6.64Q39.82 6.50 39.21 6.50L39.21 6.50Q38.57 6.50 38.10 6.57Q37.63 6.64 37.49 6.69L37.49 6.69L37.49 13.05L36.58 13.05ZM47.54 13.20L47.54 13.20Q46.70 13.20 46.06 12.94Q45.42 12.67 44.99 12.17Q44.56 11.68 44.34 10.98Q44.11 10.29 44.11 9.45L44.11 9.45Q44.11 8.60 44.35 7.90Q44.58 7.20 45.01 6.69Q45.44 6.19 46.06 5.92Q46.68 5.64 47.45 5.64L47.45 5.64Q48.03 5.64 48.55 5.74Q49.06 5.84 49.34 5.99L49.34 5.99L49.10 6.78Q48.82 6.64 48.47 6.55Q48.12 6.47 47.53 6.47L47.53 6.47Q46.33 6.47 45.70 7.25Q45.08 8.02 45.08 9.45L45.08 9.45Q45.08 10.09 45.22 10.63Q45.36 11.17 45.68 11.56Q45.99 11.94 46.49 12.16Q46.98 12.38 47.70 12.38L47.70 12.38Q48.29 12.38 48.69 12.24Q49.08 12.11 49.27 12.01L49.27 12.01L49.46 12.80Q49.21 12.94 48.67 13.07Q48.13 13.20 47.54 13.20Z"></path></g><!----><!----></svg>
@@ -0,0 +1 @@
1
+ <svg data-v-423bf9ae="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.39999389648438 60" class="font"><!----><!----><!----><g data-v-423bf9ae="" id="fb39f943-3bd8-4482-9262-17621674b71f" fill="#DBDF24" transform="matrix(4.44444465637207,0,0,4.44444465637207,-3.422229528427124,-9.688892364501953)"><path d="M6.96 2.18L6.96 12.82Q6.55 12.96 5.92 13.09Q5.29 13.22 4.33 13.22L4.33 13.22Q3.53 13.22 2.88 12.96Q2.23 12.70 1.76 12.21Q1.29 11.72 1.03 11.02Q0.77 10.32 0.77 9.44L0.77 9.44Q0.77 8.61 0.99 7.92Q1.20 7.22 1.62 6.72Q2.04 6.22 2.65 5.94Q3.26 5.66 4.05 5.66L4.05 5.66Q4.76 5.66 5.29 5.86Q5.81 6.06 6.05 6.24L6.05 6.24L6.05 2.35L6.96 2.18ZM6.05 12.19L6.05 7.13Q5.92 7.03 5.73 6.92Q5.54 6.80 5.29 6.71Q5.04 6.61 4.75 6.54Q4.45 6.48 4.13 6.48L4.13 6.48Q3.46 6.48 3.00 6.72Q2.55 6.96 2.27 7.36Q1.99 7.76 1.86 8.29Q1.74 8.83 1.74 9.44L1.74 9.44Q1.74 10.86 2.45 11.63Q3.16 12.39 4.34 12.39L4.34 12.39Q5.01 12.39 5.42 12.33Q5.84 12.26 6.05 12.19L6.05 12.19ZM15.54 9.44L15.54 9.44Q15.54 10.29 15.30 10.99Q15.05 11.69 14.61 12.18Q14.17 12.67 13.57 12.94Q12.96 13.22 12.24 13.22L12.24 13.22Q11.51 13.22 10.91 12.94Q10.30 12.67 9.86 12.18Q9.42 11.69 9.18 10.99Q8.93 10.29 8.93 9.44L8.93 9.44Q8.93 8.58 9.18 7.88Q9.42 7.18 9.86 6.68Q10.30 6.19 10.91 5.92Q11.51 5.64 12.24 5.64L12.24 5.64Q12.96 5.64 13.57 5.92Q14.17 6.19 14.61 6.68Q15.05 7.18 15.30 7.88Q15.54 8.58 15.54 9.44ZM14.57 9.44L14.57 9.44Q14.57 8.08 13.94 7.27Q13.31 6.47 12.24 6.47L12.24 6.47Q11.16 6.47 10.53 7.27Q9.90 8.08 9.90 9.44L9.90 9.44Q9.90 10.79 10.53 11.59Q11.16 12.39 12.24 12.39L12.24 12.39Q13.31 12.39 13.94 11.59Q14.57 10.79 14.57 9.44ZM20.51 13.20L20.51 13.20Q19.67 13.20 19.03 12.94Q18.38 12.67 17.96 12.17Q17.53 11.68 17.30 10.98Q17.08 10.29 17.08 9.45L17.08 9.45Q17.08 8.60 17.31 7.90Q17.54 7.20 17.98 6.69Q18.41 6.19 19.03 5.92Q19.64 5.64 20.41 5.64L20.41 5.64Q21.00 5.64 21.51 5.74Q22.02 5.84 22.30 5.99L22.30 5.99L22.06 6.78Q21.78 6.64 21.43 6.55Q21.08 6.47 20.50 6.47L20.50 6.47Q19.29 6.47 18.67 7.25Q18.05 8.02 18.05 9.45L18.05 9.45Q18.05 10.09 18.19 10.63Q18.33 11.17 18.64 11.56Q18.96 11.94 19.45 12.16Q19.95 12.38 20.66 12.38L20.66 12.38Q21.25 12.38 21.65 12.24Q22.05 12.11 22.23 12.01L22.23 12.01L22.43 12.80Q22.18 12.94 21.64 13.07Q21.10 13.20 20.51 13.20ZM25.44 12.40L25.44 12.40Q26.22 12.40 26.73 12.14Q27.24 11.89 27.24 11.27L27.24 11.27Q27.24 10.98 27.15 10.77Q27.06 10.56 26.85 10.39Q26.64 10.22 26.30 10.07Q25.96 9.91 25.45 9.70L25.45 9.70Q25.05 9.53 24.68 9.36Q24.32 9.18 24.04 8.95Q23.76 8.72 23.59 8.40Q23.42 8.08 23.42 7.62L23.42 7.62Q23.42 6.73 24.09 6.19Q24.75 5.64 25.91 5.64L25.91 5.64Q26.66 5.64 27.14 5.77Q27.62 5.89 27.82 5.99L27.82 5.99L27.61 6.80Q27.44 6.72 27.04 6.58Q26.64 6.44 25.87 6.44L25.87 6.44Q25.56 6.44 25.29 6.50Q25.02 6.57 24.81 6.70Q24.60 6.83 24.47 7.04Q24.35 7.24 24.35 7.53L24.35 7.53Q24.35 7.83 24.46 8.04Q24.57 8.25 24.79 8.41Q25.00 8.57 25.32 8.71Q25.63 8.85 26.04 9.02L26.04 9.02Q26.46 9.18 26.85 9.36Q27.23 9.53 27.52 9.78Q27.82 10.02 28.00 10.37Q28.18 10.71 28.18 11.23L28.18 11.23Q28.18 12.21 27.45 12.71Q26.71 13.22 25.44 13.22L25.44 13.22Q24.49 13.22 23.98 13.05Q23.48 12.89 23.31 12.81L23.31 12.81L23.55 11.98Q23.59 12.01 23.73 12.07Q23.87 12.14 24.11 12.21Q24.35 12.29 24.68 12.35Q25.00 12.40 25.44 12.40ZM31.92 13.20L31.92 13.20Q31.46 12.35 31.03 11.42Q30.60 10.50 30.23 9.55Q29.86 8.61 29.55 7.67Q29.25 6.72 29.02 5.81L29.02 5.81L29.99 5.81Q30.14 6.48 30.38 7.26Q30.62 8.04 30.92 8.86Q31.22 9.69 31.58 10.56Q31.95 11.42 32.37 12.26L32.37 12.26Q32.68 11.40 32.91 10.63Q33.15 9.86 33.36 9.09Q33.56 8.33 33.75 7.53Q33.94 6.73 34.15 5.81L34.15 5.81L35.06 5.81Q34.61 7.84 34.03 9.76Q33.46 11.68 32.79 13.27L32.79 13.27Q32.52 13.90 32.24 14.36Q31.96 14.81 31.62 15.11Q31.28 15.40 30.82 15.54Q30.37 15.68 29.75 15.68L29.75 15.68Q29.40 15.68 29.11 15.60Q28.83 15.51 28.76 15.47L28.76 15.47L28.94 14.71Q28.99 14.76 29.25 14.83Q29.51 14.91 29.79 14.91L29.79 14.91Q30.18 14.91 30.50 14.83Q30.81 14.74 31.07 14.54Q31.32 14.34 31.52 14.01Q31.72 13.69 31.92 13.20ZM36.58 13.05L36.58 6.06Q36.99 5.95 37.67 5.81Q38.36 5.67 39.35 5.67L39.35 5.67Q40.18 5.67 40.73 5.91Q41.29 6.15 41.62 6.59Q41.94 7.03 42.08 7.64Q42.22 8.26 42.22 9.00L42.22 9.00L42.22 13.05L41.31 13.05L41.31 9.30Q41.31 8.53 41.21 7.99Q41.10 7.46 40.86 7.13Q40.61 6.79 40.22 6.64Q39.82 6.50 39.21 6.50L39.21 6.50Q38.57 6.50 38.10 6.57Q37.63 6.64 37.49 6.69L37.49 6.69L37.49 13.05L36.58 13.05ZM47.54 13.20L47.54 13.20Q46.70 13.20 46.06 12.94Q45.42 12.67 44.99 12.17Q44.56 11.68 44.34 10.98Q44.11 10.29 44.11 9.45L44.11 9.45Q44.11 8.60 44.35 7.90Q44.58 7.20 45.01 6.69Q45.44 6.19 46.06 5.92Q46.68 5.64 47.45 5.64L47.45 5.64Q48.03 5.64 48.55 5.74Q49.06 5.84 49.34 5.99L49.34 5.99L49.10 6.78Q48.82 6.64 48.47 6.55Q48.12 6.47 47.53 6.47L47.53 6.47Q46.33 6.47 45.70 7.25Q45.08 8.02 45.08 9.45L45.08 9.45Q45.08 10.09 45.22 10.63Q45.36 11.17 45.68 11.56Q45.99 11.94 46.49 12.16Q46.98 12.38 47.70 12.38L47.70 12.38Q48.29 12.38 48.69 12.24Q49.08 12.11 49.27 12.01L49.27 12.01L49.46 12.80Q49.21 12.94 48.67 13.07Q48.13 13.20 47.54 13.20Z"></path></g><!----><!----></svg>
@@ -0,0 +1,26 @@
1
+ version: 2
2
+ updates:
3
+ # Python dependencies
4
+ - package-ecosystem: "pip"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ open-pull-requests-limit: 10
9
+ groups:
10
+ python-dependencies:
11
+ patterns:
12
+ - "*"
13
+ update-types:
14
+ - "minor"
15
+ - "patch"
16
+
17
+ # GitHub Actions
18
+ - package-ecosystem: "github-actions"
19
+ directory: "/"
20
+ schedule:
21
+ interval: "weekly"
22
+ open-pull-requests-limit: 5
23
+ groups:
24
+ github-actions:
25
+ patterns:
26
+ - "*"
@@ -0,0 +1,48 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ${{ matrix.os }}
12
+ strategy:
13
+ matrix:
14
+ os: [ubuntu-latest]
15
+ python-version: ["3.11", "3.12"]
16
+
17
+ steps:
18
+ - uses: actions/checkout@v6
19
+
20
+ - name: Install uv
21
+ uses: astral-sh/setup-uv@v7
22
+ with:
23
+ version: "latest"
24
+
25
+ - name: Set up Python ${{ matrix.python-version }}
26
+ run: uv python install ${{ matrix.python-version }}
27
+
28
+ - name: Install dependencies
29
+ run: uv sync
30
+
31
+ - name: Run ruff format check
32
+ run: uv run ruff format --check .
33
+
34
+ - name: Run ruff linter
35
+ run: uv run ruff check .
36
+
37
+ - name: Check for stale documentation
38
+ run: uv run menard check
39
+
40
+ - name: Run tests with coverage
41
+ run: uv run pytest --cov=src/menard --cov-report=term --cov-report=xml --cov-fail-under=60
42
+
43
+ - name: Upload coverage to Codecov
44
+ uses: codecov/codecov-action@v5
45
+ with:
46
+ file: ./coverage.xml
47
+ fail_ci_if_error: false
48
+ token: ${{ secrets.CODECOV_TOKEN }}
@@ -0,0 +1,49 @@
1
+ name: Deploy Documentation
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ permissions:
9
+ contents: read
10
+ pages: write
11
+ id-token: write
12
+
13
+ concurrency:
14
+ group: "pages"
15
+ cancel-in-progress: false
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v5
25
+
26
+ - name: Set up Python
27
+ run: uv python install 3.11
28
+
29
+ - name: Install dependencies
30
+ run: uv sync
31
+
32
+ - name: Build documentation
33
+ run: uv run mkdocs build
34
+
35
+ - name: Upload artifact
36
+ uses: actions/upload-pages-artifact@v3
37
+ with:
38
+ path: site/
39
+
40
+ deploy:
41
+ environment:
42
+ name: github-pages
43
+ url: ${{ steps.deployment.outputs.page_url }}
44
+ runs-on: ubuntu-latest
45
+ needs: build
46
+ steps:
47
+ - name: Deploy to GitHub Pages
48
+ id: deployment
49
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,106 @@
1
+ # Tag-based release workflow using commitizen
2
+ #
3
+ # This workflow:
4
+ # 1. Detects if the merged commit is a version bump (from `cz bump` in PR)
5
+ # 2. If yes: extracts version, creates git tag, builds, publishes to PyPI
6
+ # 3. If no: exits successfully (normal PR merge)
7
+ #
8
+ # Developer workflow:
9
+ # 1. Accumulate changes via normal PR merges
10
+ # 2. When ready to release, create a PR running: uv run cz bump --changelog
11
+ # 3. Merge bump PR → this workflow creates tag and publishes
12
+ #
13
+ # Recovery workflow (when release fails after bump merge):
14
+ # 1. Delete orphan tag if exists: git push origin :refs/tags/vX.Y.Z
15
+ # 2. Trigger manually: gh workflow run release.yml --ref main
16
+ name: Release
17
+ on:
18
+ push:
19
+ branches: [main]
20
+ workflow_dispatch: # Manual trigger for recovery scenarios
21
+
22
+ jobs:
23
+ release:
24
+ name: Release
25
+ runs-on: ubuntu-latest
26
+ # Run if: push with bump commit OR manual trigger (workflow_dispatch)
27
+ if: startsWith(github.event.head_commit.message, 'bump:') || github.event_name == 'workflow_dispatch'
28
+ permissions:
29
+ contents: write # Required for creating tags and releases
30
+ id-token: write # Required for trusted PyPI publishing
31
+ steps:
32
+ - uses: actions/checkout@v6
33
+ with:
34
+ fetch-depth: 0 # Full history for tag creation
35
+
36
+ - name: Install uv
37
+ uses: astral-sh/setup-uv@v7
38
+
39
+ - name: Set up Python
40
+ run: uv python install 3.11
41
+
42
+ - name: Install dependencies
43
+ run: uv sync
44
+
45
+ - name: Extract version from pyproject.toml
46
+ id: version
47
+ run: |
48
+ # Use head -1 because pyproject.toml has two version lines:
49
+ # 1. [project].version (the package version - what we want)
50
+ # 2. [tool.commitizen].version (kept in sync by cz bump)
51
+ VERSION=$(grep '^version = ' pyproject.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
52
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
53
+ echo "tag=v$VERSION" >> $GITHUB_OUTPUT
54
+ echo "Detected version: $VERSION (tag: v$VERSION)"
55
+
56
+ - name: Check release status
57
+ id: release_check
58
+ run: |
59
+ TAG="v${{ steps.version.outputs.version }}"
60
+
61
+ # Check if GitHub Release exists (the real indicator of a completed release)
62
+ if gh release view "$TAG" >/dev/null 2>&1; then
63
+ echo "Release $TAG already exists, nothing to do"
64
+ echo "release_exists=true" >> $GITHUB_OUTPUT
65
+ echo "tag_exists=true" >> $GITHUB_OUTPUT
66
+ else
67
+ echo "release_exists=false" >> $GITHUB_OUTPUT
68
+ # Check if tag exists (may need to skip tag creation but still publish)
69
+ if git rev-parse "$TAG" >/dev/null 2>&1; then
70
+ echo "Tag $TAG exists but no release - recovery mode"
71
+ echo "tag_exists=true" >> $GITHUB_OUTPUT
72
+ else
73
+ echo "Tag $TAG does not exist, full release"
74
+ echo "tag_exists=false" >> $GITHUB_OUTPUT
75
+ fi
76
+ fi
77
+ env:
78
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
79
+
80
+ - name: Create git tag
81
+ if: steps.release_check.outputs.tag_exists == 'false'
82
+ run: |
83
+ git config --local user.email "github-actions[bot]@users.noreply.github.com"
84
+ git config --local user.name "github-actions[bot]"
85
+ git tag -a "${{ steps.version.outputs.tag }}" -m "Release ${{ steps.version.outputs.tag }}"
86
+ git push origin "${{ steps.version.outputs.tag }}"
87
+
88
+ - name: Build package
89
+ if: steps.release_check.outputs.release_exists == 'false'
90
+ run: uv build
91
+
92
+ - name: Publish to PyPI
93
+ if: steps.release_check.outputs.release_exists == 'false'
94
+ uses: pypa/gh-action-pypi-publish@release/v1
95
+ with:
96
+ print-hash: true
97
+
98
+ - name: Create GitHub Release
99
+ if: steps.release_check.outputs.release_exists == 'false'
100
+ run: |
101
+ gh release create "${{ steps.version.outputs.tag }}" \
102
+ --title "${{ steps.version.outputs.tag }}" \
103
+ --notes "See [CHANGELOG](https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md) for details." \
104
+ dist/*
105
+ env:
106
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,51 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+
23
+ # Virtual environments
24
+ venv/
25
+ ENV/
26
+ env/
27
+
28
+ # Testing
29
+ .pytest_cache/
30
+ .coverage
31
+ htmlcov/
32
+
33
+ # IDE
34
+ .vscode/
35
+ .idea/
36
+ *.swp
37
+ *.swo
38
+
39
+ # Testbed (created by scripts, not part of package)
40
+ testbed/
41
+
42
+ # UV/ruff cache
43
+ .ruff_cache/
44
+
45
+ # docsync cache (but keep config files)
46
+ .docsync/*
47
+ !.docsync/links.toml
48
+ !.docsync/donttouch
49
+ .menard/cache/
50
+ .menard/*.json
51
+ .menard/*.state
@@ -0,0 +1,21 @@
1
+ # License sections must not change without explicit decision
2
+ README.md#License
3
+ docs/contributing.md#License
4
+ docs/index.md#License
5
+
6
+ # Code of Conduct is policy
7
+ docs/contributing.md#Code of Conduct
8
+
9
+ # Brand colors must be consistent
10
+ mkdocs.yml#palette
11
+ docs/stylesheets/extra.css
12
+
13
+ # Version requirement
14
+ "Python 3.11+"
15
+
16
+ # Apache license identifier
17
+ "Apache-2.0"
18
+
19
+ # Brand color values (exact hex codes)
20
+ "#7730E1"
21
+ "#DBDF24"
@@ -0,0 +1,51 @@
1
+ # menard links - code-documentation relationships
2
+
3
+ # CLI module → CLI reference (auto-generated by mkdocs-click) + index quick start
4
+ [[link]]
5
+ code = "src/menard/cli.py"
6
+ docs = ["docs/cli/reference.md"]
7
+ auto_generated = true
8
+
9
+ [[link]]
10
+ code = "src/menard/cli.py"
11
+ docs = ["docs/index.md#Quick Start"]
12
+
13
+ # Configuration → configuration docs
14
+ [[link]]
15
+ code = "src/menard/config.py"
16
+ docs = ["docs/configuration.md#pyproject.toml"]
17
+
18
+ # Section parsing → configuration (staleness detection section)
19
+ [[link]]
20
+ code = "src/menard/sections.py"
21
+ docs = ["docs/configuration.md#Staleness Detection"]
22
+
23
+ # Staleness logic → configuration
24
+ [[link]]
25
+ code = "src/menard/staleness.py"
26
+ docs = ["docs/configuration.md#Staleness Detection"]
27
+
28
+ # Symbol extraction (AST) → staleness detection
29
+ [[link]]
30
+ code = "src/menard/symbols.py"
31
+ docs = ["docs/configuration.md#Staleness Detection"]
32
+
33
+ # TOML links → configuration
34
+ [[link]]
35
+ code = "src/menard/toml_links.py"
36
+ docs = ["docs/configuration.md#links.toml"]
37
+
38
+ # Hook → getting started + index
39
+ [[link]]
40
+ code = "src/menard/hook.py"
41
+ docs = ["docs/getting-started.md", "docs/index.md#1. Track Doc Sync"]
42
+
43
+ # Donttouch → configuration + index
44
+ [[link]]
45
+ code = "src/menard/donttouch.py"
46
+ docs = ["docs/configuration.md#donttouch", "docs/index.md#2. Flag Protected Content Changes"]
47
+
48
+ # Coverage → configuration
49
+ [[link]]
50
+ code = "src/menard/coverage.py"
51
+ docs = ["docs/configuration.md#Validation and Coverage"]