feat(docs): show per-skill pages in the left sidebar (#26646)

Individual skill pages (e.g. /docs/user-guide/skills/bundled/productivity/notion)
had no sidebar rendered — the sidebar config only listed the two catalog index
pages. That was an intentional choice from an earlier 'too many entries would
drown product docs' concern, but the effect is that a user landing on any skill
page (via search, share link, or the catalog table) loses navigation entirely
and can't see related skills.

Wire build_sidebar_items() (which was already computed and discarded) back into
the sidebar. Structure:

  Skills
  ├── Bundled skills catalog       (catalog table, was already there)
  ├── Optional skills catalog      (catalog table, was already there)
  ├── Bundled
  │   ├── apple/
  │   │   ├── apple-apple-notes
  │   │   └── ...
  │   └── ... (one collapsed category per skill category)
  └── Optional
      └── ... (same)

Categories are collapsed by default so the top-level Skills entry doesn't
explode visually. Users browsing one skill see siblings in the same category;
the catalogs remain the at-a-glance entry point.

Also includes drift the regen script naturally produces on top of current main:
- creative-comfyui v5.0.0 → v5.1.0 page (author + new ref file)
- devops-kanban-worker SKILL.md updates
- new pages for optional skills that lacked generated docs:
  hyperliquid, finance-stocks, software-development/rest-graphql-debug
- updated optional-skills-catalog row for those

Validation:
- npx docusaurus build (en locale) succeeded — only pre-existing warnings
- inspected built productivity-notion/index.html: sidebar tree present,
  sibling productivity skills (airtable, linear, etc.) all linked
This commit is contained in:
Teknium 2026-05-15 17:04:30 -07:00 committed by GitHub
parent cd9470f416
commit dc4cde278b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 1411 additions and 33 deletions

View file

@ -39,6 +39,7 @@ hermes skills uninstall <skill-name>
| Skill | Description | | Skill | Description |
|-------|-------------| |-------|-------------|
| [**evm**](/docs/user-guide/skills/optional/blockchain/blockchain-evm) | Read-only EVM client: wallets, tokens, gas across 8 chains. | | [**evm**](/docs/user-guide/skills/optional/blockchain/blockchain-evm) | Read-only EVM client: wallets, tokens, gas across 8 chains. |
| [**hyperliquid**](/docs/user-guide/skills/optional/blockchain/blockchain-hyperliquid) | Hyperliquid market data, account history, trade review. |
| [**solana**](/docs/user-guide/skills/optional/blockchain/blockchain-solana) | Query Solana blockchain data with USD pricing — wallet balances, token portfolios with values, transaction details, NFTs, whale detection, and live network stats. Uses Solana RPC + CoinGecko. No API key required. | | [**solana**](/docs/user-guide/skills/optional/blockchain/blockchain-solana) | Query Solana blockchain data with USD pricing — wallet balances, token portfolios with values, transaction details, NFTs, whale detection, and live network stats. Uses Solana RPC + CoinGecko. No API key required. |
## communication ## communication
@ -88,6 +89,7 @@ hermes skills uninstall <skill-name>
| [**lbo-model**](/docs/user-guide/skills/optional/finance/finance-lbo-model) | Build leveraged buyout models in Excel — sources & uses, debt schedule, cash sweep, exit multiple, IRR/MOIC sensitivity. Pairs with excel-author. Use for PE screening, sponsor-case valuation, or illustrative LBO in a pitch. | | [**lbo-model**](/docs/user-guide/skills/optional/finance/finance-lbo-model) | Build leveraged buyout models in Excel — sources & uses, debt schedule, cash sweep, exit multiple, IRR/MOIC sensitivity. Pairs with excel-author. Use for PE screening, sponsor-case valuation, or illustrative LBO in a pitch. |
| [**merger-model**](/docs/user-guide/skills/optional/finance/finance-merger-model) | Build accretion/dilution (merger) models in Excel — pro-forma P&L, synergies, financing mix, EPS impact. Pairs with excel-author. Use for M&A pitches, board materials, or deal evaluation. | | [**merger-model**](/docs/user-guide/skills/optional/finance/finance-merger-model) | Build accretion/dilution (merger) models in Excel — pro-forma P&L, synergies, financing mix, EPS impact. Pairs with excel-author. Use for M&A pitches, board materials, or deal evaluation. |
| [**pptx-author**](/docs/user-guide/skills/optional/finance/finance-pptx-author) | Build PowerPoint decks headless with python-pptx. Pairs with excel-author for model-backed decks where every number traces to a workbook cell. Use for pitch decks, IC memos, earnings notes. | | [**pptx-author**](/docs/user-guide/skills/optional/finance/finance-pptx-author) | Build PowerPoint decks headless with python-pptx. Pairs with excel-author for model-backed decks where every number traces to a workbook cell. Use for pitch decks, IC memos, earnings notes. |
| [**stocks**](/docs/user-guide/skills/optional/finance/finance-stocks) | Stock quotes, history, search, compare, crypto via Yahoo. |
## health ## health
@ -176,6 +178,12 @@ hermes skills uninstall <skill-name>
| [**oss-forensics**](/docs/user-guide/skills/optional/security/security-oss-forensics) | Supply chain investigation, evidence recovery, and forensic analysis for GitHub repositories. Covers deleted commit recovery, force-push detection, IOC extraction, multi-source evidence collection, hypothesis formation/validation, and st... | | [**oss-forensics**](/docs/user-guide/skills/optional/security/security-oss-forensics) | Supply chain investigation, evidence recovery, and forensic analysis for GitHub repositories. Covers deleted commit recovery, force-push detection, IOC extraction, multi-source evidence collection, hypothesis formation/validation, and st... |
| [**sherlock**](/docs/user-guide/skills/optional/security/security-sherlock) | OSINT username search across 400+ social networks. Hunt down social media accounts by username. | | [**sherlock**](/docs/user-guide/skills/optional/security/security-sherlock) | OSINT username search across 400+ social networks. Hunt down social media accounts by username. |
## software-development
| Skill | Description |
|-------|-------------|
| [**rest-graphql-debug**](/docs/user-guide/skills/optional/software-development/software-development-rest-graphql-debug) | Debug REST/GraphQL APIs: status codes, auth, schemas, repro. |
## web-development ## web-development
| Skill | Description | | Skill | Description |

View file

@ -16,8 +16,8 @@ Generate images, video, and audio with ComfyUI — install, launch, manage nodes
|---|---| |---|---|
| Source | Bundled (installed by default) | | Source | Bundled (installed by default) |
| Path | `skills/creative/comfyui` | | Path | `skills/creative/comfyui` |
| Version | `5.0.0` | | Version | `5.1.0` |
| Author | ['kshitijk4poor', 'alt-glitch'] | | Author | ['kshitijk4poor', 'alt-glitch', 'purzbeats'] |
| License | MIT | | License | MIT |
| Platforms | macos, linux, windows | | Platforms | macos, linux, windows |
| Tags | `comfyui`, `image-generation`, `stable-diffusion`, `flux`, `sd3`, `wan-video`, `hunyuan-video`, `creative`, `generative-ai`, `video-generation` | | Tags | `comfyui`, `image-generation`, `stable-diffusion`, `flux`, `sd3`, `wan-video`, `hunyuan-video`, `creative`, `generative-ai`, `video-generation` |
@ -42,6 +42,12 @@ for workflow execution.
- `official-cli.md` — every `comfy ...` command, with flags - `official-cli.md` — every `comfy ...` command, with flags
- `rest-api.md` — REST + WebSocket endpoints (local + cloud), payload schemas - `rest-api.md` — REST + WebSocket endpoints (local + cloud), payload schemas
- `workflow-format.md` — API-format JSON, common node types, param mapping - `workflow-format.md` — API-format JSON, common node types, param mapping
- `template-integrity.md` — converting `comfyui-workflow-templates` from
editor format to API format: Reroute bypass, dotted dynamic-input keys
(`values.a`, `resize_type.width`), Cloud quirks (302 redirect, 1 concurrent
free-tier job, 1080p VRAM ceiling), Discord-compatible ffmpeg stitch.
Authored by [@purzbeats](https://github.com/purzbeats). Load this whenever
you're starting from an official template.
**Scripts (`scripts/`):** **Scripts (`scripts/`):**

View file

@ -65,6 +65,29 @@ kanban_complete(
) )
``` ```
**Coding task that needs human review (review-required):**
For most code-changing tasks, the work isn't truly *done* until a human reviewer has eyes on it. Block instead of complete, with `reason` prefixed `review-required: ` so the dashboard surfaces the row as needing review. Drop the structured metadata (changed files, test counts, diff/PR url) into a comment first, since `kanban_block` only carries the human-readable reason — comments are the durable annotation channel. Reviewer either approves and runs `hermes kanban unblock <id>` (which re-spawns you with the comment thread for any follow-ups) or asks for changes via another comment.
```python
import json
kanban_comment(
body="review-required handoff:\n" + json.dumps({
"changed_files": ["rate_limiter.py", "tests/test_rate_limiter.py"],
"tests_run": 14,
"tests_passed": 14,
"diff_path": "/path/to/worktree", # or PR url if pushed
"decisions": ["user_id primary, IP fallback for unauthenticated requests"],
}, indent=2),
)
kanban_block(
reason="review-required: rate limiter shipped, 14/14 tests pass — needs eyes on the user_id/IP fallback choice before merging",
)
```
Use `kanban_complete` only when the task is genuinely terminal — e.g. a one-line typo fix, a docs change with no functional consequences, or a research task where the artifact IS the writeup itself.
**Research task:** **Research task:**
```python ```python
kanban_complete( kanban_complete(

View file

@ -0,0 +1,228 @@
---
title: "Hyperliquid — Hyperliquid market data, account history, trade review"
sidebar_label: "Hyperliquid"
description: "Hyperliquid market data, account history, trade review"
---
{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */}
# Hyperliquid
Hyperliquid market data, account history, trade review.
## Skill metadata
| | |
|---|---|
| Source | Optional — install with `hermes skills install official/blockchain/hyperliquid` |
| Path | `optional-skills/blockchain/hyperliquid` |
| Version | `0.1.0` |
| Author | Hugo Sequier (Hugo-SEQUIER), Hermes Agent |
| License | MIT |
| Platforms | linux, macos, windows |
| Tags | `Hyperliquid`, `Blockchain`, `Crypto`, `Trading`, `Perpetuals`, `Spot`, `DeFi` |
## Reference: full SKILL.md
:::info
The following is the complete skill definition that Hermes loads when this skill is triggered. This is what the agent sees as instructions when the skill is active.
:::
# Hyperliquid Skill
Query Hyperliquid market and account data through the public `/info` endpoint.
Read-only — no API key, no signing, no order placement.
12 commands: `dexs`, `markets`, `spots`, `candles`, `funding`, `l2`, `state`,
`spot-balances`, `fills`, `orders`, `review`, `export`. Stdlib only
(`urllib`, `json`, `argparse`).
---
## When to Use
- User asks for Hyperliquid perp or spot market data, candles, funding, or L2 book
- User wants to inspect a wallet's perp positions, spot balances, fills, or orders
- User wants a post-trade review combining recent fills with market context
- User wants to inspect builder-deployed perp dexs or HIP-3 markets
- User wants a normalized JSON export of candles + funding for backtesting prep
---
## Prerequisites
Stdlib only — no external packages, no API key.
The script reads `~/.hermes/.env` for two optional defaults:
- `HYPERLIQUID_API_URL` — defaults to `https://api.hyperliquid.xyz`. Set to
`https://api.hyperliquid-testnet.xyz` for testnet.
- `HYPERLIQUID_USER_ADDRESS` — default address for `state`, `spot-balances`,
`fills`, `orders`, and `review`. If unset, pass the address as the first
positional argument.
A project `.env` in the current working directory is honored as a dev fallback.
Helper script: `~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py`
---
## How to Run
Invoke through the `terminal` tool:
```bash
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py <command> [args]
```
Add `--json` to any command for machine-readable output.
---
## Quick Reference
```bash
hyperliquid_client.py dexs
hyperliquid_client.py markets [--dex DEX] [--limit N] [--sort volume|oi|funding_abs|change_abs|name]
hyperliquid_client.py spots [--limit N]
hyperliquid_client.py candles <coin> [--interval 1h] [--hours 24] [--limit N]
hyperliquid_client.py funding <coin> [--hours 72] [--limit N]
hyperliquid_client.py l2 <coin> [--levels N]
hyperliquid_client.py state [address] [--dex DEX]
hyperliquid_client.py spot-balances [address] [--limit N]
hyperliquid_client.py fills [address] [--hours N] [--limit N] [--aggregate-by-time]
hyperliquid_client.py orders [address] [--limit N]
hyperliquid_client.py review [address] [--coin COIN] [--hours N] [--fills N]
hyperliquid_client.py export <coin> [--interval 1h] [--hours N] [--output PATH]
```
For `state`, `spot-balances`, `fills`, `orders`, and `review`, the address is
optional when `HYPERLIQUID_USER_ADDRESS` is set in `~/.hermes/.env`.
---
## Procedure
### 1. Discover DEXs and Markets
```bash
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py dexs
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
markets --limit 15 --sort volume
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
spots --limit 15
```
- `--dex` only applies to perp endpoints; omit for the first perp dex.
- Spot pairs may show as `PURR/USDC` or aliases like `@107`.
- HIP-3 markets prefix the coin with the dex, e.g. `mydex:BTC`.
### 2. Pull Historical Market Data
```bash
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
candles BTC --interval 1h --hours 72 --limit 48
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
funding BTC --hours 168 --limit 30
```
Time-range endpoints paginate. For larger windows, repeat with a later
`startTime` or use `export` (below).
### 3. Inspect Live Order Book
```bash
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
l2 BTC --levels 10
```
Use when asked about book depth, near-term liquidity, or potential market
impact of a large order.
### 4. Review an Account
```bash
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
state 0xabc...
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
spot-balances
```
`state` returns perp positions; `spot-balances` returns spot inventory.
Use these for "how are my positions?", "what am I holding?", "how much is
withdrawable?".
### 5. Review Fills and Orders
```bash
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
fills 0xabc... --hours 72 --limit 25
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
orders --limit 25
```
### 6. Generate a Trade Review
```bash
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
review 0xabc... --hours 72 --fills 50
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
review --coin BTC --hours 168
```
Reports realized PnL, fees, win/loss counts, coin breakdowns, market trend
and average funding for each traded perp, plus heuristics (fee drag,
concentration, counter-trend losses).
For deeper post-trade analysis: start with `review` to find problem coins
or windows → pull `fills` and `orders` for that period → pull `candles`
and `funding` for each traded coin → judge decision quality separately
from outcome quality.
### 7. Export a Reusable Dataset
```bash
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
export BTC --interval 1h --hours 168 --output ./btc-1h-7d.json
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
export BTC --interval 15m --hours 72 --end-time-ms 1760000000000
```
Output JSON contains: schema version, source metadata, exact time window,
normalized candle rows, normalized funding rows, summary stats. Use
`--end-time-ms` for reproducible windows.
---
## Pitfalls
- Public info endpoints are rate-limited. Large historical queries may
return capped windows; iterate with later `startTime` values.
- `fills --hours ...` uses `userFillsByTime`, which only exposes a
recent rolling window — not full archive history.
- `historicalOrders` returns recent orders only; not a full export.
- The `review` command is heuristic. It cannot reconstruct intent,
order placement quality, or true slippage from fills alone.
- The `export` command writes a normalized dataset, not a backtest
engine. You still need your own slippage/fill model.
- Spot aliases like `@107` are valid identifiers even when the UI shows
a friendlier name.
- `l2` is a point-in-time snapshot, not a time series.
---
## Verification
```bash
python3 ~/.hermes/skills/blockchain/hyperliquid/scripts/hyperliquid_client.py \
markets --limit 5
```
Should print the top Hyperliquid perp markets by 24h notional volume.

View file

@ -0,0 +1,112 @@
---
title: "Stocks — Stock quotes, history, search, compare, crypto via Yahoo"
sidebar_label: "Stocks"
description: "Stock quotes, history, search, compare, crypto via Yahoo"
---
{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */}
# Stocks
Stock quotes, history, search, compare, crypto via Yahoo.
## Skill metadata
| | |
|---|---|
| Source | Optional — install with `hermes skills install official/finance/stocks` |
| Path | `optional-skills/finance/stocks` |
| Version | `0.1.0` |
| Author | Mibay (Mibayy), Hermes Agent |
| License | MIT |
| Platforms | linux, macos, windows |
| Tags | `Stocks`, `Finance`, `Market`, `Crypto`, `Investing` |
| Related skills | [`dcf-model`](/docs/user-guide/skills/optional/finance/finance-dcf-model), [`comps-analysis`](/docs/user-guide/skills/optional/finance/finance-comps-analysis), [`lbo-model`](/docs/user-guide/skills/optional/finance/finance-lbo-model) |
## Reference: full SKILL.md
:::info
The following is the complete skill definition that Hermes loads when this skill is triggered. This is what the agent sees as instructions when the skill is active.
:::
# Stocks Skill
Read-only market data via Yahoo Finance. Five commands: `quote`, `search`,
`history`, `compare`, `crypto`. Python stdlib only — no API key, no pip
installs. Yahoo's endpoint is unofficial and may rate-limit or change.
## When to Use
- User asks for a current stock price (AAPL, TSLA, MSFT, ...)
- User wants to look up a ticker by company name
- User wants OHLCV history or performance over a date range
- User wants to compare several tickers side by side
- User asks for a crypto price (BTC, ETH, SOL, ...)
## Prerequisites
Python 3.8+ stdlib only. Optional: set `ALPHA_VANTAGE_KEY` to enrich
`market_cap`, `pe_ratio`, and 52-week levels when Yahoo's crumb-protected
fields come back null. Free key: https://www.alphavantage.co/support/#api-key
## How to Run
Invoke through the `terminal` tool. Once installed:
```
SCRIPT=~/.hermes/skills/finance/stocks/scripts/stocks_client.py
python3 $SCRIPT quote AAPL
```
All output is JSON on stdout — pipe through `jq` if you want to slice it.
## Quick Reference
```
python3 $SCRIPT quote AAPL
python3 $SCRIPT quote AAPL MSFT GOOGL TSLA
python3 $SCRIPT search "Tesla"
python3 $SCRIPT history NVDA --range 6mo
python3 $SCRIPT compare AAPL MSFT GOOGL
python3 $SCRIPT crypto BTC ETH SOL
```
## Commands
### `quote SYMBOL [SYMBOL2 ...]`
Current price, change, change%, volume, 52-week high/low.
### `search QUERY`
Find tickers by company name. Returns top 5: symbol, name, exchange, type.
### `history SYMBOL [--range RANGE]`
Daily OHLCV plus stats (min, max, avg, total return %). Ranges: `1mo`,
`3mo`, `6mo`, `1y`, `5y`. Default: `1mo`.
### `compare SYMBOL1 SYMBOL2 [...]`
Side-by-side: price, change%, 52-week performance.
### `crypto SYMBOL [SYMBOL2 ...]`
Crypto prices. Pass `BTC` (the script appends `-USD` automatically).
## Pitfalls
- Yahoo Finance's API is unofficial. Endpoints can change or rate-limit
without notice — if requests start failing, that's why.
- `market_cap` and `pe_ratio` may return null on `quote` when Yahoo's
crumb session isn't established. Set `ALPHA_VANTAGE_KEY` to backfill.
- Add a small delay between bulk requests to avoid rate-limiting.
- This is read-only — no order placement, no account integration.
## Verification
```
python3 ~/.hermes/skills/finance/stocks/scripts/stocks_client.py quote AAPL
```
Returns a JSON object with `symbol: "AAPL"` and a numeric `price` field.

View file

@ -0,0 +1,531 @@
---
title: "Rest Graphql Debug — Debug REST/GraphQL APIs: status codes, auth, schemas, repro"
sidebar_label: "Rest Graphql Debug"
description: "Debug REST/GraphQL APIs: status codes, auth, schemas, repro"
---
{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */}
# Rest Graphql Debug
Debug REST/GraphQL APIs: status codes, auth, schemas, repro.
## Skill metadata
| | |
|---|---|
| Source | Optional — install with `hermes skills install official/software-development/rest-graphql-debug` |
| Path | `optional-skills/software-development/rest-graphql-debug` |
| Version | `1.2.0` |
| Author | eren-karakus0 |
| License | MIT |
| Tags | `api`, `rest`, `graphql`, `http`, `debugging`, `testing`, `curl`, `integration` |
| Related skills | [`systematic-debugging`](/docs/user-guide/skills/bundled/software-development/software-development-systematic-debugging), [`test-driven-development`](/docs/user-guide/skills/bundled/software-development/software-development-test-driven-development) |
## Reference: full SKILL.md
:::info
The following is the complete skill definition that Hermes loads when this skill is triggered. This is what the agent sees as instructions when the skill is active.
:::
# API Testing & Debugging
Drive REST and GraphQL diagnosis through Hermes tools — `terminal` for `curl`, `execute_code` for Python `requests`, `web_extract` for vendor docs. Isolate the failing layer before guessing at the fix.
## When to Use
- API returns unexpected status or body
- Auth fails (401/403 after token refresh, OAuth, API key)
- Works in Postman but fails in code
- Webhook / callback integration debugging
- Building or reviewing API integration tests
- Rate limiting or pagination issues
Skip for UI rendering, DB query tuning, or DNS/firewall infra (escalate).
## Core Principle
**Isolate the layer, then fix.** A 200 OK can hide broken data. A 500 can mask a one-character auth typo. Walk the chain in order; never skip a step.
```
1. Connectivity → can we reach the host at all?
1.5 Timeouts → connect-slow vs read-slow?
2. TLS/SSL → cert valid and trusted?
3. Auth → credentials correct and unexpired?
4. Request format → payload shape match server expectations?
5. Response parse → does our code accept what came back?
6. Semantics → does the data mean what we assume?
```
## 5-Minute Quickstart
### REST via terminal
```python
# Verbose request/response exchange
terminal('curl -v https://api.example.com/users/1')
# POST with JSON
terminal("""curl -X POST https://api.example.com/users \\
-H 'Content-Type: application/json' \\
-H "Authorization: Bearer $TOKEN" \\
-d '{"name":"test","email":"test@example.com"}'""")
# Headers only
terminal('curl -sI https://api.example.com/health')
# Pretty-print JSON
terminal('curl -s https://api.example.com/users | python3 -m json.tool')
```
### GraphQL via terminal
```python
terminal("""curl -X POST https://api.example.com/graphql \\
-H 'Content-Type: application/json' \\
-H "Authorization: Bearer $TOKEN" \\
-d '{"query":"{ user(id: 1) { name email } }"}'""")
```
**GraphQL gotcha:** servers often return HTTP 200 even when the query failed. Always inspect the `errors` field regardless of status code:
```python
execute_code('''
import os, requests
resp = requests.post(
"https://api.example.com/graphql",
json={"query": "{ user(id: 1) { name email } }"},
headers={"Authorization": f"Bearer {os.environ['TOKEN']}"},
timeout=10,
)
data = resp.json()
if data.get("errors"):
for err in data["errors"]:
print(f"GraphQL error: {err['message']} (path: {err.get('path')})")
print(data.get("data"))
''')
```
### Python (requests) via execute_code
```python
execute_code('''
import requests
resp = requests.get(
"https://api.example.com/users/1",
headers={"Authorization": "Bearer <TOKEN>"},
timeout=(3.05, 30), # (connect, read)
)
print(resp.status_code, dict(resp.headers))
print(resp.text[:500])
''')
```
## Layered Debug Flow
### Step 1 — Connectivity
```python
terminal('nslookup api.example.com')
terminal('curl -v --connect-timeout 5 https://api.example.com/health')
```
Failures: DNS not resolving, firewall, VPN required, proxy missing.
### Step 1.5 — Timeouts
Distinguish *can't reach* from *reaches but slow*:
```python
terminal('''curl -w "dns:%{time_namelookup}s connect:%{time_connect}s tls:%{time_appconnect}s ttfb:%{time_starttransfer}s total:%{time_total}s\\n" \\
-o /dev/null -s https://api.example.com/endpoint''')
```
In Python, always pass a tuple timeout — `requests` has no default and will hang forever:
```python
execute_code('''
import requests
from requests.exceptions import ConnectTimeout, ReadTimeout
try:
requests.get(url, timeout=(3.05, 30))
except ConnectTimeout:
print("Cannot reach host — DNS, firewall, VPN")
except ReadTimeout:
print("Connected but server is slow")
''')
```
Diagnosis: high `time_connect` is network/firewall; high `time_starttransfer` with low `time_connect` is a slow server.
### Step 2 — TLS/SSL
```python
terminal('curl -vI https://api.example.com 2>&1 | grep -E "SSL|subject|expire|issuer"')
```
Failures: expired cert, self-signed, hostname mismatch, missing CA bundle. Use `-k` only for ad-hoc debug, never in code.
### Step 3 — Authentication
```python
# Token validity check
terminal('curl -s -o /dev/null -w "%{http_code}\\n" -H "Authorization: Bearer $TOKEN" https://api.example.com/me')
# Decode JWT exp claim — handles base64url padding correctly
execute_code('''
import json, base64, os
tok = os.environ["TOKEN"]
payload = tok.split(".")[1]
payload += "=" * (-len(payload) % 4)
print(json.dumps(json.loads(base64.urlsafe_b64decode(payload)), indent=2))
''')
```
Checklist:
- Token expired? (`exp` claim in JWT)
- Right scheme? Bearer vs Basic vs Token vs `X-Api-Key`
- Right environment? Staging key on prod is a classic
- API key in header vs query param (`?api_key=…`)?
### Step 4 — Request Format
```python
terminal("""curl -v -X POST https://api.example.com/endpoint \\
-H 'Content-Type: application/json' \\
-d '{"key":"value"}' 2>&1""")
```
**Content-Type / body mismatch — the silent 415/400:**
```python
# WRONG — data= sends form-encoded, header lies
requests.post(url, data='{"k":"v"}', headers={"Content-Type": "application/json"})
# RIGHT — json= auto-sets header AND serializes
requests.post(url, json={"k": "v"})
# WRONG — Accept says XML, code calls .json()
requests.get(url, headers={"Accept": "text/xml"})
# RIGHT — let requests build multipart with boundary
requests.post(url, files={"file": open("doc.pdf", "rb")})
```
Common: form-encoded vs JSON, missing required fields, wrong HTTP method, unencoded query params.
### Step 5 — Response Parsing
Always inspect content-type before calling `.json()`:
```python
execute_code('''
import requests
resp = requests.post(url, json=payload, timeout=10)
print(f"status={resp.status_code}")
print(f"headers={dict(resp.headers)}")
ct = resp.headers.get("Content-Type", "")
if "application/json" in ct:
print(resp.json())
else:
print(f"unexpected content-type {ct!r}, body={resp.text[:500]!r}")
''')
```
Failures: HTML error page where JSON expected, empty body, wrong charset.
### Step 6 — Semantic Validation
Parsed cleanly — but is the data *correct*?
- Does `"status": "active"` mean what your code thinks?
- ID in response matches the one requested?
- Timestamps in expected timezone?
- Pagination returning all results, or just page 1?
## HTTP Status Playbook
### 401 Unauthorized — credentials missing or invalid
1. `Authorization` header actually present? (`curl -v` to confirm)
2. Token correct and unexpired?
3. Right auth scheme? (`Bearer` vs `Basic` vs `Token`)
4. Some APIs use query param (`?api_key=…`) instead of header.
### 403 Forbidden — authenticated but not authorized
1. Token has the required scopes/permissions?
2. Resource owned by a different account?
3. IP allowlist blocking you?
4. CORS in browser? (check `Access-Control-Allow-Origin`)
### 404 Not Found — resource doesn't exist or URL is wrong
1. Path correct? (trailing slash, typo, version prefix)
2. Resource ID exists?
3. Right API version (`/v1/` vs `/v2/`)?
4. Right base URL (staging vs prod)?
### 409 Conflict — state collision
1. Resource already exists (duplicate create)?
2. Stale `ETag` / `If-Match`?
3. Concurrent modification by another process?
### 422 Unprocessable Entity — valid JSON, invalid data
The error body usually names the bad fields. Check:
- Field types (string vs int, date format)
- Required vs optional
- Enum values inside the allowed set
### 429 Too Many Requests — rate limited
Check `Retry-After` and `X-RateLimit-*` headers. Exponential backoff:
```python
execute_code('''
import time, requests
def with_backoff(method, url, **kwargs):
for attempt in range(5):
resp = requests.request(method, url, **kwargs)
if resp.status_code != 429:
return resp
wait = int(resp.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait)
return resp
''')
```
### 5xx — server-side, usually not your fault
- **500** — server bug. Capture correlation ID, file with provider.
- **502** — upstream down. Backoff + retry.
- **503** — overloaded / maintenance. Check status page.
- **504** — upstream timeout. Reduce payload or raise timeout.
For all 5xx: backoff with jitter, alert on persistence.
## Pagination & Idempotency
**Pagination.** Verify you're getting *all* results. Look for `next_cursor`, `next_page`, `total_count`. Two patterns:
- Offset (`?limit=100&offset=200`) — simple, can skip items if data shifts.
- Cursor (`?cursor=abc123`) — preferred for live or large datasets.
**Idempotency.** For non-idempotent operations (POST), send `Idempotency-Key: <uuid>` so retries don't double-charge / double-create. Mandatory for payments and orders.
## Contract Validation
Catch schema drift before it hits production:
```python
execute_code('''
import requests
def validate_user(data: dict) -> list[str]:
errors = []
required = {"id": int, "email": str, "created_at": str}
for field, expected in required.items():
if field not in data:
errors.append(f"missing field: {field}")
elif not isinstance(data[field], expected):
errors.append(f"{field}: want {expected.__name__}, got {type(data[field]).__name__}")
return errors
resp = requests.get(f"{BASE}/users/1", headers=HEADERS, timeout=10)
issues = validate_user(resp.json())
if issues:
print(f"contract violations: {issues}")
''')
```
Run after API upgrades, when integrating new third parties, or in CI smoke tests.
## Correlation IDs
Always capture the provider's request ID — fastest path to vendor support:
```python
execute_code('''
import requests
resp = requests.post(url, json=payload, headers=headers, timeout=10)
request_id = (
resp.headers.get("X-Request-Id")
or resp.headers.get("X-Trace-Id")
or resp.headers.get("CF-Ray") # Cloudflare
)
if resp.status_code >= 400:
print(f"failed status={resp.status_code} req_id={request_id} ts={resp.headers.get('Date')}")
''')
```
**Vendor bug-report template:**
```
Endpoint: POST /api/v1/orders
Request ID: req_abc123xyz
Timestamp: 2026-03-17T14:30:00Z
Status: 500
Expected: 201 with order object
Actual: 500 {"error":"internal server error"}
Repro: curl -X POST … (auth: <REDACTED>)
```
## Regression Test Template
Drop this into `tests/` and run via `terminal('pytest tests/test_api_smoke.py -v')`:
```python
import os, requests, pytest
BASE_URL = os.environ.get("API_BASE_URL", "https://api.example.com")
TOKEN = os.environ.get("API_TOKEN", "")
HEADERS = {"Authorization": f"Bearer {TOKEN}"}
class TestAPISmoke:
def test_health(self):
resp = requests.get(f"{BASE_URL}/health", timeout=5)
assert resp.status_code == 200
def test_list_users_returns_array(self):
resp = requests.get(f"{BASE_URL}/users", headers=HEADERS, timeout=10)
assert resp.status_code == 200
data = resp.json()
assert isinstance(data.get("data", data), list)
def test_get_user_required_fields(self):
resp = requests.get(f"{BASE_URL}/users/1", headers=HEADERS, timeout=10)
assert resp.status_code in (200, 404)
if resp.status_code == 200:
user = resp.json()
assert "id" in user and "email" in user
def test_invalid_auth_returns_401(self):
resp = requests.get(
f"{BASE_URL}/users",
headers={"Authorization": "Bearer invalid-token"},
timeout=10,
)
assert resp.status_code == 401
```
## Security
### Token handling
- Never log full tokens. Redact: `Bearer <REDACTED>`.
- Never hardcode tokens in scripts. Read from env (`os.environ["API_TOKEN"]`) or `~/.hermes/.env`.
- Rotate immediately if a token surfaces in logs, error messages, or git history.
### Safe logging
```python
def redact_auth(headers: dict) -> dict:
sensitive = {"authorization", "x-api-key", "cookie", "set-cookie"}
return {k: ("<REDACTED>" if k.lower() in sensitive else v) for k, v in headers.items()}
```
### Leak checklist
- [ ] **Credentials in URLs.** API keys in query strings end up in server logs, browser history, referrer headers — use headers.
- [ ] **PII in error responses.** `404 on /users/123` shouldn't reveal whether the user exists (enumeration).
- [ ] **Stack traces in prod.** 500s shouldn't leak file paths, framework versions.
- [ ] **Internal hostnames/IPs.** `10.x.x.x`, `internal-api.corp.local` in error bodies.
- [ ] **Tokens echoed back.** Some APIs include the auth token in error details. Verify they don't.
- [ ] **Verbose `Server` / `X-Powered-By`.** Stack-info leaks. Note for security review.
## Hermes Tool Patterns
### terminal — for curl, dig, openssl
```python
terminal('curl -sI https://api.example.com')
terminal('openssl s_client -connect api.example.com:443 -servername api.example.com </dev/null 2>/dev/null | openssl x509 -noout -dates')
```
### execute_code — for multi-step Python flows
When debugging spans auth → fetch → paginate → validate, use `execute_code`. Variables persist for the script, results print to stdout, no risk of token spam in your context:
```python
execute_code('''
import os, requests
token = os.environ["API_TOKEN"]
base = "https://api.example.com"
H = {"Authorization": f"Bearer {token}"}
# 1. auth
me = requests.get(f"{base}/me", headers=H, timeout=10)
print(f"auth {me.status_code}")
# 2. paginate
all_users, cursor = [], None
while True:
params = {"cursor": cursor} if cursor else {}
r = requests.get(f"{base}/users", headers=H, params=params, timeout=10)
body = r.json()
all_users.extend(body["data"])
cursor = body.get("next_cursor")
if not cursor:
break
print(f"users={len(all_users)}")
''')
```
### web_extract — for vendor API docs
Pull the spec for the endpoint you're debugging instead of guessing:
```python
web_extract(urls=["https://docs.example.com/api/v1/users"])
```
### delegate_task — for full CRUD test sweeps
```python
delegate_task(
goal="Test all CRUD endpoints for /api/v1/users",
context="""
Follow the rest-graphql-debug skill (optional-skills/software-development/rest-graphql-debug).
Base URL: https://api.example.com
Auth: Bearer token from API_TOKEN env var.
For each verb (POST, GET, PATCH, DELETE):
- happy path: assert status + response schema
- error cases: 400, 404, 422
- log a repro curl for any failure (redact tokens)
Output: pass/fail per endpoint + correlation IDs for failures.
""",
toolsets=["terminal", "file"],
)
```
## Output Format
When reporting findings:
```
## Finding
Endpoint: POST /api/v1/users
Status: 422 Unprocessable Entity
Req ID: req_abc123xyz
## Repro
curl -X POST https://api.example.com/api/v1/users \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <REDACTED>' \
-d '{"name":"test"}'
## Root Cause
Missing required field `email`. Server validation rejects before processing.
## Fix
-d '{"name":"test","email":"test@example.com"}'
```
## Related
- `systematic-debugging` — once the failing API layer is isolated, root-cause your code
- `test-driven-development` — write the regression test before shipping the fix

View file

@ -622,38 +622,70 @@ def build_sidebar_items(entries: list[tuple[dict[str, Any], dict[str, Any]]]) ->
} }
def write_sidebar(entries): def _render_sidebar_item(item: Any, indent: int) -> list[str]:
# The per-skill pages (`build_sidebar_items(entries)`) are still generated """Render one sidebar item (string doc id, or category dict) as ts lines."""
# as standalone docs under `website/docs/user-guide/skills/{bundled,optional}/` pad = " " * indent
# and reachable via the catalog pages in Reference — but we intentionally lines: list[str] = []
# do NOT explode them into the left sidebar. Two hundred-plus skill entries if isinstance(item, str):
# drown the actual product docs and make the site feel overwhelming to lines.append(f"{pad}'{item}',")
# first-time visitors. return lines
# # category dict
# Sidebar now shows: lines.append(f"{pad}{{")
# Skills lines.append(f"{pad} type: 'category',")
# ├── Bundled catalog → (link to reference/skills-catalog) lines.append(f"{pad} label: '{item['label']}',")
# └── Optional catalog → (link to reference/optional-skills-catalog) if item.get("collapsed", True):
# lines.append(f"{pad} collapsed: true,")
# The catalog pages are auto-regenerated tables with a link to every skill. lines.append(f"{pad} items: [")
# Individual skill pages (including the two formerly hand-written guides, for child in item.get("items", []):
# godmode and google-workspace) are still reachable at their URLs and are lines.extend(_render_sidebar_item(child, indent + 4))
# linked from the catalog tables and from the Skills overview page — they lines.append(f"{pad} ],")
# just aren't promoted in the left sidebar, because there's no principled lines.append(f"{pad}}},")
# rule for which skills would get promoted and which wouldn't. return lines
_ = build_sidebar_items(entries) # still called for any side effects / validation
skills_subtree = (
" {\n" def write_sidebar(entries):
" type: 'category',\n" # Sidebar layout:
" label: 'Skills',\n" # Skills
" collapsed: true,\n" # ├── reference/skills-catalog
" items: [\n" # ├── reference/optional-skills-catalog
" 'reference/skills-catalog',\n" # ├── Bundled
" 'reference/optional-skills-catalog',\n" # │ ├── apple/
" ],\n" # │ │ ├── apple-apple-notes
" },\n" # │ │ └── ...
) # │ └── ...
# └── Optional
# └── ...
#
# The two catalog index pages stay at the top of the Skills section so
# the at-a-glance table view is one click away, and the per-category
# subtrees give individual skill pages real sidebar navigation when
# users land on them directly.
tree = build_sidebar_items(entries)
skills_block: list[dict[str, Any]] = [
{
"label": "Bundled",
"collapsed": True,
"items": tree["bundled_categories"],
},
{
"label": "Optional",
"collapsed": True,
"items": tree["optional_categories"],
},
]
skills_items: list[Any] = [
"reference/skills-catalog",
"reference/optional-skills-catalog",
*skills_block,
]
skills_top = {
"label": "Skills",
"collapsed": True,
"items": skills_items,
}
skills_subtree = "\n".join(_render_sidebar_item(skills_top, 8)) + "\n"
sidebar_path = REPO / "website" / "sidebars.ts" sidebar_path = REPO / "website" / "sidebars.ts"
text = sidebar_path.read_text(encoding="utf-8") text = sidebar_path.read_text(encoding="utf-8")

View file

@ -113,6 +113,444 @@ const sidebars: SidebarsConfig = {
items: [ items: [
'reference/skills-catalog', 'reference/skills-catalog',
'reference/optional-skills-catalog', 'reference/optional-skills-catalog',
{
type: 'category',
label: 'Bundled',
collapsed: true,
items: [
{
type: 'category',
label: 'apple',
collapsed: true,
items: [
'user-guide/skills/bundled/apple/apple-apple-notes',
'user-guide/skills/bundled/apple/apple-apple-reminders',
'user-guide/skills/bundled/apple/apple-findmy',
'user-guide/skills/bundled/apple/apple-imessage',
'user-guide/skills/bundled/apple/apple-macos-computer-use',
],
},
{
type: 'category',
label: 'autonomous-ai-agents',
collapsed: true,
items: [
'user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-claude-code',
'user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-codex',
'user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-hermes-agent',
'user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-opencode',
],
},
{
type: 'category',
label: 'creative',
collapsed: true,
items: [
'user-guide/skills/bundled/creative/creative-architecture-diagram',
'user-guide/skills/bundled/creative/creative-ascii-art',
'user-guide/skills/bundled/creative/creative-ascii-video',
'user-guide/skills/bundled/creative/creative-baoyu-comic',
'user-guide/skills/bundled/creative/creative-baoyu-infographic',
'user-guide/skills/bundled/creative/creative-claude-design',
'user-guide/skills/bundled/creative/creative-comfyui',
'user-guide/skills/bundled/creative/creative-creative-ideation',
'user-guide/skills/bundled/creative/creative-design-md',
'user-guide/skills/bundled/creative/creative-excalidraw',
'user-guide/skills/bundled/creative/creative-humanizer',
'user-guide/skills/bundled/creative/creative-manim-video',
'user-guide/skills/bundled/creative/creative-p5js',
'user-guide/skills/bundled/creative/creative-pixel-art',
'user-guide/skills/bundled/creative/creative-popular-web-designs',
'user-guide/skills/bundled/creative/creative-pretext',
'user-guide/skills/bundled/creative/creative-sketch',
'user-guide/skills/bundled/creative/creative-songwriting-and-ai-music',
'user-guide/skills/bundled/creative/creative-touchdesigner-mcp',
],
},
{
type: 'category',
label: 'data-science',
collapsed: true,
items: [
'user-guide/skills/bundled/data-science/data-science-jupyter-live-kernel',
],
},
{
type: 'category',
label: 'devops',
collapsed: true,
items: [
'user-guide/skills/bundled/devops/devops-kanban-orchestrator',
'user-guide/skills/bundled/devops/devops-kanban-worker',
'user-guide/skills/bundled/devops/devops-webhook-subscriptions',
],
},
{
type: 'category',
label: 'dogfood',
collapsed: true,
items: [
'user-guide/skills/bundled/dogfood/dogfood-dogfood',
],
},
{
type: 'category',
label: 'email',
collapsed: true,
items: [
'user-guide/skills/bundled/email/email-himalaya',
],
},
{
type: 'category',
label: 'gaming',
collapsed: true,
items: [
'user-guide/skills/bundled/gaming/gaming-minecraft-modpack-server',
'user-guide/skills/bundled/gaming/gaming-pokemon-player',
],
},
{
type: 'category',
label: 'github',
collapsed: true,
items: [
'user-guide/skills/bundled/github/github-codebase-inspection',
'user-guide/skills/bundled/github/github-github-auth',
'user-guide/skills/bundled/github/github-github-code-review',
'user-guide/skills/bundled/github/github-github-issues',
'user-guide/skills/bundled/github/github-github-pr-workflow',
'user-guide/skills/bundled/github/github-github-repo-management',
],
},
{
type: 'category',
label: 'mcp',
collapsed: true,
items: [
'user-guide/skills/bundled/mcp/mcp-native-mcp',
],
},
{
type: 'category',
label: 'media',
collapsed: true,
items: [
'user-guide/skills/bundled/media/media-gif-search',
'user-guide/skills/bundled/media/media-heartmula',
'user-guide/skills/bundled/media/media-songsee',
'user-guide/skills/bundled/media/media-spotify',
'user-guide/skills/bundled/media/media-youtube-content',
],
},
{
type: 'category',
label: 'mlops',
collapsed: true,
items: [
'user-guide/skills/bundled/mlops/mlops-models-audiocraft',
'user-guide/skills/bundled/mlops/mlops-research-dspy',
'user-guide/skills/bundled/mlops/mlops-huggingface-hub',
'user-guide/skills/bundled/mlops/mlops-inference-llama-cpp',
'user-guide/skills/bundled/mlops/mlops-evaluation-lm-evaluation-harness',
'user-guide/skills/bundled/mlops/mlops-inference-obliteratus',
'user-guide/skills/bundled/mlops/mlops-models-segment-anything',
'user-guide/skills/bundled/mlops/mlops-inference-vllm',
'user-guide/skills/bundled/mlops/mlops-evaluation-weights-and-biases',
],
},
{
type: 'category',
label: 'note-taking',
collapsed: true,
items: [
'user-guide/skills/bundled/note-taking/note-taking-obsidian',
],
},
{
type: 'category',
label: 'productivity',
collapsed: true,
items: [
'user-guide/skills/bundled/productivity/productivity-airtable',
'user-guide/skills/bundled/productivity/productivity-google-workspace',
'user-guide/skills/bundled/productivity/productivity-linear',
'user-guide/skills/bundled/productivity/productivity-maps',
'user-guide/skills/bundled/productivity/productivity-nano-pdf',
'user-guide/skills/bundled/productivity/productivity-notion',
'user-guide/skills/bundled/productivity/productivity-ocr-and-documents',
'user-guide/skills/bundled/productivity/productivity-powerpoint',
'user-guide/skills/bundled/productivity/productivity-teams-meeting-pipeline',
],
},
{
type: 'category',
label: 'red-teaming',
collapsed: true,
items: [
'user-guide/skills/bundled/red-teaming/red-teaming-godmode',
],
},
{
type: 'category',
label: 'research',
collapsed: true,
items: [
'user-guide/skills/bundled/research/research-arxiv',
'user-guide/skills/bundled/research/research-blogwatcher',
'user-guide/skills/bundled/research/research-llm-wiki',
'user-guide/skills/bundled/research/research-polymarket',
'user-guide/skills/bundled/research/research-research-paper-writing',
],
},
{
type: 'category',
label: 'smart-home',
collapsed: true,
items: [
'user-guide/skills/bundled/smart-home/smart-home-openhue',
],
},
{
type: 'category',
label: 'social-media',
collapsed: true,
items: [
'user-guide/skills/bundled/social-media/social-media-xurl',
],
},
{
type: 'category',
label: 'software-development',
collapsed: true,
items: [
'user-guide/skills/bundled/software-development/software-development-debugging-hermes-tui-commands',
'user-guide/skills/bundled/software-development/software-development-hermes-agent-skill-authoring',
'user-guide/skills/bundled/software-development/software-development-node-inspect-debugger',
'user-guide/skills/bundled/software-development/software-development-plan',
'user-guide/skills/bundled/software-development/software-development-python-debugpy',
'user-guide/skills/bundled/software-development/software-development-requesting-code-review',
'user-guide/skills/bundled/software-development/software-development-spike',
'user-guide/skills/bundled/software-development/software-development-subagent-driven-development',
'user-guide/skills/bundled/software-development/software-development-systematic-debugging',
'user-guide/skills/bundled/software-development/software-development-test-driven-development',
'user-guide/skills/bundled/software-development/software-development-writing-plans',
],
},
{
type: 'category',
label: 'yuanbao',
collapsed: true,
items: [
'user-guide/skills/bundled/yuanbao/yuanbao-yuanbao',
],
},
],
},
{
type: 'category',
label: 'Optional',
collapsed: true,
items: [
{
type: 'category',
label: 'autonomous-ai-agents',
collapsed: true,
items: [
'user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-blackbox',
'user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-honcho',
],
},
{
type: 'category',
label: 'blockchain',
collapsed: true,
items: [
'user-guide/skills/optional/blockchain/blockchain-evm',
'user-guide/skills/optional/blockchain/blockchain-hyperliquid',
'user-guide/skills/optional/blockchain/blockchain-solana',
],
},
{
type: 'category',
label: 'communication',
collapsed: true,
items: [
'user-guide/skills/optional/communication/communication-one-three-one-rule',
],
},
{
type: 'category',
label: 'creative',
collapsed: true,
items: [
'user-guide/skills/optional/creative/creative-blender-mcp',
'user-guide/skills/optional/creative/creative-concept-diagrams',
'user-guide/skills/optional/creative/creative-hyperframes',
'user-guide/skills/optional/creative/creative-kanban-video-orchestrator',
'user-guide/skills/optional/creative/creative-meme-generation',
],
},
{
type: 'category',
label: 'devops',
collapsed: true,
items: [
'user-guide/skills/optional/devops/devops-cli',
'user-guide/skills/optional/devops/devops-docker-management',
'user-guide/skills/optional/devops/devops-watchers',
],
},
{
type: 'category',
label: 'dogfood',
collapsed: true,
items: [
'user-guide/skills/optional/dogfood/dogfood-adversarial-ux-test',
],
},
{
type: 'category',
label: 'email',
collapsed: true,
items: [
'user-guide/skills/optional/email/email-agentmail',
],
},
{
type: 'category',
label: 'finance',
collapsed: true,
items: [
'user-guide/skills/optional/finance/finance-3-statement-model',
'user-guide/skills/optional/finance/finance-comps-analysis',
'user-guide/skills/optional/finance/finance-dcf-model',
'user-guide/skills/optional/finance/finance-excel-author',
'user-guide/skills/optional/finance/finance-lbo-model',
'user-guide/skills/optional/finance/finance-merger-model',
'user-guide/skills/optional/finance/finance-pptx-author',
'user-guide/skills/optional/finance/finance-stocks',
],
},
{
type: 'category',
label: 'health',
collapsed: true,
items: [
'user-guide/skills/optional/health/health-fitness-nutrition',
'user-guide/skills/optional/health/health-neuroskill-bci',
],
},
{
type: 'category',
label: 'mcp',
collapsed: true,
items: [
'user-guide/skills/optional/mcp/mcp-fastmcp',
'user-guide/skills/optional/mcp/mcp-mcporter',
],
},
{
type: 'category',
label: 'migration',
collapsed: true,
items: [
'user-guide/skills/optional/migration/migration-openclaw-migration',
],
},
{
type: 'category',
label: 'mlops',
collapsed: true,
items: [
'user-guide/skills/optional/mlops/mlops-accelerate',
'user-guide/skills/optional/mlops/mlops-training-axolotl',
'user-guide/skills/optional/mlops/mlops-chroma',
'user-guide/skills/optional/mlops/mlops-clip',
'user-guide/skills/optional/mlops/mlops-faiss',
'user-guide/skills/optional/mlops/mlops-flash-attention',
'user-guide/skills/optional/mlops/mlops-guidance',
'user-guide/skills/optional/mlops/mlops-huggingface-tokenizers',
'user-guide/skills/optional/mlops/mlops-instructor',
'user-guide/skills/optional/mlops/mlops-lambda-labs',
'user-guide/skills/optional/mlops/mlops-llava',
'user-guide/skills/optional/mlops/mlops-modal',
'user-guide/skills/optional/mlops/mlops-nemo-curator',
'user-guide/skills/optional/mlops/mlops-inference-outlines',
'user-guide/skills/optional/mlops/mlops-peft',
'user-guide/skills/optional/mlops/mlops-pinecone',
'user-guide/skills/optional/mlops/mlops-pytorch-fsdp',
'user-guide/skills/optional/mlops/mlops-pytorch-lightning',
'user-guide/skills/optional/mlops/mlops-qdrant',
'user-guide/skills/optional/mlops/mlops-saelens',
'user-guide/skills/optional/mlops/mlops-simpo',
'user-guide/skills/optional/mlops/mlops-slime',
'user-guide/skills/optional/mlops/mlops-stable-diffusion',
'user-guide/skills/optional/mlops/mlops-tensorrt-llm',
'user-guide/skills/optional/mlops/mlops-torchtitan',
'user-guide/skills/optional/mlops/mlops-training-trl-fine-tuning',
'user-guide/skills/optional/mlops/mlops-training-unsloth',
'user-guide/skills/optional/mlops/mlops-whisper',
],
},
{
type: 'category',
label: 'productivity',
collapsed: true,
items: [
'user-guide/skills/optional/productivity/productivity-canvas',
'user-guide/skills/optional/productivity/productivity-here-now',
'user-guide/skills/optional/productivity/productivity-memento-flashcards',
'user-guide/skills/optional/productivity/productivity-shop-app',
'user-guide/skills/optional/productivity/productivity-shopify',
'user-guide/skills/optional/productivity/productivity-siyuan',
'user-guide/skills/optional/productivity/productivity-telephony',
],
},
{
type: 'category',
label: 'research',
collapsed: true,
items: [
'user-guide/skills/optional/research/research-bioinformatics',
'user-guide/skills/optional/research/research-domain-intel',
'user-guide/skills/optional/research/research-drug-discovery',
'user-guide/skills/optional/research/research-duckduckgo-search',
'user-guide/skills/optional/research/research-gitnexus-explorer',
'user-guide/skills/optional/research/research-parallel-cli',
'user-guide/skills/optional/research/research-qmd',
'user-guide/skills/optional/research/research-scrapling',
'user-guide/skills/optional/research/research-searxng-search',
],
},
{
type: 'category',
label: 'security',
collapsed: true,
items: [
'user-guide/skills/optional/security/security-1password',
'user-guide/skills/optional/security/security-oss-forensics',
'user-guide/skills/optional/security/security-sherlock',
],
},
{
type: 'category',
label: 'software-development',
collapsed: true,
items: [
'user-guide/skills/optional/software-development/software-development-rest-graphql-debug',
],
},
{
type: 'category',
label: 'web-development',
collapsed: true,
items: [
'user-guide/skills/optional/web-development/web-development-page-agent',
],
},
],
},
], ],
}, },
], ],