Skip to content

feat: add rhdh-release skill for release management (v0.5.0)#43

Merged
durandom merged 1 commit into
redhat-developer:mainfrom
durandom:release-manager
Jun 15, 2026
Merged

feat: add rhdh-release skill for release management (v0.5.0)#43
durandom merged 1 commit into
redhat-developer:mainfrom
durandom:release-manager

Conversation

@durandom

@durandom durandom commented Jun 5, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds new rhdh-release skill for RHDH release management (dates, status, teams, freeze announcements, blockers, CVEs, release notes)
  • 14-command CLI (scripts/release.py) for deterministic data gathering — the agent calls the CLI first, then adds judgment
  • Zero cross-skill symlinks — all dependencies are either local copies or discovered at runtime
  • gog CLI for Google Sheets/Docs access — replaces gcloud/uv run --script/Google SDK with stdlib-only Python
  • 4 scripts total: release.py (CLI + business logic), formatters.py, jql.py, slack_templates.py
  • 13 JQL templates, 4 Slack announcement templates, 13 workflows with CLI-first routing
  • 54 unit tests + structural checks

Architecture

User → SKILL.md (routing) → release.py (CLI, deterministic) → agent (judgment)
                                 ├── jql.py (13 templates from jql-release.md)
                                 ├── slack_templates.py (4 templates)
                                 ├── formatters.py (auto JSON/human output)
                                 └── gog CLI (Google Sheets/Docs access)

Cross-skill dependency removal

Before After
scripts/gcloud_token.py → symlink to rhdh-test-plan-review Deleted (replaced by gog CLI)
scripts/check_gsheets.py → symlink to rhdh-test-plan-review Deleted (replaced by gog sheets metadata)
scripts/formatters.py → symlink to rhdh skill Local copy (stdlib-only, changes rarely)
scripts/fetch_team_mapping.py (separate script) Inlined into release.py
scripts/schedule.py (separate script) Inlined into release.py
references/release-process.md (150-line stale copy) gog docs cat <doc-id> — live Google Doc on demand
PARSE_ISSUES hardcoded ../../rhdh-jira/ path _find_parse_issues() — checks ~/.claude/skills/rhdh-jira/ first, falls back to sibling
Google Sheets via uv run --script + google-api-python-client gog sheets get/metadata — no pip deps

Demo session

All output captured live on 2026-06-15.

1. Prerequisites check

$ python3 scripts/release.py --human check
  ✓ acli: /usr/local/bin/acli
  ⚠ .jira-token: missing (optional — acli may authenticate via other methods)
  ✓ gog: /opt/homebrew/bin/gog
  ✓ gog-auth: authenticated
  ✓ jira-connectivity: connected

2. Active releases (from Jira)

$ python3 scripts/release.py --human dates
Active Release Dates
  → RHDH 1.10.3 (RHDHPLAN-1504)
  → RHDH 1.10.2 (RHDHPLAN-1499)
  → RHDH 2.1.0 (RHDHPLAN-1322)
  → RHDH 1.9.5 (RHDHPLAN-1160)

3. Release schedule (from Google Sheets via gog)

$ python3 scripts/release.py --human future-dates 1.10
RHDH 1.10 Schedule
  → Feature Freeze: 2026-04-28
  → Code Freeze: 2026-05-19
  → Ga Date: 2026-06-10

4. Engineering teams (from Google Sheets via gog)

$ python3 scripts/release.py --human teams --category Engineering
RHDH Teams
  → AI                        (lead)               (slack)
  → COPE                      (lead)               (slack)
  → Frontend Plugin & UI      (lead)               (slack)
  → Install                   (lead)               (slack)
  → Plugins                   (lead)               (slack)
  → Security                  (lead)               (slack)

5. Release status (from Jira — JSON mode, as the agent sees it)

$ python3 scripts/release.py --json status 1.10.3
{
  "version": "1.10.3",
  "issue_counts": [
    {"issue_type": "Feature", "count": 1},
    {"issue_type": "Epic", "count": 4},
    {"issue_type": "Task", "count": 8},
    ...
  ],
  "total": 13,
  "recently_added_features": 1
}

6. Release process doc (live from Google Docs)

$ gog docs cat 13OkypJ3u_7Jq6kEhKhjEFwHQ12oPFDKXVzFjYW4XLdk | head -5
Release Manager

Based on the  .  The Program team is responsible for the Release Planning
Phase and key readout ceremonies.  The Release Manager is responsible for
release delivery (Phases: Engineering and Shutdown).

Release CLI (scripts/release.py)

Command Purpose
release --json check Verify prerequisites (acli, .jira-token, gog, gog-auth)
release --json dates Active release dates from Jira
release --json future-dates VERSION Schedule from Google Sheets via gog
release --json status VERSION Issue counts by type (8 types + total)
release --json teams [--category CAT] Team mapping from Google Sheets via gog
release --json team-breakdown VERSION Per-team issue counts
release --json blockers VERSION Blocker bug details
release --json epics VERSION Outstanding EPICs
release --json cves VERSION CVE list
release --json notes VERSION Missing release notes count
release --json slack feature-freeze-update VERSION Filled Slack template
release --json slack feature-freeze VERSION Filled Slack template
release --json slack code-freeze-update VERSION Filled Slack template
release --json slack code-freeze VERSION Filled Slack template

Global flags: --json / --human / --verbose (must appear before the subcommand)

Test plan

  • 54 unit tests pass: uv run pytest tests/unit/test_release_cli.py
  • Full suite passes: 346 tests (uv run pytest)
  • Zero symlinks: find scripts/ -type l returns empty
  • Exactly 4 scripts: release.py, formatters.py, jql.py, slack_templates.py
  • release check — validates gog + acli + .jira-token
  • release --json teams — Google Sheets via gog
  • release --json future-dates 1.10 — schedule via gog
  • release --json status 1.10.3 — live Jira data (13 open issues)
  • gog docs cat — release process doc loads live
  • Skill registration: run /rhdh and verify release management appears

🤖 Generated with Claude Code

_no_color = os.environ.get("NO_COLOR") is not None
_is_tty = sys.stderr.isatty() and not _no_color

DEFAULT_SHEET_ID = "1vQXfvID72qwqvLb17eyGOvnZXrZG7NBzTGv6RP9wvyM"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we want to exposing this sort of information. I also believe we should point people to installing the gws cli.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@durandom durandom changed the title feat: add rhdh-release skill for release management (v0.4.0) feat: add rhdh-release skill for release management (v0.5.0) Jun 15, 2026
@durandom durandom marked this pull request as ready for review June 15, 2026 10:56
Copilot AI review requested due to automatic review settings June 15, 2026 10:56

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-release with 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.

Comment on lines +807 to +818
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)

Comment thread skills/rhdh-release/scripts/release.py Outdated
Comment on lines +940 to +942
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.
Comment on lines +31 to +47
## 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
```
Comment on lines +40 to +44
## Step 3 (fallback): Get active engineering teams

```bash
python scripts/fetch_team_mapping.py --category Engineering --json
```
Comment on lines +40 to +44
## Step 3 (fallback): Get active engineering teams

```bash
python scripts/fetch_team_mapping.py --category Engineering --json
```
Comment on lines +27 to +31
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"
```
Comment thread tests/unit/test_release_cli.py Outdated
@@ -0,0 +1,384 @@
"""Unit tests for skills/rhdh-release/scripts/ — jql.py, slack_templates.py, release.py, schedule.py."""
Comment on lines +64 to +65
- 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).
@durandom durandom marked this pull request as draft June 15, 2026 11:15
@durandom durandom marked this pull request as ready for review June 15, 2026 12:02
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>
@durandom durandom merged commit 17c517b into redhat-developer:main Jun 15, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants