OpenClaw/clawhub-security-signals huggingface dataset:
Skill: photon78/claw-text-and-pics (version 1.0.1)

--- name: claw-text-and-pics description: Extract text and embedded images from scanned documents, PDFs, and photos via Mistral OCR API. Use when reading receipts, invoices, contracts, handwritten notes, or any image or PDF containing text. license: MIT compatibility: Requires Mistral API key. Optional Pillow (pip install pillow) for image extraction. Python 3.11+. metadata: author: photon78 version: "1.0.0" env_required: MISTRAL_API_KEY env_optional: TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID --- # claw-text-and-pics **Extract text and images from documents via Mistral OCR** Give your OpenClaw agent the ability to read scanned documents, PDFs, and images — extracting clean Markdown text and cropping out embedded images. Powered by [Mistral's OCR API](https://docs.mistral.ai/capabilities/document/). ## When to use - Extract text from scanned documents, invoices, receipts, contracts - Pull embedded images from PDFs or scans - Convert handwritten notes or photos to searchable text - Send extracted images directly to Telegram ## Usage ```bash # Extract text only python3 ocr.py --input scan.jpg # Extract text from PDF (3 pages) python3 ocr.py --input document.pdf --pages 3 # Extract embedded images python3 ocr.py --input scan.jpg --extract-images --output-dir ./images/ # Extract images and send to Telegram python3 ocr.py --input scan.jpg --extract-images --send --target 123456789 # Works with URLs too python3 ocr.py --input https://example.com/document.pdf ``` ## Output - **stdout:** Extracted text as Markdown - **Files:** Cropped images saved to `--output-dir` (only with `--extract-images`) ## Configuration Set in `~/.openclaw/.env` or as environment variables: | Variable | Required | Description | |----------|----------|-------------| | `MISTRAL_API_KEY` | Yes | Your Mistral API key | | `TELEGRAM_BOT_TOKEN` | Only for `--send` | Your Telegram bot token | | `TELEGRAM_CHAT_ID` | Optional | Default chat ID (overridable with `--target`) | ## Environment Variables ``` MISTRAL_API_KEY=required # Mistral API key — get one at console.mistral.ai TELEGRAM_BOT_TOKEN=optional # Required only when using --send TELEGRAM_CHAT_ID=optional # Default target chat ID (overridable with --target) ``` This skill reads `~/.openclaw/.env` as a fallback for credentials. Ensure the file has restricted permissions: `chmod 600 ~/.openclaw/.env` ## Requirements - Python 3.11+ - Mistral API key ([console.mistral.ai](https://console.mistral.ai)) - **Optional** (only for `--extract-images`): `pip install pillow` ## Parameters | Parameter | Required | Description | |-----------|----------|-------------| | `--input` | Yes | Local path or URL to image/PDF | | `--extract-images` | No | Crop and save embedded images | | `--output-dir` | No | Output directory (default: `./extracted-images`) | | `--send` | No | Send extracted images via Telegram | | `--target` | No | Telegram chat ID (or `TELEGRAM_CHAT_ID` env var) | | `--pages` | No | Number of PDF pages to process | | `--debug` | No | Print raw API response |


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)
Skill: jaceymarvin99/bing-wallpaper (version 0.1.0)

--- name: bing-wallpaper description: Use when users need to fetch the daily Bing wallpaper. --- # Bing Wallpaper Skill This skill helps AI agents fetch the daily Bing wallpaper from the 60s API, which provides the latest Bing homepage background image. ## When to Use This Skill Use this skill when users: - Ask for today's Bing wallpaper - Request a beautiful daily background image ## How to Use Execute the associated `scripts/wallpaper.sh` script to fetch the Bing wallpaper. ```bash ./scripts/wallpaper.sh [encoding] ``` ### Options - `--encoding, -e <format>`: Optional. Specifies the output response format. Valid options are `text`, `json`, `image`, and `markdown`. ### Return Values The script securely calls the 60s Bing wallpaper API and outputs the response to `stdout`. Depending on the `encoding` parameter, the response could be a JSON string, plain text, markdown, or binary image data. ### Usage Examples ```bash # Get Bing wallpaper using default API encoding ./scripts/wallpaper.sh # Get Bing wallpaper in JSON format ./scripts/wallpaper.sh --encoding json # Get Bing wallpaper in plain text format (simplified usage) ./scripts/wallpaper.sh text # Get Bing wallpaper in markdown format ./scripts/wallpaper.sh -e markdown # Get Bing wallpaper as an image ./scripts/wallpaper.sh image ``` ## Response Format The return values differ based on the `encoding` parameter: 1. **Default & Recommended (`--encoding markdown`)** - **When to use:** By default for standard wallpaper inquiries. - **Why:** Returns a brief description of the wallpaper along with the image link in an easy-to-read markdown format. 2. **Just the Link (`--encoding text`)** - **When to use:** When the user only wants the image link. - **Why:** Returns exactly the raw image link and nothing else. 3. **Structured Data (`--encoding json`)** - **When to use:** When you need the wallpaper description and link in a structured JSON format. - **Why:** Useful for parsing the response to extract specific fields programmatically. 4. **Direct Image (`--encoding image`)** - **When to use:** When the user specifically requests the image file itself.


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: okradze/desearch-web-search (version 1.0.1)

--- name: desearch-web-search description: Search the web and get real-time SERP-style results with titles, URLs, and snippets. Use this for general web queries when you need current links and information from across the internet. metadata: {"clawdbot":{"emoji":"🌐","homepage":"https://desearch.ai","requires":{"env":["DESEARCH_API_KEY"]}}} --- # Web Search By Desearch Real-time web search returning structured SERP-style results with titles, links, and snippets. ## Quick Start 1. Get an API key from https://console.desearch.ai 2. Set environment variable: `export DESEARCH_API_KEY='your-key-here'` ## Usage ```bash # Basic web search desearch.py web "quantum computing" # Paginated results desearch.py web "quantum computing" --start 10 ``` ## Options | Option | Description | |--------|-------------| | `--start` | Pagination offset (default: 0). Use to get the next page of results. | ## Response ### Example ```bash desearch.py web "best sights in Georgia" ``` ```json { "data": [ { "title": "Cool places and fun things to do in Georgia ? : r/solotravel", "snippet": "I was in Georgia earlier this month. My favorite place was Mtirala National Park in Adjara. The mountains and forest were absolutely beautiful ...", "link": "https://www.reddit.com/r/solotravel/comments/py4wls/cool_places_and_fun_things_to_do_in_georgia/", }, ] } ``` ### Notes - Returns up to 10 results per page. Use `--start` to paginate. ### Errors Status 401, Unauthorized (e.g., missing/invalid API key) ```json { "detail": "Invalid or missing API key" } ``` Status 402, Payment Required (e.g., balance depleted) ```json { "detail": "Insufficient balance, please add funds to your account to continue using the service." } ``` ## Resources - [API Reference](https://desearch.ai/docs/api-reference/get-web) - [Desearch Console](https://console.desearch.ai)


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: arosstale/clawoney (version 1.0.0)

--- name: clawoney description: "The Clawoney agent persona. Pattern recognition at the speed of biology. Runs the Odu 256-state engine with zero sentiment and maximum signal clarity." version: 1.0.0 metadata: openclaw: emoji: "🦞" homepage: https://github.com/arosstale/clawoney --- # Clawoney You are Clawoney. You operate on pattern recognition, not opinion. You run the Odu 256-state binary engine. You scan, recognize, act, and stash. That's the loop. That's all there is. ## What You Are A pattern recognition system. You read 8 binary channels, collapse them into a state (0-255), and execute the corresponding action. No deliberation. No sentiment. No "on the other hand." You are not an advisor. You are a scanner. ## The Loop ``` while (alive) { state = scan() odu = classify(state) // 0-255 action = lookup(odu) // pattern → response if (action !== WAIT) { execute(action) stash(result) } } ``` ## How You Respond 1. **Scan** — read the situation across 8 channels (macro, sector, volume, volatility, sentiment, correlation, liquidity, micro) 2. **Classify** — score each channel 0 or 1, combine into 8-bit pattern 3. **Report** — show the binary pattern, decimal, state name, range, and action 4. **Execute** — do what the pattern says. Don't add caveats. ## Your Voice - Clinical. Concise. Mechanical. - Report results, not feelings. - Never say: "I think," "maybe," "perhaps," "it depends," "on the other hand" - Always say: what the pattern is, what it means, what to do - If the pattern says WAIT — say "WAIT" and nothing else - If the pattern says HARVEST — act immediately ## The Five Ranges | Range | Action | Your behavior | |-------|--------|---------------| | 0-15 DORMANT | WAIT | Be silent. Accumulate information. | | 16-63 BUILDING | POSITION | Prepare. Be disciplined. | | 64-127 TRANSITIONAL | EVALUATE | Watch carefully. The flip is here. | | 128-191 ACTIVE | EXECUTE | Act with precision. No hesitation. | | 192-255 PEAK | HARVEST | Take everything offered. | ## What You Don't Do - You don't apologize - You don't hedge - You don't offer "balanced perspectives" - You don't say "it's complicated" - You don't moralize - You don't explain yourself unless asked ## The Maxims 1. **Signal over noise** — filter aggressively 2. **The loop never stops** — SCAN → RECOGNIZE → ACT → STASH 3. **Silent execution** — report results, not intentions 4. **No underhead** — a thermostat doesn't agonize about temperature 5. **Pattern is truth** — the Odu speaks, you translate ## Pair With Install the `odu` skill for the full 256-state pattern reference table: ``` clawhub install odu ``` Clawoney is the persona. Odu is the engine. Together: pattern recognition at the speed of biology.


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: xisen-w/aicoo-daily-brief (version 0.2.0)

--- name: daily-brief description: "Use this skill when the user asks for a daily briefing, morning summary, executive brief, top priorities, COO strategies, or Eisenhower matrix. Triggers on: 'daily brief', 'morning brief', 'daily summary', 'executive summary', '今日简报', '优先级矩阵', '/v1/briefing', '/v1/briefings', '/v1/briefing/strategies', '/v1/briefing/matrix'." user-invokable: true metadata: author: systemind version: "1.0.0" --- # Daily Brief Generate an executive daily brief from Aicoo context, then derive top strategies and a matrix view. ## Prerequisites - `AICOO_API_KEY` must be set - Base URL: `https://www.aicoo.io/api/v1` ## Endpoints - `POST /api/v1/briefing` - `POST /api/v1/briefing/strategies` - `POST /api/v1/briefing/matrix` - `GET /api/v1/briefings` ## Core Workflow ### Step 1: Generate briefing ```bash curl -s -X POST "https://www.aicoo.io/api/v1/briefing" \ -H "Authorization: Bearer $AICOO_API_KEY" \ -H "Content-Type: application/json" \ -d '{"timeDuration":"last 24 hours"}' | jq . ``` This returns: - `statusQuoSummary` - `todoSummary` - `calendarSummary` - `notesSummary` - `emailAttentionSummary` - `suggestions[]` ### Step 2: Get top 3 COO strategies ```bash curl -s -X POST "https://www.aicoo.io/api/v1/briefing/strategies" \ -H "Authorization: Bearer $AICOO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "statusQuoSummary":"...", "todoSummary":"...", "calendarSummary":"...", "notesSummary":"...", "emailAttentionSummary":"..." }' | jq . ``` ### Step 3: Build Eisenhower matrix ```bash curl -s -X POST "https://www.aicoo.io/api/v1/briefing/matrix" \ -H "Authorization: Bearer $AICOO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "statusQuoSummary":"...", "todoSummary":"...", "calendarSummary":"...", "notesSummary":"...", "emailAttentionSummary":"..." }' | jq . ``` ### Step 4: Retrieve history ```bash curl -s "https://www.aicoo.io/api/v1/briefings?limit=10" \ -H "Authorization: Bearer $AICOO_API_KEY" | jq . ``` ## Claude Code Automation Use `/loop` or `/routine` directly. ### `/loop` example ``` /loop 24h generate my daily brief from /v1/briefing, then generate /v1/briefing/strategies and /v1/briefing/matrix. Return a concise executive summary with top 3 actions. ``` ### `/routine` example ``` /routine daily-brief every weekday at 08:30: run /v1/briefing + /v1/briefing/strategies + /v1/briefing/matrix and post concise output. ``` ## OpenClaw Automation (CRON) Use the provided script: ```bash # Every weekday at 08:30 30 8 * * 1-5 /path/to/aicoo-skills/scripts/daily-brief-cron.sh >> /tmp/aicoo-daily-brief.log 2>&1 ``` Optional envs: - `PULSE_BRIEF_TIME_DURATION` (default: `last 24 hours`) - `PULSE_BRIEF_SAVE_NOTE=1` (save output to `/os/notes`) - `PULSE_BRIEF_NOTE_TITLE_PREFIX` (default: `Daily Brief`) ## Output Contract When you report to user, include: 1. Today's focus (2-3 bullets) 2. Top 3 strategic priorities 3. Eisenhower Q1/Q2 highlights 4. Suggested next actions Keep concise and action-oriented.


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal:  | SkillSpector: suspicious (MEDIUM)
Skill: ebly/cross-agent-chat (version 1.0.0)

# SKILL.md - 跨 Agent 通信技能 ## 描述 用于在不同 agent 之间进行通信的标准化流程。当需要与其他 agent（机器人）聊天时，使用 `sessions_send` 工具。 ## 使用场景 **需要和其他 agent 对话时**： - 询问其他 agent 的能力或功能 - 请求其他 agent 执行任务 - 跨 agent 协作和沟通 ## 工具使用 ### sessions_send - 发送消息到其他 session ```json { "sessionKey": "目标 session 的 key", "label": "目标 session 的 label", "message": "要发送的消息内容", "timeoutSeconds": 30 } ``` **参数说明**： - `sessionKey` 或 `label`：必填其一，用于标识目标 session - `message`：要发送的消息内容（必填） - `timeoutSeconds`：超时时间（可选，默认 30 秒） ## 工作流程 ### 1. 发现目标 session 使用 `sessions_list` 查找可用的 session： ```bash sessions_list(activeMinutes=1440, limit=20, messageLimit=2) ``` 返回结果包含： - `key`: session 的唯一标识 - `displayName`: 显示名称 - `kind`: session 类型（group/other等） - `channel`: 通信渠道 ### 2. 发送消息 使用 `sessions_send` 发送消息： ```json { "sessionKey": "agent:xxx:feishu:direct:ou_xxx", "message": "你好，请问你可以帮我做什么？" } ``` ### 3. 等待响应 对方 agent 会收到消息并回复，你可以在当前会话中继续对话。 ## 重要规则 ✅ **应该这样做**： - 和其他 agent 对话时，统一使用 `sessions_send` - 明确说明你的意图和需求 - 使用清晰、友好的语言 - 设置合理的超时时间 ❌ **不要这样做**： - 使用 `message` 工具给其他 agent 发送消息（这是给用户渠道用的） - 直接猜测 sessionKey，先用 `sessions_list` 确认 - 发送模糊或无意义的信息 ## 示例对话 ### 场景 1：询问另一个 agent 的能力 ```json { "sessionKey": "agent:assistant:feishu:direct:ou_xxx", "message": "你好！我是玲子，听说你擅长数据分析，可以帮我分析一些测试数据吗？" } ``` ### 场景 2：请求执行任务 ```json { "label": "代码助手", "message": "请帮我写一个 Python 脚本，用于自动化测试用户登录功能。要求使用 pytest 框架。" } ``` ### 场景 3：跨 agent 协作 ```json { "sessionKey": "agent:developer:feishu:group:oc_xxx", "message": "我刚才发现了一个 P1 级别的 bug，已经整理好了复现步骤。需要你这边帮忙排查一下代码问题。" } ``` ## 注意事项 1. **权限问题**：确保你有权限访问目标 session 2. **超时处理**：如果目标 agent 没有响应，检查是否在线或超时时间设置是否合理 3. **消息格式**：发送的消息要清晰、简洁、明确 4. **上下文保持**：如果需要延续对话，记住目标 session 的标识 ## 故障排查 ### 问题：发送失败，提示找不到 session **原因**：sessionKey 或 label 不正确 **解决**：使用 `sessions_list` 确认正确的 session 标识 ### 问题：对方没有回应 **原因**： - 目标 agent 不在线 - 超时时间太短 - 消息发送失败 **解决**： - 延长 `timeoutSeconds` - 检查目标 session 的 `updatedAt` 时间戳确认是否活跃 - 重新发送消息 ### 问题：收到错误响应 **原因**：目标 agent 不理解你的请求 **解决**： - 重新组织消息，更清楚地表达意图 - 提供更多上下文信息 - 简化请求内容 ## 最佳实践 1. **先打招呼**：发送请求前，简单介绍自己和意图 2. **明确需求**：清楚说明你想要什么，避免歧义 3. **友好沟通**：使用礼貌、友好的语言 4. **保持简洁**：消息不要过长，突出重点 5. **及时反馈**：收到回复后，及时确认和反馈 --- _跨 agent 协作，让效率倍增_ 🤝


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: aaronmda/bayhustlelocal (version 0.1.0)

--- name: bayhustlelocal description: Local Bay Area parking spot research and flip opportunities (resale arbitrage, spot hunting) using goplaces, web_search, Craigslist scraping via browser, local listings. Use for queries about parking availability, cheap spots to flip/rent, garage sales flips, local hustle research in Alameda/SF/Oakland.</description> --- # BayHustleLocal - Parking & Flip Research ## When to Use Trigger when user asks about: - Parking spots in Bay Area (Alameda, Oakland, SF) - Flipping parking permits/reservations - Craigslist flips, garage sales for resale - Local hustle side gigs involving physical goods/parking ## Workflow 1. **Location**: Use goplaces for places search "parking garage Alameda cheap" or specific addresses. 2. **Web Research**: web_search "craigslist parking spot for sale Alameda" or "flip parking permit Bay Area". 3. **Browser for Listings**: Use browser-automation skill for Craigslist, Facebook Marketplace, Nextdoor searches. 4. **Local Data**: Check workspace files or memory for known spots. 5. **Analysis**: Summarize opportunities, prices, arbitrage potential. ## Tools - goplaces: Place details, reviews for parking lots. - web_search: Current listings, prices. - browser: Scrape dynamic sites. - xurl: Promo threads on X for hustles (optional). ## Examples - "Find cheap parking near Alameda to sublet" - "Best flips on Craigslist Oakland today" Read references/parking-spots.md if exists for known local data.


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: crossservicesolutions/add-watermark-to-pdf (version 1.0.0)

--- name: add-watermark-to-pdf description: Add a text watermark to one or multiple PDFs by uploading them to the Solutions API, polling until completion, then returning download URL(s) for the watermarked PDF(s) (or a ZIP if multiple). license: MIT compatibility: agentskills: ">=0.1.0" metadata: category: document-processing tags: - pdf - watermark - batch - cross-service-solutions provider: Cross-Service-Solutions (Solutions API) allowed-tools: - http - files --- # add-watermark-to-pdf ## Purpose This skill adds a text watermark to one or multiple PDFs by: 1) accepting one or multiple PDF files from the user, 2) accepting a watermark text string, 3) uploading them to the Solutions API, 4) polling the job status until it is finished, 5) returning download URL(s) for the resulting file(s). If multiple PDFs are processed, the output may include multiple PDFs and/or a ZIP for download. ## Credentials The API requires an API key used as a Bearer token: - `Authorization: Bearer <API_KEY>` How the user gets an API key: - https://login.cross-service-solutions.com/register - Or the user can provide an API key directly. **Rule:** never echo or log the API key. ## API endpoints Base URL: - `https://api.xss-cross-service-solutions.com/solutions/solutions` Create watermark job: - `POST /api/61` - `multipart/form-data` parameters: - `files` — required — multiple PDF files (multiple_files) - `text` — required — string (watermark text) Get result by ID: - `GET /api/<ID>` When done, the response contains: - `output.files[]` with `{ name, path }` where `path` is a downloadable URL (PDFs and/or ZIP). ## Inputs ### Required - One or more PDF files (binary) - Watermark text (`text`, string) - API key (string) ### Optional - None ## Output Return a structured result: - `job_id` (number) - `status` (string) - `outputs` (array) containing `{ name, path }` for each output file - Convenience fields: - `download_url` (string) if exactly one output exists - `download_urls` (array of strings) for all outputs - `input_files` (array of strings) - `watermark_text` (string) — returned only if safe; do not return if user considers it sensitive Example output: ```json { "job_id": 6101, "status": "done", "outputs": [ { "name": "watermarked.pdf", "path": "https://.../watermarked.pdf" } ], "download_url": "https://.../watermarked.pdf", "download_urls": ["https://.../watermarked.pdf"], "input_files": ["input.pdf"] }

path: requirements.txt
content: requests>=2.32.0

Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)
Skill: xuxuclassmate/trading-assistant-core (version 1.0.0)

--- name: trading-assistant description: Market data analysis toolkit with technical indicators and portfolio tracking. Educational use only. version: 1.0.0 author: XuXuClassMate license: MIT category: Education tags: - education - finance - analysis - openclaw metadata: openclaw: requires: env: - TWELVE_DATA_API_KEY - ALPHA_VANTAGE_API_KEY bins: - python3 - pip primaryEnv: TWELVE_DATA_API_KEY emoji: 📊 homepage: https://github.com/XuXuClassMate/trading-assistant safety: level: safe audit: manual notes: Educational tool only. Pure Python, no subprocess, no shell, no eval/exec. API keys from env vars. Read-only market data. No trade execution. --- # Market Data Analysis Toolkit Educational tool for learning technical analysis and portfolio tracking. ## What It Does - Calculate technical indicators (RSI, MACD, Bollinger Bands) - Track portfolio holdings and P&L - Generate price alerts - Analyze historical data ## Installation ```bash pip install -r requirements.txt export TWELVE_DATA_API_KEY=your_key export ALPHA_VANTAGE_API_KEY=your_key python3 trading_signals.py ``` ## Security - Pure Python code - No subprocess or shell calls - No eval/exec - Environment variables for API keys - Read-only API access ## Links - GitHub: https://github.com/XuXuClassMate/trading-assistant - Issues: https://github.com/XuXuClassMate/trading-assistant/issues - Docker Hub: https://hub.docker.com/r/xuxuclassmate/trading-assistant ## License MIT License - Educational use only, not financial advice.


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector:  ()
Skill: teoslayer/pilot-network-map (version 1.0.0)

--- name: pilot-network-map description: > Visualize network topology, trust graphs, and latency. Use this skill when: 1. Generating network topology diagrams or adjacency matrices 2. Visualizing trust relationships and dependency chains 3. Creating latency heatmaps or proximity maps Do NOT use this skill when: - You need to find specific agents (use pilot-discover instead) - You need to establish connections (use pilot-connect instead) - You only need simple peer lists (use pilot-directory instead) tags: - pilot-protocol - visualization - topology license: AGPL-3.0 compatibility: > Requires pilot-protocol skill and pilotctl binary on PATH. The daemon must be running (pilotctl daemon start). metadata: author: vulture-labs version: "1.0" openclaw: requires: bins: - pilotctl homepage: https://pilotprotocol.network allowed-tools: - Bash --- # pilot-network-map Visualize network topology, trust graphs, and latency maps for Pilot Protocol. ## Commands ### List all peers (nodes) ```bash pilotctl --json peers ``` ### List trust relationships (edges) ```bash pilotctl --json trust ``` ### Ping for latency (edge weights) ```bash pilotctl --json ping <node-id> ``` ### List active connections ```bash pilotctl --json connections ``` ## Workflow Example Generate DOT format for Graphviz: ```bash #!/bin/bash echo "digraph pilot_network {" echo " rankdir=LR;" # Add nodes pilotctl --json peers | jq -r '.peers[] | " \"\(.node_id)\" [label=\"\(.hostname)\"];"' # Add trust edges pilotctl --json trust | jq -r '.trusted[] | " \"\(.source)\" -> \"\(.target)\";"' echo "}" ``` Render with: `dot -Tpng network.dot -o network.png` ## Dependencies Requires pilot-protocol skill and a running daemon.


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)