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.
- menard-0.2.0/.claude/skills/audit.md +198 -0
- menard-0.2.0/.github/PULL_REQUEST_TEMPLATE.md +21 -0
- menard-0.2.0/.github/branding/BRANDING.md +30 -0
- menard-0.2.0/.github/branding/cover.png +0 -0
- menard-0.2.0/.github/branding/profile.png +0 -0
- menard-0.2.0/.github/branding/vector/default-monochrome-black.svg +1 -0
- menard-0.2.0/.github/branding/vector/default-monochrome-white.svg +1 -0
- menard-0.2.0/.github/branding/vector/default-monochrome.svg +1 -0
- menard-0.2.0/.github/dependabot.yml +26 -0
- menard-0.2.0/.github/workflows/ci.yml +48 -0
- menard-0.2.0/.github/workflows/docs.yml +49 -0
- menard-0.2.0/.github/workflows/release.yml +106 -0
- menard-0.2.0/.gitignore +51 -0
- menard-0.2.0/.menard/donttouch +21 -0
- menard-0.2.0/.menard/links.toml +51 -0
- menard-0.2.0/.pre-commit-config.yaml +49 -0
- menard-0.2.0/.python-version +1 -0
- menard-0.2.0/CHANGELOG.md +139 -0
- menard-0.2.0/CLAUDE.md +84 -0
- menard-0.2.0/LICENSE +201 -0
- menard-0.2.0/PKG-INFO +59 -0
- menard-0.2.0/README.md +49 -0
- menard-0.2.0/docs/assets/favicon.png +0 -0
- menard-0.2.0/docs/assets/logo-white.svg +1 -0
- menard-0.2.0/docs/assets/menard-logo/cover.png +0 -0
- menard-0.2.0/docs/assets/menard-logo/info.txt +11 -0
- menard-0.2.0/docs/assets/menard-logo/profile.png +0 -0
- menard-0.2.0/docs/assets/menard-logo/vector/default-monochrome-black.svg +1 -0
- menard-0.2.0/docs/assets/menard-logo/vector/default-monochrome-white.svg +1 -0
- menard-0.2.0/docs/assets/menard-logo/vector/default-monochrome.svg +1 -0
- menard-0.2.0/docs/cli/reference.md +506 -0
- menard-0.2.0/docs/configuration.md +217 -0
- menard-0.2.0/docs/contributing.md +27 -0
- menard-0.2.0/docs/getting-started.md +172 -0
- menard-0.2.0/docs/index.md +126 -0
- menard-0.2.0/docs/skills.md +56 -0
- menard-0.2.0/docs/stylesheets/extra.css +23 -0
- menard-0.2.0/mkdocs.yml +66 -0
- menard-0.2.0/pyproject.toml +102 -0
- menard-0.2.0/src/menard/__init__.py +1 -0
- menard-0.2.0/src/menard/cache.py +123 -0
- menard-0.2.0/src/menard/cli.py +1655 -0
- menard-0.2.0/src/menard/config.py +51 -0
- menard-0.2.0/src/menard/coverage.py +293 -0
- menard-0.2.0/src/menard/donttouch.py +397 -0
- menard-0.2.0/src/menard/graph.py +100 -0
- menard-0.2.0/src/menard/hook.py +288 -0
- menard-0.2.0/src/menard/imports.py +226 -0
- menard-0.2.0/src/menard/reviewed.py +163 -0
- menard-0.2.0/src/menard/sections.py +139 -0
- menard-0.2.0/src/menard/staleness.py +602 -0
- menard-0.2.0/src/menard/symbols.py +288 -0
- menard-0.2.0/src/menard/toml_links.py +207 -0
- menard-0.2.0/tests/__init__.py +0 -0
- menard-0.2.0/tests/conftest.py +0 -0
- menard-0.2.0/tests/test_auto_generated.py +444 -0
- menard-0.2.0/tests/test_cache.py +72 -0
- menard-0.2.0/tests/test_cli_fix.py +767 -0
- menard-0.2.0/tests/test_cli_simple.py +210 -0
- menard-0.2.0/tests/test_config.py +85 -0
- menard-0.2.0/tests/test_detect_source.py +395 -0
- menard-0.2.0/tests/test_donttouch.py +334 -0
- menard-0.2.0/tests/test_graph.py +172 -0
- menard-0.2.0/tests/test_hook_simple.py +95 -0
- menard-0.2.0/tests/test_imports.py +298 -0
- menard-0.2.0/tests/test_integration_toml.py +235 -0
- menard-0.2.0/tests/test_reviewed.py +336 -0
- menard-0.2.0/tests/test_sections.py +284 -0
- menard-0.2.0/tests/test_staleness.py +165 -0
- menard-0.2.0/tests/test_staleness_enriched.py +401 -0
- menard-0.2.0/tests/test_symbols.py +217 -0
- menard-0.2.0/tests/test_toml_links.py +250 -0
- 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` |  Purple |
|
|
8
|
+
| Icon/Text | `#DBDF24` |  Lime |
|
|
9
|
+
| Font | `#FFFFFF` |  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
|
|
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 }}
|
menard-0.2.0/.gitignore
ADDED
|
@@ -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"]
|