Skip to content

Commit a45d70b

Browse files
committed
feat: add installation logic to skill.md
1 parent 16336a0 commit a45d70b

File tree

1 file changed

+166
-66
lines changed

1 file changed

+166
-66
lines changed

skills/steel-browser/SKILL.md

Lines changed: 166 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,93 @@ description: >-
1515
themselves, or conceptual questions about browser tools.
1616
---
1717

18-
# Steel Browser Skill
18+
# Steel
1919

20-
Steel gives agents cloud browser sessions and fast API tools (`scrape`, `screenshot`, `pdf`).
20+
> Cloud browser infrastructure for AI agents. Steel gives your agent a real browser that can navigate pages, fill forms, solve CAPTCHAs, and extract content.
2121
22-
## Choose the right tool first
22+
If Steel is not installed yet, execute the setup steps below autonomously. Only ask the user to do one thing: click the authentication link.
2323

24-
| Goal | Tool |
24+
OBJECTIVE: Install the Steel CLI, authenticate, and verify everything works.
25+
26+
DONE WHEN: `steel scrape https://example.com` returns page content successfully.
27+
28+
## Setup
29+
30+
### Step 1: Install Steel CLI
31+
32+
Check if `steel` is already available:
33+
34+
```bash
35+
steel --version
36+
```
37+
38+
If the command is not found, install it:
39+
40+
```bash
41+
curl -sSf https://setup.steel.dev/install.sh | sh
42+
export PATH="$HOME/.steel/bin:$PATH"
43+
```
44+
45+
### Step 2: Authenticate
46+
47+
If `STEEL_API_KEY` is already set in the environment, skip this step.
48+
49+
Otherwise, run:
50+
51+
```bash
52+
steel login
53+
```
54+
55+
This will print a URL. **Ask the user to click the link to complete authentication.** Wait for the command to finish — it will print "Authentication successful" when the user has approved.
56+
57+
### Step 3: Verify
58+
59+
```bash
60+
steel scrape https://example.com
61+
```
62+
63+
This should return Markdown content. If it does, setup is complete.
64+
65+
---
66+
67+
## Choose the right tool
68+
69+
| Task | Tool |
2570
|------|------|
26-
| Extract text/HTML from a mostly-static page | `steel scrape <url>` |
27-
| One-shot screenshot or PDF | `steel screenshot <url>` / `steel pdf <url>` |
28-
| Multi-step interaction, login, forms, JS-heavy pages | `steel browser start` + interaction loop |
29-
| Anti-bot / CAPTCHA sites | `steel browser start --stealth` |
71+
| Extract text/HTML from a page | `steel scrape <url>` |
72+
| Take a screenshot | `steel screenshot <url>` |
73+
| Generate a PDF | `steel pdf <url>` |
74+
| Multi-step interaction, login, forms, JS-heavy pages | `steel browser` session |
75+
| Anti-bot / CAPTCHA sites | `steel browser --stealth` session |
76+
77+
**Start with `steel scrape` when you only need page content.** Escalate to `steel browser` when the page requires interaction or JavaScript rendering.
3078

31-
Start with `steel scrape` when you only need page content. Escalate to `steel browser` when the page requires interaction or JavaScript rendering.
79+
## API tools (one-shot, no session needed)
3280

33-
## Core workflow
81+
```bash
82+
# Scrape — returns Markdown by default, use --raw for full JSON
83+
steel scrape https://example.com
84+
steel scrape https://example.com --format html
85+
steel scrape https://example.com --stealth --proxy
3486

35-
1. **Start** a named session (use `--session-timeout 3600000` for tasks over 5 min)
87+
# Screenshot
88+
steel screenshot https://example.com
89+
steel screenshot https://example.com --full-page
90+
91+
# PDF
92+
steel pdf https://example.com
93+
```
94+
95+
## Interactive browser session
96+
97+
### Core workflow
98+
99+
1. **Start** a named session
36100
2. **Navigate** to the target URL
37-
3. **Snapshot** to get current page state and element refs
38-
4. **Interact** using refs from the snapshot (click, fill, select, etc.)
39-
5. **Re-snapshot** after every navigation or meaningful DOM change
40-
6. **Verify** state with `wait`, `get`, or another snapshot
41-
7. **Stop** the session when done
101+
3. **Snapshot** to get page state and element refs
102+
4. **Interact** using `@eN` refs from the snapshot
103+
5. **Re-snapshot** after every navigation or DOM change (refs expire)
104+
6. **Stop** the session when done
42105

43106
```bash
44107
steel browser start --session my-task --session-timeout 3600000
@@ -51,13 +114,10 @@ steel browser snapshot -i --session my-task
51114
steel browser stop --session my-task
52115
```
53116

54-
**RULE: Never use an `@eN` ref without a fresh snapshot. Refs expire after navigation or DOM changes.**
55-
56-
Element refs from `snapshot -i` are more reliable than CSS selectors — always prefer them. Use `snapshot -i -c` for large DOMs, or `-d 3` to limit depth.
57-
58-
Always use the same `--session <name>` on every command in a workflow. The `--session` flag takes the name string you chose, not the UUID from JSON output.
59-
60-
## Essential commands
117+
**Rules:**
118+
- Always use the same `--session <name>` on every command.
119+
- Never use an `@eN` ref without a fresh snapshot — refs expire after navigation or DOM changes.
120+
- Prefer element refs from `snapshot -i` over CSS selectors. Use `-c` for large DOMs, `-d 3` to limit depth.
61121

62122
### Session lifecycle
63123

@@ -97,7 +157,6 @@ steel browser type @e2 "value" --delay 50 --session <name>
97157
steel browser press Enter --session <name>
98158
steel browser press Control+a --session <name>
99159
steel browser hover @e1 --session <name>
100-
steel browser click @e1 --session <name> # prefer click for checkboxes
101160
steel browser select @e1 "option" --session <name>
102161
steel browser scroll down 500 --session <name>
103162
steel browser scrollintoview @e1 --session <name>
@@ -130,29 +189,29 @@ steel browser eval "document.querySelectorAll('a').length" --session <name>
130189
steel browser find ".item" --session <name>
131190
```
132191
133-
### Screenshots and capture
192+
### Screenshots (in-session)
134193
135194
```bash
136195
steel browser screenshot -o ./page.png --session <name>
137196
steel browser screenshot --full --session <name>
138197
steel browser screenshot --selector "#chart" --session <name>
139198
```
140199
141-
Top-level `steel screenshot <url>` and `steel pdf <url>` are stateless one-shot API calls — they do not take `--session`, `--stealth`, or `-o` flags. Use `steel browser screenshot` for in-session captures.
200+
Top-level `steel screenshot <url>` and `steel pdf <url>` are stateless one-shot API calls — they do not take `--session` or `-o` flags. Use `steel browser screenshot` for in-session captures.
142201
143202
### Cookies and storage
144203
145204
```bash
146-
steel browser cookies --session <name> # list all cookies
147-
steel browser cookies set <name> <value> --session <name> # set a cookie
148-
steel browser cookies set <name> <value> --domain .example.com # with domain
149-
steel browser cookies clear --session <name> # clear all cookies
150-
151-
steel browser storage local --session <name> # get all localStorage
152-
steel browser storage local <key> --session <name> # get one key
153-
steel browser storage local set <key> <value> --session <name> # set a value
154-
steel browser storage local clear --session <name> # clear localStorage
155-
steel browser storage session --session <name> # sessionStorage (same API)
205+
steel browser cookies --session <name>
206+
steel browser cookies set <name> <value> --session <name>
207+
steel browser cookies set <name> <value> --domain .example.com
208+
steel browser cookies clear --session <name>
209+
210+
steel browser storage local --session <name>
211+
steel browser storage local <key> --session <name>
212+
steel browser storage local set <key> <value> --session <name>
213+
steel browser storage local clear --session <name>
214+
steel browser storage session --session <name>
156215
```
157216
158217
### Browser settings
@@ -164,8 +223,6 @@ steel browser set offline on --session <name>
164223
steel browser set useragent "Custom UA" --session <name>
165224
```
166225
167-
Note: `steel browser set headers` panics in steel 0.3.2 (clap bug). Use `eval` for header injection.
168-
169226
### CAPTCHA
170227
171228
```bash
@@ -174,52 +231,95 @@ steel browser captcha status --wait --session <name>
174231
steel browser captcha solve --session <name>
175232
```
176233
177-
## eval for capability gaps
178-
179-
Use `steel browser eval "<js>" --session <name>` when no direct command exists. Common uses: network interception (fetch monkey-patch), cookie manipulation beyond the `cookies` command, DOM state injection, complex form widgets (React date pickers, autocomplete inputs).
234+
### eval for capability gaps
180235
181-
For detailed eval patterns (drag fallback, network interception, file upload injection), see [references/steel-browser-commands.md](references/steel-browser-commands.md).
236+
Use `steel browser eval "<js>" --session <name>` when no direct command exists. Common uses: network interception, DOM state injection, complex form widgets.
182237
183238
## Commands that do NOT exist
184239
185-
Do not attempt these. They will fail and waste turns.
240+
Do not attempt these — they will fail.
186241
187242
| Does NOT exist | Use instead |
188243
|---|---|
189-
| `steel browser record` / `video` | No recording; use `steel browser live` for viewer URL |
190-
| `steel browser triple-click` | `press Control+a` or `eval` with `.select()` |
244+
| `steel browser record` / `video` | `steel browser live` for viewer URL |
191245
| `steel browser network` / `route` | `eval` with fetch monkey-patch |
192246
| `steel browser console` / `errors` | `eval` with console interceptor |
193247
| `steel browser frame` | `eval` with iframe contentDocument |
194-
| `steel browser tabs` (plural) | `steel browser tab list` (singular `tab`) |
248+
| `steel browser tabs` (plural) | `steel browser tab list` (singular) |
195249
| `steel browser execute` / `run` | `steel browser eval` |
196-
| `steel browser is-visible` | `steel browser is` |
197-
| `steel browser set device` | `set viewport` + `set useragent` separately |
198250
| `steel browser resize` | `steel browser set viewport W H` |
199251
| `steel browser geolocation` | `steel browser set geo LAT LON` |
200-
| `steel browser pdf` | Top-level `steel pdf <url>` (no browser session needed) |
252+
| `steel browser pdf` | Top-level `steel pdf <url>` |
201253
202-
## Troubleshooting
254+
## SDK integration (programmatic)
255+
256+
If you need to use Steel from code instead of the CLI:
257+
258+
### Python (Playwright)
203259
204260
```bash
205-
steel browser sessions
206-
steel browser live --session <name>
261+
pip install steel-sdk playwright
207262
```
208263
209-
| Symptom | Fix |
210-
|---------|-----|
211-
| `Missing browser auth` | `steel login` or set `STEEL_API_KEY` |
212-
| `No running session "<name>"` | Check spelling; run `steel browser stop --all` then restart with same name |
213-
| Session not reused between commands | Use exact same `--session <name>` on every command |
214-
| CAPTCHA blocking | `steel browser captcha status --wait`; restart with `--stealth` |
215-
| Stale session / stuck state | `steel browser stop --all` then fresh named session |
216-
| `steel: command not found` | `curl -sSf https://setup.steel.dev \| sh` and add `$HOME/.steel/bin` to PATH |
264+
```python
265+
from playwright.sync_api import sync_playwright
266+
from steel import Steel
267+
import os
268+
269+
client = Steel(steel_api_key=os.environ["STEEL_API_KEY"])
270+
session = client.sessions.create()
271+
272+
try:
273+
pw = sync_playwright().start()
274+
browser = pw.chromium.connect_over_cdp(session.websocket_url)
275+
page = browser.contexts[0].pages[0]
276+
277+
page.goto("https://example.com")
278+
print(page.title())
279+
finally:
280+
browser.close()
281+
pw.stop()
282+
client.sessions.release(session.id)
283+
```
284+
285+
### Node.js (Puppeteer)
286+
287+
```bash
288+
npm install steel-sdk puppeteer
289+
```
217290
218-
Full playbook: [references/troubleshooting.md](references/troubleshooting.md).
291+
```typescript
292+
import Steel from 'steel-sdk';
293+
import puppeteer from 'puppeteer';
294+
295+
const client = new Steel({ steelAPIKey: process.env.STEEL_API_KEY });
296+
const session = await client.sessions.create();
297+
298+
try {
299+
const browser = await puppeteer.connect({
300+
browserWSEndpoint: `${session.websocketUrl}?apiKey=${process.env.STEEL_API_KEY}`,
301+
});
302+
const page = await browser.newPage();
303+
await page.goto('https://example.com');
304+
console.log(await page.title());
305+
await browser.disconnect();
306+
} finally {
307+
await client.sessions.release(session.id);
308+
}
309+
```
219310
220-
## Reference routing
311+
**Key pattern:** Create session → connect via CDP websocket URL → use any browser library → release session.
221312
222-
- Full command reference: [references/steel-browser-commands.md](references/steel-browser-commands.md)
223-
- Lifecycle, endpoints, CAPTCHA modes: [references/steel-browser-lifecycle.md](references/steel-browser-lifecycle.md)
224-
- Migration from agent-browser: [references/migration-agent-browser.md](references/migration-agent-browser.md)
225-
- Error recovery playbooks: [references/troubleshooting.md](references/troubleshooting.md)
313+
## Troubleshooting
314+
315+
| Symptom | Fix |
316+
|---------|-----|
317+
| `steel: command not found` | `curl -sSf https://setup.steel.dev/install.sh \| sh && export PATH="$HOME/.steel/bin:$PATH"` |
318+
| `Missing browser auth` | `steel login` or set `STEEL_API_KEY` env var |
319+
| Authentication error in SDK | `export STEEL_API_KEY="your_key"` |
320+
| `No running session` | Check session name; `steel browser stop --all` then restart |
321+
| Stale element refs | Re-run `steel browser snapshot -i` before interacting |
322+
| CAPTCHA blocking | `steel browser start --stealth --session <name>` |
323+
| Session timeout | Add `--session-timeout 3600000` for tasks over 5 minutes |
324+
325+
If you run into issues, refer to https://docs.steel.dev or run `steel --help`.

0 commit comments

Comments
 (0)