This is an automated email from the ASF dual-hosted git repository.
epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr-mcp.git
The following commit(s) were added to refs/heads/main by this push:
new 13b17431 build(release): wire org.jetbrains.changelog and populate
CHANGELOG.md (#221)
13b17431 is described below
commit 13b17431557e22d5a7ddf04e6ea6463e2df0d4a9
Author: Aditya Parikh <[email protected]>
AuthorDate: Tue Oct 6 14:36:20 2026 -0400
build(release): wire org.jetbrains.changelog and populate CHANGELOG.md
(#221)
* build(release): wire org.jetbrains.changelog and populate CHANGELOG.md
Adds the org.jetbrains.changelog Gradle plugin (2.5.0) and a Keep a
Changelog-format CHANGELOG.md with an [Unreleased] section reflecting
recent JSON/CSV/XML indexing and native-logging fixes.
Entries are maintained by hand as PRs land; patchChangelog promotes
[Unreleased] into a versioned section at release time, and getChangelog
extracts one version's notes for reuse (e.g. as a release announcement
body). This mirrors the manual-entry direction the maintainers already
settled on after closing PR #34 (release-please) and PR #35
(git-semver-plugin), which proposed fully commit-driven automation.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Signed-off-by: Aditya Parikh <[email protected]>
(cherry picked from commit 68168aecee3c47924dc5d488edfd222437c1c998)
* docs(release): add changelog guide, seed CHANGELOG.md empty for 1.0.0
Document how contributors add entries to CHANGELOG.md's [Unreleased]
section day-to-day, and the exact patchChangelog/getChangelog commands
to run at release time, in dev-docs/CHANGELOG_GUIDE.md. Link it from
the README docs index.
Since this is the project's first release, [Unreleased] is seeded
empty rather than back-filled with a few example entries -- the guide
calls out that the actual 1.0.0 notes need a deliberate one-time pass
over the full commit history, done close to the real release so they
reflect what's shipping.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Signed-off-by: Aditya Parikh <[email protected]>
* fix(release): correct getChangelog usage docs, link PR #157 not a phantom
path
The build.gradle.kts comment claimed getChangelog falls back to
project.version without --project-version; verified against the
running plugin that it instead throws MissingVersionException, and
that --unreleased works standalone (no --project-version needed).
Also point CHANGELOG_GUIDE.md at apache/solr-mcp#157 instead of
dev-docs/release-process.md, which doesn't exist on main yet.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Signed-off-by: Aditya Parikh <[email protected]>
---------
Signed-off-by: Aditya Parikh <[email protected]>
Co-authored-by: Claude Sonnet 5 <[email protected]>
---
CHANGELOG.md | 13 +++++++
README.md | 2 +-
build.gradle.kts | 23 ++++++++++++
dev-docs/CHANGELOG_GUIDE.md | 89 +++++++++++++++++++++++++++++++++++++++++++++
gradle/libs.versions.toml | 2 +
5 files changed, 128 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..ef94dc1b
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,13 @@
+# Changelog
+
+## [Unreleased]
+
+### Added
+
+### Changed
+
+### Fixed
+
+### Security
+
+[Unreleased]: https://github.com/apache/solr-mcp/commits
diff --git a/README.md b/README.md
index 4521e02e..f34140bc 100644
--- a/README.md
+++ b/README.md
@@ -166,7 +166,7 @@ Running in **HTTP mode** — OAuth2, CORS, and the
`HTTP_SECURITY_ENABLED` toggl
**Developing it**
- [Development guide](dev-docs/DEVELOPMENT.md) — build, run, test, IDE, native
image, SBOM · [Architecture](dev-docs/ARCHITECTURE.md)
- [Deployment](dev-docs/DEPLOYMENT.md) — Docker images, the three-image
matrix, registries, Kubernetes · [Troubleshooting](dev-docs/TROUBLESHOOTING.md)
-- [GraalVM native image spec](dev-docs/graalvm-native-image.md) ·
[Contributing](CONTRIBUTING.md)
+- [GraalVM native image spec](dev-docs/graalvm-native-image.md) · [Changelog
guide](dev-docs/CHANGELOG_GUIDE.md) · [Contributing](CONTRIBUTING.md)
> **Container images:** published images are not yet available on a public
> registry. The Docker examples in the client guides use a **locally built**
> image — build it with `./gradlew jibDockerBuild` (produces
> `solr-mcp:latest`). See [Building Docker
> images](dev-docs/DEPLOYMENT.md#docker-images-with-jib).
diff --git a/build.gradle.kts b/build.gradle.kts
index b0933b5e..e1d7692d 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -28,6 +28,7 @@ plugins {
alias(libs.plugins.jib)
alias(libs.plugins.graalvm.native) apply false
alias(libs.plugins.cyclonedx)
+ alias(libs.plugins.changelog)
// Generates ASF source/binary LICENSE + NOTICE (buildSrc convention
plugin).
// Listed after spring-boot + cyclonedx so productionRuntimeClasspath and
// cyclonedxBom exist when it wires its tasks. See buildSrc/.
@@ -341,6 +342,28 @@ spotless {
}
}
+// Release Notes / CHANGELOG.md (org.jetbrains.changelog)
+// ========================================================
+// Maintains CHANGELOG.md in Keep a Changelog format. Entries are added by
hand to the
+// [Unreleased] section as PRs land (see CONTRIBUTING guidance); at release
time
+// `patchChangelog` promotes [Unreleased] into a versioned section, and
`getChangelog`
+// extracts one version's notes for reuse (e.g. as a GitHub Release body).
+//
+// ./gradlew patchChangelog # cut
[Unreleased] -> version section
+// ./gradlew getChangelog --console=plain -q --no-header --unreleased
# unreleased notes
+// ./gradlew getChangelog --console=plain -q --no-header
--project-version=1.0.0 # one version's notes
+//
+// getChangelog requires either --unreleased or --project-version=<x>: it does
not fall back to
+// Gradle's own `project.version` (e.g. "1.0.0-SNAPSHOT") and fails with
MissingVersionException
+// if neither is given.
+//
+// See the release process doc (apache/solr-mcp#157; will land as
dev-docs/release-process.md)
+// for where this fits in an ASF release.
+changelog {
+ repositoryUrl = "https://github.com/apache/solr-mcp"
+ groups = listOf("Added", "Changed", "Fixed", "Security")
+}
+
// Docker Integration Test Task
// =============================
// Runs integration tests against the appropriate Docker image:
diff --git a/dev-docs/CHANGELOG_GUIDE.md b/dev-docs/CHANGELOG_GUIDE.md
new file mode 100644
index 00000000..56786fd6
--- /dev/null
+++ b/dev-docs/CHANGELOG_GUIDE.md
@@ -0,0 +1,89 @@
+# Changelog Guide
+
+`CHANGELOG.md` follows [Keep a Changelog](https://keepachangelog.com) and is
managed by the
+`org.jetbrains.changelog` Gradle plugin (`build.gradle.kts`). It has one job:
give every release
+a real, human-readable set of release notes without anyone reverse-engineering
them from commit
+history at the last minute.
+
+## Day to day: add an entry with your PR
+
+If your change is user-visible — a new tool, a changed response shape, a fixed
bug, a closed
+security gap — add one line to the `[Unreleased]` section of `CHANGELOG.md` in
the same PR,
+under the group that fits:
+
+```markdown
+## [Unreleased]
+
+### Added
+
+- **index-json-documents** now accepts a typed array of documents in one call.
+
+### Changed
+
+### Fixed
+
+- Configuring `solr.url` to an address SolrJ cannot reach now fails fast at
startup.
+
+### Security
+```
+
+Skip the entry for internal-only changes: refactors, test additions, CI/build
tweaks, docs,
+dependency bumps with no observable effect. If a group ends up with no entries
at release time,
+it's simply omitted from the extracted notes (see `getChangelog` below) —
leave empty headers
+in place rather than deleting them.
+
+Write the entry as the *effect*, not the commit — no commit hashes, PR
numbers, or scope
+prefixes; that's what `git log` and `gh pr view` are for.
+
+## At release time
+
+1. **Review `[Unreleased]`** for completeness against everything that actually
shipped since the
+ last release (`git log <last-tag>..HEAD --no-merges` is the check, not the
source of the
+ entries — entries should already be there from step "day to day" above).
+2. **Cut the version.** The plugin's `changelog { version = project.version }`
default will
+ pick up whatever `version` is set to in `build.gradle.kts` — but during
development that's a
+ `-SNAPSHOT` value, which is *not* what you want in the changelog heading.
Override it
+ explicitly for the release:
+ ```bash
+ ./gradlew patchChangelog -Pversion=1.0.0
+ ```
+ This renames `[Unreleased]` to `## [1.0.0] - <today>` and opens a fresh,
empty
+ `[Unreleased]` section above it.
+3. **Extract the release notes** for reuse as the GitHub Release body /
release announcement:
+ ```bash
+ ./gradlew getChangelog --console=plain -q --no-header
--project-version=1.0.0
+ ```
+4. **Commit `CHANGELOG.md`** as part of the release branch (see the release
process doc,
+ [apache/solr-mcp#157](https://github.com/apache/solr-mcp/pull/157) — will
land as
+ `dev-docs/release-process.md` — for where this fits relative to building
and signing
+ artifacts; do it before signing, since it's source, not a build output).
+
+Useful read-only commands while iterating:
+
+```bash
+# Preview what would ship, without mutating the file
+./gradlew getChangelog --console=plain -q --unreleased --no-summary
--no-empty-sections
+
+# Scaffold a fresh CHANGELOG.md from nothing (already done for this repo; here
for reference)
+./gradlew initializeChangelog
+```
+
+## Handling the first release (1.0.0)
+
+This is the first release this project has ever cut, so `[Unreleased]` was
seeded empty rather
+than back-filled — entries only exist from the point this guide was adopted
onward. Whoever
+prepares the 1.0.0 release notes needs a one-time, deliberate pass over the
*entire* project
+history before running `patchChangelog`, not just the recent PRs:
+
+1. Get the full commit range: `git log --no-merges
--format='%x1e%H%x1f%s%x1f%b' HEAD` from the
+ project's first commit (there are no prior tags to diff against).
+2. Categorize into `Added` / `Changed` / `Fixed` / `Security`, collapsing
multiple commits that
+ implement one user-facing capability into a single entry (e.g. the several
PRs behind
+ markdown indexing become one `Added` line, not five). Drop internal-only
commits.
+3. Write the result into `[Unreleased]` by hand, then follow **At release
time** above.
+
+Doing this well is a real editing pass, not a mechanical `git log` dump —
budget time for it
+alongside the other 1.0.0 release-process work, and do it close to the actual
release so the
+notes reflect what's really shipping (see `dev-docs/release-process.md` and
the tracking issues
+for the open blockers on that release). Every release after 1.0.0 skips this
step entirely,
+since `[Unreleased]` will already be current.
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index b5cdc021..73db0b55 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -23,6 +23,7 @@ jib = "3.5.3"
spotless = "7.0.2"
graalvm-native = "0.10.6"
cyclonedx-plugin = "2.4.1"
+changelog-plugin = "2.5.0"
# Main dependencies
spring-ai = "1.1.7"
@@ -140,3 +141,4 @@ jib = { id = "com.google.cloud.tools.jib", version.ref =
"jib" }
spotless = { id = "com.diffplug.spotless", version.ref = "spotless" }
graalvm-native = { id = "org.graalvm.buildtools.native", version.ref =
"graalvm-native" }
cyclonedx = { id = "org.cyclonedx.bom", version.ref = "cyclonedx-plugin" }
+changelog = { id = "org.jetbrains.changelog", version.ref = "changelog-plugin"
}