Modern CLI tools with better UX
Thanks for your interest in contributing to the Pynosaur ecosystem. This guide covers everything from reporting bugs to building entirely new tools.
Open an issue in the tool’s own repository (e.g., Pynosaur/see for see bugs).
Include:
python --version) and OS<tool> --versionHave an idea for an existing tool? Open an issue on the tool’s repo. For ecosystem-wide suggestions (new conventions, pget features, site improvements), use Pynosaur/pynosaur.
fix/description or feat/description)mainSee the full Creating a Program guide. In short:
pages/ and docs/All tools use the Python standard library only. No pip dependencies. This is the core philosophy – it keeps tools portable, fast to install, and free from supply-chain risk.
If the stdlib cannot do something, find a creative way or accept the limitation. Do not introduce external packages.
Run blue . before committing. The pre-commit hook does this automatically if blue is installed.
main.py – parse arguments, call core logic, print outputapp/core/ – pure functions that return data, not printdoc/<name>.yaml drives --help output via read_app_doctest/ – use unittest from stdlib-h/--help and -v/--version0 on success, non-zero on error--no-color for environments without ANSI support-x, long --extended)python test/test_main.pyblue . (zero issues required)fix: handle empty input in see or feat: add --timeout to purlWhen your PR merges to main and touches app/, doc/, or .program, the release workflow runs automatically:
.programv<version>So if your change warrants a new version, bump the version in your PR:
app/__init__.py.programdoc/<name>.yaml VERSION fieldAll three must match.
Use semantic-ish versioning:
| Change | Bump | Example |
|---|---|---|
| Bug fix | Patch | 0.1.0 -> 0.1.1 |
| New feature (backward-compatible) | Minor | 0.1.1 -> 0.2.0 |
| Breaking change | Major | 0.2.0 -> 1.0.0 |
For tools still at 0.x.y, minor bumps are fine for new features.
cd <tool>/
python test/test_main.py
color=False when testing formatted outputTests run on:
Make sure your code works across all of these. Avoid Python 3.9+ features unless the tool explicitly requires it.
Plack is the ecosystem’s linter. Install it:
pget install blue
Or run from source:
cd /path/to/blue && python app/main.py /path/to/your/tool/
Common issues blue catches:
Auto-fix with blue --apply .
Each tool is its own repository under the Pynosaur organization:
github.com/Pynosaur/<name>/
├── .github/workflows/ # CI + release
├── .githooks/ # pre-commit (blue)
├── app/ # Source code
│ ├── __init__.py # __version__
│ ├── main.py # Entry point
│ ├── core/ # Business logic
│ └── utils/ # doc_reader, helpers
├── doc/<name>.yaml # Structured docs
├── test/ # Unit tests
├── .program # Metadata for pget
├── BUILD # Bazel + Nuitka
├── MODULE.bazel # Bazel config
├── LICENSE # MIT
└── README.md
The meta-repository Pynosaur/pynosaur holds the website, roadmap, and ecosystem docs.
pget search queries the Pynosaur GitHub org for repositories that contain a .program file. That file declares the tool’s name, version, and description.
The site is Jekyll, deployed via GitHub Pages. A workflow fetches each tool’s README from GitHub and renders it at pynosaur.org/<name>/. The sidebar auto-discovers tools from the org.
Push to main with changes in app/, doc/, or .program triggers release.yml, which:
.programv<version>No manual tagging needed.
Be respectful, constructive, and patient. We are all building this for fun and learning.