Skip to main content

A meta-tool for setting up Poetry-based Python projects with configurable presets

Project description

pypreset

A meta-tool for scaffolding Python projects with configurable YAML presets. Supports Poetry and uv, generates CI workflows, testing scaffolds, type checking configs, and more.

Features

  • Preset-based project creation from YAML configs with single inheritance
  • Augment existing projects with GitHub Actions workflows, tests, dependabot, .gitignore
  • Two package managers: Poetry and uv (PEP 621 + hatchling)
  • Two layout styles: src/ layout and flat layout
  • Type checking: mypy, pyright, ty, or none
  • Code quality: ruff linting/formatting, radon complexity checks, pre-commit hooks
  • Version management: bump-my-version integration, GitHub release automation via gh CLI
  • User defaults: persistent config at ~/.config/pypreset/config.yaml
  • MCP server: expose all functionality to AI coding assistants via Model Context Protocol

Installation

# Core CLI
poetry install

# With MCP server support
poetry install -E mcp

Quick Start

# Create a CLI tool project with Poetry
pypreset create my-cli --preset cli-tool

# Create a data science project with uv
pypreset create my-analysis --preset data-science --package-manager uv

# Create an empty package with src layout (default)
pypreset create my-package --preset empty-package

# Create a Discord bot
pypreset create my-bot --preset discord-bot

Commands

create — Scaffold a new project

pypreset create <name> [OPTIONS]
Option Description
--preset, -p Preset to use (default: empty-package)
--output, -o Output directory (default: .)
--config, -c Custom preset YAML file
--package-manager poetry or uv
--layout src or flat
--type-checker mypy, pyright, ty, or none
--typing none, basic, or strict
--python-version e.g., 3.12
--testing / --no-testing Enable/disable testing scaffold
--formatting / --no-formatting Enable/disable formatting config
--radon / --no-radon Enable radon complexity checking
--pre-commit / --no-pre-commit Generate pre-commit hooks config
--bump-my-version / --no-bump-my-version Include bump-my-version config
--extra-package, -e Additional packages (repeatable)
--extra-dev-package, -d Additional dev packages (repeatable)
--git / --no-git Initialize git repository
--install / --no-install Run dependency install after creation

augment — Add components to an existing project

Analyzes pyproject.toml to auto-detect your tooling, then generates the selected components.

# Interactive mode (prompts for missing values)
pypreset augment ./my-project

# Auto-detect everything, no prompts
pypreset augment --auto

# Generate only specific components
pypreset augment --test-workflow --lint-workflow --gitignore

# Overwrite existing files
pypreset augment --force

version — Release management

pypreset version release <bump>         # Bump, commit, tag, push, release
pypreset version release-version <ver>  # Explicit version, then release
pypreset version rerun <ver>            # Re-tag and push an existing version
pypreset version rerelease <ver>        # Delete and recreate a GitHub release

Requires the gh CLI to be installed and authenticated.

Other commands

pypreset list-presets              # List all available presets
pypreset show-preset <name>        # Show full preset details
pypreset validate [path]           # Validate project structure
pypreset analyze [path]            # Detect and display project tooling
pypreset config show               # Show current user defaults
pypreset config init               # Create default config file
pypreset config set <key> <value>  # Set a config value

Presets

Built-in presets: empty-package, cli-tool, data-science, discord-bot.

Presets are YAML files that define metadata, dependencies, directory structure, testing, formatting, and more. They support single inheritance via the base: field.

Custom presets

Place custom preset files in ~/.config/pypreset/presets/ or pass a file directly:

pypreset create my-project --config ./my-preset.yaml

User presets take precedence over built-in presets with the same name.

User Configuration

Persistent defaults are stored at ~/.config/pypreset/config.yaml and applied as the lowest-priority layer (presets and CLI flags override them).

pypreset config init                    # Create with defaults
pypreset config set layout flat         # Set default layout
pypreset config set type_checker ty     # Set default type checker
pypreset config show                    # View current config

MCP Server

An MCP (Model Context Protocol) server exposes pypreset to AI coding assistants over STDIO.

# Run the server
pypreset-mcp

Add to Claude Code settings.json:

{
  "mcpServers": {
    "pypreset": {
      "command": "pypreset-mcp",
      "args": []
    }
  }
}

Available tools: create_project, augment_project, validate_project, list_presets, show_preset, get_user_config, set_user_config

Resources: preset://list, config://user, template://list

Prompts: create-project, augment-project

Development

All tasks use the Justfile:

just install     # Install dependencies
just test        # Run tests
just test-cov    # Tests with coverage
just lint        # Ruff check
just format      # Ruff format
just typecheck   # Pyright
just radon       # Cyclomatic complexity check
just check       # lint + typecheck + radon + test
just all         # format + lint-fix + typecheck + radon + test

See CONTRIBUTING.md for development setup and guidelines.

License

MIT

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

pypreset-0.1.3.tar.gz (45.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pypreset-0.1.3-py3-none-any.whl (60.8 kB view details)

Uploaded Python 3

File details

Details for the file pypreset-0.1.3.tar.gz.

File metadata

  • Download URL: pypreset-0.1.3.tar.gz
  • Upload date:
  • Size: 45.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pypreset-0.1.3.tar.gz
Algorithm Hash digest
SHA256 88f1ecdc1180fb491535795e65510de0cf2c752b2ebca3fe1bfc47255cb07e72
MD5 6f2b529e75097cd9d777a8836eb9b5ad
BLAKE2b-256 994dbd2fb019d5c007eea2713e4c1ad63d7afda327bb6965c89d99f3730d52af

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypreset-0.1.3.tar.gz:

Publisher: publish.yaml on KaiErikNiermann/pypreset

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypreset-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: pypreset-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 60.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pypreset-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 06b9d9ebf61c103ce8410972c64aa53f9a5fff0a9485a35d3444407d2f155175
MD5 3c1850fa3cf97b5c8e6eaff6df6a2cc2
BLAKE2b-256 c0b9bb77d4183df15f4c1cbda80da9957aa37274df8a8aaa914c6faa3baaa17a

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypreset-0.1.3-py3-none-any.whl:

Publisher: publish.yaml on KaiErikNiermann/pypreset

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page