On this page
Structured changelog management using JSONL entries, each typed feature, fix or breaking.
#rlsbl changelog
Structured changelog management using JSONL entries, each typed feature, fix or breaking. Add and generate CHANGELOG.md from per-commit changelog entries stored in unreleased.jsonl for precise, auditable release notes.
#changelog add
Append a structured changelog entry to the project's unreleased.jsonl file. Each entry includes a human-readable description, an entry type (feature, fix, or breaking), and optional commit hashes linking it to specific changes. The file is auto-committed by default. Use --no-user-facing to mark internal changes that should not appear in the published changelog.
Effect: mutating
#Flags
| Name | Short | Type | Presence | Env | Description |
|---|---|---|---|---|---|
--commits | str | required | Comma-separated list of commit hashes to associate with this changelog entry | ||
--description | str | optional | Human-readable description of the change, shown in the generated CHANGELOG.md (required unless --no-user-facing) | ||
--type | str | optional | Classification of the change (required unless --no-user-facing) Values: feature (a new capability users can reach), fix (a user-visible defect that no longer happens), breaking (a change that requires action from users). | ||
--user-facing, --no-user-facing | bool | optional | Mark this entry as user-facing, included in generated CHANGELOG.md output (the handler treats an absent flag as user-facing) | ||
--auto-commit, --no-auto-commit | bool | optional | Auto-commit unreleased.jsonl after appending the entry (the handler commits when neither form is passed) | ||
--allow-batch, --no-allow-batch | bool | optional | Auto-create an exclusion if this entry exceeds the commit batch limit |
#changelog generate
Compile all validated JSONL changelog entries into a formatted CHANGELOG.md file. Groups entries by type (features, fixes, breaking changes) under the appropriate version heading, preserving existing changelog content for previous releases. Use --dry-run to preview the generated Markdown output without writing to disk, which is useful for reviewing before committing.
Effect: mutating
#Flags
| Name | Short | Type | Presence | Env | Description |
|---|---|---|---|---|---|
--auto-commit, --no-auto-commit | bool | optional | Auto-commit generated CHANGELOG.md and per-version .md files (the handler commits when neither form is passed) |
#changelog amend
Append a changelog entry to a released version's JSONL file. Temporarily unlocks the read-only file, appends the entry, re-locks it, regenerates CHANGELOG.md, and syncs GitHub Release notes. Use --no-validate-hashes to skip hash validation for old or amended commits.
Effect: mutating
#Flags
| Name | Short | Type | Presence | Env | Description |
|---|---|---|---|---|---|
--version | str | required | Semver of the already-released version whose JSONL to amend (e.g. 0.39.0) | ||
--commits | str | required | Comma-separated commit hashes to associate with the amended changelog entry | ||
--id | str | optional | Entry ID (ULID) to select the target entry for amendment | ||
--description | str | optional | Human-readable description for the amended entry in CHANGELOG.md | ||
--type | str | optional | Classification for the amended entry (required unless --no-user-facing) Values: feature (a new capability users can reach), fix (a user-visible defect that no longer happens), breaking (a change that requires action from users). | ||
--user-facing, --no-user-facing | bool | optional | Mark the amended entry as user-facing, included in CHANGELOG.md output (the handler treats an absent flag as user-facing) | ||
--validate-hashes, --no-validate-hashes | bool | optional | Validate commit hashes via git rev-parse before appending (the handler validates when neither form is passed) |
#changelog edit
Modify an existing changelog entry in unreleased or released JSONL files. Finds the entry by commit hash or entry ID, applies field changes (type, description, user-facing status), and rewrites the file atomically. For released files, temporarily unlocks the read-only file, regenerates CHANGELOG.md, and syncs GitHub Release notes.
Effect: mutating
Updates: changelog-entry (write mode: sparse)
- Identified by:
--commits,--id - Writes:
--description,--type,--user-facing-- at least one of them is required. - A property that is not supplied is left unchanged.
- Clearable:
--unset-description,--unset-type.
#Flags
| Name | Short | Type | Presence | Env | Description |
|---|---|---|---|---|---|
--commits | str | optional | Comma-separated commit hashes identifying the target entry | ||
--id | str | optional | Entry ID (ULID) identifying the target entry to edit in the JSONL file | ||
--type, --unset-type | str | optional | New type value; also disambiguates a commit covered by several entries Values: feature (a new capability users can reach), fix (a user-visible defect that no longer happens), breaking (a change that requires action from users). --unset-type clears it. | ||
--description, --unset-description | str | optional | Replacement description text for the matched changelog entry --unset-description clears it. | ||
--user-facing, --no-user-facing | bool | optional | Set user_facing status on the matched entry (--user-facing to set true, --no-user-facing to set false) | ||
--auto-commit, --no-auto-commit | bool | optional | Automatically commit the edited JSONL changelog file to git after modification (the handler commits when neither form is passed) |
#Constraints
The framework enforces these before the command runs.
| Rule | What it requires |
|---|---|
entry-selection | At least one of --commits (when supplied), --id (when supplied). |
#changelog remove
Delete one entry from a JSONL changelog file, selected by its ULID identifier or by the commits it covers. The file is rewritten atomically without that line; a released version's file is temporarily unlocked, re-locked, and followed by a CHANGELOG.md regeneration and a GitHub Release notes sync. Exactly one entry is removed: a selector matching several is refused with every match named, and a selector matching none is refused too.
Effect: mutating
#Flags
| Name | Short | Type | Presence | Env | Description |
|---|---|---|---|---|---|
entry | choice | required | Selection (not typed as a flag). Elect exactly one of --id, --commits. Which entry to remove. Exactly one addressing mode must be elected, and it must select exactly one entry. | ||
--id | str | required | Elects entry = id. Address the entry by its stable ULID identifier, which survives every unrelated edit to the file it sits in Its value: the entry's ULID identifier, as written in the JSONL line's own id member | ||
--commits | str | required | Elects entry = commits. Address the entry by the commits it covers, which is how an entry is named when its identifier is not at hand Its value: comma-separated commit hashes; the entry covering any of them is removed, and a list covering several entries is refused with each match named | ||
--auto-commit, --no-auto-commit | bool | optional | Auto-commit the rewritten JSONL file (and, for a released version, the regenerated CHANGELOG.md) after removing the entry (the handler commits when neither form is passed) |
#changelog remap
Remap stale commit hashes in JSONL changelog files using a mapping of old SHAs to new SHAs. Reads the mapping from a file (--map-file), the safegit rewrite journal (--from-journal), or stdin (--stdin). At least one source is required. Auto-commits with Autogenerated trailer.
Effect: mutating
#Flags
| Name | Short | Type | Presence | Env | Description |
|---|---|---|---|---|---|
--map-file | str | optional | Path to a file of 'old_sha new_sha' lines (same format as git's post-rewrite hook) | ||
--from-journal, --no-from-journal | bool | optional | Read the commit map from safegit's rewrite journal (.git/safegit/rewrite-maps.jsonl) | ||
--stdin, --no-stdin | bool | optional | Read the old/new SHA map from stdin (for piping from git's post-rewrite hook) |
#Constraints
The framework enforces these before the command runs.
| Rule | What it requires |
|---|---|
map-source | At least one of --map-file (when supplied), --from-journal (when true), --stdin (when true). |