mirror of
https://github.com/himself65/finance-skills.git
synced 2026-09-14 14:40:40 +08:00
8072082fda
* feat: add hyperliquid-reader skill + opencli plugin Add a read-only Hyperliquid (app.hyperliquid.xyz) reader, mirroring the tradingview-reader pattern. Unlike TradingView's CDP attach, Hyperliquid exposes a fully public info API (POST https://api.hyperliquid.xyz/info), so this needs no API key, wallet, login, or desktop app. opencli plugin (opencli-plugins/hyperliquid/) — 12 read-only commands: - Market data: markets, spot-markets, mids, book, candles, funding-history, funding-compare (cross-venue HL/Binance/Bybit funding-arb screen). - Account by 0x address: account, positions, spot-balances, open-orders, fills. Skill (plugins/data-providers/skills/hyperliquid-reader/) — SKILL.md (5-step + error reference), README.md, references/commands.md. Registrations: root opencli-plugin.json, data-providers plugin.json (description + keywords), marketplace.json, root README table. Verification: 31 unit tests pass against captured live wire shapes; all 12 command data paths smoke-tested end-to-end against the live API. SKILL.md description is 1019 chars (< 1024 lint cap), no angle brackets. No trade execution: the plugin exposes no write/exchange endpoints. 🤖 Generated with [Claude Code](https://claude.com/claude-code) * refactor: scope hyperliquid-reader to market data only Drop the account-by-address commands (account, positions, spot-balances, open-orders, fills) and their lib/account.js + lib/orders.js helpers and tests. Remove the now-unused normalizeAddress helper from lib/api.js. The reader is now market-data only: markets, spot-markets, mids, book, candles, funding-history, funding-compare (7 commands). Updated SKILL.md, both READMEs, references/commands.md, the plugin/marketplace manifests, and the root README table accordingly. 21 unit tests pass; all 7 market-data data paths re-verified live.
37 lines
1.3 KiB
JavaScript
37 lines
1.3 KiB
JavaScript
/**
|
|
* hyperliquid book — L2 order book snapshot via `l2Book`.
|
|
* Up to `--depth` levels per side; bids first, then asks.
|
|
*/
|
|
|
|
import { cli, Strategy } from '@jackwener/opencli/registry';
|
|
import { infoFetch } from './lib/api.js';
|
|
import { normalizeBook } from './lib/book.js';
|
|
|
|
cli({
|
|
site: 'hyperliquid',
|
|
name: 'book',
|
|
description: 'L2 order book snapshot (top N levels per side) for a coin',
|
|
access: 'read',
|
|
strategy: Strategy.PUBLIC,
|
|
browser: false,
|
|
args: [
|
|
{ name: 'coin', required: true, help: 'Coin or spot pair (e.g. BTC, PURR/USDC)' },
|
|
{ name: 'depth', type: 'int', default: 10, help: 'Levels per side (1-20, default 10)' },
|
|
{ name: 'n-sig-figs', type: 'int', help: 'Price aggregation significant figures (2-5). Omit for full precision.' },
|
|
],
|
|
columns: ['side', 'level', 'px', 'sz', 'orders'],
|
|
func: async (args) => {
|
|
const coin = String(args.coin).trim();
|
|
const body = { type: 'l2Book', coin };
|
|
const nSigFigs = Number(args['n-sig-figs']);
|
|
if (Number.isFinite(nSigFigs)) body.nSigFigs = nSigFigs;
|
|
|
|
const payload = await infoFetch(body);
|
|
const rows = normalizeBook(payload, args.depth);
|
|
if (rows.length === 0) {
|
|
throw new Error(`No order book returned for "${coin}" — check the coin/pair symbol.`);
|
|
}
|
|
return rows;
|
|
},
|
|
});
|