More screenshots

    Works with the AI Agents you already use

    Claude CodeClaude CodeCursorCursorCodex CLICodex CLIMuseMuseDotsDots+22 more

    API Collection Runner: Bruno Run, Diff and Fix Loop

    1

    Runs your Bruno API collection, checks every response against its asserts and the last good run, and drives a fix loop until the collection passes.

    $14.29

    Secure checkout via Stripe

    Money-back guarantee

    Converts to your local currency at checkout

    Security scanned
    API Collection Runner: Bruno Run, Diff and Fix Loop

    API Collection Runner: Bruno Run, Diff and Fix Loop

    Example session with this skill installed

    Run the Bruno collection in shop-api/collection against my local server and fix whatever fails.

    • Read your context and instructions
    • Compiled the api collection runner

    Real output from a demo shop API with a planted tax bug, run with bru 3.3.0.

    Summary

    One request failed. cart/Cart total charged tax on the full subtotal instead of the subtotal after the coupon. I fixed pricing.py and restarted the server. The whole collection now passes, 7 of 7 requests and 17 of 17 checks.

    First run

    Shop API  env local  engine bru 3.3.0 (--engine bru)  run 20261016-132604
    
      #  RESULT  REQUEST                STATUS  CHECKS  DIFF
      1  PASS    health/Health          200     2/2     same
      2  PASS    auth/Login             200     2/2     same
      3  PASS    catalog/List products  200     3/3     same
      4  PASS    cart/Create cart       201     2/2     same
      5  PASS    cart/Add item          201     2/2     same
      6  FAIL    cart/Cart total        200     3/5     2 changes
      7  PASS    cart/Delete cart       204     1/1     same
    
    FAIL  cart/Cart total
      assert  res.body.taxCents: eq {{expected_tax}}  expected 330 to equal 297
      assert  res.body.totalCents: eq {{expected_total}}  expected 3928 to equal 3895
      diff vs baseline (approved in run 20261016-132601) (masked: server, date, x-request-id)
        $.taxCents    297 -> 330
        $.totalCents  3895 -> 3928
      request  GET http://127.0.0.1:7878/carts/d571dc97-98a4-4fd4-a65e-3f26b04c04f6/total?coupon=SAVE10
    
    6 passed, 1 failed  (checks 15/17)
    exit 1 (FAILED)
    

    Cause

    The cart holds two Field caps, a 3998 cent subtotal. SAVE10 takes 400 off. Tax at 8.25% belongs on the 3598 that is left, which is 297. The server taxed the full 3998 and got 330, so the total came out 33 cents high. quote() in pricing.py computed tax from subtotal instead of subtotal - discount.

    Fix

         discount = cents(subtotal * rate)
    -    tax = cents(subtotal * TAX_RATE)
    +    taxable = subtotal - discount
    +    tax = cents(taxable * TAX_RATE)
         return {
             "subtotalCents": subtotal,
             "discountCents": discount,
             "taxCents": tax,
    -        "totalCents": subtotal - discount + tax,
    +        "totalCents": taxable + tax,
    

    Proof

    I stopped the process on port 7878, started the server again and waited for /health. Then I reran only the failure. The tool added the login and cart setup it depends on.

    rerun: 1 failing key(s) from run 20261016-132604, plus setup
    
      #  RESULT  REQUEST          STATUS  CHECKS  DIFF
      1  PASS    cart/Cart total  200     5/5     same
    setup: 3 steps PASS (auth/Login provides {{token}}; cart/Create cart, cart/Add item run earlier in cart/)
    
    4 passed  (checks 11/11)
    exit 0 (OK)
    

    Then the whole collection.

    
      #  RESULT  REQUEST                STATUS  CHECKS  DIFF
      1  PASS    health/Health          200     2/2     same
      2  PASS    auth/Login             200     2/2     same
      3  PASS    catalog/List products  200     3/3     same
      4  PASS    cart/Create cart       201     2/2     same
      5  PASS    cart/Add item          201     2/2     same
      6  PASS    cart/Cart total        200     5/5     same
      7  PASS    cart/Delete cart       204     1/1     same
    
    7 passed  (checks 17/17)
    exit 0 (OK)
    

    Next steps

    • Review the change to pricing.py and commit it.
    • No baseline changed. Every response matches the approved one again, so .acr/baselines/ has nothing to commit.
    • I did not touch the staging env. It would send POST and DELETE to staging.shop.example, so the tool will stop and I will ask you first.

    Connects securely to your tools. The creator never sees your data.

    About this skill

    Ask your coding agent to run the collection and fix whatever broke. The agent sends every request in your Bruno collection and reads a pass and fail table. It traces each failure to the code that caused it, fixes it, and restarts the server. Then it reruns the failures, and finally the whole collection. It stops when everything passes.

    What it does

    • Runs the collection with the Bruno CLI (bru) when it is installed, and with curl when it is not. The curl engine runs a documented subset of Bruno. Anything it could not check shows as SKIP or PARTIAL, never PASS.
    • Checks each response against its assert block and against an approved baseline or the last passing run. Timestamps, uuids and request ids are masked, so the diff shows only real changes.
    • Reruns only what failed, plus the setup requests each failure needs, such as the login that sets the token.
    • Checks rows from a sheet. Export them as CSV or JSON, and each row gets its own line in the table.
    • Catches a stale server. When a request returns exactly the response that failed last time, it asks whether the server really restarted.

    Safety

    • Secrets come only from environment variables. No secret value goes on a command line, into a file, or into the chat.
    • Secrets, Authorization and cookie headers, and captured login tokens are masked in everything the tool prints or saves. That includes their URL-encoded, JSON-escaped and base64 forms.
    • It will not send POST, PUT, PATCH or DELETE to a host other than localhost until you say yes for that host. A config file in the repo cannot grant that permission.

    What's inside

    • SKILL.md, the fix loop the agent follows and how to read the output.
    • scripts/acr.py, a Python 3.9+ tool with no dependencies. run sends and judges the requests, approve pins a baseline, and show prints one exchange or a curl command that reproduces it.
    • references/, the full CLI, the config file, what each engine runs, and troubleshooting. The agent reads these only when it needs them.
    • agents/openai.yaml, which adds the $api-collection-runner command in Codex.
    • LICENSE.txt, the license terms.

    Requirements

    Python 3.9 or newer and curl, which ship with macOS and most Linux systems. The Bruno CLI is optional (npm i -g @usebruno/cli) and tested with bru 3.3.0.

    How to use

    Skills on Agensi run inside your AI agent. Copy the prompt, paste it into your agent, and it connects to Agensi and installs this skill for you. If a payment is needed, your agent shows it to you first.

    Reviews

    No reviews yet

    Be one of the first to try it. Every listed skill passes our trust checks below.

    Security scanned

    Passed our 8-point scan before listing

    Fresh listing

    Recently published to Agensi

    Money-back guarantee

    Doesn't do what its page promises? You get your money back.

    Trust & safety

    Security scanned

    Verified clean 3 days ago

    • Passed all security checks, Safe to install

    Requires

    Python 3.9+
    curl
    Bruno CLI (optional)
    Git

    Listed3 days ago

    What's inside

    Frequently Asked Questions