Skip to content
rlsbl changelog
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

Flags
NameShortTypePresenceEnvDescription
--commitsstrrequiredComma-separated list of commit hashes to associate with this changelog entry
--descriptionstroptionalHuman-readable description of the change, shown in the generated CHANGELOG.md (required unless --no-user-facing)
--typestroptionalClassification 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-facingbooloptionalMark this entry as user-facing, included in generated CHANGELOG.md output (the handler treats an absent flag as user-facing)
--auto-commit, --no-auto-commitbooloptionalAuto-commit unreleased.jsonl after appending the entry (the handler commits when neither form is passed)
--allow-batch, --no-allow-batchbooloptionalAuto-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

Flags
NameShortTypePresenceEnvDescription
--auto-commit, --no-auto-commitbooloptionalAuto-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

Flags
NameShortTypePresenceEnvDescription
--versionstrrequiredSemver of the already-released version whose JSONL to amend (e.g. 0.39.0)
--commitsstrrequiredComma-separated commit hashes to associate with the amended changelog entry
--idstroptionalEntry ID (ULID) to select the target entry for amendment
--descriptionstroptionalHuman-readable description for the amended entry in CHANGELOG.md
--typestroptionalClassification 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-facingbooloptionalMark the amended entry as user-facing, included in CHANGELOG.md output (the handler treats an absent flag as user-facing)
--validate-hashes, --no-validate-hashesbooloptionalValidate 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

Flags
NameShortTypePresenceEnvDescription
--commitsstroptionalComma-separated commit hashes identifying the target entry
--idstroptionalEntry ID (ULID) identifying the target entry to edit in the JSONL file
--type, --unset-typestroptionalNew 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-descriptionstroptionalReplacement description text for the matched changelog entry --unset-description clears it.
--user-facing, --no-user-facingbooloptionalSet user_facing status on the matched entry (--user-facing to set true, --no-user-facing to set false)
--auto-commit, --no-auto-commitbooloptionalAutomatically 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.

Constraints
RuleWhat it requires
entry-selectionAt 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

Flags
NameShortTypePresenceEnvDescription
entrychoicerequiredSelection (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.
    --idstrrequiredElects 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
    --commitsstrrequiredElects 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-commitbooloptionalAuto-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

Flags
NameShortTypePresenceEnvDescription
--map-filestroptionalPath to a file of 'old_sha new_sha' lines (same format as git's post-rewrite hook)
--from-journal, --no-from-journalbooloptionalRead the commit map from safegit's rewrite journal (.git/safegit/rewrite-maps.jsonl)
--stdin, --no-stdinbooloptionalRead the old/new SHA map from stdin (for piping from git's post-rewrite hook)

#Constraints

The framework enforces these before the command runs.

Constraints
RuleWhat it requires
map-sourceAt least one of --map-file (when supplied), --from-journal (when true), --stdin (when true).

More tools from this site

  • claudestream Drive Claude Code from Python: run it as a subprocess and read its output as typed events, with async and sync sessions, sandbox policies, and tools you define in Python
  • claudewheel A TUI Claude Code Launcher that lets you have more than one profile, manage sessions lifecycle, pick the exact CC version, model to use (even older unlisted ones), pick which GitHub account to use, etc.
  • dirstat Fast, single-binary directory statistics CLI: every file under a tree grouped by format, with counts, sizes, and lines of code, as a colored terminal table or as JSON
  • fastware A batteries-included ASGI framework: msgspec JSON, a managed Granian server, dependency injection, SSE, WebSockets, auth, and a test client
  • go-toml-edit Zero-dep TOML editing library for Go with comment preservation
  • howmuchleft The fastest Claude Code statusline: context window, 5-hour, and weekly limit usage as three customizable gradient bars, rendering in about 6 ms
  • orxtra
  • pgdesign
  • predraw Declarative rendering pipeline: describe a scene in JSON and get SVG, PNG and WebP out, with light and dark style tokens, reusable components and text converted to path outlines
  • reposummary Turn a git repository's history into a Markdown journal: pick a time window or revision range and get a readable digest of what changed, optionally narrated by an LLM
  • safegit git wrapper CLI that gives each commit its own temporary index and retries ref updates on conflict, so concurrent agents share one repository
  • saferm Command-line replacement for rm that archives every deletion with a mandatory reason and the context it ran in, so deleted files can be listed, inspected and restored
  • selfdoc Static Site Generator that builds a project's documentation site directly from its source code, so the docs can never drift from the code they describe, with SEO/AEO, first-class blog, search, and cross-project linking built in
  • strictcli
  • stricttest An always-on test-isolation floor: a pytest plugin and a Go env-hygiene module that make a test suite structurally unable to reach real credentials, the real HOME, the network, or the development repository.
  • wesktop A Python framework that turns an ASGI web app into a desktop application, serving it from a local Granian server and displaying it in a native OS window via pywebview
Search