{"id":19854024,"url":"https://github.com/wall-brew-co/lein-sealog","last_synced_at":"2026-01-02T16:55:04.501Z","repository":{"id":61928151,"uuid":"556330551","full_name":"Wall-Brew-Co/lein-sealog","owner":"Wall-Brew-Co","description":"A Leiningen plugin for managing your changelog.","archived":false,"fork":false,"pushed_at":"2024-05-17T00:18:07.000Z","size":760,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2024-05-17T01:31:10.977Z","etag":null,"topics":["changelog-generator","clojure","lein-plugin","leiningen"],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Wall-Brew-Co.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-23T15:57:47.000Z","updated_at":"2024-05-30T07:03:11.374Z","dependencies_parsed_at":"2024-03-06T01:44:56.668Z","dependency_job_id":"b34d9047-d6ed-4c45-9db4-444803dcde97","html_url":"https://github.com/Wall-Brew-Co/lein-sealog","commit_stats":{"total_commits":31,"total_committers":3,"mean_commits":"10.333333333333334","dds":0.5161290322580645,"last_synced_commit":"86bf33c23543938ad08a21ef46e83678f254a420"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wall-Brew-Co%2Flein-sealog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wall-Brew-Co%2Flein-sealog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wall-Brew-Co%2Flein-sealog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wall-Brew-Co%2Flein-sealog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Wall-Brew-Co","download_url":"https://codeload.github.com/Wall-Brew-Co/lein-sealog/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243814896,"owners_count":20352038,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["changelog-generator","clojure","lein-plugin","leiningen"],"created_at":"2024-11-12T14:08:21.870Z","updated_at":"2026-01-02T16:55:04.413Z","avatar_url":"https://github.com/Wall-Brew-Co.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sealog\n\n[![Clojars Project](https://img.shields.io/clojars/v/com.wallbrew/lein-sealog.svg)](https://clojars.org/com.wallbrew/lein-sealog)\n[![GitHub](https://img.shields.io/github/license/Wall-Brew-Co/lein-sealog)](https://github.com/Wall-Brew-Co/lein-sealog/blob/master/LICENSE)\n[![Twitter Follow](https://img.shields.io/twitter/follow/WallBrew?style=social)](https://twitter.com/WallBrew)\n\nA Wall Brew [Leiningen](https://leiningen.org/) plugin for automating CHANGELOG management for projects using [Semantic Versioning 2.0](https://semver.org/ \"The core specification of Semantic Versioning\")\n\n## Rationale\n\nThe [Wall Brew Open Source Standard](https://github.com/Wall-Brew-Co/open-source#software-documentation) requires libraries to publish change documentation in a human-readable format.\nCHANGELOG files tend to be well-structured with embedded convenience links; however, they are almost always manually generated.\nSealog is a tool intended help automate:\n\n* Maintaining and generating links for versions/sections\n* Grouping changes by their type [(e.g. \"Added\", \"Fixed\", etc.)](https://keepachangelog.com/en/1.0.0/ \"The Keep A Changelog homepage, which outlines the categories used by this application\")\n* Printing the [Semantic Version](https://semver.org/) number and release date\n\n## Installation\n\nSealog is available as a leiningen plugin and can be downloaded from [clojars](https://clojars.org/com.wallbrew/lein-sealog).\nTo install Sealog, add the following in your `:plugins` list in your `project.clj` file:\n\n```clj\n[com.wallbrew/lein-sealog \"1.9.0\"]\n```\n\nThe first time you invoke this plugin, Leiningen will automatically fetch the dependency for you.\n\n## Usage\n\nFrom the root of your project directory, you may invoke the following commands:\n\n* `init` - To initialize sealog with an initial entry and a config file (if not present)\n* `bump` - To create a new changelog entry file\n* `render` - To compile all changelog entry files into a markdown Changelog\n* `insert` - To update the most recent changelog entry file with new notes\n* `version` - To print the current project versions from Leiningen and sealog\n* `check` - To validate Sealog's configuration, changelog entry files, the changelog, and the project version\n* `help` - To view the help text of sealog or any command\n\nMost commands will accept several options, which can be configured by the command line arguments passed in or in [project configuration](#configuration).\nIn all cases, the options will follow this order of precedence:\n\n1. Arguments passed by command line\n2. Values stored in configuration\n3. Default values in Sealog's implementation\n\n### Initialize Sealog\n\nSealog stores [changelog entries](#change-format) in the `.sealog/changes` directory in your project.\nSince new projects will not have this directory by default, Sealog may create it for you.\nAdditionally, Sealog will create an initial EDN change file and a configuration file for you.\n\n```sh\n$ lein sealog init\n$ ls .sealog/changes -l\ntotal 7\n-rw-r--r-- 1 user user 348 Feb 19 15:36 1-0-0.edn\n$ ls .sealog -l\ntotal 8\ndrwxr-xr-x 2 user user 4096 Feb 19 15:37 changes\n-rw-r--r-- 1 user user  128 Feb 19 15:38 config.edn\n```\n\nIf the `.sealog` directory already exists, Sealog will perform no actions.\n\n```sh\n$ lein sealog init\nSealog is already initialized!\n```\n\n### Bump Version\n\nBump creates a new [changelog entry](#change-format) in the `.sealog/changes` directory in your project.\nBased on the type of version bump, Sealog will automatically apply the correct SemVer numbering changes.\nValid bump types are: `major`, `minor`, and `patch`.\n\nAssuming the project is currently at version `1.0.0`, `major` will create `2.0.0`\n\n```sh\n$ lein sealog bump major\nCreated new changelog entry: .sealog/2-0-0.edn\n```\n\nAssuming the project is currently at version `1.0.0`, `minor` will create `1.1.0`\n\n```sh\n$ lein sealog bump minor\nCreated new changelog entry: .sealog/1-1-0.edn\n```\n\nAssuming the project is currently at version `1.0.0`, `patch` will create `1.0.1`\n\n```sh\n$ lein sealog bump patch\nCreated new changelog entry: .sealog/1-0-1.edn\n```\n\nIf no type is provided, Sealog will automatically apply a `patch` change.\nAssuming the project is currently at version `1.0.0`:\n\n```sh\n$ lein sealog bump\nCreated new changelog entry: .sealog/1-0-1.edn\n```\n\n### Inserting New Change Entries\n\nInsert adds a new change note for the most recent version.\nThe insert command requires you to pass a valid [**Keep a Changelog**](https://keepachangelog.com/en/1.0.0/) key as the second argument followed by one or more double-quoted strings representing your changes.\n\nAssume we're starting with the following changelog entry:\n\n```clj\n{:version      {:major 1\n                :minor 0\n                :patch 0}\n :version-type :semver3\n :changes      {:added      []\n                :changed    []\n                :deprecated []\n                :removed    []\n                :fixed      []\n                :security   []}\n :timestamp    \"2024-03-13T02:24:28.296154300Z\"}\n```\n\nTo denote the changes for this version of sealog, we'd submit the following command:\n\n```sh\n$ lein sealog insert added \"Created the application!\"\nReading from .sealog/config.edn\nReading from .sealog/changes/1-0-0.edn\nWriting to .sealog/changes/1-0-0.edn\nUpdated changelog entries: .sealog/changes/1-0-0.edn\n```\n\nFrom there, we can check the file and see our update:\n\n```clj\n{:version      {:major 1\n                :minor 0\n                :patch 0}\n :version-type :semver3\n :changes      {:added      [\"Created the application!\"]\n                :changed    []\n                :deprecated []\n                :removed    []\n                :fixed      []\n                :security   []}\n :timestamp    \"2024-03-13T02:24:28.296154300Z\"}\n```\n\nWe can also add several notes at once, and they'll be concatenated into any existing records.\n\n```sh\n$ lein sealog insert added \"Release feature 1!\" \"Introduce feature 2-alpha\"\nReading from .sealog/config.edn\nReading from .sealog/changes/1-0-0.edn\nWriting to .sealog/changes/1-0-0.edn\nUpdated changelog entries: .sealog/changes/1-0-0.edn\n```\n\nWhich produces the following updates:\n\n```clj\n{:version      {:major 1\n                :minor 0\n                :patch 0}\n :version-type :semver3\n :changes      {:added      [\"Created the application!\"\n                             \"Release feature 1!\"\n                             \"Introduce feature 2-alpha\"]\n                :changed    []\n                :deprecated []\n                :removed    []\n                :fixed      []\n                :security   []}\n :timestamp    \"2024-03-13T02:24:28.296154300Z\"}\n```\n\n### View Version Information\n\nSealog can parse your change entries and `project.clj` to view the current project information.\nBy default, sealog will read and compare both sources:\n\n```sh\n$ lein sealog version\nReading from .sealog/config.edn\nReading from .sealog/changes/1-0-1.edn\nReading from .sealog/changes/1-2-0.edn\nReading from .sealog/changes/1-0-0.edn\nReading from .sealog/changes/1-1-0.edn\nReading from .sealog/changes/1-2-1.edn\nReading from .sealog/changes/1-0-2.edn\nReading from .sealog/changes/1-3-0.edn\nproject.clj: 1.3.0-SNAPSHOT\nsealog: 1.3.0\n```\n\nIf you only want to consider `project.clj`:\n\n```sh\nlein sealog version project.clj\nReading from .sealog/config.edn\nReading from .sealog/changes/1-0-1.edn\nReading from .sealog/changes/1-2-0.edn\nReading from .sealog/changes/1-0-0.edn\nReading from .sealog/changes/1-1-0.edn\nReading from .sealog/changes/1-2-1.edn\nReading from .sealog/changes/1-0-2.edn\nReading from .sealog/changes/1-3-0.edn\n1.3.0-SNAPSHOT\n```\n\nIf you only want to consider sealog sourced data:\n\n```sh\nlein sealog version sealog\nReading from .sealog/config.edn\nReading from .sealog/changes/1-0-1.edn\nReading from .sealog/changes/1-2-0.edn\nReading from .sealog/changes/1-0-0.edn\nReading from .sealog/changes/1-1-0.edn\nReading from .sealog/changes/1-2-1.edn\nReading from .sealog/changes/1-0-2.edn\nReading from .sealog/changes/1-3-0.edn\n1.3.0\n```\n\n### Check Sealog Configuration\n\nSealog relies on convention to produce sane changelogs.\nTo validate that Sealog is configured appropriately, you may run a series of introspective checks.\n\n```sh\n$ lein sealog check\nReading from .sealog/config.edn\nSealog configuration is valid.\nReading from .sealog/config.edn\nChangelog entry directory contains at least one file.\nReading from .sealog/changes/1-0-1.edn\nReading from .sealog/changes/1-2-0.edn\nReading from .sealog/changes/1-3-0.edn\nAll changelog entries are valid.\nReading from .sealog/changes/1-0-1.edn\nReading from .sealog/changes/1-2-0.edn\nReading from .sealog/changes/1-3-0.edn\nAll changelog entries use the same version type.\nReading from .sealog/changes/1-0-1.edn\nReading from .sealog/changes/1-2-0.edn\nReading from .sealog/changes/1-3-0.edn\nAll changelog entries have distinct versions.\nReading from .sealog/changes/1-0-1.edn\nReading from .sealog/changes/1-2-0.edn\nReading from .sealog/changes/1-3-0.edn\nProject version matches latest changelog entry.\nReading from .sealog/changes/1-0-1.edn\nReading from .sealog/changes/1-2-0.edn\nReading from .sealog/changes/1-3-0.edn\nRendered changelog contains all changelog entries.\nAll checks passed\n```\n\nChecks:\n\n* If a configuration file exists, it must be valid.\n  * If no configuration file exists, sealog will assume its default configuration\n* The changelog directory must contain at least one file.\n* The changelog directory must contain only valid changelog entries.\n  * If invalid files are found, the issues will be printed to STDERR with `clojure.spec/explain-str`\n* All changelog entry files must use the same version type.\n  * If mismatched version types are found, all version types will be printed to STDERR\n* All changelog entry files must have a distinct version.\n  * If duplicate versions are found, all versions will be printed to STDERR\n* The project.clj version must match the latest changelog entry.\n  * If mismatched versions are found, both will be printed to STDERR\n* The rendered changelog must contain all changelog entries.\n\n### Render Changelog\n\nFinally, Sealog can aggregate and render your change entries into a clean, Markdown format.\nBy default, Sealog will render this file as `CHANGELOG.md` in the project's root.\n\n```sh\n$ lein sealog render\nWrote changelog to: CHANGELOG.md\n```\n\nAdditionally, you may pass a filename for Sealog to write to instead of CHANGELOG.md\n\n```sh\n$ lein sealog render CHANGES.md\nWrote changelog to: CHANGES.md\n```\n\nIf you wish to consistently default the filename to write, you may set the value of the `:changelog-filename` key in `.sealog/config.edn`\n\n```clj\n{:changelog-filename        \"CHANGES.md\"\n :changelog-entry-directory \".sealog/changes/\"\n :version-scheme            :semver3}\n```\n\n## Change Format\n\nSealog stores changelog entries within a repository's `.sealog/changes` directory.\nA changelog entry is an EDN file storing a map with the following keys:\n\n* `:version` - A map containing a structured representation of a semantic version\n* `:version-type` - A keyword denoting the type of versioning system used. For example, `:semver3`\n* `:changes` - A map of [**Keep a Changelog**](https://keepachangelog.com/en/1.0.0/) keys, to a sequence of strings containing the changes of that type.\n* `:timestamp` - A string containing an [RFC 3339](https://www.rfc-editor.org/rfc/rfc3339) timestamp.\n\nIncluded is an example file for version \"1.2.0\" of a library.\nThis file would be located at `.sealog/changes/1-2-0.edn`:\n\n```clj\n{:version      {:major 1\n                :minor 2\n                :patch 0}\n :version-type :semver3\n :changes      {:added      [\"A new function `foo` for baz-ing\"\n                             \"Automation to deploy the project to Clojars\"]\n                :changed    []\n                :deprecated [\"`quux` was based on an old API no longer supported by source. Consumers should migrate to `foo`\"]\n                :removed    []\n                :fixed      []\n                :security   []}\n :timestamp    \"2022-10-08T22:45:40.974189700Z\"}\n```\n\nEmpty change lists may be kept for consistency or removed.\n\n## Configuration\n\nMany of Sealog's commands may be modified at execution time with additional arguments.\nLong-term decisions, such as where the Changelog should be written to, can also be configured in a static file.\nAs of version `1.7.0`, Sealog will inspect the following locations for configuration.\nThe first location found will be used, and the others will be ignored:\n\n* The `:sealog` key in the project's `project.clj` file\n* The `.sealog/config.edn` file, relative to the project's root\n* The `.wallbrew/sealog/config.edn` file, relative to the project's root\n* The default configuration that would be written by `lein sealog init`\n\nSealog will create this file while executing `lein sealog init` if no prior Sealog configuration file is detected.\nThe file will be created with the defaults outlined in this README.\n\nThe following keys and values are supported:\n\n* `:changelog-filename`\n  * A string representing a filepath relative to the project root where the Markdown Changelog should be rendered.\n* `:changelog-entry-directory`\n  * A string representing a filepath relative to the project root where the `.edn` change files will be stored.\n* `:version-scheme`\n  * The versioning scheme to be assumed by Sealog. Currently supported options are:\n    * `:semver3` - [3 Position Semantic Versioning 2.0](https://semver.org/)\n* `:pretty-print-edn?`\n  * A boolean to determine if the .edn config and changelog entry files should be pretty printed. Defaults to false\n* `:remove-commas-in-change-files?`\n  * A boolean to remove the commas automatically inserted between key:value pairs in printed versions of changelog entry files. Defaults to false\n\n## License\n\nCopyright © [Wall Brew Co](https://wallbrew.com/)\n\nThis software is provided for free, public use as outlined in the [MIT License](https://github.com/Wall-Brew-Co/lein-sealog/blob/master/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwall-brew-co%2Flein-sealog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwall-brew-co%2Flein-sealog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwall-brew-co%2Flein-sealog/lists"}