Wardline is a lightweight semantic-tainting static analyzer for Python, built for small teams who want capable tooling without enterprise weight. Bug reports, feature ideas, docs fixes, and code changes are all welcome.
Open a bug report. Include:
- Wardline version (
wardline --version) - Whether you hit it via the CLI or the MCP server
- A minimal decorated snippet that reproduces the finding (or its absence)
- Expected vs actual behavior
- Python version and OS
Open a feature request. Describe the problem you are solving and your proposed approach.
Wardline uses uv.
git clone https://github.com/foundryside-dev/wardline
cd wardline
uv sync --all-extras --group devThis installs the base package, every runtime extra (scanner, loomweave,
docs), and the dev tooling (ruff, mypy, pytest) into .venv.
- Linter / formatter: ruff (config in
pyproject.toml, line-length 120) - Type checker: mypy in strict mode (
src/wardlineonly) - Tests: pytest, run under
pytest-randomly(order-dependence is a real bug)
Before committing:
make format # auto-fix formatting and lint
make lint # check without modifying (same as CI)
make typecheck # mypy strictA ruff pre-commit hook is available — uv run --with pre-commit pre-commit install.
make test # quick run
make test-cov # with coverage; CI enforces a 90% floorThe network (live OpenRouter judge) and loomweave_e2e (real loomweave serve)
suites are deselected by default. Opt in with uv run pytest -m network /
uv run pytest -m loomweave_e2e (the latter needs a route-capable Loomweave binary —
see CLAUDE.md).
- TDD. Write the failing test first.
- Keep PRs focused — one logical change per PR.
- New behavior needs tests. New
[wardline]keys inweft.tomlneed aconfig_schema.pyupdate. - No back-compat shims for unreleased specs — make clean changes.
- Wardline scans its own source as a CI gate; keep the tree finding-clean (or baselined).
This project uses Conventional Commits:
<type>: <short description>
| Type | When to use |
|---|---|
feat |
New feature |
fix |
Bug fix |
docs |
Documentation only |
test |
Adding or updating tests |
ci |
CI/CD pipeline changes |
build |
Build system or packaging changes |
refactor |
Neither fixes a bug nor adds a feature |
style |
Formatting only |
chore |
Maintenance (deps, config) |
Use ! after the type for breaking changes: refactor!: rename public API.
- Branch from
main. - Make your change (test-first).
- Run
make ciuntil green (ruff check + format check + mypy strict + pytest with the 90% coverage floor). - Open a PR against
main, describing what and why; link related issues. - Ensure the CI checks pass.
Good starting points: documentation improvements, tests for uncovered paths, and CLI help-text polish.
The big-picture developer guide — the L1/L2/L3 taint pipeline, the package map, and the conventions — lives in CLAUDE.md. Read it before a non-trivial change.
This project follows the Contributor Covenant.
By contributing, you agree your contributions are licensed under the MIT License.