From jira
Generates executive-level feature summaries for weekly status documents by analyzing Jira issues, their hierarchy, and external PR/MR links. Supports component, label, and user filters.
How this command is triggered — by the user, by Claude, or both
Slash command
/jira:generate-feature-updates [project-key] [--component name] [--label label-name] [user-filters...]Files this command reads when invoked
The summary Claude sees in its command listing — used to decide when to auto-load this command
## Name jira:generate-feature-updates ## Synopsis ## Description The `jira:generate-feature-updates` command generates concise executive-level feature summaries for weekly status documents. It analyzes recent activity across Jira issues and their descendants to produce prose-style updates suitable for the "Key Strategic Feature Updates" section of weekly reports. This command is particularly useful for: - Weekly executive status documents - Strategic feature progress summaries - Stakeholder communication on feature delivery - Identifying blocked or at-risk features Key capabilities...
jira:generate-feature-updates
/jira:generate-feature-updates [project-key] [--component <component-name>] [--label <label-name>] [user-filters...]
The jira:generate-feature-updates command generates concise executive-level feature summaries for weekly status documents. It analyzes recent activity across Jira issues and their descendants to produce prose-style updates suitable for the "Key Strategic Feature Updates" section of weekly reports.
This command is particularly useful for:
Key capabilities:
childIssuesOf() for full hierarchy traversalThis command uses the Status Analysis Engine skill for core analysis logic. See plugins/jira/skills/status-analysis/SKILL.md for detailed implementation.
The command executes in two phases:
Parse command-line arguments:
OCPSTRAT, OCPBUGS)--component <component-name> parameter--label <label-name> parameterIf project key is NOT provided:
mcp__atlassian-mcp__jira_get_all_projects to list all accessible projectsValidate project access:
mcp__atlassian-mcp__jira_search with JQL: project = "{project-key}" AND status != ClosedIf --component parameter is provided:
If --component is NOT provided:
mcp__atlassian-mcp__jira_search_fields with keyword "component" to find the component field IDmcp__atlassian-mcp__jira_search with JQL: project = "{project-key}" AND status != Closed and fields=componentsFor each user filter parameter:
Check if it's an email (contains @): Use as-is for script parameter
If it's a display name (doesn't contain @):
mcp__atlassian-mcp__jira_get_user_profile with the name as the user_identifier parameterHandle exclusion prefix (exclamation mark):
--exclude-assignee parameter for the scriptExecute the Python data gatherer with the resolved parameters:
python3 {plugins-dir}/jira/skills/status-analysis/scripts/gather_status_data.py \
--project {PROJECT-KEY} \
--component "{COMPONENT-NAME}" \
--label "{LABEL-NAME}" \
--assignee {email1} --assignee {email2} \
--exclude-assignee {excluded-email} \
--verbose
Script location: plugins/jira/skills/status-analysis/scripts/gather_status_data.py
Script output:
.work/weekly-status/{YYYY-MM-DD}/manifest.json: Processing config and issue listissues/{ISSUE-KEY}.json: Per-issue data with descendants and PRsWait for script completion and verify output exists before proceeding.
Read the manifest file to confirm successful collection:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Data Collection Complete
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Issues found: {count}
Descendants: {count}
PRs collected: {count}
Date range: {start} to {end}
Output: .work/weekly-status/{date}/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
This step is mandatory before processing any issues:
Skill(jira:status-analysis)
This loads the Status Analysis Engine skill which provides:
Unlike update-weekly-status which processes issues one at a time interactively, this command processes all issues in batch and presents a complete section for review.
For each issue listed in the manifest:
Run the summarize script in batch mode with --only-significant to triage and summarize all issues in a single call. If a --label filter was used for data gathering, pass it here too to separate issues that don't carry the label:
python3 {plugins-dir}/jira/skills/status-analysis/scripts/summarize_issue.py \
.work/weekly-status/{date}/issues/ --only-significant --label {label-name}
This combines triage and summarization: it filters to issues with significant activity (PRs merged, status changes, color changes, human comments, descendant updates) and outputs a structured summary for each. PR author names are included in the output (from commits_in_range and reviews_in_range data) — use these first names for attribution, never GitHub handles.
Label filtering: When --label is provided, any issues missing that label are listed separately under a MISSING LABEL header. Present this list to the user and ask whether to include each one. These are typically descendant features that appeared in the hierarchy but aren't directly tracked under the label.
IMPORTANT — parallelization: The batch summarize output can be large. If the output exceeds comfortable context size, split processing across parallel Bash calls or sub-agents. For example, process Yellow/Red issues in one call and Green issues in another. Never loop through issues sequentially with individual script calls.
Using the pre-gathered data, apply the activity analysis rules from activity-analysis.md:
Read the existing Status Summary field (current_status_summary in JSON):
last_status_summary_update — if the status was updated within the date range, the team actively reported this weekchangelog_in_range for changes to the Status Summary field — a color change (e.g., Green→Yellow, Yellow→Red) is always significantIdentify key events from changelog_in_range:
Analyze comments (excluding bots with is_bot: true):
Analyze PR activity:
commits_in_range > 0 (active development)reviews_in_range > 0 (review activity)state: MERGED)author_name fields (not author logins) when attributing contributions. Always use first names, never GitHub handles.Determine if significant: Skip issues with no noteworthy activity (only bot comments, trivial field changes, no PRs merged or opened). A color change in the Status Summary field (e.g., Green→Red) counts as significant activity and should always be included.
Before generating entries, check for significant issues that have no Color Status in their Status Summary field. If any are found, list them and ask the user:
The following features have significant activity but no R/Y/G color status set:
1. ISSUE-KEY: Issue summary
2. ISSUE-KEY: Issue summary
What color circle should each use? Enter colors (e.g. "1:green 2:yellow"), "all:green" to set all, or "skip" to omit circles:
Then, for each issue with significant activity, format as a nested unordered list item with a color circle prefix (🟢🟡🔴) matching the Color Status from the Status Summary field or the user's override (Green → 🟢, Yellow → 🟡, Red → 🔴, no color → omit circle):
- 🟢 [ISSUE-KEY](https://issues.redhat.com/browse/ISSUE-KEY): Issue summary
- 1-3 sentences of executive prose focusing on significant progress, deliveries, blockers, or risks. Attribute contributions to team members by first name (from `author_name` fields, never GitHub logins). Reference PRs and related issues as markdown links.
Content priorities (in order):
Skip issues where nothing noteworthy happened in the date range.
Combine all entries into a single unordered list, ordered by significance:
All entries form one continuous markdown unordered list (no blank lines between items).
Display the complete assembled section:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Key Strategic Feature Updates
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Issues analyzed: {total}
Features with significant activity: {included}
Features skipped (no activity): {skipped}
Date range: {start} to {end}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
{assembled feature updates section}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Before presenting, run the validation script to check for GitHub handle usage:
python3 {plugins-dir}/jira/skills/status-analysis/scripts/validate_feature_updates.py \
--markdown /tmp/feature-updates.md \
--data-dir .work/weekly-status/{date}/issues/
If violations are found, fix them (replace handles with first names from author_name fields) before presenting to the user.
Options:
approve or a: Accept and outputmodify or m: Modify the section (rewrite entries, skip/reorder features)regenerate or r: Regenerate from cached data with different focusquit or q: AbortIf user chooses modify:
Default: print the final markdown to stdout.
Optional output mode (parsed from original arguments):
--serve: Convert markdown to HTML and serve on localhost for easy copy/paste into Google Docs--serve)Write the final markdown to /tmp/feature-updates.md
Run the validation script to ensure no GitHub handles remain:
python3 {plugins-dir}/jira/skills/status-analysis/scripts/validate_feature_updates.py \
--markdown /tmp/feature-updates.md \
--data-dir .work/weekly-status/{date}/issues/
If violations are found, fix them before converting to HTML.
markdown library:import markdown
with open("/tmp/feature-updates.md") as f:
html = markdown.markdown(f.read())
with open("/tmp/feature-updates.html", "w", encoding="utf-8") as f:
f.write("""<!DOCTYPE html>
<html><head>
<meta charset="utf-8">
<style>
body { font-family: Arial, sans-serif; max-width: 800px; margin: 40px auto; line-height: 1.6; font-size: 11pt; }
a { color: #1a73e8; text-decoration: none; }
a:hover { text-decoration: underline; }
ul { margin-bottom: 0.5em; }
li { margin-bottom: 0.3em; }
</style></head><body>
""")
f.write(html)
f.write("</body></html>")
python3 {plugins-dir}/jira/skills/status-analysis/scripts/validate_feature_updates.py \
--html /tmp/feature-updates.html
If validation fails (missing charset, mojibake detected), regenerate the HTML using the template above before proceeding. Do not serve HTML that fails this check.
python3 -m http.server 8787 --directory /tmp --bind 127.0.0.1
Serving feature updates at: http://localhost:8787/feature-updates.html
Open in your browser, select all (Ctrl+A / Cmd+A), copy (Ctrl+C / Cmd+C), and paste into Google Docs.
The server will be stopped when you confirm you're done.
With project and component (recommended):
/jira:generate-feature-updates OCPSTRAT --component "Hosted Control Planes"
Output: Gathers data, analyzes all matching issues, presents feature updates section
With label filter:
/jira:generate-feature-updates OCPSTRAT --label strategic-work
With specific users:
/jira:generate-feature-updates OCPSTRAT --component "Hosted Control Planes" [email protected]
Serve as HTML for Google Docs pasting:
/jira:generate-feature-updates OCPSTRAT --component "Hosted Control Planes" --serve
Full example with all options:
/jira:generate-feature-updates OCPSTRAT --component "Control Plane" --label strategic-work [email protected] [email protected] --serve
Example Output:
- 🟢 [OCPSTRAT-2426](https://issues.redhat.com/browse/OCPSTRAT-2426): Customer global pull secret in HCP for ROSA
- Scope reduced to Managed OpenShift and platforms using node replacement strategy. E2E tests are already passing.
- 🟡 [OCPSTRAT-1409](https://issues.redhat.com/browse/OCPSTRAT-1409): Auto backup/restore for Hosted Clusters
- A bug found in the implementation has highlighted a permission gap that we are going to cover with better UX.
- 🟢 [OCPSTRAT-1558](https://issues.redhat.com/browse/OCPSTRAT-1558): Shared ingress for HCP
- Contributor X's PR #7143 landed this week, completing the core shared ingress controller. Integration tests are passing on AWS.
project-key (optional): The Jira project key (e.g., OCPSTRAT, OCPBUGS). If not provided, prompts for selection--component <name> (optional): Filter by specific component name. If not provided, prompts for selection--label <label-name> (optional): Filter by specific label (e.g., control-plane-work, strategic-work)user-filters (optional): Space-separated list of user emails or display names
--serve (optional): Convert output to HTML and serve on localhost for copy/paste into Google DocsTwo-Phase Execution:
Batch Processing (key difference from update-weekly-status):
No Jira Writes:
Significant Activity Filter:
Error Handling:
aiohttp package installedJIRA_TOKEN or JIRA_PERSONAL_TOKEN: Jira API bearer tokenGITHUB_TOKEN or authenticated gh CLI--serve: Python markdown package (pip install markdown)Check for required tools:
# Check Python and aiohttp
python3 -c "import aiohttp; print('aiohttp OK')"
# Check if the Jira token is defined
test -n "$JIRA_TOKEN"
# Check GitHub token (via gh CLI)
gh auth token &> /dev/null
# Check markdown library (for --serve)
python3 -c "import markdown; print('markdown OK')"
plugins/jira/skills/status-analysis/SKILL.mdplugins/jira/skills/status-analysis/scripts/gather_status_data.pyplugins/jira/skills/status-analysis/scripts/validate_feature_updates.py/jira:status-rollup - Generate comprehensive status comment for one issue/jira:update-weekly-status - Update Status Summary field for multiple issuesnpx claudepluginhub openshift-eng/ai-helpers --plugin jira/statusGenerates a weekly project status report by collecting Linear sprint data (completed/total issues, category breakdown, carryovers) and writes a structured markdown report with executive summary, KPIs, risks, and next-week plans.
/statusSummarizes project state, backlog health, and next work items. Also supports per-feature and backlog-only subcommands.
/health-check-jirasQueries JIRA bugs for a specified project and generates summary statistics with counts by status, priority, and component. Supports filtering by component, team, status, and inclusion of closed bugs.
/stakeholder-updateGenerates tailored stakeholder updates by audience (exec, engineering, customer) using Pyramid Principle. Pulls live tracker state from Linear/Jira and formats according to audience preferences. Accepts initiative name or 'all' for weekly digest.
/issue-listLists and filters tickets from supported backends (GitHub, Jira, Linear, Gitea) or local files, with status, label, assignee filters and table/JSON/markdown output.
/project-statusDelivers a comprehensive project status report with executive summary, progress metrics, blocker analysis, workload insights, and historical comparison. Supports optional focus arguments (sprint, blocked, team, timeline, risk) for tailored analysis.