Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"$schema": "https://json.schemastore.org/claude-code-marketplace.json",
"name": "aaif",
"owner": {
"name": "AAIF",
"url": "https://github.com/aaif"
},
"description": "Official marketplace for AAIF (Agentic AI Foundation) community meetup tooling.",
"plugins": [
{
"name": "aaif-meetups",
"source": "./",
"description": "Skills for running AAIF in-person and online meetups: event content writing and chapter/series/community ops.",
"category": "community",
"tags": ["meetups", "events", "community", "content", "google-workspace", "online"]
}
]
}
15 changes: 15 additions & 0 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "aaif-meetups",
"displayName": "AAIF Meetups Toolkit",
"version": "0.2.0",
"description": "Skills for running AAIF (Agentic AI Foundation) in-person and online meetups — event content writing (announcements, Luma pages, LinkedIn carousels, recaps, speaker bios/invites, day-of slides, attendee reminders) and chapter ops (spin up a new city chapter or online event series, triage community intake, clean intake data).",
"author": {
"name": "AAIF",
"url": "https://github.com/aaif"
},
"homepage": "https://github.com/aaif/meetups",
"repository": "https://github.com/aaif/meetups",
"license": "MIT",
"keywords": ["aaif", "meetups", "events", "community", "google-workspace", "luma", "linkedin"]
}
32 changes: 32 additions & 0 deletions .github/workflows/validate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: validate

on:
push:
branches: [main]
pull_request:

permissions:
contents: read

jobs:
pre-commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.x"
- uses: pre-commit/action@v3.0.1 # runs `pre-commit run --all-files`

plugin-validate:
# Anthropic's own validator. The repo root is both the marketplace and the
# single plugin (marketplace source "./"), so one call validates both the
# marketplace.json and the plugin.json schema. SKILL.md frontmatter is
# covered by the check-skill-frontmatter hook in the pre-commit job above.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Claude Code CLI
run: npm install -g @anthropic-ai/claude-code
- name: Validate marketplace and plugin manifests
run: claude plugin validate .
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
__pycache__/
*.pyc
.DS_Store
.ruff_cache/
62 changes: 62 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Pre-commit hooks for the AAIF Meetups plugin marketplace.
# Setup: pipx install pre-commit && pre-commit install
# Run: pre-commit run --all-files
# Update: pre-commit autoupdate
# CI runs the same hooks (see .github/workflows/validate.yml).

# Generated/cache artifacts pre-commit should never scan.
exclude: '^(.*/__pycache__/.*|.*\.pyc)$'

repos:
# --- Standard hygiene -------------------------------------------------------
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
- id: trailing-whitespace
args: [--markdown-linebreak-ext=md] # keep intentional Markdown hard breaks
- id: end-of-file-fixer
- id: check-merge-conflict
- id: check-case-conflict
- id: check-added-large-files
args: [--maxkb=1024]
- id: mixed-line-ending
args: [--fix=lf]
- id: check-json # marketplace.json / plugin.json
- id: check-yaml # *.yaml/*.yml only (not SKILL.md frontmatter)
- id: check-executables-have-shebangs
- id: check-shebang-scripts-are-executable

# --- Python: Ruff bug-focused lint (config in pyproject.toml) ---------------
# Lint only (pyflakes + syntax), no reformatting. `--fix` still auto-removes
# unused imports/vars but never restyles code; the helper scripts use a
# deliberately compact style. A formatting sweep, if wanted, is its own PR.
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.20
hooks:
- id: ruff-check
args: [--fix]

# --- Spelling (allowlist in pyproject.toml [tool.codespell]) ----------------
- repo: https://github.com/codespell-project/codespell
rev: v2.4.2
hooks:
- id: codespell
additional_dependencies: [tomli]

# --- Secret scanning (these scripts shell out + use urllib) -----------------
- repo: https://github.com/gitleaks/gitleaks
rev: v8.30.1
hooks:
- id: gitleaks

# --- SKILL.md frontmatter syntax (broken YAML => empty metadata at runtime) --
# Runs locally on commit and in CI; this hook — not `claude plugin validate`,
# which only checks the manifest schemas — is what catches skill frontmatter.
- repo: local
hooks:
- id: check-skill-frontmatter
name: validate SKILL.md YAML frontmatter
entry: python3 scripts/check_frontmatter.py
language: python
additional_dependencies: [pyyaml]
files: 'SKILL\.md$'
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Changelog

All notable changes to the **AAIF Meetups Toolkit** plugin are documented here.
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the
plugin version is the `version` field in `.claude-plugin/plugin.json`.

## [0.2.0]

### Added
- `aaif-create-online-series` skill — clone the **TemplateSeries** folder under the
top-level **Online** Drive folder and rebrand it for a new online event series
(reading group, paper club, webinar). The online sibling of `aaif-create-chapter`.
- Repo hardening: `$schema` references on both manifests, `.pre-commit-config.yaml`,
Ruff config (`pyproject.toml`), and a `validate` CI workflow (pre-commit +
`claude plugin validate`).

### Changed
- Manifest descriptions and tags now cover **online** meetups/series, not just
in-person chapters.

## [0.1.0]

### Added
- Initial release: 11 skills for running AAIF in-person meetup chapters — content
writing (announcement, carousel, Luma description, speaker invite/bio, day-of
slides, attendee reminder, recap) and chapter ops (`aaif-create-chapter`,
`aaif-triage-intake`, `aaif-clean-data`).
- One-plugin marketplace (`aaif`) packaging the toolkit for `/plugin install`.
83 changes: 83 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Contributing

Thanks for helping improve the AAIF Meetups Toolkit. The repo root is both the
marketplace and a single plugin (`aaif-meetups`) — `marketplace.json` and
`plugin.json` sit side by side in `.claude-plugin/`, and the skills live under
`skills/` at the repo root.

## Adding or editing a skill

A skill is a folder with a `SKILL.md` (plus an optional `scripts/` dir):

```
skills/<skill-name>/
├── SKILL.md
└── scripts/ # optional helper scripts
```

`SKILL.md` starts with YAML frontmatter:

```yaml
---
name: aaif-something
description: One line — what it does AND when to use it ("Use when asked to …"),
so Claude auto-activates it at the right moment.
argument-hint: "<optional> [args]"
---

# Title
Clear, step-by-step instructions…
```

Guidelines:
- **Reference bundled scripts with `${CLAUDE_SKILL_DIR}/scripts/...`**, never a
hardcoded `.claude/skills/...` path — the variable resolves wherever the skill
is installed.
- Keep the `description` action-oriented; it's what triggers auto-activation.
- **Quote `argument-hint` values fully.** A value like `"<City>" [--slug <x>]`
(a quoted scalar followed by bare text) is *invalid YAML* — the whole
frontmatter then fails to parse and the skill loads with empty metadata
(description dropped, so it never auto-activates). Single-quote the entire
value instead: `argument-hint: '<City> [--slug <x>]'`.
- Read and write Google Sheets/Drive **by header name / resource lookup**, not by
fixed column letters, so skills survive layout changes.
- These skills ship with AAIF's own Google resource IDs. If you're adapting them
for another chapter, change the constants at the top of each `scripts/*.py` and
the IDs referenced in the `SKILL.md`.

## Checks

This repo ships a [pre-commit](https://pre-commit.com/) config and a `validate`
GitHub Actions workflow. Set up the hooks once:

```bash
pipx install pre-commit # or: pip install --user pre-commit
pre-commit install # run the hooks on every commit
pre-commit run --all-files # run them now against the whole repo
```

The hooks cover JSON/YAML/whitespace hygiene, Ruff (bug-focused lint of the
helper scripts), codespell, gitleaks secret scanning, and a SKILL.md
frontmatter check.

Then validate the manifests. The repo root is both the marketplace and the
single plugin (marketplace `source: "./"`), so one call validates the
`marketplace.json` **and** the `plugin.json` schema:

```bash
claude plugin validate .
```

This does *not* parse SKILL.md frontmatter — that's covered by the
`check-skill-frontmatter` pre-commit hook above. CI runs both on each PR.
Finally, install your local copy to try it live:

```bash
/plugin marketplace add ./ # from the repo root
/plugin install aaif-meetups@aaif
```

## Pull requests

Fork, branch, commit, and open a PR against `main`. Keep changes focused and
explain what a reviewer should check.
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 AAIF

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading
Loading