Thanks for helping improve LuCLI. This guide covers the expected workflow for proposing changes.
- Open an issue or discussion for larger changes so implementation direction is clear.
- Keep changes focused and incremental when possible.
- Follow the LuCLI command pattern:
lucli <action> <subcommand> [options] [parameters]
# Clone your fork/repository
git clone https://github.com/cybersonic/LuCLI.git
cd LuCLI
# Build project JAR
mvn clean package
# Fast development loop (runs via mvn exec:java)
./dev-lucli.shRun the standard test suites before opening a PR:
mvn test
./tests/test-bats.shUse mvn test for unit tests (JUnit in src/test/java) and ./tests/test-bats.sh for integration/end-to-end CLI coverage.
Useful additional checks:
# Quick smoke cycle
./dev-lucli.sh --version
# Build self-executing binary
mvn clean package -Pbinary- Update docs when behavior or command usage changes.
- Add a short bullet to
CHANGELOG.mdunder## Unreleasedfor user-facing changes. - Keep examples aligned with current Java/LuCLI requirements.
- Use a clear title and description of what changed and why.
- Include example commands/output when relevant.
- Mention any known limitations or follow-up work.
- Keep PR scope narrow to simplify review.
- All external contributions must pass the repository's contribution agreement check (CLA or DCO) before merge.
LuCLI uses a trunk-based workflow instead of full GitFlow.
mainis the trunk and should remain releasable.- Use short-lived branches for work (for example:
feat/...,fix/...,docs/...). - Open PRs into
mainand merge frequently in small increments. - Use release branches only when stabilizing a release (for example:
release/x.y). - Apply urgent fixes from the release branch/tag, publish the patch release, then merge those fixes back to
main.
Release flow summary:
- Develop on short-lived branches and merge to
main. - Optionally cut
release/x.yfor stabilization. - Remove
-SNAPSHOTto publish a release version. - Immediately bump to the next
-SNAPSHOTafter release.
Every PR must satisfy the configured contribution agreement gate:
- CLA mode: sign the CLA when the bot requests it in the PR.
- DCO mode: sign commits with
Signed-off-by(for example,git commit -s).
Maintainers enforce this with required status checks in branch protection.
LuCLI uses MAJOR.MINOR.PATCH[-SNAPSHOT] in pom.xml.
- Patch (
x.y.Z): bug fixes, docs, CI/tooling changes, and low-risk improvements. - Minor (
x.Y.0): new features or user-visible behavior additions. - Major (
X.0.0): breaking changes (removed/renamed commands, incompatible config/output changes, or runtime requirement changes).
When in doubt:
- If users/scripts should not need changes, use patch.
- If behavior/features expand in user-facing ways, use minor.
- If users/scripts must change, use major.
- Keep development on
-SNAPSHOTversions. - Release by removing
-SNAPSHOT, committing, and pushing. - Immediately bump to the next
-SNAPSHOTafter a release.
Use the helper script:
./scripts/release.sh status
./scripts/release.sh bump patch|minor|major
./scripts/release.sh release
./scripts/release.sh next-snapshot- Release details: RELEASE_PROCESS.md
- Project conventions and architecture notes: WARP.md