bruno

$npx mdskill add TerminalSkills/skills/bruno

Test and debug APIs using Git-friendly, open-source API client

  • Solve API testing and debugging tasks with human-readable files
  • Uses Bruno's open Bru format and Git for version control
  • Organizes requests, environments, and test scripts in plain text
  • Delivers structured API workflows directly in your development environment
SKILL.md
.github/skills/brunoView on GitHub ↗
---
name: bruno
description: >-
  Test and debug APIs with Bruno, the open-source API client. Use when a user asks to create API requests, organize collections, write test scripts, use environments and variables, or collaborate on API workflows stored in Git.
license: Apache-2.0
compatibility: "No special requirements"
metadata:
  author: terminal-skills
  version: "1.0.0"
  category: development
  tags: ["api-client", "http", "testing", "git-friendly", "open-source"]
---
# 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

```bru
# 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

```bru
# environments/dev.bru
vars {
  baseUrl: http://localhost:3000
  testEmail: test@example.com
  testPassword: testpass123
}

vars:secret [
  stripeKey,
  dbPassword
]
```

### Scripting

```javascript
// 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

```bash
# 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

```bash
# 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:
1. Check system requirements and prerequisites
2. Install or configure bruno
3. Set up initial project structure
4. Verify the setup works correctly

**Example 2: User asks to build a feature with bruno**

User: "Create a dashboard using bruno"

The agent should:
1. Scaffold the component or configuration
2. Connect to the appropriate data source
3. Implement the requested feature
4. Test and validate the output

## Guidelines

1. **Git-first workflow** — Store Bruno collections in your repo next to application code; review API changes in PRs
2. **Environment files for config** — Use environments for base URLs and credentials; secrets marked as `vars:secret` are never committed
3. **Test assertions** — Write tests in every request; run them in CI to catch API regressions
4. **Script chaining** — Use `bru.setVar()` in post-response scripts to pass data between requests (token → subsequent calls)
5. **Folder organization** — Mirror your API structure (auth/, users/, orders/); each folder can have its own pre-request scripts
6. **CI/CD integration** — Run `bru run --env staging` after deployment to verify API contract; fail the pipeline on test failures
7. **No cloud dependency** — Unlike Postman, your collections never leave your machine or repo; no sync, no cloud, no account required
8. **Documentation as requests** — Bruno collections serve as living API documentation; new team members run requests to understand the API
More from TerminalSkills/skills