{
  "schemaVersion": "1.0",
  "item": {
    "slug": "pinets",
    "name": "PineTS - PineScript executor",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/alaa-eddine/pinets",
    "canonicalUrl": "https://clawhub.ai/alaa-eddine/pinets",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/pinets",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=pinets",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/pinets"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/pinets",
    "agentPageUrl": "https://openagent3.xyz/skills/pinets/agent",
    "manifestUrl": "https://openagent3.xyz/skills/pinets/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/pinets/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "pinets-cli — Run Pine Script Indicators from the Terminal",
        "body": "pinets is a CLI tool that executes TradingView Pine Script indicators via the PineTS runtime. It outputs structured JSON with calculated indicator values."
      },
      {
        "title": "Installation",
        "body": "# Global install\nnpm install -g pinets-cli\n\n# Or run directly with npx (no install needed)\nnpx pinets-cli run indicator.pine --symbol BTCUSDT -q\n\nVerify (if installed globally):\n\npinets --version\n\nWhen using npx, replace pinets with npx pinets-cli in all examples below."
      },
      {
        "title": "Core command",
        "body": "pinets run [file] [options]\n\nThe indicator can be a file argument or piped from stdin."
      },
      {
        "title": "Data source (one required)",
        "body": "FlagDescription-s, --symbol <ticker>Symbol from Binance (e.g., BTCUSDT, ETHUSDT, SOLUSDT.P for futures)-t, --timeframe <tf>Candle timeframe: 1, 5, 15, 30, 60, 120, 240, 1D, 1W, 1M (default: 60)-d, --data <path>JSON file with candle data (alternative to --symbol)"
      },
      {
        "title": "Output",
        "body": "FlagDescription-o, --output <path>Write to file instead of stdout-f, --format <type>default (plots only) or full (plots + result + marketData)--prettyPretty-print JSON--cleanFilter out null, false, and empty values from plot data--plots <names>Comma-separated list of plot names to include (default: all)-q, --quietSuppress info messages (essential when parsing stdout)"
      },
      {
        "title": "Candle control",
        "body": "FlagDescription-n, --candles <N>Number of output candles (default: 500)-w, --warmup <N>Extra warmup candles excluded from output (default: 0)"
      },
      {
        "title": "Debug",
        "body": "FlagDescription--debugShow transpiled JavaScript code (to stderr)"
      },
      {
        "title": "Run a .pine file with live Binance data",
        "body": "pinets run indicator.pine --symbol BTCUSDT --timeframe 60 --candles 100 -q"
      },
      {
        "title": "Run with warmup (important for long-period indicators)",
        "body": "# EMA 200 needs at least 200 bars to initialize\npinets run ema200.pine -s BTCUSDT -t 1D -n 100 -w 200 -q"
      },
      {
        "title": "Pipe Pine Script from stdin",
        "body": "echo '//@version=5\nindicator(\"RSI\")\nplot(ta.rsi(close, 14), \"RSI\")' | pinets run -s BTCUSDT -t 60 -n 20 -q"
      },
      {
        "title": "Run with custom JSON data",
        "body": "pinets run indicator.pine --data candles.json --candles 50 -q"
      },
      {
        "title": "Save output to file",
        "body": "pinets run rsi.pine -s BTCUSDT -t 60 -o results.json -q"
      },
      {
        "title": "Get full execution context",
        "body": "pinets run indicator.pine -s BTCUSDT -f full -q --pretty"
      },
      {
        "title": "Filter signals with --clean (for signal-based indicators)",
        "body": "# Without --clean: 500 entries, mostly false\npinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 -q\n\n# With --clean: Only actual signals\npinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean -q"
      },
      {
        "title": "Select specific plots with --plots",
        "body": "# Get only RSI, ignore bands\npinets run rsi_bands.pine -s BTCUSDT --plots \"RSI\" -q\n\n# Get only Buy and Sell signals\npinets run signals.pine -s BTCUSDT --plots \"Buy,Sell\" -q\n\n# Combine both: only signals, only true values\npinets run signals.pine -s BTCUSDT --plots \"Buy,Sell\" --clean -q"
      },
      {
        "title": "default format",
        "body": "{\n  \"indicator\": {\n    \"title\": \"RSI\",\n    \"overlay\": false\n  },\n  \"plots\": {\n    \"RSI\": {\n      \"title\": \"RSI\",\n      \"options\": { \"color\": \"#7E57C2\" },\n      \"data\": [\n        { \"time\": 1704067200000, \"value\": 58.23 },\n        { \"time\": 1704070800000, \"value\": 61.45 }\n      ]\n    }\n  }\n}"
      },
      {
        "title": "full format",
        "body": "Adds result (raw return values per bar) and marketData (OHLCV candles) to the default output."
      },
      {
        "title": "JSON data format (for --data)",
        "body": "[\n  {\n    \"openTime\": 1704067200000,\n    \"open\": 42000.5,\n    \"high\": 42500.0,\n    \"low\": 41800.0,\n    \"close\": 42300.0,\n    \"volume\": 1234.56,\n    \"closeTime\": 1704070799999\n  }\n]\n\nRequired fields: open, high, low, close, volume. Recommended: openTime, closeTime."
      },
      {
        "title": "Pine Script quick reference",
        "body": "pinets-cli accepts standard TradingView Pine Script v5+:\n\n//@version=5\nindicator(\"My Indicator\", overlay=false)\n\n// Technical analysis functions\nrsi = ta.rsi(close, 14)\n[macdLine, signalLine, hist] = ta.macd(close, 12, 26, 9)\nsma = ta.sma(close, 20)\nema = ta.ema(close, 9)\nbb_upper = ta.sma(close, 20) + 2 * ta.stdev(close, 20)\n\n// Output — each plot() creates a named entry in the JSON output\nplot(rsi, \"RSI\", color=color.purple)"
      },
      {
        "title": "Important notes",
        "body": "Always use -q when parsing JSON output programmatically.\nWarmup matters: Indicators with long lookback periods (SMA 200, EMA 200) produce NaN for the first N bars. Use --warmup to pre-feed the indicator.\ntime values are Unix timestamps in milliseconds.\nErrors go to stderr with exit code 1.\nThe tool bundles PineTS internally — no additional npm packages are needed at runtime."
      },
      {
        "title": "Warmup recommendations",
        "body": "IndicatorMinimum warmupSMA(N) / EMA(N)NRSI(14)30MACD(12,26,9)50Bollinger Bands(20)30SMA(200)200+\n\nRule of thumb: set warmup to 1.5x-2x the longest lookback period."
      }
    ],
    "body": "pinets-cli — Run Pine Script Indicators from the Terminal\n\npinets is a CLI tool that executes TradingView Pine Script indicators via the PineTS runtime. It outputs structured JSON with calculated indicator values.\n\nInstallation\n# Global install\nnpm install -g pinets-cli\n\n# Or run directly with npx (no install needed)\nnpx pinets-cli run indicator.pine --symbol BTCUSDT -q\n\n\nVerify (if installed globally):\n\npinets --version\n\n\nWhen using npx, replace pinets with npx pinets-cli in all examples below.\n\nCore command\npinets run [file] [options]\n\n\nThe indicator can be a file argument or piped from stdin.\n\nOptions\nData source (one required)\nFlag\tDescription\n-s, --symbol <ticker>\tSymbol from Binance (e.g., BTCUSDT, ETHUSDT, SOLUSDT.P for futures)\n-t, --timeframe <tf>\tCandle timeframe: 1, 5, 15, 30, 60, 120, 240, 1D, 1W, 1M (default: 60)\n-d, --data <path>\tJSON file with candle data (alternative to --symbol)\nOutput\nFlag\tDescription\n-o, --output <path>\tWrite to file instead of stdout\n-f, --format <type>\tdefault (plots only) or full (plots + result + marketData)\n--pretty\tPretty-print JSON\n--clean\tFilter out null, false, and empty values from plot data\n--plots <names>\tComma-separated list of plot names to include (default: all)\n-q, --quiet\tSuppress info messages (essential when parsing stdout)\nCandle control\nFlag\tDescription\n-n, --candles <N>\tNumber of output candles (default: 500)\n-w, --warmup <N>\tExtra warmup candles excluded from output (default: 0)\nDebug\nFlag\tDescription\n--debug\tShow transpiled JavaScript code (to stderr)\nUsage patterns\nRun a .pine file with live Binance data\npinets run indicator.pine --symbol BTCUSDT --timeframe 60 --candles 100 -q\n\nRun with warmup (important for long-period indicators)\n# EMA 200 needs at least 200 bars to initialize\npinets run ema200.pine -s BTCUSDT -t 1D -n 100 -w 200 -q\n\nPipe Pine Script from stdin\necho '//@version=5\nindicator(\"RSI\")\nplot(ta.rsi(close, 14), \"RSI\")' | pinets run -s BTCUSDT -t 60 -n 20 -q\n\nRun with custom JSON data\npinets run indicator.pine --data candles.json --candles 50 -q\n\nSave output to file\npinets run rsi.pine -s BTCUSDT -t 60 -o results.json -q\n\nGet full execution context\npinets run indicator.pine -s BTCUSDT -f full -q --pretty\n\nFilter signals with --clean (for signal-based indicators)\n# Without --clean: 500 entries, mostly false\npinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 -q\n\n# With --clean: Only actual signals\npinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean -q\n\nSelect specific plots with --plots\n# Get only RSI, ignore bands\npinets run rsi_bands.pine -s BTCUSDT --plots \"RSI\" -q\n\n# Get only Buy and Sell signals\npinets run signals.pine -s BTCUSDT --plots \"Buy,Sell\" -q\n\n# Combine both: only signals, only true values\npinets run signals.pine -s BTCUSDT --plots \"Buy,Sell\" --clean -q\n\nOutput structure\ndefault format\n{\n  \"indicator\": {\n    \"title\": \"RSI\",\n    \"overlay\": false\n  },\n  \"plots\": {\n    \"RSI\": {\n      \"title\": \"RSI\",\n      \"options\": { \"color\": \"#7E57C2\" },\n      \"data\": [\n        { \"time\": 1704067200000, \"value\": 58.23 },\n        { \"time\": 1704070800000, \"value\": 61.45 }\n      ]\n    }\n  }\n}\n\nfull format\n\nAdds result (raw return values per bar) and marketData (OHLCV candles) to the default output.\n\nJSON data format (for --data)\n[\n  {\n    \"openTime\": 1704067200000,\n    \"open\": 42000.5,\n    \"high\": 42500.0,\n    \"low\": 41800.0,\n    \"close\": 42300.0,\n    \"volume\": 1234.56,\n    \"closeTime\": 1704070799999\n  }\n]\n\n\nRequired fields: open, high, low, close, volume. Recommended: openTime, closeTime.\n\nPine Script quick reference\n\npinets-cli accepts standard TradingView Pine Script v5+:\n\n//@version=5\nindicator(\"My Indicator\", overlay=false)\n\n// Technical analysis functions\nrsi = ta.rsi(close, 14)\n[macdLine, signalLine, hist] = ta.macd(close, 12, 26, 9)\nsma = ta.sma(close, 20)\nema = ta.ema(close, 9)\nbb_upper = ta.sma(close, 20) + 2 * ta.stdev(close, 20)\n\n// Output — each plot() creates a named entry in the JSON output\nplot(rsi, \"RSI\", color=color.purple)\n\nImportant notes\nAlways use -q when parsing JSON output programmatically.\nWarmup matters: Indicators with long lookback periods (SMA 200, EMA 200) produce NaN for the first N bars. Use --warmup to pre-feed the indicator.\ntime values are Unix timestamps in milliseconds.\nErrors go to stderr with exit code 1.\nThe tool bundles PineTS internally — no additional npm packages are needed at runtime.\nWarmup recommendations\nIndicator\tMinimum warmup\nSMA(N) / EMA(N)\tN\nRSI(14)\t30\nMACD(12,26,9)\t50\nBollinger Bands(20)\t30\nSMA(200)\t200+\n\nRule of thumb: set warmup to 1.5x-2x the longest lookback period."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/alaa-eddine/pinets",
    "publisherUrl": "https://clawhub.ai/alaa-eddine/pinets",
    "owner": "alaa-eddine",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/pinets",
    "downloadUrl": "https://openagent3.xyz/downloads/pinets",
    "agentUrl": "https://openagent3.xyz/skills/pinets/agent",
    "manifestUrl": "https://openagent3.xyz/skills/pinets/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/pinets/agent.md"
  }
}