Metadata-Version: 2.5
Name: repo-env
Version: 0.1.0
Summary: Build and operate isolated git-worktree environments across many repositories.
Project-URL: Homepage, https://github.com/ditschi/repo-env
Project-URL: Source, https://github.com/ditschi/repo-env
Author: ditschi
License: MIT
License-File: LICENSE
Keywords: cli,git,migration,monorepo,multi-repo,worktree
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: POSIX
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Software Development :: Version Control :: Git
Requires-Python: >=3.10
Requires-Dist: filelock>=3.14
Requires-Dist: platformdirs>=4.2
Requires-Dist: pydantic>=2.14.0a1; python_version >= '3.14'
Requires-Dist: pydantic>=2.7; python_version < '3.14'
Requires-Dist: questionary>=2.0
Requires-Dist: rich>=13.7
Requires-Dist: ruamel-yaml>=0.18
Requires-Dist: typer>=0.12
Provides-Extra: code-quality
Requires-Dist: fawltydeps>=0.16; extra == 'code-quality'
Requires-Dist: pylint>=3.2; extra == 'code-quality'
Requires-Dist: vulture>=2.11; extra == 'code-quality'
Provides-Extra: dev
Requires-Dist: black>=24.4; extra == 'dev'
Requires-Dist: commitizen>=3.29; extra == 'dev'
Requires-Dist: fawltydeps>=0.16; extra == 'dev'
Requires-Dist: flake8>=7.1; extra == 'dev'
Requires-Dist: isort>=5.13; extra == 'dev'
Requires-Dist: mike>=2.1; extra == 'dev'
Requires-Dist: mkdocs-material<10,>=9.7.5; extra == 'dev'
Requires-Dist: mkdocs-snippets>=1.0; extra == 'dev'
Requires-Dist: mkdocs<2,>=1.6; extra == 'dev'
Requires-Dist: mkdocstrings[python]>=0.25; extra == 'dev'
Requires-Dist: mypy>=1.10; extra == 'dev'
Requires-Dist: nox>=2024.4; extra == 'dev'
Requires-Dist: pylint>=3.2; extra == 'dev'
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
Requires-Dist: pytest-xdist>=3.6; extra == 'dev'
Requires-Dist: pytest>=8.2; extra == 'dev'
Requires-Dist: ruff>=0.5; extra == 'dev'
Requires-Dist: vulture>=2.11; extra == 'dev'
Provides-Extra: docs
Requires-Dist: mike>=2.1; extra == 'docs'
Requires-Dist: mkdocs-material<10,>=9.7.5; extra == 'docs'
Requires-Dist: mkdocs-snippets>=1.0; extra == 'docs'
Requires-Dist: mkdocs<2,>=1.6; extra == 'docs'
Requires-Dist: mkdocstrings[python]>=0.25; extra == 'docs'
Provides-Extra: lint
Requires-Dist: black>=24.4; extra == 'lint'
Requires-Dist: flake8>=7.1; extra == 'lint'
Requires-Dist: isort>=5.13; extra == 'lint'
Requires-Dist: ruff>=0.5; extra == 'lint'
Provides-Extra: test
Requires-Dist: pytest-cov>=5.0; extra == 'test'
Requires-Dist: pytest-xdist>=3.6; extra == 'test'
Requires-Dist: pytest>=8.2; extra == 'test'
Provides-Extra: type-check
Requires-Dist: mypy>=1.10; extra == 'type-check'
Description-Content-Type: text/markdown

<p align="center">
  <img src="docs/assets/brand/renv-lockup.png" alt="repo-env — renv CLI" width="280">
</p>

<p align="center">
  <a href="https://github.com/ditschi/repo-env/actions/workflows/main.yml"><img src="https://github.com/ditschi/repo-env/actions/workflows/main.yml/badge.svg" alt="CI"></a>
  <a href="https://pypi.org/project/repo-env/"><img src="https://img.shields.io/pypi/pyversions/repo-env" alt="Python"></a>
  <a href="https://ditschi.github.io/repo-env/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-blue" alt="Docs"></a>
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
</p>

Build and operate isolated **git-worktree environments** across many
repositories. The command is `renv`; the distribution is `repo-env`.

**[Full documentation →](https://ditschi.github.io/repo-env/)**

An *environment* is a named directory containing one git worktree per selected
repository. Create it from repos matching a glob in a source directory, run
commands across every worktree, and open bulk pull requests — all from one CLI.

## Install

```sh
uv tool install repo-env      # or: pipx install repo-env
renv --help
```

Requires **Python 3.10+**, **Git 2.38+**, Linux or macOS. `renv pr` needs [GitHub CLI](https://cli.github.com/) (`gh`).

## Quick start

```sh
renv init -s ~/src -d ~/envs -y
renv clone -u https://github.com/my-org                 # optional: populate ~/src first
renv create web -s ~/src -b feature/x --activate
renv ls
cd "$(renv path web)"
renv run -- git status
renv pr web --title "feat: migrate X" --push   # optional --push
renv rm web --delete-files
```

![renv quickstart demo](docs/assets/casts/quickstart.gif)

Prefer arrow keys to flags? `renv select` walks you through picking an environment and an
action (status, activate, sh, sync, path, rm) interactively:

![renv select demo](docs/assets/casts/select.gif)

## Design

- Command: `renv` · Distribution: `repo-env` · Import package: `repoenv`
- POSIX-first (Linux/macOS), Python 3.10+ (3.12 recommended), Typer CLI
- User config = YAML; machine state = JSON under `REPOENV_HOME`
- Source clones are **read-only**. Destructive ops require explicit flags

## Development

A [devcontainer](.devcontainer/) is available with `uv`, `nox`, `gh`, and the `asciinema`/`agg`
demo-recording tools preinstalled (VS Code: "Reopen in Container"; also works with GitHub
Codespaces). Outside a container:

```sh
uv tool install nox
nox                 # default gates: syntax, tests, lint, types, imports, dead code, dupes, cycles
nox -s tests        # unit tests with coverage
nox -s integration  # integration tests (temp git repos, mocked gh)
nox -s docs         # build docs (--strict)
nox -s docs_serve   # local preview at http://127.0.0.1:8000
```

If nox reports a missing interpreter (for example `tests-3.14`):

```sh
uv self update
uv python install 3.14
nox -s tests-3.14 --download-python always
```

Quality: line length 110, ruff + black + flake8 + isort + mypy + vulture + fawltydeps.
