← ClaudeAtlas

issue-invoicelisted

Fill a monthly hourly invoice on Google Sheets from GitHub PRs and Jira tickets, one tab per month per client. Use when the user mentions an invoice, timesheet, billable hours, logging monthly work, rolling over an invoice month, or reconciling PRs and tickets to hours.
vanducng/skills · ★ 8 · AI & Automation · score 81
Install: claude install-skill vanducng/skills
# issue-invoice Monthly hourly invoicing for contract clients. One Google Sheet per client, one tab per month (`202607`, `202608`, ...). Rows are billable work reconciled from GitHub PRs, linked to their tracker tickets, plus meeting rows. Every client-specific value - spreadsheet id, org, repos, Jira host, rate - lives in a private rules file **outside this repo**. This skill ships no client data. ## Client rules ``` ~/.config/vd/invoice-rules/<client>.invoice-rules.md ``` YAML frontmatter is machine-read by the harvest script; the prose below it is for you. See `references/client.invoice-rules.example.md` for the schema and copy it to onboard a new client. ```bash scripts/harvest-prs.py --list # configured clients ``` Read the whole rules file before drafting rows. It defines the tab layout, column formats, hour calibration, meeting cadence, and client quirks - all of which vary. **Never write a client value into this skill.** If something is true for one client only, it belongs in that client's rules file. ## Workflow ### 1. Read current state first ```bash export GOG_HOME="$HOME/.config/vd/gog" ACCT=<gog_account from rules, --account org with --user person> SID=<spreadsheet from rules frontmatter> gog --account "$ACCT" sheets metadata "$SID" --json # FORMULA or the next write flattens HYPERLINK/SUM gog --account "$ACCT" sheets get "$SID" '<tab>!A1:F60' --render FORMULA --json ``` Locate the Total row and its exact `SUM` ranges - they drift as rows a