Skip to content

Commit a8e2460

Browse files
durandomclaude
andcommitted
feat: add rhdh-release skill for release management (v0.5.0)
14-command CLI (scripts/release.py) for deterministic release data gathering — dates, status, teams, freeze announcements, blockers, CVEs, release notes. Agent calls CLI first, then adds judgment. - 13 JQL templates, 4 Slack announcement templates, 13 workflows - Zero cross-skill symlinks — gog CLI for Google Sheets/Docs - Team name normalization for Jira↔Sheets matching - 54 unit tests + structural checks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2008c30 commit a8e2460

32 files changed

Lines changed: 4156 additions & 161 deletions

.claude-plugin/marketplace.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
},
66
"metadata": {
77
"description": "Orchestrator skill for RHDH plugin development - onboard, update, and maintain plugins in the Extensions Catalog",
8-
"version": "0.4.0"
8+
"version": "0.5.0"
99
},
1010
"plugins": [
1111
{
1212
"name": "rhdh",
1313
"source": "./",
1414
"description": "Skills for RHDH plugin lifecycle management",
15-
"version": "0.4.0",
15+
"version": "0.5.0",
1616
"strict": true
1717
}
1818
]

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "rhdh",
33
"description": "All-in-one toolkit for Red Hat Developer Hub (RHDH). Covers plugin development, overlay management, environment setup, version compatibility, CI/CD, and RHDH ecosystem navigation.",
4-
"version": "0.4.0",
4+
"version": "0.5.0",
55
"author": {
66
"name": "RHDH Store Manager"
77
},

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ htmlcov/
2727
.DS_Store
2828
Thumbs.db
2929

30+
# OAuth credentials
31+
client_secret*.json
32+
3033
# uv
3134
.python-version
3235

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "rhdh-skill"
3-
version = "0.4.0"
3+
version = "0.5.0"
44
description = "Claude Code skill for RHDH plugin development"
55
readme = "README.md"
66
license = "Apache-2.0"

skills/rhdh-release/SKILL.md

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
---
2+
name: rhdh-release
3+
description: |
4+
Manages RHDH releases — dates, status tracking, team coordination,
5+
freeze announcements, blocker bugs, CVEs, and release notes. Trigger on
6+
"release dates", "release status", "feature freeze", "code freeze",
7+
"blocker bugs", "CVEs", "release notes", "team breakdown", or any
8+
RHDH release management question.
9+
compatibility: "acli on PATH. Python 3 + gog CLI for Google Sheets/Docs."
10+
---
11+
12+
<essential_principles>
13+
14+
<principle name="use_parse_issues_for_team_counts">
15+
Always use `parse_issues.py --enrich` for team counts — never count manually. The Team custom field cannot be queried via JQL. Use `acli jira workitem search --json | python ~/.claude/skills/rhdh-jira/scripts/parse_issues.py --enrich` and filter by team in the output.
16+
</principle>
17+
18+
<principle name="include_jira_links">
19+
Include Jira search links for traceability in all outputs. Build links by URL-encoding the JQL: `https://issues.redhat.com/issues/?jql=<URL_ENCODED_JQL>`.
20+
</principle>
21+
22+
<principle name="slack_code_blocks">
23+
Always wrap Slack messages in triple-backtick code blocks (` ```slack `) for easy copy-paste. Tell the user they can copy-paste this directly into Slack.
24+
</principle>
25+
26+
<principle name="risk_identification">
27+
When analyzing release health, check these risk indicators:
28+
1. Blocker bugs near freeze dates — query with `priority = Blocker`
29+
2. High open issue count per team — use team breakdown to identify overloaded teams
30+
3. Missing release notes — query issues with empty Release Note Type
31+
4. Critical CVEs — query vulnerabilities with CVE in summary
32+
5. EPICs not in Dev Complete — check epic status
33+
34+
Always provide: specific issue counts with Jira links, team-level breakdown if applicable, actionable recommendations (retriage, escalate, extend timeline), and impact assessment.
35+
</principle>
36+
37+
<principle name="team_coordination">
38+
For team coordination:
39+
1. Retrieve team info from Google Sheets to get leads and Slack handles
40+
2. Include team leads' Slack handles in all team communications
41+
3. Provide Jira links scoped to each team's issues
42+
4. Highlight teams at risk (high open counts, blockers)
43+
5. Suggest follow-up actions per team
44+
</principle>
45+
46+
<principle name="token_safety">
47+
Never read `.jira-token` into context. Always use shell substitution: `"$(cat "$TOKEN_FILE")"`.
48+
</principle>
49+
50+
</essential_principles>
51+
52+
<intake>
53+
54+
## RHDH Release Management
55+
56+
What would you like to do?
57+
58+
### Release Information
59+
60+
1. **Release dates** — Current release dates and key milestones
61+
2. **Future release dates** — Upcoming release dates from schedule spreadsheet
62+
3. **Release status** — Active release status by issue type
63+
4. **Teams** — Teams and leads directory
64+
65+
### Release Tracking
66+
67+
5. **Team breakdown** — Issues by engineering team for a release
68+
6. **Blocker bugs** — Open blocker bugs for a release
69+
7. **EPICs** — Engineering EPICs not yet complete
70+
8. **CVEs** — CVE/vulnerability list for a release
71+
9. **Release notes** — Outstanding release notes (missing Release Note Type)
72+
73+
### Announcements
74+
75+
10. **Feature Freeze update** — Generate Feature Freeze status update for Slack
76+
11. **Feature Freeze announcement** — Generate Feature Freeze milestone announcement
77+
12. **Code Freeze update** — Generate Code Freeze status update for Slack
78+
13. **Code Freeze announcement** — Generate Code Freeze milestone announcement
79+
80+
**Wait for response before proceeding.**
81+
82+
</intake>
83+
84+
<routing>
85+
86+
**Preferred:** Run the `release` CLI first (`python scripts/release.py --json <command>`). If the CLI fails, fall back to the workflow's manual steps.
87+
88+
| Response | CLI Command | Workflow (fallback) |
89+
|----------|-------------|---------------------|
90+
| 1, "release dates", "key dates", "freeze dates", "milestone dates" | `python scripts/release.py --json dates` | `workflows/release-dates.md` |
91+
| 2, "future releases", "upcoming releases", "release roadmap", "future dates" | `python scripts/release.py --json future-dates VERSION` | `workflows/future-release-dates.md` |
92+
| 3, "release status", "active releases", "release health", "release overview" | `python scripts/release.py --json status VERSION` | `workflows/release-status.md` |
93+
| 4, "teams", "team leads", "team list", "team contacts", "team directory" | `python scripts/release.py --json teams` | `workflows/teams-and-leads.md` |
94+
| 5, "team breakdown", "issues by team", "team workload", "team counts" | `python scripts/release.py --json team-breakdown VERSION` | `workflows/issues-by-team.md` |
95+
| 6, "blocker bugs", "blockers", "critical issues", "blocking issues" | `python scripts/release.py --json blockers VERSION` | `workflows/blocker-bugs.md` |
96+
| 7, "epics", "engineering epics", "open epics", "active epics" | `python scripts/release.py --json epics VERSION` | `workflows/engineering-epics.md` |
97+
| 8, "cves", "vulnerabilities", "security issues", "security bugs" | `python scripts/release.py --json cves VERSION` | `workflows/cves.md` |
98+
| 9, "release notes", "missing release notes", "release note gaps" | `python scripts/release.py --json notes VERSION` | `workflows/release-notes.md` |
99+
| 10, "feature freeze update", "feature freeze status", "feature freeze progress" | `python scripts/release.py --json slack feature-freeze-update VERSION` | `workflows/announce-feature-freeze-update.md` |
100+
| 11, "feature freeze announcement", "announce feature freeze", "feature freeze reached" | `python scripts/release.py --json slack feature-freeze VERSION` | `workflows/announce-feature-freeze.md` |
101+
| 12, "code freeze update", "code freeze status", "code freeze progress" | `python scripts/release.py --json slack code-freeze-update VERSION` | `workflows/announce-code-freeze-update.md` |
102+
| 13, "code freeze announcement", "announce code freeze", "code freeze reached" | `python scripts/release.py --json slack code-freeze VERSION` | `workflows/announce-code-freeze.md` |
103+
104+
</routing>
105+
106+
<reference_index>
107+
108+
| Reference | Purpose | Load when |
109+
|-----------|---------|-----------|
110+
| `references/jql-release.md` | 13 release-specific JQL templates | Any Jira query for release data |
111+
| `references/slack-templates.md` | 4 Slack announcement templates | Generating freeze announcements |
112+
| `references/config.md` | GDrive IDs, project keys, dashboards, gog setup | Looking up config values or links |
113+
| `gog docs cat 13OkypJ3u_7Jq6kEhKhjEFwHQ12oPFDKXVzFjYW4XLdk` | Release process (live Google Doc) | Release process questions, onboarding |
114+
| `../../rhdh-jira/references/auth.md` | Jira auth setup | Jira prerequisite fails |
115+
| `../../rhdh-jira/references/acli-commands.md` | acli command reference | Building acli commands |
116+
117+
</reference_index>
118+
119+
<prerequisites>
120+
121+
**Run before any workflow:**
122+
123+
| Requirement | Check | Fix |
124+
|-------------|-------|-----|
125+
| **Jira CLI** | `acli jira workitem search --jql "project=RHIDP" --count` succeeds | Load `../../rhdh-jira/SKILL.md` Prerequisites |
126+
| **gog CLI** (for Google Sheets/Docs) | `gog sheets metadata 1vQXfvID72qwqvLb17eyGOvnZXrZG7NBzTGv6RP9wvyM --json` succeeds | Install gog and run `gog auth add <email>` |
127+
128+
</prerequisites>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Release Manager Configuration
2+
3+
Static configuration values for the RHDH Release Manager skill.
4+
5+
## JQL Scope
6+
7+
| Key | Value |
8+
|-----|-------|
9+
| `jira_default_base_jql` | `project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND status != closed` |
10+
11+
## Google Drive Resources
12+
13+
| Key | Value | Description |
14+
|-----|-------|-------------|
15+
| `team_mapping_gdrive_id` | `1vQXfvID72qwqvLb17eyGOvnZXrZG7NBzTGv6RP9wvyM` | RHDH Team Mapping spreadsheet (sheet: "Team") |
16+
| `release_schedule_gdrive_id` | `1knVzlMW0l0X4c7gkoiuaGql1zuFgEGwHHBsj-ygUTnc` | RHDH Release Schedule spreadsheet |
17+
| `release_process_doc_id` | `13OkypJ3u_7Jq6kEhKhjEFwHQ12oPFDKXVzFjYW4XLdk` | Release process Google Doc |
18+
19+
## gog CLI Setup
20+
21+
Google Sheets and Docs access uses the [gog CLI](https://gogcli.sh).
22+
23+
1. Install: `brew install gogcli` (requires Homebrew; `brew trust openclaw/tap` if prompted)
24+
2. Get OAuth credentials: request `client_secret.json` from <mhild@redhat.com>
25+
3. Import credentials: `gog auth credentials client_secret.json`
26+
4. Authenticate: `gog auth add <your-email> --services sheets,docs,drive`
27+
5. Verify: `gog sheets metadata 1vQXfvID72qwqvLb17eyGOvnZXrZG7NBzTGv6RP9wvyM --json`
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
# JQL Release Queries
2+
3+
Release-specific JQL templates for RHDH release management. All queries tested against `redhat.atlassian.net`.
4+
5+
For general Jira queries, boards, and sprints, see `../../rhdh-jira/references/jql-patterns.md`.
6+
7+
## active_release
8+
9+
Find all active release features in RHDHPlan.
10+
11+
```jql
12+
project=rhdhplan AND issuetype=feature AND component=release AND status != closed
13+
```
14+
15+
- **Placeholders:** none
16+
- **Notes:** Returns release tracking issues with key dates in description. Use `acli jira workitem view KEY --json` on each result to extract dates.
17+
18+
## open_issues
19+
20+
Find all open issues for a specific release version.
21+
22+
```jql
23+
project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND fixVersion = "{{RELEASE_VERSION}}" and status != closed
24+
```
25+
26+
- **Placeholders:** `{{RELEASE_VERSION}}` — e.g., `1.9.0`
27+
- **Example:** `... AND fixVersion = "1.9.0" and status != closed`
28+
- **Notes:** Base query for all open issues in a release.
29+
30+
## open_issues_by_type
31+
32+
Find open issues for a release filtered by issue type.
33+
34+
```jql
35+
project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND fixVersion = "{{RELEASE_VERSION}}" AND status != closed AND issuetype = "{{ISSUE_TYPE}}"
36+
```
37+
38+
- **Placeholders:** `{{RELEASE_VERSION}}`, `{{ISSUE_TYPE}}`
39+
- **Example:** `... AND fixVersion = "1.9.0" AND status != closed AND issuetype = "Bug"`
40+
- **Notes:** Valid issue types: Feature, Epic, Story, Task, Sub-task, Bug, Vulnerability, Weakness.
41+
42+
## epics
43+
44+
Find open EPICs not in Dev Complete or Release Pending.
45+
46+
```jql
47+
project IN (RHIDP) AND fixVersion = "{{RELEASE_VERSION}}" and issuetype = epic and status not in (closed, "Release Pending", "Dev Complete")
48+
```
49+
50+
- **Placeholders:** `{{RELEASE_VERSION}}`
51+
- **Example:** `... AND fixVersion = "1.9.0" and issuetype = epic and status not in (closed, "Release Pending", "Dev Complete")`
52+
- **Notes:** Identifies EPICs that need attention before release.
53+
54+
## cves
55+
56+
Find all CVE issues (vulnerabilities and weaknesses).
57+
58+
```jql
59+
project IN (RHIDP, rhdhbugs) AND fixVersion = "{{RELEASE_VERSION}}" and issuetype in (weakness, Vulnerability, bug) and summary ~ "CVE*"
60+
```
61+
62+
- **Placeholders:** `{{RELEASE_VERSION}}`
63+
- **Example:** `... AND fixVersion = "1.9.0" and issuetype in (weakness, Vulnerability, bug) and summary ~ "CVE*"`
64+
- **Notes:** Critical for security tracking before release.
65+
66+
## feature_demos
67+
68+
Find features tagged for demonstration.
69+
70+
```jql
71+
project in (RHDHPlan, RHIDP) AND issuetype = feature AND labels = demo AND fixVersion = "{{RELEASE_VERSION}}" AND status != closed
72+
```
73+
74+
- **Placeholders:** `{{RELEASE_VERSION}}`
75+
- **Example:** `... AND labels = demo AND fixVersion = "1.9.0" AND status != closed`
76+
- **Notes:** Features that need demo preparation.
77+
78+
## feature_subtasks
79+
80+
Find feature subtasks for acceptance criteria verification.
81+
82+
```jql
83+
project in (RHDHPlan) AND issuetype = sub-task AND fixVersion = "{{RELEASE_VERSION}}" AND status != closed
84+
```
85+
86+
- **Placeholders:** `{{RELEASE_VERSION}}`
87+
- **Example:** `... AND fixVersion = "1.9.0" AND status != closed`
88+
- **Notes:** Tracks feature verification and demo creation tasks.
89+
90+
## test_day_features
91+
92+
Find features designated for Test Day.
93+
94+
```jql
95+
Project in (RHDHPlan, rhidp) AND issuetype = feature AND labels = rhdh-testday AND fixVersion = "{{RELEASE_VERSION}}" AND status != closed
96+
```
97+
98+
- **Placeholders:** `{{RELEASE_VERSION}}`
99+
- **Example:** `... AND labels = rhdh-testday AND fixVersion = "1.9.0" AND status != closed`
100+
- **Notes:** Features ready for Test Day validation.
101+
102+
## features_added_to_release
103+
104+
Find features added to release in last 14 days.
105+
106+
```jql
107+
project in (RHDHPlan, rhidp) AND issuetype = feature AND fixVersion = "{{RELEASE_VERSION}}" AND fixversion changed after -14d
108+
```
109+
110+
- **Placeholders:** `{{RELEASE_VERSION}}`
111+
- **Example:** `... AND fixVersion = "1.9.0" AND fixversion changed after -14d`
112+
- **Notes:** Tracks scope changes to release.
113+
114+
## release_notes
115+
116+
Find issues missing Release Note Type field.
117+
118+
```jql
119+
project in (RHIDP, "Red Hat Developer Hub Bugs", "RHDH Support", rhdhplan) and issuetype in (Feature, bug) and "Release Note Type" is EMPTY and fixVersion = "{{RELEASE_VERSION}}"
120+
```
121+
122+
- **Placeholders:** `{{RELEASE_VERSION}}`
123+
- **Example:** `... AND "Release Note Type" is EMPTY and fixVersion = "1.9.0"`
124+
- **Notes:** Critical for documentation — must be filled before release.
125+
126+
## blockers
127+
128+
Find open blocker bugs for a release.
129+
130+
```jql
131+
project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND fixVersion = "{{RELEASE_VERSION}}" AND status != closed AND issuetype = bug AND priority = Blocker
132+
```
133+
134+
- **Placeholders:** `{{RELEASE_VERSION}}`
135+
- **Example:** `... AND fixVersion = "1.9.0" AND status != closed AND issuetype = bug AND priority = Blocker`
136+
- **Notes:** Critical path items that must be resolved before release.
137+
138+
## feature_freeze_issues
139+
140+
Find feature work outstanding at Feature Freeze.
141+
142+
```jql
143+
project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND fixVersion = "{{RELEASE_VERSION}}" and resolution is EMPTY AND component not in (AI, Build, Certification, "Continuous Improvement", Documentation, Knowledge, Performance, Quality, Quickstart, Release, "RHDH Local", Security, Segment, Serviceability, Support, "Team Operations", "Test Framework", "Test Infrastructure", "Upstream & Community", UX) AND Type not in (Bug, Vulnerability, sub-task) AND status not in ("Dev Complete", "Release Pending", Done, Closed) AND (labels is EMPTY OR labels != stretch-goal)
144+
```
145+
146+
- **Placeholders:** `{{RELEASE_VERSION}}`
147+
- **Notes:** Excludes infrastructure/ops components and bugs. Use for Feature Freeze announcements. The component exclusion list filters out non-feature work that shouldn't block Feature Freeze.
148+
149+
## code_freeze_issues
150+
151+
Find all issues outstanding at Code Freeze.
152+
153+
```jql
154+
project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND fixVersion = "{{RELEASE_VERSION}}" and status != closed
155+
```
156+
157+
- **Placeholders:** `{{RELEASE_VERSION}}`
158+
- **Notes:** All open work. Same as `open_issues` — used for Code Freeze announcements.

0 commit comments

Comments
 (0)