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, pronounced 'kin') is a lightweight tool for organizing multi-repository development work.
QEN gathers all context for a project (code, specs, artifacts, etc.) into a single managed folder inside a central meta repository.
Quick Start
No installation needed! Use uvx to run QEN commands directly:
uvx qen --version
uvx qen --help
1. Initialize QEN
From within or near your meta repository:
uvx qen init
This finds your meta repo, extracts your organization from git remotes, and stores configuration in your system's CONFIG_HOME directory.
2. Create a Project
uvx qen init my-project
This uses the previously-discovered meta repository to create a project-specific:
- Git branch:
YYMMDD-my-project(e.g.,251203-readme-bootstrap) - Project directory:
proj/YYMMDD-my-project/ - Project files:
README.md- Project documentation stubpyproject.toml- Repository configuration with[tool.qen]sectionqen- Executable wrapper for running qen commands in project context.gitignore- Ignores repos/ directoryrepos/- Gitignored directory for sub-repositoriesworkspaces/- IDE multi-repo configuration
Using the Project Wrapper
Each project includes a ./qen executable wrapper that automatically runs qen commands in that project's context:
cd proj/YYMMDD-my-project/
./qen status # Works without specifying --proj
./qen add myrepo # Automatically uses this project
./qen pr # Launch PR manager for this project
The wrapper is especially useful when you have multiple projects, as it eliminates the need to specify --proj or remember which project you're in
3. Manage Configuration
Configuration is stored in your system's CONFIG_HOME directory and tracks:
- Your meta repository location
- Your GitHub organization
- Current active project
- Per-project settings (branch name, project path, etc.)
To view or modify, use the config command:
# Show current project
uvx qen config
# List all projects
uvx qen config --list
# Switch to a different project
uvx qen config --switch other-project
# Show global configuration
uvx qen config --global
4. Add Repositories
# Add a repository using different formats
uvx qen add https://github.com/myorg/myrepo # Full URL
uvx qen add myorg/myrepo # org/repo format
uvx qen add myrepo # Uses org from config
# Add with specific branch
uvx qen add myorg/myrepo --branch develop
# Add with custom path
uvx 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
- Assigned an index based on the order it was added (starting from 1)
Repositories are displayed with indices for easy reference:
[1] myorg/repo1 (main)
[2] myorg/repo2 (feature)
[3] myorg/repo3 (dev)
5. Check Git Status
# Show git status across all repos (with indices)
uvx qen status
# Show detailed status with verbose output
uvx qen status -v
# Fetch latest changes before showing status
uvx qen status --fetch
The status command displays each repository with its index:
Sub-repositories:
[1] repos/main/repo1 (https://github.com/org/repo1)
Status: Clean
Branch: main
6. Work with Pull Requests
QEN v0.3.0 introduces an interactive TUI for PR management:
# Launch interactive PR manager (select repos, choose action)
uvx qen pr
# Pre-select repos by index, then choose action interactively
uvx qen pr 1 3
# Direct operations with flags
uvx qen pr 1 --action merge --strategy squash --yes
uvx qen pr 2 --action create --title "Add feature X"
uvx qen pr --action restack
# View PR information in git status
uvx qen status --pr
Breaking Change: The v0.3.0 release removed qen pr status, qen pr stack, and qen pr restack subcommands in favor of the interactive TUI. Use qen status --pr for read-only PR information.
PR TUI Operations
- Merge: Merge PR(s) with configurable strategy (squash/merge/rebase)
- Close: Close PR(s) without merging
- Create: Create new PR with title, body, and base branch
- Restack: Update stacked PRs to latest base branch
- Stack View: Display PR stack relationships
Repository indices ([1], [2], etc.) are used for quick reference:
Index | Repo | Branch | PR# | Status | Checks
1 | foo | feat-auth | 123 | open | passing
2 | bar | main | - | - | -
3 | baz | fix-bug | 124 | open | failing
7. Generate Editor Workspaces
Create editor workspace files that span all repositories in your project:
# Generate workspace files for all supported editors
uvx qen workspace
# Generate only VS Code workspace
uvx qen workspace --editor vscode
# Generate only Sublime Text workspace
uvx qen workspace --editor sublime
# Open the generated workspace
code workspaces/vscode.code-workspace
Workspace files are created in the workspaces/ directory and include:
- Project root folder
- All sub-repositories
- PR numbers in folder names (when available)
- Sensible file exclusions (.git, pycache, etc.)
Repository Indices
QEN automatically assigns 1-based indices to repositories based on their order in the [[tool.qen.repos]] array in pyproject.toml. These indices:
- Start at 1 (not 0) for user-friendliness
- Are based on the order repositories appear in the configuration
- Are displayed in all repository listings (
qen status,qen pr status, etc.) - Provide a convenient way to reference repositories
The index reflects the position in the TOML array, making it easy to understand which repo you're referring to when working with multiple repositories.
Requirements
- Python 3.12 or higher
- Git
- GitHub CLI (
gh) for PR commands
Contributing
QEN is open source and contributions are welcome! For developer documentation, see AGENTS.md.
License
MIT License - see LICENSE file for details.
Links
- Homepage: https://github.com/data-yaml/qen
- Issues: https://github.com/data-yaml/qen/issues
- PyPI: https://pypi.org/project/qen/
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.3.0.tar.gz.
File metadata
- Download URL: qen-0.3.0.tar.gz
- Upload date:
- Size: 349.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0954493b831881db57a4ee1ba134a700ff7602ddebe0f07c428d368e16a9560d
|
|
| MD5 |
d6136040ca21f5db80112c7c0ffae8c7
|
|
| BLAKE2b-256 |
b01cb9d63cc8a07f987cf04f0107bcfdf363bf2cf7f2638fae524a924f9c0dbf
|
Provenance
The following attestation bundles were made for qen-0.3.0.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.3.0.tar.gz -
Subject digest:
0954493b831881db57a4ee1ba134a700ff7602ddebe0f07c428d368e16a9560d - Sigstore transparency entry: 756792593
- Sigstore integration time:
-
Permalink:
data-yaml/qen@a324884155398d3c00cc0a4f3c3c1371ded11a3f -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/data-yaml
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a324884155398d3c00cc0a4f3c3c1371ded11a3f -
Trigger Event:
push
-
Statement type:
File details
Details for the file qen-0.3.0-py3-none-any.whl.
File metadata
- Download URL: qen-0.3.0-py3-none-any.whl
- Upload date:
- Size: 100.7 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 |
efd6dc1c8864a9e6bd4a144e8f9f1905c6dcd760b6b16bfba88b099526298f0e
|
|
| MD5 |
cc58a32d0c8591eb32e8ac389fc9ea65
|
|
| BLAKE2b-256 |
3dda5632355b59fe02f6b6600aa8a8ea09f9c1191cfeeb228bd518baa8a19a16
|
Provenance
The following attestation bundles were made for qen-0.3.0-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.3.0-py3-none-any.whl -
Subject digest:
efd6dc1c8864a9e6bd4a144e8f9f1905c6dcd760b6b16bfba88b099526298f0e - Sigstore transparency entry: 756792600
- Sigstore integration time:
-
Permalink:
data-yaml/qen@a324884155398d3c00cc0a4f3c3c1371ded11a3f -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/data-yaml
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a324884155398d3c00cc0a4f3c3c1371ded11a3f -
Trigger Event:
push
-
Statement type: