# CHANGELOG



## v0.7.0 (2026-03-24)

### Feature

* feat: add documentation for supporting ssh users ([`b7a65fe`](https://github.com/caylent-solutions/rpm/commit/b7a65fe90ea5ac531ccd828cbe1f8600853857bb))

### Unknown

* Merge pull request #23 from caylent-solutions/feat/ssh-support

docs: add documentation for supporting ssh users ([`84614ca`](https://github.com/caylent-solutions/rpm/commit/84614ca7469d6d7bbe1e4d07b3415b335efe9e93))


## v0.6.0 (2026-03-20)

### Chore

* chore(release): 0.6.0 ([`92ad672`](https://github.com/caylent-solutions/rpm/commit/92ad67266c3699ee6aae3f6f9d328b44b2da0966))

### Feature

* feat: simplify bundled catalog to rpm-only with placeholder .rpmenv (#21)

Remove make and gradle catalog entries — the bundled catalog now contains
only the `rpm` standalone entry. Replace hard-coded Caylent-specific values
in the rpm catalog .rpmenv with descriptive placeholders and commented-out
examples showing single-source and multi-source configurations.

This makes the bundled catalog generic for any organization. Users edit
.rpmenv after bootstrap to configure their GITBASE, marketplace toggle,
and source variables. ([`a331153`](https://github.com/caylent-solutions/rpm/commit/a331153c28885daf92575189192e744aa6aeffdb))

### Unknown

* Merge pull request #22 from caylent-solutions/release-0.6.0

Release 0.6.0 ([`7899fa4`](https://github.com/caylent-solutions/rpm/commit/7899fa4259ed1d6e54b75bd9ef4abbb3af28179a))


## v0.5.0 (2026-03-16)

### Chore

* chore(release): 0.5.0 ([`d67ecc5`](https://github.com/caylent-solutions/rpm/commit/d67ecc5663acd381de1fbdb113f51b2c8e01a426))

### Feature

* feat: catalog-driven bootstrap with pre-configured .rpmenv (#19)

Bootstrap now copies all files from catalog entries including a
pre-configured .rpmenv, eliminating placeholder editing on first
setup. Renames runner terminology to package throughout CLI, code,
tests, and docs for consistency with the catalog entry model. ([`2fc907c`](https://github.com/caylent-solutions/rpm/commit/2fc907c8a7fac72aa82f2bbfd73e81241cf7800b))

* feat: clarify source naming convention for multiple sources (#18)

* feat: clarify source naming convention for multiple sources in multi-source guide

Add dedicated &#34;Source Naming Convention&#34; section explaining the three-field
variable structure and the hyphenation pattern for supporting multiple
sources of the same concern type. Add a multi-source .rpmenv example
showing multiple build and marketplace sources side by side. Update
directory structure, symlink aggregation, and collision detection examples
to use consistent multi-source naming throughout.

* feat: clarify that source names are arbitrary and do not affect CLI behavior

Add explicit explanation that the CLI treats all sources identically
regardless of name. The names &#34;build&#34; and &#34;marketplaces&#34; are team
conventions for readability — what determines a source&#39;s behavior is
the manifest content (project entries and linkfile elements), not the
source name.

* feat: recommend build/marketplaces naming convention with rationale

Add explicit recommendation to prefix source names with &#34;build&#34; or
&#34;marketplaces&#34; so that humans and AI agents can immediately understand
each source&#39;s purpose from the .rpmenv file alone, without needing to
inspect manifest content.

* feat: document flexible source naming convention and marketplace mechanism

Clarify that marketplace behavior is determined by linkfile symlink
destinations into CLAUDE_MARKETPLACES_DIR, not by source naming. Expand
the naming convention section with a table of common prefixes beyond
build/marketplaces (pipelines, runners, tf-deploy-templates,
sonarqube-config) and explain that any descriptive name is appropriate. ([`6c91de5`](https://github.com/caylent-solutions/rpm/commit/6c91de5b93c8ecad38d89cfda0a17f6bdf62e6a8))

### Unknown

* Merge pull request #20 from caylent-solutions/release-0.5.0

Release 0.5.0 ([`32afa79`](https://github.com/caylent-solutions/rpm/commit/32afa79b219f92b4288dacc607740f3fde739192))


## v0.4.0 (2026-03-12)

### Chore

* chore(release): 0.4.0 ([`c8fa8dd`](https://github.com/caylent-solutions/rpm/commit/c8fa8ddbce109a729ad68ec3cf1e10c25e39dd5d))

### Feature

* feat: add rpm bootstrap runner with getting-started readmes (#16)

* fix(build): remove duplicate catalog files from wheel

Remove redundant force-include for src/rpm_cli/catalog in pyproject.toml.
The catalog directory is already included via packages = [&#34;src/rpm_cli&#34;],
so force-include caused duplicate entries in the ZIP archive, which PyPI
rejects with &#34;Duplicate filename in local headers&#34;.

* feat: add rpm bootstrap runner with getting-started readmes

Add a third bootstrap runner called &#39;rpm&#39; for projects that don&#39;t use
a standard task runner (Make or Gradle). Running &#39;rpm bootstrap rpm&#39;
creates only .rpmenv and rpm-readme.md — no wrapper files.

Add rpm-readme.md getting-started guides to all three runner catalog
directories (make, gradle, rpm) with runner-specific prerequisites,
setup steps, full .rpmenv variable reference, and troubleshooting.

Update .rpmenv template to use concrete rpm-git-repo URL and branch
instead of placeholders. Cover with unit and functional tests (218
tests passing). ([`3c9a7fd`](https://github.com/caylent-solutions/rpm/commit/3c9a7fd7f1a99e82e3da6e003bffca51370e79f8))

### Unknown

* Merge pull request #17 from caylent-solutions/release-0.4.0

Release 0.4.0 ([`14a2843`](https://github.com/caylent-solutions/rpm/commit/14a284380c7afac0ecc0f010364b2b29ba89ef10))


## v0.3.0 (2026-03-12)

### Chore

* chore(release): 0.3.0 ([`be2d0d3`](https://github.com/caylent-solutions/rpm/commit/be2d0d3f65b01d2a7d3b0119930b265d184e322e))

### Feature

* feat: use separate concurrency group for publish workflow to prevent cancellation (#14)

* feat: support PEP 440 constraints in RPM_SOURCE_*_REVISION with refs/tags/ prefix

Extends resolve_version() to mirror the constraint syntax supported by
rpm-git-repo manifest &lt;project&gt; revision attributes. The last path
component is inspected for PEP 440 operators, enabling prefixed
constraints like refs/tags/~=1.1.0 and refs/tags/prefix/&gt;=1.0.0,&lt;2.0.0.

_list_tags() now returns full ref paths (refs/tags/1.1.2) so the
resolved value is directly usable with repo init -b. All operators
supported by rpm-git-repo are supported: ~=, &gt;=, &lt;=, &gt;, &lt;, ==, !=, *.

Removes _parse_tag_versions() (logic inlined), adds _is_version_constraint()
mirroring rpm-git-repo version_constraints.py. Updates version-resolution.md,
multi-source-guide.md, and README to document the new syntax.

* style: apply ruff formatting to version.py and test_version.py

* docs: add table of contents to README

* fix: use separate concurrency group for publish workflow to prevent cancellation ([`ebacbaa`](https://github.com/caylent-solutions/rpm/commit/ebacbaa2574bf0f8c464ce24058ecb0d7e409f04))

### Unknown

* Merge pull request #15 from caylent-solutions/release-0.3.0

Release 0.3.0 ([`48fdf5f`](https://github.com/caylent-solutions/rpm/commit/48fdf5f51a27f6a001eef54655d26b5859be248d))


## v0.2.0 (2026-03-12)

### Chore

* chore(release): 0.2.0 ([`e6b8b86`](https://github.com/caylent-solutions/rpm/commit/e6b8b86e25ceba82a01b026cf15c4fb8d0fb0599))

### Feature

* feat: support PEP 440 constraints in RPM_SOURCE_*_REVISION with refs/tags/ prefix (#12)

* feat: support PEP 440 constraints in RPM_SOURCE_*_REVISION with refs/tags/ prefix

Extends resolve_version() to mirror the constraint syntax supported by
rpm-git-repo manifest &lt;project&gt; revision attributes. The last path
component is inspected for PEP 440 operators, enabling prefixed
constraints like refs/tags/~=1.1.0 and refs/tags/prefix/&gt;=1.0.0,&lt;2.0.0.

_list_tags() now returns full ref paths (refs/tags/1.1.2) so the
resolved value is directly usable with repo init -b. All operators
supported by rpm-git-repo are supported: ~=, &gt;=, &lt;=, &gt;, &lt;, ==, !=, *.

Removes _parse_tag_versions() (logic inlined), adds _is_version_constraint()
mirroring rpm-git-repo version_constraints.py. Updates version-resolution.md,
multi-source-guide.md, and README to document the new syntax.

* style: apply ruff formatting to version.py and test_version.py

* docs: add table of contents to README ([`d99b071`](https://github.com/caylent-solutions/rpm/commit/d99b071c78c1521b81ae364a7c41debe3c4387bd))

### Unknown

* Merge pull request #13 from caylent-solutions/release-0.2.0

Release 0.2.0 ([`7c48bfe`](https://github.com/caylent-solutions/rpm/commit/7c48bfedc8547ca9c980bf0af21c0496ce2c7f52))


## v0.1.4 (2026-03-12)

### Chore

* chore(release): 0.1.4 ([`6d98ebf`](https://github.com/caylent-solutions/rpm/commit/6d98ebf4f8b361ceedf5dcbe16a59d9a4a106d8a))

### Fix

* fix: resolve source revision specifiers before passing to repo init (#10)

RPM_SOURCE_&lt;name&gt;_REVISION supports PEP 440 specifiers (e.g. *, ~=1.0)
via resolve_version, but configure() was passing the raw specifier
directly to repo init -b, causing repo to fail with &#39;revision not found&#39;.

Call resolve_version on the source revision before run_repo_init so
that wildcard and range specifiers are resolved to actual tags. ([`98abc86`](https://github.com/caylent-solutions/rpm/commit/98abc868d0d3b0321d49d6e36c7dc4132621254e))

### Unknown

* Merge pull request #11 from caylent-solutions/release-0.1.4

Release 0.1.4 ([`56ea6bc`](https://github.com/caylent-solutions/rpm/commit/56ea6bccb740fc59c364d8f2faedf501253868b7))


## v0.1.3 (2026-03-11)

### Chore

* chore(release): 0.1.3 ([`1b1483d`](https://github.com/caylent-solutions/rpm/commit/1b1483d5b0a58ef10c45cb58bccc040cb22b94d7))

### Fix

* fix(build): remove duplicate catalog files from wheel

Remove redundant force-include for src/rpm_cli/catalog in pyproject.toml.
The catalog directory is already included via packages = [&#34;src/rpm_cli&#34;],
so force-include caused duplicate entries in the ZIP archive, which PyPI
rejects with &#34;Duplicate filename in local headers&#34;. ([`a9aa28c`](https://github.com/caylent-solutions/rpm/commit/a9aa28c583f178fbe8e186d923253a6371f8d4ff))

### Unknown

* Merge pull request #9 from caylent-solutions/release-0.1.3

Release 0.1.3 ([`b340608`](https://github.com/caylent-solutions/rpm/commit/b340608fad9fbf03ecc6da1776df25afb4f5ccb5))


## v0.1.2 (2026-03-11)

### Chore

* chore(release): 0.1.2 ([`d9da1a6`](https://github.com/caylent-solutions/rpm/commit/d9da1a6010d728bf3f20187ad29194df61673c18))

### Fix

* fix: use dynamic version in functional test and enable verbose PyPI publish

- Replace hardcoded version string in test_version_flag with
  rpm_cli.__version__ so the test doesn&#39;t break on version bumps
- Enable verbose mode on pypa/gh-action-pypi-publish to diagnose
  400 Bad Request from PyPI trusted publisher upload ([`2e082f0`](https://github.com/caylent-solutions/rpm/commit/2e082f02aec6eef85605a7d04dfba6f53ac62d8d))

### Unknown

* Merge pull request #7 from caylent-solutions/release-0.1.2

Release 0.1.2 ([`361e8f1`](https://github.com/caylent-solutions/rpm/commit/361e8f163758de3ebaf6a128f235834f708142ad))


## v0.1.1 (2026-03-11)

### Chore

* chore(release): 0.1.1 ([`10922ca`](https://github.com/caylent-solutions/rpm/commit/10922caa7a054fa215cfcb4aec2c6dc407a480f1))

### Ci

* ci: add SDLC pipeline with semantic release, PyPI publishing, and devcontainer setup

* ci: add SDLC pipeline with semantic release, PyPI publishing, and devcontainer setup

- Add GitHub Actions workflows: pr-validation, main-validation, publish, codeql-analysis
- Add python-semantic-release config for automated versioning from conventional commits
- Add pre-commit config with security scanning (gitleaks, detect-private-key, detect-aws-credentials)
- Add CONTRIBUTING.md with commit conventions, PR process, and release documentation
- Add git hooks (pre-commit, pre-push) for local development quality gates
- Add .yamllint, .tool-versions, CHANGELOG.md
- Update Makefile with build, publish, pre-commit-check, install-hooks targets
- Update pyproject.toml with project metadata, classifiers, and semantic-release config
- Update requirements-dev.txt with semantic-release, build, twine, pre-commit, yamllint
- Update README.md with developer setup, contributing guide, and CI/CD pipeline overview
- Update .gitignore with .claude/settings.local.json exclusion
- Add devcontainer configuration for consistent development environments
- Add CLAUDE.md with engineering and automation standards

* fix(ci): run unit tests with --cov flag for coverage threshold check

The coverage json step requires pytest to run with --cov to produce
coverage data. Without it, coverage json reports no data and exits 1.

* fix(ci): lower coverage threshold to 85% to match current codebase

Current unit test coverage is 87%. Set threshold to 85% to allow
the pipeline to pass. Threshold can be raised as coverage improves. ([`91b2be1`](https://github.com/caylent-solutions/rpm/commit/91b2be1c48689107dade4fa9dc44c64ce639f7bb))

### Fix

* fix(ci): upgrade GitHub Actions to Node.js 24 and handle no-op releases

- Upgrade actions/checkout v4 → v6, actions/cache v4 → v5,
  actions/setup-python v5 → v6 to resolve Node.js 20 deprecation
- Add early exit in create-release job when no file changes are
  detected (e.g., ci: commits that don&#39;t trigger a version bump)
- Skip tag creation and publish trigger when release is skipped ([`d8b5fd9`](https://github.com/caylent-solutions/rpm/commit/d8b5fd99d3892f928e1835ef680dc02d5616258d))

### Unknown

* Merge pull request #4 from caylent-solutions/release-0.1.1

Release 0.1.1 ([`9477192`](https://github.com/caylent-solutions/rpm/commit/94771923e156c189a4f775f3260115d54632e1d7))


## v0.1.0 (2026-03-11)

### Feature

* feat: initial RPM CLI release — standalone public repo

Migrate RPM CLI from caylent-private-rpm/scripts/rpm-cli/ to standalone
public repository. Includes all source code, tests, bundled catalog
templates, and comprehensive documentation covering CLI usage, manifest
repo creation, package development, and marketplace packages.

Version 0.1.0 — first public release under Apache 2.0 license. ([`a32c0e5`](https://github.com/caylent-solutions/rpm/commit/a32c0e55198675bb1f511b2ca8d6700f9e15607a))

### Unknown

* Initial commit ([`c8dab0f`](https://github.com/caylent-solutions/rpm/commit/c8dab0fd0d48c36478029ed2cb93c68a0067eec0))
