Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
161 commits
Select commit Hold shift + click to select a range
f11a6fc
Bump astral-sh/setup-uv from 4 to 7
dependabot[bot] Mar 6, 2026
29c00dc
Bump actions/checkout from 4 to 6
dependabot[bot] Mar 6, 2026
86bf8aa
Merge pull request #1 from deeplook/dependabot/github_actions/astral-…
deeplook Mar 6, 2026
352c03d
Merge pull request #2 from deeplook/dependabot/github_actions/actions…
deeplook Mar 6, 2026
f9cba84
fix: uvx install command, version in uv.lock
deeplook Mar 6, 2026
f66ab15
fix: add Windows support
deeplook Mar 9, 2026
a768e3b
fix: make test suite pass on Windows
deeplook Mar 9, 2026
08e8cec
fix: make final test pass on Windows
deeplook Mar 9, 2026
a08d3fc
fix: Windows support, improve README, Makefile
deeplook Mar 9, 2026
54b7132
feat: add termsize subcommand and restructure CLI as multi-command app
deeplook Mar 9, 2026
c7011b5
feat: add SSH remote directory scanning via paramiko
deeplook Mar 9, 2026
e8408e9
feat: add AWS S3 scanning and extract remote access docs
deeplook Mar 9, 2026
6764c0e
feat: apply --depth to local directory scans
deeplook Mar 9, 2026
77385db
feat: add GitHub repository scanning
deeplook Mar 9, 2026
6b5b560
feat: add archive file scanning (zip, tar, 7z, rar and ZIP synonyms)
deeplook Mar 9, 2026
625bf60
docs: move supplementary .md files to docs/
deeplook Mar 9, 2026
b0e91a7
chore: bump version to 0.3.0, add Topic :: System :: Archiving classi…
deeplook Mar 9, 2026
350a861
fix: remove redundant type: ignore comments superseded by mypy overrides
deeplook Mar 9, 2026
904db9f
bump version in uv.lock, too
deeplook Mar 9, 2026
3666a7a
feat: add interactive SVG output format
deeplook Mar 10, 2026
826576c
fix: show original byte sizes in SVG tooltips when --log is active
deeplook Mar 10, 2026
600e9a2
fix: improve GitHub error messages and surface them cleanly in the CLI
deeplook Mar 10, 2026
6e84329
feat: add docker:// support for scanning running containers
deeplook Mar 10, 2026
a2dd8aa
feat: add pod:// k8s scanning, github:// scheme, tile borders, docs o…
deeplook Mar 10, 2026
3982dcb
minor corrections to EXAMPLES.md
deeplook Mar 10, 2026
7e26f2d
prepare for release
deeplook Mar 10, 2026
2999454
feat: expand archive support with libarchive, encryption handling
deeplook Mar 11, 2026
3361ff7
feat: legend shows file counts, github subpath support, legend corner…
deeplook Mar 11, 2026
e0f6eba
feat: show file/dir/size stats in root tile header
deeplook Mar 11, 2026
59c6f3c
docs: update changelog with root tile stats entry
deeplook Mar 11, 2026
b54a1b3
fix: cast legend row limit to int to satisfy mypy slice index check
deeplook Mar 11, 2026
1aac400
fix: catch ImportError for missing s3/ssh extras and show install hint
deeplook Mar 11, 2026
8438df6
fix: minor issue in changelog
deeplook Mar 11, 2026
9dc1820
fix: escape XML special chars in SVG data-name and data-ext attributes
deeplook Mar 11, 2026
c83b612
feat: embed metadata in PNG and SVG output (date, version, OS, comman…
deeplook Mar 11, 2026
54e10f7
feat: add read-meta CLI command to extract metadata from PNG and SVG …
deeplook Mar 11, 2026
6a66a40
feat: multiple local roots and --subtree/-s option
deeplook Mar 12, 2026
0d7bd57
fix: strip path from command name in embedded metadata
deeplook Mar 12, 2026
ac1e51c
feat: support single file input; fix plural in file count header
deeplook Mar 12, 2026
3a504dd
feat: add watch command and K8s distroless debug notes
deeplook Mar 13, 2026
36646da
fix: clearer error for distroless pods lacking find/shell
deeplook Mar 13, 2026
36b3d68
chore: remove K8S.md debug notes (applied)
deeplook Mar 13, 2026
b9eea16
fix: pod exclude now prunes subtrees, not just the exact path
deeplook Mar 13, 2026
8861fbe
fix: docker exclude now prunes subtrees, not just the exact path
deeplook Mar 13, 2026
fb00d78
feat: rotate file labels 90° on tall narrow tiles
deeplook Mar 13, 2026
efb187a
feat: rotate vertical file labels; fix adaptive font sizing
deeplook Mar 13, 2026
7a656ed
feat: show scan and render duration in header messages
deeplook Mar 13, 2026
e0595d3
chore: update CHANGELOG for 0.3.2; fix lint, mypy, and stale test
deeplook Mar 13, 2026
e36ce02
fix: prevent label overflow on very narrow tiles
deeplook Mar 13, 2026
e24b92f
docs: regenerate example images with improved label rendering
deeplook Mar 13, 2026
3795376
feat: prefer horizontal text for file labels, fall back to vertical w…
deeplook Mar 14, 2026
97fe421
docs: regenerate example images
deeplook Mar 14, 2026
fe265b3
feat: read-meta accepts multiple input files
deeplook Mar 14, 2026
839ff42
feat: add breadcrumbs mode to collapse single-child directory chains
deeplook Mar 14, 2026
f42d3f9
feat: show tree depth in root label, fix depth invariance with breadc…
deeplook Mar 14, 2026
27bcf11
docs: add 0.3.3 release notes and update README for breadcrumbs and d…
deeplook Mar 14, 2026
906d82e
chore: bump version to 0.3.3
deeplook Mar 14, 2026
146036d
feat(watch): accept multiple directory arguments
deeplook Mar 17, 2026
e224955
feat(map): allow multiple file paths as roots
deeplook Mar 17, 2026
f569401
docs: update README and CHANGELOG for multi-path watch and file roots
deeplook Mar 17, 2026
465313f
docs: document stdout output via --output -
deeplook Mar 17, 2026
2c9328e
feat(watch): debounce, event log, depth, and animate redesign
deeplook Mar 18, 2026
33b0d81
feat(watch): highlight changed files in animated treemaps
deeplook Mar 18, 2026
f47523e
feat: make libarchive-c an optional dependency
deeplook Mar 18, 2026
190e30f
feat(git): add git history replay subcommand with animated APNG output
deeplook Mar 27, 2026
3b7d4c9
feat(replay): add replay subcommand to animate JSONL event logs as tr…
deeplook Mar 28, 2026
53fef4d
feat(display): add optional title prefix to display_window temp file
deeplook Mar 28, 2026
cb7c67c
feat(git): support @ref suffix on local repo path in dirplot git
deeplook Mar 28, 2026
84499d1
refactor: rename render.py → render_png.py and test_render.py → test_…
deeplook Mar 28, 2026
b5607c0
docs: update render import in EXAMPLES.md after render.py rename
deeplook Mar 28, 2026
1a9931e
feat(mp4): add MP4 video output for watch, git, and replay animations
deeplook Mar 28, 2026
7a56af8
fix(tests): skip tree-format test when tree is not a subprocess on Wi…
deeplook Mar 28, 2026
9147129
fix(build): exclude large local artifacts from sdist
deeplook Mar 28, 2026
400dc2c
feat(git): add --last flag for time-period-based commit filtering
deeplook Mar 31, 2026
04b4c62
feat(github): fall back to gh CLI credentials automatically
deeplook Mar 31, 2026
38634fc
feat(mp4): embed and read dirplot metadata in MP4 output files
deeplook Apr 3, 2026
0fdbf0f
docs+tests: add tests for --last and gh CLI auth; update docs
deeplook Apr 3, 2026
5cfde69
fix(cli): mention .mov in output validation error messages
deeplook Apr 3, 2026
e030df6
tests: increase coverage from 72% to 82%
deeplook Apr 3, 2026
08babe4
docs: mention watchdog dependency in README
deeplook Apr 3, 2026
19409f0
feat: add --dark/--light mode flag to all treemap commands
deeplook Apr 3, 2026
f5e9268
feat: add dirplot demo command
deeplook Apr 3, 2026
2fde6d9
chore: ignore demo/ output folder
deeplook Apr 3, 2026
0b5dfe2
fix(lint): resolve all ruff and mypy errors
deeplook Apr 3, 2026
aad39d5
fix(tests): strip ANSI codes before asserting in test_demo_help
deeplook Apr 3, 2026
e0e291e
fix(windows): use posix paths for highlights and rect_map keys
deeplook Apr 3, 2026
82a0d9e
fix(windows): fix remaining str(repo/fp) → .as_posix() in R and C cases
deeplook Apr 3, 2026
8922eb6
docs(readme): mention APNG, MP4, and MOV output formats in features
deeplook Apr 3, 2026
d3f8500
feat: add clear not-found errors for git and unrar
deeplook Apr 4, 2026
00253e7
feat(cli): reorder help output to demo, termsize, map, git, watch, re…
deeplook Apr 4, 2026
a64d479
feat: add dirplot hg command for Mercurial history animation
deeplook Apr 4, 2026
617603c
chore: bump version to 0.4.2
deeplook Apr 4, 2026
9262396
fix(cushion): apply two-level hierarchical shading instead of flat pe…
deeplook Apr 15, 2026
d088459
test(watch): make APNG test transparent and keep outputs on disk
deeplook Apr 15, 2026
9bb5e48
docs(changelog): document cushion hierarchical shading fix
deeplook Apr 15, 2026
2865134
docs: update example images, add git history animation example and op…
deeplook Apr 15, 2026
ee8f201
docs(changelog): release 0.4.2
deeplook Apr 15, 2026
0981a5a
fix(test): specify utf-8 encoding in write_text to fix Windows CI fai…
deeplook Apr 15, 2026
29c028b
feat: add overview subcommand at help position #2
deeplook Apr 15, 2026
f839afa
docs: use absolute URL for openclaw video to fix GitHub rendering
deeplook Apr 15, 2026
956efc5
docs: rename openclaw MP4 to replace .. with - for URL compatibility
deeplook Apr 15, 2026
1a34851
docs: use GitHub CDN URL for openclaw video to fix inline rendering
deeplook Apr 15, 2026
d5199ab
feat(overview): enrich app header with version, command count, and gl…
deeplook Apr 16, 2026
347b99b
fix: suppress credential helper on git clone to avoid macOS Keychain …
deeplook Apr 27, 2026
691fa88
feat(logscale): merge --log and --logscale into single --logscale param
deeplook Apr 28, 2026
32abd9f
Merge feat/logscale-param into main
deeplook Apr 28, 2026
86f4554
fix(mypy): ignore attr-defined on PackageMetadata.get() for Python 3.…
deeplook Apr 28, 2026
b0ecd0a
docs: add pipx as alternative install method
deeplook Apr 30, 2026
0e11170
feat(metrics): add dirplot metrics command with JSON output and map -…
deeplook May 6, 2026
84697ab
fix(scanner): add TypedDict types for tree_metrics_dict to satisfy mypy
deeplook May 6, 2026
fbb46b0
fix(cli): CLIG compliance — secrets, flags, output routing
deeplook May 8, 2026
39e4367
refactor: split main.py into commands/ and helpers/ subpackages
deeplook May 8, 2026
66abc8c
docs: update dirplot.png demo image
deeplook May 9, 2026
4b9f984
fix(mypy): explicitly re-export app from main to satisfy no-implicit-…
deeplook May 9, 2026
4fc017f
ci: add mypy as local pre-commit hook to catch type errors before push
deeplook May 9, 2026
988b999
docs: fix CLI flag, password-archive support, and colormap wording
deeplook May 11, 2026
f5b392e
refactor: replace matplotlib with cmap for colormap lookups
deeplook May 11, 2026
97f2f0a
fix(tests): patch display_inline directly instead of builtins.open
deeplook May 11, 2026
e6d6747
test: add replay fixture events.jsonl with real timestamps and end-to…
deeplook May 11, 2026
83c7fde
feat: add dirplot diff command with --context/--no-context flag
deeplook May 11, 2026
22a08ec
fix(diff): use as_posix() for highlight keys to match rect_map from b…
deeplook May 11, 2026
ab04625
chore: bump version to 0.4.4
deeplook May 11, 2026
223f5e1
docs: update README, CHANGELOG, and CLI.md for 0.4.4 (diff command, c…
deeplook May 11, 2026
011df95
chore: update uv.lock for 0.4.4
deeplook May 12, 2026
22a12e9
feat(diff): remote sources, git/hg ref syntax, single-arg shorthand, …
deeplook May 12, 2026
bbbea6b
feat(diff): move [A→B] label to the left of the header string
deeplook May 12, 2026
0f3cc19
feat(exclude): glob pattern support, consistent matching across all b…
deeplook May 12, 2026
29253d6
feat(include): rename --subtree to --include, add to diff and metrics
deeplook May 12, 2026
61d5bcf
fix: rename includes -> include to match exclude naming
deeplook May 12, 2026
117fa40
feat(watch): use ISO 8601 timestamps with timezone in event log
deeplook May 12, 2026
97b6e1b
fix(replay): use matches_exclude for consistent exclude filtering
deeplook May 12, 2026
64c956c
docs: add ISO 8601 timestamp entry to CHANGELOG
deeplook May 12, 2026
4aded81
refactor: centralise NO_EXT, defaults, breadcrumb sep, terminal canva…
deeplook May 12, 2026
6bd57da
refactor(watch): remove animation output, add --snapshot for external…
deeplook May 12, 2026
5d221c4
docs: update README for watch refactor (snapshot, no animation)
deeplook May 12, 2026
76d59a6
fix(cli): apply CLIG audit fixes and extend help examples
deeplook May 12, 2026
0ed5bd2
fix(docker): harden Dockerfile and extend .dockerignore
deeplook May 12, 2026
3c099c0
docs(cli): add Docker usage section with inline display examples
deeplook May 12, 2026
fe3ed04
fix(display): pass explicit width to iTerm2 inline protocol to fill t…
deeplook May 13, 2026
fef5934
fix(map,diff): imply --no-show when --output - is used
deeplook May 13, 2026
52a3463
docs: improve all user-facing documentation
deeplook May 13, 2026
31e4722
docs(readme): add TL;DR, orientation table, and entry points table
deeplook May 13, 2026
c14fd0e
docs: remove SSH_DESIGN.md (superseded by EXAMPLES.md and the code)
deeplook May 13, 2026
8671639
docs(security): update supported version to 0.4.x
deeplook May 13, 2026
3b44b6b
docs: add docs/README.md index
deeplook May 13, 2026
9ac96d2
feat(gdrive): add Google Drive backend via gog CLI
deeplook May 13, 2026
7593833
docs(gdrive): add Google Drive backend documentation
deeplook May 13, 2026
772cda7
docs: add MkDocs Material site with GitHub Pages workflow
deeplook May 13, 2026
895c54f
fix(ssh): tighten is_ssh_path regex to exclude Windows paths and git …
deeplook May 13, 2026
84d2d45
fix(docs): fix pages workflow checkout version and broken anchor links
deeplook May 13, 2026
f4042e4
fix(docs): fix image paths in EXAMPLES.md for MkDocs use_directory_urls
deeplook May 13, 2026
c8d42bd
fix(docs): use absolute raw GitHub URLs for images to work on both Gi…
deeplook May 13, 2026
ecf34ef
docs(examples): replace openclaw video with steipete/birdclaw git his…
deeplook May 13, 2026
129ac63
fix(docs): use media.githubusercontent.com for LFS-tracked video
deeplook May 13, 2026
a27c9a9
docs(examples): add video controls with seek slider
deeplook May 13, 2026
c5da029
docs(examples): set video start position to 12s
deeplook May 13, 2026
7355dd6
feat(git,hg): redesign animation interface
deeplook May 15, 2026
2857529
test(git,hg): update and extend tests for new interface
deeplook May 15, 2026
19b6a54
docs: update CLI.md, EXAMPLES.md, README, CHANGELOG for new git/hg in…
deeplook May 15, 2026
5aa4b9b
build: add serve-docs Makefile target
deeplook May 15, 2026
6c6874a
build(deps): bump actions/checkout from 4 to 6
dependabot[bot] May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
.venv/
.git/
.pytest_cache/
__pycache__/
*.pyc
*.egg-info/
dist/
.mypy_cache/
.ruff_cache/
*.png
*.svg
*.mp4
*.apng
*.mov
misc/
scripts/
docs/
examples/
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*.mp4 filter=lfs diff=lfs merge=lfs -text
24 changes: 21 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v5
uses: astral-sh/setup-uv@v7

- name: Set up Python ${{ matrix.python-version }}
run: uv python install ${{ matrix.python-version }}
Expand All @@ -36,3 +36,21 @@ jobs:

- name: Test
run: uv run pytest --cov=src --cov-report=xml

test-windows:
runs-on: windows-latest

steps:
- uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v7

- name: Set up Python 3.10
run: uv python install 3.10

- name: Install dependencies
run: uv sync --all-extras

- name: Test
run: uv run pytest --cov=src --cov-report=xml
21 changes: 21 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Deploy docs

on:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: write

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v7

- name: Deploy
run: uvx --with mkdocs-material mkdocs gh-deploy --force
4 changes: 2 additions & 2 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v4
uses: astral-sh/setup-uv@v7

- name: Build
run: uv build
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,5 @@ Thumbs.db
NOTES.md
TASKS.md
tests/example_dirplot.png
tests/animation/
demo/
9 changes: 9 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,12 @@ repos:
- id: ruff
args: [--fix]
- id: ruff-format

- repo: local
hooks:
- id: mypy
name: mypy
entry: uv run mypy src
language: system
pass_filenames: false
types: [python]
696 changes: 696 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

55 changes: 46 additions & 9 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,66 @@
## Development Setup

```bash
git clone https://github.com/deeplook/dirplot
git clone -c credential.helper= https://github.com/deeplook/dirplot
cd dirplot
uv sync --all-extras
uv run pre-commit install
uv sync --all-extras # install all dependencies including dev tools and extras
uv run pre-commit install # install git hooks for formatting/linting
```

## Running Tests

```bash
make test # run the full test suite
make coverage # run with coverage report (target: 90% line coverage)
```

To run a specific test file or test:

```bash
uv run pytest tests/test_cli.py
uv run pytest tests/test_drawing.py::test_cushion_shading -v
```

## Code Style

This project uses [ruff](https://docs.astral.sh/ruff/) for linting and formatting, and [mypy](https://mypy.readthedocs.io/) for type checking.
This project uses [ruff](https://docs.astral.sh/ruff/) for linting and formatting, and [mypy](https://mypy.readthedocs.io/) for type checking. Pre-commit hooks run these automatically on each commit.

```bash
make format # auto-format and fix lint issues
make lint # check only (no changes)
```

## Testing
## Code Organisation

```bash
make test # run the test suite
make coverage # run with coverage report
```
src/dirplot/
app.py — Typer app entry point; imports all subcommands
main.py — CLI entry point called by the `dirplot` script
commands/
treemap.py — `dirplot map` command
diff.py — `dirplot diff` command
vcs.py — `dirplot git` and `dirplot hg` commands
watch.py — `dirplot watch` command
replay.py — `dirplot replay` command
misc.py — `dirplot demo`, `dirplot termsize`, `dirplot read-meta`
render_png.py — PNG treemap renderer (Pillow)
render_svg.py — SVG treemap renderer
layout.py — squarified treemap layout algorithm
scanner.py — local filesystem scanner and metrics
display.py — inline terminal display (iTerm2 / Kitty protocols)
terminal.py — terminal size detection
github.py — GitHub Git Trees API backend
ssh.py — SSH backend (paramiko)
s3.py — AWS S3 backend (boto3)
docker.py — Docker backend (docker exec)
k8s.py — Kubernetes backend (kubectl exec)
archive.py — archive reading (zip, tar, 7z, rar, libarchive)
node.py — Node dataclass (shared tree representation)
```

All remote backends return a `Node` tree using the same dataclass, so `create_treemap` and `create_treemap_svg` work identically regardless of source.

Target: 90 % line coverage.
To add a new command: create `src/dirplot/commands/mycommand.py` with a Typer app, then import and add it in `app.py`.

## Submitting Changes

Expand Down
25 changes: 25 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
FROM python:3.12.13-slim

WORKDIR /app

# Install build tools needed by some optional deps
RUN pip install --no-cache-dir uv==0.11.3

# Copy project metadata first for layer caching
COPY pyproject.toml README.md ./

# Copy source
COPY src/ src/

# Install dirplot with all extras (no dev tools in the runtime image)
RUN uv pip install --system --no-cache ".[ssh,s3]"

# Copy the rest (tests, docs, etc.) so the container is a useful scan target
COPY . .

# Run as non-root
RUN useradd -m app && chown -R app /app
USER app

# Keep the container running so docker:// scanning works
CMD ["python", "-c", "import time; time.sleep(1e9)"]
41 changes: 24 additions & 17 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,38 +1,45 @@
.PHONY: install lint format test coverage clean install-tool check-all publish-test publish
.PHONY: install lint format test coverage clean install-tool check-all publish-test publish serve-docs help

install:
uv sync --all-extras
help: ## Show this help
@grep -E '^[a-zA-Z_-]+:.*##' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*## "}; {printf " %-14s %s\n", $$1, $$2}'

lint:
uv run ruff check src tests
uv run --all-extras mypy src
install: ## Install all dependencies (including extras)
uv sync --all-extras

format:
format: ## Auto-format and fix lint issues
uv run ruff format src tests
uv run ruff check --fix src tests

test:
lint: ## Run ruff and mypy
uv run ruff check src tests
uv run --all-extras mypy src

test: ## Run the test suite
uv run --all-extras pytest

coverage:
coverage: ## Run tests with HTML + terminal coverage report
uv run --all-extras pytest --cov=src --cov-report=html --cov-report=term

clean:
check-all: install format lint test clean ## Run format, lint, test, and clean
@echo "All checks passed!"

install-tool: ## Install dirplot as a uv tool (reinstall)
uv tool install --reinstall .

clean: ## Remove build artifacts and caches
rm -rf dist build *.egg-info
rm -rf .pytest_cache .mypy_cache .ruff_cache
rm -rf htmlcov .coverage coverage.xml
find . -type d -name __pycache__ -exec rm -rf {} +
find . -type f -name .DS_Store -exec rm {} +

install-tool:
uv tool install --reinstall .

publish-test:
publish-test: ## Build and publish to TestPyPI
uv build
uv publish --index testpypi --token $(TEST_PYPI_TOKEN)

publish:
publish: ## Build and publish to PyPI
uv build
uv publish --token $(PYPI_TOKEN)

check-all: install format lint test clean
@echo "All checks passed!"
serve-docs: ## Serve the MkDocs documentation locally (http://localhost:8000)
uv run --with mkdocs-material mkdocs serve
Loading
Loading