From jira
Automates weekly status updates for Jira issues by analyzing recent activity across tickets, GitHub PRs, and GitLab MRs, then drafting color-coded status summaries (Red/Yellow/Green) for review and batch update.
How this command is triggered — by the user, by Claude, or both
Slash command
/jira:update-weekly-status [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:update-weekly-status ## Synopsis ## Description The `jira:update-weekly-status` command automates the process of updating weekly status summaries for Jira issues in a specified project. It analyzes recent activity across tickets, GitHub PRs, and GitLab MRs to draft color-coded status updates (Red/Yellow/Green), then allows you to review and modify them before updating Jira. This command is particularly useful for: - Weekly status updates on strategic issues - Team lead status reporting workflows - Consistent formatting across status updates - Reducing manual effort in g...
jira:update-weekly-status
/jira:update-weekly-status [project-key] [--component <component-name>] [--label <label-name>] [user-filters...]
The jira:update-weekly-status command automates the process of updating weekly status summaries for Jira issues in a specified project. It analyzes recent activity across tickets, GitHub PRs, and GitLab MRs to draft color-coded status updates (Red/Yellow/Green), then allows you to review and modify them before updating Jira.
This command is particularly useful for:
Key capabilities:
parent = KEY JQL for full hierarchy traversal (Atlassian Cloud compatible)This command uses the Status Analysis Engine skill for core analysis logic. See plugins/jira/skills/status-analysis/SKILL.md for detailed implementation.
[Extended thinking: This command streamlines weekly status update workflows by first gathering all data efficiently using an async Python script, then processing each issue with focused LLM context. This two-phase approach minimizes API calls and ensures consistent, high-quality analysis.]
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:
getVisibleJiraProjects to list all accessible projectsValidate project access:
searchJiraIssuesUsingJql with JQL: project = "{project-key}" AND status != ClosedAfter determining the project key, check if project-specific conventions exist that override default behavior. These can change issue type filtering, status format, milestone prioritization, and data gathering JQL.
Known project mappings:
| Project Key | Source | Key Overrides |
|---|---|---|
| ARO | Read ../reference/aro-hcp.md | Only Features/Initiatives; milestone tiers (HPSTRAT-63/130); prepend format with date stamp |
| CNTRLPLANE | Read ../reference/cntrlplane.md | CNTRLPLANE-specific conventions |
| GCP | Read ../reference/gcp-hcp.md | GCP HCP team requirements |
| OCPBUGS | Read ../reference/ocpbugs.md | OCPBUGS bug conventions |
Implementation:
Read the reference file or invoke the Skill)IMPORTANT: The project-specific conventions MUST be loaded before Step 2 (component selection) and before Step 4 (data gathering), because they can change both the JQL used and the issue types collected.
If --component parameter is provided:
If --component is NOT provided:
searchJiraIssuesUsingJql 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 @):
lookupJiraAccountId with the name as the search stringHandle 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}/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Process each issue one at a time, loading fresh context for each.
This step is mandatory before processing any issues:
Skill(jira:status-analysis)
This loads the Status Analysis Engine skill which provides:
For each issue listed in the manifest:
Use the summarize_issue.py script to extract a structured, human-readable summary from the pre-gathered JSON. This avoids reading large JSON files directly (which can exceed context limits) and produces output optimized for LLM analysis.
python3 {plugins-dir}/jira/skills/status-analysis/scripts/summarize_issue.py \
{ISSUE-KEY} --date-dir .work/weekly-status/{date}
The script outputs a structured summary with sections for:
date by author: field: old -> new)Script location: plugins/jira/skills/status-analysis/scripts/summarize_issue.py
The underlying JSON file is at .work/weekly-status/{date}/issues/{ISSUE-KEY}.json if you need to read additional details not shown in the summary.
Using the pre-gathered data, apply the activity analysis rules from activity-analysis.md:
Identify 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)Determine health status:
Format using ryg_field template:
- Color Status: {Red, Yellow, Green}
- Status summary:
- Thing 1 that happened since last week
- Thing 2 that happened since last week
- Risks:
- Risk 1 (or "None at this time")
If Status Summary was updated within last 24 hours:
⚠️ WARNING: This issue's Status Summary was last updated X hours ago (on YYYY-MM-DD at HH:MM).
Current Status Summary:
{current-status-text}
Ask: "This issue was recently updated. Do you want to skip it? (yes/no/show-proposed)"
For all issues (or if proceeding after warning):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Issue: {ISSUE-KEY} - {Summary}
Assignee: {Assignee Name}
Current Status: {Current Issue Status}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Recent Activity Analysis:
• Descendants: {total} total, {updated_in_range count} updated this week
• Completion: {completion_pct}% ({by_status breakdown})
• PRs: {count} ({merged} merged, {open} open, {draft} drafts)
• Commits in range: {total commits across PRs}
• Reviews in range: {total reviews across PRs}
Current Status Summary:
{existing-status-text-or-"None"}
Proposed Status Update:
{drafted-status-update}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Options:
approve or a: Proceed with the proposed updatemodify or m: Modify the text (prompt for new text)skip or s: Skip this issue and move to nextquit or q: Stop processing remaining issuesIf user chooses modify:
- Color Status:)Use editJiraIssue with contentFormat: "markdown" to set customfield_10814 (Status Summary) to the formatted status text.
Display confirmation: ✓ Updated {ISSUE-KEY}
After processing all issues (or if user quits early):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Weekly Status Update Summary
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Project: {PROJECT-KEY}
Component: {COMPONENT-NAME or "All components"}
Label Filter: {LABEL or "None"}
Date Range: {start} to {end}
Total Issues Found: {total}
Issues Updated: {updated-count}
• Green: {green-count}
• Yellow: {yellow-count}
• Red: {red-count}
Issues Skipped: {skipped-count}
• Recently updated: {recent-count}
• User skipped: {user-skip-count}
Updated Issues:
{list-of-updated-issue-keys-with-links}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
The Python script (gather_status_data.py) handles efficient batch data collection:
JIRA_API_TOKEN: Atlassian API token (create at https://id.atlassian.com/manage-profile/security/api-tokens)
JIRA_USERNAME: Atlassian account emailGITHUB_TOKEN or gh auth token: GitHub access token.work/weekly-status/{YYYY-MM-DD}/
├── manifest.json # Config and issue list
└── issues/
├── OCPSTRAT-1234.json # Per-issue data
├── OCPSTRAT-1235.json
└── ...
{
"issue": {
"key": "string",
"summary": "string",
"status": "string",
"assignee": {"email": "string", "name": "string"},
"current_status_summary": "string|null",
"last_status_summary_update": "string|null"
},
"descendants": {
"total": "number",
"by_status": {"status_name": "count"},
"updated_in_range": [
{"key": "string", "summary": "string", "status": "string", "updated": "string"}
],
"completion_pct": "number"
},
"changelog_in_range": [
{"date": "string", "author": "string", "items": [...]}
],
"comments_in_range": [
{"author": "string", "date": "string", "body": "string", "is_bot": "boolean"}
],
"prs": [
{
"url": "string",
"number": "number",
"title": "string",
"state": "OPEN|CLOSED|MERGED",
"is_draft": "boolean",
"review_decision": "string|null",
"dates": {"created_at": "string", "updated_at": "string", "merged_at": "string|null"},
"files_changed": {"total": "number", "additions": "number", "deletions": "number"},
"activity_summary": {
"commits_in_range": "number",
"reviews_in_range": "number",
"review_comments_in_range": "number"
}
}
]
}
With project, component, and label (recommended):
/jira:update-weekly-status OCPSTRAT --component "Hosted Control Planes" --label "control-plane-work"
Output: Runs data gatherer, then processes each issue interactively
Interactive mode (prompts for project and component):
/jira:update-weekly-status
Output: Prompts for project selection, then component selection
Specify project, auto-select component:
/jira:update-weekly-status OCPSTRAT
Output: Prompts for component selection from OCPSTRAT components
With label filter:
/jira:update-weekly-status OCPSTRAT --label strategic-work
Output: Prompts for component, filters issues with "strategic-work" label
With specific users (by email):
/jira:update-weekly-status OCPBUGS [email protected] [email protected]
Output: Only processes issues assigned to Antoni or Jane
With excluded users (by email):
/jira:update-weekly-status OCPSTRAT [email protected]
Output: Processes all issues except those assigned to [email protected]
With usernames (requires confirmation):
/jira:update-weekly-status OCPSTRAT "Antoni Segura" "Jane Doe"
Output: Looks up users by name, asks for confirmation, then processes their issues
Full example with all options:
/jira:update-weekly-status OCPSTRAT --component "Control Plane" --label strategic-work [email protected] [email protected]
Output: Processes OCPSTRAT issues in "Control Plane" component with "strategic-work" label, assigned to Antoni, excluding Dave
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
Two-Phase Execution:
Efficiency:
User Experience:
Error Handling:
Format Validation:
aiohttp package installedJIRA_API_TOKEN: Atlassian API token (create at https://id.atlassian.com/manage-profile/security/api-tokens)JIRA_USERNAME: Atlassian account emailGITHUB_TOKEN or authenticated gh CLICheck for required tools:
# Check Python and aiohttp
python3 -c "import aiohttp; print('aiohttp OK')"
# Check if the Jira credentials are defined
test -n "$JIRA_API_TOKEN" && test -n "$JIRA_USERNAME"
# Check GitHub token (via gh CLI)
gh auth token &> /dev/null
Install aiohttp if needed:
pip install aiohttp
Teams can customize this command by:
--status-field parameter)See the Jira plugin's skills directory for examples of project-specific customizations.
plugins/jira/skills/status-analysis/SKILL.mdplugins/jira/skills/status-analysis/scripts/gather_status_data.pyplugins/jira/skills/status-analysis/scripts/summarize_issue.py/jira:status-rollup - Generate comprehensive status comment for one issue/jira:generate-feature-updates - Generate strategic feature updates for weekly status documentsnpx claudepluginhub openshift-eng/ai-helpers --plugin jira/list-jirasQueries JIRA for raw bug data of a specified project, returning complete issue fields and metadata without summarization.
/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.
/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.
/syncBi-directionally syncs local dev progress with Jira: pulls issue details/changes, pushes comments/status/PRs, detects/resolves conflicts, updates checkpoints.