Skip to content

[meetup] Create one event across several groups in a network - #2

Merged
duxi90 merged 2 commits into
mainfrom
feat/meetup-multi-group
Aug 18, 2026
Merged

[meetup] Create one event across several groups in a network#2
duxi90 merged 2 commits into
mainfrom
feat/meetup-multi-group

Conversation

@duxi90

@duxi90 duxi90 commented Aug 18, 2026

Copy link
Copy Markdown
Member

Description

  • New groups and groupHosts config keys: one run creates the same event in every
    group of a Pro network, with per-group hosts. resolveGroupTargets expands config into
    an ordered, de-duplicated target list; createMeetupDrafts walks it.
  • --groups <names|all> on both create commands opts in. Without it a run targets
    groupUrlname alone and --output keeps its single-event shape.
  • Group matching is case-insensitive throughout — Meetup urlnames are, and a network
    reports CPPTORONTO where a config plausibly says cpptoronto.
  • Groups run sequentially; one failure does not stop the rest, every outcome is reported,
    and the exit code is 1 if any group failed.

There is deliberately no rollback on partial failure (the README says so) — a blind retry
would duplicate the drafts that already succeeded. CreateEventInput.proNetworkEvents
goes unused for a related reason: it propagates through a saved filterId that no query
exposes, so the set of groups it would reach is unverifiable from code.

Motivation

A Pro network cross-posts the same session to every group in it; until now that meant
invoking the package once per group and stitching the results together by hand.

Testing

Tested locally. Full CI chain green (build, lint, format:check, typecheck, spell, test),
85 tests. Also ran create-from-json --dry-run --groups all against a three-group config:
targets resolve in config order, a groupHosts override applies across a case mismatch
(cpptoronto key → CPPTORONTO target), and --output reports each group separately.
Nothing reaches the Meetup API.

Checkup list

  • Labeled
  • Assigned to a project
  • Linked issue(s) (to close or track progress)
  • Documentation updated
  • Test coverage

duxi90 and others added 2 commits August 18, 2026 11:16
A Pro network cross-posts the same session to every group in it, but the
package could only ever target one group per run, so an adopter had to
invoke it N times and stitch the results together by hand.

Config gains `groups` (extra urlnames beyond `groupUrlname`) and
`groupHosts` (per-group host names). Per-group hosts matter: groups in a
network almost always have different organizers, so one `defaultHosts`
rarely fits all of them. `resolveGroupTargets` expands config into the
ordered, de-duplicated target list with hosts already resolved, and
`createMeetupDrafts` walks it.

Matching is case-insensitive throughout -- for the target list, the
`--groups` filter and the `groupHosts` keys -- because Meetup urlnames are
case-insensitive and a network reports e.g. CPPTORONTO where a config
plausibly says cpptoronto.

Groups are processed sequentially and one failure does not stop the rest;
every outcome is reported so the caller can retry only what failed. There
is deliberately no rollback, which the README calls out: a blind retry
would duplicate the drafts that already succeeded.

`--groups` is opt-in. Without it a run targets `groupUrlname` alone and
--output keeps its single-event shape, so existing setups see no change;
with it, --output carries a per-group breakdown and the exit code is 1 if
any group failed.

Not using CreateEventInput.proNetworkEvents was a deliberate call. It
propagates via a saved filterId that no query exposes, so the set of
groups it would reach is unverifiable from code. Naming groups is
explicit and each draft stays individually reviewable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The --output summary derived its status from every(r => r.ok), which is
true for dry runs too, so a --dry-run --groups run wrote
{"status":"created"} -- a lie a caller could act on, and exactly the kind
of thing a CI step would branch on.

aggregateStatus now returns "partial" if any group failed, otherwise the
status the groups agree on ("dry-run" or "created"), or "mixed" if they
somehow disagree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@duxi90 duxi90 added documentation Improvements or additions to documentation enhancement New feature or request labels Aug 18, 2026
@duxi90
duxi90 merged commit 79e60e7 into main Aug 18, 2026
2 checks passed
@duxi90
duxi90 deleted the feat/meetup-multi-group branch August 18, 2026 09:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant