Extending the skills and agents catalog
| This documentation was generated with the assistance of AI. Please report any inaccuracies. |
This guide is about growing the catalog itself — adding support for a new language, stack, tracker, or tool to the pipelines already documented in AI Catalog and Common workflows. For the mechanics of authoring any single skill or agent from scratch, see Creating and updating skills and agents; this page instead maps out the specific places in the existing pipelines that were built to be extended, what convention each one relies on, and what’s involved in adding a new one.
Two different kinds of "not supported yet"
Reading through .claude/skills/, a gap falls into one of two shapes, and they call for different work:
-
A registry the pipeline already discovers by convention — the orchestrator skill never hardcodes the list of languages/frameworks it supports; it looks at what’s installed under
.claude/skills/at run time and dispatches to whatever matches. Adding a new entry means creating a skill that follows the naming convention — no change to the orchestrator itself. [_language_framework_backends_for_the_code_pipeline] below is this catalog’s clearest example. -
A single skill that hardcodes one stack’s specifics because that’s the only one this catalog has needed so far. Extending it means either generalizing that skill to detect and branch on the stack (the way
iru-explorealready does for language/framework/host detection), or forking it into a stack-specific sibling that a thin front door dispatches to — the same shape as the first bullet, just not built out yet. Release generation for other ecosystems and Repository bootstrap for other stacks below are both this second shape today.
Knowing which one you’re looking at changes the size of the task: the first is "write one new skill that matches an existing contract," the second is "decide whether to generalize or fork, then do either the detection work or the forking."
Language/framework backends for the iru-code pipeline
This is the catalog’s most fully-built extension point, and the template to copy for any similar registry.
iru-plan (Plan) tags every task with a language/framework key by checking which
-code-one-task skills are actually installed: first from the skills available in the session (names matching
iru--code-one-task), then — when a .claude/skills directory exists — corroborated with find .claude/skills
-maxdepth 1 -type d -name "-code-one-task", so the lookup also works when the catalog is installed as plugins
(see Plugins) and no such directory exists. The skill name minus its iru- prefix and the suffix is the key
(iru-java-code-one-task → java, iru-dotnet-code-one-task → dotnet, iru-database-code-one-task →
database); the iru- prefix is only this catalog’s marketplace-collision namespace, not part of the key
itself. iru-code-one-task-group
(Code One Task Group) does the same lookup for -code-one-task-group at execution time,
partitions a plan group’s tasks into buckets by key, and dispatches each bucket to its iru-<key>-code-one-task-group
skill. Neither orchestrator names java, dotnet, or database anywhere in its own instructions — they are
just whatever happens to be installed.
To add a new backend (say, python or go), create — carrying the iru- prefix every skill and
agent in this catalog uses (see Creating and updating skills and agents) to avoid colliding with
same-named skills installed from other marketplaces:
-
iru-<key>-code-one-task— implements one task’s code and tests only, nothing else (mirrors Java Code One Task / .NET Code One Task). -
iru-<key>-code-one-task-group— captures one pre-change quality baseline for a whole bucket, runsiru-<key>-code-one-taskonce per task (in parallel when the group is marked parallelizable), then validates the bucket once: license headers, doc-comments, tests, coverage, and a quality-regression check against the baseline (mirrors Java Code One Task Group / .NET Code One Task Group). It is not required to shape its validation exactly like the Java/.NET ones —iru-database-code-one-task-group(Database Code One Task Group) deliberately runs no baseline/quality pass at all and always executes its tasks sequentially, because schema/query changes carry ordering dependencies the other two stacks don’t have. Match the new stack’s own real constraints, not the Java/.NET template for its own sake.
Whatever test/coverage/quality/doc-comment skills the new iru-<key>-code-one-task-group calls internally
(iru-java-test/iru-java-coverage/iru-java-code-quality/iru-java-javadoc, iru-dotnet-test/iru-dotnet-coverage/
iru-dotnet-code-quality/iru-dotnet-docfx) are not part of the registry contract and aren’t looked up
generically by name — they’re plain internal implementation detail of that one group skill, so name them
however fits the new stack’s own tooling (there’s no requirement to call the doc-comment one iru-<key>-javadoc,
for instance — iru-dotnet-docfx already breaks that pattern). Route each through the iru-gate-runner agent
(Gate Runner) the same way the existing ones do, so their raw report output stays out of
the calling context.
Once both skills exist, iru-plan and iru-code-one-task-group pick the new key up automatically on their next run —
nothing else in the pipeline needs to change.
If the new stack builds a user interface, its iru-<key>-code-one-task also carries the shared UI contract —
copy reference/ui-contract.md byte-for-byte from any existing UI coding skill and write a
reference/ui-implementation.md mapping it onto the stack (composition idioms, inputs/events, the virtualized
collection container, UI test runner, LTR/RTL and light/dark switches, the screenshot helper writing
.ui-screenshots/, the automated accessibility check reading .ui-quality.yml); its group skill adds the UI
validation stage, its test gate collects the screenshots, and its scaffold writes .ui-quality.yml. See
Building user interfaces.
Repository bootstrap for other stacks
iru-setup-repository (Setup Repository) is the front door for bootstrapping any
repository this catalog supports: it detects a non-empty repository by running iru-explore and reading its
Project type: line to pre-select a stack, or, on an empty one, asks the project type over up to five
AskUserQuestion rounds of three options each, every round ending in a "Something in the next group"
escape hatch (JVM services & libraries, Web & Node, PHP, Python, Mobile & Apple — an option that bundles several types gets
one bounded follow-up, e.g. web app → React / Next.js / Angular), asks the shared inputs
(open-source, visibility, ci, sonar, ci-tests, pages, publish/distribution, …) once, and delegates
to the matching stack orchestrator via iru-isolated-skill-executor. It first announces the setup mode (from
scratch, or updating an existing repository with an inventory of the prior setup found); on an existing repository
it forces mode: existing on that delegation, and every component sub-skill then warns about each pre-existing
artifact it owns and asks Update / Keep as is / Replace instead of assuming a brand-new repo.
Underneath the front door, each stack has its own orchestrator. The eleven -repository orchestrators —
iru-setup-java-library-repository, iru-setup-quarkus-repository, iru-setup-typescript-repository,
iru-setup-php-repository, iru-setup-python-repository, iru-setup-android-repository, iru-setup-swift-repository,
iru-setup-kmp-repository, iru-setup-macos-repository, iru-setup-windows-repository, iru-setup-cli-repository
— all run the same fixed
six-step shape, standalone or via the front
door: scaffold (the language/flavor-specific iru-setup-<stack>-library/-app skill, e.g.
iru-setup-typescript-repository’s own `flavor picks between iru-setup-typescript-library,
iru-setup-react-web, iru-setup-angular-web, iru-setup-react-native-app, iru-setup-ionic-app,
iru-setup-nestjs-app, iru-setup-nextjs-web; iru-setup-php-repository’s between `iru-setup-php-laravel,
iru-setup-php-wordpress (plugin or block theme), iru-setup-php-prestashop; iru-setup-python-repository’s between
`iru-setup-python-fastapi, iru-setup-python-django; iru-setup-quarkus-repository always
runs iru-setup-quarkus-service, parameterized by language/build-tool/layout; iru-setup-kmp-repository always
runs iru-setup-kmp-app, parameterized by ui; iru-setup-macos-repository and iru-setup-windows-repository
always run iru-setup-macos-app/iru-setup-windows-app, parameterized by ui and architecture (MVVM or MVC,
offered only where the UI framework supports both); iru-setup-cli-repository picks iru-setup-rust-cli,
iru-setup-go-cli, iru-setup-swift-cli or iru-setup-dotnet-cli by language, parameterized by ui, with one
shared iru-setup-cli-github-workflows skill for all four languages; and a *toolchain variant such as React Native’s toolchain:
expo|metro is a parameter of one scaffold skill, iru-setup-react-native-app, forwarded by its orchestrator to the
matching workflows skill too, rather than a separate flavor) →
iru-setup-antora → iru-setup-<stack>-gitignore → iru-setup-<stack>-github-workflows → iru-setup-changelog
→ iru-setup-readme (a stack may reuse a sibling’s gitignore skill, as Quarkus reuses iru-setup-java-gitignore and
the macOS desktop stack reuses iru-setup-swift-gitignore).
iru-setup-java-springboot is the exception: it runs a manifest-driven chain of its own
(interview → springboot-stack.yml → iru-setup-java-springboot-pom/-modules/-apis/-hilla/
-testcontainers/-platform/-github-workflows → iru-update-java-springboot-documentation → gitignore/README/
changelog) because a hexagonal Spring Boot reactor has far more to generate than a single scaffold step; its
language: java|kotlin and build-tool: maven|gradle args are how a language variant joins an existing chain
without forking it — Kotlin is a branch inside each iru-setup-java-springboot- sub-skill, not a parallel set of
skills.
iru-setup-antora, iru-setup-changelog, and iru-setup-readme are the three steps
already generalized across the -repository orchestrators — don’t fork those; a new stack only ever needs its
own scaffold, gitignore, and workflows skills.
To add a new project type:
-
Write the stack’s own
iru-setup-<stack>-<flavor>scaffold skill(s),iru-setup-<stack>-gitignore, andiru-setup-<stack>-<ci-provider>-workflows(embedding the shared security block — see Adding a project type below), reusingiru-setup-antora/iru-setup-changelog/iru-setup-readmeunchanged. -
If the stack should join the
iru-codepipeline, add itsiru-<key>-code-one-task/iru-<key>-code-one-task-grouppair per [_language_framework_backends_for_the_code_pipeline] above — this is a separate registry from the bootstrap one and only needed when the new stack’s code should be implemented through/iru-code, not merely scaffolded. -
Write the
iru-setup-<stack>-repositoryorchestrator that chains the six steps above in order, following an existing one (Setup TypeScript Repository and Setup PHP Repository are the most recent flavor-routing templates) for how it collects shared inputs once and forwards each sub-skill only theargskeys its own Step 0 accepts. -
Register the new stack in the three places that don’t discover it automatically:
-
iru-setup-repository(Setup Repository) Steps 2 and 4 — add it as a new option in the relevantAskUserQuestionround (every round already holds three options plus its escape hatch, so either fold it into an existing option’s follow-up question, the way "Web app" splits into React / Next.js / Angular, or add a new round) and as a new delegation target. -
iru-explore(Explore) Step 7 — add the newProject type:value (and its detection signal) to the table that line’s vocabulary is a shared contract withiru-setup-repository. -
iru-setup-readme(Setup Readme) Step 2 — add whatever manifest/build-file detection and installation-snippet shape the new stack needs.
-
Release generation for other ecosystems
iru-release (Release) is no longer Maven-only: its branch/PR/label/changelog steps —
determining the PR base branch by checking what actually exists on the remote rather than assuming main,
delegating the changelog summary to the iru-change-summarizer agent
(Change Summarizer), drafting the PR description via iru-pr-description
(PR Description) — stay the same for every ecosystem, and only the version-bump mechanics
are pluggable: which file carries the version, what "current pre-release" looks like in that ecosystem, and what
command (if any) applies the bump. That pluggable piece is now a registry, the same shape as
[_language_framework_backends_for_the_code_pipeline]: iru-release discovers the installed
iru--bump-version skills from the session’s available skills (corroborated with find .claude/skills -maxdepth 1
-type d -name "iru--bump-version" when that directory exists) and delegates the actual edit to whichever
iru-<key>-bump-version skill matches the project it detected (today: java (Maven or Gradle, Java or Kotlin),
typescript, react-native, android, kmp, swift, php, python, dotnet, rust, go), falling back to asking the
user which file to edit by hand if none is installed.
To add a new ecosystem, create iru-<key>-bump-version following the sibling contract every existing one
shares (TypeScript Bump Version is a good template):
-
Takes a single literal
<new-version>argument — it never computes a bump itself, only applies the exact value it’s given (the caller, typicallyiru-release, computes release/next-dev values and passes each through in turn). -
Supports a read-current-version mode so
iru-releasecan read the existing version before asking the user what to bump it to. -
Documents that ecosystem’s own pre-release convention (
-SNAPSHOT, a-dev.N/-alpha.Nsuffix, …) so `iru-release’s "next SNAPSHOT" question offers a sensible default. -
Reports the old and new version and every file it touched (manifest, lockfile, any README/Antora version mentions it also syncs).
iru-release picks up the new key automatically on its next run — nothing else in that skill needs to change.
Ticket trackers and git hosts
Two detections already exist inside iru-explore (Explore) and are reused by iru-issue,
iru-pr-description, and iru-pr-review, and are worth knowing about before assuming they need building from
scratch:
-
Ticket system — GitHub issue vs. Jira ticket, auto-detected from the id’s shape (
42vs.PROJ-123).iru-create-github-issueandiru-create-jira-ticket(Create GitHub Issue, Create Jira Ticket) are the two filing skills this detection currently dispatches to. -
Repository host — GitHub, Bitbucket, Azure DevOps, or TFS, detected from the git remote URL, with the user asked directly (never guessed) when a self-hosted or mirrored URL doesn’t clearly match any of them.
Adding a third tracker (Azure Boards, Linear, …) or confirming support for a host this catalog doesn’t yet
name means extending iru-explore’s two detection steps with the new pattern, then — for a new tracker — adding
an `iru-create-<tracker>-ticket skill mirroring the two that exist. Because iru-issue, iru-pr-description, and
iru-pr-review all read iru-explore’s detection result rather than re-implementing their own, a new host only needs
wiring into `iru-explore once and the tooling calls (branch/PR/merge-request creation, comment posting) inside
those three downstream skills — not into every skill that touches git hosting individually.
Customizing Jira ticket creation
iru-create-jira-ticket (Create Jira Ticket) already asks for the context every ticket
needs regardless of organization — purpose, related tickets, an optional epic, a due date, an importance level.
Many organizations need more than that before a ticket is genuinely ready to file: a required custom field,
team/component ownership, a customer/account, an affected environment, a compliance or security classification.
Rather than growing iru-create-jira-ticket itself with organization-specific questions that wouldn’t apply to
every installation of this catalog, that skill delegates to iru-jira-custom-context
(Jira Custom Context) during its own context-gathering step.
Out of the box, iru-jira-custom-context asks a single generic, optional catch-all question and returns
whatever the user provides — it defines no organization-specific questions of its own. Extending it is a
one-file customization, unlike the registry-shaped extension points above: there’s no naming convention to
match or a new skill to register, just this one skill’s own Step 2, edited in place, with whichever questions or
lookups a given Jira workflow actually needs — a fixed-choice AskUserQuestion when the answer is a known,
bounded set, an open-ended question when it’s free-form, or an automated lookup (via a connected MCP tool) when
the context can be derived rather than asked.
Quality gates
iru-check-license, iru-check-security, and the per-language iru-<key>-code-quality skills are all invoked the same
way — through the iru-gate-runner agent (Gate Runner), which runs one gate, optionally
diffs it against a baseline, and reports back a compact summary instead of the raw tool report. Adding a new
gate (a dependency-vulnerability scan, an accessibility check, a performance budget) means writing one skill
in that same shape — a single scan/check with a clear pass/fail and issue list — and then wiring a
iru-gate-runner call for it into whichever iru-<key>-code-one-task-group skill(s) should run it as part of their
per-bucket validation pass (every validating group skill has one — e.g. Java Code One Task Group
Step 1/4, PHP Code One Task Group, NestJS Code One Task Group,
FastAPI Code One Task Group; only
Database Code One Task Group runs no gates). The new gate
doesn’t need to touch iru-gate-runner itself — that agent already runs "whatever skill name it’s told to run."
Custom agent shapes
Agents documents the three custom agents this catalog has needed so far
(iru-gate-runner, iru-isolated-skill-executor, iru-change-summarizer) and, more usefully for extension, the test it
applies before adding a fourth: only when a built-in agent type’s tool access or system prompt genuinely
doesn’t fit a recurring sub-agent shape used by more than one skill. A one-off isolation need (as several
skills already handle by calling the built-in general-purpose or Explore types directly via Agent)
doesn’t warrant a new custom agent definition; a shape that starts showing up identically in a third or
fourth skill probably does.
Documentation tooling
iru-setup-antora, iru-build-docs, iru-update-docs, and iru-generate-skill-docs are all built specifically around
Antora — the toolchain this catalog itself uses for docs/. Supporting a repository that documents itself
with something else (MkDocs, Docusaurus, plain GitHub wiki pages) would mean paralleling this same quartet
for that tool rather than trying to generalize Antora-specific logic (playbook/component config, AsciiDoc
xref syntax, the nav.adoc format) in place — there’s currently no signal in this catalog that more than one
doc toolchain needs supporting at once, so building that generalization ahead of a second real use case would
be speculative.
Adding a project type
The sections above cover each extension point in isolation; a genuinely new project type (a new stack, not just a new flavor of an existing one) touches most of them at once. This checklist pulls the full set together in the order it’s usually easiest to work through:
-
Naming — every new skill and agent carries the
iru-prefix in its directory name, frontmattername, and every cross-reference to it (Creating and updating skills and agents); a stack’s skills share the same<key>throughout (iru-<key>-code-one-task,iru-<key>-bump-version,iru-setup-<key>-gitignore, …). -
Shared
argsvocabulary — accept the same keys every other orchestrator/scaffold/workflows skill does:open-source: yes|no,visibility: public|private|internal,ci: yes|no,ci-tests: unit|full,pages: yes|no,publish: yes|no(libraries) ordistribution: none|internal|store(apps),sonar: cloud|self-hosted|none(+ its detail keys),mode: new|existing, andon-existing: ask|keep|update|replace— with the same defaults (visibilityfromargs, elsegh repo view, else asked;sonarrecommended ascloudonly for a public, open-source repository, otherwisenone, andnonewheneverci: no;ci-testsunitfor private /fullfor public;pagesdefaulted toyesfor public and asked withnorecommended for private;on-existingdefaults toaskand is forwarded only when it arrived viaargs;publish/distributiondefault toyes/storeonly when open source). Mapci-tests: unitonto whatever the stack’s integration / instrumentation / e2e tests are, makepages: noreplace the Pages deploy with anactions/upload-artifactstep, and have every file-writing skill announce scratch vs update and ask Update / Keep as is / Replace for each pre-existing artifact it owns. Add aflavorkey only when the stack itself has more than one shape (library vs. app, or several app frameworks) the wayiru-setup-typescript-repositorydoes. -
Description and frontmatter budget — write the
descriptionwithin the catalog’s budget: at most 1,024 characters (an internal skill that only other skills call targets 400), starting with the invocation form (/iru-<name> …or "Invoked as …") within the first 200 characters, then what it does and when to use it, as a double-quoted YAML value (an unquoted: ` inside a description makes the frontmatter unparsable and the skill loads with no description and no model). Add a skill that only other skills invoke to `internal_skillsintools/catalog-budgets.json. See Performance and token budget. -
Model tier — pick the frontmatter
modelby what the skill actually does, matching this catalog’s tiers:haikufor skills that run a tool and report (test, coverage, code-quality, version-bump,-gitignore);sonnetfor everything that writes code or files (<key>-code-one-task/<key>-code-one-task-group, doc-comment audits that generate missing comments,<key>-generate-all-tests, scaffolds,-github-workflows, orchestrators);opusonly for open-ended judgment (iru-explore,iru-plan,iru-pr-review). Gates are dispatched throughiru-gate-runnerrather than invoked inline, so a model switch never happens inside the caller’s context. -
Embedded, genericized templates — every scaffold/workflows skill carries its own templates (no external template repo): the exact bytes of each generated file live in
.claude/skills/<skill>/templates/<variant>/<path of the generated file>, and theSKILL.mdkeeps a "Templates" index table (generated file, template path, when it applies) and tells the agent to read only the variant it resolved. They are genericized from a real reference project when one exists (see the Android reference repository rule in Catalog architecture), with dependency/tool versions looked up at run time rather than hardcoded, so the skill doesn’t go stale as the ecosystem moves. Keep the skill self-contained: everything it needs lives under its own directory so copying that directory still works. -
Sonar/publishing gating — wire the
sonar/publish/distributionargs into the actual workflow and pom/ manifest content generated, the same way the existing stacks do (a Sonar step only appears in CI whensonarisn’tnone; a publish/release job only appears whenpublish/distributionsays so). -
The security block — every
iru-setup-<stack>-github-workflowsskill embeds the same block (Dependabot, dependency-review, CodeQL, OSV-Scanner, gitleaks) and ends with a required-secrets table listing exactly the secrets its generated workflows reference. -
Report-only gates through
iru-gate-runner— route the new stack’s test/coverage/code-quality/doc-comment skills through theiru-gate-runneragent (Gate Runner) from its<key>-code-one-task-groupskill, exactly as Quality gates above describes, so raw tool output never leaks into the calling context. -
Throwaway-directory verification — exercise every scaffold/workflows/gate template against the real tooling in a directory outside this repository (
$TMPDIR/iru-verify/<stack>/<skill>/), fold whatever quirks surface back into theSKILL.md, never delete anything inside this repository to do it, and report whatever couldn’t be verified locally instead of assuming it works. -
Front-door/explore/readme registration — the three places that don’t discover a new stack automatically (
iru-setup-repositorySteps 2/4,iru-exploreStep 7’sProject type:table,iru-setup-readmeStep 2) each need a new entry, per Repository bootstrap for other stacks above. -
Docs — once everything above is in place, run
/iru-generate-skill-docsand confirmnav.adocpicked up every new skill page, per After adding a new extension below.
After adding a new extension
Once a new skill following one of the shapes above is in place:
-
Add the new skill or agent to a plugin in
tools/plugins.json, then runpython3 tools/generate-marketplace.pyso.claude-plugin/marketplace.jsonlists it (a new stack gets its own plugin entry, depending oniru-core). -
Run
python3 tools/catalog-audit.py --check(andpython3 tools/generate-marketplace.py --check) before opening a pull request: it enforces the description budget, the quoted-YAML frontmatter, theSKILL.mdsize limits, the model rules, the byte-identical shared files and thetemplates//reference/paths. -
Re-run
iru-generate-skill-docs(Generate Skill Docs) so the reference table, dependency graph, and the new skill’s own detail page are generated from it — don’t hand-write that page. -
If it introduces a new key used by
iru-plan/iru-code-one-task-group(or a new stack/tracker/host), sanity-check it end to end: run/iru-planagainst a task that should resolve to the new key and confirm it’s tagged correctly, rather than only reading the new skill’s own instructions back. -
If a hand-maintained guide page (this one included) describes the gap you just filled, update it — this page is prose, not generated, and will drift the same way any hand-maintained doc does.
See also
-
Setup Repository, Release — the front door and the release skill this guide’s registries plug into.