Add AAIF Meetups Toolkit (flattened single-plugin marketplace) + repo hardening#1
Conversation
Single-plugin Claude Code marketplace (root is both the marketplace and the plugin via source "./"). 12 Agent Skills for running AAIF in-person and online meetups: content writing (announcement, carousel, Luma description, speaker invite/bio, day-of slides, attendee reminder, recap) and ops (create-chapter, create-online-series, triage-intake, clean-data). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- .pre-commit-config.yaml: hygiene hooks, check-json/yaml, Ruff (bug-focused lint, no style churn), codespell, gitleaks, and a local SKILL.md frontmatter validator (scripts/check_frontmatter.py). - .github/workflows/validate.yml: CI runs pre-commit + `claude plugin validate`. - pyproject.toml: Ruff + codespell config. - $schema on marketplace.json and plugin.json (SchemaStore). - CHANGELOG.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Hero Self-ReviewFive Critical (1)
Important (8)
Suggestions (selected)
Strengths
Self-review by Claude Code |
- CHANGELOG: point at .claude-plugin/plugin.json, not the removed nested path. - check_frontmatter docstring + pre-commit comments: claude plugin validate does NOT parse skill frontmatter; this hook is the guard (locally and in CI). - Clarify the ruff comment: --fix removes unused imports but does not reformat. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Address silent-failure / correctness findings from the self-review:
- luma check is now 3-state (live / absent / could-not-verify) instead of
reporting every timeout, DNS/SSL or 5xx error as a hard "NOT LIVE (404)".
- residual rebrand tokens are accumulated and now fail the run (non-zero exit)
instead of an easy-to-miss inline note under a "Done." success message.
- clean.py / intake.py treat a missing required header (Full name/Email,
Timestamp/Status) as a hard error rather than silently reporting "nothing to
fix" / "0 awaiting review".
- gws_json raises on empty or non-JSON stdout instead of returning {} (which
silently skipped a subtree during clone).
- clean.py: guard the Email column before indexing (was a latent TypeError when
the Email header is absent).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Hero Self-Review ImprovementsApplied the doc fixes + all four correctness fixes. Two commits: Critical (1 / 1 fixed):
Important (8 / 8 fixed):
Suggestions (1 fixed, rest deferred):
Skipped / deferred (with reasons):
Commits: Applied by Claude Code |
There was a problem hiding this comment.
Pull request overview
Bootstraps the aaif/meetups repository by adding the AAIF Meetups Toolkit as a flattened single-plugin Claude Code marketplace (marketplace root is also the plugin source) and introducing repo hardening via pre-commit and CI validation.
Changes:
- Adds 12 AAIF meetup “Agent Skills” (content + ops) with supporting Python helper scripts for Drive/Sheets workflows.
- Introduces repo hardening: pre-commit hooks (YAML/JSON checks, Ruff, codespell, gitleaks, SKILL frontmatter validation) and a GitHub Actions workflow to run validation.
- Adds manifests (
plugin.json,marketplace.json) and repository documentation (README/CONTRIBUTING/CHANGELOG) plus basic tooling config (pyproject.toml).
Reviewed changes
Copilot reviewed 26 out of 27 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| skills/aaif-triage-intake/SKILL.md | New intake-triage skill instructions for reviewing and digesting the intake queue. |
| skills/aaif-triage-intake/scripts/intake.py | Script to pull and format intake queue rows from Google Sheets via gws. |
| skills/aaif-speaker-invite/SKILL.md | New writing skill for speaker outreach messages. |
| skills/aaif-speaker-bio/SKILL.md | New writing skill for speaker bios. |
| skills/aaif-recap-post/SKILL.md | New writing skill for LinkedIn recap posts. |
| skills/aaif-luma-description/SKILL.md | New writing skill for Luma event page descriptions. |
| skills/aaif-dayof-slides/SKILL.md | New writing skill to generate “day-of” deck slide text. |
| skills/aaif-create-online-series/SKILL.md | New ops skill instructions for creating/rebranding an online series in Drive. |
| skills/aaif-create-online-series/scripts/create_series.py | Script to clone/rebrand TemplateSeries Drive assets and check Luma status. |
| skills/aaif-create-chapter/SKILL.md | Ops skill instructions for creating/rebranding a city chapter in Drive. |
| skills/aaif-create-chapter/scripts/create_chapter.py | Script to clone/rebrand TemplateCity Drive assets and check Luma status. |
| skills/aaif-clean-data/SKILL.md | Ops skill instructions for scanning/applying intake data cleanup + installing error flags. |
| skills/aaif-clean-data/scripts/clean.py | Cleanup engine for Intake Ops sheet (scan/apply/install bright-red Issues rule). |
| skills/aaif-carousel-copy/SKILL.md | New writing skill for LinkedIn carousel copy. |
| skills/aaif-attendee-reminder/SKILL.md | New writing skill for attendee reminders. |
| skills/aaif-announcement-post/SKILL.md | New writing skill for RSVP-open announcement posts. |
| scripts/check_frontmatter.py | Pre-commit/CI hook to validate SKILL.md YAML frontmatter parsing. |
| README.md | Full repository/product README including install and usage docs. |
| pyproject.toml | Ruff + codespell configuration for helper scripts. |
| LICENSE | MIT license. |
| CONTRIBUTING.md | Contribution guidelines, including frontmatter conventions and validation steps. |
| CHANGELOG.md | Initial changelog for plugin versions and notable changes. |
| .pre-commit-config.yaml | Pre-commit hooks for hygiene, linting, secret scanning, and frontmatter validation. |
| .gitignore | Ignores Python caches and Ruff cache. |
| .github/workflows/validate.yml | CI workflow running pre-commit and claude plugin validate .. |
| .claude-plugin/plugin.json | Claude Code plugin manifest (aaif-meetups). |
| .claude-plugin/marketplace.json | Claude Code marketplace manifest (flattened, source: "./"). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Respond-to-PR ImprovementsPR #1 was already merged when these Copilot comments were addressed, so the fixes land in follow-up #2 (branch Code changes (11 applied, all in #2):
Questions answered: none Verification: Remaining unresolved threads: none Applied by Claude Code |
Address Copilot PR #1 feedback + document required OAuth scopes
Bootstraps the
aaif/meetupsrepo: lands the full AAIF Meetups Toolkit as a flattened single-plugin Claude Code marketplace, with repo hardening (pre-commit, CI, schema validation).mainis an empty README; this PR brings everything in for review.Commits
$schema, changelog.Layout: flattened single-plugin marketplace
The repo root is both the marketplace and the plugin — no
plugins/<name>/nesting. Per the docs, a marketplace plugin'ssourcemay be"./"(the marketplace root). The$schemaenforces this (sourcemust match^\./.*).Installs unchanged:
/plugin marketplace add aaif/meetups→/plugin install aaif-meetups@aaif.Hardening
.pre-commit-config.yaml— hygiene,check-json/check-yaml, Ruff (bug-focused lint, no style churn),codespell, gitleaks, and a local SKILL.md frontmatter validator..github/workflows/validate.yml— CI runs pre-commit +claude plugin validate .(one call validates marketplace andplugin.jsonschema sincesource: "./").$schemaon both manifests (SchemaStore — same asanthropics/claude-code).pyproject.toml,CHANGELOG.md, CONTRIBUTING updates.🐛 Bug fixed in passing
aaif-create-chapterandaaif-create-online-serieshadargument-hint: "<X>" [--slug …]— a quoted YAML scalar followed by bare text, which is invalid YAML. The frontmatter failed to parse, so the skill loaded with all metadata silently dropped (including thedescriptionthat drives auto-activation). Both single-quoted. Thecheck-skill-frontmatterhook now guards against regressions (validate's marketplace check does not parse skill frontmatter).Deliberately not done
ruff-format/pyupgrade — would rewrite the delicate OOXML scripts (~+579/−161); a formatting sweep is its own PR.pretty-format-json— it escaped the manifests' em-dashes and exploded the keyword arrays.Self-review fixes (post-open, commits
3cd505e,67fcb5e)A 5-agent self-review ran; doc fixes + four correctness fixes were applied (full breakdown in the PR comments):
clean.py/intake.pyhard-error on a missing required header instead of silently reporting an empty queue; fixed a latentTypeErrorinclean.pywhen the Email column is absent.gws_jsonraises on empty/non-JSON stdout instead of silently skipping a subtree.Deferred to follow-ups: expanding OOXML rebrand part-coverage (now surfaced loudly by the residual hard-fail), de-duplicating the rebrand engine across the two create scripts, and adding unit tests.
Verification
pre-commit run --all-files— all hooks pass.claude plugin validate .— passes (marketplace + plugin.json).🤖 Generated with Claude Code