Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add bendaamerahmed/backstage-idp-plugin --skill pull-request-readygit clone --depth 1 https://github.com/bendaamerahmed/backstage-idp-pluginWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/bendaamerahmed/backstage-idp-plugin/pull-request-ready)<a href="https://agentmods.dev/skills/bendaamerahmed/backstage-idp-plugin/pull-request-ready"><img src="https://agentmods.dev/badge/skills/bendaamerahmed/backstage-idp-plugin/pull-request-ready/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/bendaamerahmed/backstage-idp-plugin/pull-request-ready"><img src="https://agentmods.dev/badge/skills/bendaamerahmed/backstage-idp-plugin/pull-request-ready.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00041 | $0.03363 |
| Opus 5 | $0.00020 | $0.01682 |
| Sonnet 5 | $0.00008 | $0.00673 |
| Haiku 4.5 | $0.00004 | $0.00336 |
Grade A, and why
pull-request-ready scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 8d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 93 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Pull request ready
Turn a finished Backstage change into something a reviewer can approve: a diff that contains only the change, evidence the validation actually ran, and a PR body that answers the questions a reviewer would otherwise ask.
Preconditions
- The change is functionally complete. This skill does not write features.
- A base branch exists and is fetched.
git fetch originfirst — everything below compares againstorigin/<base>, and Backstage's--sincetooling silently checks nothing when the ref is missing. - Repository generation known (NFS vs legacy frontend, new vs legacy backend) so you can judge whether an import or wiring change is in-house style or an accidental regression.
- Repository contribution surface detected, not assumed — see step 2. A
create-appapp repo has none of the publishing machinery thatbackstage/backstageandbackstage/community-pluginshave. - You will not push, open, or merge anything. Those require explicit authorization; this skill ends by handing back commands.
Procedure
- Fix the base and read the real diff.
BASE=$(git merge-base origin/<base> HEAD); reviewgit diff $BASE..HEADin full, plusgit status --porcelainfor anything uncommitted or untracked. Never self-review withgit diff HEAD~1— it hides everything earlier on the branch. - Detect what this repo requires. Presence of
.changeset/config.json; anyapi-report*.mdat package roots or abuild:api-reportsscript; rootpackage.jsonscripts;CONTRIBUTING.md;.github/pull_request_template.md(orPULL_REQUEST_TEMPLATE.md);CODEOWNERS. A defaultcreate-apprepo has exactlystart,build:backend,build:all,build-image,tsc,tsc:full,clean,test,test:all,test:e2e,fix,lint(repo lint --since origin/<default>),lint:all,prettier:check,new— no changesets, no API reports. Do not manufacture requirements the repo does not have. - Classify every hunk as intended, incidental, or generated. Anything you cannot justify in one sentence to a reviewer gets reverted, not explained.
- Sweep for the Backstage-specific accidental churn, in diff order:
yarn.lock— legitimate only if dependencies changed. A large unexplained diff means a different Yarn major; comparepackageManagerin rootpackage.jsonand.yarnrc.yml, then regenerate with the repo's version.backstage.json— only ever changes viayarn backstage-cli versions:bump. Its presence in a feature PR means an upgrade got mixed in; split it out (backstage-upgrade).package.jsonmetadata rewritten byyarn fix(backstage-cli repo fix):typesVersions,sideEffects,exports, and under--publishalsorepository,backstage.pluginId,backstage.pluginPackages. Keep it for packages you touched;git checkoutit for every package you did not.- Local-linking residue:
resolutionsentries,link:/portal:/file:dependencies left behind afterbackstage-cli package start --link. - Stray
@backstage/*version bumps across unrelated packages. app-config.yamlexamplecatalog.locationsandexamples/*.yamlentities edited during local experimentation.- Build output that must never be staged:
dist/,dist-types/,*.tsbuildinfo,coverage/,.yarn/,node_modules/.
- Sweep for credentials across the whole branch, not just the tip. Grep
git diff $BASE..HEADfor high-entropy strings,ghp_/github_pat_,-----BEGIN,client_secret,token:,password:,apiKey. Confirmapp-config.local.yamland any*.local.yamlare absent from the diff and covered by.gitignore— that file is the intended home for local secrets. Every credential in committed config must be${ENV_VAR}or a$env/$file/$includereference, never a literal. If a secret ever appeared in a commit on this branch, a later deletion does not remove it from history: stop, return a BLOCKED report naming the credential to rotate, and do not rewrite history silently. - Match new config keys to schema entries. Every key read through
config.get*needs a declaration in the owning package'sconfig.d.ts(a single exportedConfiginterface), referenced by"configSchema"inpackage.jsonand listed infiles. Set visibility deliberately: default is@visibility backend;@visibility frontendfor anything the app reads;@visibility secretfor credentials;@deepVisibilityto apply recursively through a nested credential object. Then confirm the key is documented —app-config.yamlexample (placeholder value only), plugin README, and any TechDocs page that lists configuration. - Write the changeset if the repo has
.changeset/.yarn changesetfrom the repo root; inbackstage/community-pluginsrun it from the workspace root (workspaces/<name>). One entry per published package in the diff. Bump rules: for0.xpackages,minorfor breaking andpatchotherwise; for>=1.0.0,majorfor breaking,minorfor backwards-compatible API additions,patchotherwise. No changeset is needed for"private": truepackages, test-only changes, or comments. Write it for an adopter: describe behaviour, not internals or symbol names, prefix breaking changes with BREAKING, and include the migration diff the adopter must apply. - Regenerate API reports if the repo uses api-extractor. Any change to a package's public exports invalidates its
api-report*.md.yarn build:api-reports, or scoped:yarn build:api-reports plugins/<package>. Commit the regenerated files. If the run also rewrites reports for packages you did not touch, those were already stale — leave them out of your PR rather than absorbing them. - Check the package boundaries the diff crosses.
-commonpackages are isomorphic (nonode:, no React, no backend service imports),-nodeis backend-shared,-reactis frontend-shared, and the plugin packages consume them. A new import that pulls backend code into a frontend package or Node built-ins into-commonwill break consumers' bundles even whentscpasses. Runyarn backstage-cli repo fix --checkto confirm no package metadata fixes are pending and that any new package got itsbackstage.roleand plugin-id fields. - Validate changed portal artifacts rather than eyeballing them. A changed
catalog-info.yamlgoes throughPOST /api/catalog/validate-entity(backstage-catalog), not through reading. A changedmkdocs.ymlordocs/tree needs a local TechDocs build. A newcatalog.rulesor provider config entry needs the backend started once. - Actually run the validation sweep and capture the output.
yarn tsc,yarn lint --since origin/<base>,yarn test --since origin/<base>,yarn prettier:check,yarn backstage-cli config:check --strict(add--deprecated), andyarn build:allif build or packaging config changed. Seebackstage-quality-gatefor the full gate. Record the real command lines and their real result lines. A command you did not run is reported as not run. - Confirm commit hygiene. If the repository requires DCO (
backstage/backstageandcommunity-pluginsdo), every commit needs aSigned-off-bytrailer:git commit -s, or retroactively on your own unpushed branchgit rebase --signoff $(git merge-base -a origin/<base> HEAD). - Write the title. No conventional-commit prefix is enforced in
backstage/backstage; readgit log --oneline -30 origin/<base>and match what the repo actually does. The prevailing upstream shape is<plugin-or-package-id>: <imperative summary>. Name the surface, not the file. - Write the body to a file (e.g.
/tmp/pr-body.md) with these sections, filling the repo's PR template checklist in place rather than replacing it:- What and why — the user-visible problem and the change, in adopter terms.
- Design decision — the one choice a reviewer would otherwise question, and the alternative you rejected (provider vs processor, new module vs extending an existing one, config key vs extension point).
- Validation — the exact commands from step 11 with their results. Include what was not covered.
- Risk and rollback — whether a revert is sufficient, or whether config, an env var, a DB migration, or a redeploy must be undone too, and in what order.
- Screenshots / UI notes — required by the upstream template for UI changes. You cannot produce screenshots; say so explicitly and name the exact route, entity, and state a human must capture.
- Reviewer must check manually — everything CI cannot reach: real IdP login, SCM webhooks, a live Kubernetes cluster, permission decisions against a real policy, TechDocs publishing to a real bucket.
- Stop. Report the branch, base, title, body path, and the exact commands — then return for authorization without running them:
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 8d ago First seen · 93 lines · 41 tokens per session scan A f02efdb5d413
pull-request-ready is a skill published in the GitHub repository bendaamerahmed/backstage-idp-plugin (1 stars, last pushed 28d ago), licensed MIT. It adds 41 tokens to every session and 3,363 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
pr-review
Address feedback left on a GitHub pull request: fetch unresolved review threads, make agreed Elixir/Phoenix code fixes, reply, and resolve. Use for a PR URL/number or reviewer comments. NOT for pre-PR review, findings triage, or CI monitoring.
phx-pr-review
Address feedback left on a GitHub pull request: fetch unresolved review threads, make agreed Elixir/Phoenix code fixes, reply, and resolve. Use for a PR URL/number or reviewer comments. NOT for pre-PR review, findings triage, or CI monitoring.
pr-threads-address
Address PR review feedback by systematically working through every unresolved PR review thread on the current branch's PR - analyze each comment, make the requested code changes (with tests where useful), commit, and optionally reply and resolve.
han-release
Cut a Han release: update CHANGELOG.md with the changes since the last release, bump and tag every plugin that changed as {plugin-name}--v{version} so a version-constrained dependency can resolve, and publish a GitHub release crediting every merged pull request and closed issue to the people behind it. Use when…
han-update-documentation
Update Han plugin documentation so every skill, agent, guidance doc, index, and cross-reference is current and accurate. On a non-default branch, scopes the pass to entities the branch actually touched. On the default branch, performs a full documentation sweep across the whole plugin. Use when updating, refreshing…
timeline
Group the current branch's commit history into semantic phases along a timeline, and generate two review documents: architecture evolution + code review.