Markdown dependency analyzer โ extract all dependencies, generate diagrams and charts
Project description
mdflow
AI Cost Tracking
- ๐ค LLM usage: $0.7500 (5 commits)
- ๐ค Human dev: ~$200 (2.0h @ $100/h, 30min dedup)
Generated on 2026-05-03 using openrouter/qwen/qwen3-coder-next
Markdown dependency analyzer โ extract all dependencies, generate diagrams and charts.
mdflow parses Markdown files and extracts every possible structural element:
headings, links, fenced code blocks (including markpact:* embedded file references),
list items, TOON/YAML quality sections, and document metadata.
It then generates Mermaid diagrams, HTML reports, and Markdown summaries.
What it extracts
| Element | Details |
|---|---|
| Headings | Full H1โH6 hierarchy, anchor slugs |
| Links | [text](href) โ classified as internal / external / anchor / image |
| Code blocks | Language, content, line range, markpact:type path=... metadata |
| List items | Depth, parent heading, clean text |
| TOON sections | ALERTS, REFACTOR, HOTSPOTS, HEALTH, NEXT, RISKS, PIPELINESโฆ |
| Document metadata | ## Metadata key/value lists |
| Cross-doc dependencies | Links between files, markpact embedded file paths |
Generated outputs
| Output | Description |
|---|---|
{stem}_report.html |
Self-contained HTML report with all diagrams (Mermaid.js) |
{stem}_report.md |
Markdown summary with inline Mermaid |
{stem}_heading_mindmap.mermaid |
Mindmap of heading hierarchy |
{stem}_section_flow.mermaid |
Section flowchart with code/link annotations |
{stem}_code_pie.mermaid |
Pie chart of code blocks by language |
{stem}_markpact_graph.mermaid |
Graph of embedded file references |
{stem}_alerts_graph.mermaid |
TOON alerts & refactor tasks flowchart |
{stem}_workflow.mermaid |
DOQL workflow steps diagram |
dependency_graph.html |
Cross-document dependency graph (directory scan) |
Installation
# Clone or copy the mdflow/ directory, then:
pip install -e .
# No mandatory dependencies โ pure stdlib.
Usage
Python API
from mdflow import MdFlow
flow = MdFlow()
# โโ Single file โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
doc = flow.parse("SUMR.md")
print(doc.title) # "Ze ลบrรณdeล"
print(len(doc.headings)) # 24
print([ts.name for ts in doc.toon_sections]) # ['HEALTH', 'REFACTOR', ...]
print(doc.metadata) # {'name': 'redsl', 'version': '1.2.45', ...}
# Access markpact embedded file references
for cb in doc.markpact_blocks:
print(f"markpact:{cb.markpact_type} path={cb.markpact_path}")
# Get TOON quality metrics
metrics = flow.toon_metrics(doc)
print(metrics["health"]) # {'cc_mean': 20.0, 'critical': 7}
print(metrics["refactors"][:3]) # list of refactor tasks
# Get all Mermaid diagrams as strings (no files written)
diagrams = flow.diagrams(doc)
print(diagrams["section_flow"]) # flowchart TD ...
# Generate reports to disk
flow.report(doc, "output/") # writes HTML + MD + .mermaid files
# โโ Directory scan โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
docs, graph = flow.scan("docs/", "output/")
print(f"{len(docs)} files, {len(graph.edges)} dependency edges")
CLI
# Analyze a single file
mdflow analyze SUMR.md --output output/
# Select formats
mdflow analyze SUMR.md --format html,md
# Scan a directory
mdflow scan docs/ --output output/
# Print a specific Mermaid diagram to stdout
mdflow diagram SUMR.md --diagram section_flow
mdflow diagram SUMR.md --diagram list # list available diagrams
# Write diagram to file
mdflow diagram SUMR.md --diagram alerts_graph -o alerts.mermaid
Mermaid validation
Every generated .mermaid file is automatically validated before writing.
Detected issues are printed inline and written as tickets to TODO.md:
[mdflow] โ 1 error(s) output/SUMR_section_flow.mermaid
โ [BACKTICK_IN_LABEL] Backtick inside node label (line 5): ...
[mdflow] โ 1 validation ticket(s) written to TODO.md
Validation checks: EMPTY_DIAGRAM, NO_DIAGRAM_TYPE, BACKTICK_IN_LABEL,
DUPLICATE_NODE_ID, MINDMAP_ILLEGAL_CHARS.
Quality tooling
mdflow uses prefact and
pyqual for automated code quality gates.
# Run full quality loop (prefact scan โ ruff โ pytest โ LLM fix on fail)
task quality # alias: pyqual run
# Scan for code issues (duplicate imports, wildcard imports, โฆ)
task prefact # alias: prefact scan -p .
# Auto-fix detected issues
task prefact-fix # alias: prefact fix -p .
A git pre-commit hook (.git/hooks/pre-commit) runs all checks automatically
before every commit and blocks on failures, writing tickets to TODO.md.
Testing
Unit tests
pytest tests/ -v
E2E / CLI tests (TestQL)
142 scenarios covering CLI commands, output file validation, and integration with real semcod workspace projects:
# All scenarios
task testql-run
# Smoke only (help, subcommands)
task testql-smoke
# Full E2E (analyze, scan, diagram, semcod projects, mermaid validation)
task testql-e2e
# Single scenario
testql run testql-scenarios/02_cli_analyze_e2e.testql.toon.yaml
Scenarios in testql-scenarios/:
| File | Tests | Scope |
|---|---|---|
01_cli_help_version |
16 | help, subcommand help |
02_cli_analyze_e2e |
35 | analyze: HTML/MD/mermaid output |
03_cli_scan_e2e |
13 | scan: per_file output, dependency graph |
04_cli_diagram_e2e |
23 | diagram: list, stdout, file, unknown name |
05_e2e_semcod_projects |
30 | prefact, pyqual, planfile, goal SUMD.md |
06_e2e_mermaid_validation |
22 | backtick-free labels, pie title format |
Architecture
mdflow/
โโโ __init__.py โ MdFlow faรงade (high-level API)
โโโ models.py โ Data classes: MdDocument, DependencyGraph, โฆ
โโโ parser.py โ Core Markdown parser (stdlib only)
โโโ validators.py โ Mermaid diagram validator + TODO.md ticket writer
โโโ analyzers/
โ โโโ __init__.py โ DependencyAnalyzer, StructureAnalyzer,
โ CodeInventoryAnalyzer, ToonAnalyzer
โโโ generators/
โ โโโ __init__.py
โ โโโ mermaid.py โ All Mermaid diagram generators
โ โโโ html.py โ Self-contained HTML report (split into helpers)
โ โโโ markdown.py โ Markdown summary report (split into helpers)
โโโ cli.py โ argparse CLI entry point
Examples
Basic
examples/basic/01_parse_single_file.pyโ Parse and inspect a single documentexamples/basic/02_generate_reports.pyโ Generate HTML, Markdown, and Mermaid reportsexamples/basic/03_diagrams_as_strings.pyโ Get diagrams as strings (no file I/O)examples/basic/04_cli_basics.shโ CLI:analyze,scan,diagram
Advanced
examples/advanced/01_directory_scan.pyโ Scan a directory, build dependency graphsexamples/advanced/02_toon_analysis.pyโ Extract TOON quality metricsexamples/advanced/03_custom_diagram_pipeline.pyโ Custom HTML with selected diagrams
API / Extensibility
examples/api/01_low_level_parser.pyโ UseMdParserdirectlyexamples/api/02_custom_analyzer.pyโ Build your own analyzer
semcod workspace
examples/semcod/analyze_prefact.pyโ Parseprefact/SUMD.md, extract TOON metricsexamples/semcod/scan_semcod_workspace.pyโ Scan 6 semcod projects, cross-project TOON summaryexamples/semcod/toon_comparison.pyโ CC/alerts/refactors comparison table across projectsexamples/semcod/04_cli_semcod.shโ CLI shell examples for the semcod workspace
python examples/semcod/toon_comparison.py
python examples/semcod/scan_semcod_workspace.py
Supported TOON sections
mdflow recognises these TOON section names inside toon / yaml code blocks
and in blocks tagged markpact:analysis:
ALERTS ยท REFACTOR ยท HOTSPOTS ยท HEALTH ยท NEXT ยท RISKS ยท PIPELINES
ยท DUPLICATES ยท WARNINGS ยท MODULES ยท EVOLUTION ยท COUPLING
Extension points
- Custom extractor: subclass or monkey-patch
MdParser - Custom diagram: call
flow.diagrams(doc)and extend themermaidmodule - Graphviz output: install
graphvizPython package and useDependencyGraphdata directly
License
Licensed under Apache-2.0.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mdflow-0.1.6.tar.gz.
File metadata
- Download URL: mdflow-0.1.6.tar.gz
- Upload date:
- Size: 28.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bbbee27e1f365f40d2480d7566cae6c4083dd56fdf5e8ef432cd61e6fe506ac0
|
|
| MD5 |
ecb9f489aa091126574f6f69edb6e4da
|
|
| BLAKE2b-256 |
63fd65cf14040558c0697182514e7f377dff03abde23906938f850a40a108955
|
File details
Details for the file mdflow-0.1.6-py3-none-any.whl.
File metadata
- Download URL: mdflow-0.1.6-py3-none-any.whl
- Upload date:
- Size: 29.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
060b0683168eaa1e58bb468771091964a0113a2df5de39efff29764dea07e96d
|
|
| MD5 |
29d5e12f4326869a4dd9d6a500af80a4
|
|
| BLAKE2b-256 |
3dfa1e894a7bb423d8a4a21e3df2005ca4ea3ecc1e68cb9f07cf639cffc0e62c
|