Labinetix workflow CLI for humans and AI agents
Project description
lx-tooling
Tag: Org and orchestration
Labinetix workflow CLI for humans and AI agents. lx-tooling orchestrates GitHub issues, branches, pull requests, releases, local verification, and repository policy checks without owning domain logic.
Non-goals: model semantics, ABI schema ownership, runtime algorithms, or protocol implementations.
Stability
Milestone 2 — release planning (lx release plan, lx release create validation). Branch creation and gh pr create require --yes. Tagging and publishing remain manual.
Quickstart
Prerequisites:
Local development:
git clone git@github.com:labinetix/lx-tooling.git
cd lx-tooling
uv sync --all-groups
uv run lx --version
Local checks (same as CI):
just check
Or explicitly:
uv sync --all-groups
uv run ruff check .
uv run ruff format --check .
uv run pytest
Install
From PyPI:
uv tool install lx-tooling
lx --version
Upgrade:
uv tool upgrade lx-tooling
From a checkout:
uv sync --all-groups
uv run lx --help
Commands
Inspect the current repository:
lx repo inspect
lx repo inspect --json
Run conservative pre-PR checks:
lx workflow check
Read a GitHub issue with Labinetix readiness hints:
lx issue view 123
Start work from an issue (dry-run by default):
lx issue start 123
lx issue start 123 --yes
lx issue start 123 --yes --comment
Prepare a pull request (dry-run by default):
lx pr prepare
lx pr prepare --yes
Plan a release (dry-run by default):
lx release plan
lx release create 0.3.0
lx release create 0.3.0 --yes
Examples:
docs/examples/repo-inspect.mddocs/examples/issue-start.mddocs/examples/pr-prepare.mddocs/examples/release-plan.md
Development workflow with lx
This is the intended day-to-day loop for a new feature or bugfix in any Labinetix repository once lx is installed. lx wraps git and gh; risky steps stay behind --yes.
flowchart LR
issue["Issue or bug report"]
view["lx issue view"]
start["lx issue start --yes"]
work["Code tests docs"]
check["just check + lx workflow check"]
prepare["lx pr prepare"]
pr["lx pr prepare --yes"]
merge["Review + merge main"]
release["Tag + release notes"]
issue --> view --> start --> work --> check --> prepare --> pr --> merge --> release
1. Start from an issue
Create a scoped GitHub issue (or use an existing one). The body should include Scope, Tests, and Release impact when possible.
gh issue create --title "fix: ..." --body "## Scope\n..."
lx issue view 123
2. Start the branch
From an up-to-date main:
git checkout main && git pull
lx issue start 123 # preview branch name and readiness
lx issue start 123 --yes --comment
If you prefer a manual branch name, use the Labinetix convention (feat/, fix/, docs/, etc.) and skip --yes.
3. Implement one coherent slice
- Update code, tests, docs, and examples together
- Reference the issue in commits:
feat(cli): ... (#123)orRefs #123 - Run the same checks as CI:
just check
lx workflow check
4. Open a pull request
git push -u origin HEAD
lx pr prepare # preview generated PR body
lx pr prepare --yes # gh pr create when ready
Review and merge through GitHub as usual. CI and branch protection remain authoritative.
5. Release (maintainers)
After merging to main:
- Bump
versioninpyproject.tomlandsrc/lx_tooling/__init__.py - Add
docs/release-notes/vX.Y.Z.md(see below) - Merge the version/release-notes PR
- Tag on
mainand push the tag — CI publishes to PyPI and GitHub Releases
git tag -a v0.2.0 -m "Release v0.2.0"
git push origin v0.2.0
Bugfixes vs features
| Kind | Branch prefix | Typical release |
|---|---|---|
| Feature | feat/ |
minor 0.y.0 |
| Bugfix | fix/ |
patch 0.y.z |
| Docs only | docs/ |
patch or none |
| CI/tooling | ci/ |
patch |
Use lx workflow check before every PR; it warns on wrong branch names, missing AGENTS.md / README.md, and src/ changes without tests/ updates.
What comes later
- Optional
lx pr prepare --body-filefor manual PR body edits - Guarded tag creation and publish automation in a later milestone
- More automation does not replace CI, reviews, or protected environments
Design and Agent Rules
- Design:
docs/design/lx-tooling.md - Agent rules:
AGENTS.md
Releases and release notes
- Package name on PyPI:
lx-tooling - CLI command:
lx - Latest release: GitHub Releases
- Artifacts: wheel + sdist built by CI on protected SemVer tags (
v*), published to PyPI via trusted publishing (pypi.yml, environmentpypi)
Release notes practice
Store release notes in the repository, not only on GitHub:
docs/release-notes/vX.Y.Z.md
Each file should include:
- User-facing summary and command changes
- Breaking changes (if any)
- Linked issues and PRs
- Session notes when AI agents helped — goal, approach, verification, follow-ups
See docs/release-notes/README.md for the full template and policy.
The PyPI workflow uses the matching file as the GitHub Release body when you push a tag.
Maintainer checklist
- Merge feature/fix PRs to
main; keep CI green - Open a small PR (or commit on
mainif policy allows) that bumps version + addsdocs/release-notes/vX.Y.Z.md - Merge to
main - Tag
vX.Y.Zonmainand push the tag - Confirm PyPI workflow succeeded; verify
uv tool install lx-toolingpicks up the new version
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 lx_tooling-0.3.0.tar.gz.
File metadata
- Download URL: lx_tooling-0.3.0.tar.gz
- Upload date:
- Size: 35.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7fb4e7aa33bcd523a614181dc26fc6c20085fe13e9c0ec1c7cd6e71c53257b1d
|
|
| MD5 |
f949b9666332529909673335d2d8b8fb
|
|
| BLAKE2b-256 |
c7e0136e1f656f654f8dc2630ee894796cffd5cad0638af737a5bc3acd191705
|
Provenance
The following attestation bundles were made for lx_tooling-0.3.0.tar.gz:
Publisher:
pypi.yml on labinetix/lx-tooling
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lx_tooling-0.3.0.tar.gz -
Subject digest:
7fb4e7aa33bcd523a614181dc26fc6c20085fe13e9c0ec1c7cd6e71c53257b1d - Sigstore transparency entry: 1969763060
- Sigstore integration time:
-
Permalink:
labinetix/lx-tooling@70f85bf96667aa63b6791183cbe0b618ed8cee93 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/labinetix
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@70f85bf96667aa63b6791183cbe0b618ed8cee93 -
Trigger Event:
push
-
Statement type:
File details
Details for the file lx_tooling-0.3.0-py3-none-any.whl.
File metadata
- Download URL: lx_tooling-0.3.0-py3-none-any.whl
- Upload date:
- Size: 22.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a549e33470fbdc49e621a99367b29ec9ddfad812124755686357296f6878740b
|
|
| MD5 |
6cc7cad1a02ff297630801281a0e7a37
|
|
| BLAKE2b-256 |
79e413bb0a5a2a985177bbca40a9ec830a5c7622c44eb9fd5aaa4a32cbaea791
|
Provenance
The following attestation bundles were made for lx_tooling-0.3.0-py3-none-any.whl:
Publisher:
pypi.yml on labinetix/lx-tooling
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lx_tooling-0.3.0-py3-none-any.whl -
Subject digest:
a549e33470fbdc49e621a99367b29ec9ddfad812124755686357296f6878740b - Sigstore transparency entry: 1969763359
- Sigstore integration time:
-
Permalink:
labinetix/lx-tooling@70f85bf96667aa63b6791183cbe0b618ed8cee93 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/labinetix
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@70f85bf96667aa63b6791183cbe0b618ed8cee93 -
Trigger Event:
push
-
Statement type: