{"ref":"artifact:saptools-bruno","page":"/artifacts/saptools-bruno","json":"/artifacts/saptools-bruno.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"saptools-bruno","name":"@saptools/bruno","artifact_type":"cli","ecosystem":"btp","domain":"developer-experience","origin_ring":"independent","description":{"one_line":"A command line that runs [Bruno](https://www.usebruno.com) collections against XSUAA-protected apps on [Cloud Foundry](artifact:btp-cloud-foundry-runtime), fetching the app's token and writing it into the selected environment file before each run.","short":"Runner for Bruno collections against XSUAA-protected CF apps","what_it_solves":"Bruno does not mint OAuth2 tokens, so running a collection with `bru run` against a service behind [XSUAA](artifact:btp-authorization-and-trust-management) means pasting a fresh token into its environment file each time the last one expires. `bruno run` gets the token through [@saptools/cf-xsuaa](artifact:saptools-cf-xsuaa), writes it as `accessToken` into the chosen `.bru` environment file and passes it to `bru` with `--env-var`, using the `bru` on the PATH or else the bundled `@usebruno/cli`. `bruno setup-app` scaffolds a `region__<key>/org__<org>/space__<space>/<app>` folder from the landscape cached by [@saptools/cf-sync](artifact:saptools-cf-sync), with `__cf_*` variables in each environment file that tell the runner which app's token to fetch, and `bruno use` pins a default target. The requests and assertions stay ordinary Bruno files; what it adds is the token and the folder layout."},"links":{"npm":"https://www.npmjs.com/package/@saptools/bruno","repo":"https://github.com/dongitran/saptools","docs":"https://github.com/dongitran/saptools/blob/main/packages/bruno/README.md"},"identity":{"author":"dongitran","license":"MIT"},"compat":{"deployment":["cf"]},"type_properties":{"distribution":{"value":["npm"],"sources":[{"url":"https://github.com/dongitran/saptools","title":"@saptools/bruno — README","checked":"2026-10-18","quote":"npm install -g @saptools/cf-sync @saptools/bruno"}]}},"provides":["capability:testing"],"requires":[{"ref":"artifact:saptools-cf-xsuaa","for":"Fetching or reusing the cached XSUAA token of the target app before every run.","requirement":"required","sources":[{"url":"https://github.com/dongitran/saptools/blob/main/packages/bruno/README.md","title":"dongitran/saptools — packages/bruno/README.md","checked":"2026-10-15","quote":"every `run` fetches (or reuses) a cached token via [`@saptools/cf-xsuaa`](https://www.npmjs.com/package/@saptools/cf-xsuaa)"}]},{"ref":"artifact:saptools-cf-sync","for":"The cached Cloud Foundry landscape that setup-app reads to offer regions, orgs, spaces and apps; it has to be synced first.","requirement":"required","sources":[{"url":"https://github.com/dongitran/saptools/blob/main/packages/bruno/README.md","title":"dongitran/saptools — packages/bruno/README.md","checked":"2026-10-15","quote":"Requires **Node.js ≥ 20** and a cached CF landscape from [`@saptools/cf-sync`](https://www.npmjs.com/package/@saptools/cf-sync)."},{"url":"https://github.com/dongitran/saptools/blob/main/packages/bruno/README.md","title":"dongitran/saptools — packages/bruno/README.md","checked":"2026-10-15","quote":"`setup-app` reads the cached CF landscape prepared by `cf-sync`."}]},{"ref":"external:nodejs","for":"It is a Node command line and library, and the README names the Node version it needs.","requirement":"required","sources":[{"url":"https://github.com/dongitran/saptools/blob/main/packages/bruno/README.md","title":"dongitran/saptools — packages/bruno/README.md","checked":"2026-10-15","quote":"Requires **Node.js ≥ 20** and a cached CF landscape from [`@saptools/cf-sync`](https://www.npmjs.com/package/@saptools/cf-sync)."}]}],"provenance":{"discovered_via":[{"source":"source:curator"}],"first_seen":"2026-10-15"},"maintainers":["actor:dong-tran"],"contributors":["actor:dong-tran"],"drafted_with_ai":true},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"good","evidence":"2 months since release"},{"label":"Continuity","tier":"fair","evidence":"2 contributors, 1 publisher"},{"label":"Repository","tier":"good","evidence":"pushed 2026-09, not archived"}],"compatibility":[{"label":"Declared for","tier":"unknown","evidence":"no BTP release lines in the atlas"},{"label":"Survived majors","tier":"unknown","evidence":"no BTP release lines in the atlas"},{"label":"Maintainer's CI","tier":"good","evidence":"CodeQL Security Scan green, 2026-09-18"}],"practice":[{"label":"Tests","tier":"good","evidence":"679 test files"},{"label":"Docs","tier":"good","evidence":"docs site, README 18 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":8,"unit":"installs/week"},{"value":3,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-26","latest_version":"0.4.1","majors":{"0.1":{"version":"0.1.0","date":"2026-04-19"},"0.2":{"version":"0.2.0","date":"2026-04-19"},"0.3":{"version":"0.3.0","date":"2026-04-21"},"0.4":{"version":"0.4.0","date":"2026-09-02"}},"license":"MIT","first_release":"2026-04-19","last_release":"2026-09-02","releases":24,"cadence_days":3,"maintainers":1,"repository":"git+https://github.com/dongitran/saptools.git","repository_directory":"packages/bruno","peer_cds":null,"dependencies":5,"node_engine":">=20.0.0","test_script":false,"types":true,"downloads_weekly":8,"downloads_monthly":66,"stars":3,"forks":0,"open_issues":1,"archived":false,"pushed_at":"2026-09-18","license_spdx":null,"org_owned":false,"default_branch":"main","created_at":"2026-04-03T14:04:40Z","open_prs":1,"tree_truncated":false,"test_files":679,"workflows":33,"other_ci":false,"readme_bytes":18405,"docs_files":0,"changelog":false,"license_file":false,"dts_files":2,"first_commit":"2026-04-18","last_commit":"2026-09-02","commits":32,"contributors":2,"ci_status":"success","ci_run_at":"2026-09-18","ci_workflow":"CodeQL Security Scan","ci_event":"push","readme_path":"packages/bruno/README.md","readme_sha":"79f4c19e250199c2be944891f718441511e1bef3","months_since_release":2,"dormant":false,"repo_read":"2026-10-26"},"release_notes":{"license":"MIT","quotable":true,"versions":[{"version":"0.4.1","date":"2026-09-02"},{"version":"0.4.0","date":"2026-09-02"},{"version":"0.3.6","date":"2026-06-30"},{"version":"0.3.5","date":"2026-06-29"},{"version":"0.3.4","date":"2026-05-19"},{"version":"0.3.3","date":"2026-05-02"},{"version":"0.3.2","date":"2026-05-02"},{"version":"0.3.1","date":"2026-04-29"},{"version":"0.3.0","date":"2026-04-21"},{"version":"0.2.13","date":"2026-04-21"},{"version":"0.2.12","date":"2026-04-19"},{"version":"0.2.11","date":"2026-04-19"},{"version":"0.2.10","date":"2026-04-19"},{"version":"0.2.9","date":"2026-04-19"},{"version":"0.2.8","date":"2026-04-19"},{"version":"0.2.7","date":"2026-04-19"},{"version":"0.2.6","date":"2026-04-19"},{"version":"0.2.5","date":"2026-04-19"},{"version":"0.2.4","date":"2026-04-19"},{"version":"0.2.3","date":"2026-04-19"},{"version":"0.2.2","date":"2026-04-19"},{"version":"0.2.1","date":"2026-04-19"},{"version":"0.2.0","date":"2026-04-19"},{"version":"0.1.0","date":"2026-04-19"}],"crawled_at":"2026-10-25"},"edges":{"maintainers":[{"ref":"actor:dong-tran","name":"Đông Trần","json":"/actors/dong-tran.json"}],"contributors":[{"ref":"actor:dong-tran","name":"Đông Trần","json":"/actors/dong-tran.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}