Skip to main content

A tiny, extensible tool for organizing multi-repository development work

Project description

QEN: A Developer Nest for Multi-Repo Innovation

QEN ("קֵן", nest in Biblical Hebrew) is a tiny, extensible tool for organizing multi-repository development work. A "qen" is a lightweight context—a safe, structured "nest"—where complex feature development can incubate across multiple repos.

QEN gathers all context for a project (code, specs, artifacts, etc.) into a single managed folder inside a central meta repository.

Quick Start

1. Initialize qen

From within or near your meta repository:

qen init

This finds the meta repo, extracts your organization from git remotes, and stores configuration in $XDG_CONFIG_HOME/qen/config.toml.

2. Create a project

qen init my-project

This creates:

  • Git branch: YYYY-MM-DD-my-project
  • Project directory: proj/YYYY-MM-DD-my-project/
  • Configuration files:
    • README.md - Project documentation stub
    • pyproject.toml - Repository configuration with [tool.qen] section
    • repos/ - Gitignored directory for sub-repositories
  • User config: $XDG_CONFIG_HOME/qen/projects/my-project.toml

The project is automatically set as your current project.

3. Add repositories

cd meta/proj/YYYY-MM-DD-my-project/

# Add a repository using different formats
qen add https://github.com/myorg/myrepo    # Full URL
qen add myorg/myrepo                       # org/repo format
qen add myrepo                             # Uses org from config

# Add with specific branch
qen add myorg/myrepo --branch develop

# Add with custom path
qen add myorg/myrepo --path repos/custom-name

The repository will be:

  • Cloned to repos/myrepo/
  • Added to pyproject.toml in the [[tool.qen.repos]] section
  • Tracked with its URL, branch, and local path

4. Work with pull requests

# Show PR status for all repositories
qen pr status

# Show detailed PR information
qen pr status -v

# Identify and display stacked PRs
qen pr stack

# Update stacked PRs (rebase child PRs on parent PRs)
qen pr restack

# Preview restack changes without making them
qen pr restack --dry-run

5. Check git status

# Show git status across all repos
qen status

# Show detailed status with verbose output
qen status -v

# Fetch latest changes before showing status
qen status --fetch

Current Status

Implemented:

  • qen init - Initialize qen configuration
  • qen init <project> - Create new project with branch, directory structure, and configuration
  • qen add - Add sub-repositories to current project with flexible URL formats
  • qen status - Show git status across all sub-repos
  • qen pr status - Show PR status for all repositories
  • qen pr stack - Identify and display stacked PRs
  • qen pr restack - Update stacked PRs to latest base branches

Planned:

  • qen sync - Push and pull sub-repos
  • Additional PR management features

Philosophy

QEN is intentionally small. It creates structure without dictating workflow.

Design principles:

  • Context over configuration - Minimal manifests, maximum clarity
  • Always latest - Work with current branches (checkpoints optional)
  • Zero global state - XDG-compliant configuration per project
  • Human-readable - Simple directory structures and TOML configs

Development

Setup

# Install with dev dependencies
uv pip install -e ".[dev]"

# Git hooks are automatically installed when you run tests
./poe test

Git Hooks

The project uses pre-commit to maintain code quality:

  • pre-commit: Runs linting (ruff) and type checking (mypy) before each commit
  • pre-push: Runs the full test suite before pushing

Hooks are automatically installed when you run ./poe test for the first time.

To manually manage hooks:

# Install hooks explicitly
./poe setup-hooks

# Run pre-commit checks manually
uv run pre-commit run --all-files

# Run pre-push checks manually (including tests)
uv run pre-commit run --hook-stage pre-push --all-files

Testing

# Run tests
./poe test

# Run tests with coverage
./poe test-cov

# Type checking
./poe typecheck

# Lint and format
./poe lint

# Version management
./poe version                    # Show current version
./poe version -b patch           # Bump patch, commit (no push)
./poe version --tag              # Create release tag v0.1.2, push everything
./poe version --dev              # Create timestamped dev tag v0.1.2-dev.YYYYMMDD.HHMMSS, push

Project Structure

src/
├── qen/          # Main CLI and project management
│   ├── cli.py              # Command-line interface
│   ├── config.py           # QEN configuration management
│   ├── project.py          # Project creation and structure
│   ├── git_utils.py        # Git operations
│   ├── repo_utils.py       # Repository URL parsing and cloning
│   ├── pyproject_utils.py  # pyproject.toml management
│   └── commands/
│       ├── init.py         # Init command implementation
│       └── add.py          # Add command implementation
└── qenvy/        # Reusable XDG-compliant config library
    ├── storage.py          # Profile-based config storage
    ├── base.py             # Core config management
    ├── formats.py          # TOML/JSON handlers
    └── types.py            # Type definitions

License

MIT License

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

qen-0.1.5.tar.gz (199.4 kB view details)

Uploaded Source

Built Distribution

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

qen-0.1.5-py3-none-any.whl (68.2 kB view details)

Uploaded Python 3

File details

Details for the file qen-0.1.5.tar.gz.

File metadata

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

File hashes

Hashes for qen-0.1.5.tar.gz
Algorithm Hash digest
SHA256 a1d8dcf489d29a4107b231aeb1d894489ae3f950235d9e321d2e544b693002cb
MD5 d3a06cb16263615fea932a54262ba6d8
BLAKE2b-256 26b1e8dec8cfceb7c2c4f4d4f71aab2e46f680de9ab3342dcd4393d2124aad33

See more details on using hashes here.

Provenance

The following attestation bundles were made for qen-0.1.5.tar.gz:

Publisher: publish.yml on data-yaml/qen

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

File details

Details for the file qen-0.1.5-py3-none-any.whl.

File metadata

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

File hashes

Hashes for qen-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7cbd332ee4f001a298aee4fa0e0760a94d44f52eb27e51aa1495f03a98a7bcde
MD5 5846b8275854b9971650b884ba3bef03
BLAKE2b-256 6fae2f3df707d962e661576bea90a1874cad17e3ce8eff53f9b571023990bb3c

See more details on using hashes here.

Provenance

The following attestation bundles were made for qen-0.1.5-py3-none-any.whl:

Publisher: publish.yml on data-yaml/qen

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