$npx -y skills add opendatahub-io/ai-helpers --skill engineer-snapshotGenerate an engineer activity snapshot showing active JIRA issues with days open, blocked work, upstream PRs awaiting review, recently merged PRs, and open action items from 1:1 notes. Requires a team config YAML file. Use when the user asks to review an engineer's status, check
| 1 | # Engineer Snapshot |
| 2 | |
| 3 | Generate a per-engineer activity snapshot combining JIRA issues, GitHub |
| 4 | PR activity, and open action items from 1:1 notes. |
| 5 | |
| 6 | ## Prerequisites |
| 7 | |
| 8 | - `acli` must be installed and authenticated (`acli jira auth`) |
| 9 | - `gh` CLI must be installed and authenticated (`gh auth login`) |
| 10 | - `jq` and `yq` must be installed and available in PATH |
| 11 | - A team config YAML file (see Config Format below) |
| 12 | |
| 13 | ## Config Format |
| 14 | |
| 15 | Create a YAML file with your team's details (same format as |
| 16 | `team-weekly-report`): |
| 17 | |
| 18 | ```yaml |
| 19 | team: |
| 20 | name: "My Team" |
| 21 | jira: |
| 22 | url: "https://mycompany.atlassian.net" |
| 23 | project: "PROJ" |
| 24 | component: "MyComponent" # optional |
| 25 | github: |
| 26 | repositories: |
| 27 | - "org/repo1" |
| 28 | - "org/repo2" |
| 29 | members: |
| 30 | - name: "Engineer One" |
| 31 | jira_username: "712020:account-id-here" |
| 32 | github_username: "eng1" |
| 33 | notes_file: "notes/engineer_one.md" # optional |
| 34 | defaults: |
| 35 | jira_lookback_days: 7 |
| 36 | github_lookback_days: 7 |
| 37 | stale_threshold_days: 7 |
| 38 | ``` |
| 39 | |
| 40 | ## Implementation |
| 41 | |
| 42 | ### Step 1: Parse Arguments |
| 43 | |
| 44 | Parse `$ARGUMENTS` for: |
| 45 | |
| 46 | - **Engineer name** (required): first positional argument |
| 47 | - **`--config PATH`** (required): path to team config YAML |
| 48 | - **`--jira-days N`** (optional): JIRA lookback for stale threshold |
| 49 | - **`--github-days N`** (optional): GitHub lookback for merged PRs |
| 50 | |
| 51 | If the engineer name is missing, ask: |
| 52 | |
| 53 | > "Which engineer should I generate a snapshot for?" |
| 54 | |
| 55 | If `--config` is missing, ask: |
| 56 | |
| 57 | > "Which team config file should I use? Provide the path to your YAML |
| 58 | > config file." |
| 59 | |
| 60 | ### Step 2: Load Config |
| 61 | |
| 62 | Read the config file to extract the engineer's details: |
| 63 | |
| 64 | - `github_username` — needed for GitHub PR queries |
| 65 | - `notes_file` — path to 1:1 notes (if configured) |
| 66 | - `team.github.repositories` — repos to search for PRs |
| 67 | - `defaults.github_lookback_days` — fallback for `--github-days` |
| 68 | |
| 69 | ### Step 3: Fetch JIRA Data |
| 70 | |
| 71 | Run the JIRA fetch script to get active and blocked issues: |
| 72 | |
| 73 | ```bash |
| 74 | "${CLAUDE_SKILL_DIR}/scripts/fetch_engineer_jira.sh" \ |
| 75 | --config <CONFIG_PATH> \ |
| 76 | --engineer "<ENGINEER_NAME>" |
| 77 | ``` |
| 78 | |
| 79 | The script outputs JSON with `active_issues` and `blocked_issues` |
| 80 | arrays. Each issue includes a `days_open` field showing how many days |
| 81 | since creation. Capture the full JSON output. |
| 82 | |
| 83 | ### Step 4: Fetch Upstream PRs Open for Review |
| 84 | |
| 85 | For each repository in the config, query for the engineer's open PRs |
| 86 | using the `gh` CLI: |
| 87 | |
| 88 | ```bash |
| 89 | gh search prs \ |
| 90 | --author=<GITHUB_USERNAME> \ |
| 91 | --repo=<REPO> \ |
| 92 | --state=open \ |
| 93 | --json number,title,url,createdAt,updatedAt \ |
| 94 | --limit 50 |
| 95 | ``` |
| 96 | |
| 97 | Run this command once per repository. Collect all results. |
| 98 | |
| 99 | ### Step 5: Fetch Upstream PRs Merged Recently |
| 100 | |
| 101 | For each repository, query for recently merged PRs. Use |
| 102 | `--github-days N` if provided, otherwise use the |
| 103 | `defaults.github_lookback_days` value from config (fallback: 7): |
| 104 | |
| 105 | ```bash |
| 106 | gh search prs \ |
| 107 | --author=<GITHUB_USERNAME> \ |
| 108 | --repo=<REPO> \ |
| 109 | --merged \ |
| 110 | --json number,title,url,createdAt,mergedAt \ |
| 111 | --limit 50 \ |
| 112 | -- "merged:>=<CUTOFF_DATE>" |
| 113 | ``` |
| 114 | |
| 115 | Where `<CUTOFF_DATE>` is today minus the lookback days in `YYYY-MM-DD` |
| 116 | format. Run once per repository. |
| 117 | |
| 118 | ### Step 6: Read 1:1 Notes |
| 119 | |
| 120 | If the engineer has a `notes_file` configured in the team config, read |
| 121 | it using the `Read` tool. Look for open action items by searching for: |
| 122 | |
| 123 | - Unchecked markdown checkboxes: `- [ ]` |
| 124 | <!-- skillsaw-disable content-placeholder-text --> |
| 125 | - Sections titled "Action Items", "Follow-ups", or "TODO" |
| 126 | |
| 127 | If no `notes_file` is configured, skip this step and note it in the |
| 128 | output. |
| 129 | |
| 130 | ### Step 7: Produce the Snapshot |
| 131 | |
| 132 | Combine all collected data and produce the snapshot in the format below. |
| 133 | Base everything on actual data — do not assume or invent. |
| 134 | |
| 135 | For each active JIRA issue, calculate the age by comparing `days_open` |
| 136 | to today. Flag issues that are significantly older than the team average. |
| 137 | |
| 138 | ## Output Format |
| 139 | |
| 140 | ```markdown |
| 141 | # Engineer Snapshot — <Engineer Name> |
| 142 | |
| 143 | **Generated:** <current_date> |
| 144 | **Active Issues:** <count> | **Blocked:** <count> | **Open PRs:** <count> |
| 145 | |
| 146 | ## Active JIRA Issues |
| 147 | |
| 148 | | Key | Summary | Status | Days Open | Priority | |
| 149 | |-----|---------|--------|-----------|----------| |
| 150 | [List all active issues sorted by days-open descending. |
| 151 | Flag issues open > 14 days with a warning indicator.] |
| 152 | |
| 153 | ## Blocked Issues |
| 154 | |
| 155 | | Key | Summary | Days Open | Priority | |
| 156 | |-----|---------|-----------|----------| |
| 157 | [List blocked issues. If none: "No blocked issues."] |
| 158 | |
| 159 | ## Upstream PRs Awaiting R |