From 437b185860ce8a8179f7308e39234a6189bd8469 Mon Sep 17 00:00:00 2001 From: Rahul Parundekar Date: Wed, 1 Jul 2026 15:37:13 +0530 Subject: [PATCH 1/4] docs: add quickstart walkthrough, remove merged planning docs Add a step-by-step Quickstart to the README Install section (marketplace add via git URL, enable in /plugins, auto-update, install, reload, then start using the skills) with an autocomplete screenshot. Remove the docs/superpowers planning + spec artifacts now that the event-lifecycle work has merged. Co-Authored-By: Claude Opus 4.8 --- README.md | 23 + assets/aaif-skills-autocomplete.png | Bin 0 -> 168484 bytes .../plans/2026-06-30-aaif-event-lifecycle.md | 1418 ----------------- .../2026-06-30-aaif-event-lifecycle-design.md | 274 ---- 4 files changed, 23 insertions(+), 1692 deletions(-) create mode 100644 assets/aaif-skills-autocomplete.png delete mode 100644 docs/superpowers/plans/2026-06-30-aaif-event-lifecycle.md delete mode 100644 docs/superpowers/specs/2026-06-30-aaif-event-lifecycle-design.md diff --git a/README.md b/README.md index 178bd13..e95e6a3 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,29 @@ repo; `@aaif` is the marketplace name. After installing, the skills auto‑activ when you describe a matching task (e.g. “draft the announcement post for our July meetup”), or invoke one explicitly with `/aaif-meetups:`. +### Quickstart (step‑by‑step) + +Prefer the guided UI flow? Run these inside Claude Code: + +1. **Add the marketplace:** + ```bash + /plugin marketplace add https://github.com/aaif/meetups.git#main + ``` +2. **Enable it:** run `/plugins`, tab to **Marketplaces**, and enable the **aaif** + marketplace. +3. **Turn on auto‑update** for the marketplace so you always get the latest skills. +4. **Install the plugin:** in that marketplace, browse plugins and install + **aaif‑meetups**. +5. **Reload:** + ```bash + /reload-plugins + ``` +6. **Start using the skills:** type `/aaif-` in the prompt to see the toolkit's + commands autocomplete, then pick one (or just describe your task and the + matching skill auto‑activates). + + ![Typing /aaif- shows the toolkit's skills autocompleting in Claude Code](assets/aaif-skills-autocomplete.png) + --- ## What's inside diff --git a/assets/aaif-skills-autocomplete.png b/assets/aaif-skills-autocomplete.png new file mode 100644 index 0000000000000000000000000000000000000000..8fa0d6de9de2247317958c352520694666dbd826 GIT binary patch literal 168484 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

v|7gmGu)fi3CGDm*t6s;VUUaj`NV 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 **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -> **Revision (post-build):** gws was pulled back out of Python. The shipped design is: -> Python (`lib/aaif_meetups/office.py` + `tracker.py`) is a **deterministic local-file -> docx engine** (read/clone/set-field/restamp + date math) with NO Drive calls; the -> **agent drives `gws` directly** (locate/download/upload) per each `SKILL.md`. Tasks 8 -> (`gws_cli.py`), 9 (`locate_tracker`), and 12 (refactor onto `gws_cli`) were reverted/ -> removed; the three skill scripts take a **local docx path** instead of a chapter name. - -**Goal:** Add a `tracker-io` foundation plus three skills (`aaif-event-status`, `aaif-create-event`, `aaif-update-event`) that read and write an event's section inside a chapter/series `Event Tracker.docx`. - -**Architecture:** A stdlib-only Python package `lib/aaif_meetups/` provides Drive access (`gws_cli.py`), low-level docx-zip/table editing (`office.py`), and an event-aware API + date math (`tracker.py`). Each skill is a thin CLI script that adds `lib/` to `sys.path`, calls the package, and talks to Drive via the `gws` CLI. All docx edits happen in pure Python on `word/document.xml` — no LibreOffice/soffice, no third-party libraries. - -**Tech Stack:** Python 3.9 (stdlib only: `zipfile`, `xml.etree.ElementTree`, `copy`, `datetime`, `re`, `argparse`, `subprocess`, `json`), `unittest`, the `gws` CLI for Google Drive. - -## Global Constraints - -- **Stdlib-only.** No third-party Python deps (no `python-docx`, no `Pillow`). The repo has "no package to build." -- **Pure Python edits.** No `soffice`/LibreOffice anywhere in this plan. -- **Python 3.9**, `ruff` line-length 100, lint select `["F", "E9"]` (bug-focused). -- **Drive via `gws` CLI** only (prereq: `gws-cli-access`), through `lib/aaif_meetups/gws_cli.py`. -- **By-label, never positional.** Detail rows match on label text (`EVENT TITLE`, …); phase tables match on the header `["TASK","OWNER","DUE","STATUS"]`. Never hard-code a table/row index. -- **First argument is ``** — resolved against `Chapters/` (⇒ in-person) or `Online/` (⇒ online); mode is auto-detected from which parent matched. -- **Drive folder IDs:** Chapters `1IQ1K7aVOKUUkxAcfLuNjdETEnmavvtjx`, Online `1g2vHrqDHfh9wBkDJryJIl8wqXA4J-d4i`. -- **WordprocessingML namespace:** `http://schemas.openxmlformats.org/wordprocessingml/2006/main` (prefix `w`). -- **Tracker structure (verified):** body is an ordered list of `` and ``. The detail block is a 2-col `` whose first row is `["EVENT TITLE", ]`. Each phase table's first row is `["TASK","OWNER","DUE","STATUS"]`. The `DAY OF` phase table's DUE cells hold clock times (`16:00`), not dates. - ---- - -## File Structure - -- Create `lib/aaif_meetups/__init__.py` — package marker (empty). -- Create `lib/aaif_meetups/gws_cli.py` — Drive helpers (run gws, list/get/update/copy/create, download/upload). -- Create `lib/aaif_meetups/office.py` — docx zip read/write + table/cell/paragraph primitives. -- Create `lib/aaif_meetups/tracker.py` — event-aware API (`locate_tracker`, `list_events`, `read_event`, `clone_example_section`, `write_event`, `set_field`, `set_due_dates`) + date math. -- Create `lib/aaif_meetups/tests/__init__.py` — empty. -- Create `lib/aaif_meetups/tests/fixtures/event_tracker_irl.docx` — real TemplateCity tracker (downloaded). -- Create `lib/aaif_meetups/tests/fixtures/event_tracker_online.docx` — real TemplateSeries tracker (downloaded). -- Create `lib/aaif_meetups/tests/test_office.py`, `test_tracker.py`. -- Create `skills/aaif-event-status/SKILL.md` + `scripts/event_status.py`. -- Create `skills/aaif-create-event/SKILL.md` + `scripts/create_event.py`. -- Create `skills/aaif-update-event/SKILL.md` + `scripts/update_event.py`. -- Modify `skills/aaif-create-chapter/scripts/create_chapter.py` and `skills/aaif-create-online-series/scripts/create_series.py` — import `gws` from the shared package (drop duplicated helpers). - -Run all tests with: `python -m unittest discover -s lib/aaif_meetups/tests -v` - ---- - -## Task 1: Package skeleton + real fixtures - -**Files:** -- Create: `lib/aaif_meetups/__init__.py`, `lib/aaif_meetups/tests/__init__.py` -- Create: `lib/aaif_meetups/tests/fixtures/event_tracker_irl.docx`, `event_tracker_online.docx` - -**Interfaces:** -- Produces: an importable `aaif_meetups` package (when `lib/` is on `sys.path`) and two real tracker fixtures for offline tests. - -- [ ] **Step 1: Create package markers** - -```bash -mkdir -p lib/aaif_meetups/tests/fixtures -touch lib/aaif_meetups/__init__.py lib/aaif_meetups/tests/__init__.py -``` - -- [ ] **Step 2: Download the two real trackers as fixtures** - -```bash -IRL=$(gws drive files list --params '{"q":"'\''1PHvEgqnHo0RrsFyA47O9iRJGaKehC8Eg'\'' in parents and name='\''Event Tracker.docx'\''","fields":"files(id)"}' | grep -oE '"id": "[^"]+"' | head -1 | cut -d'"' -f4) -ONLINE_TPL=$(gws drive files list --params '{"q":"'\''1M15wzKvQqd_jQz5cG16NO_YcbWU3EH1j'\'' in parents and name='\''Event Tracker.docx'\''","fields":"files(id)"}' | grep -oE '"id": "[^"]+"' | head -1 | cut -d'"' -f4) -( cd lib/aaif_meetups/tests/fixtures && gws drive files get --params "{\"fileId\":\"$IRL\",\"alt\":\"media\"}" --output event_tracker_irl.docx ) -( cd lib/aaif_meetups/tests/fixtures && gws drive files get --params "{\"fileId\":\"$ONLINE_TPL\",\"alt\":\"media\"}" --output event_tracker_online.docx ) -``` - -- [ ] **Step 3: Verify both fixtures open as valid docx zips** - -```bash -python3 -c "import zipfile; [print(f, 'word/document.xml' in zipfile.ZipFile('lib/aaif_meetups/tests/fixtures/'+f).namelist()) for f in ('event_tracker_irl.docx','event_tracker_online.docx')]" -``` -Expected: both print `True`. - -- [ ] **Step 4: Commit** - -```bash -git add lib/aaif_meetups -git commit -m "feat(tracker-io): package skeleton + real tracker fixtures" -``` - ---- - -## Task 2: `office.py` — docx zip read/write - -**Files:** -- Create: `lib/aaif_meetups/office.py` -- Test: `lib/aaif_meetups/tests/test_office.py` - -**Interfaces:** -- Produces: - - `W` (str) — the `{namespace}` prefix, e.g. `"{http://…/main}"`. - - `read_document(path: str) -> xml.etree.ElementTree.Element` — parse `word/document.xml`, return its root element. - - `save_document(src_path: str, root: Element, out_path: str) -> None` — rewrite the docx zip at `out_path` copying every entry from `src_path`, replacing `word/document.xml` with the serialized `root`. - -- [ ] **Step 1: Write the failing test** - -```python -# lib/aaif_meetups/tests/test_office.py -import os, tempfile, unittest -from aaif_meetups import office - -FIX = os.path.join(os.path.dirname(__file__), "fixtures", "event_tracker_irl.docx") - -class TestDocIO(unittest.TestCase): - def test_read_returns_body(self): - root = office.read_document(FIX) - self.assertIsNotNone(root.find(f"{office.W}body")) - - def test_roundtrip_preserves_content_and_zip(self): - root = office.read_document(FIX) - with tempfile.TemporaryDirectory() as d: - out = os.path.join(d, "out.docx") - office.save_document(FIX, root, out) - root2 = office.read_document(out) - # same number of tables survives the round-trip - n1 = len(list(root.iter(f"{office.W}tbl"))) - n2 = len(list(root2.iter(f"{office.W}tbl"))) - self.assertEqual(n1, n2) - self.assertGreater(n2, 5) -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `python -m unittest lib.aaif_meetups.tests.test_office -v` (from repo root, with `PYTHONPATH=lib`) -Actual command: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_office -v` -Expected: FAIL with `ModuleNotFoundError: No module named 'aaif_meetups.office'`. - -- [ ] **Step 3: Write minimal implementation** - -```python -# lib/aaif_meetups/office.py -"""Stdlib-only OOXML helpers: read/write word/document.xml inside a .docx zip, -and navigate/edit its tables, rows, cells, and paragraph run text.""" -import copy -import zipfile -from xml.etree import ElementTree as ET - -NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" -W = "{%s}" % NS -ET.register_namespace("w", NS) - - -def read_document(path): - with zipfile.ZipFile(path) as z: - return ET.fromstring(z.read("word/document.xml")) - - -def save_document(src_path, root, out_path): - body = ET.tostring(root, encoding="UTF-8", xml_declaration=True) - with zipfile.ZipFile(src_path) as zin: - names = zin.namelist() - data = {n: zin.read(n) for n in names} - data["word/document.xml"] = body - with zipfile.ZipFile(out_path, "w", zipfile.ZIP_DEFLATED) as zo: - for n in names: - zo.writestr(n, data[n]) -``` - -- [ ] **Step 4: Run test to verify it passes** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_office -v` -Expected: PASS (2 tests). - -- [ ] **Step 5: Commit** - -```bash -git add lib/aaif_meetups/office.py lib/aaif_meetups/tests/test_office.py -git commit -m "feat(office): docx document.xml read/save round-trip" -``` - ---- - -## Task 3: `office.py` — table/cell/paragraph primitives - -**Files:** -- Modify: `lib/aaif_meetups/office.py` -- Test: `lib/aaif_meetups/tests/test_office.py` (add cases) - -**Interfaces:** -- Consumes: `W`, `read_document` (Task 2). -- Produces: - - `tables(root) -> list[Element]` — all `` in document order. - - `rows(tbl) -> list[Element]` — its ``. - - `cells(tr) -> list[Element]` — its ``. - - `cell_text(tc) -> str` — concatenated, stripped run text of a cell. - - `set_cell_text(tc, text: str) -> None` — set the cell's text: write `text` into the first `` of the first run, blank every other `` in the cell (preserves the cell's run/format). - - `para_text(p) -> str` — concatenated run text of a ``. - -- [ ] **Step 1: Write the failing test** - -```python -# add to test_office.py -class TestTablePrimitives(unittest.TestCase): - def setUp(self): - self.root = office.read_document(FIX) - - def test_detail_table_first_row(self): - # the detail table's first row is ["EVENT TITLE", ] - detail = [t for t in office.tables(self.root) - if office.cell_text(office.cells(office.rows(t)[0])[0]) == "EVENT TITLE"] - self.assertEqual(len(detail), 1) - first = office.rows(detail[0])[0] - self.assertEqual(office.cell_text(office.cells(first)[0]), "EVENT TITLE") - - def test_set_cell_text_roundtrips(self): - detail = next(t for t in office.tables(self.root) - if office.cell_text(office.cells(office.rows(t)[0])[0]) == "EVENT TITLE") - value_cell = office.cells(office.rows(detail)[0])[1] - office.set_cell_text(value_cell, "New Night · Test Series") - self.assertEqual(office.cell_text(value_cell), "New Night · Test Series") -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_office -v` -Expected: FAIL with `AttributeError: module 'aaif_meetups.office' has no attribute 'tables'`. - -- [ ] **Step 3: Write minimal implementation** - -```python -# append to office.py -def tables(root): - return list(root.iter(W + "tbl")) - - -def rows(tbl): - return tbl.findall(W + "tr") - - -def cells(tr): - return tr.findall(W + "tc") - - -def _texts(el): - return list(el.iter(W + "t")) - - -def cell_text(tc): - return "".join(t.text or "" for t in _texts(tc)).strip() - - -def para_text(p): - return "".join(t.text or "" for t in _texts(p)).strip() - - -def set_cell_text(tc, text): - ts = _texts(tc) - if not ts: - raise ValueError("cell has no run text node to set") - ts[0].text = text - # xml:space=preserve guards against trimming - ts[0].set("{http://www.w3.org/XML/1998/namespace}space", "preserve") - for extra in ts[1:]: - extra.text = "" -``` - -- [ ] **Step 4: Run test to verify it passes** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_office -v` -Expected: PASS (4 tests). - -- [ ] **Step 5: Commit** - -```bash -git add lib/aaif_meetups/office.py lib/aaif_meetups/tests/test_office.py -git commit -m "feat(office): table/cell/paragraph primitives" -``` - ---- - -## Task 4: `tracker.py` — date math (`parse_event_date`, `parse_due`, `restamp`) - -**Files:** -- Create: `lib/aaif_meetups/tracker.py` -- Test: `lib/aaif_meetups/tests/test_tracker.py` - -**Interfaces:** -- Produces: - - `parse_event_date(text: str) -> datetime.date` — extract the date from a `DATE & TIME` value like `"Tue · June 24, 2026 · 17:30 — late"`. Raises `ValueError` if none found. - - `parse_due(token: str, anchor: datetime.date) -> datetime.date | None` — parse a DUE cell like `"May 27"`/`"Jun 3"` choosing the year (anchor.year-1/+0/+1) closest to `anchor`. Returns `None` for clock-time cells (`"16:00"`) or empty/unparsable tokens. - - `format_due(d: datetime.date) -> str` — `"%b %-d"` style without leading zero, e.g. `"May 27"`. - - `restamp(due_token: str, old_event: datetime.date, new_event: datetime.date) -> str` — if `due_token` is a date, return it shifted by `(new_event - old_event)`'s effect via offset; if it's a clock time or blank, return it unchanged. - -- [ ] **Step 1: Write the failing test** - -```python -# lib/aaif_meetups/tests/test_tracker.py -import datetime as dt -import unittest -from aaif_meetups import tracker - -class TestDates(unittest.TestCase): - def test_parse_event_date(self): - self.assertEqual( - tracker.parse_event_date("Tue · June 24, 2026 · 17:30 — late"), - dt.date(2026, 6, 24)) - - def test_parse_due_infers_year(self): - anchor = dt.date(2026, 6, 24) - self.assertEqual(tracker.parse_due("May 27", anchor), dt.date(2026, 5, 27)) - self.assertEqual(tracker.parse_due("Jun 3", anchor), dt.date(2026, 6, 3)) - - def test_parse_due_skips_clock_and_blank(self): - anchor = dt.date(2026, 6, 24) - self.assertIsNone(tracker.parse_due("16:00", anchor)) - self.assertIsNone(tracker.parse_due("", anchor)) - - def test_restamp_shifts_dates_keeps_clock(self): - old, new = dt.date(2026, 6, 24), dt.date(2026, 7, 8) # +14 days - self.assertEqual(tracker.restamp("May 27", old, new), "Jun 10") - self.assertEqual(tracker.restamp("16:00", old, new), "16:00") - self.assertEqual(tracker.restamp("", old, new), "") -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: FAIL with `ModuleNotFoundError: No module named 'aaif_meetups.tracker'`. - -- [ ] **Step 3: Write minimal implementation** - -```python -# lib/aaif_meetups/tracker.py -"""Event-aware reads/writes over an Event Tracker.docx, plus the shared -date-stamping math. Stdlib-only; pure-Python OOXML editing via office.py.""" -import datetime as dt -import re - -from aaif_meetups import office - -_MONTHS = {m: i for i, m in enumerate( - ["", "jan", "feb", "mar", "apr", "may", "jun", - "jul", "aug", "sep", "oct", "nov", "dec"])} -_DATE_RE = re.compile( - r"\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\.?\s+(\d{1,2})", re.I) -_YEAR_RE = re.compile(r"\b(20\d{2})\b") -_CLOCK_RE = re.compile(r"^\s*\d{1,2}:\d{2}\s*$") - - -def parse_event_date(text): - m = _DATE_RE.search(text) - if not m: - raise ValueError("no month/day in event date: %r" % text) - month, day = _MONTHS[m.group(1)[:3].lower()], int(m.group(2)) - ym = _YEAR_RE.search(text) - year = int(ym.group(1)) if ym else dt.date.today().year - return dt.date(year, month, day) - - -def parse_due(token, anchor): - if token is None or _CLOCK_RE.match(token or "") or not (token or "").strip(): - return None - m = _DATE_RE.search(token) - if not m: - return None - month, day = _MONTHS[m.group(1)[:3].lower()], int(m.group(2)) - best = None - for year in (anchor.year - 1, anchor.year, anchor.year + 1): - try: - cand = dt.date(year, month, day) - except ValueError: - continue - if best is None or abs((cand - anchor).days) < abs((best - anchor).days): - best = cand - return best - - -def format_due(d): - return "%s %d" % (d.strftime("%b"), d.day) - - -def restamp(due_token, old_event, new_event): - parsed = parse_due(due_token, old_event) - if parsed is None: - return due_token - return format_due(parsed + (new_event - old_event)) -``` - -- [ ] **Step 4: Run test to verify it passes** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: PASS (4 tests). - -- [ ] **Step 5: Commit** - -```bash -git add lib/aaif_meetups/tracker.py lib/aaif_meetups/tests/test_tracker.py -git commit -m "feat(tracker): date parsing and restamp math" -``` - ---- - -## Task 5: `tracker.py` — event model (`list_events`, `read_event`) - -**Files:** -- Modify: `lib/aaif_meetups/tracker.py` -- Test: `lib/aaif_meetups/tests/test_tracker.py` (add cases) - -**Interfaces:** -- Consumes: `office.tables/rows/cells/cell_text` (Tasks 2–3), `parse_event_date` (Task 4). -- Produces: - - `PHASE_HEADER == ["TASK", "OWNER", "DUE", "STATUS"]`. - - `is_detail_table(tbl) -> bool` — first row first cell == `"EVENT TITLE"`. - - `is_phase_table(tbl) -> bool` — first row cells == `PHASE_HEADER`. - - `list_events(root) -> list[dict]` — `[{"title": str, "detail_table": Element, "phase_tables": [Element], "date": date|None}]` in document order. An event = a detail table + every phase table after it until the next detail table. - - `read_event(root, event) -> dict` — find one event by case-insensitive title substring, or `"next"` (soonest future date), or `"latest"` (max date). Returns `{"title", "details": {label: value}, "phases": [{"tasks": [{"task","owner","due","status"}]}], "date"}`. Raises `LookupError` if not found. - -- [ ] **Step 1: Write the failing test** - -```python -# add to test_tracker.py -import os -from aaif_meetups import office -FIX = os.path.join(os.path.dirname(__file__), "fixtures", "event_tracker_irl.docx") - -class TestEventModel(unittest.TestCase): - def setUp(self): - self.root = office.read_document(FIX) - - def test_list_events_finds_the_example(self): - evs = tracker.list_events(self.root) - self.assertEqual(len(evs), 1) - self.assertIn("Agentic AI Night", evs[0]["title"]) - self.assertEqual(len(evs[0]["phase_tables"]), 8) # 4wk,3wk,2wk,1wk,day-before,day-of,next-day,follow-ups - - def test_read_event_details_and_tasks(self): - ev = tracker.read_event(self.root, "Agentic AI Night") - self.assertEqual(ev["details"]["DATE & TIME"], "Tue · June 24, 2026 · 17:30 — late") - self.assertEqual(ev["date"], dt.date(2026, 6, 24)) - # first phase, first task - self.assertEqual(ev["phases"][0]["tasks"][0]["status"], "Done") - - def test_read_event_next(self): - ev = tracker.read_event(self.root, "next") - self.assertIn("Agentic AI Night", ev["title"]) -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: FAIL with `AttributeError: module 'aaif_meetups.tracker' has no attribute 'list_events'`. - -- [ ] **Step 3: Write minimal implementation** - -```python -# append to tracker.py -PHASE_HEADER = ["TASK", "OWNER", "DUE", "STATUS"] - - -def _row_cells_text(tbl, row_index): - rs = office.rows(tbl) - if not rs: - return [] - return [office.cell_text(c) for c in office.cells(rs[row_index])] - - -def is_detail_table(tbl): - cells0 = _row_cells_text(tbl, 0) - return bool(cells0) and cells0[0] == "EVENT TITLE" - - -def is_phase_table(tbl): - return _row_cells_text(tbl, 0) == PHASE_HEADER - - -def list_events(root): - events, current = [], None - for tbl in office.tables(root): - if is_detail_table(tbl): - details = {} - for r in office.rows(tbl): - cs = office.cells(r) - if len(cs) >= 2: - details[office.cell_text(cs[0])] = office.cell_text(cs[1]) - title = details.get("EVENT TITLE", "") - try: - date = parse_event_date(details.get("DATE & TIME", "")) - except ValueError: - date = None - current = {"title": title, "detail_table": tbl, - "phase_tables": [], "date": date} - events.append(current) - elif is_phase_table(tbl) and current is not None: - current["phase_tables"].append(tbl) - return events - - -def _select(events, event): - key = (event or "").strip().lower() - dated = [e for e in events if e["date"]] - if key == "next": - future = sorted([e for e in dated if e["date"] >= dt.date.today()], - key=lambda e: e["date"]) - return (future or sorted(dated, key=lambda e: e["date"]))[0] if dated else None - if key == "latest": - return max(dated, key=lambda e: e["date"]) if dated else None - for e in events: - if key in e["title"].lower(): - return e - return None - - -def read_event(root, event): - events = list_events(root) - e = _select(events, event) - if e is None: - raise LookupError("no event matching %r" % event) - details = {} - for r in office.rows(e["detail_table"]): - cs = office.cells(r) - if len(cs) >= 2: - details[office.cell_text(cs[0])] = office.cell_text(cs[1]) - phases = [] - for pt in e["phase_tables"]: - tasks = [] - for r in office.rows(pt)[1:]: - cs = [office.cell_text(c) for c in office.cells(r)] - cs += [""] * (4 - len(cs)) - tasks.append({"task": cs[0], "owner": cs[1], "due": cs[2], "status": cs[3]}) - phases.append({"tasks": tasks}) - return {"title": e["title"], "details": details, "phases": phases, "date": e["date"]} -``` - -- [ ] **Step 4: Run test to verify it passes** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: PASS (all tracker tests). - -- [ ] **Step 5: Commit** - -```bash -git add lib/aaif_meetups/tracker.py lib/aaif_meetups/tests/test_tracker.py -git commit -m "feat(tracker): event model — list_events, read_event" -``` - ---- - -## Task 6: `tracker.py` — writes (`set_field`, `set_due_dates`) - -**Files:** -- Modify: `lib/aaif_meetups/tracker.py` -- Test: `lib/aaif_meetups/tests/test_tracker.py` (add cases) - -**Interfaces:** -- Consumes: `list_events`, `_select`, `restamp`, `office.set_cell_text` / `cells` / `rows`. -- Produces: - - `set_field(root, event, label, value) -> None` — set the value cell of the detail row whose label cell == `label`, for the selected event. Raises `LookupError` if event or label missing. - - `set_due_dates(root, event, new_event_date) -> int` — for the selected event, restamp every phase table DUE cell from the event's current date to `new_event_date`; also update the `DATE & TIME` detail value's date. Returns the count of DUE cells changed. - -- [ ] **Step 1: Write the failing test** - -```python -# add to test_tracker.py -import tempfile -class TestWrites(unittest.TestCase): - def setUp(self): - self.root = office.read_document(FIX) - - def test_set_field(self): - tracker.set_field(self.root, "Agentic AI Night", "SPEAKER(S)", "Jane Doe (Infra)") - ev = tracker.read_event(self.root, "Agentic AI Night") - self.assertEqual(ev["details"]["SPEAKER(S)"], "Jane Doe (Infra)") - - def test_set_due_dates_shifts_two_weeks(self): - # original 4-weeks-out task due "May 27"; +14 days -> "Jun 10" - changed = tracker.set_due_dates(self.root, "Agentic AI Night", dt.date(2026, 7, 8)) - self.assertGreater(changed, 0) - ev = tracker.read_event(self.root, "Agentic AI Night") - self.assertEqual(ev["phases"][0]["tasks"][0]["due"], "Jun 10") - # day-of clock times unchanged - dayof = ev["phases"][5]["tasks"][0]["due"] - self.assertRegex(dayof, r"^\d{1,2}:\d{2}$") -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: FAIL with `AttributeError: ... has no attribute 'set_field'`. - -- [ ] **Step 3: Write minimal implementation** - -These public writes delegate to **element-level helpers** that act on a detail-table / -phase-table directly (no event re-selection). Task 7 reuses the same helpers on cloned -elements — this is what avoids the "edit the wrong section" ambiguity. - -```python -# append to tracker.py -def _selected_or_raise(root, event): - e = _select(list_events(root), event) - if e is None: - raise LookupError("no event matching %r" % event) - return e - - -def _set_detail(detail_tbl, label, value): - """Set the value cell of the row whose label cell == label. Returns bool found.""" - for r in office.rows(detail_tbl): - cs = office.cells(r) - if len(cs) >= 2 and office.cell_text(cs[0]) == label: - office.set_cell_text(cs[1], value) - return True - return False - - -def _restamp_tables(detail_tbl, phase_tbls, old_date, new_date): - """Shift every phase DUE cell by (new-old); sync the DATE & TIME value's date. - Returns the count of DUE cells changed.""" - changed = 0 - for pt in phase_tbls: - for r in office.rows(pt)[1:]: - cs = office.cells(r) - if len(cs) >= 3: - cur = office.cell_text(cs[2]) - nv = restamp(cur, old_date, new_date) - if nv != cur: - office.set_cell_text(cs[2], nv) - changed += 1 - for r in office.rows(detail_tbl): - cs = office.cells(r) - if len(cs) >= 2 and office.cell_text(cs[0]) == "DATE & TIME": - txt = office.cell_text(cs[1]) - txt = _DATE_RE.sub(new_date.strftime("%B ") + str(new_date.day), txt, count=1) - txt = _YEAR_RE.sub(str(new_date.year), txt, count=1) - office.set_cell_text(cs[1], txt) - return changed - - -def _reset_status(phase_tbls): - for pt in phase_tbls: - for r in office.rows(pt)[1:]: - cs = office.cells(r) - if len(cs) >= 4: - office.set_cell_text(cs[3], "Not started") - - -def set_field(root, event, label, value): - e = _selected_or_raise(root, event) - if not _set_detail(e["detail_table"], label, value): - raise LookupError("no detail row labelled %r" % label) - - -def set_due_dates(root, event, new_event_date): - e = _selected_or_raise(root, event) - if e["date"] is None: - raise ValueError("event has no parseable current date; cannot restamp") - return _restamp_tables(e["detail_table"], e["phase_tables"], e["date"], new_event_date) -``` - -- [ ] **Step 4: Run test to verify it passes** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: PASS. - -- [ ] **Step 5: Commit** - -```bash -git add lib/aaif_meetups/tracker.py lib/aaif_meetups/tests/test_tracker.py -git commit -m "feat(tracker): set_field and set_due_dates writes" -``` - ---- - -## Task 7: `tracker.py` — clone & append a new event section - -**Files:** -- Modify: `lib/aaif_meetups/tracker.py` -- Test: `lib/aaif_meetups/tests/test_tracker.py` (add cases) - -**Interfaces:** -- Consumes: `office` (W, tables, rows, cells), `list_events`, `is_detail_table`, `is_phase_table`, `_set_detail`, `_restamp_tables`, `_reset_status`. (Add `import copy` to `tracker.py`'s imports.) -- Produces: - - `add_event(root, fields: dict, event_date: datetime.date) -> None` — clone the body elements spanning the **first** existing event (the heading paragraph immediately before its detail table, through its last phase table), edit the **cloned elements directly** (set detail fields from `fields`, restamp DUE cells from the example date to `event_date`, reset all STATUS to `"Not started"`), then insert the block just before the body's trailing ``. Editing the clone before insertion avoids any title/date selection ambiguity with the original example. `fields` keys are detail labels (`"EVENT TITLE"`, `"DATE & TIME"`, …). - -- [ ] **Step 1: Write the failing test** - -```python -# add to test_tracker.py -class TestAddEvent(unittest.TestCase): - def setUp(self): - self.root = office.read_document(FIX) - - def test_add_event_appends_section(self): - before = len(tracker.list_events(self.root)) - tracker.add_event(self.root, { - "EVENT TITLE": "Eval Night · Builder Series", - "DATE & TIME": "Wed · August 12, 2026 · 18:00 — late", - "SPEAKER(S)": "TBD", - }, dt.date(2026, 8, 12)) - evs = tracker.list_events(self.root) - self.assertEqual(len(evs), before + 1) - new = tracker.read_event(self.root, "Eval Night") - self.assertEqual(new["details"]["EVENT TITLE"], "Eval Night · Builder Series") - # statuses reset - self.assertTrue(all(t["status"] == "Not started" - for ph in new["phases"] for t in ph["tasks"])) - # dates restamped to the new event date (4-wks-out is ~28 days before Aug 12) - self.assertNotEqual(new["phases"][0]["tasks"][0]["due"], "May 27") -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: FAIL with `AttributeError: ... has no attribute 'add_event'`. - -- [ ] **Step 3: Write minimal implementation** - -Add `import copy` to the top of `tracker.py`, then append: - -```python -# append to tracker.py -def _body(root): - return root.find(office.W + "body") - - -def add_event(root, fields, event_date): - events = list_events(root) - if not events: - raise LookupError("tracker has no example event section to clone") - example = events[0] - old_date = example["date"] - body = _body(root) - kids = list(body) - # span: the paragraph immediately before the detail table .. the last phase table - detail_idx = kids.index(example["detail_table"]) - start = detail_idx - 1 if detail_idx > 0 and kids[detail_idx - 1].tag == office.W + "p" else detail_idx - last = example["phase_tables"][-1] if example["phase_tables"] else example["detail_table"] - end = kids.index(last) - block = [copy.deepcopy(kids[i]) for i in range(start, end + 1)] - # edit the CLONED elements directly (no re-selection against the original) - new_detail = next(el for el in block - if el.tag == office.W + "tbl" and is_detail_table(el)) - new_phases = [el for el in block - if el.tag == office.W + "tbl" and is_phase_table(el)] - for label, value in fields.items(): - _set_detail(new_detail, label, value) - if old_date is not None: - _restamp_tables(new_detail, new_phases, old_date, event_date) - _reset_status(new_phases) - # insert before trailing sectPr if present, else at end - sectpr = body.find(office.W + "sectPr") - insert_at = kids.index(sectpr) if sectpr is not None else len(kids) - for offset, el in enumerate(block): - body.insert(insert_at + offset, el) -``` - -Because the clone is edited *before* insertion, the new section already carries its own -title/date — later title-based reads (`read_event("Eval Night")`) are unambiguous. - -- [ ] **Step 4: Run test to verify it passes** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: PASS. - -- [ ] **Step 5: Validate the written docx still opens (no corruption)** - -Add a round-trip assertion to the test: after `add_event`, `save_document` to a temp path and `read_document` it back, asserting the table count increased by 9 (1 detail + 8 phase). Append to `test_add_event_appends_section`: - -```python - import tempfile - with tempfile.TemporaryDirectory() as dd: - out = os.path.join(dd, "out.docx") - office.save_document(FIX, self.root, out) - reloaded = office.read_document(out) - self.assertEqual(len(tracker.list_events(reloaded)), before + 1) -``` - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: PASS — the appended section survives a save→reload. - -- [ ] **Step 6: Commit** - -```bash -git add lib/aaif_meetups/tracker.py lib/aaif_meetups/tests/test_tracker.py -git commit -m "feat(tracker): add_event clones and appends a dated section" -``` - ---- - -## Task 8: `gws_cli.py` — Drive helpers (extracted, shared) - -**Files:** -- Create: `lib/aaif_meetups/gws_cli.py` -- Test: `lib/aaif_meetups/tests/test_gws_cli.py` - -**Interfaces:** -- Produces (ported verbatim from `create_chapter.py`'s helpers, made importable): - - `gws_json(*args, params=None, body=None) -> dict` - - `gws_download(file_id, out_path) -> None` - - `gws_upload(file_id, path, mime) -> None` - - `list_children(folder_id) -> list[dict]` - - `find_child(folder_id, name) -> dict | None` — first non-trashed child with exact name. - - `DOCX` mime constant. - -- [ ] **Step 1: Write the failing test** (pure-function test only — no Drive calls) - -```python -# lib/aaif_meetups/tests/test_gws_cli.py -import unittest -from aaif_meetups import gws - -class TestGwsModule(unittest.TestCase): - def test_exposes_callables_and_mime(self): - for name in ("gws_json", "gws_download", "gws_upload", - "list_children", "find_child"): - self.assertTrue(callable(getattr(gws, name)), name) - self.assertIn("wordprocessingml", gws_cli.DOCX) -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_gws -v` -Expected: FAIL with `ModuleNotFoundError: No module named 'aaif_meetups.gws'`. - -- [ ] **Step 3: Write minimal implementation** - -Port the helpers from `skills/aaif-create-chapter/scripts/create_chapter.py` (the `_gws`, `gws_json`, `gws_download`, `gws_upload`, `list_children` functions and the `DOCX`/folder constants), into `lib/aaif_meetups/gws_cli.py`. Add `find_child`: - -```python -def find_child(folder_id, name): - for c in list_children(folder_id): - if c.get("name") == name: - return c - return None -``` - -Keep `list_children` filtering `trashed=false` (already does). Do NOT change behavior — this is a lift-and-shift so the existing scripts can import it in Task 12. - -- [ ] **Step 4: Run test to verify it passes** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_gws -v` -Expected: PASS. - -- [ ] **Step 5: Commit** - -```bash -git add lib/aaif_meetups/gws_cli.py lib/aaif_meetups/tests/test_gws_cli.py -git commit -m "feat(gws): shared Drive helpers extracted from create_chapter" -``` - ---- - -## Task 9: `tracker.py` — `locate_tracker` (Drive resolution) - -**Files:** -- Modify: `lib/aaif_meetups/tracker.py` -- Test: `lib/aaif_meetups/tests/test_tracker.py` (add a test that monkeypatches `gws`) - -**Interfaces:** -- Consumes: `gws_cli.list_children`, `gws_cli.find_child`. -- Produces: - - `CHAPTERS_PARENT`, `ONLINE_PARENT` constants (the folder IDs from Global Constraints). - - `locate_tracker(name) -> {"file_id", "kind", "folder_id", "folder_name"}` — find a folder named `name` (case-insensitive exact) under Chapters/ first, else Online/; `kind` is `"chapter"` or `"series"`. Inside it, find `Event Tracker.docx`. Raises `LookupError` if the folder or the tracker is missing. - -- [ ] **Step 1: Write the failing test** (monkeypatch Drive — no network) - -```python -# add to test_tracker.py -from aaif_meetups import gws_cli as gws_mod - -class TestLocate(unittest.TestCase): - def test_locate_prefers_chapters_then_online(self): - calls = {} - def fake_children(folder_id): - if folder_id == tracker.CHAPTERS_PARENT: - return [{"id": "fA", "name": "Berlin", - "mimeType": "application/vnd.google-apps.folder"}] - if folder_id == "fA": - return [{"id": "tDoc", "name": "Event Tracker.docx"}] - return [] - orig = gws_mod.list_children - gws_mod.list_children = fake_children - try: - got = tracker.locate_tracker("berlin") - finally: - gws_mod.list_children = orig - self.assertEqual(got["file_id"], "tDoc") - self.assertEqual(got["kind"], "chapter") -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: FAIL with `AttributeError: ... has no attribute 'locate_tracker'`. - -- [ ] **Step 3: Write minimal implementation** - -```python -# append to tracker.py -from aaif_meetups import gws - -CHAPTERS_PARENT = "1IQ1K7aVOKUUkxAcfLuNjdETEnmavvtjx" -ONLINE_PARENT = "1g2vHrqDHfh9wBkDJryJIl8wqXA4J-d4i" -FOLDER_MIME = "application/vnd.google-apps.folder" - - -def _find_folder(parent, name): - key = name.strip().lower() - for c in gws_cli.list_children(parent): - if c.get("mimeType") == FOLDER_MIME and c.get("name", "").lower() == key: - return c - return None - - -def locate_tracker(name): - for parent, kind in ((CHAPTERS_PARENT, "chapter"), (ONLINE_PARENT, "series")): - folder = _find_folder(parent, name) - if folder: - doc = gws_cli.find_child(folder["id"], "Event Tracker.docx") - if not doc: - raise LookupError("%r has no Event Tracker.docx" % name) - return {"file_id": doc["id"], "kind": kind, - "folder_id": folder["id"], "folder_name": folder["name"]} - raise LookupError("no chapter or series named %r" % name) -``` - -- [ ] **Step 4: Run test to verify it passes** - -Run: `PYTHONPATH=lib python -m unittest aaif_meetups.tests.test_tracker -v` -Expected: PASS. - -- [ ] **Step 5: Commit** - -```bash -git add lib/aaif_meetups/tracker.py lib/aaif_meetups/tests/test_tracker.py -git commit -m "feat(tracker): locate_tracker resolves chapter or series" -``` - ---- - -## Task 10: Skill `aaif-event-status` (read-only) - -**Files:** -- Create: `skills/aaif-event-status/SKILL.md` -- Create: `skills/aaif-event-status/scripts/event_status.py` - -**Interfaces:** -- Consumes: `tracker.locate_tracker`, `gws_cli.gws_download`, `office.read_document`, `tracker.list_events` / `read_event`, `tracker.parse_due`. -- Produces: a CLI `python event_status.py [event]` that prints overdue / due-soon tasks by owner. Read-only. - -- [ ] **Step 1: Write the failing test (core logic, offline)** - -```python -# skills/aaif-event-status/scripts/test_event_status.py -import datetime as dt, os, sys, unittest -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "lib"))) -sys.path.insert(0, os.path.dirname(__file__)) -import event_status - -class TestClassify(unittest.TestCase): - def test_overdue_and_due_soon(self): - today = dt.date(2026, 6, 10) - tasks = [ - {"task": "A", "owner": "Org", "due": "Jun 3", "status": "Not started"}, # overdue - {"task": "B", "owner": "Org", "due": "Jun 12", "status": "Not started"}, # due soon - {"task": "C", "owner": "Org", "due": "Jun 3", "status": "Done"}, # done -> ignore - {"task": "D", "owner": "Co", "due": "16:00", "status": "Not started"}, # clock -> ignore - ] - anchor = dt.date(2026, 6, 24) - res = event_status.classify(tasks, anchor, today) - self.assertEqual([t["task"] for t in res["overdue"]], ["A"]) - self.assertEqual([t["task"] for t in res["due_soon"]], ["B"]) -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `python -m unittest skills.aaif-event-status.scripts.test_event_status -v` — but the hyphen in the path blocks dotted import. Run directly instead: -`python skills/aaif-event-status/scripts/test_event_status.py` -Expected: FAIL with `ModuleNotFoundError: No module named 'event_status'`. - -- [ ] **Step 3: Write minimal implementation** - -```python -#!/usr/bin/env python3 -"""Read-only status digest for a chapter/series Event Tracker: overdue and -due-soon tasks grouped by owner. Reads via the gws CLI; pure-Python parsing.""" -import argparse, datetime as dt, os, pathlib, sys, tempfile - -sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[3] / "lib")) -from aaif_meetups import gws_cli, office, tracker # noqa: E402 - -DUE_SOON_DAYS = 7 - - -def classify(tasks, anchor, today): - overdue, due_soon = [], [] - for t in tasks: - d = tracker.parse_due(t.get("due", ""), anchor) - if d is None or t.get("status") == "Done": - continue - if d < today: - overdue.append(t) - elif (d - today).days <= DUE_SOON_DAYS: - due_soon.append(t) - return {"overdue": overdue, "due_soon": due_soon} - - -def _digest(ev, today): - flat = [t for ph in ev["phases"] for t in ph["tasks"]] - res = classify(flat, ev["date"] or today, today) - lines = ["", "== %s ==" % ev["title"], - "%d overdue, %d due within %d days" - % (len(res["overdue"]), len(res["due_soon"]), DUE_SOON_DAYS)] - for label in ("overdue", "due_soon"): - if res[label]: - lines.append(" %s:" % label.replace("_", "-")) - for t in sorted(res[label], key=lambda x: x.get("owner", "")): - lines.append(" [%s] %s (due %s)" % (t["owner"], t["task"], t["due"])) - return "\n".join(lines) - - -def main(): - ap = argparse.ArgumentParser() - ap.add_argument("group", help="chapter or series name") - ap.add_argument("event", nargs="?", help="optional event title; default all") - a = ap.parse_args() - loc = tracker.locate_tracker(a.group) - with tempfile.TemporaryDirectory() as d: - path = os.path.join(d, "tracker.docx") - gws_cli.gws_download(loc["file_id"], path) - root = office.read_document(path) - events = tracker.list_events(root) - if a.event: - events = [e for e in events if a.event.lower() in e["title"].lower()] - today = dt.date.today() - print("%s (%s) — %d event(s)" % (loc["folder_name"], loc["kind"], len(events))) - for e in events: - print(_digest(tracker.read_event(root, e["title"]), today)) - - -if __name__ == "__main__": - main() -``` - -- [ ] **Step 4: Run test to verify it passes** - -Run: `python skills/aaif-event-status/scripts/test_event_status.py` -Expected: PASS. - -- [ ] **Step 5: Write the SKILL.md** - -```markdown ---- -name: aaif-event-status -description: Report task status for an AAIF chapter or online series — which event tasks are overdue or due soon, grouped by owner, read from the Event Tracker.docx. Use when asked for the status / health / what's-due of a chapter or series' events. -argument-hint: ' [event]' ---- - -# AAIF Event Status - -Read-only digest of a chapter or online series' `Event Tracker.docx`: for each -event, the **overdue** and **due-soon** (within 7 days) tasks, grouped by owner. -Never writes. - -Prereq: the `gws` CLI must be installed and authenticated (`gws-cli-access`). -The first argument resolves under **Chapters/** or **Online/** automatically. - -## Run - - python skills/aaif-event-status/scripts/event_status.py "" ["event"] - -Examples: - - python skills/aaif-event-status/scripts/event_status.py "Berlin" - python skills/aaif-event-status/scripts/event_status.py "Reading Group" "Paper Club" - -Status is computed against today's date from each task's DUE cell; clock-time -day-of tasks and `Done` tasks are excluded. -``` - -- [ ] **Step 6: Commit** - -```bash -git add skills/aaif-event-status -git commit -m "feat: aaif-event-status skill (read-only task digest)" -``` - ---- - -## Task 11: Skills `aaif-create-event` and `aaif-update-event` - -**Files:** -- Create: `skills/aaif-create-event/SKILL.md` + `scripts/create_event.py` -- Create: `skills/aaif-update-event/SKILL.md` + `scripts/update_event.py` -- Test: `skills/aaif-create-event/scripts/test_create_event.py` - -**Interfaces:** -- Consumes: `tracker.locate_tracker/add_event/set_field/set_due_dates/read_event/parse_event_date`, `gws_cli.gws_download/gws_upload/DOCX`, `office.read_document/save_document`. -- Produces: - - `create_event.py --title T --date "..." [--theme --venue --platform --speakers --luma --capacity --organizer] [--dry-run]` — downloads the tracker, `add_event`, re-uploads. Aborts if an event with the same title already exists. - - `update_event.py [--set "LABEL=value" ...] [--date "..."]` — applies field edits; if `--date`, recomputes due dates; prints which downstream assets are now stale. - -- [ ] **Step 1: Write the failing test for create_event core (offline, on a fixture copy)** - -```python -# skills/aaif-create-event/scripts/test_create_event.py -import datetime as dt, os, shutil, sys, tempfile, unittest -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "lib"))) -sys.path.insert(0, os.path.dirname(__file__)) -import create_event -from aaif_meetups import office, tracker - -FIX = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", - "lib", "aaif_meetups", "tests", "fixtures", - "event_tracker_irl.docx")) - -class TestCreateCore(unittest.TestCase): - def test_apply_adds_event_to_local_docx(self): - with tempfile.TemporaryDirectory() as d: - local = os.path.join(d, "t.docx") - shutil.copy(FIX, local) - create_event.apply_local(local, { - "EVENT TITLE": "Eval Night", - "DATE & TIME": "Wed · August 12, 2026 · 18:00 — late", - }, dt.date(2026, 8, 12)) - root = office.read_document(local) - titles = [e["title"] for e in tracker.list_events(root)] - self.assertIn("Eval Night", titles) -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `python skills/aaif-create-event/scripts/test_create_event.py` -Expected: FAIL with `ModuleNotFoundError: No module named 'create_event'`. - -- [ ] **Step 3: Implement `create_event.py`** - -```python -#!/usr/bin/env python3 -"""Create a new event section in a chapter/series Event Tracker.docx: clone the -example section, fill details, and stamp all phase due-dates from the event date. -Stdlib-only, pure-Python docx edit; Drive I/O via the gws CLI.""" -import argparse, datetime as dt, os, pathlib, sys, tempfile - -sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[3] / "lib")) -from aaif_meetups import gws_cli, office, tracker # noqa: E402 - -# CLI flag -> detail label -FIELD_MAP = {"title": "EVENT TITLE", "date": "DATE & TIME", "theme": "THEME / SERIES", - "venue": "VENUE", "platform": "VENUE", "speakers": "SPEAKER(S)", - "luma": "LUMA URL", "capacity": "CAPACITY / RSVPS", - "organizer": "ORGANIZER ON POINT", "location": "LOCATION / CITY"} - - -def apply_local(path, fields, event_date): - root = office.read_document(path) - tracker.add_event(root, fields, event_date) - office.save_document(path, root, path) - - -def _fields_from_args(a): - fields = {} - for flag, label in FIELD_MAP.items(): - val = getattr(a, flag, None) - if val: - fields[label] = val - return fields - - -def main(): - ap = argparse.ArgumentParser() - ap.add_argument("group", help="chapter or series name") - ap.add_argument("--title", required=True) - ap.add_argument("--date", required=True, help='e.g. "Wed · August 12, 2026 · 18:00 — late"') - for f in ("theme", "venue", "platform", "speakers", "luma", "capacity", - "organizer", "location"): - ap.add_argument("--" + f) - ap.add_argument("--dry-run", action="store_true") - a = ap.parse_args() - - event_date = tracker.parse_event_date(a.date) - fields = _fields_from_args(a) - loc = tracker.locate_tracker(a.group) - print("Tracker: %s (%s) event: %s date: %s" - % (loc["folder_name"], loc["kind"], a.title, event_date)) - if a.dry_run: - print("[dry-run] would clone the example section and stamp dates; no write.") - return - with tempfile.TemporaryDirectory() as d: - path = os.path.join(d, "tracker.docx") - gws_cli.gws_download(loc["file_id"], path) - root = office.read_document(path) - if any(a.title.lower() in e["title"].lower() for e in tracker.list_events(root)): - sys.exit("ABORT: an event titled %r already exists in this tracker." % a.title) - tracker.add_event(root, fields, event_date) - office.save_document(path, root, path) - gws_cli.gws_upload(loc["file_id"], path, gws_cli.DOCX) - print("Done. New event section added and due-dates stamped.") - - -if __name__ == "__main__": - main() -``` - -- [ ] **Step 4: Run create_event test to verify it passes** - -Run: `python skills/aaif-create-event/scripts/test_create_event.py` -Expected: PASS. - -- [ ] **Step 5: Implement `update_event.py`** - -```python -#!/usr/bin/env python3 -"""Apply a targeted change to an existing event in a chapter/series tracker: -edit detail fields and, when the date moves, recompute every phase due-date. -Then report which downstream assets are now stale. Pure-Python docx edit.""" -import argparse, os, pathlib, sys, tempfile - -sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[3] / "lib")) -from aaif_meetups import gws_cli, office, tracker # noqa: E402 - -STALE_ON_DATE = ["square banner", "Luma cover", "announcement post", - "carousel", "day-of slides", "attendee reminder"] -STALE_ON_SPEAKER = ["speaker bio", "announcement post", "carousel", "day-of slides"] - - -def main(): - ap = argparse.ArgumentParser() - ap.add_argument("group") - ap.add_argument("event") - ap.add_argument("--set", action="append", default=[], - metavar="LABEL=VALUE", help='e.g. --set "SPEAKER(S)=Jane Doe"') - ap.add_argument("--date", help="new DATE & TIME value; triggers due-date recompute") - a = ap.parse_args() - - loc = tracker.locate_tracker(a.group) - with tempfile.TemporaryDirectory() as d: - path = os.path.join(d, "tracker.docx") - gws_cli.gws_download(loc["file_id"], path) - root = office.read_document(path) - stale = set() - for pair in a.set: - label, _, value = pair.partition("=") - tracker.set_field(root, a.event, label.strip(), value.strip()) - if "SPEAKER" in label.upper(): - stale.update(STALE_ON_SPEAKER) - if a.date: - tracker.set_field(root, a.event, "DATE & TIME", a.date) - tracker.set_due_dates(root, a.event, tracker.parse_event_date(a.date)) - stale.update(STALE_ON_DATE) - office.save_document(path, root, path) - gws_cli.gws_upload(loc["file_id"], path, gws_cli.DOCX) - print("Updated %r in %s." % (a.event, loc["folder_name"])) - if stale: - print("Now stale — re-run these skills: " + ", ".join(sorted(stale))) - - -if __name__ == "__main__": - main() -``` - -Note: `update_event.py` is exercised through `tracker`'s already-tested `set_field`/`set_due_dates`; no separate unit test beyond those. The stale-asset lists are static strings (no logic to test). - -- [ ] **Step 6: Write both SKILL.md files** - -`skills/aaif-create-event/SKILL.md`: - -```markdown ---- -name: aaif-create-event -description: Create a new event in an AAIF chapter or online series by cloning the example section in its Event Tracker.docx and stamping all phase task due-dates from the event date. Use when asked to add/schedule/set up a new event for a chapter or series. -argument-hint: ' --title "..." --date "..."' ---- - -# AAIF Create Event - -Clone the example event section in a chapter/series `Event Tracker.docx`, fill the -detail block, and compute every phase task's DUE date backward from the event date. -Mode is auto-detected: a chapter (under Chapters/) clones the in-person task set; an -online series (under Online/) clones the online set. Aborts if the title already exists. - -Prereq: `gws` CLI authenticated (`gws-cli-access`). - -## Run - - python skills/aaif-create-event/scripts/create_event.py "" \ - --title "Eval Night · Builder Series" \ - --date "Wed · August 12, 2026 · 18:00 — late" \ - [--theme "..."] [--venue "..."] [--platform "..."] [--speakers "..."] \ - [--luma "lu.ma/aaif-..."] [--capacity "..."] [--organizer "..."] [--dry-run] - -Anything you omit is left as the example's text for you to fill later. Due-dates -keep the template's exact cadence (each task's offset from the event date is preserved). -``` - -`skills/aaif-update-event/SKILL.md`: - -```markdown ---- -name: aaif-update-event -description: Apply a change to an existing AAIF event (chapter or series) — edit detail fields like speakers/venue/capacity, or move the date and recompute all task due-dates, then flag which marketing/banner assets are now stale. Use when asked to update/change/edit an event's details or date. -argument-hint: ' [--set "LABEL=value"] [--date "..."]' ---- - -# AAIF Update Event - -Change-driven editor for one event in a chapter/series `Event Tracker.docx`. State the -change; the skill edits the right detail fields. If you move the date, every phase task -DUE date is recomputed (clock-time day-of tasks are left alone). It then reports which -downstream assets (banner, Luma cover, posts, slides) are now stale so you can re-run -those skills — it does not regenerate them. - -Prereq: `gws` CLI authenticated (`gws-cli-access`). - -## Run - - # add/replace a speaker - python skills/aaif-update-event/scripts/update_event.py "Berlin" "Agentic AI Night" \ - --set "SPEAKER(S)=Jane Doe (Agent Infra)" - - # move the date (recomputes all due-dates) - python skills/aaif-update-event/scripts/update_event.py "Berlin" "Agentic AI Night" \ - --date "Wed · July 8, 2026 · 17:30 — late" - -Detail labels: EVENT TITLE, DATE & TIME, LOCATION / CITY, VENUE, THEME / SERIES, -FORMAT(S), SPEAKER(S), LUMA URL, CAPACITY / RSVPS, ORGANIZER ON POINT. -``` - -- [ ] **Step 7: Commit** - -```bash -git add skills/aaif-create-event skills/aaif-update-event -git commit -m "feat: aaif-create-event and aaif-update-event skills" -``` - ---- - -## Task 12: Refactor existing scripts onto shared `gws_cli.py` - -**Files:** -- Modify: `skills/aaif-create-chapter/scripts/create_chapter.py` -- Modify: `skills/aaif-create-online-series/scripts/create_series.py` - -**Interfaces:** -- Consumes: `lib/aaif_meetups/gws_cli.py` (Task 8). - -- [ ] **Step 1: Add the sys.path shim + import, delete the duplicated helpers in `create_chapter.py`** - -Replace the in-file `_gws`, `gws_json`, `gws_download`, `gws_upload`, `list_children`, `create_folder`, `copy_file` definitions with: - -```python -import pathlib, sys -sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[3] / "lib")) -from aaif_meetups.gws_cli import ( # noqa: E402 - gws_json, gws_download, gws_upload, list_children, DOCX, PPTX, XLSX, FOLDER, -) -``` - -(Move any constants the script still needs — `PPTX`, `XLSX`, `FOLDER`, `MIME_BY_EXT` — into `gws_cli.py` if not already there, and import them. Keep `create_folder`/`copy_file` in `gws_cli.py` too.) - -- [ ] **Step 2: Run the existing local rebrand self-test to prove no regression** - -Run: `python skills/aaif-create-chapter/scripts/create_chapter.py --city "Los Angeles" --rebrand-local /tmp/nonexistent 2>&1 | head -1` -Expected: the script imports cleanly (no `ImportError`); it will then report the dir doesn't exist — that's fine, it proves imports resolve. - -- [ ] **Step 3: Repeat for `create_series.py`** (same shim + import; delete its duplicated helpers). - -- [ ] **Step 4: Run the full test suite** - -Run: `PYTHONPATH=lib python -m unittest discover -s lib/aaif_meetups/tests -v` -Expected: all PASS. - -- [ ] **Step 5: Commit** - -```bash -git add skills/aaif-create-chapter/scripts/create_chapter.py skills/aaif-create-online-series/scripts/create_series.py -git commit -m "refactor: create_chapter/create_series import shared gws helpers" -``` - ---- - -## Task 13: End-to-end dry-run validation against real Drive (manual checkpoint) - -**Files:** none (verification only). - -- [ ] **Step 1: Status on a real chapter (read-only, safe)** - -Run: `python skills/aaif-event-status/scripts/event_status.py "San Francisco"` -Expected: prints the chapter, its event(s), and overdue/due-soon tasks without error. - -- [ ] **Step 2: create-event dry-run (no write)** - -Run: `python skills/aaif-create-event/scripts/create_event.py "San Francisco" --title "ZZZ Test Event" --date "Wed · September 9, 2026 · 18:00 — late" --dry-run` -Expected: prints the resolved tracker + parsed date; no upload. - -- [ ] **Step 3: Confirm tests + lint clean** - -Run: `PYTHONPATH=lib python -m unittest discover -s lib/aaif_meetups/tests -v && ruff check lib skills` -Expected: tests PASS; ruff reports no `F`/`E9` errors. - -- [ ] **Step 4: Final commit (if anything adjusted)** - -```bash -git add -A && git commit -m "chore: event-lifecycle e2e dry-run validation" || echo "nothing to commit" -``` - ---- - -## Self-Review notes - -- **Spec coverage:** `tracker-io` (Tasks 2–9), `create-event` (11), `update-event` (11), - `event-status` (10), `` arg + mode auto-detect (9, skills), date rule - (4, 6), dedup guard (11 Step 3), stale-asset flagging (11 Step 5), shared-lib + de-dup - of gws helpers (8, 12), fixture/offline tests + `--dry-run`/`apply_local` (throughout). -- **Out of scope (correctly absent):** banner/image generation and any soffice/`.pptx` - rendering (sub-project #3); chapter/series health (sub-project #4); two-plugin split - (sub-project #5). -- **Known follow-up:** phase *heading* anchor dates (e.g. "4 WEEKS OUT May 27 · …") are - not recomputed in v1 — only the authoritative DUE cells and the DATE & TIME value. - Acceptable; note for a later enhancement. diff --git a/docs/superpowers/specs/2026-06-30-aaif-event-lifecycle-design.md b/docs/superpowers/specs/2026-06-30-aaif-event-lifecycle-design.md deleted file mode 100644 index b7f3245..0000000 --- a/docs/superpowers/specs/2026-06-30-aaif-event-lifecycle-design.md +++ /dev/null @@ -1,274 +0,0 @@ -# AAIF Event Lifecycle + `tracker-io` Foundation — Design - -**Date:** 2026-06-30 -**Status:** Implemented (with revision below) - -> **Revision (post-build):** the gws-orchestration was pulled back OUT of Python. The -> Python layer (`lib/aaif_meetups/office.py` + `tracker.py`) is now a **deterministic, -> local-file docx engine only** — no Drive calls, no `gws` wrapper. The **agent drives -> every `gws` action directly** (locate → download → upload) per each skill's `SKILL.md`, -> for flexibility. There is no `locate_tracker()` or `gws_cli.py`; the original -> `create_chapter.py` / `create_series.py` keep their own self-contained gws calls. The -> design below still describes the docx engine and date math accurately; mentally replace -> "`locate_tracker` / `gws_cli`" with "the agent runs the gws CLI; Python edits the -> downloaded file." -**Scope of this spec:** Sub-projects #1 (the `tracker-io` foundation) and #2 (the -three event-lifecycle skills). The other sub-projects (pptx-fill-export, content-skill -enhancement, management/health skills, two-bundle repo split) are out of scope here and -will get their own specs. - ---- - -## 1. Context & goals - -The AAIF meetup skills repo migrated the per-folder `SKILLS.md.docx` prompts into 12 -versioned skills. The 8 content skills cover *the words & decks*; the 4 ops skills cover -intake and chapter/series creation. The gap: **nothing automates the per-event runbook** -— the `Event Tracker.docx`, which is the actual spine of running an event. - -This spec adds that spine: - -- a shared **`tracker-io`** layer that reads and writes an event's section inside a - chapter/series `Event Tracker.docx`, and -- three skills on top of it: **`aaif-create-event`**, **`aaif-update-event`**, - **`aaif-event-status`**. - -It also establishes two repo-wide conventions every later skill inherits: the standard -**` `** argument pair (the first argument is a chapter *or* an -online series), and **auto-detected online/in-person mode**. - -**Implementation note:** every edit in this spec is performed in **pure Python** on the -`.docx` XML — no LibreOffice/`soffice`, no rendering engine. (`soffice` was only ever -floated for a *later* sub-project, #3, to *render* a filled `.pptx` into a posted image; -that render-engine choice — pure-Python `Pillow` composition vs. `python-pptx` + `soffice` -— is deferred to the #3 spec and is out of scope here.) - -### Goals -- Create a fully-scaffolded event in the tracker (detail block + all phased task tables - with computed due-dates) from a few inputs. -- Apply targeted, change-driven edits to an existing event ("add speaker X", "move to - Jul 8") and recompute due-dates when the event date moves. -- Report task status across a chapter's events (overdue / due-soon / by owner). -- Keep the tracker as `.docx` (per decision #6) and stay **stdlib-only** (repo - philosophy — no third-party deps, no package to build). - -### Non-goals (this spec) -- Generating banners/decks/images, and any `.pptx` rendering (that's the file-aware - content skills, sub-project #3). The render-engine decision for #3 — pure-Python - `Pillow` composition vs. `python-pptx` + `soffice` — is explicitly deferred to that spec. -- Migrating to a Sheet (explicitly declined). -- The two-plugin bundle split (sub-project #5). - ---- - -## 2. Source of truth & data model - -Each chapter lives in `Chapters//`; each online series in `Online//`. Both -contain one `Event Tracker.docx`. Within a tracker: - -- **Preamble** (shared Quickstart + "How to use this tracker") — never touched. -- **Chapter/series identity blocks** (About, Vibes, Organizers, Luma) — never touched. -- **One section per event**, in document order. A section is: - 1. a **heading** paragraph, e.g. `June 24, 2026 · AGENTIC AI NIGHT — LAUNCH SERIES` - 2. a **detail table** with labelled rows: `EVENT TITLE`, `DATE & TIME`, - `LOCATION / CITY`, `VENUE`, `THEME / SERIES`, `FORMAT(S)`, `SPEAKER(S)`, `LUMA URL`, - `CAPACITY / RSVPS`, `ORGANIZER ON POINT` - 3. a sequence of **phase tables**, each a `TASK | OWNER | DUE | STATUS` grid, under a - phase heading: `4 WEEKS OUT`, `3 WEEKS OUT`, `2 WEEKS OUT`, `1 WEEK OUT`, - `DAY BEFORE`, `DAY OF`, `NEXT DAY`, `FOLLOW-UPS`. - -The **online tracker** (`Event Tracker (Online).docx`) has the same shape but a no-venue -task set (platform / join link / tech check / recording / chat-Q&A instead of -venue / A-V / food / door). - -**Canonical "example" section.** Every freshly-cloned tracker ships with one filled -example event (the June 24 "Agentic AI Night" block). `create-event` clones *that -section's structure*. Treat it as the template-of-record; do not delete it from the -masters. - ---- - -## 3. Foundation: `tracker-io` - -A stdlib-only module that manipulates `Event Tracker.docx` by editing `word/document.xml` -inside the docx zip (the same technique `create_chapter.py` already uses). No -`python-docx`. - -**Location:** `lib/aaif_meetups/` at repo root, holding: -- `gws.py` — the Drive helpers currently duplicated in `create_chapter.py` / - `create_series.py` (list/get/update/copy/create, retry wrapper). De-dups existing code. -- `office.py` — low-level docx helpers: load/save the zip, get/set `document.xml`, - iterate `` / `` / run text, deep-copy an element subtree. -- `tracker.py` — the event-aware API below. - -Each skill script adds the repo root to `sys.path` via -`Path(__file__).resolve().parents[3]` so imports work from source *and* from an installed -plugin. **Open item for sub-project #5:** the two-plugin split must decide how shared -`lib/` code is packaged into each plugin (vendor a copy, or make it pip-installable). Not -a blocker for #1/#2 (single plugin, `source: "./"`). - -### API - -``` -locate_tracker(chapter_or_series) -> {file_id, kind: "chapter"|"series", folder_id} - Resolve the folder under Chapters/ or Online/ by name (case-insensitive, exact), - find its "Event Tracker.docx". kind drives in-person vs online mode downstream. - -list_events(doc) -> [{title, heading, date, anchor_element_index}] - Parse all event sections in document order. - -read_event(doc, event) -> {details: {field: value}, phases: [{name, tasks: [...] }]} - event matches by title (case-insensitive substring), or the literal "next" - (soonest future DATE & TIME), or "latest". - -clone_example_section(doc) -> element subtree - Deep-copy the heading + detail table + all phase tables of the canonical example - section. Returns detached XML ready to fill and append. - -write_event(doc, fields, due_dates) -> doc - Fill a cloned section's detail rows + DUE cells + STATUS=Not started, append to the - body after the last existing event section (before any trailing content). - -set_field(doc, event, field, value) -> doc - Replace the value run of one detail row for one event. - -set_due_dates(doc, event, due_dates) -> doc - Rewrite DUE cells for one event's phase tables from a {task -> date} map. -``` - -Reads/writes are by **label / header text**, never positional index — mirrors the -`clean-data` / `triage-intake` "by header name" discipline so layout tweaks don't break it. - -### Date computation (shared rule) - -Offsets are derived from the **example section itself**, not hard-coded, so they track the -template if it changes: - -``` -for each task in the example: - offset_days[task] = example_task_DUE - example_EVENT_DATE # e.g. -28, -21, ... 0, +1 -new_due[task] = new_EVENT_DATE + offset_days[task] -``` - -Weekend handling and exact wording stay as-is (no rounding) for v1 — keep it predictable. -`DATE & TIME` parsing accepts the tracker's own format (`Tue · June 24, 2026 · 17:30 — -late`); a small tolerant parser extracts the date. - ---- - -## 4. Skill: `aaif-create-event` - -`argument-hint: ' '` plus event basics. - -**Inputs:** chapter or series name, event title, date (+ time), theme/series, venue *or* -platform, speakers, Luma URL, capacity, organizer-on-point. Anything omitted is left as a -`[bracketed]` placeholder for the organizer to fill. - -**Behavior:** -1. `locate_tracker(chapter)` → file + mode (chapter ⇒ in-person, series ⇒ online). -2. Download the tracker; abort if an event section with the same title/date already - exists (dedup guard). -3. `clone_example_section` → fill detail rows from inputs. -4. Compute due-dates from the event date via the shared rule; set all STATUS to - `Not started`. -5. Append the section, re-upload via `gws`. -6. Print a summary: created section, computed phase dates, and which fields were left as - placeholders. - -**Mode:** in-person clones the IRL example; online clones the online example (no -venue/A-V/food/door rows; platform/join/tech-check/recording/chat-Q&A instead). - ---- - -## 5. Skill: `aaif-update-event` - -`argument-hint: ' '` - -A **change-driven** editor, not a fixed pipeline. The organizer states the change; the -skill maps it to tracker edits. - -**Behavior:** -1. Locate tracker + `read_event` for the named event. -2. Interpret the requested change → one or more field edits: - - add/replace **speaker** → edit `SPEAKER(S)` - - change **date/time** → edit `DATE & TIME` **and** `set_due_dates` (recompute every - phase date from the new date) - - change **venue / platform / capacity / theme / Luma** → edit that detail row -3. Apply edits via `set_field` / `set_due_dates`, re-upload. -4. **Flag stale downstream assets** (do not regenerate): report which artifacts now - reference outdated info — e.g. "date changed ⇒ square banner, Luma cover, announcement - & carousel copy, day-of slides are now stale; re-run those skills." Regeneration is the - organizer's explicit next step (and lands when sub-project #3 makes those skills - file-aware). - ---- - -## 6. Skill: `aaif-event-status` - -`argument-hint: ' []'` - -**Behavior:** -1. Locate tracker; `list_events` (+ optional single-event filter). -2. For each task across phase tables, classify against **today** using the task's DUE and - STATUS: `overdue` (DUE < today, STATUS ≠ Done), `due-soon` (DUE within 7 days, not - Done), `done`, `upcoming`. -3. Output a digest: per event, the overdue and due-soon tasks grouped by OWNER, plus a - one-line health summary (e.g. "3 overdue, 5 due this week"). Read-only — never writes. - -This is the `triage-intake` pattern applied to event tasks. - ---- - -## 7. Shared conventions (repo-wide, established here) - -- **Arguments:** every event-scoped skill takes ` ` first — the - first argument resolves against `Chapters/` *or* `Online/`; details flow from the - tracker. Explicitly-passed values override what's read. -- **Mode auto-detection:** chapter (under `Chapters/`) ⇒ in-person; series (under - `Online/`) ⇒ online. No manual `--mode` needed; an override flag is allowed but not - required. -- **Drive access:** via the `gws` CLI (prereq: `gws-cli-access`), through `lib/aaif_meetups/gws.py`. -- **By-label, never positional:** all docx reads/writes match on label/header text. - ---- - -## 8. Risks & open items - -1. **docx section cloning in raw OOXML is the hard part.** Deep-copying a heading + - multiple tables and re-appending must preserve numbering/style refs and not corrupt the - doc. *Mitigation:* `office.py` clones whole ``/`` elements verbatim - (no reconstruction); round-trip every generated doc through a load/parse check before - upload; add fixture-based tests (section 9). If raw-XML proves too brittle in - implementation, revisit the stdlib-only constraint with the user before adding a dep. -2. **Tolerant date parsing** of the tracker's prose date format — covered by unit tests on - real strings. -3. **Shared-`lib/` packaging** under the future two-plugin split — flagged for #5; not a - blocker now. -4. **Existing chapters' example sections** may have drifted from the master. `create-event` - clones whatever the local tracker's example section is; if a tracker lacks one, fall - back to the master template's example section. - ---- - -## 9. Testing - -Stdlib `unittest`, fixture-driven, no Drive calls in tests: -- Check in a small fixture `Event Tracker.docx` (IRL + online) under - `lib/aaif_meetups/tests/fixtures/`. -- `tracker-io`: round-trip read → write → read; field edits; due-date math (golden values - for a known event date); date-parser cases; "next"/"latest" selection. -- Each skill exposes a pure core (compute + docx-transform) separate from the Drive I/O, - so the core is unit-tested offline (same split as `create_chapter.py`'s - `--rebrand-local`). A `--dry-run` plans without writing; a `--local ` runs the - transform on a local docx for testing. - ---- - -## 10. Build order (within this spec) - -1. `lib/aaif_meetups/`: `gws.py` (extract from existing scripts), `office.py`, `tracker.py` + tests. -2. `aaif-event-status` (read-only — exercises `tracker-io` reads with zero write risk). -3. `aaif-create-event` (clone/fill/date-stamp/append). -4. `aaif-update-event` (field edits + date recompute + stale-asset flagging). -5. Refactor `create_chapter.py` / `create_series.py` to import `lib/aaif_meetups/gws.py` - (remove the duplicated helpers) — opportunistic cleanup, since we're touching that code. From e4633d489c9878ba7712e39e3b9c961cc58d8f30 Mon Sep 17 00:00:00 2001 From: Rahul Parundekar Date: Wed, 1 Jul 2026 15:45:28 +0530 Subject: [PATCH 2/4] docs: rename "Event Name" folder refs to "Event Template" The per-event design-deck subfolder in TemplateCity/TemplateSeries was renamed to "Event Template" in Drive. Update all SKILL.md prose (and the create_series.py docstring) to match: carousel deck, day-of slides, and both create-* folder-shape descriptions. Co-Authored-By: Claude Opus 4.8 --- skills/aaif-carousel-copy/SKILL.md | 2 +- skills/aaif-create-chapter/SKILL.md | 2 +- skills/aaif-create-online-series/SKILL.md | 4 ++-- skills/aaif-create-online-series/scripts/create_series.py | 2 +- skills/aaif-dayof-slides/SKILL.md | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/skills/aaif-carousel-copy/SKILL.md b/skills/aaif-carousel-copy/SKILL.md index b48c25f..b0ad5c6 100644 --- a/skills/aaif-carousel-copy/SKILL.md +++ b/skills/aaif-carousel-copy/SKILL.md @@ -13,7 +13,7 @@ line. **Slide 1 hooks, slide 6 is the CTA.** **House voice:** share the practice, never sell the product. Specific over grand, builder-to-builder. Signal, not numbers. -**Workflow:** update the LinkedIn Carousel deck (`Event Name/LinkedIn Carousel.pptx` +**Workflow:** update the LinkedIn Carousel deck (`Event Template/LinkedIn Carousel.pptx` in the chapter's Drive folder) with this copy, export it as a PDF, then post the PDF. ## Input (from the event tracker) diff --git a/skills/aaif-create-chapter/SKILL.md b/skills/aaif-create-chapter/SKILL.md index a292d8e..be0651e 100644 --- a/skills/aaif-create-chapter/SKILL.md +++ b/skills/aaif-create-chapter/SKILL.md @@ -9,7 +9,7 @@ argument-hint: ' [--slug ]' Spin up a new AAIF city "chapter" by cloning the **TemplateCity** folder in the **Chapters** Google Drive and rebranding every Office file from San Francisco to the new city. Each chapter folder is the standard template: `Event Tracker.docx`, -`Attendee CRM.xlsx`, and the `Event Name/` + `Banners (...)/` subfolders of `.pptx` +`Attendee CRM.xlsx`, and the `Event Template/` + `Banners (...)/` subfolders of `.pptx` design assets. (The old `SKILLS.md.docx` of paste-into-Claude prompts is retired — those prompts now live as the `aaif-*` content skills in this repo.) diff --git a/skills/aaif-create-online-series/SKILL.md b/skills/aaif-create-online-series/SKILL.md index b02d65e..9e8c1ab 100644 --- a/skills/aaif-create-online-series/SKILL.md +++ b/skills/aaif-create-online-series/SKILL.md @@ -10,7 +10,7 @@ Spin up a new AAIF **online event series** (e.g. a Reading Group, a Paper Club) cloning the **TemplateSeries** folder in the top-level **Online** Google Drive folder and rebranding every Office file from San Francisco to the new series. This is the online sibling of [aaif-create-chapter]: same folder shape — `Event -Tracker.docx`, `Attendee CRM.xlsx`, and the `Event Name/` + `Banners (...)/` +Tracker.docx`, `Attendee CRM.xlsx`, and the `Event Template/` + `Banners (...)/` subfolders of `.pptx` design assets — but the **Event Tracker is the no-venue "online" runbook** (platform / join link / tech check / recording / chat-Q&A moderation instead of venue / A-V / food / door). @@ -78,7 +78,7 @@ placeholder the organizer fills in). `scripts/create_series.py` shares the **same text engine** as aaif-create-chapter (paragraph-level concatenate → transform → write-back, robust to OOXML run-splitting). Constants at the top: `ONLINE_PARENT` (the Online folder) and -`TEMPLATE_FOLDER` (TemplateSeries). The master's design decks (`Event Name/`, +`TEMPLATE_FOLDER` (TemplateSeries). The master's design decks (`Event Template/`, `Slides.pptx`) were authored from the chapter decks with the front-facing brand taglines de-chaptered; their **body content may still carry chapter/in-person phrasing** ("global network of chapters", "same venue") — that's the organizer- diff --git a/skills/aaif-create-online-series/scripts/create_series.py b/skills/aaif-create-online-series/scripts/create_series.py index 9167efc..5bc0938 100755 --- a/skills/aaif-create-online-series/scripts/create_series.py +++ b/skills/aaif-create-online-series/scripts/create_series.py @@ -4,7 +4,7 @@ Online series (e.g. a Reading Group, a Paper Club) live under the top-level **Online/** folder, NOT under Chapters/. They are the online-event sibling of a -city chapter: same folder shape (Event Tracker, Attendee CRM, Event Name/ +city chapter: same folder shape (Event Tracker, Attendee CRM, Event Template/ design assets, Banners/), but the Event Tracker is the no-venue "online" runbook (platform / join link / recording / chat-Q&A instead of venue / A-V / door). diff --git a/skills/aaif-dayof-slides/SKILL.md b/skills/aaif-dayof-slides/SKILL.md index e6d7ba8..0e9251a 100644 --- a/skills/aaif-dayof-slides/SKILL.md +++ b/skills/aaif-dayof-slides/SKILL.md @@ -7,7 +7,7 @@ argument-hint: '[event title / paste tracker entry]' # AAIF Day-of Slides (from the tracker) Turn an event's tracker entry into the text for the chapter's **"Day of Event"** -deck (`Event Name/Slides.pptx`). Fill the per-event slides from the tracker and +deck (`Event Template/Slides.pptx`). Fill the per-event slides from the tracker and **leave the fixed brand slides** (`[FIXED]`: About AAIF, the global-network stats) **exactly as written** — they are brand-standard. From 40c71af9ba192da3c576a538ace4945662b896e6 Mon Sep 17 00:00:00 2001 From: Rahul Parundekar Date: Wed, 1 Jul 2026 15:48:31 +0530 Subject: [PATCH 3/4] docs: address self-review findings on quickstart - Fix command name: /plugins -> /plugin (singular) in step 2 - Note the full git URL equals the aaif/meetups shorthand (step 1) - Align image alt text with step wording (commands, not skills) Co-Authored-By: Claude Opus 4.8 --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e95e6a3..e61cd59 100644 --- a/README.md +++ b/README.md @@ -27,11 +27,12 @@ meetup”), or invoke one explicitly with `/aaif-meetups:`. Prefer the guided UI flow? Run these inside Claude Code: -1. **Add the marketplace:** +1. **Add the marketplace** (the full git URL is equivalent to the `aaif/meetups` + shorthand used in [Install](#install-claude-code) above): ```bash /plugin marketplace add https://github.com/aaif/meetups.git#main ``` -2. **Enable it:** run `/plugins`, tab to **Marketplaces**, and enable the **aaif** +2. **Enable it:** run `/plugin`, tab to **Marketplaces**, and enable the **aaif** marketplace. 3. **Turn on auto‑update** for the marketplace so you always get the latest skills. 4. **Install the plugin:** in that marketplace, browse plugins and install @@ -44,7 +45,7 @@ Prefer the guided UI flow? Run these inside Claude Code: commands autocomplete, then pick one (or just describe your task and the matching skill auto‑activates). - ![Typing /aaif- shows the toolkit's skills autocompleting in Claude Code](assets/aaif-skills-autocomplete.png) + ![Typing /aaif- surfaces the toolkit's commands autocompleting in Claude Code](assets/aaif-skills-autocomplete.png) --- From f4353e1f16956f9841eb682c854a024dfbfc13cf Mon Sep 17 00:00:00 2001 From: Rahul Parundekar Date: Wed, 1 Jul 2026 15:51:45 +0530 Subject: [PATCH 4/4] docs: align skill-invocation guidance to bare /aaif- form Copilot flagged that step 6 used bare /aaif- autocomplete while the Install paragraph documented /aaif-meetups:. Standardize on the bare /aaif- form (matches the autocomplete screenshot) and add a concrete example in both places. Co-Authored-By: Claude Opus 4.8 --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e61cd59..488b53e 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,8 @@ also work in claude.ai and the Claude Agent SDK — see [Using in other tools](# `marketplace add aaif/meetups` reads `.claude-plugin/marketplace.json` from this repo; `@aaif` is the marketplace name. After installing, the skills auto‑activate when you describe a matching task (e.g. “draft the announcement post for our July -meetup”), or invoke one explicitly with `/aaif-meetups:`. +meetup”), or invoke one explicitly with `/aaif-` (e.g. +`/aaif-announcement-post`). ### Quickstart (step‑by‑step) @@ -41,9 +42,9 @@ Prefer the guided UI flow? Run these inside Claude Code: ```bash /reload-plugins ``` -6. **Start using the skills:** type `/aaif-` in the prompt to see the toolkit's - commands autocomplete, then pick one (or just describe your task and the - matching skill auto‑activates). +6. **Start using the skills:** type `/aaif-` to autocomplete the toolkit's + commands (e.g. `/aaif-announcement-post`), or just describe your task and the + matching skill auto‑activates. ![Typing /aaif- surfaces the toolkit's commands autocompleting in Claude Code](assets/aaif-skills-autocomplete.png)