semantic-release is a CLI tool and library that automates software release workflows based on semantic versioning and conventional commits. It analyzes commit messages since the last release to determine the next version number (major, minor, patch), generates release notes, creates a Git tag, and publishes the package to registries (npm, GitHub, etc.) via a plugin system. The architecture is modular: a core engine orchestrates plugin steps (verify conditions, analyze commits, generate notes, prepare, publish, notify) and supports multiple release branches, pre-releases, maintenance branches, and distribution channels. Plugins are loaded dynamically and can be configured via CLI arguments, configuration files, or shareable configurations. The codebase is written in modern JavaScript (ES modules) and has comprehensive test coverage including unit, integration, and end-to-end tests. It is actively maintained with a large community and is designed to be extended with custom plugins.
release-it is a production-grade CLI tool that automates the entire software release lifecycle: determining the next semantic version, bumping manifests (package.json via npm version), staging/committing/tagging/pushing to git, publishing to npm (including staged publishing queues, OTP flows, custom registries, and pnpm/bun publishers), and creating GitHub or GitLab releases with changelogs and binary assets. It is distributed as an npm package with a bin entry point (bin/release-it.js) and is used by major projects including Axios, jQuery, Redux, Swagger, and n8n. In production it operates as a shell-out orchestrator rather than a library-first tool — it drives git and npm CLI commands directly and talks to GitHub via Octokit and GitLab via undici fetch against their v4 REST API.
This monorepo provides a suite of libraries and CLI tools for generating changelogs from git metadata according to the Conventional Commits specification. The core pipeline consists of: a git client to fetch commits, a parser to extract structured data from commit messages, a filter to remove reverted commits, and a writer to render the changelog in Markdown. Additional packages handle version bump recommendations, preset loading (Angular, Conventional Commits), and template rendering. The system is designed for both programmatic use via builder-style APIs (e.g., `ConventionalChangelog`, `Bumper`) and direct CLI invocation. It supports multiple git hosting platforms (GitHub, GitLab, Bitbucket) and is configured through presets that define commit type effects, reference formatting, and section ordering. The architecture is a monorepo with 11+ independently published packages, each with its own tests, TypeScript definitions, and CLI entry points. The codebase is actively maintained, with frequent releases, breaking changes managed through major version bumps, and a migration from Handlebars to render functions. It requires Node.js >= 22 and is fully ESM. The project also includes a documentation website (Astro/Starlight), CI/CD via GitHub Actions, and an AI agent skill for commit message guidance. While primarily a developer tool, the repository demonstrates strong software engineering practices: clean separation of concerns, stream-based processing for large commit histories, a preset plugin pattern, and comprehensive test coverage including real git repository interactions. The lower-level packages (parser, filter, writer, git client) are designed to be reusable in other contexts, and the template utilities provide a foundation for custom changelog formatting.
The Gradle Changelog Plugin is a library that provides tasks and helper methods for managing changelogs in the 'Keep a Changelog' format. It parses Markdown changelog files to extract versioned sections, supports rendering in multiple formats (Markdown, HTML, plain text), and provides three main Gradle tasks: getChangelog (retrieves changelog for a version), initializeChangelog (creates a new changelog file), and patchChangelog (releases the unreleased section). The plugin features robust handling of various line separators, preservation of inline links in version headers, and flexible configuration for different Git hosting platforms.
tagpr is a Go CLI tool that automates the GitHub release workflow. It runs as a GitHub Action, monitoring the main branch. When unreleased changes exist, it creates or updates a release pull request with an auto-generated changelog. When that PR is merged, tagpr automatically tags the merge commit with the next semantic or calendar version and creates a GitHub Release. It supports monorepo configurations via tag prefixes, custom version files, label-based version bumping, and both SemVer and CalVer schemes. The tool integrates deeply with the GitHub API (PRs, releases, git trees, issues) and local git commands. It also includes a reusable submodule `gh2changelog` for generating changelogs from GitHub release notes. The codebase is well-structured, with clear separation of concerns, extensive tests, and a functional options pattern for configuration.