Skip to content

Commit 3c22e42

Browse files
vikvangoz-agent
andauthored
Add changelog-draft Oz skill with Python scripts and GHA workflow (#10280)
## Description Adds an Oz agent skill that generates reviewable changelog drafts from PRs merged in a release range. Replaces the previous TypeScript orchestrator approach with a skill-first architecture following the pattern established in `resolve-merge-conflicts` and Buzz repo skills. **What it does:** - Extracts explicit `CHANGELOG-*` markers from PR bodies - Classifies unmarked PRs inline using LLM judgment (with reference guidance) - Identifies external contributors via GitHub org membership checks - Cross-references feature flags to determine channel visibility - Produces a human-reviewable markdown draft + machine-readable JSON audit artifact - Does **not** mutate `channel_versions.json` or publish release notes **Files added:** - `.agents/skills/changelog-draft/SKILL.md` — main skill (7-step workflow) - `.agents/skills/changelog-draft/scripts/fetch_prs.py` — PR collection + marker extraction - `.agents/skills/changelog-draft/scripts/classify_contributors.py` — org membership classification - `.agents/skills/changelog-draft/scripts/extract_feature_flags.py` — flag gate parser - `.agents/skills/classify-changelog-pr/SKILL.md` — inline classification guidance - `.github/workflows/changelog_draft.yml` — `workflow_dispatch` workflow using `oz-agent-action` All Python scripts are stdlib-only (no pip deps), use `gh` CLI for GitHub API access, and output JSON to stdout. [Oz conversation](https://staging.warp.dev/conversation/fd2e6334-7e90-4e7e-a611-fa85cbb0217e) | [Plan](https://staging.warp.dev/drive/notebook/zi46hDiAGqdmbzNEx4atm0) ## Testing - All three Python scripts compile without errors (`py_compile`) - `extract_feature_flags.py` validated against live `crates/warp_features/src/lib.rs` — correctly extracts all RELEASE/PREVIEW/DOGFOOD flags - Full end-to-end validation planned as a manual `workflow_dispatch` run against a recent stable release after merge ## Agent Mode - [x] Warp Agent Mode - This PR was created via Warp's AI Agent Mode Co-Authored-By: Oz <oz-agent@warp.dev> --------- Co-authored-by: Oz <oz-agent@warp.dev>
1 parent cde06f9 commit 3c22e42

9 files changed

Lines changed: 982 additions & 0 deletions

File tree

Lines changed: 254 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,254 @@
1+
---
2+
name: changelog-draft
3+
description: Generate a reviewable changelog draft from PRs merged in a release range. Extracts explicit CHANGELOG markers, classifies unmarked PRs, adds external contributor attribution, and outputs markdown + JSON artifacts. Does NOT mutate channel_versions.json.
4+
---
5+
6+
# Changelog Draft Generator
7+
8+
## Inputs
9+
10+
| Parameter | Required | Description |
11+
|-----------|----------|-------------|
12+
| `channel` | yes | Release channel: `stable`, `preview`, or `dev` |
13+
| `release_tag` | yes | The release tag to generate the changelog for (e.g. `v0.2026.05.06.09.12.stable_00`) |
14+
| `output_dir` | no | Directory to write output files. Defaults to `$RUNNER_TEMP` or `/tmp/changelog-draft` |
15+
| `attribution` | no | Attribution mode: `external-only` (default), `all`, or `none` |
16+
17+
## Workflow
18+
19+
### Step 1 — Determine the release range
20+
21+
Infer the previous release **cut** for comparison. Release tags follow the pattern `v0.YYYY.MM.DD.HH.MM.<channel>_NN`, where `_NN` is the RC/hotfix number within that release cut. Multiple tags can share the same date prefix (e.g. `_00`, `_01`, `_02` are all part of one release cut).
22+
23+
The base tag must be the `_00` tag of the **previous** release cut (i.e. a different date), not just the previous tag. For example, if generating a changelog for `v0.2026.04.29.08.57.stable_01`, the base should be `v0.2026.04.22.08.57.stable_00`, not `v0.2026.04.29.08.57.stable_00`.
24+
25+
```bash
26+
# 1. Extract the date prefix from the release_tag (everything before _NN)
27+
release_date_prefix="${release_tag%_*}"
28+
29+
# 2. List all _00 tags for the channel (these are release cut points), sorted descending
30+
git tag --list "v0.*.${channel}_00" --sort=-version:refname
31+
32+
# 3. Pick the first _00 tag whose date prefix differs from release_date_prefix
33+
```
34+
35+
Record the range as `previous_cut_tag..release_tag`.
36+
37+
### Step 2 — Fetch PR data
38+
39+
Run the `fetch_prs.py` script to collect all PRs merged in the release range and extract explicit changelog markers:
40+
41+
```bash
42+
python3 .agents/skills/changelog-draft/scripts/fetch_prs.py \
43+
--repo warpdotdev/warp \
44+
--base-ref <previous_tag> \
45+
--head-ref <release_tag>
46+
```
47+
48+
The script outputs JSON to stdout with this structure:
49+
```json
50+
{
51+
"range": { "base": "<previous_tag>", "head": "<release_tag>" },
52+
"prs": [
53+
{
54+
"number": 1234,
55+
"title": "...",
56+
"author": "username",
57+
"body": "...",
58+
"labels": ["..."],
59+
"merged_at": "2026-05-01T...",
60+
"explicit_entries": [
61+
{ "category": "NEW-FEATURE", "text": "Added dark mode" }
62+
],
63+
"linked_issues": [5678],
64+
"changed_files": ["app/src/ai/agent.rs", "crates/warp_features/src/lib.rs"]
65+
}
66+
]
67+
}
68+
```
69+
70+
### Step 3 — Classify contributors
71+
72+
Run the `classify_contributors.py` script with the unique author logins from Step 2:
73+
74+
```bash
75+
python3 .agents/skills/changelog-draft/scripts/classify_contributors.py \
76+
--org warpdotdev \
77+
--authors author1,author2,author3
78+
```
79+
80+
Output JSON:
81+
```json
82+
{
83+
"internal": ["author1"],
84+
"external": ["author3"],
85+
"bot": ["author2"],
86+
"unknown": []
87+
}
88+
```
89+
90+
### Step 4 — Extract feature flags
91+
92+
Run the `extract_feature_flags.py` script to get the current flag gate lists:
93+
94+
```bash
95+
python3 .agents/skills/changelog-draft/scripts/extract_feature_flags.py \
96+
--file crates/warp_features/src/lib.rs
97+
```
98+
99+
Output JSON:
100+
```json
101+
{
102+
"release_flags": ["Autoupdate", "Changelog", ...],
103+
"preview_flags": ["Orchestration", ...],
104+
"dogfood_flags": ["LogExpensiveFramesInSentry", ...]
105+
}
106+
```
107+
108+
### Step 5 — Fetch issue reporters
109+
110+
Collect all unique `linked_issues` from Step 2 and fetch the original reporter for each. Pass `--org` so the script checks org membership and filters out internal reporters automatically:
111+
112+
```bash
113+
python3 .agents/skills/changelog-draft/scripts/fetch_issue_reporters.py \
114+
--repo warpdotdev/warp \
115+
--org warpdotdev \
116+
--issues 5678,9012
117+
```
118+
119+
Output JSON (only external reporters are included):
120+
```json
121+
{
122+
"issue_reporters": [
123+
{
124+
"issue_number": 5678,
125+
"title": "Crash when opening large file",
126+
"reporter": "community-user",
127+
"url": "https://github.com/warpdotdev/warp/issues/5678"
128+
}
129+
]
130+
}
131+
```
132+
133+
The `--org` flag checks each reporter's org membership via the GitHub API, filtering out internal members so they aren't misattributed as external community reporters. These reporters will be credited in the "Community" section of the changelog.
134+
135+
### Step 6 — Classify unmarked PRs
136+
137+
For each PR that has no explicit `CHANGELOG-*` entries, decide whether to include it and under which category.
138+
139+
Follow the classification guidance in `.agents/skills/classify-changelog-pr/SKILL.md`.
140+
141+
For each unmarked PR, produce a classification:
142+
```json
143+
{
144+
"pr_number": 1234,
145+
"include": true,
146+
"category": "IMPROVEMENT",
147+
"text": "Proposed changelog line",
148+
"confidence": "high",
149+
"rationale": "...",
150+
"feature_flag": null,
151+
"needs_review": false
152+
}
153+
```
154+
155+
**Key rules:**
156+
- PRs that only touch CI, tests, docs, or internal tooling → `include: false`
157+
- PRs behind dogfood-only feature flags → `include: false` for stable channel
158+
- PRs behind preview flags → `include: false` for stable, `include: true` for preview
159+
- When in doubt, set `needs_review: true` and `confidence: "low"`
160+
- Bot PRs (dependabot, renovate, etc.) → `include: false`
161+
162+
**Feature-flag detection:** Use the `changed_files` list from Step 2 to check if any PR touches `crates/warp_features/src/lib.rs` or references a `FeatureFlag` variant in its title/body. Cross-reference with the flag lists from Step 4 to determine channel visibility.
163+
164+
**Unknown contributors:** Authors in the `unknown` bucket (org membership check failed due to auth) should be treated conservatively — do not attribute them as external. Note them in the output for manual verification.
165+
166+
### Step 7 — Assemble the draft
167+
168+
Combine explicit entries (Step 2) and inferred entries (Step 6) into the final report. Group by category in this order:
169+
170+
1. `NEW-FEATURE` — New Features
171+
2. `IMPROVEMENT` — Improvements
172+
3. `BUG-FIX` — Bug Fixes
173+
4. `OZ` — Oz Updates
174+
175+
PRs marked with `CHANGELOG-NONE` are explicitly opted out and must never appear in the changelog markdown.
176+
177+
### Step 8 — Write output files
178+
179+
Write two files to `output_dir`:
180+
181+
**`changelog-draft.md`** — Human-reviewable markdown, ready for Slack/Notion:
182+
183+
```markdown
184+
# Changelog Draft
185+
**Channel:** stable
186+
**Range:** v0.2026.05.01... → v0.2026.05.06...
187+
**Generated:** 2026-05-06T15:00:00Z
188+
189+
## New Features
190+
- Added dark mode ([#1234](https://github.com/warpdotdev/warp/pull/1234)) — @external-contributor
191+
192+
## Improvements
193+
- Faster tab switching ([#1235](https://github.com/warpdotdev/warp/pull/1235))
194+
195+
## Bug Fixes
196+
- Fixed crash on startup ([#1236](https://github.com/warpdotdev/warp/pull/1236))
197+
198+
## Oz Updates
199+
- Improved agent memory ([#1237](https://github.com/warpdotdev/warp/pull/1237))
200+
201+
## Community
202+
### Contributors
203+
- @contributor1[#1234](https://github.com/warpdotdev/warp/pull/1234)
204+
205+
### Issue Reporters
206+
Thanks to the community members who reported issues fixed in this release:
207+
- @reporter1[#5678](https://github.com/warpdotdev/warp/issues/5678) "Crash when opening large file"
208+
```
209+
210+
The markdown draft must **not** include "Needs Review" or "Skipped PRs" sections — those are internal details that belong only in the JSON audit artifact.
211+
212+
**`changelog-draft.json`** — Machine-readable audit artifact (internal only):
213+
214+
```json
215+
{
216+
"channel": "stable",
217+
"range": { "base": "v0...", "head": "v0..." },
218+
"generated_at": "2026-05-06T15:00:00Z",
219+
"entries": [
220+
{
221+
"pr_number": 1234,
222+
"category": "NEW-FEATURE",
223+
"text": "Added dark mode",
224+
"source": "explicit",
225+
"author": "external-contributor",
226+
"is_external": true,
227+
"confidence": "high",
228+
"rationale": null,
229+
"feature_flag": null
230+
}
231+
],
232+
"skipped": [...],
233+
"needs_review": [...],
234+
"issue_reporters": [...]
235+
}
236+
```
237+
238+
The JSON artifact retains `skipped`, `needs_review`, and `issue_reporters` for audit purposes — every PR in the range must appear in either `entries`, `skipped`, or `needs_review`.
239+
240+
## Constraints
241+
242+
- **Never** write to `channel_versions.json` or any production config file.
243+
- **Never** push commits, create branches, or open PRs.
244+
- All output goes to `output_dir` only.
245+
- The markdown draft should be copy-pasteable into Slack or Notion for review.
246+
- Keep the JSON artifact complete enough for audit: every PR in the range should appear in either `entries`, `skipped`, or `needs_review`.
247+
248+
## Validation
249+
250+
After generating output, verify:
251+
1. Every PR in the range is accounted for (entries + skipped + needs_review = total PRs).
252+
2. Explicit marker entries match what `fetch_prs.py` extracted (no dropped markers).
253+
3. No duplicate PR numbers across sections.
254+
4. The markdown renders cleanly (no broken links or formatting).
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# Changelog Draft
2+
**Channel:** stable
3+
**Range:** v0.2026.04.29.08.56.stable_00 → v0.2026.05.06.09.12.stable_00
4+
**Generated:** 2026-05-06T19:00:00Z
5+
**Total PRs in range:** 211 | **Explicit markers:** 57 | **Unmarked:** 154
6+
7+
---
8+
9+
## New Features
10+
- You can now drag tabs out of a window into their own window, or between windows, similar to Chrome. ([#9275](https://github.com/warpdotdev/warp/pull/9275))
11+
- Added a `/set-tab-color` slash command for setting or clearing the current tab's color from the input bar. ([#9305](https://github.com/warpdotdev/warp/pull/9305))
12+
13+
## Improvements
14+
- Added tab context menu actions to copy visible tab and pane metadata when available. ([#10120](https://github.com/warpdotdev/warp/pull/10120))
15+
- The conversation details panel can now be opened and closed with a configurable keyboard shortcut. ([#9837](https://github.com/warpdotdev/warp/pull/9837))
16+
- Conversation details side panel is now available for local Warp Agent conversations, not just cloud Oz runs. Click the info button in the pane header to open it for any active AI conversation. ([#9493](https://github.com/warpdotdev/warp/pull/9493))
17+
- Reduced memory usage and CPU work in the agent runs management view while a conversation is streaming. ([#9866](https://github.com/warpdotdev/warp/pull/9866))
18+
- Added support for drag-and-drop of image files into an active CLI agent session (e.g. Claude Code). ([#9553](https://github.com/warpdotdev/warp/pull/9553))
19+
- Warp now renders inline local images and Mermaid diagrams in agent block output. ([#9993](https://github.com/warpdotdev/warp/pull/9993))
20+
- Warp now silently falls back to a regular SSH session on remote hosts where the prebuilt remote-server binary is incompatible (e.g. glibc < 2.31), instead of attempting an install that would fail at runtime. ([#9681](https://github.com/warpdotdev/warp/pull/9681))
21+
- HTML files using the .htm extension now open with HTML syntax highlighting in Warp's editor. ([#9360](https://github.com/warpdotdev/warp/pull/9360))
22+
- Recognize Block's `goose` CLI agent — running `goose` now activates the CLI-agent toolbar, status, brand color, and icon like other recognized third-party agents. ([#9497](https://github.com/warpdotdev/warp/pull/9497))
23+
- Added a `/continue-locally` slash command to continue cloud conversations locally. ([#9500](https://github.com/warpdotdev/warp/pull/9500))
24+
- Added a "Show in Finder" (macOS) / "Show containing folder" (Linux/Windows) option to the tooltip that appears when clicking a detected file link. ([#9475](https://github.com/warpdotdev/warp/pull/9475))
25+
- Tighten orchestration event subscription scope so SSE runs only for active parent and child agent runs. ([#9273](https://github.com/warpdotdev/warp/pull/9273))
26+
- Fix macOS IME candidate popup positioning in code editor panes so it anchors to the editor caret instead of stale terminal/input positions. ([#9555](https://github.com/warpdotdev/warp/pull/9555))
27+
28+
## Bug Fixes
29+
- Fixed /feedback recording "Unknown" instead of the installed Warp version on packaged builds. ([#10219](https://github.com/warpdotdev/warp/pull/10219))
30+
- Fixed find (cmd+f) selection jumping to a different match when new output streams into the active block. ([#10057](https://github.com/warpdotdev/warp/pull/10057))
31+
- Fix Japanese IME losing the last character of a phrase that ends right before a punctuation mark on macOS. ([#9730](https://github.com/warpdotdev/warp/pull/9730))
32+
- Fixed local file tree blinking/reshuffling when connected to an SSH session ([#10184](https://github.com/warpdotdev/warp/pull/10184))
33+
- Fixed terminal text selection not auto-scrolling when dragging beyond bounds ([#9448](https://github.com/warpdotdev/warp/pull/9448))
34+
- Fixed Ctrl-G not closing CLI agent rich input on linux when editor is focused ([#10030](https://github.com/warpdotdev/warp/pull/10030))
35+
- Pressing backspace in the agent view when the buffer is empty no longer resets the conversation. ([#10114](https://github.com/warpdotdev/warp/pull/10114))
36+
- Fixed unnecessary reconnect attempts for remote SSH sessions after system sleep, reducing error noise ([#10096](https://github.com/warpdotdev/warp/pull/10096))
37+
- Fixes issue with repeated TUI redraws for CLI agents on terminal pane resize. ([#9877](https://github.com/warpdotdev/warp/pull/9877))
38+
- Fix new-session "+" dropdown alignment when the Tabs Panel is placed on the right side of the header toolbar. ([#9492](https://github.com/warpdotdev/warp/pull/9492))
39+
- Copy keybinding now prioritizes selected text in the input over a selected block when both are active. ([#9491](https://github.com/warpdotdev/warp/pull/9491))
40+
- [Windows] Fix hotkey window. ([#9891](https://github.com/warpdotdev/warp/pull/9891))
41+
- [Windows] Symlink traversal fixed. ([#9863](https://github.com/warpdotdev/warp/pull/9863))
42+
- Fixed a crash on Windows when handing off a Web conversation to the native client. ([#9987](https://github.com/warpdotdev/warp/pull/9987))
43+
- Fixed a bug where multiple 'open skill' buttons shared hover state. ([#9437](https://github.com/warpdotdev/warp/pull/9437))
44+
- Fixed the OSS Linux desktop entry so WarpOss launches through the packaged `warp-terminal-oss` command. ([#9424](https://github.com/warpdotdev/warp/pull/9424))
45+
- Fixed Ctrl/Cmd shortcuts (e.g. copy, paste) failing on Windows when a non-Latin keyboard layout was active. ([#9476](https://github.com/warpdotdev/warp/pull/9476))
46+
- Fixed background colour bleeding in alt screen programs (e.g. delta, diff-so-fancy). ([#9852](https://github.com/warpdotdev/warp/pull/9852))
47+
- Clip the warping indicator's action chips onto a new line on narrow panes instead of overflowing. ([#9297](https://github.com/warpdotdev/warp/pull/9297))
48+
- Inline `.bmp`, `.tiff` / `.tif`, and `.ico` images in agent block output now render correctly. ([#9397](https://github.com/warpdotdev/warp/pull/9397))
49+
- If user attaches an image in block input we should lock in agent mode, without running the NLD classifier. ([#9366](https://github.com/warpdotdev/warp/pull/9366))
50+
- Remote-server installs no longer fail when the staging-directory cleanup hits a race. ([#9681](https://github.com/warpdotdev/warp/pull/9681))
51+
- `.command` shell scripts now open with shell syntax highlighting in Warp's editor. ([#9345](https://github.com/warpdotdev/warp/pull/9345))
52+
- Fix git diff chip flickering between tracked-only and all-files count when untracked files are present ([#9244](https://github.com/warpdotdev/warp/pull/9244))
53+
- `Open File → Default App` now opens files in the running Warp channel instead of routing to a different installed Warp. ([#9285](https://github.com/warpdotdev/warp/pull/9285))
54+
- Fixed vertical tabs settings popup items being unclickable ([#9540](https://github.com/warpdotdev/warp/pull/9540))
55+
- Fixed a macOS memory leak that occurred when Warp enumerated system fonts or built a font fallback chain. ([#9665](https://github.com/warpdotdev/warp/pull/9665))
56+
- Executable shell scripts opened from a `file://` URL now run in the terminal instead of opening in the editor. ([#9503](https://github.com/warpdotdev/warp/pull/9503))
57+
- Fixed Option+Enter, Option+Tab, and Option+Escape sending literal key names instead of correct escape sequences ([#9514](https://github.com/warpdotdev/warp/pull/9514))
58+
- Fixed read_files tool showing an empty box when the LLM requests line ranges beyond the end of a file. ([#9326](https://github.com/warpdotdev/warp/pull/9326))
59+
- Prevent Warp from consuming too much memory when identifying filepaths in long block outputs. ([#9617](https://github.com/warpdotdev/warp/pull/9617))
60+
- Don't trigger the agent onboarding tutorial when Warp is running in headless SDK/CLI mode. ([#9590](https://github.com/warpdotdev/warp/pull/9590))
61+
- Added `--version` flag support in the Oz CLI ([#9252](https://github.com/warpdotdev/warp/pull/9252))
62+
- Fixed file tree flickering when transitioning to an SSH remote session ([#9320](https://github.com/warpdotdev/warp/pull/9320))
63+
- Fixed scroll-to-start/end of selected block keybinding not working when the input is focused. ([#9332](https://github.com/warpdotdev/warp/pull/9332))
64+
- Fix the terminal pane background appearing darker in horizontal tabs mode with background image or custom opacity. ([#9474](https://github.com/warpdotdev/warp/pull/9474))
65+
- AI code blocks tagged `vue`, `xml`, `dockerfile`, `jsx`, `tsx`, etc. now render with syntax highlighting. ([#9471](https://github.com/warpdotdev/warp/pull/9471))
66+
- Reopen Closed Session is now reachable from the new-session menu on Linux and Windows. ([#9347](https://github.com/warpdotdev/warp/pull/9347))
67+
- Fixed missing syntax highlighting for C++ header files using `.hpp`, `.hxx`, or `.H` extensions. ([#9388](https://github.com/warpdotdev/warp/pull/9388))
68+
- Fixed `/open-file` handling for relative WSL paths so Unix separators are preserved. ([#9322](https://github.com/warpdotdev/warp/pull/9322))
69+
70+
## Oz Updates
71+
- Add Codex as a supported harness for local child agents. ([#10176](https://github.com/warpdotdev/warp/pull/10176))
72+
- Configurable max context window per profile. ([#9352](https://github.com/warpdotdev/warp/pull/9352))
73+
74+
---
75+
76+
## Community
77+
### Contributors
78+
- @Abdalla-Eldoumani
79+
- @Akeuuh[#9655](https://github.com/warpdotdev/warp/pull/9655)
80+
- @AntonVishal
81+
- @BennyWaitWhat
82+
- @Faizanq
83+
- @JamieMcMillan
84+
- @R3flector
85+
- @amriksingh0786
86+
- @princepal9120
87+
- @webdevtodayjason
88+
- @zerone0x
89+
90+
### Issue Reporters
91+
Thanks to the community members who reported issues fixed in this release:
92+
- @user123[#5678](https://github.com/warpdotdev/warp/issues/5678) "Crash when opening large file"
93+
94+
---
95+
96+
*This draft was generated by the `changelog-draft` Oz skill. Needs Review and Skipped PRs are available in the JSON audit artifact.*

0 commit comments

Comments
 (0)