--- name: toolbox-changelog description: Generates user-facing changelogs for Devolutions Gateway and Devolutions Agent in Devolutions ToolBox format from CHANGELOG.md. --- # ToolBox Changelog Generator Read `CHANGELOG.md` from the project root and produce two user-facing changelogs — one for **Devolutions Gateway** and one for **Devolutions Agent** — ready to paste into the Devolutions ToolBox change history. ## Step 1: Determine the target version - If the user provided a version argument (e.g. `/toolbox-changelog 2025.3.4`), find the `## 2025.3.4 (...)` block in CHANGELOG.md. - Otherwise, use the **first** (most recent) version block in the file. ## Step 2: Collect relevant entries For each entry in the target version block, check the scope (the text in `_italics_` before the colon). An entry can have multiple scopes separated by commas (e.g. `_dgw,agent_:`). **Scope routing:** | Scope | Product | Label | |----------------|----------------------|-------------| | `dgw` | Devolutions Gateway | `Service` | | `installer` | Devolutions Gateway | `Installer` | | `agent` | Devolutions Agent | `Service` | | `agent-installer` | Devolutions Agent | `Installer` | Ignore entries with any other scope (`webapp`, `jetsocat`, `build`, etc.) — they are internal or belong to other products. When a single entry has multiple scopes (e.g. `_dgw,agent_:`), emit a separate line for each product it belongs to. ## Step 3: Classify into categories Map each CHANGELOG section to a user-facing category: | CHANGELOG section | Category | |-------------------|---------------| | `### Features` | New features | | `### Performance` | Improvements | | `### Security` | Improvements | | `### Bug Fixes` | Fixes | | `### Build` | *(skip)* | If unsure, use your judgment: new capabilities → New features, polish/performance/UX → Improvements, fixes → Fixes. ## Step 4: Write user-friendly descriptions The raw commit message title is often too technical. Rewrite each entry in plain English that a non-developer end user would understand: - Remove implementation details (crate names, internal module names, PR numbers, commit hashes, protocol internals). - Use active voice and plain language. - Preserve the key user-visible benefit. - Keep it to one line. **Good examples:** - `Service - Add options to use a dedicated certificate for CredSSP credential injection` - `Installer - Allow downloading keys even when the certificate isn't trusted (useful in restricted/air-gapped environments)` - `Service - Reduce noisy logs: benign client disconnects are now logged as DEBUG instead of ERROR` - `Service - Add outbound proxy configuration support for HTTP/HTTPS and SOCKS` - `Service - Automatically generate a self-signed certificate for CredSSP when no TLS certificate is configured` **Bad examples (too technical):** - `Service - Replace reqwest system-proxy with proxy_cfg crate for PAC file support` ← internal implementation detail - `Service - Downgrade BrokenPipe/ConnectionReset/UnexpectedEof from ERROR to DEBUG` ← raw code terms - `Installer - Fix 9a9f31ad71` ← commit hash, no context Use the multi-line description under each entry (when present) to understand the user-facing impact — but don't reproduce it verbatim; summarize what the user gains. **Handling vague entries:** When a commit message title is ambiguous and there is no multi-line description, inspect the commit diff to understand what actually changed. Each CHANGELOG entry contains a commit hash as a link — run `git show ` to read the diff. Use what you find to write an accurate, user-friendly description. Only omit an entry if the diff confirms it is purely internal with no user-visible effect. ## Step 5: Output format Print the final result. Omit any category that has no entries. ``` Devolutions Gateway New features Service - ... Installer - ... Improvements Service - ... Fixes Service - ... Installer - ... --- Devolutions Agent New features Service - ... Improvements Service - ... Fixes Service - ... Installer - ... ``` Each entry is on its own line. Categories are separated by a blank line. The two product sections are separated by `---` and a blank line. This makes it easy to copy individual lines directly into the Devolutions ToolBox.