From devcats-reports
Generate a monthly performance report in Russian for ONE employee from Jira (jira.demo.io). The employee's email and the month are given in the request in natural language, e.g. «отчёт [email protected] за февраль», «report по [email protected] за прошлый месяц», «месячный отчёт сотрудника за март 2025». Use this skill whenever the user asks for an individual / per-person monthly report, «месячный отчёт по сотруднику», «отчёт за <месяц> по <email>», or names a single email together with a month — even if they don't say the word «отчёт» explicitly. This is the INDIVIDUAL monthly report and is configured independently from the team weekly report; do not reuse the weekly roster or its rules here.
How this skill is triggered — by the user, by Claude, or both
Slash command
/devcats-reports:ai-employee-monthly-reportThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generates a factual, natural-language **monthly** report on a **single
Generates a factual, natural-language monthly report on a single employee's Jira activity, written in Russian in the first person (as if the employee is reporting on their own work for the period). The employee is identified by an email passed in the request, and the month is given in natural language.
This skill is deliberately separate from the team weekly report. It keeps its own status mapping and its own wording rules, so you can tune individual reports without touching the team report and vice-versa.
If the request names several people or no email at all, this is probably not the right skill — ask the user for the one email, or point them to the team report.
Follow these steps in order.
Before doing anything else, verify that the Jira MCP is available by checking
whether the tool jira_search (MCP: jira) is listed in your current tool
set. If it is not available, stop immediately and show this error to the
user:
❌ Ошибка: MCP-коннектор Jira недоступен.
Для работы скилла необходим подключённый Jira MCP.
Проверьте настройки подключения и попробуйте снова.
Do not attempt to generate a report without this MCP.
Pull the employee email straight from the request. If it is missing, ask for it — never invent one.
Resolve the month window with the helper script (run it from the skill directory). It accepts natural-language month specs and prints the exact date range as JSON:
python scripts/month_window.py "февраль"
python scripts/month_window.py "март 2025"
python scripts/month_window.py "прошлый месяц"
python scripts/month_window.py # no arg -> current month
Output fields:
start — inclusive lower bound (YYYY-MM-01).end_exclusive — exclusive upper bound for JQL. For a finished month this is
the 1st of the next month; for the current month it is tomorrow, so
the window runs from the 1st through today inclusive.end_inclusive — the last day actually covered, for display only.label — human label like «февраль 2026», for the intro.is_current_month — whether the month is still in progress.The month rule: always from the 1st of the month at 00:00, through the last day of the month — or, if it is the current month, through today inclusive. A month name without a year means the most recent past occurrence (if the named month is later than the current month, it belongs to last year).
Issue a single jira_search with this JQL, substituting the email and the two
dates from step 1 (covers tasks, bugs, and every other issue type, filtered by
the exact workflow statuses this team uses):
assignee = "EMAIL" AND (
(resolutiondate >= "START" AND resolutiondate < "END_EXCLUSIVE" AND status in ("Done", "To release", "to merge", "On merge", "Cancelled", "To review", "to test", "Feature test", "Ready for Testing"))
OR
(updated >= "START" AND updated < "END_EXCLUSIVE" AND status in ("Pause", "Accepted", "In Progress"))
) ORDER BY status DESC
Completed tasks are filtered by resolutiondate (Дата решения); in-progress
tasks have no resolutiondate so they are filtered by updated instead.
Set fields to: summary,status,assignee,issuetype,resolutiondate,updated,description.
A month can hold many issues, so set limit to 50 and paginate with start_at
if total exceeds what was returned — make sure you pull the whole month.
Notes on the response shape (Jira Server/DC at jira.demo.io):
issues[].key, issues[].summary, issues[].description.issues[].status.name is the only grouping key — match it
case-insensitively against the status lists in step 4.issues[].status.category completely. It does not match this
team's grouping (e.g. «Ready for Testing» carries category «В работе» but is a
Completed status here). Always group by status.name, never by category.issues[].issue_type.name (e.g. «Задача», «Ошибка»/bug, «Dev Task»).Aggregate all issues into a single list for the report.
If a summary is too terse to understand at all, call jira_get_issue for that
key (fields: "summary,description,issuetype,status") just to grasp the gist.
Do this only for the few issues that need it. Use the description only to
extract the essence; never copy long descriptions into the report.
Compose the report in Russian using only factual data from Jira, written from the employee's point of view (first person — «я выполнил», «реализовал», «сейчас работаю над»). Rules:
The report has exactly two sections in this order. Each section opens with its fixed phrase — that phrase IS the section divider. Do not add any separate header, title, or label before or after it (no «Завершённые задачи», no «Задачи в работе», no bold heading of any kind):
Completed — first line of the entire report, verbatim: «За этот месяц я выполнил следующие задачи:» Statuses that belong here: Done, To release, to merge, On merge, Cancelled, To review, to test, Feature test, Ready for Testing.
In Progress — first line of the second section, verbatim: «Сейчас в работе у меня находятся следующие задачи:» Statuses that belong here: Pause, Accepted, In Progress.
Match status names case-insensitively. Group strictly by status.name — never
by status.category. In particular, «Ready for Testing», «to test»,
«To review», «to merge», «On merge», «Feature test» go to Completed even
if their Jira category says «В работе».
Room, Compose BOM, Timber, SharedPreferences, CoroutineScope,
!!-operators, specific annotation names). Describe what was done and
why, not how at the code level. For example: instead of «заменил
CoroutineScope на viewModelScope» write «доработал асинхронные вызовы»;
instead of «Fragment-ktx, Room, Compose BOM» write «обновил библиотеки до
актуальных версий».scripts/month_window.py — resolve a natural-language month into an exact
start / end_exclusive date window.Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub r-mobile/claude_skill_team_report