donations — record itemized charitable donations
Log the goods the user donates to a charity. Each charity donation is its own
record of items — item name, quantity, and value each — with a running total.
You work entirely through the donation verbs below; the tool does all the
bookkeeping, so you never compute totals or track state yourself.
When to use
Activate when the user wants to:
- Start a donation for a charity ("start a new Goodwill donation").
- Add an item with a quantity and a per-item value ("three pairs of pants at
$5 each").
- Add more of an item already listed ("add another pair of pants").
- Ask the running total ("what's the total so far?").
- Read back what's been logged ("what have I added?").
When NOT to use
- Cash donations. This skill tracks only itemized goods (things with a
quantity and a per-item value). If the user is logging a cash gift, tell them
cash isn't handled here yet.
- Anything that isn't logging donated goods. Out of scope: general
record-keeping, lists, and math.
The tool
One script at ${HERMES_SKILL_DIR}/scripts/donations.py, invoked as
python3 <path> <verb> [args]. Each call prints ONE JSON object on stdout
({"ok": true, ...}; failures are {"ok": false, "error": "..."} with exit 1).
| Verb |
Purpose |
new --charity <name> [--date YYYY-MM-DD] |
Start a new donation for a charity (date defaults to today). It becomes the active donation. |
add --item <name> --quantity <n> --value <per> |
Add an item to the active donation. If that item is already listed, its quantity is merged (added on) instead of duplicated — and if the stated value differs from the one already recorded, the response carries a warning. |
more --item <name> [--count <n>] |
Add more of an item already listed (raise its quantity by n, default 1). |
total |
Gets the active donation's running total. |
show |
List the active donation's items and total (for read-back). |
use --donation "<name>" |
Switch which donation is active (rarely needed). |
add / more / total / show act on the active donation — the one set by
the last new (or use). You almost never pass --donation; the tool
remembers which donation is in progress.
Turning the user's words into calls
Requests come in loose, natural phrasing. Resolve to verbs BEFORE calling:
| User said |
Call |
| "start a new Goodwill donation" / "…dated for today" |
new --charity Goodwill |
| "start a Vietnam Veterans donation for July 3rd" |
new --charity "Vietnam Veterans of America" --date 2026-07-03 |
| "add three pairs of pants at $5 each" |
add --item pants --quantity 3 --value 5 |
| "add two girls' socks, value $2 each" |
add --item "girls socks" --quantity 2 --value 2 |
| "add another pair of pants" |
more --item pants |
| "add two more pairs of pants" |
more --item pants --count 2 |
| "what's the current total?" |
total |
| "what have I added / read it back" |
show |
Parsing notes:
- "N pairs of X" / "N X" →
--quantity N, --item X. A "pair"/"pairs" is
just the count word — three pairs of pants is --quantity 3, not 6.
- "$X each" / "value $X" →
--value X. Pass a plain number (5, not $5).
- Value stated →
add. No value, and the item is already listed → more.
That is the one distinction to get right.
- Pass the item as the user said it; the tool normalizes and matches it, so
"pants", "Pants", "PANTS" all land on one item.
- Once the user has started a donation, every later "add / another / total"
applies to it automatically — do NOT pass
--donation.
Output shape
new → {"ok": true, "donation": "2026-07-05 Goodwill Donation", "created": true, "total": "$0.00"}
add → {"ok": true, "donation": "...", "action": "added"|"merged", "item": "Pants", "quantity": 4, "value_per": 5.0, "total": "$20.00"}
more → {"ok": true, "action": "incremented", "item": "Pants", "quantity": 5, "total": "$25.00"}
total → {"ok": true, "donation": "...", "total": "$24.00"}
show → {"ok": true, "donation": "...", "items": [{"item":"Pants","quantity":"4","value_per":"$5.00"}, ...], "total": "$24.00"}
Always echo the confirmation back (item, new quantity, and running total) so a
mis-heard word is caught immediately — e.g. "Added 3 Pants at $5 — total $15."
If an add response includes a warning field, relay it verbatim. It means
the item was already listed at a different per-item value; the tool merged the
quantity but kept the original value (it never silently changes a price). Tell
the user both values and that the value was left unchanged, so they can fix it
deliberately if they meant to.
A typical session
"Start a new Goodwill donation, dated today."
→ new --charity Goodwill
→ "Started a Goodwill donation for today. Total $0.00."
"Add three pairs of pants at $5 each."
→ add --item pants --quantity 3 --value 5
→ "Added 3 Pants at $5 each. Total $15.00."
"Add another pair of pants."
→ more --item pants
→ "Pants now 4. Total $20.00."
"Add two girls' socks at $2 each."
→ add --item "girls socks" --quantity 2 --value 2
→ "Added 2 Girls Socks at $2 each. Total $24.00."
"What's the total?"
→ total
→ "$24.00."
When a verb reports an error
"no active donation…" → the user hasn't started one. Ask which charity, then
run new. Don't guess.
"'<item>' isn't on the … donation yet…" (from more) → they said "another
X" but X isn't listed. Ask for its per-item value and use add instead.
"donation '<x>' not found" → that donation doesn't exist; offer to start it
(new) or use an existing one.
- Any credential/config error (
GOOGLE_APPLICATION_CREDENTIALS…,
auth/build failed, DONATIONS_SHEET_ID not set) → the skill isn't
configured. Point the user to README.md; do NOT try to reach the data another
way.
Always ask the user for guidance when there is an error; do not proactively try to resolve errors yourself.
Empty results
show with an empty items array means nothing has been logged on that
donation yet — say so plainly ("nothing on this Goodwill donation yet"); don't
re-check or speculate.
1---2name: donations3description: Record the user's charitable donations — the itemized goods they give to a charity (Goodwill, Vietnam Veterans of America, etc.), each item with a quantity and a per-item dollar value, plus a running total for that donation. PREFER THIS SKILL whenever the user is logging things they donated: starting a donation, adding items with quantities and values, adding more of something already listed, or asking the running total. Call the simple donation verbs below and relay their results — do not compute totals or track anything yourself. Activate on any of: "donation", "donated", "goodwill", "vietnam veterans", "charitable", "tax deduction", "drop-off", "start a new … donation", "add N … at $X each", "add another …", "what's the total", or anything that sounds like itemizing donated goods with quantities and values.4license: MIT5---67# donations — record itemized charitable donations89Log the goods the user donates to a charity. Each charity donation is its own10record of items — item name, quantity, and value each — with a running total.11You work entirely through the donation verbs below; the tool does all the12bookkeeping, so you never compute totals or track state yourself.1314## When to use1516Activate when the user wants to:17- **Start** a donation for a charity ("start a new Goodwill donation").18- **Add** an item with a quantity and a per-item value ("three pairs of pants at19 $5 each").20- **Add more** of an item already listed ("add another pair of pants").21- Ask the **running total** ("what's the total so far?").22- **Read back** what's been logged ("what have I added?").2324## When NOT to use2526- **Cash donations.** This skill tracks only itemized goods (things with a27 quantity and a per-item value). If the user is logging a cash gift, tell them28 cash isn't handled here yet.29- **Anything that isn't logging donated goods.** Out of scope: general30 record-keeping, lists, and math.3132## The tool3334One script at `${HERMES_SKILL_DIR}/scripts/donations.py`, invoked as35`python3 <path> <verb> [args]`. Each call prints ONE JSON object on stdout36(`{"ok": true, ...}`; failures are `{"ok": false, "error": "..."}` with exit 1).3738| Verb | Purpose |39|---|---|40| `new --charity <name> [--date YYYY-MM-DD]` | Start a new donation for a charity (date defaults to today). It becomes the **active** donation. |41| `add --item <name> --quantity <n> --value <per>` | Add an item to the active donation. If that item is already listed, its quantity is **merged** (added on) instead of duplicated — and if the stated value differs from the one already recorded, the response carries a `warning`. |42| `more --item <name> [--count <n>]` | Add more of an item already listed (raise its quantity by `n`, default 1). |43| `total` | Gets the active donation's running total. |44| `show` | List the active donation's items and total (for read-back). |45| `use --donation "<name>"` | Switch which donation is active (rarely needed). |4647`add` / `more` / `total` / `show` act on the **active** donation — the one set by48the last `new` (or `use`). You almost never pass `--donation`; the tool49remembers which donation is in progress.5051## Turning the user's words into calls5253Requests come in loose, natural phrasing. Resolve to verbs BEFORE calling:5455| User said | Call |56|---|---|57| "start a new Goodwill donation" / "…dated for today" | `new --charity Goodwill` |58| "start a Vietnam Veterans donation for July 3rd" | `new --charity "Vietnam Veterans of America" --date 2026-07-03` |59| "add three pairs of pants at $5 each" | `add --item pants --quantity 3 --value 5` |60| "add two girls' socks, value $2 each" | `add --item "girls socks" --quantity 2 --value 2` |61| "add another pair of pants" | `more --item pants` |62| "add two more pairs of pants" | `more --item pants --count 2` |63| "what's the current total?" | `total` |64| "what have I added / read it back" | `show` |6566Parsing notes:67- **"N pairs of X" / "N X" → `--quantity N`, `--item X`.** A "pair"/"pairs" is68 just the count word — three pairs of pants is `--quantity 3`, not 6.69- **"$X each" / "value $X" → `--value X`.** Pass a plain number (`5`, not `$5`).70- **Value stated → `add`. No value, and the item is already listed → `more`.**71 That is the one distinction to get right.72- Pass the item as the user said it; the tool normalizes and matches it, so73 "pants", "Pants", "PANTS" all land on one item.74- Once the user has started a donation, every later "add / another / total"75 applies to it automatically — do NOT pass `--donation`.7677## Output shape7879- `new` → `{"ok": true, "donation": "2026-07-05 Goodwill Donation", "created": true, "total": "$0.00"}`80- `add` → `{"ok": true, "donation": "...", "action": "added"|"merged", "item": "Pants", "quantity": 4, "value_per": 5.0, "total": "$20.00"}`81- `more` → `{"ok": true, "action": "incremented", "item": "Pants", "quantity": 5, "total": "$25.00"}`82- `total` → `{"ok": true, "donation": "...", "total": "$24.00"}`83- `show` → `{"ok": true, "donation": "...", "items": [{"item":"Pants","quantity":"4","value_per":"$5.00"}, ...], "total": "$24.00"}`8485Always echo the confirmation back (item, new quantity, and running total) so a86mis-heard word is caught immediately — e.g. "Added 3 Pants at $5 — total $15."8788**If an `add` response includes a `warning` field, relay it verbatim.** It means89the item was already listed at a *different* per-item value; the tool merged the90quantity but kept the original value (it never silently changes a price). Tell91the user both values and that the value was left unchanged, so they can fix it92deliberately if they meant to.9394## A typical session9596```97"Start a new Goodwill donation, dated today."98 → new --charity Goodwill99 → "Started a Goodwill donation for today. Total $0.00."100101"Add three pairs of pants at $5 each."102 → add --item pants --quantity 3 --value 5103 → "Added 3 Pants at $5 each. Total $15.00."104105"Add another pair of pants."106 → more --item pants107 → "Pants now 4. Total $20.00."108109"Add two girls' socks at $2 each."110 → add --item "girls socks" --quantity 2 --value 2111 → "Added 2 Girls Socks at $2 each. Total $24.00."112113"What's the total?"114 → total115 → "$24.00."116```117118## When a verb reports an error119120- `"no active donation…"` → the user hasn't started one. Ask which charity, then121 run `new`. Don't guess.122- `"'<item>' isn't on the … donation yet…"` (from `more`) → they said "another123 X" but X isn't listed. Ask for its per-item value and use `add` instead.124- `"donation '<x>' not found"` → that donation doesn't exist; offer to start it125 (`new`) or `use` an existing one.126- Any credential/config error (`GOOGLE_APPLICATION_CREDENTIALS…`,127 `auth/build failed`, `DONATIONS_SHEET_ID not set`) → the skill isn't128 configured. Point the user to `README.md`; do NOT try to reach the data another129 way.130131Always ask the user for guidance when there is an error; do not proactively try to resolve errors yourself.132133## Empty results134135`show` with an empty `items` array means nothing has been logged on that136donation yet — say so plainly ("nothing on this Goodwill donation yet"); don't137re-check or speculate.