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-explore already 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, runs iru-<key>-code-one-task once 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:

  1. Write the stack’s own iru-setup-<stack>-<flavor> scaffold skill(s), iru-setup-<stack>-gitignore, and iru-setup-<stack>-<ci-provider>-workflows (embedding the shared security block — see Adding a project type below), reusing iru-setup-antora/iru-setup-changelog/iru-setup-readme unchanged.

  2. If the stack should join the iru-code pipeline, add its iru-<key>-code-one-task/iru-<key>-code-one-task-group pair 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.

  3. Write the iru-setup-<stack>-repository orchestrator 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 the args keys its own Step 0 accepts.

  4. 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 relevant AskUserQuestion round (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 new Project type: value (and its detection signal) to the table that line’s vocabulary is a shared contract with iru-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, typically iru-release, computes release/next-dev values and passes each through in turn).

  • Supports a read-current-version mode so iru-release can 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.N suffix, …) 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 (42 vs. PROJ-123). iru-create-github-issue and iru-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:

  1. Naming — every new skill and agent carries the iru- prefix in its directory name, frontmatter name, 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, …).

  2. Shared args vocabulary — 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) or distribution: none|internal|store (apps), sonar: cloud|self-hosted|none (+ its detail keys), mode: new|existing, and on-existing: ask|keep|update|replace — with the same defaults (visibility from args, else gh repo view, else asked; sonar recommended as cloud only for a public, open-source repository, otherwise none, and none whenever ci: no; ci-tests unit for private / full for public; pages defaulted to yes for public and asked with no recommended for private; on-existing defaults to ask and is forwarded only when it arrived via args; publish/ distribution default to yes/store only when open source). Map ci-tests: unit onto whatever the stack’s integration / instrumentation / e2e tests are, make pages: no replace the Pages deploy with an actions/upload-artifact step, 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 a flavor key only when the stack itself has more than one shape (library vs. app, or several app frameworks) the way iru-setup-typescript-repository does.

  3. Description and frontmatter budget — write the description within 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_skills in tools/catalog-budgets.json. See Performance and token budget.

  4. Model tier — pick the frontmatter model by what the skill actually does, matching this catalog’s tiers: haiku for skills that run a tool and report (test, coverage, code-quality, version-bump, -gitignore); sonnet for 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); opus only for open-ended judgment (iru-explore, iru-plan, iru-pr-review). Gates are dispatched through iru-gate-runner rather than invoked inline, so a model switch never happens inside the caller’s context.

  5. 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 the SKILL.md keeps 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.

  6. Sonar/publishing gating — wire the sonar/publish/distribution args into the actual workflow and pom/ manifest content generated, the same way the existing stacks do (a Sonar step only appears in CI when sonar isn’t none; a publish/release job only appears when publish/distribution says so).

  7. The security block — every iru-setup-<stack>-github-workflows skill 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.

  8. Report-only gates through iru-gate-runner — route the new stack’s test/coverage/code-quality/doc-comment skills through the iru-gate-runner agent (Gate Runner) from its <key>-code-one-task-group skill, exactly as Quality gates above describes, so raw tool output never leaks into the calling context.

  9. 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 the SKILL.md, never delete anything inside this repository to do it, and report whatever couldn’t be verified locally instead of assuming it works.

  10. Front-door/explore/readme registration — the three places that don’t discover a new stack automatically (iru-setup-repository Steps 2/4, iru-explore Step 7’s Project type: table, iru-setup-readme Step 2) each need a new entry, per Repository bootstrap for other stacks above.

  11. Docs — once everything above is in place, run /iru-generate-skill-docs and confirm nav.adoc picked 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 run python3 tools/generate-marketplace.py so .claude-plugin/marketplace.json lists it (a new stack gets its own plugin entry, depending on iru-core).

  • Run python3 tools/catalog-audit.py --check (and python3 tools/generate-marketplace.py --check) before opening a pull request: it enforces the description budget, the quoted-YAML frontmatter, the SKILL.md size limits, the model rules, the byte-identical shared files and the templates//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-plan against 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