Catalog architecture
| This documentation was generated with the assistance of AI. Please report any inaccuracies. |
This page is the detailed architecture reference for the catalog. It used to be the "Architecture" section of the
repository’s CLAUDE.md, which loads into every session of this repository; the prose was moved here unchanged so the
always-loaded file can stay short. CLAUDE.md keeps the commands, the iru- naming convention, the generated versus
hand-maintained documentation split and the checks to run, and points here for everything else. See also
Performance and token budget for the budgets, model tiers and plugin packaging that were added
alongside this move, and Plugins for installing the catalog as plugins.
Skills (.claude/skills/<name>/SKILL.md)
Every skill and agent in this catalog carries an iru- prefix (directory name, frontmatter name, and every
cross-reference to it) so its slash command can’t collide with a same-named skill installed from another
marketplace once both sit side by side in a consuming repository’s .claude/skills/. Any new skill or agent
added to this catalog must follow the same convention — see
docs/modules/ROOT/pages/guides/creating-skills-and-agents.adoc.
Each skill is a single, self-contained SKILL.md file: YAML frontmatter with name and description (the
description is what Claude Code uses to decide when the skill is relevant — it should state the exact
invocation form, e.g. /iru-check-license or /iru-check-license <path-or-glob>), followed by step-by-step
instructions written for an agent to follow. A skill is adopted by another repository by copying its
directory into that repository’s .claude/skills/ — skills must not assume they’re running inside
ai-catalog itself (they detect language/platform/tooling at runtime rather than hardcoding it).
Skills compose into a few recurring pipelines rather than each standing alone:
-
Issue-to-PR cycle:
iru-issue→iru-explore→iru-plan→iru-code→iru-pr-description→iru-pr-review.iru-plangroupsimplementation_plan.md’s tasks into dependency-aware groups; `iru-codedoesn’t implement anything itself — it dispatches each group, in order, toiru-code-one-task-group, which resolves each task’s language and delegates to the matchingiru-<key>-code-one-task-groupskill. Installed keys:java,java-springboot,kotlin-springboot,quarkus(Java or Kotlin, detected inside),dotnet,typescript,nestjs,nextjs,php(Laravel / WordPress plugin or theme / PrestaShop module, detected inside),fastapi,django,android,swift,kmp(Kotlin Multiplatform Android + iOS apps — sharedcommonMain/androidMain/iosMaincode, Compose Multiplatform or native UI, and theiosApp/Swift host),react-native(Expo or bare React Native CLI/Metro toolchain, detected inside — theexpodependency decides),windows(Windows desktop apps on .NET 10 — WPF, WinUI 3 or Windows Forms, detected inside from the app csproj, with MVVMViewModels/or MVCControllers/in a UI-freenet10.0Core project; plain .NET libraries/services staydotnet, and macOS desktop apps useswift),rust(Rust crates — clap command-line tools with an optional Ratatui terminal UI, workspaces,xtask),go(Go modules — Cobra command-line tools with an optional Bubble Tea terminal UI, testscript e2e),database— each key<key>has aniru-<key>-code-one-task-group+iru-<key>-code-one-taskpair (keys are discovered from the installed directories, never hardcoded). The group skill captures one quality baseline for the whole group, runsiru-<key>-code-one-taskonce per task — in parallel when the group allows it (databaseis always sequential) — and validates the group once (license → doc comments → tests → 80% coverage → quality diff vs baseline), instead of once per task. Coding skills detect build tool (Maven / Gradle KTS / Gradle Groovy, npm/pnpm/yarn, Composer, uv/Poetry/PDM/pip, Cargo, Go modules) and architecture (hexagonal multi-module vs layered/feature) at runtime. Every container-backed or server-starting stage (Spring Testcontainers, Quarkus Dev Services, NestJS e2e, Next.js Playwright, WordPresswp-env, Python testcontainersintegration-marked pytest tests, React Native Maestro/Detox e2e with Metro on port 8081, KMP iOS simulator test runs, Windows FlaUI desktop UI tests, Rust#[ignore]`d and Go `integration-tagged container tests) is serialized repository-wide behind one shared atomic-mkdirlock directory,.integration-test.lock(owner file, stale after 60 min, released on every exit path, gitignored); Docker unavailable makes that stage "unverified", never silently skipped, and the coverage gate counts only tests that need no containers. The same rule covers devices: no booted simulator/emulator (or no macOS host for an iOS stage) makes a mobile e2e/iOS stage "unverified", and KMP coverage is measured on JVM/Android host tests only (Kotlin/Native iOS code is reported "not measurable"). Desktop apps follow the same rule: the 80% bar is measured on the UI-free core (src/<App>.Coreon Windows, the localPackages/Corepackage on macOS — viaswift test+llvm-cov, since the app scheme’sxccovcan’t see it) and the UI layer is reported "not measured"; on a non-Windows host every Windows app-run/WinUI/UI-test/packaging stage is "unverified (needs Windows)" while the Core tests and theEnableWindowsTargetingcompile of WPF/WinForms still run; macOS XCUITest runs drive the real desktop and stay behind the Swift gates'.simulator-test.lock. Command-line tools need no lock for their end-to-end tests (they run the real binary or command tree in-process, with no containers or devices): the 80% bar is measured on the library unit the scaffolds keep the logic in (src/lib.rs,internal/,<Bin>Kit,src/<Tool>.Core), and a Swift or .NET CLI keeps theswift/dotnetkey — those coding skills detect the CLI shape (an ArgumentParser.executableTarget; a System.CommandLineExe) themselves. -
Repository bootstrap:
iru-setup-repositoryis the front door — it detects a non-empty repository (viairu-explore, reading itsProject type:andAccessibility:lines to pre-select), otherwise asks the project type over up to sixAskUserQuestionrounds of up to three options each (JVM services & libraries, Web & Node, PHP, Python, Mobile & Apple, Desktop & command line — macOS app / Windows app / command-line tool), every round ending in a "Something in the next group" escape hatch (the last in "None of these"); an option bundling several types (Web app → React/Next.js/Angular, WordPress → plugin/block theme, Android, Apple, cross-platform mobile → React Native/Kotlin Multiplatform/Ionic, command-line tool → Rust/Go/Swift/C# .NET) gets one bounded follow-up (React Native’stoolchain: expo|metro+ is then asked by the front door because it changes the macOS CI cost picture), while stack-shape questions (Spring Boot/Quarkus `language`/`build-tool`/ `+layout/frontend, NestJS `orm, Next.jsoutput, Pythondatabase/orm/api/python-version, KMPui) are left to the orchestrator, asks the shared inputs once, and delegates to the matching stack orchestrator viairu-isolated-skill-executor; on an existing repository it forcesmode: existingso every sub-skill takes its update path instead of assuming a brand-new repo. The front door and every orchestrator first announce the setup mode — "from scratch" or "updating an existing repository" plus an inventory of each owned component (build manifest, sources, Antora docs,.gitignore, each workflow file, Dependabot, Sonar config,CHANGELOG.md,README.md,LICENSE) marked absent/present/partial — and every component skill that finds a prior artifact it owns warns and asks Update (merge, keep customizations) / Keep as is (report mismatches with this run’s choices) / Replace (regenerate, customizations lost), with a Stop option where it makes sense;mode: existingalone never means "update silently" — only an expliciton-existingdoes. Final reports repeat the mode and the per-component action (created / updated / replaced / kept as is / skipped (ci: no)). The eleven*-repositorystack 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— each also run standalone, and each chains the same six-step shape in order: scaffold (the language/flavor-specific library or app skill) →iru-setup-antora→iru-setup-<stack>-gitignore→iru-setup-<stack>-github-workflows→iru-setup-changelog→iru-setup-readme(Quarkus reusesiru-setup-java-gitignore, macOS reusesiru-setup-swift-gitignore; the CLI orchestrator picks the scaffold and gitignore skill bylanguageand shares one workflows skill). Flavors:iru-setup-typescript-repository’s `flavorpickslibrary,react,angular,react-native,ionic,nestjs(iru-setup-nestjs-app), ornextjs(iru-setup-nextjs-web), and itsreact-nativeflavor takestoolchain: expo|metro(forwarded toiru-setup-react-native-appandiru-setup-typescript-github-workflows: Expo framework with EAS/CNG andnative-builds: eas|local, or a bare React Native CLI project with committedandroid//ios/, CocoaPods, Gradle/Xcode CI jobs and store release);iru-setup-kmp-repository(viairu-setup-kmp-app,iru-setup-kmp-gitignore,iru-setup-kmp-github-workflows) scaffolds a Kotlin Multiplatform app —shared/+androidApp/+ XcodeGeniosApp/— withui: compose|native;iru-setup-swift-repository’s `appflavor (viairu-setup-apple-app) targetsios/ipados/macos/watchos/visionos(no tvOS), withui: swiftui|uikitfor the iOS/iPadOS target (programmatic UIKit, scene delegate, no storyboards; watchOS/visionOS stay SwiftUI) andarchitecture: mvvm|mvcover the same UI-freePackages/Corelayout the macOS desktop scaffold uses — its optional Fastlane lanes are an intentional difference from the macOS skills' plainxcodebuild/notarytoolpipeline; the two desktop orchestrators takeuiplusarchitecture: mvvm|mvc(offered only where the UI framework supports both — SwiftUI, WPF and WinUI are MVVM-only; AppKit, UIKit and Windows Forms offer MVC or MVVM):iru-setup-macos-repository(viairu-setup-macos-app,iru-setup-macos-github-workflows) scaffolds a macOS-only XcodeGen app withui: swiftui|appkit, a UI-freePackages/Core, the App Sandbox/hardened runtime, and a Developer ID notarized DMG (distribution: internal) or App Store Connect upload (store) release;iru-setup-windows-repository(viairu-setup-windows-app,iru-setup-windows-gitignore,iru-setup-windows-github-workflows) scaffolds a .NET 10<App>.slnxwithui: wpf|winui|winforms, a UI-freenet10.0Core project, MSTest + coverlet, StyleCop/.NET analyzers, DocFX, optional FlaUI UI tests and MSIX, with Linux CI for everything that can run there and Windows runners for the app build, UI tests and per-RID zip/MSIX/App Installer releases (signed with Azure Artifact Signing or a.pfx; optional WinGet; or a Microsoft Store submission);iru-setup-cli-repositoryscaffolds one agent-friendly command-line tool withlanguage: rust|go|swift|dotnet(viairu-setup-rust-cli/iru-setup-go-cli/iru-setup-swift-cli/iru-setup-dotnet-cli, theniru-setup-rust-gitignore/iru-setup-go-gitignore/iru-setup-swift-gitignoreflavor: cli/iru-setup-dotnet-gitignore, andiru-setup-cli-github-workflowsfor all four) andui: none|tui(Ratatui, Bubble Tea, or a .NET terminal UI; never offered for Swift, whose only TUI library is dormant). Every scaffold implements the same contract from the author’s Building CLIs for AI Agents guide — stdout for data / stderr for messages, exit codes 0–7 plus 130/143,--format text|json|jsonlwith aschemaVersionand a JSON error envelope, TTY- andNO_COLOR-aware colour, no prompt without a terminal (--no-input/--yes),--dry-runfor mutations, generatedcompletionand a machine-readableschema, a CLI reference + man page generated from the command tree — and the coding skills'reference/cli-contract.mdrepeats it verbatim per language;cross-os-ci: all|stableschedules the macOS/Windows test legs, anddistribution: internal(release binaries +SHA256SUMS+ build-provenance attestations) /store(pluschannels: crates.io, Homebrew tap, Scoop, WinGet, a NuGet .NET tool) driverelease.yml;iru-setup-php-repository’s picks `laravel,wordpress-plugin,wordpress-theme(block theme), orprestashop-module(iru-setup-php-laravel/-wordpress/-prestashop);iru-setup-python-repository’s picks `fastapi(iru-setup-python-fastapi) ordjango(iru-setup-python-django), sharingiru-setup-python-gitignore/iru-setup-python-github-workflows;iru-setup-quarkus-repository(viairu-setup-quarkus-service,quarkus-stack.ymlmanifest) takeslanguage: java|kotlin,build-tool: maven|gradle(Gradle = Kotlin DSL), andlayout: single|hexagonal.iru-setup-java-springbootis the twelfth orchestrator but follows its own manifest-driven chain instead: it interviews the user once, writes aspringboot-stack.ymlmanifest, delegates the reactor’s generation to itsiru-setup-java-springboot-*sub-skills (pom, modules, apis, optional hilla, testcontainers, platform, github-workflows) plusiru-update-java-springboot-documentationfor the Antora site, and only then fills the remaining repository-level files (iru-setup-java-gitignore,iru-setup-readme,iru-setup-changelog) directly. Itslanguage: java|kotlinandbuild-tool: maven|gradleargs (manifestproject.language/buildTool; Gradle only with Kotlin) switch the same module tree to Kotlin — detekt/ktlint + Dokka instead of Checkstyle/PMD/SpotBugs + Javadoc, and for Gradle a Kotlin DSL build withgradle/libs.versions.tomlandbuild-logic/convention plugins; the Java path stays Maven-only and unchanged. Rolling deployments are an opt-in Spring Boot capability (asked iniru-setup-java-springboot’s Step 3c only with `ci: yes; the front door merely forwardsrolling-deployments/deployment-strategy/advance): the manifest’s optionaldeploy.rollingblock (enabled,strategy: rolling|blue-green|canary|linear,advance: auto|manual|hybrid, +`steps`, `bakeMinutes`) makes `iru-setup-java-springboot-github-workflows` generate a staged `+deploy.yml` (green deployed at 0 % traffic → smoke test on the candidate URL → shift) plus apromote.ymlworkflow_dispatchworkflow that a human uses to advance, roll back or abort, and makesiru-setup-java-springboot-platformgenerate the rollout infrastructure (ECS weighted target groups, Cloud Run revision tags, Argo Rollouts on EKS/GKE). The rule: the workflow drives the shifting and the rollout state lives in the cloud (listener weights / Cloud Run traffic /Rolloutstatus), never in GitHub, sopromote.ymlis stateless; GitHub Environment required reviewers are deliberately not the mechanism (private repositories need Enterprise). Therollingstrategy keeps the single-jobdeploy.ymland generates nopromote.yml.iru-springboot-rolling-deployments(enable/disable) switches it on an existing repository and never runstofu apply/destroy. Seedocs/modules/ROOT/pages/guides/rolling-deployments.adoc. -
Shared bootstrap inputs: the front door and the orchestrators share one
argsvocabulary —open-source: yes|no,visibility: public|private|internal,ci: yes|no,ci-tests: unit|full,pages: yes|no,publish: yes|no(libraries),distribution: none|internal|store(apps),sonar: cloud|self-hosted|none(+sonar-organization/sonar-project-key/sonar-host-url),accessibility: enforce|report|off|none(UI project types only — asked once by the front door or the orchestrator, written by the UI scaffold to.ui-quality.yml;none= opted out entirely,off= rules apply but checks don’t run; on an existing repositoryiru-explore’s `Accessibility: present|partial|absentline, produced from the sharedreference/accessibility-detection.md, pre-selects the answer; a missing.ui-quality.ymlmeansenforceonly in a repository with no UI code yet — otherwise the coding group skills ask once with that same pre-selection and write the file before any UI work),mode: new|existing, andon-existing: ask|keep|update|replace— so a value collected once by a front door or orchestrator never needs re-asking downstream; each downstream scaffold/workflows skill parses only the subset of those keys its own Step 0 lists and ignores the rest.visibilitycomes fromargs, elsegh repo view --json visibility, else is asked (Public recommended when open source);internalcounts asprivatefor every cost decision, and open source + private is flagged as contradictory. Because GitHub Actions minutes (free on public repos; included-minutes budget on private, macOS ~10×), SonarCloud (free only for public/open-source projects), and GitHub Pages (private repos need Pro/Team/Enterprise Cloud, and the site is public unless Enterprise Cloud private Pages) cost differently, the entry point asks, in order:ci(Yes recommended;ci: noskips the whole workflows step including the shared security block),sonar("send CI reports to SonarCloud/SonarQube?" —cloudrecommended only for a public, open-source repo, otherwisenone; withci: no,noneis recommended since nothing would send reports),ci-tests(only withci: yes;unitrecommended for private repos,fullfor public), andpages(only withci: yes; defaulted toyesfor public repos, asked withnorecommended for private —pages: nokeeps the docs build but uploads it as a workflow artifact). A standalone workflows skill resolvesvisibilityand asksci-tests/pages/sonaritself (neverci).on-existingdefaults toaskand is only for scripted runs — orchestrators forward it only when their ownargsreceived it. Defaults:publish/distributiondefault toyes/storeonly when the project is open source. -
Ticket intake:
iru-create-github-issue/iru-create-jira-ticketground a draft in the codebase viairu-explorebefore filing.iru-create-github-issuestays the quick path. The detailed, spec-style path (GitHub only) isiru-draft-github-issue(interview → functional or documentation draft) →iru-review-github-issueloop (classified gap/pending/inconsistency/doubt findings, report-only on existing issues) → optionaliru-split-github-issue. A split creates a root issue, sub-issues (GitHub sub-issues API) and a milestone; dependencies are recorded as aBlocked by: #Nline and aParallel group: <n>line in each sub-issue (same group = parallelizable) plus an ordered group table in the root. -
Release:
iru-releaseconverts a SNAPSHOT/pre-release version into a final release and is not Maven-only — it discovers the installediru-<key>-bump-versionskills (from the skills available in the session, corroborated withfind .claude/skills -maxdepth 1 -type d -name "iru-*-bump-version"when that directory exists — the plugin-safe dual discovery every key registry in the catalog uses), currently +`java` (Java or Kotlin, Maven or Gradle), `typescript`, `react-native` (`+package.json` + Expoexpo.versionor MetroversionName/MARKETING_VERSION, store values only on a release),android,kmp(gradle.propertiesVERSION_NAME/VERSION_CODE+iosAppMARKETING_VERSION),swift,php(Laravelconfig/app.php, WordPress plugin/theme headers, PrestaShop module class;x.y.z-devconvention),python(pyproject.toml[project].version+__version__literals; PEP 440x.y.z.dev0convention; VCS-derived versions left to the git tag),dotnet(Directory.Build.props<Version>+ the four-part MSIXIdentity Versionof a Windows app;x.y.z-devconvention; macOS desktop apps useswift),rust(Cargo.toml[package]/[workspace.package]version + theCargo.lockentry;x.y.z-dev),go(theVersionliteral ininternal/version/version.go, overridden by-ldflags -Xat release;x.y.z-dev; a major ≥ 2 needs the/vNmodule path), andswiftalso owns a Swift CLI’sVersion.swift) and delegates the actual version-file edit to whichever key matches the detected project, keeping its own branch/PR/label/changelog steps ecosystem-agnostic. -
Android reference repository: every
iru-*android*skill’s embedded templates are genericized from a single real repository, https://github.com/albertoirurueta/irurueta-android-glutils (lib/+ Composeapp/,gradle/libs.versions.toml, JUnit 4 + MockK + Robolectric + AndroidX test + Espresso, AGP JaCoCo, inlinesonar {}, Dokka to gh-pages) — keep new Android skills consistent with it, with the decided departures (Antora site + Dokka underapi/,develop/mainbranching with-SNAPSHOTondevelopand async.yml) documented in each skill rather than silently reintroduced. -
Guidance sources for the newer stacks: the Kotlin, Spring Boot (Java/Kotlin), Quarkus, PHP/Laravel, NestJS, Next.js, FastAPI, and Django coding references (each
iru-<key>-code-one-task/reference/routing table) and their setup skills are grounded in the author’s docs repository, https://github.com/albertoirurueta/docs (cited in eachreference/README.mdSources as "irurueta docs: <page path>"); WordPress and PrestaShop aren’t covered there, so those references/scaffolds follow the official docs (developer.wordpress.org handbooks + WordPress Coding Standards, devdocs.prestashop-project.org). Keep new guidance for these stacks consistent with those sources. Kotlin Multiplatform (kmp) and React Native (react-native, both toolchains) follow the official docs (kotlinlang.org multiplatform docs + JetBrains KMP/Compose Multiplatform docs; reactnative.dev, docs.expo.dev, reactnavigation.org, React Native Testing Library), cited the same way in theirreference/README.mdSources; the KMP Android side stays consistent with the Android reference repository’s conventions above. macOS desktop guidance (iru-swift-code-one-task’s `macos.md/appkit.md/architecture.md,iru-setup-macos-app, its workflows) is grounded in the docs repository’sapps/apple/pages; the Windows desktop stack (windowskey,iru-setup-windows-*) follows the official Microsoft Learn docs (WPF, WinUI 3/Windows App SDK, Windows Forms, CommunityToolkit.Mvvm, MSIX, Store, WinGet) plus the docs repository’s C# pages, because the docs repository’s own Windows Apps section (albertoirurueta/docs issue 191) isn’t written yet — switch the citations once it is. Command-line tools in every language follow the docs repository’sai/cli-for-agents/section (Building CLIs for AI Agents — https://www.irurueta.com/ai/cli-for-agents/index.html: streams and exit codes, TTY/colour, machine output, safety, frameworks, TUIs, packaging, testing, documenting); Rust guidance also cites itsprogramming-languages/rust/pages, while Go has no pages there, so the Go skills cite the official docs (go.dev, Cobra, Bubble Tea, golangci-lint, GoReleaser). Keep new CLI guidance consistent with that section. -
UI contract: every skill that builds, tests, scaffolds or documents a user interface (web, server-rendered templates, Android, Apple, React Native, KMP, Windows desktop, terminal UIs) follows one contract, repeated verbatim as
reference/ui-contract.mdin each UI coding skill (android,swift,kmp,typescript,nextjs,react-native,php,django,windows, and therust/go/dotnetterminal UIs) next to a per-stackreference/ui-implementation.md: decompose a design into screens › regions › components before coding (iru-planwrites that tree and plans one task per component, bottom-up); composition over inheritance; components take an immutable UI state and emit typed intent events (two-way binding only for form fields); data-driven or long collections use the platform’s virtualizing/recycling container (RecyclerView/ListAdapter/ DiffUtil, Lazy*,List/UICollectionView,FlatList, web virtualizers, virtualizing WPF/WinUI lists, …) with one reusable item component and the whole list in the view model; UI tests (component, screen, flow) on the desktop/JVM, a simulator/emulator or a real browser (Playwright) over every state and data set, LTR+RTL × light+dark, writing.ui-screenshots/<kind>/<Id>/<state>--<dir>--<theme>[--<variant>…].png(gitignored,UI_SCREENSHOTS_DIRoverrides, cleared by the test gate on a full UI run, uploaded as a CI artifact) and running automated accessibility checks at the.ui-quality.ymllevel (accessibility: enforce|report|off|none; §8 also carries platform assistive-technology rules and visual-comfort extras, all skipped withnone). Docs:iru-setup-antora,iru-update-docsandiru-update-java-springboot-documentationcarry a verbatimreference/ui-docs.md— a User interface section (ui/index.adoc,ui/navigation.adoc, one page per screen and per component) illustrated with the tests' screenshots, of which only the referenced ones are copied intoimages/ui/(the only committed copies, replaced when a component changes, deleted with it), the rest discarded. The shared files —ui-contract.md,ui-docs.md, andaccessibility-detection.md(iniru-exploreandiru-setup-repository) — must stay byte-identical across the skills that carry them. Hand-maintained overview:docs/modules/ROOT/pages/guides/building-user-interfaces.adoc. -
Template verification: every scaffold/workflows/gate skill’s embedded templates are meant to be exercised against the real tooling in a throwaway directory outside this repository (
$TMPDIR/iru-verify/<stack>/<skill>/) before being trusted — nothing inside this repository is ever deleted for that purpose, and whatever can’t be verified locally is reported rather than assumed to work. Every-github-workflowsskill also embeds the same security block (Dependabot, dependency-review, CodeQL, OSV-Scanner, gitleaks) and ends with a required-secrets table; a stack may add opt-in scanners beyond those shared four (e.g. MobSF for Android) as long as the shared block stays.
Agents (.claude/agents/<name>.md)
This repository defines three custom agents for its most-duplicated sub-agent shapes:
-
iru-gate-runner— runs a single verification/quality-gate skill (tests, coverage, code-quality/lint, license headers, doc-comment audits, security scans, or a full build), optionally diffs it against a baseline, and reports back only a compact summary. Gate skills it runs:iru-<lang>-test/-coverage/-code-qualityforjava(Maven or Gradle, Java or Kotlin sources; coverage from JaCoCo,quarkus-jacoco, or Kover),dotnet,typescript(incl. NestJS/Next.js/React Native — both the Expo and Metro toolchains —,e2eselector incl. Maestro/Detox),php(Pest/PHPUnit, Clover, PHPStan/Psalm/PHPCS),python(pytest incl. pytest-django,integrationselector; coverage.py Cobertura; Ruff/mypy/Bandit — shared by thefastapianddjangokeys),android,swift(incl. apackage-pathcoverage mode for an app’s localPackages/Core),kmp(Kover coverage; detekt/ktlint/Android Lint/SwiftLint); thedotnetgates also serve thewindowskey (WPF/WinUI/WinForms awareness,EnableWindowsTargetingoff Windows, auiselector for FlaUI tests);iru-kotlin-code-quality(detekt/ktlint); doc auditsiru-java-javadoc,iru-kotlin-kdoc,iru-kmp-dokka,iru-dotnet-docfx,iru-typescript-tsdoc,iru-php-phpdoc,iru-python-docstrings(RuffD+ Sphinx build),iru-android-dokka,iru-swift-docc,iru-rust-rustdoc(rustdoc + doctests),iru-go-godoc; the Rust gatesiru-rust-test(nextest orcargo test) /-coverage(cargo-llvm-cov) /-code-quality(clippy, rustfmt, cargo-deny) and the Go gatesiru-go-test/-coverage(coverprofile; Go has no branch coverage) /-code-quality(golangci-lint v2, go vet, govulncheck); plusiru-check-license/iru-check-security. Used throughoutiru-code,iru-code-one-task-group, and everyiru-<key>-code-one-task-groupthat validates (all butdatabase), and recommended byiru-planfor the scoped test-run step it writes into generated plans. -
iru-isolated-skill-executor— runs one named skill end-to-end in a completely fresh context so an earlier exploration/planning transcript can’t bias it, while the caller keeps running afterward. Used byiru-issueto delegate the entireiru-coderun for a ticket. -
iru-change-summarizer— fans out over a git commit/tag range and returns only the user-facing changes. Used byiru-setup-changelogto summarize one release at a time when backfilling a long tag history.
Skills that need ad hoc context isolation beyond these three shapes still use Claude Code’s built-in agent
types via the Agent tool: iru-explore uses the Explore agent explicitly; one-off cases like bootstrapping
iru-setup-antora mid-run (iru-generate-skill-docs, iru-update-docs) use general-purpose, the default.
Documentation (docs/)
An Antora site (docs/antora.yml, docs/antora-playbook.yml) with two kinds of pages under
docs/modules/ROOT/pages/, which matters because they’re maintained differently:
-
Generated:
index.adoc, everyskills/*.adoc, andagents/*.adocare regenerated by theiru-generate-skill-docsskill (/iru-generate-skill-docs) directly from theSKILL.mdfiles and agent usage actually on disk, including the reference table, dependency graph, and purpose groups. Re-run it after adding, removing, or materially changing a skill — hand edits to these pages are overwritten on the next run. -
Hand-maintained: everything under
guides/(claude-md.adoc,common-workflows.adoc,creating-skills-and-agents.adoc, etc.) is regular prose, edited directly like any other doc.
nav.adoc lists every page and must gain an entry when a new skill or guide page is added (the
iru-generate-skill-docs skill handles this for generated pages automatically).
docs/build/ is gitignored — never hand-edit generated site output.