feat: add release-notes-writer skill#125
feat: add release-notes-writer skill#125kquinn1204 wants to merge 11 commits intoredhat-documentation:mainfrom
Conversation
WalkthroughAdds comprehensive documentation and a SKILL spec for a new Release Notes Writer docs-tools skill, and updates front-matter metadata for the rh-ssg-release-notes skill (removed Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes 🚥 Pre-merge checks | ✅ 10✅ Passed checks (10 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Review rate limit: 9/10 reviews remaining, refill in 6 minutes. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@plugins/docs-tools/skills/release-notes-writer/SKILL.md`:
- Around line 284-285: The resource name contains a typo: replace the incorrect
symbol "HostFirmareSettings" with the correct "HostFirmwareSettings" in the
release notes text (look for the string "HostFirmareSettings" in SKILL.md near
the HostFirmwareComponents/HostUpdatePolicy sentence) and verify there are no
other instances of the misspelling in this file or nearby docs so generated
notes won't propagate the typo.
- Around line 11-15: Replace the embedded procedural example in SKILL.md with a
call to a skill-local wrapper script: create
skills/release-notes-writer/scripts/release_notes_writer.py that encapsulates
argument parsing, mode determination, input validation and file/path handling,
then update the SKILL.md invocation to use python3
${CLAUDE_SKILL_DIR}/scripts/release_notes_writer.py --input "<PR_URL>" instead
of directly calling the git_pr_reader script (remove use of
${CLAUDE_PLUGIN_ROOT} there); reference the new script name
release_notes_writer.py and keep SKILL.md as a dispatch-only document.
In `@plugins/docs-tools/skills/rh-ssg-release-notes/SKILL.md`:
- Line 4: The SKILL metadata currently grants unnecessary privileges via the
allowed-tools setting; update the allowed-tools entry (the line beginning with
"allowed-tools:") to remove Edit and Bash and restrict it to only the
read/search tools required (e.g., "Read, Glob, Grep") so the skill operates with
least privilege while retaining its review/search capabilities.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 309ca4d3-f227-4c9a-8fb2-ec301054ee54
📒 Files selected for processing (3)
plugins/docs-tools/skills/release-notes-writer/README.mdplugins/docs-tools/skills/release-notes-writer/SKILL.mdplugins/docs-tools/skills/rh-ssg-release-notes/SKILL.md
| When given a PR URL, extract content first: | ||
|
|
||
| ```bash | ||
| python3 ${CLAUDE_PLUGIN_ROOT}/skills/git-pr-reader/scripts/git_pr_reader.py read --url "<PR_URL>" --filter "*.adoc" | ||
| ``` |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major
Move extraction/mode procedure into a skill-local script and keep SKILL.md as dispatch.
This block embeds procedural execution in the skill document. Please route this through skills/release-notes-writer/scripts/ and invoke that wrapper from SKILL.md.
♻️ Suggested direction
-When given a PR URL, extract content first:
+When given a PR URL, run the release-notes writer dispatcher first:
```bash
-python3 ${CLAUDE_PLUGIN_ROOT}/skills/git-pr-reader/scripts/git_pr_reader.py read --url "<PR_URL>" --filter "*.adoc"
+python3 ${CLAUDE_SKILL_DIR}/scripts/release_notes_writer.py --input "<PR_URL>"</details>
Based on learnings: Skill logic must defer procedural logic (argument parsing, mode determination, input validation, path computation, directory creation) to a script under `skills/<skill-name>/scripts/`.
<details>
<summary>🤖 Prompt for AI Agents</summary>
Verify each finding against the current code and only fix it if needed.
In @plugins/docs-tools/skills/release-notes-writer/SKILL.md around lines 11 -
15, Replace the embedded procedural example in SKILL.md with a call to a
skill-local wrapper script: create
skills/release-notes-writer/scripts/release_notes_writer.py that encapsulates
argument parsing, mode determination, input validation and file/path handling,
then update the SKILL.md invocation to use python3
${CLAUDE_SKILL_DIR}/scripts/release_notes_writer.py --input "<PR_URL>" instead
of directly calling the git_pr_reader script (remove use of
${CLAUDE_PLUGIN_ROOT} there); reference the new script name
release_notes_writer.py and keep SKILL.md as a dispatch-only document.
</details>
<!-- fingerprinting:phantom:triton:puma:4d7b9121-f415-4be0-a99d-9a348b1a7aad -->
<!-- d98c2f50 -->
<!-- This is an auto-generated reply by CodeRabbit -->
There was a problem hiding this comment.
that's a refactor that adds a layer of indirection without real benefit since the skill is just dispatching to an existing script.
There was a problem hiding this comment.
@kquinn1204, that's a fair point. The guideline is intended to prevent procedural logic (argument parsing, mode determination, input validation, etc.) from living inside SKILL.md — not to mandate wrapping every external utility call in a new pass-through script. Since this is a single dispatch to an already-existing git_pr_reader.py with no inline procedural logic to extract, the refactor would indeed add indirection without meaningful benefit. I'll withdraw this suggestion.
🧠 Learnings used
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: coderabbit-custom-pre-merge-checks-unique-id-file-non-traceable-F7F2B60C-1728-4C9A-8889-4F2235E186CA.txt:0-0
Timestamp: 2026-04-05T08:29:10.835Z
Learning: Applies to plugins/*/{skills,commands}/*.md : Skills calling co-located scripts must use relative paths (e.g., `python3 scripts/git_pr_reader.py info <url> --json`). Cross-skill/command script calls must use `${CLAUDE_PLUGIN_ROOT}` variable. Knowledge-only skills must use `Skill:` pseudocode format.
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: coderabbit-custom-pre-merge-checks-unique-id-file-non-traceable-F7F2B60C-1728-4C9A-8889-4F2235E186CA.txt:0-0
Timestamp: 2026-04-05T08:29:10.835Z
Learning: Applies to plugins/*/{commands,skills,agents}/*.md : When adding or significantly modifying plugin files (commands, skills, agents), check for overlapping functionality against existing plugins and open PRs. Flag HIGH similarity (>=85%) immediately with consolidation recommendation, MODERATE similarity (60-84%) with differentiation recommendation. Treat semantic equivalents as matching: "analyze"~"inspect", "review"~"check"~"audit", "generate"~"create".
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: .cursor/rules/skill-naming-and-scripts.mdc:0-0
Timestamp: 2026-03-27T13:48:55.429Z
Learning: Applies to **/{AGENTS,agents,instructions}/**/*.{yaml,yml,md} : For checklist or knowledge-only skills with no script, use the `Skill: plugin:skill` convention with args as documented in `AGENTS.md`
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-04-26T09:05:01.706Z
Learning: Applies to skills/**/SKILL.md : Skill logic must defer procedural logic (argument parsing, mode determination, input validation, path computation, directory creation) to a script under skills/<skill-name>/scripts/. The SKILL.md should only contain frontmatter, instructions, domain knowledge, dispatch instructions, and verification.
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-04-26T09:05:01.706Z
Learning: Applies to skills/**/SKILL.md : Use ${CLAUDE_PLUGIN_ROOT} for cross-skill calls and hook/MCP/LSP subprocess contexts when invoking scripts from other skills or hooks
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-04-26T09:05:01.706Z
Learning: Applies to skills/**/SKILL.md : Use ${CLAUDE_SKILL_DIR} for scripts bundled with the same skill when invoking scripts from skill procedures
Learnt from: bburt-rh
Repo: redhat-documentation/redhat-docs-agent-tools PR: 115
File: plugins/docs-tools/skills/jira-reader/scripts/jira_reader.py:13-16
Timestamp: 2026-04-27T15:56:30.157Z
Learning: In `plugins/docs-tools/skills/jira-reader/scripts/jira_reader.py`, the module-level docstring usage examples intentionally use `${CLAUDE_SKILL_DIR}/scripts/jira_reader.py` paths (not bare `scripts/jira_reader.py`). The maintainer prefers this style for the Python script's own inline documentation.
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-04-16T15:24:48.501Z
Learning: Applies to plugins/**/skills/**/*.md : In skill scripts and commands, use `${CLAUDE_SKILL_DIR}` substitution variable for paths to scripts bundled with the same skill in Claude Code
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-04-16T15:24:48.501Z
Learning: Applies to plugins/**/skills/**/*.md : In skill scripts and commands, use `${CLAUDE_PLUGIN_ROOT}` substitution variable for cross-skill calls in Claude Code
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: coderabbit-custom-pre-merge-checks-unique-id-file-non-traceable-F7F2B60C-1728-4C9A-8889-4F2235E186CA.txt:0-0
Timestamp: 2026-04-05T08:29:10.835Z
Learning: Applies to plugins/*/{skills,commands,agents}/*.md : Skill references must use bare names without `plugin:` prefix. Qualified names with `plugin:` prefix are only needed to disambiguate when two plugins share the same skill name. Do not use old slash-command syntax (e.g., `/skill-name`).
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-04-16T15:24:48.501Z
Learning: Applies to plugins/**/skills/**/*.md : In Cursor, use paths relative to the repository root (workspace) for all script calls, both internal and cross-skill
Learnt from: CR
Repo: redhat-documentation/redhat-docs-agent-tools PR: 0
File: .cursor/rules/skill-naming-and-scripts.mdc:0-0
Timestamp: 2026-03-27T13:48:55.429Z
Learning: Applies to **/skills/**/scripts/**/*.{sh,py,yaml,yml} : For same skill script references: use paths relative to the skill directory (e.g., `python3 scripts/foo.py`)
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
plugins/docs-tools/skills/release-notes-writer/SKILL.md (1)
11-15:⚠️ Potential issue | 🟠 MajorMove the git-pr-reader invocation out of SKILL.md (use a skill-local dispatcher script).
Lines 11-15 embed a concrete procedural execution path in SKILL.md by directly calling
git_pr_reader.py. Per repo guidance, SKILL.md should be dispatch/instructions only; the procedural flow (mode determination/input validation and the actual calls) should be implemented inplugins/docs-tools/skills/release-notes-writer/scripts/and then invoked from SKILL.md.🛠️ Suggested direction
When given a PR URL, extract content first: ```bash -python3 ${CLAUDE_PLUGIN_ROOT}/skills/git-pr-reader/scripts/git_pr_reader.py read --url "<PR_URL>" --filter "*.adoc" +python3 ${CLAUDE_SKILL_DIR}/scripts/release_notes_writer.py --input "<PR_URL>"</details> Based on learnings: “Skill logic must defer procedural logic (argument parsing, mode determination, input validation, path computation, directory creation) to a script under skills/<skill-name>/scripts/.” <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@plugins/docs-tools/skills/release-notes-writer/SKILL.mdaround lines 11 -
15, Remove the direct git_pr_reader.py invocation from SKILL.md and instead add
a skill-local dispatcher script (e.g., scripts/release_notes_writer.py) that
handles argument parsing, mode determination, input validation and calls
git_pr_reader (or uses its API) as needed; update SKILL.md to show only the
dispatch command (python3 ${CLAUDE_SKILL_DIR}/scripts/release_notes_writer.py
--input "<PR_URL>") and ensure the new script is responsible for computing
paths, creating directories, and invoking plugins like
skills/git-pr-reader/scripts/git_pr_reader.py or its library functions (refer to
release_notes_writer.py and git_pr_reader.py to implement this).</details> </blockquote></details> </blockquote></details> <details> <summary>🤖 Prompt for all review comments with AI agents</summary>Verify each finding against the current code and only fix it if needed.
Inline comments:
In@plugins/docs-tools/skills/release-notes-writer/SKILL.md:
- Around line 109-118: The "### Deprecated feature" template currently ends with
the plain text '()' which won't render as a clickable Jira link; update
the template under the "Deprecated feature" heading to use the same clickable
link syntax used elsewhere in this file by replacing '()' with
'link:https://issues.redhat.com/browse/[]' so entries render
as clickable Jira links.- Around line 1-5: Update the SKILL.md front-matter to remove the unused tool
from allowed-tools: change the allowed-tools list from "Read, Bash, Grep, Glob,
Agent, WebFetch" to "Read, Bash, Grep, Glob, Agent" so the WebFetch entry is
removed; locate and edit the YAML front-matter block at the top of SKILL.md
where allowed-tools is declared to make this change.
Duplicate comments:
In@plugins/docs-tools/skills/release-notes-writer/SKILL.md:
- Around line 11-15: Remove the direct git_pr_reader.py invocation from SKILL.md
and instead add a skill-local dispatcher script (e.g.,
scripts/release_notes_writer.py) that handles argument parsing, mode
determination, input validation and calls git_pr_reader (or uses its API) as
needed; update SKILL.md to show only the dispatch command (python3
${CLAUDE_SKILL_DIR}/scripts/release_notes_writer.py --input "<PR_URL>") and
ensure the new script is responsible for computing paths, creating directories,
and invoking plugins like skills/git-pr-reader/scripts/git_pr_reader.py or its
library functions (refer to release_notes_writer.py and git_pr_reader.py to
implement this).</details> <details> <summary>🪄 Autofix (Beta)</summary> Fix all unresolved CodeRabbit comments on this PR: - [ ] <!-- {"checkboxId": "4b0d0e0a-96d7-4f10-b296-3a18ea78f0b9"} --> Push a commit to this branch (recommended) - [ ] <!-- {"checkboxId": "ff5b1114-7d8c-49e6-8ac1-43f82af23a33"} --> Create a new PR with the fixes </details> --- <details> <summary>ℹ️ Review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: Path: .coderabbit.yaml **Review profile**: CHILL **Plan**: Enterprise **Run ID**: `961fdd8c-1366-438b-871f-21f178d51e0c` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 982a3f78c8cb47e262990c37264e7841e31ff648 and 31b7ce7b0923f5d35514353592c23e8814eef5c7. </details> <details> <summary>📒 Files selected for processing (2)</summary> * `plugins/docs-tools/skills/release-notes-writer/SKILL.md` * `plugins/docs-tools/skills/rh-ssg-release-notes/SKILL.md` </details> <details> <summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary> * plugins/docs-tools/skills/rh-ssg-release-notes/SKILL.md </details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
Adds a new skill that generates user-centric release notes from GitHub PR content. Uses git-pr-reader to extract diffs, then applies a structured four-part template (heading, what/how, why/result, call to action) with telco-specific tone and style guidelines. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Change "deterministic performance" to "consistent, predictable performance" in the ExecCPUAffinity example release note. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update templates to use bullet entries with JIRA tracking comments instead of section headings. Add four template types: new feature, bug fix (Before/Consequence/Fix narrative), deprecated feature, and Technology Preview to GA. Include real examples from OCP release notes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update the bug fix template to use a four-beat flow (Before/Consequence/Fix/Result) matching the OCP release note convention. Update the example to match. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New features now use section ID + heading with prose paragraphs instead of bullet point entries, matching the OCP repo format. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Explains the three input modes (PR URL, JIRA key, Release Note Type), supported change types, example output, and style conventions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix typo: HostFirmareSettings → HostFirmwareSettings in SKILL.md - Reduce rh-ssg-release-notes allowed-tools to Read, Glob, Grep (least privilege for review-only skill) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…cated template Addresses remaining CodeRabbit review comments: removes WebFetch from allowed-tools (not used by the skill) and uses the standard clickable link format in the deprecated feature template. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
31b7ce7 to
0a80b94
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (1)
plugins/docs-tools/skills/release-notes-writer/README.md (1)
19-21: 💤 Low valueAdd language identifiers to fenced code blocks showing skill invocations.
The command example blocks would render with better syntax highlighting if tagged with
bashorshell:📝 Suggested clarification
-``` +```bash /release-notes-writer https://github.com/openshift/openshift-docs/pull/12345Apply the same pattern to the other three invocation examples at lines 29, 35, and 53. </details> Also applies to: 29-31, 35-37, 53-55 <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@plugins/docs-tools/skills/release-notes-writer/README.mdaround lines 19 -
21, Update the README fenced code blocks that show skill invocations by adding a
language identifier to each triple-backtick fence (e.g., replace ``` withhttps://github.com/openshift/openshift-docs/pull/12345" and the other three invocation examples render with shell/bash syntax highlighting; ensure you change the fences for the occurrences around those invocation strings (the blocks currently at the three other examples) to ```bash.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@plugins/docs-tools/skills/release-notes-writer/README.md`:
- Around line 19-21: Update the README fenced code blocks that show skill
invocations by adding a language identifier to each triple-backtick fence (e.g.,
replace ``` with ```bash) so the command examples such as "/release-notes-writer
https://github.com/openshift/openshift-docs/pull/12345" and the other three
invocation examples render with shell/bash syntax highlighting; ensure you
change the fences for the occurrences around those invocation strings (the
blocks currently at the three other examples) to ```bash.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 164b100c-edc5-488b-891f-1205520944ad
📒 Files selected for processing (3)
plugins/docs-tools/skills/release-notes-writer/README.mdplugins/docs-tools/skills/release-notes-writer/SKILL.mdplugins/docs-tools/skills/rh-ssg-release-notes/SKILL.md
The README duplicates content already in SKILL.md and wastes ~1,154 tokens of context window when agents load the skill directory. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Summary
release-notes-writerskill that generates AsciiDoc release note entries from GitHub PRs or JIRA ticketsrh-ssg-release-notesSKILL.md (2-line change)Test plan
/release-notes-writerwith a GitHub PR URL and verify output matches new feature template/release-notes-writerwith a JIRA key tagged as Bug Fix and verify CCFR format/release-notes-writerwith a JIRA key tagged as Known Issue and verify output🤖 Generated with Claude Code
Summary by CodeRabbit
Documentation
Chores