Adds ivona (invoice-checker, timesheet-checker) and timesheet (check-my-timesheet, invoice-prep) as new plugins, plus invoice-prep-test — a one-off experiment that requests the Tempo API token via plugin userConfig at install time instead of a .env file, to check whether that value actually reaches the skill's script. Also adds the root LICENSE (MIT) referenced from the README.
3.4 KiB
| name | description |
|---|---|
| invoice-prep | Show what to put on an invoice for a selected month by checking the user's own Tempo timesheets. Lists every Jira project code and the total hours logged against it. Warns if there are missing hours or days with no logged time. TRIGGER when user asks what to put on an invoice, what to invoice, invoice preparation, timesheet summary for invoicing, or similar phrases. Trigger phrases: "what should I put on an invoice", "prepare my invoice", "invoice for [month]", "what to invoice for", "check my TS for invoice". |
Invoice Preparation
Use this skill when someone wants to know what project codes and hours to put on their invoice for a given month. It reads their own Tempo worklogs, groups hours by Jira project, and warns about any missing time.
In Claude Code, you run the pipeline automatically. The user provides a month — you handle everything else.
Prerequisites
Uses the same credentials as the timesheet-checker — no extra setup needed:
| Variable | Purpose |
|---|---|
TEMPO_API_TOKEN |
Fetch worklogs from Tempo |
JIRA_BASE_URL |
Resolve the user's account ID |
JIRA_EMAIL |
Identifies whose timesheets to read |
JIRA_API_TOKEN |
Authenticate with Jira |
All four must be present in the .env file in the project root.
Extracting the month
Convert natural language to YYYY-MM before running:
| User says | CLI value |
|---|---|
| "last month" | Previous calendar month |
| "this month" | Current calendar month |
| "June", "June 2026" | 2026-06 |
| "May" | 2026-05 (current year) |
If no month is specified, ask: "Which month should I check? (e.g. last month, June 2026)"
Workflow
Step 1 — Run the script:
python3 {SKILL_DIR}/scripts/run.py \
--month {YYYY-MM} \
--output-dir ./timesheet-output
This resolves the user's Jira account, fetches their Tempo worklogs for the full calendar month, groups hours by Jira project code, checks completeness against the Polish working calendar, and writes invoice_prep_{YYYY-MM}.json to ./timesheet-output/.
Step 2 — Present results. Read the output JSON and show the user:
-
A table of project codes and hours — formatted ready to copy onto an invoice. Include every project in the
projectsarray. Do NOT label any project as "non-billable" or omit it from the table — the script already excludes ignored issues; everything remaining is billable:| Project | Hours | | IAA | 45.5 | | PROJ | 22.0 |Below the table, note ignored issues and their hours as a parenthetical:
(INTERNAL-1: 40h ignored per config.)— do not mix them into the billable table. -
The total billable hours from
total_billable_hours(nottotal_logged_hours). -
If
missing_hours > 0: a clear warning showing:- How many hours are missing vs the expected total for the month
- Which specific dates have no logged time (up to 10; if more, show count)
- Reminder to complete the timesheet before issuing the invoice
-
If
total_logged_hours == 0: warn that no hours were found at all for the month.
Guardrails
- Never fabricate or estimate hours. All data comes from Tempo.
- If
JIRA_EMAILis not set, stop and tell the user. - If any script step fails, show the error and stop.
- Always remind the user that incomplete timesheets will cause Jira compliance failures when the invoice is checked.