| name | review-work |
| description | Levantamento de atividade de um membro do time (GitHub + JIRA) durante uma sprint. Aceita nome, GitHub username ou parte do nome e opcionalmente o numero da sprint. |
| argument-hint | <name-or-username> [sprint-number] |
| allowed-tools | Bash(gh *), Bash(jira *), Bash(date *), Bash(echo *), Bash(SPRINT_*), Bash(START_*), Bash(END_*), Bash(PAGE=*), Bash(EVENTS=*), Bash(JIRA_USER=*), Bash(MEMBERS=*), Bash(MATCH=*) |
Review Work
Levanta a atividade de uma pessoa no GitHub e JIRA durante uma sprint.
Argumentos
$ARGUMENTS: Primeiro token e o nome ou GitHub username da pessoa (obrigatorio). Segundo token (opcional) e o numero da sprint (inteiro). Se omitido, usa a sprint ativa.
Exemplos:
/review-work tirth — sprint ativa, resolve para tirthct
/review-work tirthct 6 — sprint 6
/review-work leonardo — resolve pelo nome real
/review-work angel — resolve para rh-amarin
Instrucoes
1. Parsear argumentos
Extraia do $ARGUMENTS:
INPUT: primeiro token (nome ou GitHub username)
SPRINT_NUM: segundo token (numero inteiro, opcional)
Se INPUT estiver vazio, informe ao usuario que o nome/username e obrigatorio e pare.
2. Resolver GitHub username
O usuario pode fornecer um GitHub username exato, um nome parcial, ou o primeiro nome da pessoa.
2a. Buscar membros da org
Busque todos os membros da org via GitHub API (inclui membros que podem nao estar no OWNERS de repos individuais):
gh api orgs/openshift-hyperfleet/members --jq '.[].login'
Filtre bots conhecidos da lista (nomes que contenham bot, robot, cyborg).
Se a API falhar (ex: permissao insuficiente), use o OWNERS file como fallback:
gh api repos/openshift-hyperfleet/hyperfleet-sentinel/contents/OWNERS --jq '.content' | base64 --decode
2b. Buscar nomes reais
Para cada username da lista, busque o nome real via GitHub API:
gh api "users/<USERNAME>" --jq '.name // ""'
Construa uma lista de pares username|nome_real.
2c. Fazer match
Compare o INPUT (case-insensitive) contra:
- GitHub username (match exato ou parcial — ex:
tirth casa com tirthct)
- Nome real (match parcial — ex:
leonardo casa com um nome que contenha "leonardo", angel casa com "Angel Marin")
Regras de match:
- Se match unico: usar esse username automaticamente
- Se multiplos matches: mostrar lista e pedir ao usuario para escolher
- Se nenhum match: mostrar todos os membros disponiveis e pedir ao usuario para escolher
Exemplo de lista quando ha ambiguidade:
Multiplos matches para "a":
1. aredenba-rh (Austin Redenbaugh)
2. rh-amarin (Angel Marin)
Qual o numero do usuario desejado?
3. Obter dados da sprint
3a. Descobrir sprint ativa (se SPRINT_NUM nao informado)
Busque qualquer ticket na sprint ativa para extrair os dados:
jira issue list --project HYPERFLEET --jql "sprint in openSprints()" --plain --columns KEY --paginate "0:1"
Depois pegue os dados da sprint do ticket:
jira issue view <KEY> --raw | jq -r '.fields.customfield_10020[-1]'
O campo retorna um objeto JSON como:
{"id": 15607, "name": "Hyperfleet Sprint 8", "state": "active", "boardId": 1013, "startDate": "2026-03-16T10:08:33.743Z", "endDate": "2026-04-06T09:00:00.000Z"}
Extraia name, startDate e endDate diretamente do objeto.
3b. Buscar sprint por numero (se SPRINT_NUM informado)
Use JQL com o nome da sprint:
jira issue list --project HYPERFLEET --jql "sprint = 'Hyperfleet Sprint <SPRINT_NUM>'" --plain --columns KEY --paginate "0:1"
Depois extraia os dados da sprint do ticket retornado, da mesma forma que em 3a. Procure no array customfield_10020 a entrada cujo name contenha o numero da sprint solicitado.
Se nenhum ticket for encontrado, informe ao usuario que a sprint nao foi encontrada e pare.
4. Buscar atividade no GitHub
Use a Events API do GitHub para buscar toda a atividade do usuario no periodo da sprint. A API retorna no maximo 300 eventos e pagina em paginas de 30.
Busque todas as paginas necessarias:
gh api "users/<GH_USER>/events?per_page=100&page=1" --jq '.[] | select(.created_at >= "<START_DATE>" and .created_at <= "<END_DATE>") | [.type, .created_at, .repo.name, (if .type == "PushEvent" then (.payload.ref // "") else "" end), (if .type == "PullRequestEvent" or .type == "PullRequestReviewEvent" or .type == "PullRequestReviewCommentEvent" then (.payload.pull_request.number | tostring) else "" end), (if .type == "IssueCommentEvent" then (.payload.issue.number | tostring) else "" end)] | @tsv'
Continue paginando (page=2, page=3, etc) ate a API retornar array vazio ou todos os eventos estarem fora do periodo da sprint.
Tipos de evento relevantes:
PushEvent — push de commits (registrar repo, branch)
PullRequestEvent — abriu/fechou/reabriu PR
PullRequestReviewEvent — review formal (approve, request changes)
PullRequestReviewCommentEvent — comentario inline em review
IssueCommentEvent — comentario geral em issue/PR
CreateEvent — criou branch/tag/repo
5. Buscar atividade no JIRA
5a. Descobrir o JIRA username
O GitHub username nem sempre e igual ao JIRA username. Tente encontrar o JIRA username buscando tickets onde o usuario e assignee ou reporter. Se nao conseguir mapear automaticamente, pergunte ao usuario qual o JIRA username da pessoa.
Estrategia: busque tickets recentes do projeto e tente encontrar um match parcial com o GitHub username no campo assignee:
jira issue list --project HYPERFLEET --jql "assignee = '<GH_USER>'" --plain --columns KEY --paginate "0:1"
Se nao encontrar, tente variantes comuns (ex: para tirthct tente tirth, tthakkar, etc). Se encontrar um ticket, extraia o JIRA username:
jira issue view <KEY> --raw | jq -r '.fields.assignee.name'
Se nenhuma variante funcionar, busque tickets recentes do projeto e compare o display name com o nome real do GitHub:
jira issue list --project HYPERFLEET --jql "updated >= '-30d'" --plain --columns KEY,ASSIGNEE --no-truncate --paginate "0:50"
Procure o display name que contenha parte do nome real da pessoa. Depois extraia o JIRA username do ticket encontrado.
5b. Tickets com atividade
Busque tickets onde o usuario foi ativo no periodo da sprint:
jira issue list --project HYPERFLEET --jql "assignee = '<JIRA_USER>' AND updated >= '<START_DATE>' AND updated <= '<END_DATE>'" --plain --columns KEY,SUMMARY,STATUS,UPDATED --no-truncate
jira issue list --project HYPERFLEET --jql "status changed by <JIRA_USER> AFTER '<START_DATE>'" --plain --columns KEY,SUMMARY,STATUS --no-truncate
jira issue list --project HYPERFLEET --jql "reporter = '<JIRA_USER>' AND created >= '<START_DATE>'" --plain --columns KEY,SUMMARY,STATUS --no-truncate
Combine e deduplique os resultados.
5c. Detalhes dos tickets
Para cada ticket encontrado, busque os detalhes para entender a atividade:
jira issue view <KEY> --raw | jq '{key: .key, summary: .fields.summary, status: .fields.status.name, assignee: (.fields.assignee.displayName // "Unassigned"), storyPoints: (.fields.customfield_10028 // null), type: .fields.issuetype.name}'
6. Consolidar e apresentar
6a. Agregar por dia
Agrupe toda a atividade (GitHub + JIRA) por dia. Para cada dia no periodo da sprint:
- Conte pushes ao fork/repos
- Conte review comments (PullRequestReviewCommentEvent conta como 1 comment cada)
- Liste PRs envolvidas (com link)
- Liste outras atividades (criacao de branches, issue comments, etc)
6b. Formato de saida
Use markdown tables (pipes |) para que links sejam renderizados como clicaveis. NAO use code blocks (```) ao redor das tabelas — markdown links nao renderizam dentro de code blocks.
Sprint: Hyperfleet Sprint N (DD MMM - DD MMM YYYY)
GitHub: <GH_USER> (<REAL_NAME>) | JIRA: <JIRA_USER>
| Data | Dia | Pushes | Review Comments | PRs | Outras atividades |
|---|
| 23 Feb | Mon | 2 | 5 | sentinel#51 | Criou branch hyperfleet-542 |
| 24 Feb | Tue | — | — | — | — |
| 25 Feb | Wed | 3 | 4 | sentinel#51 | Abriu sentinel#51 |
Regras da tabela:
- Incluir TODOS os dias do periodo da sprint, mesmo os sem atividade
- Dias sem atividade: usar
— nas colunas
- Fins de semana sem atividade: agrupar (ex: "01-02 Mar" / "Sat-Sun")
- Fins de semana COM atividade: mostrar individualmente
- PRs com link: usar formato
[repo#N](https://github.com/<org>/repo/pull/N)
- Pushes e Review Comments: mostrar contagem numerica
- Coluna "Outras atividades": issue comments, criacao de branches, aberturas de PRs
6c. Resumo JIRA
Apos a tabela, mostrar uma secao de atividade JIRA usando markdown table (sem code block):
JIRA Activity
| Ticket | Type | Summary | Status | SP |
|---|
| HYPERFLEET-542 | Story | Add OTel instrumentation to Sentinel | In Progress | 5 |
| HYPERFLEET-557 | Task | Update architecture docs | Review | 3 |
6d. Resumo final
Encerre com um paragrafo curto resumindo:
- Total de dias com atividade vs dias uteis na sprint
- Total de pushes, review comments, PRs trabalhadas
- Foco principal do trabalho (qual PR/ticket recebeu mais atencao)
- Tickets JIRA movimentados
Regras
- Use
gh CLI para GitHub e jira CLI para JIRA
- Analise em portugues
- Dias da semana em ingles (Mon, Tue, Wed, Thu, Fri, Sat, Sun)
- Meses em ingles (Jan, Feb, Mar, etc)
- Se a Events API do GitHub nao retornar dados suficientes (limite de 90 dias / 300 eventos), avise o usuario
- Se nao conseguir mapear o JIRA username, pergunte ao usuario
- Links de PRs: usar formato
[repo#N](https://github.com/<org>/repo/pull/N) — texto curto com URL completa para terminais que suportam links markdown
- Links de tickets JIRA: usar formato
[HYPERFLEET-XXX](https://redhat.atlassian.net/browse/HYPERFLEET-XXX)
- A org padrao para PRs e
openshift-hyperfleet, exceto quando o repo.name retornado pela API indicar outra org (ex: openshift/release)