Release Recovery, Version Conversion, and Docker Release Automation.
Reflow helps automate release workflows by treating Git tags as the source of truth for releases, versioning, and container publishing.
See: docs/badges.md
for the complete badge reference.
Reflow is a command-line tool designed to simplify release management workflows.
It provides tools for:
- Project initialization
- Version conversion
- Missing-release recovery
- Docker image publishing
Workflow:
Initialize Project
β
Configure Project
β
Convert Tags
β
Recover Releases
β
Publish Containers
- π·οΈ Recovering missing GitHub releases by retriggering tag-based CI/CD
- π Explicit local or remote tag conversion between SemVer and PEP 440
- π³ Building Docker images per tag
- π¦ Supporting GitHub (GHCR) and GitLab Registry
- βοΈ Config-driven via
.config/reflow/config.toml - π Observable clone, conversion, recovery, initialization, and publish progress
Bootstrap a project for use with Reflow.
Command:
reflow initDocumentation: docs/commands/init/
Convert version tags to SemVer by default, or select PEP 440 with
--to pep440. Local conversion changes only a persistent checkout; remote
conversion replaces remote refs in one guarded atomic push. Conversion
preserves the original target and supported annotation metadata. Signed tags
and existing destination refs stop the operation before mutation.
Command:
reflow tags convert local
reflow tags convert remoteDocumentation: docs/commands/tags/convert/
Find existing version tags without corresponding GitHub releases, then delete and re-push the selected remote tags to retrigger the repository's tag-based release workflow. This does not create a release through an API, and release discovery is currently GitHub-only.
Command:
reflow releases recoverDocumentation: docs/commands/releases/recover/
Build and publish Docker images from Git tags.
Command:
reflow dockerizeDocumentation: docs/commands/dockerize/
Use Python 3.14+ and Git. Docker and provider tools are needed only for the workflows that use them.
Choose a version already published in the target project's registry. In an activated virtual environment, replace the placeholders:
python -m pip install --index-url "https://gitlab.com/api/v4/projects/<project-id>/packages/pypi/simple" "git-reflow==<package-version>"
reflow --help
Use a deploy token with read_package_registry. Supply credentials through
pip authentication,
not committed files or shared command history. The package version is PEP 440:
v1.0.0-rc.1 becomes 1.0.0rc1; v1.0.0 becomes 1.0.0.
The distribution is named git-reflow; the command is reflow.
Use --index-url, not --extra-index-url; review
GitLab package forwarding
if dependencies must stay private.
See installation and registry guidance for authentication, other installation methods, and registry setup.
Clone the repository:
git clone https://github.com/devalltect00/Git-Reflow.git reflowEnter the project:
cd reflowFor a contributor installation with development, documentation, and pre-commit tooling:
make setupThe Make workflow uses venv by default. Display the activation command with:
make activateFor a manual runtime-only installation, create and activate the environment.
Windows:
python -m venv venv
venv\Scripts\activateLinux/macOS:
python3 -m venv venv
source venv/bin/activateInstall:
python -m pip install -e .See docs/developer-guide/make-workflows.md
for local, Docker, Compose, published-image, and dry-run Make targets.
Initialize a project:
reflow initReview .config/reflow/config.toml, especially the repository target.
Choose a local path or a remote url, not both.
Preview only the commands you need:
Convert tags:
reflow --dry-run tags convert local
reflow --dry-run tags convert local --to pep440Recover missing releases:
reflow --dry-run releases recoverPublish images:
reflow --dry-run dockerizeDry-run allows read-only discovery and temporary URL-clone setup, but does not
change persistent tags, registry images, or remote state. Diagnostic logs may
still be written. Review the plan before a live run without --dry-run.
| Command | Description |
|---|---|
reflow init |
Initialize a project |
reflow tags convert local |
Replace converted names in a local checkout |
reflow tags convert remote |
Replace converted names on the Git remote |
reflow releases recover |
Recover missing releases |
reflow dockerize |
Build and publish Docker images |
The former reflow tags replay spelling remains as a deprecated compatibility
alias.
Operational workflows can use either an existing local checkout or a remote GitHub/GitLab URL. For a local checkout:
reflow --repository ../target-project --dry-run releases recover
reflow -C ../target-project --dry-run tags convert local
reflow -C ../target-project --dry-run tags convert remote
reflow --repo ../target-project --dry-run dockerizeOr configure the target once:
[tool.reflow.repository]
path = "../target-project"If no checkout exists, use a remote URL directly:
reflow --repository-url https://github.com/acme/project.git --dry-run tags convert remote
reflow --repository-url https://github.com/acme/project.git --dry-run tags convert remote --to pep440
reflow --repository-url https://github.com/acme/project.git --dry-run dockerizeOr configure url instead of path:
[tool.reflow.repository]
url = "https://github.com/acme/project.git"Reflow clones URL targets into a temporary checkout and removes it when the
command finishes. Configure exactly one of path or url; an explicit CLI
target overrides configuration. reflow init and tags convert local require
a persistent checkout. tags convert remote accepts a URL and performs one
guarded atomic remote tag replacement. Replace the example URL with your own.
After reviewing the remote conversion preview, remove --dry-run and use
--yes only when you intend to approve the displayed remote changes.
Progress indicators are enabled by default. For CI logs or redirected output, disable only the presentation layer without changing execution or dry-run behavior:
[tool.reflow.cli.progress]
enabled = falseFor detailed usage:
π User Guide docs/user-guide/
Contains:
getting-started.md
commands.md
lifecycle.md
π Initialization docs/commands/init/
Contains:
overview.md
workflow.md
examples.md
faq.md
π Architecture docs/architecture/
Contains:
workflow.md
design-patterns.md
diagrams.md
π Configuration docs/configuration.md
β Questions and Answers docs/qa/
Answers common questions about local paths, repository URLs, remote effects, authentication, and troubleshooting.
π Roadmap docs/project/roadmap.md
TODO.md
High-level architecture:
CLI
β
Resolver
β
Core
β
Service
β
Executor
β
External Tool
Documentation:
Install Reflow
β
reflow init
β
Edit config.toml
β
reflow tags convert local
β
reflow releases recover
β
reflow dockerize
Run only the commands required for your workflow.
Current project roadmap: docs/project/roadmap.md
Future ideas and enhancements:
TODO.md
For the details, see full structure in project_structure.md.
The optional metadata sync script is source-checkout tooling, not an installed application command. Run it from this repository's root:
python scripts/repository/src/sync_metadata.py --dry-runIt reads [project].description and the separate
[tool.devalltect.github].topics / [tool.devalltect.gitlab].topics tables
in pyproject.toml. Package keywords are not repository topics.
Review GITHUB_REMOTES and GITLAB_REMOTES in the script: the current
defaults are origin and backup. Each list contains fallback candidates;
the first valid fetch URL selects one repository per provider. Both providers
must resolve. This helper currently targets GitHub.com and GitLab.com.
Dry-run uses Python and read-only Git discovery; it does not call provider
APIs. Live synchronization additionally needs authenticated gh and glab
with access to update those repositories.
Before removing --dry-run, review the targets and metadata carefully:
the live helper does not ask for confirmation, replaces the topic lists, and
clears existing topics when a list is empty or missing. A failure can leave
earlier updates applied; there is no cross-provider rollback.
Known follow-up: the script's docstring still shows the old path, and its GitHub topic-limit constant is 50 despite GitHub's maximum of 20 topics. Use the path above and keep the GitHub list within 20 until corrected. These issues and isolated test coverage are tracked in the TODO history.
Contributions, issues, and suggestions are welcome.
Before contributing, review: docs/developer-guide/
and: docs/architecture/
For the details, see CONTRIBUTING.md
See SECURITY.md
CHANGELOG.md is prepared during the reviewed release process. For current
development milestones, see the TODO tracking history.
See LICENSE for the licensing terms.
π§ Contact: rizkypffdev37@gmail.com
Handcrafted with β€οΈ by Devalltect / Rizky Fernandes