Event lifecycle: tracker-io engine + create/update/status-event skills#4
Conversation
Point create-chapter/create-online-series docs and script docstrings at the repo skills instead of the retired per-folder SKILLS.md.docx. Add the design spec and implementation plan for the event-lifecycle skills. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Renamed from gws.py to gws_cli.py to make clear it wraps the real gws binary (https://github.com/googleworkspace/cli) via subprocess — it does not reimplement Drive. Same calls create_chapter.py already uses, lifted into one shared module. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drop the duplicated _gws/gws_json/... block from both scripts; import the still- used helpers (list_children/create_folder/copy_file/gws_download/gws_upload) plus FOLDER/MIME_BY_EXT from lib/aaif_meetups/gws_cli.py. Behavior unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ngine Per the principle that gws actions belong to the agent (flexible) and Python is only for well-known, unchanging transforms: - Delete lib/aaif_meetups/gws_cli.py and remove locate_tracker from tracker.py — no Drive calls in Python anymore. - The 3 skills (event-status/create-event/update-event) now operate on a LOCAL docx path; each SKILL.md instructs the agent to run gws (locate/download/upload) directly and call the deterministic script in between. - Revert create_chapter/create_series to their original self-contained state. - office.py + tracker.py remain pure-Python docx surgery (read/clone/set-field/ restamp + date math). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR introduces an “event lifecycle” layer for AAIF meetups by adding a stdlib-only .docx (OOXML) engine and tracker model, plus three skills to create events, update events (including due-date restamping), and generate a read-only status digest from a local Event Tracker.docx.
Changes:
- Add
lib/aaif_meetups/office.py+tracker.pyfor deterministic local.docxtable parsing/editing and event-centric operations (list/read/set-field/restamp/add). - Add three skills (
aaif-event-status,aaif-create-event,aaif-update-event) with corresponding local-file scripts and unit tests. - Update chapter/series creation docs/docstrings to remove retired
SKILLS.md.docxreferences and point organizers ataaif-*skills instead.
Reviewed changes
Copilot reviewed 19 out of 23 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| skills/aaif-update-event/SKILL.md | New skill doc for change-driven event updates (download → local edit → upload). |
| skills/aaif-update-event/scripts/update_event.py | CLI for updating detail fields and restamping due dates in a local tracker docx. |
| skills/aaif-update-event/scripts/test_update_event.py | Unit tests for update-event core behavior (stale flags + date restamp). |
| skills/aaif-event-status/SKILL.md | New skill doc for read-only task status digest (overdue / due soon). |
| skills/aaif-event-status/scripts/event_status.py | CLI for computing overdue/due-soon tasks from a local tracker docx. |
| skills/aaif-event-status/scripts/test_event_status.py | Unit test for classification logic (overdue vs due soon vs ignored). |
| skills/aaif-create-event/SKILL.md | New skill doc for cloning example section and stamping due dates for a new event. |
| skills/aaif-create-event/scripts/create_event.py | CLI to add a new event section to a local tracker docx (with dedup + dry-run). |
| skills/aaif-create-event/scripts/test_create_event.py | Unit test verifying add-event behavior on a fixture copy. |
| skills/aaif-create-online-series/SKILL.md | Doc update removing retired SKILLS.md.docx references. |
| skills/aaif-create-online-series/scripts/create_series.py | Docstring update to reference aaif-* skills instead of SKILLS.md. |
| skills/aaif-create-chapter/SKILL.md | Doc update removing retired SKILLS.md.docx references. |
| skills/aaif-create-chapter/scripts/create_chapter.py | Docstring update to reference aaif-* skills instead of SKILLS.md. |
| lib/aaif_meetups/office.py | New stdlib OOXML helpers for reading/writing word/document.xml and editing tables/cells. |
| lib/aaif_meetups/tracker.py | New event model and write operations (set_field, restamp due dates, clone+append event). |
| lib/aaif_meetups/init.py | Package marker for aaif_meetups. |
| lib/aaif_meetups/tests/init.py | Test package marker. |
| lib/aaif_meetups/tests/test_office.py | Unit tests for .docx round-trip and table primitives. |
| lib/aaif_meetups/tests/test_tracker.py | Unit tests for date parsing/restamping, event model, and add-event behavior. |
| docs/superpowers/specs/2026-06-30-aaif-event-lifecycle-design.md | Design spec for the tracker-io foundation and skills (with revision note). |
| docs/superpowers/plans/2026-06-30-aaif-event-lifecycle.md | Implementation plan and testing checklist (with revision note). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Hero Self-ReviewRan all five Critical (1)
Important (5)
Suggestions (4)
Strengths
Self-review by Claude Code |
Critical: - create_event/add_event no longer silently drop unmatched detail labels; add_event raises listing missing labels. Map --platform -> PLATFORM (not VENUE), add --join (STREAM / JOIN LINK); flags must match the tracker's labels. Important: - office.save_document now registers the document's namespace prefixes so re-serialization preserves r:id / w14: / mc: etc. (was renaming everything to ns0/1/2). - _select prefers an exact title match, then a unique substring; ambiguous substrings raise instead of silently editing the wrong event. - event_status digests the resolved event ref directly (no title round-trip). - add_event clones+rewrites the date/title heading and drops the stale 'Example event — duplicate this whole section' caption. - parse_event_date rejects yearless dates (was defaulting to current year). - update/create SKILL.md document in-person vs online detail labels. Suggestions: - event_status flags events whose DATE & TIME failed to parse. - Task is now a frozen dataclass (attribute access; typo'd field raises). - Documented set_cell_text hyperlink-target limitation. - Added tests: multi-event selection, year-boundary dates, raise-on-missing-label, add_event heading/caption, online fixture, save namespace fidelity, empty-cell. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Hero Self-Review ImprovementsAll 10 findings (1 Critical, 5 Important, 4 Suggestions) fixed in Critical (1 / 1 fixed):
Important (5 / 5 fixed):
Suggestions (4 / 4 fixed):
Commit: Applied by Claude Code |
- create_event dedup guard now uses an exact case-insensitive title match
(was substring; 'Eval Night' wrongly matched 'Eval Night · Builder Series').
Extracted title_exists() and covered it with a test.
- update_event --set now rejects a value without '=' with a clear error
instead of silently clearing a field / raising an opaque LookupError.
- All three new SKILL.md files invoke scripts via ${CLAUDE_SKILL_DIR}/scripts/...
per CONTRIBUTING.md, so they work when installed outside the repo checkout.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Respond-to-PR ImprovementsAddressed all 8 Copilot review comments (6 code/doc fixes; 2 were already fixed by the earlier self-review commit Code changes (3 applied):
Already fixed in
Commits: Remaining unresolved threads: none Applied by Claude Code |
Add LF Code of Conduct and Privacy Policy as standard footers in the Luma description, attendee reminder, and announcement skills. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Summary
Adds the event-lifecycle layer on top of the AAIF meetup skills — the per-event runbook (
Event Tracker.docx) was the one part of running an event that nothing automated.Two pieces:
lib/aaif_meetups/— a deterministic, stdlib-only docx engine (no Drive calls, no third-party deps):office.py— read/writeword/document.xmlin a.docxzip; navigate/edit tables, rows, cells, paragraph runs.tracker.py— event model over a tracker (list_events/read_event), edits (set_field/set_due_dates/add_event), and the shared date-stamping rule (new_due = new_event_date + (example_task_due − example_event_date); clock-time day-of cells are left alone).Three skills that operate on a local tracker file; each
SKILL.mdinstructs the agent to drive thegwsCLI directly (locate → download → upload):aaif-event-status— read-only digest of overdue / due-soon tasks by owner.aaif-create-event— clone the example section, fill details, stamp all phase due-dates; dedup-guard; mode is implicit (chapter ⇒ in-person tracker, series ⇒ online tracker).aaif-update-event— change-driven edits ("add speaker", "move date"); recomputes due-dates when the date moves and flags stale downstream assets.Also in this branch (Drive-cleanup groundwork):
SKILLS.md.docxreferences increate_chapter/create_seriesdocs/docstrings (the 45 Drive copies were trashed and the template trackers re-pointed at this repo separately).Design principle
Python = well-known, unchanging transforms only (clone / replace / restamp). Every Google Drive action stays with the agent via the
gwsCLI, kept flexible — Python never nests gws calls.create_chapter.py/create_series.pyare unchanged frommainapart from a docstring fix.Testing
python -m unittest discover -s lib/aaif_meetups/tests— 14 tests (office round-trip + primitives, date math, event model, writes, clone-and-append with save→reload corruption check).classify,apply_local,apply_changes) on real tracker fixtures.Spec:
docs/superpowers/specs/2026-06-30-aaif-event-lifecycle-design.md· Plan:docs/superpowers/plans/2026-06-30-aaif-event-lifecycle.mdOut of scope (follow-ups)
File-aware banner/deck generation (#3), chapter/series health (#4), and the two-plugin ops/organizer split (#5).
🤖 Generated with Claude Code