From c63b4faa397489c30d9c31aa5c033b2bf3f3942a Mon Sep 17 00:00:00 2001 From: Jarek Potiuk Date: Mon, 9 Nov 2026 01:17:32 -0700 Subject: [PATCH 1/3] Publish every skill in tools/skills as a plugin Move each single-file skill into its own directory, as releasecheck already is: .md becomes /SKILL.md, and its scripts/, templates/ and references/ move into it. The skills already refer to those files relative to the skill, so no skill text changes. Give each skill a plugin manifest and list all eleven in the Claude Code, Codex and GitHub Copilot marketplace catalogs, so each installs and updates from any of them, and through Apache Magpie for any agent. Document the layout, the per-agent install commands, and releasing a skill by tagging -. Generated-by: Claude Opus 5 --- .agents/plugins/marketplace.json | 110 ++++++++++++++++++ .claude-plugin/marketplace.json | 60 ++++++++++ marketplace.json | 98 ++++++++++++++++ tools/skills/README.md | 76 +++++++----- .../board-report/.claude-plugin/plugin.json | 20 ++++ .../SKILL.md} | 0 .../branding-sweep/.claude-plugin/plugin.json | 20 ++++ .../SKILL.md} | 0 .../scripts}/checker.py | 0 .../scripts}/ranker.py | 0 .../scripts}/render.py | 0 .../scripts}/rules.json | 0 .../scripts}/sweep.py | 0 .../.claude-plugin/plugin.json | 19 +++ .../SKILL.md} | 0 .../templates}/board-resolution.md | 0 .../templates}/discuss-email.md | 0 .../.claude-plugin/plugin.json | 19 +++ .../SKILL.md} | 0 .../.claude-plugin/plugin.json | 19 +++ .../.claude-plugin/plugin.json | 20 ++++ .../SKILL.md} | 0 .../.claude-plugin/plugin.json | 20 ++++ .../SKILL.md} | 0 .../scripts}/podling_name_clearance.py | 0 .../.claude-plugin/plugin.json | 19 +++ .../SKILL.md} | 0 .../references}/phase-1-proposal-review.md | 0 .../references}/phase-2-sga-receipt.md | 0 .../references}/phase-3-icla-coverage.md | 0 .../references}/phase-4-infrastructure.md | 0 .../references}/phase-5-first-report-date.md | 0 .../.claude-plugin/plugin.json | 20 ++++ .../SKILL.md} | 0 .../.claude-plugin/plugin.json | 19 +++ .../SKILL.md} | 0 .../templates}/announce-email.md | 0 .../templates}/retire-email.md | 0 .../templates}/retirement-email.md | 0 .../templates}/shutdown-checklist.md | 0 40 files changed, 513 insertions(+), 26 deletions(-) create mode 100644 marketplace.json create mode 100644 tools/skills/board-report/.claude-plugin/plugin.json rename tools/skills/{board-report.md => board-report/SKILL.md} (100%) create mode 100644 tools/skills/branding-sweep/.claude-plugin/plugin.json rename tools/skills/{branding-sweep.md => branding-sweep/SKILL.md} (100%) rename tools/skills/{scripts/branding-sweep => branding-sweep/scripts}/checker.py (100%) rename tools/skills/{scripts/branding-sweep => branding-sweep/scripts}/ranker.py (100%) rename tools/skills/{scripts/branding-sweep => branding-sweep/scripts}/render.py (100%) rename tools/skills/{scripts/branding-sweep => branding-sweep/scripts}/rules.json (100%) rename tools/skills/{scripts/branding-sweep => branding-sweep/scripts}/sweep.py (100%) create mode 100644 tools/skills/graduation-packet-builder/.claude-plugin/plugin.json rename tools/skills/{graduation-packet-builder.md => graduation-packet-builder/SKILL.md} (100%) rename tools/skills/{templates/graduation-packet-builder => graduation-packet-builder/templates}/board-resolution.md (100%) rename tools/skills/{templates/graduation-packet-builder => graduation-packet-builder/templates}/discuss-email.md (100%) create mode 100644 tools/skills/graduation-self-assessment/.claude-plugin/plugin.json rename tools/skills/{graduation-self-assessment.md => graduation-self-assessment/SKILL.md} (100%) create mode 100644 tools/skills/maturity-model-assessment/.claude-plugin/plugin.json create mode 100644 tools/skills/monthly-report-review/.claude-plugin/plugin.json rename tools/skills/{monthly-report-review.md => monthly-report-review/SKILL.md} (100%) create mode 100644 tools/skills/podling-name-clearance/.claude-plugin/plugin.json rename tools/skills/{podling-name-clearance.md => podling-name-clearance/SKILL.md} (100%) rename tools/skills/{scripts/podling-name-clearance => podling-name-clearance/scripts}/podling_name_clearance.py (100%) create mode 100644 tools/skills/podling-onboarding/.claude-plugin/plugin.json rename tools/skills/{podling-onboarding.md => podling-onboarding/SKILL.md} (100%) rename tools/skills/{references/podling-onboarding => podling-onboarding/references}/phase-1-proposal-review.md (100%) rename tools/skills/{references/podling-onboarding => podling-onboarding/references}/phase-2-sga-receipt.md (100%) rename tools/skills/{references/podling-onboarding => podling-onboarding/references}/phase-3-icla-coverage.md (100%) rename tools/skills/{references/podling-onboarding => podling-onboarding/references}/phase-4-infrastructure.md (100%) rename tools/skills/{references/podling-onboarding => podling-onboarding/references}/phase-5-first-report-date.md (100%) create mode 100644 tools/skills/release-vote-reviewer/.claude-plugin/plugin.json rename tools/skills/{release-vote-reviewer.md => release-vote-reviewer/SKILL.md} (100%) create mode 100644 tools/skills/retirement-shepherd/.claude-plugin/plugin.json rename tools/skills/{retirement-shepherd.md => retirement-shepherd/SKILL.md} (100%) rename tools/skills/{templates/retirement-shepherd => retirement-shepherd/templates}/announce-email.md (100%) rename tools/skills/{templates/retirement-shepherd => retirement-shepherd/templates}/retire-email.md (100%) rename tools/skills/{templates/retirement-shepherd => retirement-shepherd/templates}/retirement-email.md (100%) rename tools/skills/{templates/retirement-shepherd => retirement-shepherd/templates}/shutdown-checklist.md (100%) diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index 661ec1c3f..33f97ba3d 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -14,6 +14,116 @@ "policy": { "installation": "AVAILABLE" } + }, + { + "name": "maturity-model-assessment", + "source": { + "source": "local", + "path": "./tools/skills/maturity-model-assessment" + }, + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "graduation-self-assessment", + "source": { + "source": "local", + "path": "./tools/skills/graduation-self-assessment" + }, + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "graduation-packet-builder", + "source": { + "source": "local", + "path": "./tools/skills/graduation-packet-builder" + }, + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "retirement-shepherd", + "source": { + "source": "local", + "path": "./tools/skills/retirement-shepherd" + }, + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "monthly-report-review", + "source": { + "source": "local", + "path": "./tools/skills/monthly-report-review" + }, + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "release-vote-reviewer", + "source": { + "source": "local", + "path": "./tools/skills/release-vote-reviewer" + }, + "category": "release-management", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "board-report", + "source": { + "source": "local", + "path": "./tools/skills/board-report" + }, + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "branding-sweep", + "source": { + "source": "local", + "path": "./tools/skills/branding-sweep" + }, + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "podling-onboarding", + "source": { + "source": "local", + "path": "./tools/skills/podling-onboarding" + }, + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "podling-name-clearance", + "source": { + "source": "local", + "path": "./tools/skills/podling-name-clearance" + }, + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } } ] } diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index a766a93c4..e2632327a 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -11,6 +11,66 @@ "source": "./tools/skills/releasecheck", "description": "Checks an Apache Incubator podling release candidate before or during its vote. Produces findings for a person to review, never a vote.", "category": "release-management" + }, + { + "name": "maturity-model-assessment", + "source": "./tools/skills/maturity-model-assessment", + "description": "Builds an evidence pack for an Apache Incubator podling against the 38 items of the Apache Project Maturity Model, marking each evidenced, proxy or human. Never a score or verdict.", + "category": "governance" + }, + { + "name": "graduation-self-assessment", + "source": "./tools/skills/graduation-self-assessment", + "description": "Compares the ipmc MCP's graduation-readiness verdict with what an Apache Incubator podling says in its own reports, checked against the mail archives.", + "category": "governance" + }, + { + "name": "graduation-packet-builder", + "source": "./tools/skills/graduation-packet-builder", + "description": "Assembles an Apache Incubator podling's graduation case and drafts the DISCUSS email and the board resolution.", + "category": "governance" + }, + { + "name": "retirement-shepherd", + "source": "./tools/skills/retirement-shepherd", + "description": "Assesses whether a stalled Apache Incubator podling should retire and drafts the discussion, the announcement and the shutdown checklist.", + "category": "governance" + }, + { + "name": "monthly-report-review", + "source": "./tools/skills/monthly-report-review", + "description": "The monthly IPMC report review: flags podlings that have not filed, cross-checks narratives against health data and drafts shepherd comments.", + "category": "governance" + }, + { + "name": "release-vote-reviewer", + "source": "./tools/skills/release-vote-reviewer", + "description": "Walks an Apache Incubator release vote thread on general@ and drafts the +1 or the -1 with reasons.", + "category": "release-management" + }, + { + "name": "board-report", + "source": "./tools/skills/board-report", + "description": "Drafts the VP Incubator's quarterly report to the ASF board.", + "category": "governance" + }, + { + "name": "branding-sweep", + "source": "./tools/skills/branding-sweep", + "description": "Trademark and branding compliance check across all current Apache Incubator podlings, as a ranked fix list.", + "category": "governance" + }, + { + "name": "podling-onboarding", + "source": "./tools/skills/podling-onboarding", + "description": "Reviews a new Apache Incubator podling's proposal against the checklist and bootstraps its tracking: SGA, ICLAs, infrastructure, first report date.", + "category": "governance" + }, + { + "name": "podling-name-clearance", + "source": "./tools/skills/podling-name-clearance", + "description": "Runs the Apache Incubator podling name search end to end and writes it up in the required format.", + "category": "governance" } ] } diff --git a/marketplace.json b/marketplace.json new file mode 100644 index 000000000..a6c11e5c4 --- /dev/null +++ b/marketplace.json @@ -0,0 +1,98 @@ +{ + "name": "apache-incubator", + "owner": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "description": "Skills from the Apache Incubator for podlings, mentors and the IPMC. (GitHub Copilot plugin marketplace catalog.)", + "plugins": [ + { + "name": "releasecheck", + "source": "./tools/skills/releasecheck", + "category": "release-management", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "maturity-model-assessment", + "source": "./tools/skills/maturity-model-assessment", + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "graduation-self-assessment", + "source": "./tools/skills/graduation-self-assessment", + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "graduation-packet-builder", + "source": "./tools/skills/graduation-packet-builder", + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "retirement-shepherd", + "source": "./tools/skills/retirement-shepherd", + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "monthly-report-review", + "source": "./tools/skills/monthly-report-review", + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "release-vote-reviewer", + "source": "./tools/skills/release-vote-reviewer", + "category": "release-management", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "board-report", + "source": "./tools/skills/board-report", + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "branding-sweep", + "source": "./tools/skills/branding-sweep", + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "podling-onboarding", + "source": "./tools/skills/podling-onboarding", + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + }, + { + "name": "podling-name-clearance", + "source": "./tools/skills/podling-name-clearance", + "category": "governance", + "policy": { + "installation": "AVAILABLE" + } + } + ] +} diff --git a/tools/skills/README.md b/tools/skills/README.md index 59f8adc8a..6b5115084 100644 --- a/tools/skills/README.md +++ b/tools/skills/README.md @@ -5,23 +5,19 @@ the monthly report review, release vote review, graduation and retirement, the quarterly board report, branding sweeps, podling onboarding and name clearance. -Each skill is a single markdown file — YAML frontmatter naming the skill and -describing when it applies, followed by the workflow an agent follows. A few -skills need supporting files that cannot live inside markdown; those sit in -shared directories keyed by skill name and are folded into the skill when it -is built: +Each skill is a directory holding a `SKILL.md` — YAML frontmatter naming the +skill and describing when it applies, followed by the workflow an agent +follows — plus any supporting files it needs: ``` -.md the skill -scripts//… helper scripts it runs -templates//… email and document templates it fills in -references//… long reference material it reads on demand -/SKILL.md a directory skill that carries its own - references/ and scripts/ (releasecheck, - maturity-model-assessment) -package-skills.py builds installable .skill packages -evals/ golden-scenario tests -draft/ not yet published +/SKILL.md the skill +/scripts/… helper scripts it runs +/templates/… email and document templates it fills in +/references/… long reference material it reads on demand +/.claude-plugin/plugin.json its plugin manifest (see Installing) +package-skills.py builds installable .skill packages +evals// golden-scenario tests +draft/ not yet published ``` Everything here is source. The installable `.skill` packages are build output @@ -31,16 +27,16 @@ and are not committed — see Building. | Skill | What it does | |---|---| -| `monthly-report-review.md` | The monthly IPMC report review: pull the cohort due this month, flag who hasn't filed, cross-check narratives against health data and cross-source mismatches, draft shepherd comments per podling. | -| `release-vote-reviewer.md` | Given a release vote thread on general@, walk the full check — artifacts, GPG signatures, checksums, DISCLAIMER, "incubating" in filenames, vote maths — and draft the +1 or the -1 with reasons. | -| `graduation-packet-builder.md` | Assemble a podling's graduation case: maturity evidence, name search status, community and release history; draft the DISCUSS email and the board resolution. | -| `graduation-self-assessment.md` | Compare the `ipmc` MCP's graduation readiness verdict with what the podling says in its own reports (unfinished issues, maturity boxes, mentor and IPMC notes), check each claim against the mail archives, and give a combined view. Unlike the others it calls the MCP servers as tools. | +| `monthly-report-review/` | The monthly IPMC report review: pull the cohort due this month, flag who hasn't filed, cross-check narratives against health data and cross-source mismatches, draft shepherd comments per podling. | +| `release-vote-reviewer/` | Given a release vote thread on general@, walk the full check — artifacts, GPG signatures, checksums, DISCLAIMER, "incubating" in filenames, vote maths — and draft the +1 or the -1 with reasons. | +| `graduation-packet-builder/` | Assemble a podling's graduation case: maturity evidence, name search status, community and release history; draft the DISCUSS email and the board resolution. | +| `graduation-self-assessment/` | Compare the `ipmc` MCP's graduation readiness verdict with what the podling says in its own reports (unfinished issues, maturity boxes, mentor and IPMC notes), check each claim against the mail archives, and give a combined view. Unlike the others it calls the MCP servers as tools. | | `maturity-model-assessment/` | Build an evidence pack against the 38 items of the Apache Project Maturity Model: gather what the MCP servers, GitHub and the list archives show for each item, mark it evidenced, proxy or human, and write the question the PPMC still has to answer. Never a score or verdict. Calls the MCP servers as tools. | -| `retirement-shepherd.md` | The counterpart to graduation: assess whether a stalled podling should retire, gather the evidence, draft the retirement discussion and announcement emails, and the shutdown checklist. | -| `board-report.md` | Draft the VP Incubator's quarterly report to the ASF board: podling statistics, graduations and retirements, cohort summary, items requiring board attention. | -| `branding-sweep.md` | Batch trademark and branding compliance check across all current podlings; produces a ranked fix list. Suited to a periodic run. | -| `podling-onboarding.md` | New-podling onboarding: proposal review against the checklist, then bootstrap tracking — SGA, ICLAs, infra setup, first report date. Runs in five phases, one reference file each. | -| `podling-name-clearance.md` | Run the PODLINGNAMESEARCH process end to end for a proposed podling name and produce the writeup in the required format. | +| `retirement-shepherd/` | The counterpart to graduation: assess whether a stalled podling should retire, gather the evidence, draft the retirement discussion and announcement emails, and the shutdown checklist. | +| `board-report/` | Draft the VP Incubator's quarterly report to the ASF board: podling statistics, graduations and retirements, cohort summary, items requiring board attention. | +| `branding-sweep/` | Batch trademark and branding compliance check across all current podlings; produces a ranked fix list. Suited to a periodic run. | +| `podling-onboarding/` | New-podling onboarding: proposal review against the checklist, then bootstrap tracking — SGA, ICLAs, infra setup, first report date. Runs in five phases, one reference file each. | +| `podling-name-clearance/` | Run the PODLINGNAMESEARCH process end to end for a proposed podling name and produce the writeup in the required format. | ## Data sources @@ -65,12 +61,40 @@ If your checkouts live elsewhere, adjust the paths in that skill's markdown. Paths are written with `~`, which Python does not expand on its own — use `os.path.expanduser()`. +## Installing + +Every skill is also a plugin in the Incubator's marketplace, so it installs +and updates like any other plugin. The repository carries the catalog each +agent reads, all listing the same plugins: + +| Agent | Add the marketplace, then install a skill | Catalog | +|---|---|---| +| Claude Code | `/plugin marketplace add apache/incubator`, then `/plugin install graduation-self-assessment@apache-incubator` | `.claude-plugin/marketplace.json` | +| OpenAI Codex CLI | `codex plugin marketplace add apache/incubator`, then install the plugin | `.agents/plugins/marketplace.json` | +| VS Code / GitHub Copilot | add `apache/incubator` as a plugin marketplace | `marketplace.json` | +| Kiro | install from the skill's GitHub subdirectory, e.g. `https://github.com/apache/incubator/tree//tools/skills/graduation-self-assessment` | none; reads `SKILL.md` | + +Updating is the agent's own plugin update (`/plugin update` in Claude Code). +Keep the three catalogs listing the same plugins when adding one. + +Projects that use [Apache Magpie](https://github.com/apache/magpie) can pull +the same skills through Magpie instead, for any agent: the ASF organization +curates this repository as a skill source, pinned per skill to the tags +below, and Magpie wires the pinned skills into every agent's skills directory. + +## Releasing a skill + +Skills are versioned independently. To release one, bump `version` in its +`.claude-plugin/plugin.json` and tag the commit `-` +(for example `releasecheck-0.5.1`). Tags are what downstream pins point at, +so never move one once it is pushed; release a new version instead. + ## Building `package-skills.py` compiles each skill into the `.skill` zip format the Claude apps install. It validates the frontmatter first (`name` and -`description` are required), folds in that skill's `scripts/`, `templates/` -and `references/` entries, and omits `__pycache__` and `.DS_Store`. +`description` are required), folds in the skill directory's `scripts/`, `templates/` +and `references/`, and omits `__pycache__` and `.DS_Store`. ```bash python3 package-skills.py --all # every skill here → dist/ diff --git a/tools/skills/board-report/.claude-plugin/plugin.json b/tools/skills/board-report/.claude-plugin/plugin.json new file mode 100644 index 000000000..0f40e53f1 --- /dev/null +++ b/tools/skills/board-report/.claude-plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "name": "board-report", + "description": "Drafts the VP Incubator's quarterly report to the ASF board.", + "version": "0.1.0", + "author": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "homepage": "https://github.com/apache/incubator/tree/master/tools/skills/board-report", + "repository": "https://github.com/apache/incubator", + "license": "Apache-2.0", + "keywords": [ + "apache", + "incubator", + "podling", + "board-report", + "ipmc" + ], + "skills": "./" +} diff --git a/tools/skills/board-report.md b/tools/skills/board-report/SKILL.md similarity index 100% rename from tools/skills/board-report.md rename to tools/skills/board-report/SKILL.md diff --git a/tools/skills/branding-sweep/.claude-plugin/plugin.json b/tools/skills/branding-sweep/.claude-plugin/plugin.json new file mode 100644 index 000000000..d0fa6fd08 --- /dev/null +++ b/tools/skills/branding-sweep/.claude-plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "name": "branding-sweep", + "description": "Trademark and branding compliance check across all current Apache Incubator podlings, as a ranked fix list.", + "version": "0.1.0", + "author": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "homepage": "https://github.com/apache/incubator/tree/master/tools/skills/branding-sweep", + "repository": "https://github.com/apache/incubator", + "license": "Apache-2.0", + "keywords": [ + "apache", + "incubator", + "podling", + "branding", + "trademarks" + ], + "skills": "./" +} diff --git a/tools/skills/branding-sweep.md b/tools/skills/branding-sweep/SKILL.md similarity index 100% rename from tools/skills/branding-sweep.md rename to tools/skills/branding-sweep/SKILL.md diff --git a/tools/skills/scripts/branding-sweep/checker.py b/tools/skills/branding-sweep/scripts/checker.py similarity index 100% rename from tools/skills/scripts/branding-sweep/checker.py rename to tools/skills/branding-sweep/scripts/checker.py diff --git a/tools/skills/scripts/branding-sweep/ranker.py b/tools/skills/branding-sweep/scripts/ranker.py similarity index 100% rename from tools/skills/scripts/branding-sweep/ranker.py rename to tools/skills/branding-sweep/scripts/ranker.py diff --git a/tools/skills/scripts/branding-sweep/render.py b/tools/skills/branding-sweep/scripts/render.py similarity index 100% rename from tools/skills/scripts/branding-sweep/render.py rename to tools/skills/branding-sweep/scripts/render.py diff --git a/tools/skills/scripts/branding-sweep/rules.json b/tools/skills/branding-sweep/scripts/rules.json similarity index 100% rename from tools/skills/scripts/branding-sweep/rules.json rename to tools/skills/branding-sweep/scripts/rules.json diff --git a/tools/skills/scripts/branding-sweep/sweep.py b/tools/skills/branding-sweep/scripts/sweep.py similarity index 100% rename from tools/skills/scripts/branding-sweep/sweep.py rename to tools/skills/branding-sweep/scripts/sweep.py diff --git a/tools/skills/graduation-packet-builder/.claude-plugin/plugin.json b/tools/skills/graduation-packet-builder/.claude-plugin/plugin.json new file mode 100644 index 000000000..f096ac4a9 --- /dev/null +++ b/tools/skills/graduation-packet-builder/.claude-plugin/plugin.json @@ -0,0 +1,19 @@ +{ + "name": "graduation-packet-builder", + "description": "Assembles an Apache Incubator podling's graduation case and drafts the DISCUSS email and the board resolution.", + "version": "0.1.0", + "author": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "homepage": "https://github.com/apache/incubator/tree/master/tools/skills/graduation-packet-builder", + "repository": "https://github.com/apache/incubator", + "license": "Apache-2.0", + "keywords": [ + "apache", + "incubator", + "podling", + "graduation" + ], + "skills": "./" +} diff --git a/tools/skills/graduation-packet-builder.md b/tools/skills/graduation-packet-builder/SKILL.md similarity index 100% rename from tools/skills/graduation-packet-builder.md rename to tools/skills/graduation-packet-builder/SKILL.md diff --git a/tools/skills/templates/graduation-packet-builder/board-resolution.md b/tools/skills/graduation-packet-builder/templates/board-resolution.md similarity index 100% rename from tools/skills/templates/graduation-packet-builder/board-resolution.md rename to tools/skills/graduation-packet-builder/templates/board-resolution.md diff --git a/tools/skills/templates/graduation-packet-builder/discuss-email.md b/tools/skills/graduation-packet-builder/templates/discuss-email.md similarity index 100% rename from tools/skills/templates/graduation-packet-builder/discuss-email.md rename to tools/skills/graduation-packet-builder/templates/discuss-email.md diff --git a/tools/skills/graduation-self-assessment/.claude-plugin/plugin.json b/tools/skills/graduation-self-assessment/.claude-plugin/plugin.json new file mode 100644 index 000000000..2e309ce6b --- /dev/null +++ b/tools/skills/graduation-self-assessment/.claude-plugin/plugin.json @@ -0,0 +1,19 @@ +{ + "name": "graduation-self-assessment", + "description": "Compares the ipmc MCP's graduation-readiness verdict with what an Apache Incubator podling says in its own reports, checked against the mail archives.", + "version": "0.1.0", + "author": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "homepage": "https://github.com/apache/incubator/tree/master/tools/skills/graduation-self-assessment", + "repository": "https://github.com/apache/incubator", + "license": "Apache-2.0", + "keywords": [ + "apache", + "incubator", + "podling", + "graduation" + ], + "skills": "./" +} diff --git a/tools/skills/graduation-self-assessment.md b/tools/skills/graduation-self-assessment/SKILL.md similarity index 100% rename from tools/skills/graduation-self-assessment.md rename to tools/skills/graduation-self-assessment/SKILL.md diff --git a/tools/skills/maturity-model-assessment/.claude-plugin/plugin.json b/tools/skills/maturity-model-assessment/.claude-plugin/plugin.json new file mode 100644 index 000000000..76665111a --- /dev/null +++ b/tools/skills/maturity-model-assessment/.claude-plugin/plugin.json @@ -0,0 +1,19 @@ +{ + "name": "maturity-model-assessment", + "description": "Builds an evidence pack for an Apache Incubator podling against the 38 items of the Apache Project Maturity Model, marking each evidenced, proxy or human. Never a score or verdict.", + "version": "0.1.0", + "author": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "homepage": "https://github.com/apache/incubator/tree/master/tools/skills/maturity-model-assessment", + "repository": "https://github.com/apache/incubator", + "license": "Apache-2.0", + "keywords": [ + "apache", + "incubator", + "podling", + "maturity-model" + ], + "skills": "./" +} diff --git a/tools/skills/monthly-report-review/.claude-plugin/plugin.json b/tools/skills/monthly-report-review/.claude-plugin/plugin.json new file mode 100644 index 000000000..f69e7a590 --- /dev/null +++ b/tools/skills/monthly-report-review/.claude-plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "name": "monthly-report-review", + "description": "The monthly IPMC report review: flags podlings that have not filed, cross-checks narratives against health data and drafts shepherd comments.", + "version": "0.1.0", + "author": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "homepage": "https://github.com/apache/incubator/tree/master/tools/skills/monthly-report-review", + "repository": "https://github.com/apache/incubator", + "license": "Apache-2.0", + "keywords": [ + "apache", + "incubator", + "podling", + "reports", + "ipmc" + ], + "skills": "./" +} diff --git a/tools/skills/monthly-report-review.md b/tools/skills/monthly-report-review/SKILL.md similarity index 100% rename from tools/skills/monthly-report-review.md rename to tools/skills/monthly-report-review/SKILL.md diff --git a/tools/skills/podling-name-clearance/.claude-plugin/plugin.json b/tools/skills/podling-name-clearance/.claude-plugin/plugin.json new file mode 100644 index 000000000..fac980fec --- /dev/null +++ b/tools/skills/podling-name-clearance/.claude-plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "name": "podling-name-clearance", + "description": "Runs the Apache Incubator podling name search end to end and writes it up in the required format.", + "version": "0.1.0", + "author": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "homepage": "https://github.com/apache/incubator/tree/master/tools/skills/podling-name-clearance", + "repository": "https://github.com/apache/incubator", + "license": "Apache-2.0", + "keywords": [ + "apache", + "incubator", + "podling", + "trademarks", + "naming" + ], + "skills": "./" +} diff --git a/tools/skills/podling-name-clearance.md b/tools/skills/podling-name-clearance/SKILL.md similarity index 100% rename from tools/skills/podling-name-clearance.md rename to tools/skills/podling-name-clearance/SKILL.md diff --git a/tools/skills/scripts/podling-name-clearance/podling_name_clearance.py b/tools/skills/podling-name-clearance/scripts/podling_name_clearance.py similarity index 100% rename from tools/skills/scripts/podling-name-clearance/podling_name_clearance.py rename to tools/skills/podling-name-clearance/scripts/podling_name_clearance.py diff --git a/tools/skills/podling-onboarding/.claude-plugin/plugin.json b/tools/skills/podling-onboarding/.claude-plugin/plugin.json new file mode 100644 index 000000000..ede26e3b3 --- /dev/null +++ b/tools/skills/podling-onboarding/.claude-plugin/plugin.json @@ -0,0 +1,19 @@ +{ + "name": "podling-onboarding", + "description": "Reviews a new Apache Incubator podling's proposal against the checklist and bootstraps its tracking: SGA, ICLAs, infrastructure, first report date.", + "version": "0.1.0", + "author": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "homepage": "https://github.com/apache/incubator/tree/master/tools/skills/podling-onboarding", + "repository": "https://github.com/apache/incubator", + "license": "Apache-2.0", + "keywords": [ + "apache", + "incubator", + "podling", + "onboarding" + ], + "skills": "./" +} diff --git a/tools/skills/podling-onboarding.md b/tools/skills/podling-onboarding/SKILL.md similarity index 100% rename from tools/skills/podling-onboarding.md rename to tools/skills/podling-onboarding/SKILL.md diff --git a/tools/skills/references/podling-onboarding/phase-1-proposal-review.md b/tools/skills/podling-onboarding/references/phase-1-proposal-review.md similarity index 100% rename from tools/skills/references/podling-onboarding/phase-1-proposal-review.md rename to tools/skills/podling-onboarding/references/phase-1-proposal-review.md diff --git a/tools/skills/references/podling-onboarding/phase-2-sga-receipt.md b/tools/skills/podling-onboarding/references/phase-2-sga-receipt.md similarity index 100% rename from tools/skills/references/podling-onboarding/phase-2-sga-receipt.md rename to tools/skills/podling-onboarding/references/phase-2-sga-receipt.md diff --git a/tools/skills/references/podling-onboarding/phase-3-icla-coverage.md b/tools/skills/podling-onboarding/references/phase-3-icla-coverage.md similarity index 100% rename from tools/skills/references/podling-onboarding/phase-3-icla-coverage.md rename to tools/skills/podling-onboarding/references/phase-3-icla-coverage.md diff --git a/tools/skills/references/podling-onboarding/phase-4-infrastructure.md b/tools/skills/podling-onboarding/references/phase-4-infrastructure.md similarity index 100% rename from tools/skills/references/podling-onboarding/phase-4-infrastructure.md rename to tools/skills/podling-onboarding/references/phase-4-infrastructure.md diff --git a/tools/skills/references/podling-onboarding/phase-5-first-report-date.md b/tools/skills/podling-onboarding/references/phase-5-first-report-date.md similarity index 100% rename from tools/skills/references/podling-onboarding/phase-5-first-report-date.md rename to tools/skills/podling-onboarding/references/phase-5-first-report-date.md diff --git a/tools/skills/release-vote-reviewer/.claude-plugin/plugin.json b/tools/skills/release-vote-reviewer/.claude-plugin/plugin.json new file mode 100644 index 000000000..9fe116965 --- /dev/null +++ b/tools/skills/release-vote-reviewer/.claude-plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "name": "release-vote-reviewer", + "description": "Walks an Apache Incubator release vote thread on general@ and drafts the +1 or the -1 with reasons.", + "version": "0.1.0", + "author": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "homepage": "https://github.com/apache/incubator/tree/master/tools/skills/release-vote-reviewer", + "repository": "https://github.com/apache/incubator", + "license": "Apache-2.0", + "keywords": [ + "apache", + "incubator", + "podling", + "release", + "vote" + ], + "skills": "./" +} diff --git a/tools/skills/release-vote-reviewer.md b/tools/skills/release-vote-reviewer/SKILL.md similarity index 100% rename from tools/skills/release-vote-reviewer.md rename to tools/skills/release-vote-reviewer/SKILL.md diff --git a/tools/skills/retirement-shepherd/.claude-plugin/plugin.json b/tools/skills/retirement-shepherd/.claude-plugin/plugin.json new file mode 100644 index 000000000..bd27dfdbb --- /dev/null +++ b/tools/skills/retirement-shepherd/.claude-plugin/plugin.json @@ -0,0 +1,19 @@ +{ + "name": "retirement-shepherd", + "description": "Assesses whether a stalled Apache Incubator podling should retire and drafts the discussion, the announcement and the shutdown checklist.", + "version": "0.1.0", + "author": { + "name": "Apache Incubator", + "url": "https://incubator.apache.org/" + }, + "homepage": "https://github.com/apache/incubator/tree/master/tools/skills/retirement-shepherd", + "repository": "https://github.com/apache/incubator", + "license": "Apache-2.0", + "keywords": [ + "apache", + "incubator", + "podling", + "retirement" + ], + "skills": "./" +} diff --git a/tools/skills/retirement-shepherd.md b/tools/skills/retirement-shepherd/SKILL.md similarity index 100% rename from tools/skills/retirement-shepherd.md rename to tools/skills/retirement-shepherd/SKILL.md diff --git a/tools/skills/templates/retirement-shepherd/announce-email.md b/tools/skills/retirement-shepherd/templates/announce-email.md similarity index 100% rename from tools/skills/templates/retirement-shepherd/announce-email.md rename to tools/skills/retirement-shepherd/templates/announce-email.md diff --git a/tools/skills/templates/retirement-shepherd/retire-email.md b/tools/skills/retirement-shepherd/templates/retire-email.md similarity index 100% rename from tools/skills/templates/retirement-shepherd/retire-email.md rename to tools/skills/retirement-shepherd/templates/retire-email.md diff --git a/tools/skills/templates/retirement-shepherd/retirement-email.md b/tools/skills/retirement-shepherd/templates/retirement-email.md similarity index 100% rename from tools/skills/templates/retirement-shepherd/retirement-email.md rename to tools/skills/retirement-shepherd/templates/retirement-email.md diff --git a/tools/skills/templates/retirement-shepherd/shutdown-checklist.md b/tools/skills/retirement-shepherd/templates/shutdown-checklist.md similarity index 100% rename from tools/skills/templates/retirement-shepherd/shutdown-checklist.md rename to tools/skills/retirement-shepherd/templates/shutdown-checklist.md From 34c9244c85d8082ee4f9982db0255c6d56a1f360 Mon Sep 17 00:00:00 2001 From: Jarek Potiuk Date: Mon, 9 Nov 2026 01:25:28 -0700 Subject: [PATCH 2/3] Define the topics used by tutor lessons 19-21 The ipmc-job, vendor-neutrality and edge-cases lessons use eleven topics that were never defined, so validate_resources.py failed the Training links check on master. Define them in alphabetical position. Generated-by: Claude Opus 5 --- tools/seealso/resources.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/seealso/resources.yml b/tools/seealso/resources.yml index 65cdcd8ce..f5afc7f6c 100644 --- a/tools/seealso/resources.yml +++ b/tools/seealso/resources.yml @@ -30,6 +30,7 @@ topics: asf-values: "The core ethical and operational values of the ASF, including transparency, merit-based participation, and community-led governance." balance: "The maintenance of healthy diversity across organisations, contributors, and perspectives within a single project." best-practices: "Proven and repeatable behaviours that consistently lead to healthy governance, mentoring, and community outcomes." + binding-vote: "A vote cast by an IPMC or PMC member that counts toward a formal decision, and the responsibility it carries for what is approved." board-reports: "Formal reports submitted by the Incubator to the ASF Board, summarising podling status, risk, and progress." branding: "The correct and compliant use of names, logos, and visual identity for ASF and incubating projects." branding-practice: "How trademark and branding rules are applied in real-world websites, documentation, marketing, and community spaces." @@ -53,23 +54,29 @@ topics: difficult-conversations: "Structured approaches to handling sensitive, corrective, or emotionally charged discussions." discussion-topics: "The evolving subject matter of conversations on Incubator mailing lists over long time periods." diversity: "The representation of different backgrounds, organizations, and perspectives within a community." + edge-cases: "Situations the Incubator's written policy does not settle directly, which call for reasoning from principles rather than rules." engagement: "The sustained involvement of contributors in discussions, reviews, releases, and project support." + escalation: "How a concern moves from a podling's own lists to its mentors, the IPMC, and the Board when it is not resolved at the level it was raised." expectations: "The behavioural, governance, and participation standards placed on contributors, mentors, and podlings." feedback: "Constructive input intended to improve technical work, behaviour, or governance practices." general-list: "Activity on the incubator-general mailing list used as a proxy for IPMC and Incubator-wide engagement." getting-started: "The first practical operational steps taken by new podlings after acceptance into incubation." governance-fundamentals: "The structural principles of ASF governance, including autonomy, meritocracy, and public accountability." + governance-health: "How well a project's decision-making stays open, shared, and independent of any one participant or organisation." governance-importance: "Why well-functioning governance is essential for trust, scalability, and long-term project survival." governance-practice: "How governance rules and norms are applied in day-to-day project operations." governance-risks: "Structural or behavioural patterns that threaten project independence or sustainability." graduation-readiness: "Indicators that a podling has achieved sufficient technical, community, and governance maturity to graduate." + graduation-review: "The IPMC's assessment of a podling's graduation proposal and readiness before voting on the Board resolution." incubation-basics: "The fundamental mechanics of how projects operate while in the Apache Incubator." incubation-facts: "Clarifications that address common misunderstandings about how incubation actually works." independence: "Freedom of a project to operate without control by any single vendor or individual." inclusivity: "The practice of ensuring broad and fair participation in community decision-making." + ip-clearance: "Establishing that code arriving at the ASF from outside, as a donation or a large contribution, can be accepted and relicensed." ipmc-processes: "The operational workflows used by the Incubator PMC to review, guide, and assess podlings." ipmc-role: "The formal oversight and governance responsibilities of the Incubator PMC." joining-incubator: "The motivations, trade-offs, and formal process involved in proposing a project for incubation." + judgement: "Reaching a reasoned decision where no single rule applies, weighing the Apache Way, precedent, and the specifics of the case." legal-basics: "The minimum legal knowledge required to operate compliant ASF projects." lessons: "Insights derived from historical analysis of podlings and governance outcomes." licensing: "The governing rules for how code and content may be used, distributed, and combined." @@ -99,6 +106,7 @@ topics: post-graduation: "The phase of a project’s life after leaving the Incubator." ppmc-onboarding: "The process of welcoming new PPMC members, covering governance duties, voting responsibilities, and working under Incubator oversight." practical-cases: "Real-world applications used to illustrate governance and neutrality concepts." + precedent: "Using how past cases were handled as guidance for a new one, without treating it as binding." process: "The defined workflow for a formal governance or administrative action." project-identity: "How a project presents itself clearly and independently within the ASF." project-resources: "Technical infrastructure and services allocated to a project." @@ -108,6 +116,7 @@ topics: rebalancing: "Adjusting mentor or governance distribution to maintain effective oversight." red-flags: "Early warning indicators that a podling may be at governance or community risk." release-process: "The formal sequence required to build and approve an ASF-compliant release." + release-review: "The IPMC's check of a podling release candidate, its artifacts, licensing, and vote, before casting a binding vote." release-votes: "Formal votes used to approve distributions for public release." report-patterns: "Common recurring structures found in podling status reports." responsibilities: "The expected duties associated with governance and contributor roles." @@ -117,8 +126,10 @@ topics: scenarios-ipmc: "Practice-based oversight exercises intended for IPMC training." scenarios-mentors: "Practice-based decision scenarios for mentor development." scenarios-reporting: "Simulation-based training for writing and reviewing podling reports." + scope: "What falls inside a podling's or the Incubator's remit, and how proposals and donations are assessed against it." scope-check: "Understanding the boundaries of governance authority." sign-off: "Formal confirmation or approval, often given by mentors or PMC members." + single-vendor-dominance: "A project where one organisation controls most contributions or decisions, and the risk this poses to its independence." stewardship: "Long-term caretaking of project governance and sustainability." structure: "Organisational layout of ASF project and foundation governance." transition: "Governance or role changes over time." From d2f19fe450a9db09e6549883cdc716f1c479f206 Mon Sep 17 00:00:00 2001 From: Jarek Potiuk Date: Mon, 9 Nov 2026 01:29:10 -0700 Subject: [PATCH 3/3] Keep each skill under skills// in its plugin Codex installs a plugin whose SKILL.md sits at the plugin root but never lists the skill: it looks only in skills//. Move each skill there, with its scripts, templates and references, and drop the "skills": "./" override. Claude Code finds the skills either way. The releasecheck Makefile and README follow the move, and package-skills.py packages the nested skill when given a plugin directory. Tested by installing all eleven plugins into clean Claude Code and Codex homes: each one exposes its skill in both. Generated-by: Claude Opus 5 --- .../__pycache__/build-skill.cpython-313.pyc | Bin 0 -> 13680 bytes tools/skills/README.md | 24 ++++++++++-------- .../board-report/.claude-plugin/plugin.json | 3 +-- .../{ => skills/board-report}/SKILL.md | 0 .../branding-sweep/.claude-plugin/plugin.json | 3 +-- .../{ => skills/branding-sweep}/SKILL.md | 0 .../branding-sweep}/scripts/checker.py | 0 .../branding-sweep}/scripts/ranker.py | 0 .../branding-sweep}/scripts/render.py | 0 .../branding-sweep}/scripts/rules.json | 0 .../branding-sweep}/scripts/sweep.py | 0 .../.claude-plugin/plugin.json | 3 +-- .../graduation-packet-builder}/SKILL.md | 0 .../templates/board-resolution.md | 0 .../templates/discuss-email.md | 0 .../.claude-plugin/plugin.json | 3 +-- .../graduation-self-assessment}/SKILL.md | 0 .../.claude-plugin/plugin.json | 3 +-- .../maturity-model-assessment}/SKILL.md | 0 .../references/items.md | 0 .../references/report-template.md | 0 .../references/tools.md | 0 .../.claude-plugin/plugin.json | 3 +-- .../monthly-report-review}/SKILL.md | 0 tools/skills/package-skills.py | 16 ++++++++++-- .../.claude-plugin/plugin.json | 3 +-- .../podling-name-clearance}/SKILL.md | 0 .../scripts/podling_name_clearance.py | 0 .../.claude-plugin/plugin.json | 3 +-- .../{ => skills/podling-onboarding}/SKILL.md | 0 .../references/phase-1-proposal-review.md | 0 .../references/phase-2-sga-receipt.md | 0 .../references/phase-3-icla-coverage.md | 0 .../references/phase-4-infrastructure.md | 0 .../references/phase-5-first-report-date.md | 0 .../.claude-plugin/plugin.json | 3 +-- .../release-vote-reviewer}/SKILL.md | 0 .../releasecheck/.claude-plugin/plugin.json | 3 +-- tools/skills/releasecheck/Makefile | 16 +++++++----- tools/skills/releasecheck/README.md | 4 +++ .../{ => skills/releasecheck}/SKILL.md | 0 .../references/apache-license-2.0.txt | 0 .../releasecheck}/references/checks.md | 0 .../references/disclaimer-standard.txt | 0 .../references/disclaimer-wip.txt | 0 .../releasecheck}/references/tools.md | 0 .../releasecheck}/scripts/check_rc.py | 0 .../releasecheck}/scripts/setup_mcps.py | 0 .../releasecheck}/scripts/test_check_rc.py | 0 .../.claude-plugin/plugin.json | 3 +-- .../{ => skills/retirement-shepherd}/SKILL.md | 0 .../templates/announce-email.md | 0 .../templates/retire-email.md | 0 .../templates/retirement-email.md | 0 .../templates/shutdown-checklist.md | 0 55 files changed, 52 insertions(+), 41 deletions(-) create mode 100644 tools/ai-tutor/__pycache__/build-skill.cpython-313.pyc rename tools/skills/board-report/{ => skills/board-report}/SKILL.md (100%) rename tools/skills/branding-sweep/{ => skills/branding-sweep}/SKILL.md (100%) rename tools/skills/branding-sweep/{ => skills/branding-sweep}/scripts/checker.py (100%) rename tools/skills/branding-sweep/{ => skills/branding-sweep}/scripts/ranker.py (100%) rename tools/skills/branding-sweep/{ => skills/branding-sweep}/scripts/render.py (100%) rename tools/skills/branding-sweep/{ => skills/branding-sweep}/scripts/rules.json (100%) rename tools/skills/branding-sweep/{ => skills/branding-sweep}/scripts/sweep.py (100%) rename tools/skills/graduation-packet-builder/{ => skills/graduation-packet-builder}/SKILL.md (100%) rename tools/skills/graduation-packet-builder/{ => skills/graduation-packet-builder}/templates/board-resolution.md (100%) rename tools/skills/graduation-packet-builder/{ => skills/graduation-packet-builder}/templates/discuss-email.md (100%) rename tools/skills/graduation-self-assessment/{ => skills/graduation-self-assessment}/SKILL.md (100%) rename tools/skills/maturity-model-assessment/{ => skills/maturity-model-assessment}/SKILL.md (100%) rename tools/skills/maturity-model-assessment/{ => skills/maturity-model-assessment}/references/items.md (100%) rename tools/skills/maturity-model-assessment/{ => skills/maturity-model-assessment}/references/report-template.md (100%) rename tools/skills/maturity-model-assessment/{ => skills/maturity-model-assessment}/references/tools.md (100%) rename tools/skills/monthly-report-review/{ => skills/monthly-report-review}/SKILL.md (100%) rename tools/skills/podling-name-clearance/{ => skills/podling-name-clearance}/SKILL.md (100%) rename tools/skills/podling-name-clearance/{ => skills/podling-name-clearance}/scripts/podling_name_clearance.py (100%) rename tools/skills/podling-onboarding/{ => skills/podling-onboarding}/SKILL.md (100%) rename tools/skills/podling-onboarding/{ => skills/podling-onboarding}/references/phase-1-proposal-review.md (100%) rename tools/skills/podling-onboarding/{ => skills/podling-onboarding}/references/phase-2-sga-receipt.md (100%) rename tools/skills/podling-onboarding/{ => skills/podling-onboarding}/references/phase-3-icla-coverage.md (100%) rename tools/skills/podling-onboarding/{ => skills/podling-onboarding}/references/phase-4-infrastructure.md (100%) rename tools/skills/podling-onboarding/{ => skills/podling-onboarding}/references/phase-5-first-report-date.md (100%) rename tools/skills/release-vote-reviewer/{ => skills/release-vote-reviewer}/SKILL.md (100%) rename tools/skills/releasecheck/{ => skills/releasecheck}/SKILL.md (100%) rename tools/skills/releasecheck/{ => skills/releasecheck}/references/apache-license-2.0.txt (100%) rename tools/skills/releasecheck/{ => skills/releasecheck}/references/checks.md (100%) rename tools/skills/releasecheck/{ => skills/releasecheck}/references/disclaimer-standard.txt (100%) rename tools/skills/releasecheck/{ => skills/releasecheck}/references/disclaimer-wip.txt (100%) rename tools/skills/releasecheck/{ => skills/releasecheck}/references/tools.md (100%) rename tools/skills/releasecheck/{ => skills/releasecheck}/scripts/check_rc.py (100%) rename tools/skills/releasecheck/{ => skills/releasecheck}/scripts/setup_mcps.py (100%) rename tools/skills/releasecheck/{ => skills/releasecheck}/scripts/test_check_rc.py (100%) rename tools/skills/retirement-shepherd/{ => skills/retirement-shepherd}/SKILL.md (100%) rename tools/skills/retirement-shepherd/{ => skills/retirement-shepherd}/templates/announce-email.md (100%) rename tools/skills/retirement-shepherd/{ => skills/retirement-shepherd}/templates/retire-email.md (100%) rename tools/skills/retirement-shepherd/{ => skills/retirement-shepherd}/templates/retirement-email.md (100%) rename tools/skills/retirement-shepherd/{ => skills/retirement-shepherd}/templates/shutdown-checklist.md (100%) diff --git a/tools/ai-tutor/__pycache__/build-skill.cpython-313.pyc b/tools/ai-tutor/__pycache__/build-skill.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d611ab5fa28de82ed77875469eff1df36f41852 GIT binary patch literal 13680 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 literal 0 HcmV?d00001 diff --git a/tools/skills/README.md b/tools/skills/README.md index 6b5115084..927b9bc2a 100644 --- a/tools/skills/README.md +++ b/tools/skills/README.md @@ -5,16 +5,18 @@ the monthly report review, release vote review, graduation and retirement, the quarterly board report, branding sweeps, podling onboarding and name clearance. -Each skill is a directory holding a `SKILL.md` — YAML frontmatter naming the -skill and describing when it applies, followed by the workflow an agent -follows — plus any supporting files it needs: +Each skill is a plugin directory. The skill itself is a `SKILL.md` — YAML +frontmatter naming the skill and describing when it applies, followed by the +workflow an agent follows — plus any supporting files it needs, kept in +`skills//` inside the plugin, which is where plugin installers +look for it: ``` -/SKILL.md the skill -/scripts/… helper scripts it runs -/templates/… email and document templates it fills in -/references/… long reference material it reads on demand -/.claude-plugin/plugin.json its plugin manifest (see Installing) +/.claude-plugin/plugin.json its plugin manifest (see Installing) +/skills//SKILL.md the skill +/skills//scripts/… helper scripts it runs +/skills//templates/… email and document templates it fills in +/skills//references/… long reference material it reads on demand package-skills.py builds installable .skill packages evals// golden-scenario tests draft/ not yet published @@ -72,10 +74,12 @@ agent reads, all listing the same plugins: | Claude Code | `/plugin marketplace add apache/incubator`, then `/plugin install graduation-self-assessment@apache-incubator` | `.claude-plugin/marketplace.json` | | OpenAI Codex CLI | `codex plugin marketplace add apache/incubator`, then install the plugin | `.agents/plugins/marketplace.json` | | VS Code / GitHub Copilot | add `apache/incubator` as a plugin marketplace | `marketplace.json` | -| Kiro | install from the skill's GitHub subdirectory, e.g. `https://github.com/apache/incubator/tree//tools/skills/graduation-self-assessment` | none; reads `SKILL.md` | +| Kiro | install from the skill's GitHub subdirectory, e.g. `https://github.com/apache/incubator/tree//tools/skills/graduation-self-assessment/skills/graduation-self-assessment` | none; reads `SKILL.md` | Updating is the agent's own plugin update (`/plugin update` in Claude Code). -Keep the three catalogs listing the same plugins when adding one. +Keep the three catalogs listing the same plugins when adding one, and keep +the skill under `skills//`: Codex finds a plugin's skills only +there, not in a `SKILL.md` at the plugin root. Projects that use [Apache Magpie](https://github.com/apache/magpie) can pull the same skills through Magpie instead, for any agent: the ASF organization diff --git a/tools/skills/board-report/.claude-plugin/plugin.json b/tools/skills/board-report/.claude-plugin/plugin.json index 0f40e53f1..7b5531bb6 100644 --- a/tools/skills/board-report/.claude-plugin/plugin.json +++ b/tools/skills/board-report/.claude-plugin/plugin.json @@ -15,6 +15,5 @@ "podling", "board-report", "ipmc" - ], - "skills": "./" + ] } diff --git a/tools/skills/board-report/SKILL.md b/tools/skills/board-report/skills/board-report/SKILL.md similarity index 100% rename from tools/skills/board-report/SKILL.md rename to tools/skills/board-report/skills/board-report/SKILL.md diff --git a/tools/skills/branding-sweep/.claude-plugin/plugin.json b/tools/skills/branding-sweep/.claude-plugin/plugin.json index d0fa6fd08..0b9e26847 100644 --- a/tools/skills/branding-sweep/.claude-plugin/plugin.json +++ b/tools/skills/branding-sweep/.claude-plugin/plugin.json @@ -15,6 +15,5 @@ "podling", "branding", "trademarks" - ], - "skills": "./" + ] } diff --git a/tools/skills/branding-sweep/SKILL.md b/tools/skills/branding-sweep/skills/branding-sweep/SKILL.md similarity index 100% rename from tools/skills/branding-sweep/SKILL.md rename to tools/skills/branding-sweep/skills/branding-sweep/SKILL.md diff --git a/tools/skills/branding-sweep/scripts/checker.py b/tools/skills/branding-sweep/skills/branding-sweep/scripts/checker.py similarity index 100% rename from tools/skills/branding-sweep/scripts/checker.py rename to tools/skills/branding-sweep/skills/branding-sweep/scripts/checker.py diff --git a/tools/skills/branding-sweep/scripts/ranker.py b/tools/skills/branding-sweep/skills/branding-sweep/scripts/ranker.py similarity index 100% rename from tools/skills/branding-sweep/scripts/ranker.py rename to tools/skills/branding-sweep/skills/branding-sweep/scripts/ranker.py diff --git a/tools/skills/branding-sweep/scripts/render.py b/tools/skills/branding-sweep/skills/branding-sweep/scripts/render.py similarity index 100% rename from tools/skills/branding-sweep/scripts/render.py rename to tools/skills/branding-sweep/skills/branding-sweep/scripts/render.py diff --git a/tools/skills/branding-sweep/scripts/rules.json b/tools/skills/branding-sweep/skills/branding-sweep/scripts/rules.json similarity index 100% rename from tools/skills/branding-sweep/scripts/rules.json rename to tools/skills/branding-sweep/skills/branding-sweep/scripts/rules.json diff --git a/tools/skills/branding-sweep/scripts/sweep.py b/tools/skills/branding-sweep/skills/branding-sweep/scripts/sweep.py similarity index 100% rename from tools/skills/branding-sweep/scripts/sweep.py rename to tools/skills/branding-sweep/skills/branding-sweep/scripts/sweep.py diff --git a/tools/skills/graduation-packet-builder/.claude-plugin/plugin.json b/tools/skills/graduation-packet-builder/.claude-plugin/plugin.json index f096ac4a9..16c90c51c 100644 --- a/tools/skills/graduation-packet-builder/.claude-plugin/plugin.json +++ b/tools/skills/graduation-packet-builder/.claude-plugin/plugin.json @@ -14,6 +14,5 @@ "incubator", "podling", "graduation" - ], - "skills": "./" + ] } diff --git a/tools/skills/graduation-packet-builder/SKILL.md b/tools/skills/graduation-packet-builder/skills/graduation-packet-builder/SKILL.md similarity index 100% rename from tools/skills/graduation-packet-builder/SKILL.md rename to tools/skills/graduation-packet-builder/skills/graduation-packet-builder/SKILL.md diff --git a/tools/skills/graduation-packet-builder/templates/board-resolution.md b/tools/skills/graduation-packet-builder/skills/graduation-packet-builder/templates/board-resolution.md similarity index 100% rename from tools/skills/graduation-packet-builder/templates/board-resolution.md rename to tools/skills/graduation-packet-builder/skills/graduation-packet-builder/templates/board-resolution.md diff --git a/tools/skills/graduation-packet-builder/templates/discuss-email.md b/tools/skills/graduation-packet-builder/skills/graduation-packet-builder/templates/discuss-email.md similarity index 100% rename from tools/skills/graduation-packet-builder/templates/discuss-email.md rename to tools/skills/graduation-packet-builder/skills/graduation-packet-builder/templates/discuss-email.md diff --git a/tools/skills/graduation-self-assessment/.claude-plugin/plugin.json b/tools/skills/graduation-self-assessment/.claude-plugin/plugin.json index 2e309ce6b..55fadda37 100644 --- a/tools/skills/graduation-self-assessment/.claude-plugin/plugin.json +++ b/tools/skills/graduation-self-assessment/.claude-plugin/plugin.json @@ -14,6 +14,5 @@ "incubator", "podling", "graduation" - ], - "skills": "./" + ] } diff --git a/tools/skills/graduation-self-assessment/SKILL.md b/tools/skills/graduation-self-assessment/skills/graduation-self-assessment/SKILL.md similarity index 100% rename from tools/skills/graduation-self-assessment/SKILL.md rename to tools/skills/graduation-self-assessment/skills/graduation-self-assessment/SKILL.md diff --git a/tools/skills/maturity-model-assessment/.claude-plugin/plugin.json b/tools/skills/maturity-model-assessment/.claude-plugin/plugin.json index 76665111a..90bfcbccb 100644 --- a/tools/skills/maturity-model-assessment/.claude-plugin/plugin.json +++ b/tools/skills/maturity-model-assessment/.claude-plugin/plugin.json @@ -14,6 +14,5 @@ "incubator", "podling", "maturity-model" - ], - "skills": "./" + ] } diff --git a/tools/skills/maturity-model-assessment/SKILL.md b/tools/skills/maturity-model-assessment/skills/maturity-model-assessment/SKILL.md similarity index 100% rename from tools/skills/maturity-model-assessment/SKILL.md rename to tools/skills/maturity-model-assessment/skills/maturity-model-assessment/SKILL.md diff --git a/tools/skills/maturity-model-assessment/references/items.md b/tools/skills/maturity-model-assessment/skills/maturity-model-assessment/references/items.md similarity index 100% rename from tools/skills/maturity-model-assessment/references/items.md rename to tools/skills/maturity-model-assessment/skills/maturity-model-assessment/references/items.md diff --git a/tools/skills/maturity-model-assessment/references/report-template.md b/tools/skills/maturity-model-assessment/skills/maturity-model-assessment/references/report-template.md similarity index 100% rename from tools/skills/maturity-model-assessment/references/report-template.md rename to tools/skills/maturity-model-assessment/skills/maturity-model-assessment/references/report-template.md diff --git a/tools/skills/maturity-model-assessment/references/tools.md b/tools/skills/maturity-model-assessment/skills/maturity-model-assessment/references/tools.md similarity index 100% rename from tools/skills/maturity-model-assessment/references/tools.md rename to tools/skills/maturity-model-assessment/skills/maturity-model-assessment/references/tools.md diff --git a/tools/skills/monthly-report-review/.claude-plugin/plugin.json b/tools/skills/monthly-report-review/.claude-plugin/plugin.json index f69e7a590..89bfeaf4b 100644 --- a/tools/skills/monthly-report-review/.claude-plugin/plugin.json +++ b/tools/skills/monthly-report-review/.claude-plugin/plugin.json @@ -15,6 +15,5 @@ "podling", "reports", "ipmc" - ], - "skills": "./" + ] } diff --git a/tools/skills/monthly-report-review/SKILL.md b/tools/skills/monthly-report-review/skills/monthly-report-review/SKILL.md similarity index 100% rename from tools/skills/monthly-report-review/SKILL.md rename to tools/skills/monthly-report-review/skills/monthly-report-review/SKILL.md diff --git a/tools/skills/package-skills.py b/tools/skills/package-skills.py index b2d246c7c..480127d74 100644 --- a/tools/skills/package-skills.py +++ b/tools/skills/package-skills.py @@ -5,7 +5,10 @@ name (skill-name/SKILL.md, skill-name/templates/..., ...) — the format the Claude apps accept for installing a skill. -Works with both layouts: +Works with these layouts: + - a plugin directory: /.claude-plugin/ with the skill in + /skills//SKILL.md (how the skills here are kept, + so marketplace installers find them); the skill directory is packaged - a flat single-file skill: .md, with any supporting files in sibling shared directories keyed by skill name -- scripts//... -> /scripts/... in the package @@ -85,8 +88,16 @@ def should_exclude(arcname: Path) -> bool: return any(fnmatch.fnmatch(arcname.name, pat) for pat in EXCLUDE_GLOBS) +def resolve_plugin(target: Path) -> Path: + """A plugin directory carries its skill in skills//: package that.""" + nested = target / "skills" / target.name + if target.is_dir() and not (target / "SKILL.md").exists() and (nested / "SKILL.md").exists(): + return nested + return target + + def package(target: Path) -> bool: - target = target.resolve() + target = resolve_plugin(target.resolve()) if target.is_dir(): name = target.name md = target / "SKILL.md" @@ -143,6 +154,7 @@ def main() -> int: print(f"Not a directory: {src}") return 1 dirs = sorted(p.parent for p in src.glob("*/SKILL.md")) + dirs += sorted(p.parent for p in src.glob("*/skills/*/SKILL.md")) # A top-level .md counts as a flat skill only if it actually carries # skill frontmatter — otherwise it's a README, a todo list, or some # other stray document that would report as a spurious failure. diff --git a/tools/skills/podling-name-clearance/.claude-plugin/plugin.json b/tools/skills/podling-name-clearance/.claude-plugin/plugin.json index fac980fec..b820c4d40 100644 --- a/tools/skills/podling-name-clearance/.claude-plugin/plugin.json +++ b/tools/skills/podling-name-clearance/.claude-plugin/plugin.json @@ -15,6 +15,5 @@ "podling", "trademarks", "naming" - ], - "skills": "./" + ] } diff --git a/tools/skills/podling-name-clearance/SKILL.md b/tools/skills/podling-name-clearance/skills/podling-name-clearance/SKILL.md similarity index 100% rename from tools/skills/podling-name-clearance/SKILL.md rename to tools/skills/podling-name-clearance/skills/podling-name-clearance/SKILL.md diff --git a/tools/skills/podling-name-clearance/scripts/podling_name_clearance.py b/tools/skills/podling-name-clearance/skills/podling-name-clearance/scripts/podling_name_clearance.py similarity index 100% rename from tools/skills/podling-name-clearance/scripts/podling_name_clearance.py rename to tools/skills/podling-name-clearance/skills/podling-name-clearance/scripts/podling_name_clearance.py diff --git a/tools/skills/podling-onboarding/.claude-plugin/plugin.json b/tools/skills/podling-onboarding/.claude-plugin/plugin.json index ede26e3b3..f46ff3d10 100644 --- a/tools/skills/podling-onboarding/.claude-plugin/plugin.json +++ b/tools/skills/podling-onboarding/.claude-plugin/plugin.json @@ -14,6 +14,5 @@ "incubator", "podling", "onboarding" - ], - "skills": "./" + ] } diff --git a/tools/skills/podling-onboarding/SKILL.md b/tools/skills/podling-onboarding/skills/podling-onboarding/SKILL.md similarity index 100% rename from tools/skills/podling-onboarding/SKILL.md rename to tools/skills/podling-onboarding/skills/podling-onboarding/SKILL.md diff --git a/tools/skills/podling-onboarding/references/phase-1-proposal-review.md b/tools/skills/podling-onboarding/skills/podling-onboarding/references/phase-1-proposal-review.md similarity index 100% rename from tools/skills/podling-onboarding/references/phase-1-proposal-review.md rename to tools/skills/podling-onboarding/skills/podling-onboarding/references/phase-1-proposal-review.md diff --git a/tools/skills/podling-onboarding/references/phase-2-sga-receipt.md b/tools/skills/podling-onboarding/skills/podling-onboarding/references/phase-2-sga-receipt.md similarity index 100% rename from tools/skills/podling-onboarding/references/phase-2-sga-receipt.md rename to tools/skills/podling-onboarding/skills/podling-onboarding/references/phase-2-sga-receipt.md diff --git a/tools/skills/podling-onboarding/references/phase-3-icla-coverage.md b/tools/skills/podling-onboarding/skills/podling-onboarding/references/phase-3-icla-coverage.md similarity index 100% rename from tools/skills/podling-onboarding/references/phase-3-icla-coverage.md rename to tools/skills/podling-onboarding/skills/podling-onboarding/references/phase-3-icla-coverage.md diff --git a/tools/skills/podling-onboarding/references/phase-4-infrastructure.md b/tools/skills/podling-onboarding/skills/podling-onboarding/references/phase-4-infrastructure.md similarity index 100% rename from tools/skills/podling-onboarding/references/phase-4-infrastructure.md rename to tools/skills/podling-onboarding/skills/podling-onboarding/references/phase-4-infrastructure.md diff --git a/tools/skills/podling-onboarding/references/phase-5-first-report-date.md b/tools/skills/podling-onboarding/skills/podling-onboarding/references/phase-5-first-report-date.md similarity index 100% rename from tools/skills/podling-onboarding/references/phase-5-first-report-date.md rename to tools/skills/podling-onboarding/skills/podling-onboarding/references/phase-5-first-report-date.md diff --git a/tools/skills/release-vote-reviewer/.claude-plugin/plugin.json b/tools/skills/release-vote-reviewer/.claude-plugin/plugin.json index 9fe116965..3ad3d3f7f 100644 --- a/tools/skills/release-vote-reviewer/.claude-plugin/plugin.json +++ b/tools/skills/release-vote-reviewer/.claude-plugin/plugin.json @@ -15,6 +15,5 @@ "podling", "release", "vote" - ], - "skills": "./" + ] } diff --git a/tools/skills/release-vote-reviewer/SKILL.md b/tools/skills/release-vote-reviewer/skills/release-vote-reviewer/SKILL.md similarity index 100% rename from tools/skills/release-vote-reviewer/SKILL.md rename to tools/skills/release-vote-reviewer/skills/release-vote-reviewer/SKILL.md diff --git a/tools/skills/releasecheck/.claude-plugin/plugin.json b/tools/skills/releasecheck/.claude-plugin/plugin.json index 6b54d393f..de42665f6 100644 --- a/tools/skills/releasecheck/.claude-plugin/plugin.json +++ b/tools/skills/releasecheck/.claude-plugin/plugin.json @@ -14,6 +14,5 @@ "incubator", "podling", "release" - ], - "skills": "./" + ] } diff --git a/tools/skills/releasecheck/Makefile b/tools/skills/releasecheck/Makefile index 653e52499..d2410a259 100644 --- a/tools/skills/releasecheck/Makefile +++ b/tools/skills/releasecheck/Makefile @@ -6,6 +6,8 @@ # .skill file, so a stale one can never ship. SKILL := releasecheck +# The skill itself sits in skills//, where plugin installers look for it. +SKILLDIR := skills/$(SKILL) SKILLS := $(abspath $(CURDIR)/..) PACKAGER := $(SKILLS)/package-skills.py DIST := $(SKILLS)/dist @@ -43,7 +45,7 @@ help: @echo "make clean remove $(OUT)/, __pycache__ and the built package" test: - @$(PYTHON) scripts/test_check_rc.py + @$(PYTHON) $(SKILLDIR)/scripts/test_check_rc.py # Tests gate the package: never ship something that has not passed. build: test @@ -51,7 +53,7 @@ build: test echo "no packager at $(PACKAGER)"; \ echo "build runs from the skill's place in the tools/skills tree, not from an installed copy"; \ exit 2; } - @$(PYTHON) $(PACKAGER) $(CURDIR) + @$(PYTHON) $(PACKAGER) $(CURDIR)/$(SKILLDIR) install: build @installed=; \ @@ -68,20 +70,20 @@ install: build # Separate from install: the skill works without the servers, and this clones # and pip-installs from GitHub and asks before touching any client config. mcp: - @$(PYTHON) scripts/setup_mcps.py $(MCP_ARGS) + @$(PYTHON) $(SKILLDIR)/scripts/setup_mcps.py $(MCP_ARGS) check: @test -n "$(URL)$(RCDIR)" || { \ echo "usage: make check URL= PODLING= [TAGDIR=]"; \ echo " or: make check RCDIR= PODLING="; exit 2; } - @$(PYTHON) scripts/check_rc.py \ + @$(PYTHON) $(SKILLDIR)/scripts/check_rc.py \ $(if $(URL),--url "$(URL)") $(if $(RCDIR),--rc-dir "$(RCDIR)") \ $(if $(PODLING),--podling "$(PODLING)") $(if $(TAGDIR),--tag-dir "$(TAGDIR)") \ - --disclaimer-template references/disclaimer-standard.txt \ - --wip-template references/disclaimer-wip.txt \ + --disclaimer-template $(SKILLDIR)/references/disclaimer-standard.txt \ + --wip-template $(SKILLDIR)/references/disclaimer-wip.txt \ --out "$(OUT)" || true @echo; echo "read $(OUT)/findings.md" clean: - @rm -rf $(OUT) scripts/__pycache__ .pytest_cache $(PACKAGE) + @rm -rf $(OUT) $(SKILLDIR)/scripts/__pycache__ .pytest_cache $(PACKAGE) @echo "cleaned" diff --git a/tools/skills/releasecheck/README.md b/tools/skills/releasecheck/README.md index a31325f0c..bee033fe0 100644 --- a/tools/skills/releasecheck/README.md +++ b/tools/skills/releasecheck/README.md @@ -41,6 +41,10 @@ anyone not using a marketplace. ## Layout +This directory is the plugin; the skill itself is in `skills/releasecheck/`, +where plugin installers look for it. Paths below are relative to that +directory, and the commands are run from it (the Makefile runs from here). + | Path | What it is | | --- | --- | | `SKILL.md` | The review process, eight steps. The agent's entry point. | diff --git a/tools/skills/releasecheck/SKILL.md b/tools/skills/releasecheck/skills/releasecheck/SKILL.md similarity index 100% rename from tools/skills/releasecheck/SKILL.md rename to tools/skills/releasecheck/skills/releasecheck/SKILL.md diff --git a/tools/skills/releasecheck/references/apache-license-2.0.txt b/tools/skills/releasecheck/skills/releasecheck/references/apache-license-2.0.txt similarity index 100% rename from tools/skills/releasecheck/references/apache-license-2.0.txt rename to tools/skills/releasecheck/skills/releasecheck/references/apache-license-2.0.txt diff --git a/tools/skills/releasecheck/references/checks.md b/tools/skills/releasecheck/skills/releasecheck/references/checks.md similarity index 100% rename from tools/skills/releasecheck/references/checks.md rename to tools/skills/releasecheck/skills/releasecheck/references/checks.md diff --git a/tools/skills/releasecheck/references/disclaimer-standard.txt b/tools/skills/releasecheck/skills/releasecheck/references/disclaimer-standard.txt similarity index 100% rename from tools/skills/releasecheck/references/disclaimer-standard.txt rename to tools/skills/releasecheck/skills/releasecheck/references/disclaimer-standard.txt diff --git a/tools/skills/releasecheck/references/disclaimer-wip.txt b/tools/skills/releasecheck/skills/releasecheck/references/disclaimer-wip.txt similarity index 100% rename from tools/skills/releasecheck/references/disclaimer-wip.txt rename to tools/skills/releasecheck/skills/releasecheck/references/disclaimer-wip.txt diff --git a/tools/skills/releasecheck/references/tools.md b/tools/skills/releasecheck/skills/releasecheck/references/tools.md similarity index 100% rename from tools/skills/releasecheck/references/tools.md rename to tools/skills/releasecheck/skills/releasecheck/references/tools.md diff --git a/tools/skills/releasecheck/scripts/check_rc.py b/tools/skills/releasecheck/skills/releasecheck/scripts/check_rc.py similarity index 100% rename from tools/skills/releasecheck/scripts/check_rc.py rename to tools/skills/releasecheck/skills/releasecheck/scripts/check_rc.py diff --git a/tools/skills/releasecheck/scripts/setup_mcps.py b/tools/skills/releasecheck/skills/releasecheck/scripts/setup_mcps.py similarity index 100% rename from tools/skills/releasecheck/scripts/setup_mcps.py rename to tools/skills/releasecheck/skills/releasecheck/scripts/setup_mcps.py diff --git a/tools/skills/releasecheck/scripts/test_check_rc.py b/tools/skills/releasecheck/skills/releasecheck/scripts/test_check_rc.py similarity index 100% rename from tools/skills/releasecheck/scripts/test_check_rc.py rename to tools/skills/releasecheck/skills/releasecheck/scripts/test_check_rc.py diff --git a/tools/skills/retirement-shepherd/.claude-plugin/plugin.json b/tools/skills/retirement-shepherd/.claude-plugin/plugin.json index bd27dfdbb..0e3eac3b5 100644 --- a/tools/skills/retirement-shepherd/.claude-plugin/plugin.json +++ b/tools/skills/retirement-shepherd/.claude-plugin/plugin.json @@ -14,6 +14,5 @@ "incubator", "podling", "retirement" - ], - "skills": "./" + ] } diff --git a/tools/skills/retirement-shepherd/SKILL.md b/tools/skills/retirement-shepherd/skills/retirement-shepherd/SKILL.md similarity index 100% rename from tools/skills/retirement-shepherd/SKILL.md rename to tools/skills/retirement-shepherd/skills/retirement-shepherd/SKILL.md diff --git a/tools/skills/retirement-shepherd/templates/announce-email.md b/tools/skills/retirement-shepherd/skills/retirement-shepherd/templates/announce-email.md similarity index 100% rename from tools/skills/retirement-shepherd/templates/announce-email.md rename to tools/skills/retirement-shepherd/skills/retirement-shepherd/templates/announce-email.md diff --git a/tools/skills/retirement-shepherd/templates/retire-email.md b/tools/skills/retirement-shepherd/skills/retirement-shepherd/templates/retire-email.md similarity index 100% rename from tools/skills/retirement-shepherd/templates/retire-email.md rename to tools/skills/retirement-shepherd/skills/retirement-shepherd/templates/retire-email.md diff --git a/tools/skills/retirement-shepherd/templates/retirement-email.md b/tools/skills/retirement-shepherd/skills/retirement-shepherd/templates/retirement-email.md similarity index 100% rename from tools/skills/retirement-shepherd/templates/retirement-email.md rename to tools/skills/retirement-shepherd/skills/retirement-shepherd/templates/retirement-email.md diff --git a/tools/skills/retirement-shepherd/templates/shutdown-checklist.md b/tools/skills/retirement-shepherd/skills/retirement-shepherd/templates/shutdown-checklist.md similarity index 100% rename from tools/skills/retirement-shepherd/templates/shutdown-checklist.md rename to tools/skills/retirement-shepherd/skills/retirement-shepherd/templates/shutdown-checklist.md