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 stubpyproject.toml- Repository configuration with[tool.qen]sectionrepos/- 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.tomlin the[[tool.qen.repos]]section - Tracked with its URL, branch, and local path
4. Next steps
# Check status across all repos (planned)
qen status
# Sync changes across repos (planned)
qen sync
Current Status
Implemented:
qen init- Initialize qen configurationqen init <project>- Create new project with branch, directory structure, and configurationqen add- Add sub-repositories to current project with flexible URL formats
Planned:
qen status- Show git status across all sub-reposqen sync- Push and pull sub-repos
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]"
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 version (commit only)
poe version -b minor --tag # Bump minor, create release tag v0.X.0, push
poe version -b major --dev # Bump major, create dev tag v1.0.0-dev, 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qen-0.1.2.tar.gz.
File metadata
- Download URL: qen-0.1.2.tar.gz
- Upload date:
- Size: 95.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
682617712435f9c0844f589759d0e44e170b6f5b180baa99f8ee8727531b406c
|
|
| MD5 |
cba1e0041f57341f1b50514a6ecb2376
|
|
| BLAKE2b-256 |
dc2bfa61d9f9fce0901eda4300255a07e18a5cb3bf02d4d697bbcc223b74e6d3
|
Provenance
The following attestation bundles were made for qen-0.1.2.tar.gz:
Publisher:
publish.yml on data-yaml/qen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qen-0.1.2.tar.gz -
Subject digest:
682617712435f9c0844f589759d0e44e170b6f5b180baa99f8ee8727531b406c - Sigstore transparency entry: 744052052
- Sigstore integration time:
-
Permalink:
data-yaml/qen@8d22581292ae9ec5f621dc45bce7ddeec1eb7a6f -
Branch / Tag:
refs/tags/v0.1.2-dev - Owner: https://github.com/data-yaml
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8d22581292ae9ec5f621dc45bce7ddeec1eb7a6f -
Trigger Event:
push
-
Statement type:
File details
Details for the file qen-0.1.2-py3-none-any.whl.
File metadata
- Download URL: qen-0.1.2-py3-none-any.whl
- Upload date:
- Size: 32.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3cf76052a3643607cf30bf56732c8bce3c5a59ab21ec84c2622b104c9c779c1
|
|
| MD5 |
eeb80c3acb2caecc1868a6d8abeb1551
|
|
| BLAKE2b-256 |
007d4ab7402aa2244a2fccba2edf0471c7e93ac57059c46674e534533c8d1c4c
|
Provenance
The following attestation bundles were made for qen-0.1.2-py3-none-any.whl:
Publisher:
publish.yml on data-yaml/qen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qen-0.1.2-py3-none-any.whl -
Subject digest:
d3cf76052a3643607cf30bf56732c8bce3c5a59ab21ec84c2622b104c9c779c1 - Sigstore transparency entry: 744052071
- Sigstore integration time:
-
Permalink:
data-yaml/qen@8d22581292ae9ec5f621dc45bce7ddeec1eb7a6f -
Branch / Tag:
refs/tags/v0.1.2-dev - Owner: https://github.com/data-yaml
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8d22581292ae9ec5f621dc45bce7ddeec1eb7a6f -
Trigger Event:
push
-
Statement type: