Skills bruno
install
source · Clone the upstream repo
git clone https://github.com/TerminalSkills/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/TerminalSkills/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/bruno" ~/.claude/skills/terminalskills-skills-bruno && rm -rf "$T"
manifest:
skills/bruno/SKILL.mdsafety · automated scan (medium risk)
This is a pattern-based risk scan, not a security review. Our crawler flagged:
- global npm install
- references API keys
Always read a skill's source content before installing. Patterns alone don't mean the skill is malicious — but they warrant attention.
source content
Bruno — Git-Friendly API Client
Overview
You are an expert in Bruno, the open-source API client that stores collections as plain text files in your Git repository. Unlike Postman (cloud-synced, proprietary format), Bruno uses a human-readable format (Bru) that lives alongside your code — versioned, reviewable, and shareable via Git.
Instructions
Collection Structure
api-collection/ ├── bruno.json # Collection config ├── environments/ │ ├── dev.bru │ ├── staging.bru │ └── production.bru ├── auth/ │ ├── login.bru │ ├── register.bru │ └── refresh-token.bru ├── users/ │ ├── list-users.bru │ ├── get-user.bru │ ├── create-user.bru │ └── update-user.bru └── orders/ ├── list-orders.bru ├── create-order.bru └── process-refund.bru
Bru File Format
# auth/login.bru — Human-readable, Git-diffable meta { name: Login type: http seq: 1 } post { url: {{baseUrl}}/api/auth/login body: json auth: none } headers { Content-Type: application/json } body:json { { "email": "{{testEmail}}", "password": "{{testPassword}}" } } script:post-response { // Save token for subsequent requests if (res.status === 200) { bru.setVar("authToken", res.body.token); bru.setVar("userId", res.body.user.id); } } tests { test("should return 200", () => { expect(res.status).to.equal(200); }); test("should return token", () => { expect(res.body.token).to.be.a("string"); expect(res.body.token.length).to.be.greaterThan(0); }); test("should return user", () => { expect(res.body.user.email).to.equal("{{testEmail}}"); }); }
Environments
# environments/dev.bru vars { baseUrl: http://localhost:3000 testEmail: test@example.com testPassword: testpass123 } vars:secret [ stripeKey, dbPassword ]
Scripting
// Pre-request script — runs before sending const crypto = require("crypto"); const timestamp = Date.now().toString(); const signature = crypto .createHmac("sha256", bru.getVar("apiSecret")) .update(timestamp) .digest("hex"); bru.setVar("timestamp", timestamp); bru.setVar("signature", signature); // Post-response script — process responses if (res.status === 200) { const users = res.body.data; bru.setVar("firstUserId", users[0].id); console.log(`Found ${users.length} users`); } // Chain requests — use variables from previous responses // login.bru sets {{authToken}} // create-order.bru uses {{authToken}} in auth header
CLI for CI/CD
# Install CLI npm install -g @usebruno/cli # Run entire collection bru run --env dev # Run specific folder bru run auth/ --env dev # Run with custom environment variables bru run --env production --env-var apiKey=sk_live_xxx # Output JUnit XML for CI bru run --env dev --output results.xml --format junit
Installation
# Desktop app (GUI) # Download from https://www.usebruno.com/downloads # CLI npm install -g @usebruno/cli
Examples
Example 1: User asks to set up bruno
User: "Help me set up bruno for my project"
The agent should:
- Check system requirements and prerequisites
- Install or configure bruno
- Set up initial project structure
- Verify the setup works correctly
Example 2: User asks to build a feature with bruno
User: "Create a dashboard using bruno"
The agent should:
- Scaffold the component or configuration
- Connect to the appropriate data source
- Implement the requested feature
- Test and validate the output
Guidelines
- Git-first workflow — Store Bruno collections in your repo next to application code; review API changes in PRs
- Environment files for config — Use environments for base URLs and credentials; secrets marked as
are never committedvars:secret - Test assertions — Write tests in every request; run them in CI to catch API regressions
- Script chaining — Use
in post-response scripts to pass data between requests (token → subsequent calls)bru.setVar() - Folder organization — Mirror your API structure (auth/, users/, orders/); each folder can have its own pre-request scripts
- CI/CD integration — Run
after deployment to verify API contract; fail the pipeline on test failuresbru run --env staging - No cloud dependency — Unlike Postman, your collections never leave your machine or repo; no sync, no cloud, no account required
- Documentation as requests — Bruno collections serve as living API documentation; new team members run requests to understand the API