feat: add rhdh-release skill for release management (v0.5.0)#43
Conversation
| _no_color = os.environ.get("NO_COLOR") is not None | ||
| _is_tty = sys.stderr.isatty() and not _no_color | ||
|
|
||
| DEFAULT_SHEET_ID = "1vQXfvID72qwqvLb17eyGOvnZXrZG7NBzTGv6RP9wvyM" |
There was a problem hiding this comment.
I don't think we want to exposing this sort of information. I also believe we should point people to installing the gws cli.
There was a problem hiding this comment.
The sheet IDs are for read-only shared spreadsheets — they're useless without Google Workspace access to the RHDH org. Same as hardcoding Jira project keys (RHIDP, RHDHBugs), which we already do throughout.
Re gws: this commit already replaces the Google SDK with the gog CLI — no more gcloud/uv run --script. gws (googleworkspace/cli) hasn't seen a commit since March 31 and looks stalled. Happy to revisit if it picks up again.
3df9822 to
30b0e5b
Compare
There was a problem hiding this comment.
Pull request overview
Adds a new rhdh-release skill that provides a CLI-first workflow for RHDH release management (Jira-driven status/dates + Google Sheets team/schedule data + Slack announcement generation), and wires it into the main rhdh orchestrator.
Changes:
- Introduces
skills/rhdh-releasewith a 14-command release-management CLI (scripts/release.py) plus supporting modules (jql.py,slack_templates.py,formatters.py) and reference templates. - Adds 13 CLI-first workflows for release tracking, reporting, and freeze announcements (with manual fallback steps).
- Adds unit tests for the new CLI/template parsing, and bumps repo/plugin version to
0.5.0.
Reviewed changes
Copilot reviewed 30 out of 32 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
tests/unit/test_release_cli.py |
New unit tests covering release CLI parsing, JQL + Slack template parsing, and helper functions. |
skills/rhdh/SKILL.md |
Adds routing/intake option to route “Release management” requests to @rhdh-release. |
skills/rhdh-release/SKILL.md |
New skill definition: principles, intake menu, CLI-first routing table, prerequisites, reference index. |
skills/rhdh-release/scripts/release.py |
New release-management CLI implementation (Jira queries, Sheets via gog, Slack message generation). |
skills/rhdh-release/scripts/jql.py |
Parses JQL templates from markdown and builds URL-encoded Jira links. |
skills/rhdh-release/scripts/slack_templates.py |
Parses Slack templates from markdown, fills placeholders, and expands per-team lines. |
skills/rhdh-release/scripts/formatters.py |
Human/JSON output formatter (TTY auto-detection, structured JSON output). |
skills/rhdh-release/references/jql-release.md |
Adds 12 release-related JQL templates. |
skills/rhdh-release/references/slack-templates.md |
Adds 4 Slack announcement templates (feature/code freeze update + announcement). |
skills/rhdh-release/references/config.md |
Documents static IDs/URLs and gog setup for release skill. |
skills/rhdh-release/workflows/release-dates.md |
Workflow for active release dates (CLI-first). |
skills/rhdh-release/workflows/future-release-dates.md |
Workflow for schedule-based future dates (CLI-first). |
skills/rhdh-release/workflows/release-status.md |
Workflow for issue-type status breakdown (CLI-first). |
skills/rhdh-release/workflows/teams-and-leads.md |
Workflow for teams/leads directory (CLI-first). |
skills/rhdh-release/workflows/issues-by-team.md |
Workflow for per-team issue breakdown (CLI-first). |
skills/rhdh-release/workflows/blocker-bugs.md |
Workflow for blocker bug reporting (CLI-first). |
skills/rhdh-release/workflows/engineering-epics.md |
Workflow for outstanding EPICs reporting (CLI-first). |
skills/rhdh-release/workflows/cves.md |
Workflow for CVE/vulnerability reporting (CLI-first). |
skills/rhdh-release/workflows/release-notes.md |
Workflow for missing release notes reporting (CLI-first). |
skills/rhdh-release/workflows/announce-feature-freeze.md |
Workflow for Feature Freeze announcement generation (CLI-first). |
skills/rhdh-release/workflows/announce-feature-freeze-update.md |
Workflow for Feature Freeze update generation (CLI-first). |
skills/rhdh-release/workflows/announce-code-freeze.md |
Workflow for Code Freeze announcement generation (CLI-first). |
skills/rhdh-release/workflows/announce-code-freeze-update.md |
Workflow for Code Freeze update generation (CLI-first). |
skills/rhdh-release/tests/demo-release-cli.md |
Demo/structural verification instructions for the new CLI. |
skills/rhdh-release/tests/check-structural.md |
Structural checklist for skill/workflow/reference consistency. |
skills/rhdh-release/tests/check-jira.md |
Jira smoke-check instructions for validating JQL/templates. |
skills/rhdh-release/tests/check-gsheets.md |
Google Sheets smoke-check instructions for validating gog access and CLI integration. |
pyproject.toml |
Bumps package version to 0.5.0. |
.gitignore |
Ignores OAuth credential files (client_secret*.json). |
.claude-plugin/plugin.json |
Bumps plugin version to 0.5.0. |
.claude-plugin/marketplace.json |
Bumps marketplace metadata/plugin version to 0.5.0. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| template = slack_mod.get_template("feature_freeze_update") | ||
| template = slack_mod.fill_placeholders( | ||
| template, | ||
| { | ||
| "RELEASE_VERSION": version, | ||
| "FEATURE_FREEZE_DATE": ff_date, | ||
| "OUTSTANDING_RELEASE_NOTES_ISSUE_COUNT": str(rn_count), | ||
| "JIRA_LINK": rn_url, | ||
| }, | ||
| ) | ||
| message = slack_mod.expand_team_lines(template, team_lines) | ||
|
|
| rn_line_idx = next( | ||
| (j for j, text in enumerate(filled) if "oustanding Release Notes" in text), None | ||
| ) |
| • *{{TEAM_NAME}}* - [{{ISSUE_COUNT}}]({{JIRA_LINK}}) @{{LEAD_SLACK}} | ||
| (repeat for each active engineering team) | ||
|
|
||
| There are [{{OUTSTANDING_RELEASE_NOTES_ISSUE_COUNT}}]({{JIRA_LINK}}) oustanding Release Notes. Please review and update Features and bugs. |
| • *{{TEAM_NAME}}* - [{{TEAM_ISSUE_COUNT}}]({{JIRA_LINK}}) @{{LEAD_SLACK}} | ||
| (repeat for each active engineering team) | ||
|
|
||
| :two: There are [{{OUTSTANDING_RELEASE_NOTES_ISSUE_COUNT}}]({{JIRA_LINK}}) oustanding Release Notes. Please review and update Features and bugs. |
| ## Step 2 (fallback): Fetch team data | ||
|
|
||
| ```bash | ||
| python scripts/fetch_team_mapping.py --json | ||
| ``` | ||
|
|
||
| To filter by category (e.g., Engineering only): | ||
|
|
||
| ```bash | ||
| python scripts/fetch_team_mapping.py --category Engineering --json | ||
| ``` | ||
|
|
||
| To include deprecated teams: | ||
|
|
||
| ```bash | ||
| python scripts/fetch_team_mapping.py --all --json | ||
| ``` |
| ## Step 3 (fallback): Get active engineering teams | ||
|
|
||
| ```bash | ||
| python scripts/fetch_team_mapping.py --category Engineering --json | ||
| ``` |
| ## Step 3 (fallback): Get active engineering teams | ||
|
|
||
| ```bash | ||
| python scripts/fetch_team_mapping.py --category Engineering --json | ||
| ``` |
| Use the existing `fetch_schedule.py` from `rhdh-test-plan-review`: | ||
|
|
||
| ```bash | ||
| python ../../rhdh-test-plan-review/scripts/fetch_schedule.py --version "{{RELEASE_VERSION}}" --sheet-id "1knVzlMW0l0X4c7gkoiuaGql1zuFgEGwHHBsj-ygUTnc" | ||
| ``` |
| @@ -0,0 +1,384 @@ | |||
| """Unit tests for skills/rhdh-release/scripts/ — jql.py, slack_templates.py, release.py, schedule.py.""" | |||
| - The `team_id` is the numeric ID used for JQL filtering with `"Team[Team]" = {{TEAM_ID}}` syntax. | ||
| - Team ID is used by `parse_issues.py --enrich` for team-based filtering — not direct JQL (the Team custom field cannot be queried via JQL). |
81f383c to
151f3ff
Compare
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>
151f3ff to
a8e2460
Compare
Summary
rhdh-releaseskill for RHDH release management (dates, status, teams, freeze announcements, blockers, CVEs, release notes)scripts/release.py) for deterministic data gathering — the agent calls the CLI first, then adds judgmentgogCLI for Google Sheets/Docs access — replacesgcloud/uv run --script/Google SDK with stdlib-only Pythonrelease.py(CLI + business logic),formatters.py,jql.py,slack_templates.pyArchitecture
Cross-skill dependency removal
scripts/gcloud_token.py→ symlink to rhdh-test-plan-reviewgogCLI)scripts/check_gsheets.py→ symlink to rhdh-test-plan-reviewgog sheets metadata)scripts/formatters.py→ symlink to rhdh skillscripts/fetch_team_mapping.py(separate script)scripts/schedule.py(separate script)references/release-process.md(150-line stale copy)gog docs cat <doc-id>— live Google Doc on demandPARSE_ISSUEShardcoded../../rhdh-jira/path_find_parse_issues()— checks~/.claude/skills/rhdh-jira/first, falls back to siblinguv run --script+ google-api-python-clientgog sheets get/metadata— no pip depsDemo session
All output captured live on 2026-06-15.
1. Prerequisites check
2. Active releases (from Jira)
3. Release schedule (from Google Sheets via gog)
4. Engineering teams (from Google Sheets via gog)
5. Release status (from Jira — JSON mode, as the agent sees it)
6. Release process doc (live from Google Docs)
Release CLI (
scripts/release.py)release --json checkrelease --json datesrelease --json future-dates VERSIONrelease --json status VERSIONrelease --json teams [--category CAT]release --json team-breakdown VERSIONrelease --json blockers VERSIONrelease --json epics VERSIONrelease --json cves VERSIONrelease --json notes VERSIONrelease --json slack feature-freeze-update VERSIONrelease --json slack feature-freeze VERSIONrelease --json slack code-freeze-update VERSIONrelease --json slack code-freeze VERSIONGlobal flags:
--json/--human/--verbose(must appear before the subcommand)Test plan
uv run pytest tests/unit/test_release_cli.pyuv run pytest)find scripts/ -type lreturns emptyrelease.py,formatters.py,jql.py,slack_templates.pyrelease check— validates gog + acli + .jira-tokenrelease --json teams— Google Sheets via gogrelease --json future-dates 1.10— schedule via gogrelease --json status 1.10.3— live Jira data (13 open issues)gog docs cat— release process doc loads live/rhdhand verify release management appears🤖 Generated with Claude Code