Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
},
"metadata": {
"description": "Orchestrator skill for RHDH plugin development - onboard, update, and maintain plugins in the Extensions Catalog",
"version": "0.4.0"
"version": "0.5.0"
},
"plugins": [
{
"name": "rhdh",
"source": "./",
"description": "Skills for RHDH plugin lifecycle management",
"version": "0.4.0",
"version": "0.5.0",
"strict": true
}
]
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "rhdh",
"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.",
"version": "0.4.0",
"version": "0.5.0",
"author": {
"name": "RHDH Store Manager"
},
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ htmlcov/
.DS_Store
Thumbs.db

# OAuth credentials
client_secret*.json

# uv
.python-version

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "rhdh-skill"
version = "0.4.0"
version = "0.5.0"
description = "Claude Code skill for RHDH plugin development"
readme = "README.md"
license = "Apache-2.0"
Expand Down
128 changes: 128 additions & 0 deletions skills/rhdh-release/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
---
name: rhdh-release
description: |
Manages RHDH releases — dates, status tracking, team coordination,
freeze announcements, blocker bugs, CVEs, and release notes. Trigger on
"release dates", "release status", "feature freeze", "code freeze",
"blocker bugs", "CVEs", "release notes", "team breakdown", or any
RHDH release management question.
compatibility: "acli on PATH. Python 3 + gog CLI for Google Sheets/Docs."
---

<essential_principles>

<principle name="use_parse_issues_for_team_counts">
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.
</principle>

<principle name="include_jira_links">
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>`.
</principle>

<principle name="slack_code_blocks">
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.
</principle>

<principle name="risk_identification">
When analyzing release health, check these risk indicators:
1. Blocker bugs near freeze dates — query with `priority = Blocker`
2. High open issue count per team — use team breakdown to identify overloaded teams
3. Missing release notes — query issues with empty Release Note Type
4. Critical CVEs — query vulnerabilities with CVE in summary
5. EPICs not in Dev Complete — check epic status

Always provide: specific issue counts with Jira links, team-level breakdown if applicable, actionable recommendations (retriage, escalate, extend timeline), and impact assessment.
</principle>

<principle name="team_coordination">
For team coordination:
1. Retrieve team info from Google Sheets to get leads and Slack handles
2. Include team leads' Slack handles in all team communications
3. Provide Jira links scoped to each team's issues
4. Highlight teams at risk (high open counts, blockers)
5. Suggest follow-up actions per team
</principle>

<principle name="token_safety">
Never read `.jira-token` into context. Always use shell substitution: `"$(cat "$TOKEN_FILE")"`.
</principle>

</essential_principles>

<intake>

## RHDH Release Management

What would you like to do?

### Release Information

1. **Release dates** — Current release dates and key milestones
2. **Future release dates** — Upcoming release dates from schedule spreadsheet
3. **Release status** — Active release status by issue type
4. **Teams** — Teams and leads directory

### Release Tracking

5. **Team breakdown** — Issues by engineering team for a release
6. **Blocker bugs** — Open blocker bugs for a release
7. **EPICs** — Engineering EPICs not yet complete
8. **CVEs** — CVE/vulnerability list for a release
9. **Release notes** — Outstanding release notes (missing Release Note Type)

### Announcements

10. **Feature Freeze update** — Generate Feature Freeze status update for Slack
11. **Feature Freeze announcement** — Generate Feature Freeze milestone announcement
12. **Code Freeze update** — Generate Code Freeze status update for Slack
13. **Code Freeze announcement** — Generate Code Freeze milestone announcement

**Wait for response before proceeding.**

</intake>

<routing>

**Preferred:** Run the `release` CLI first (`python scripts/release.py --json <command>`). If the CLI fails, fall back to the workflow's manual steps.

| Response | CLI Command | Workflow (fallback) |
|----------|-------------|---------------------|
| 1, "release dates", "key dates", "freeze dates", "milestone dates" | `python scripts/release.py --json dates` | `workflows/release-dates.md` |
| 2, "future releases", "upcoming releases", "release roadmap", "future dates" | `python scripts/release.py --json future-dates VERSION` | `workflows/future-release-dates.md` |
| 3, "release status", "active releases", "release health", "release overview" | `python scripts/release.py --json status VERSION` | `workflows/release-status.md` |
| 4, "teams", "team leads", "team list", "team contacts", "team directory" | `python scripts/release.py --json teams` | `workflows/teams-and-leads.md` |
| 5, "team breakdown", "issues by team", "team workload", "team counts" | `python scripts/release.py --json team-breakdown VERSION` | `workflows/issues-by-team.md` |
| 6, "blocker bugs", "blockers", "critical issues", "blocking issues" | `python scripts/release.py --json blockers VERSION` | `workflows/blocker-bugs.md` |
| 7, "epics", "engineering epics", "open epics", "active epics" | `python scripts/release.py --json epics VERSION` | `workflows/engineering-epics.md` |
| 8, "cves", "vulnerabilities", "security issues", "security bugs" | `python scripts/release.py --json cves VERSION` | `workflows/cves.md` |
| 9, "release notes", "missing release notes", "release note gaps" | `python scripts/release.py --json notes VERSION` | `workflows/release-notes.md` |
| 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` |
| 11, "feature freeze announcement", "announce feature freeze", "feature freeze reached" | `python scripts/release.py --json slack feature-freeze VERSION` | `workflows/announce-feature-freeze.md` |
| 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` |
| 13, "code freeze announcement", "announce code freeze", "code freeze reached" | `python scripts/release.py --json slack code-freeze VERSION` | `workflows/announce-code-freeze.md` |

</routing>

<reference_index>

| Reference | Purpose | Load when |
|-----------|---------|-----------|
| `references/jql-release.md` | 13 release-specific JQL templates | Any Jira query for release data |
| `references/slack-templates.md` | 4 Slack announcement templates | Generating freeze announcements |
| `references/config.md` | GDrive IDs, project keys, dashboards, gog setup | Looking up config values or links |
| `gog docs cat 13OkypJ3u_7Jq6kEhKhjEFwHQ12oPFDKXVzFjYW4XLdk` | Release process (live Google Doc) | Release process questions, onboarding |
| `../../rhdh-jira/references/auth.md` | Jira auth setup | Jira prerequisite fails |
| `../../rhdh-jira/references/acli-commands.md` | acli command reference | Building acli commands |

</reference_index>

<prerequisites>

**Run before any workflow:**

| Requirement | Check | Fix |
|-------------|-------|-----|
| **Jira CLI** | `acli jira workitem search --jql "project=RHIDP" --count` succeeds | Load `../../rhdh-jira/SKILL.md` Prerequisites |
| **gog CLI** (for Google Sheets/Docs) | `gog sheets metadata 1vQXfvID72qwqvLb17eyGOvnZXrZG7NBzTGv6RP9wvyM --json` succeeds | Install gog and run `gog auth add <email>` |

</prerequisites>
27 changes: 27 additions & 0 deletions skills/rhdh-release/references/config.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Release Manager Configuration

Static configuration values for the RHDH Release Manager skill.

## JQL Scope

| Key | Value |
|-----|-------|
| `jira_default_base_jql` | `project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND status != closed` |

## Google Drive Resources

| Key | Value | Description |
|-----|-------|-------------|
| `team_mapping_gdrive_id` | `1vQXfvID72qwqvLb17eyGOvnZXrZG7NBzTGv6RP9wvyM` | RHDH Team Mapping spreadsheet (sheet: "Team") |
| `release_schedule_gdrive_id` | `1knVzlMW0l0X4c7gkoiuaGql1zuFgEGwHHBsj-ygUTnc` | RHDH Release Schedule spreadsheet |
| `release_process_doc_id` | `13OkypJ3u_7Jq6kEhKhjEFwHQ12oPFDKXVzFjYW4XLdk` | Release process Google Doc |

## gog CLI Setup

Google Sheets and Docs access uses the [gog CLI](https://gogcli.sh).

1. Install: `brew install gogcli` (requires Homebrew; `brew trust openclaw/tap` if prompted)
2. Get OAuth credentials: request `client_secret.json` from <mhild@redhat.com>
3. Import credentials: `gog auth credentials client_secret.json`
4. Authenticate: `gog auth add <your-email> --services sheets,docs,drive`
5. Verify: `gog sheets metadata 1vQXfvID72qwqvLb17eyGOvnZXrZG7NBzTGv6RP9wvyM --json`
158 changes: 158 additions & 0 deletions skills/rhdh-release/references/jql-release.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
# JQL Release Queries

Release-specific JQL templates for RHDH release management. All queries tested against `redhat.atlassian.net`.

For general Jira queries, boards, and sprints, see `../../rhdh-jira/references/jql-patterns.md`.

## active_release

Find all active release features in RHDHPlan.

```jql
project=rhdhplan AND issuetype=feature AND component=release AND status != closed
```

- **Placeholders:** none
- **Notes:** Returns release tracking issues with key dates in description. Use `acli jira workitem view KEY --json` on each result to extract dates.

## open_issues

Find all open issues for a specific release version.

```jql
project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND fixVersion = "{{RELEASE_VERSION}}" and status != closed
```

- **Placeholders:** `{{RELEASE_VERSION}}` — e.g., `1.9.0`
- **Example:** `... AND fixVersion = "1.9.0" and status != closed`
- **Notes:** Base query for all open issues in a release.

## open_issues_by_type

Find open issues for a release filtered by issue type.

```jql
project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND fixVersion = "{{RELEASE_VERSION}}" AND status != closed AND issuetype = "{{ISSUE_TYPE}}"
```

- **Placeholders:** `{{RELEASE_VERSION}}`, `{{ISSUE_TYPE}}`
- **Example:** `... AND fixVersion = "1.9.0" AND status != closed AND issuetype = "Bug"`
- **Notes:** Valid issue types: Feature, Epic, Story, Task, Sub-task, Bug, Vulnerability, Weakness.

## epics

Find open EPICs not in Dev Complete or Release Pending.

```jql
project IN (RHIDP) AND fixVersion = "{{RELEASE_VERSION}}" and issuetype = epic and status not in (closed, "Release Pending", "Dev Complete")
```

- **Placeholders:** `{{RELEASE_VERSION}}`
- **Example:** `... AND fixVersion = "1.9.0" and issuetype = epic and status not in (closed, "Release Pending", "Dev Complete")`
- **Notes:** Identifies EPICs that need attention before release.

## cves

Find all CVE issues (vulnerabilities and weaknesses).

```jql
project IN (RHIDP, rhdhbugs) AND fixVersion = "{{RELEASE_VERSION}}" and issuetype in (weakness, Vulnerability, bug) and summary ~ "CVE*"
```

- **Placeholders:** `{{RELEASE_VERSION}}`
- **Example:** `... AND fixVersion = "1.9.0" and issuetype in (weakness, Vulnerability, bug) and summary ~ "CVE*"`
- **Notes:** Critical for security tracking before release.

## feature_demos

Find features tagged for demonstration.

```jql
project in (RHDHPlan, RHIDP) AND issuetype = feature AND labels = demo AND fixVersion = "{{RELEASE_VERSION}}" AND status != closed
```

- **Placeholders:** `{{RELEASE_VERSION}}`
- **Example:** `... AND labels = demo AND fixVersion = "1.9.0" AND status != closed`
- **Notes:** Features that need demo preparation.

## feature_subtasks

Find feature subtasks for acceptance criteria verification.

```jql
project in (RHDHPlan) AND issuetype = sub-task AND fixVersion = "{{RELEASE_VERSION}}" AND status != closed
```

- **Placeholders:** `{{RELEASE_VERSION}}`
- **Example:** `... AND fixVersion = "1.9.0" AND status != closed`
- **Notes:** Tracks feature verification and demo creation tasks.

## test_day_features

Find features designated for Test Day.

```jql
Project in (RHDHPlan, rhidp) AND issuetype = feature AND labels = rhdh-testday AND fixVersion = "{{RELEASE_VERSION}}" AND status != closed
```

- **Placeholders:** `{{RELEASE_VERSION}}`
- **Example:** `... AND labels = rhdh-testday AND fixVersion = "1.9.0" AND status != closed`
- **Notes:** Features ready for Test Day validation.

## features_added_to_release

Find features added to release in last 14 days.

```jql
project in (RHDHPlan, rhidp) AND issuetype = feature AND fixVersion = "{{RELEASE_VERSION}}" AND fixversion changed after -14d
```

- **Placeholders:** `{{RELEASE_VERSION}}`
- **Example:** `... AND fixVersion = "1.9.0" AND fixversion changed after -14d`
- **Notes:** Tracks scope changes to release.

## release_notes

Find issues missing Release Note Type field.

```jql
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}}"
```

- **Placeholders:** `{{RELEASE_VERSION}}`
- **Example:** `... AND "Release Note Type" is EMPTY and fixVersion = "1.9.0"`
- **Notes:** Critical for documentation — must be filled before release.

## blockers

Find open blocker bugs for a release.

```jql
project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND fixVersion = "{{RELEASE_VERSION}}" AND status != closed AND issuetype = bug AND priority = Blocker
```

- **Placeholders:** `{{RELEASE_VERSION}}`
- **Example:** `... AND fixVersion = "1.9.0" AND status != closed AND issuetype = bug AND priority = Blocker`
- **Notes:** Critical path items that must be resolved before release.

## feature_freeze_issues

Find feature work outstanding at Feature Freeze.

```jql
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)
```

- **Placeholders:** `{{RELEASE_VERSION}}`
- **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.

## code_freeze_issues

Find all issues outstanding at Code Freeze.

```jql
project IN (RHIDP, RHDHBugs, RHDHPLAN, RHDHSUPP) AND fixVersion = "{{RELEASE_VERSION}}" and status != closed
```

- **Placeholders:** `{{RELEASE_VERSION}}`
- **Notes:** All open work. Same as `open_issues` — used for Code Freeze announcements.
Loading
Loading