Install
$ agentstack add skill-bendaamerahmed-backstage-idp-plugin-backstage-quality-gate ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Backstage quality gate
Prove a Backstage change is sound by running the repository's own validation commands, narrowest first, and report exactly what ran. A command that did not run and exit zero is not a pass.
Preconditions
- The repo is mapped (
backstage-repo-discovery) or you have read the root
package.json scripts and every CI workflow yourself.
node_modulesis installed. If not,yarn install --immutableis step zero and its
cost belongs in the summary. Assume yarn unless the lockfile says otherwise.
- Node 22 or 24. Any other major invalidates every result — report BLOCKED.
- You know which workspace packages your edits touch (map changed paths → the owning
package.json name and backstage.role).
- You can run long commands in the background and poll them. Foreground-blocking a
watch-mode test run or a dev server wastes the whole turn.
Procedure
- Discover the real commands. Read the root
package.jsonscriptsverbatim, the
scripts of each touched package, and .github/workflows/*.y*ml (or GitLab/Circle/ Azure/Jenkins equivalents). CI is the contract; scripts are a hint. Scaffolded apps expose tsc, tsc:full, lint (repo lint --since origin/), lint:all, test, test:all, build:all, build:backend, prettier:check, fix — but any of these may be renamed, wrapped, or absent. Record command, working directory, and expected duration. Never invoke a script you have not seen defined.
- Make runs non-interactive.
backstage-cli repo testandpackage testdefault to
Jest watch mode inside a git repo; run in the foreground they never exit. Pass --watch=false explicitly, or set CI=1 (which is what CI does, and also makes repo test run all tests). Know the side effect: with CI set, TestDatabases from @backstage/backend-test-utils stops being SQLite-only and spins up every configured engine via testcontainers. Without Docker, prefer --watch=false over CI=1, or supply BACKSTAGE_TEST_DATABASE_POSTGRES17_CONNECTION_STRING (and siblings), and say which you chose in the summary.
- Run the targeted test first. Jest config from the CLI roots at
src, requires the
.test. infix, and loads src/setupTests.ts. Filter from the repo root (yarn backstage-cli repo test --watch=false packages/app/src/Foo.test.tsx) or scope to the package (yarn workspace test --watch=false ). Fix here, not after a 15-minute repo sweep.
- Run the whole touched package's suite next (`yarn workspace test
--watch=false`). This is the cheapest place to catch cross-test leakage; a single green test file proves nothing about the file next to it.
- Type-check the repo, not the package. There is no per-package type check — a
Backstage monorepo is one TypeScript compilation unit, with incremental output in dist-types/ at the repo root. Use yarn tsc for the fast loop. It runs with skipLibCheck on, so it does not verify types inside node_modules. Before calling anything done, run the CI-equivalent yarn tsc:full (tsc --skipLibCheck false --incremental false) in the background — it is slow and it is the only check that sees library-level type breakage.
- Lint the touched packages (
yarn workspace lint, or
yarn backstage-cli package lint inside it). Each package's .eslintrc.js derives from @backstage/cli/config/eslint-factory, so rules differ by backstage.role. Check --max-warnings in the CI invocation; the default allows warnings and CI often does not. Lint does not check formatting — run yarn prettier:check separately if the repo has it.
- Build.
backstage-cli repo builddeliberately excludes bundled packages
(roles frontend and backend); only --all (yarn build:all) includes the app and backend. Build the app bundle (yarn workspace app build) and the backend bundle (yarn build:backend) explicitly for any change that touches them. A successful repo build says nothing about either bundle. Background both.
- Confirm the backend bundle artifacts. A backend
package buildwrites
packages/backend/dist/bundle.tar.gz plus packages/backend/dist/skeleton.tar.gz (package.json files only, for Docker layer caching). ls -l both. The backend build also builds its local dependencies — including the linked app package — unless --skip-build-dependencies is passed, so a failure reported by build:backend is often a frontend build failure wearing a backend label. Read the first error, not the last.
- Validate config twice.
yarn backstage-cli config:checkdefaults to
app-config.yaml (+ app-config.local.yaml) — that is the dev answer. Then check the deployed set explicitly, because passing any --config disables the defaults: yarn backstage-cli config:check --config app-config.yaml --config app-config.production.yaml. Add --strict to reject keys with no schema, --frontend (or --package app) to check frontend-visible config, --deprecated to surface deprecated keys. Use --lax only to prove shape when env vars are unset, and label the result as such. If you added config keys, confirm they appear in yarn --silent backstage-cli config:schema.
- Then the repo-wide sweep, in the order CI runs it:
yarn lint:all,yarn test:all
(or repo test), yarn tsc:full, yarn build:all. Redirect each to a log file, background it, poll, and capture the exit code explicitly — for example append ; echo "EXIT=$?" to the log. Read the log, not the terminal tail.
- Do not trust caches or ref filters while validating a change.
--success-cache
(default dir node_modules/.cache/backstage-cli) skips packages that were unchanged and successful on the previous run — a cached pass is not evidence about your change. Omit it, or clear the cache dir. For --since , verify the ref resolves (git rev-parse --verify origin/main) — in a shallow or detached checkout the selection can be empty and the command exits zero having tested nothing.
- Write the summary. One line per command: the exact command, scope, exit code,
wall time, and PASSED / FAILED / NOT RUN. Every NOT RUN carries a reason (no Docker, no app-config.production.yaml, timed out at N minutes, would require network). Never silently drop a check. Hand this to pull-request-ready; a gate with unexplained gaps is a BLOCKED report, not a green one.
Verification
- Every
PASSEDmaps to a command you invoked whose exit code you read as0. yarn tsc:fullcompleted after your last source edit, not before it.ls -l packages/backend/dist/bundle.tar.gz packages/backend/dist/skeleton.tar.gz
succeeds when the change touches the backend.
config:checkran against the production config set, not only the defaults.- The narrowest test from step 3 is re-run once after all edits and still passes.
- No result in the summary came from a
--success-cachehit or an empty--since
selection.
Failure modes
- Watch mode hang.
yarn testblocks forever waiting for keypresses; the tool times
out and the run looks ambiguous. Always --watch=false or CI=1.
- Green package, red repo. Per-package builds emit types independently, but type
checking is repo-wide. A signature change that compiles in its own package breaks a consumer three packages away, and only yarn tsc sees it.
skipLibCheckblindness.yarn tscpasses, CI'stsc:fullfails on a
node_modules type conflict — typically duplicate @backstage/* or @types/react versions after a partial bump. See backstage-upgrade.
- Stale incremental state.
dist-types/from an earlier branch makesyarn tscpass
on code that cannot compile clean. Re-check with yarn tsc:full or yarn clean.
- App builds, backend bundle fails. The webpack app build and the backend archive
build share almost nothing. Backend-only breakage: a package missing backstage.role, a src import of a devDependency, a subpath export not declared, or a local dependency that was never built.
- Config valid in dev, invalid in prod.
app-config.production.yamlis never loaded
by default, its ${VAR} substitutions are unset locally, and --lax will happily hide that. --strict then rejects a key whose owning plugin is not installed. Config schemas resolve imported types, so one bad import in a schema breaks schema loading repo-wide, not just for that plugin.
- Tests pass alone, fail together. Shared module state, mutated
process.env,
unreset MSW handlers, fake timers, or a reused test database. Reproduce with the full package suite; --runInBand distinguishes ordering from concurrency.
- Docker-dependent tests.
CI=1switchesTestDatabasesto real engines, and
TechDocs generation with techdocs.generator.runIn: docker needs a daemon. Without Docker these are NOT RUN, never PASSED.
- Timeout read as success. A backgrounded build that was killed produced no errors
because it produced nothing. Absence of output is absence of evidence.
- Lint green, CI red on formatting. ESLint and Prettier are separate steps in a
Backstage repo.
Do not
- Do not mark a command
PASSEDunless it ran to completion and exited zero, and you
read that exit code.
- Do not run
yarn test,yarn start, orrepo startin the foreground. - Do not use
--success-cacheor rely on--sincewhen validating your own change. - Do not reach for green by adding
@ts-ignore,eslint-disable,it.skip, or by
deleting a failing test; report the failure.
- Do not edit
resolutions, the lockfile, or package versions to clear a build error
inside a quality gate — that is an upgrade, and it needs its own review.
- Do not substitute
yarn tscforyarn tsc:fullin the final report, orrepo build
for build:all / build:backend.
- Do not invent script names; if a check has no command in this repo, report it as
NOT RUN — no such script rather than improvising one.
- Do not push, tag, publish, or deploy from this skill.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: bendaamerahmed
- Source: bendaamerahmed/backstage-idp-plugin
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.