Pynosaur

Modern CLI tools with better UX

View the Project on GitHub pynosaur/pynosaur

← Back

Contributing to Pynosaur

Thanks for your interest in contributing to the Pynosaur ecosystem. This guide covers everything from reporting bugs to building entirely new tools.



Ways to Contribute

Report Bugs

Open an issue in the tool’s own repository (e.g., Pynosaur/see for see bugs).

Include:

Suggest Improvements

Have 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 Bugs or Add Features

  1. Fork the tool’s repository
  2. Create a branch (fix/description or feat/description)
  3. Make your changes following the standards below
  4. Run tests and blue
  5. Open a PR against main

Build a New Tool

See the full Creating a Program guide. In short:

  1. Check the Roadmap for planned tools
  2. Open an issue in Pynosaur/pynosaur to discuss
  3. Build following the standard layout
  4. Submit for inclusion in the ecosystem

Improve Documentation


Code Standards

Pure Python

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.

Style

Run blue . before committing. The pre-commit hook does this automatically if blue is installed.

Architecture

CLI Conventions


Pull Request Process

Before Opening a PR

  1. Run tests: python test/test_main.py
  2. Run linter: blue . (zero issues required)
  3. Test manually: exercise the feature or bugfix by hand
  4. Check cross-platform: if you touched I/O, networking, or paths, verify on both macOS and Linux if possible

PR Guidelines

After Merging

When your PR merges to main and touches app/, doc/, or .program, the release workflow runs automatically:

  1. Reads version from .program
  2. Creates a GitHub Release tagged v<version>

So if your change warrants a new version, bump the version in your PR:

All three must match.


Version Bumping

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.


Testing

Running Tests

cd <tool>/
python test/test_main.py

Writing Tests

CI Matrix

Tests run on:

Make sure your code works across all of these. Avoid Python 3.9+ features unless the tool explicitly requires it.


Linting with Plack

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 .


Repository Structure

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.


The Ecosystem

How pget Discovers Tools

pget search queries the Pynosaur GitHub org for repositories that contain a .program file. That file declares the tool’s name, version, and description.

How pynosaur.org Works

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.

How Releases Work

Push to main with changes in app/, doc/, or .program triggers release.yml, which:

  1. Reads version from .program
  2. Creates (or updates) a GitHub Release with tag v<version>

No manual tagging needed.


Getting Help


Code of Conduct

Be respectful, constructive, and patient. We are all building this for fun and learning.