Setup TypeScript GitHub Workflows
| This documentation was generated with the assistance of AI. Please report any inaccuracies. |
Scaffold or update the build.yml, release.yml, sync.yml (every flavor but react-native/ionic), and
security.yml GitHub Actions workflows plus .github/dependabot.yml that make up an npm/TypeScript
repository’s CI/CD release pipeline, for whichever of seven flavors the repository actually is.
Purpose
iru-setup-typescript-github-workflows wires up the house pipeline for an npm/TypeScript repository of one of
seven flavors: library (a published npm package), react (a Vite/React web app), angular (an Angular CLI
web app), react-native (an Expo app, or a bare React Native Community CLI app on the Metro toolchain), ionic (an Ionic + Capacitor hybrid app), nestjs (a NestJS service),
or nextjs (a Next.js web app with output server or static). build.yml runs install, lint, format check,
typecheck, unit tests with coverage, an optional SonarQube/SonarCloud scan (skipped on fork pull requests), e2e
per ci-tests (Playwright for the web flavors and Next.js — each UI/e2e job also uploads the UI tests' .ui-screenshots/ directory as a 7-day ui-screenshots artifact; for NestJS the test:e2e suite with Testcontainers
on the runner’s Docker, after prisma generate when orm: prisma), the production build (plus an unpushed
container-image build check when a NestJS/Next.js server image is distributed), a docs build
(TypeDoc/Compodoc/Storybook) merged with an Antora build, and a GitHub Pages deploy from the stable branch only
(when pages: yes; with pages: no the merged site is uploaded as a workflow artifact instead).
release.yml is flavor-specific: npm publish via OIDC trusted publishing plus an optional Changesets version-PR
job for library; a web-bundle deploy to Pages for react/angular (dist/ for Vite, dist/<project>/browser/
for Angular) and for nextjs with output: static (the out/ export, with basePath taken from
actions/configure-pages); a multi-stage Dockerfile build pushed to GHCR for nestjs and nextjs server
with distribution: internal (no release.yml at all with distribution: none); with pages: no the web
flavors only build and upload the bundle as an artifact. For react-native with toolchain: expo, EAS or local
Gradle/Xcode builds per native-builds; with toolchain: metro, build.yml gains native jobs on top of the shared
build job — an android job on Linux (JDK 17, Gradle cache, ./gradlew assembleDebug testDebugUnitTest lint), a
cost-gated macOS ios job (bundle install, cached pod install, unsigned simulator xcodebuild) and, only with
ci-tests: full, an e2e-android job running Maestro flows on a reactivecircus/android-emulator-runner emulator —
and release.yml signs an AAB with the upload keystore and uploads it to Google Play (internal track for
distribution: internal, production for store) and archives/exports/uploads the iOS app to TestFlight with an App
Store Connect API key (with distribution: none, only unsigned/debug-signed proof builds). Android/iOS store or
internal artifacts for ionic. sync.yml plus its companion
.github/scripts/sync_versions.py (library/react/angular/nestjs/nextjs) merge the stable branch back into the
integration branch and bump package.json to the next x.y.(z+1)-dev.0 prerelease. security.yml runs the
shared Dependabot (npm, plus docker when a Dockerfile exists, and gradle for /android plus bundler for the
Gemfile on react-native/metro) / dependency-review / CodeQL (javascript-typescript, plus actions for
nestjs/nextjs/react-native-metro, java-kotlin with a manual Gradle compile and, on public repositories only,
swift with a manual simulator build for react-native/metro) / OSV-Scanner / gitleaks block. The skill ships generic
example templates embedded in the skill file, resolves versions at run time against the npm registry and GitHub
Releases API, and resolves every other placeholder from a survey of the target repository rather than guessing.
It announces whether it is creating the CI/CD workflows from scratch or updating an existing setup. For each
workflow file that already exists it warns and asks Update (merge, preserving any step it doesn’t own, with a
diff shown), Keep as is (mismatches with this run’s choices are listed in the report), or Replace
(regenerate from the template, losing customizations), plus Stop; on-existing applies one answer to every
file, and mode: existing alone does not skip the question. For private or internal repositories it states the
cost context (included Actions minutes per plan, macOS runner minutes about 10x Linux for the iOS release job and, for
Metro, the build.yml iOS simulator job (limited to stable-branch pushes and manual runs on private repositories
unless ci-tests is full),
SonarCloud pricing, Pages availability) before asking about sonar, ci-tests, and pages.
Plugin
Shipped by the iru-typescript plugin of the ai-catalog marketplace (install with /plugin install iru-typescript@ai-catalog; see Plugins).
Inputs
| Argument | Required | Description | Default |
|---|---|---|---|
|
No ( |
Pre-resolved values, one |
None. If |
Outputs
-
UI-contract capture upload (see Building user interfaces): every Playwright e2e job (and the metro Maestro
e2e-androidjob) setsUI_SCREENSHOTS_DIRand uploads.ui-screenshots/as a 7-dayui-screenshotsartifact (if: always(),if-no-files-found: ignore). When.ui-quality.ymlsetsaccessibility: none, no accessibility report (a11y-report.txt), upload or accessibility-only step is emitted.ci-tests: unitdrops that upload with the Playwright steps. The Maestro job excludes the dev-onlyui-galleryflows (a release APK has no gallery), so React Native component/screen gallery captures stay local (iru-typescript-test’s `e2eselector). -
.github/workflows/build.ymland.github/workflows/release.yml— created fresh, or, if either already existed, updated (merged), replaced, or kept as is per the user’s per-file choice (oron-existing).release.ymlis not written forlibrarywithpublish: no, nor fornestjs/nextjsserverwithdistribution: none. -
.github/workflows/sync.ymland.github/scripts/sync_versions.py— written together, only for thelibrary/react/angular/nestjs/nextjsflavors; never generated forreact-native/ionic. -
.github/workflows/security.ymland.github/dependabot.yml— always created or updated, independent offlavor/sonar/publish/distribution. For react-native withtoolchain: metro, CodeQL becomes ajavascript-typescript/actions/java-kotlin(plusswifton public repositories only) matrix and Dependabot addsgradle(/android) andbundlerentries. -
Supporting files created if missing:
sonar-project.properties(whensonarisn’tnone, laid out per flavor), and.gitignoreentries fordist/,coverage/,docs/api/,docs/build/,storybook-static/. -
A report stating from-scratch vs update, the per-file action (created / updated / replaced / kept as is) with every mismatch listed for kept files, the
visibilityused and its cost context, and whatci-tests,pages,distribution/output,orm,sonar,docs-tool, and the security block did. -
A report of required repository secrets and repository settings that must be enabled, plus any open gaps (missing Playwright config, missing
ExportOptions.plist, missingDockerfile, missingGemfile.lock/ios/Podfile.lockon metro,next.confignot readingPAGES_BASE_PATH, README/Antora wording that didn’t match `sync_versions.py’s default regexes), ending with a warning to review the workflows before relying on them.
Generated workflow files by flavor
| File | library |
react |
angular |
react-native |
ionic |
nestjs |
nextjs |
|---|---|---|---|---|---|---|---|
|
Yes |
Yes |
Yes |
Yes ( |
Yes |
Yes (own template) |
Yes (own template) |
|
Yes (publish job + optional Changesets version-PR; none with |
Yes (Pages deploy, or artifact only with |
Yes (Pages deploy, or artifact only with |
Yes ( |
Yes (Android/iOS store or internal artifacts) |
GHCR image with |
|
|
Yes |
Yes |
Yes |
No |
No |
Yes |
Yes |
|
Yes |
Yes |
Yes |
Yes ( |
Yes |
Yes (CodeQL also scans |
Yes (CodeQL also scans |
|
Yes |
Yes |
Yes |
Yes ( |
Yes |
Yes (plus |
Yes (plus |
The generated files' bytes come from template files under templates/ (and, where a template needs variant-specific notes, reference/) in .claude/skills/iru-setup-typescript-github-workflows/; the skill reads only the files for the variant it resolved, not the whole set, which keeps its SKILL.md small.
Execution flow
Dependencies
Invokes
None — iru-setup-typescript-github-workflows is a leaf skill; it does not call any other skill in this
catalog. It only recommends iru-setup-antora, the scaffold skills, and iru-setup-typescript-gitignore in
prose when a prerequisite is missing.
Invoked by
-
Setup TypeScript Repository — Step 8, CI/CD workflows, skipped when ci is no, via the
iru-isolated-skill-executoragent.
Required repository secrets
Reported in Step 7 — only the rows that apply to what was actually generated (per flavor/sonar/publish/
distribution/native-builds) are listed, so an omitted row is one fewer secret the user needs to create:
| Secret | Only needed when |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
(none for CI) |
|
(none) |
|
GITHUB_TOKEN needs no setup — GitHub Actions provides it automatically for sync.yml’s `gh calls and
security.yml’s `gitleaks/CodeQL jobs.
The first GHCR push for nestjs/nextjs creates a private package even from a public repository; make it public
or grant the deploying host a pull token. The Testcontainers e2e step needs Docker on the runner (present on
GitHub-hosted ubuntu-latest).
Source
SKILL.md on GitHub — the file this page was generated from.