Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/next-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ jobs:
git tag -f "$VERSION"
git push origin "$VERSION"

- name: Sync docs for embed
run: make sync-docs

- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v6
with:
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ jobs:
exit 1
fi

- name: Sync docs for embed
run: make sync-docs

- uses: goreleaser/goreleaser-action@v6
with:
version: "~> v2"
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/web-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ jobs:

- name: Build web
run: pnpm build:web
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Run unit tests
run: pnpm test
Expand Down
167 changes: 167 additions & 0 deletions docs/topics/skill.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
# yapi — LLM Skill Guide

yapi is a CLI-first, git-friendly API client. You define requests in YAML files and run them from the terminal. No GUI, no accounts, no state — just files and a binary.

## When to Use yapi

- Send HTTP, gRPC, GraphQL, or TCP requests
- Chain multiple requests together (auth flow, then use the token)
- Assert on responses (status codes, body content via JQ)
- Run API test suites with `yapi test`
- Poll endpoints until a condition is met

## Core Concepts

**Every request file starts with `yapi: v1`.** This is required.

**File extension:** `.yapi.yml` (or `.yapi.yaml`). Test files use `.test.yapi.yml`.

**Project config:** `yapi.config.yml` at the project root defines environments and base URLs. yapi walks up the directory tree to find it.

**Variables:** Use `${VAR}` syntax. Resolved from: chain step outputs > environment vars > shell env > defaults. Default values: `${VAR:-fallback}`.

## Quick Reference

### Run a request file

```bash
yapi run request.yapi.yml
yapi run request.yapi.yml -e prod # with environment
```

### Quick one-off request (no file needed)

```bash
yapi send https://api.example.com/users # GET
yapi send https://api.example.com/users '{"name":"Alice"}' # POST (auto-detected)
yapi send -X PUT https://api.example.com/users/1 '{"name":"Bob"}' -H 'Authorization: Bearer tok'
yapi send https://api.example.com/users --jq '.[0].name'
```

### Minimal request file

```yaml
yapi: v1
url: https://api.example.com/users
method: GET
```

### POST with body

```yaml
yapi: v1
url: https://api.example.com/users
method: POST
body:
name: Alice
role: admin
```

### Chain requests (pass data between steps)

```yaml
yapi: v1
chain:
- name: login
url: https://api.example.com/auth
method: POST
body:
username: ${USERNAME}
password: ${PASSWORD}
expect:
status: 200

- name: get_profile
url: https://api.example.com/me
method: GET
headers:
Authorization: Bearer ${login.token}
expect:
status: 200
assert:
- .email != null
```

### Assert on responses

```yaml
expect:
status: 200
assert:
- . | length > 0 # JQ expression, must evaluate to true
- .[0].id != null
- .count >= 10
```

### Run tests

```bash
yapi test ./tests # run all *.test.yapi.yml files
yapi test ./tests -e staging # against a specific environment
yapi test ./tests -p 8 # parallel execution
```

### Environments

Define in `yapi.config.yml`:

```yaml
yapi: v1
default_environment: local
environments:
local:
url: http://localhost:3000
vars:
API_KEY: dev_key
prod:
url: https://api.example.com
vars:
API_KEY: ${PROD_API_KEY}
```

Then in request files, use `${url}` and `${API_KEY}` — they resolve from the active environment.

## Documentation Map

The docs are split into **topics** (concepts/features) and **commands** (CLI reference). Read only what you need.

### Topics (`docs/topics/`)

| File | Read this when you need to... |
|------|-------------------------------|
| `config.md` | Know all available YAML fields (full schema reference) |
| `chain.md` | Chain multiple requests, pass data between steps |
| `assert.md` | Write assertions on status, body, or headers |
| `variables.md` | Understand `${VAR}` interpolation and resolution order |
| `environments.md` | Set up dev/staging/prod environments |
| `jq.md` | Filter or transform response bodies with JQ |
| `testing.md` | Use the built-in test runner (`yapi test`) |
| `polling.md` | Poll an endpoint until a condition is met (`wait_for`) |
| `send.md` | Use `yapi send` for quick curl-like requests |
| `protocols.md` | Use gRPC, GraphQL, or TCP (not just HTTP) |

### Commands (`docs/commands/`)

Each file documents one CLI command: `yapi_run.md`, `yapi_send.md`, `yapi_test.md`, `yapi_stress.md`, `yapi_watch.md`, etc. Refer to these for flag details and usage examples.

## Common Patterns

**Auth flow then use token:**
Chain with `${login.token}` in the Authorization header of subsequent steps.

**Validate an API contract:**
Use `expect.assert` with JQ expressions. Chain variable assertions let you compare across steps: `.id == ${create.id}`.

**Wait for async job:**
Use `wait_for.until` with a `period` or `backoff` and `timeout`.

**Filter noisy responses:**
Use `jq_filter` in the YAML or `--jq` on the CLI.

## Gotchas

- `yapi: v1` at the top of every file — missing it is the most common error
- Variables are `${VAR}`, not `$VAR`
- Assertions are JQ expressions that must evaluate to `true`
- Chains stop on first failure (fail-fast)
- Protocol is auto-detected from URL scheme: `grpc://`, `tcp://`, or HTTP by default
Loading