From points-activity
Extract Air Canada Aeroplan account points activity into the unified points-activity CSV (Date, Description, Amount) plus the current balance. Use whenever the user wants to pull, export, check, sync, or monitor their Aeroplan / Air Canada points history, transactions, reward bookings, or transfers — including recurring/scheduled monthly checks. Triggers on "get my Aeroplan points", "update my Aeroplan sheet", "Air Canada activity". Part of the points-activity skill suite; scrapes the dashboard (2-year max; Family Sharing caveat). Requires the user to be logged in to aircanada.com in the connected Chrome browser.
How this skill is triggered — by the user, by Claude, or both
Slash command
/points-activity:aeroplan-activityThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **Unified output contract.** This sub-skill is part of `points-activity`. Its `scripts/transform.py` writes `Date, Description, Amount` and the filename `aeroplan_activity_<from>_<to>.csv` (covered range) via the shared `scripts/activity_output.py`, and prints `BALANCE:/COVERED:/REQUESTED:/FILE:/ROWS:` to stdout. The orchestrator passes the requested period and reads those lines. References t...
Unified output contract. This sub-skill is part of
points-activity. Itsscripts/transform.pywritesDate, Description, Amountand the filenameaeroplan_activity_<from>_<to>.csv(covered range) via the sharedscripts/activity_output.py, and printsBALANCE:/COVERED:/REQUESTED:/FILE:/ROWS:to stdout. The orchestrator passes the requested period and reads those lines. References tocollapsed.csv/Points/Milesbelow are the older single-program wording; the actual columns areDate, Description, Amount.
Scrapes the rendered Aeroplan activity dashboard, sets the period filter to its max (2 years), classifies and collapses, and outputs a points table.
list_connected_browsers → select_browser).Activity is served by an AWS AppSync GraphQL endpoint
(akamai-gw.dbaas.aircanada.com/appsync/transaction-history-v2). A plain fetch fails
(CORS / needs the Amplify client's auth), and the real request doesn't pass through
window.fetch/XHR so it can't be intercepted. The data renders into the normal light
DOM (Angular Material mat-expansion-panel), so scraping is the reliable path.
If the account is a Family Sharing pool lead, the visible balance INCLUDES other pool members, but the activity list shows only THIS account's transactions. Other members' transfers/earns/returns are NOT here (e.g. a spouse's Chase transfer and some return credits won't appear), even though they affect the shared balance. So: do not reconcile the activity total to the balance — the mismatch is structural, not an extraction error. Treat the output as "activity visible on this account".
tabs_context_mcp(createIfEmpty:true) → navigate to
https://www.aircanada.com/aeroplan/member/dashboard/activity. Confirm login.
Decline the cookie banner ("Reject All") if present. Keep tabId.
Run scripts/scrape_activity.js. It opens Filters, selects "2 years" (the max
offered — 30/60/90 days, 6 months, 1 year, 2 years), applies, clicks any
"More"/"Load more" until the count stabilizes, then parses each
<mat-expansion-panel> header. Ad panels (e.g. "Earn points with Starbucks") have no
"Pts" and are skipped. Returns {count}, stashes rows on window.__aero.
Note: expanding a panel reveals a your-balance / other-pool-member split — we IGNORE that and take only the header total (per requirements).
Run scripts/dump_console.js (logs AE###~ ...), then
read_console_messages(pattern:"^AE\\d", limit:60, tabId:...).
Strip the AE###: prefix, write the |-delimited lines to a file
(e.g. /tmp/raw.txt), then:
python3 scripts/transform.py /tmp/raw.txt <output_dir> [from] [to] [balance]
# from/to are ISO yyyy-mm-dd or '-' for unbounded; balance is the current balance or omit.
Writes collapsed.csv, prints row count + points total.
present_files on collapsed.csv. Don't reconcile to balance (see Family Sharing).
collapsed.csv: columns Date, Description, Points. Logic (in scripts/transform.py):
Run as a scheduled task on the user's own machine — needs the user's real
Chrome + live Aeroplan session. Use the host's scheduling primitive: Cowork —
mcp__scheduled-tasks__create_scheduled_task; Claude Code — cron + headless
invocation. Caveats: local tasks run only while the computer is on and the app is
open; no completion/failure notifications yet; an expired session needs a fresh
login. Each run is a clean session — to report only new activity, save each run's
collapsed.csv (dated filename) and diff against the prior one. Note the 2-year
window: anything older than 2 years can never be retrieved, so a monthly cadence
is more than enough to never miss a transaction.
Searches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.
npx claudepluginhub lionisiam/points-activity --plugin points-activity