/SKILL.md
Router skill for crypto token price + candlestick chart generation via Hyperliquid/CoinGecko.
npx skillsauth add evgyur/crypto-price crypto-priceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Router для скилла цен и графиков крипты.
Когда нужен токен прайс, изменение за период или график (BTC, ETH, HYPE, ...).
/crypto-price <SYMBOL> [duration]Canonical generic command for any supported token/asset.
python3 {baseDir}/scripts/get_price_chart.py <SYMBOL> [duration]
Source routing is Hyperliquid-first for all live perp symbols from metaAndAssetCtxs, then CoinGecko for crypto tokens, then Yahoo Finance for traditional tickers/aliases (SILVER→SI=F, GOLD→GC=F, SPX→^GSPC, FX, stocks/ETFs when a Yahoo ticker is supplied).
/price <SYMBOL> [duration]Quick command wrapper for Telegram/gateway. Prints text + verify + MEDIA:<png>.
python3 {baseDir}/scripts/price_quick.py <SYMBOL> [duration]
/spaghetti <SYMBOL...> [duration]Multi-asset normalized line chart. Use for comparing assets over the same period, e.g. SP500 vs GOLD vs SILVER for 6 months. It normalizes every series to 0% at the first candle and plots % change, so different units/prices are comparable.
python3 {baseDir}/scripts/get_price_chart.py spaghetti SP500 GOLD SILVER 6mo
python3 {baseDir}/scripts/spaghetti_quick.py SP500 GOLD SILVER 6mo
Aliases: compare, multi, basket are accepted as the first script command. Use comma input too: SP500,GOLD,SILVER 6mo.
/hype [duration]Built-in alias command owned by this same skill. It must remain inside crypto-price, not a separate hype skill.
python3 {baseDir}/scripts/hype_quick.py [duration]
The alias delegates to:
python3 {baseDir}/scripts/get_price_chart.py HYPE [duration]
Every generated chart image must include the bottom-right public attribution watermark: Telegram: @human20. Keep this in both standard candlestick/volume charts and spaghetti comparison charts.
Duration: минуты/часы/дни/недели/месяцы. Компактный формат <число>[m|h|d|w|mo], без суффикса = часы. Примеры: 30m, 2h, 3h, 12h, 24h, 2d, 1w, 2weeks, 1mo, 2months; также поддерживаются раздельные формы вроде 1 week, 2 months, 30 мин, 3 часа, 1 месяц. Месяц считается как 30 дней. Default: 24h.
modules/source-routing/SKILL.mdmodules/price-chart/SKILL.mdmodules/ops-fallback/SKILL.mdreferences/hyperliquid-symbol-map.mdreferences/hip3-tradexyz-tickers.mdreferences/protocol-revenue-yield-checks.mdDo not conclude that a non-crypto asset is absent from Hyperliquid after checking only the default perp universe (metaAndAssetCtxs) and spot universe (spotMetaAndAssetCtxs). HIP-3 builder-deployed markets live under perp dex names and use fully-qualified symbols like xyz:SILVER.
Correct lookup order for /price <symbol>:
perpDexs to discover HIP-3 dexes.metaAndAssetCtxs with dex=<name> and match the market name or alias.dex:ticker coin string, e.g. xyz:SILVER, not bare SILVER.Alias examples from TradeXYZ/HIP-3: SILVER→xyz:SILVER, GOLD→xyz:GOLD, SPX/SP500→xyz:SP500, NASDAQ/NDX→xyz:XYZ100, WTI→xyz:CL, BRENT→xyz:BRENTOIL. See references/hip3-tradexyz-tickers.md before changing source routing.
When the user asks to confirm crypto revenue claims (+25% annual revenue, reserve-yield share, token fundamental impact), do not stop at web-search summaries. Use direct data APIs where possible, then recalculate the claim explicitly:
supply * reserve_yield * protocol_share / annualized_revenueReturn ranges and label them as back-of-envelope unless the team published official guidance. For details and a Hyperliquid/Coinbase/Circle worked example, see references/protocol-revenue-yield-checks.md.
If a token-specific slash alias (for example /hype) uses Hermes quick_commands with type: exec, keep the alias inside this crypto-price skill and point the quick command to this skill's wrapper (scripts/hype_quick.py). The alias config must forward duration arguments (append_args: true) or expose HERMES_COMMAND_ARGS to the wrapper. Otherwise /alias 2h can call this script without 2h and return a default-period chart while looking superficially successful. See hermes-agent → references/gateway-quick-commands.md for the gateway mechanics.
Всегда вернуть:
symbol и durationprice и change_period_percent (или error)chart_path (если есть)text_plain без лишнего форматированияЕсли chart_path присутствует, нужно приложить PNG вместе с text_plain.
message tool как файл (filePath/path = chart_path).message action=send отвечай только NO_REPLY, чтобы не было дубля.MEDIA: для файлов из /tmp в Telegram, это может не прикрепиться.MEDIA:<path> (например send_message без отдельного filePath), сначала скопируй PNG из /tmp в устойчивый путь вроде /home/hermes/workspace/artifacts/crypto_chart_<SYMBOL>_<ts>.png, проверь test -s/размер, затем отправь MEDIA:<persistent_path>. Если текст+media одним сообщением таймаутится, отправь сначала короткий caption/verify, затем отдельное media-сообщение, и всё равно финаль NO_REPLY.MEDIA: оставляй только как запасной вариант для web/local render, когда message tool не нужен.If user shows a duplicated caption (HYPE... + verify... repeated under one chart), do not start by rewriting the price script. First check layers:
python3 scripts/get_price_chart.py HYPE <duration> and confirm JSON contains one text_plain, one verify, and one chart_path.MEDIA: + final response, or missing NO_REPLY after message tool.has_media=true/photo and the price text as caption, and message B has has_media=false with the same text, this is OpenClaw delivery dedupe treating text+media and final text-only as different payloads.reply-delivery.ts, agent-runner-payloads.ts, and block-reply-pipeline.ts; the durable fix is to suppress a later text-only final payload when the same text was already delivered as a media caption. See references/openclaw-media-caption-dedupe.md.matplotlib inside _build_chart. If JSON returns chart_path: null while candles exist, first verify the Python environment used by the gateway/quick command:
/opt/hermes-agent/venv/bin/python3 - <<'PY'
import matplotlib
print(matplotlib.__version__)
PY
/opt/hermes-agent/venv/bin/python3 -m pip install matplotlib
/opt/hermes-agent/venv/bin/python3 /home/hermes/.hermes/skills/crypto-price/scripts/get_price_chart.py HYPE 24h
/opt/hermes-agent/venv/bin/python3 /home/hermes/.hermes/skills/crypto-price/scripts/get_price_chart.py BTCpython3 /home/hermes/.hermes/skills/crypto-price/scripts/get_price_chart.py HYPE 12hpython3 /home/hermes/.hermes/skills/crypto-price/scripts/get_price_chart.py HYPE 2h returns duration: "2h", text_plain says over 2h, and chart_path points to an existing PNG.python3 /home/hermes/.hermes/skills/crypto-price/scripts/get_price_chart.py HYPE 1w returns duration: "1w" and a week-scale chart.python3 /home/hermes/.hermes/skills/crypto-price/scripts/get_price_chart.py HYPE 1mo returns duration: "1mo" and a month-scale chart.HERMES_COMMAND_ARGS='1 week' /opt/hermes-agent/venv/bin/python3 /home/hermes/.hermes/skills/crypto-price/scripts/hype_quick.py prints over 1w and MEDIA:<png>.price|change_period_percent|text_plain при success2h, visually verify the chart spans the requested duration, not a trimmed subset. The chart builder must not cut the requested candle window for “breathing room”; use the full duration for both change calculation and x-axis.text_plain используется как есть (без дополнительной разметки)SKILL.md has valid frontmatter and command contract.scripts/get_price_chart.py HYPE 12h returns JSON with symbol, duration, price, change_period_percent, text_plain, and optional chart_path.chart_path is returned, the PNG exists and can be attached by the chat channel.~/.hermes/skills/crypto-price may not be git worktrees. The canonical public repo is https://github.com/evgyur/crypto-price.git..github/workflows, docs, .clawdhub, fonts, and publish files.origin/HEAD; currently master) unless the user asks for another branch.git ls-remote/remote-head match and, if GitHub Actions are configured, poll the latest workflow run until success or report the failure explicitly.python3 {baseDir}/scripts/get_price_chart.py <SYMBOL> [duration] сохранёнreferences/legacy-SKILL.mdduration, и duration_label; некоторые OpenClaw command aliases and chat delivery checks look for duration explicitly.scripts/price_quick.py: generic /price <SYMBOL> [duration] wrapper; parses argv and HERMES_COMMAND_ARGS, prints text_plain, verify line, and MEDIA:<png>.scripts/spaghetti_quick.py: /spaghetti <SYMBOL...> [duration] wrapper for normalized multi-asset comparison charts; default is SP500 GOLD SILVER 6mo./hype in OpenClaw/Hermes must remain a thin alias command inside this same crypto-price skill that delegates to crypto-price/scripts/get_price_chart.py HYPE [duration]; do not create or maintain a separate hype skill.2h and captioned over 2h, but then trimmed candles to 80% for chart “breathing room”, so the chart/change used ~96 minutes. Do not trim requested-duration candles; if visual padding is needed, adjust axis margins only, not data selection.tools
Resolve token source path (Hyperliquid vs CoinGecko) and duration parsing.
tools
Fetch current price + period delta + candlestick chart artifact.
development
Handle API rate limits, source failures, and user-safe error output.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.