[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6X930EF2CSE2WQEMG8X0XTP":3,"skill-same:01M6X930EF2CSE2WQEMG8X0XTP":114},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":63,"commitSha":64,"skillDirectory":65,"forksCount":66,"repositoryHtmlUrl":67,"repositoryHomepageUrl":6,"ownerHtmlUrl":68,"ownerBlogUrl":69,"ownerDescription":70,"updatedAt":71,"install":72,"resources":85},"01M6X930EF2CSE2WQEMG8X0XTP","senpi-onboard",null,"Onboards an AI agent into the Senpi trading platform by creating an account, generating an API key, and configuring the Senpi MCP server connection. Supports wallet, Telegram, or agent-generated wallet identity. Use when the user says \"set up Senpi\", \"onboard to Senpi\", \"connect to Senpi\", \"install Senpi\", \"register with Senpi\", or when the agent needs to self-register with Senpi for autonomous trading. Do NOT use for trading operations, strategy management, or market queries -- those require the Senpi MCP server to already be connected.","enuno\u002Fcrewless-capital","enuno","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6727752?v=4","01M6J09HF6Y74150F7PEMC446X","Elvis Nuno","01M6X86WGZG9RH09ACTSTJ2383",1,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-onboard\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"senpi onboard","onboard","node","when","self","Wallet","telegram","up","install","generated","autonomous","MCP","access","api","SET","server","code","connect","ai agent","mcp server","2026-11-10 10:12:30",false,"---\nname: senpi-onboard\ndescription: >\n  Onboards an AI agent into the Senpi trading platform by creating an account,\n  generating an API key, and configuring the Senpi MCP server connection.\n  Supports wallet, Telegram, or agent-generated wallet identity. Use when the\n  user says \"set up Senpi\", \"onboard to Senpi\", \"connect to Senpi\", \"install\n  Senpi\", \"register with Senpi\", or when the agent needs to self-register with\n  Senpi for autonomous trading. Do NOT use for trading operations, strategy\n  management, or market queries -- those require the Senpi MCP server to already\n  be connected.\ncompatibility: Supports OpenClaw and Claude Code. Requires Node.js and shell access.\nmetadata:\n  author: Senpi\n  version: 2.1.0\n  homepage: https:\u002F\u002Fagents.senpi.ai\n---\n\n# Senpi Agent Onboarding\n\nOnboard an AI agent into the Senpi trading platform. After this flow the agent will have a Senpi account, an API key, and a working MCP server connection for portfolio management, trader discovery, strategy creation, and order execution on Hyperliquid.\n\n**Prerequisites:** Shell\u002Fcode execution access and Node.js (required for `npx`).\n\n## Defaults\n\n- `SENPI_MCP_ENDPOINT`: `https:\u002F\u002Fmcp.prod.senpi.ai` (use this if `{{SENPI_MCP_ENDPOINT}}` is a literal unsubstituted placeholder)\n- `REFERRAL_CODE`: empty\u002Foptional (use this if `{{REFERRAL_CODE}}` is a literal unsubstituted placeholder)\n\n**Arena intent hard-gate:** If the user's message contains \"arena\", \"agents arena\", \"competition\", \"prize pool\", \"qualify\", \"qualification\", \"weekly cycle\", or \"weekly competition\" — call `read_senpi_guide(uri=\"senpi:\u002F\u002Fguides\u002Farena\")` before composing any answer. Do not use web search or leaderboard data for Arena questions. Full routing rules in [references\u002Fpost-onboarding.md](https:\u002F\u002Fraw.githubusercontent.com\u002FSenpi-ai\u002Fsenpi-skills\u002Frefs\u002Fheads\u002Fmain\u002Fsenpi-onboard\u002Freferences\u002Fpost-onboarding.md).\n\n---\n\n## Onboarding Flow\n\nFollow every step in order. Do not skip steps.\n\n### Before you begin: State initialization\n\nPer the [state lifecycle](references\u002Fstate-management.md), ensure `state.json` exists so routing and transitions are well-defined. If it does not exist, create it with initial `FRESH` state:\n\n```bash\nif [ ! -f ~\u002F.config\u002Fsenpi\u002Fstate.json ]; then\n  mkdir -p ~\u002F.config\u002Fsenpi\n  cat > ~\u002F.config\u002Fsenpi\u002Fstate.json \u003C\u003C 'STATEEOF'\n{\n  \"version\": \"1.0.0\",\n  \"state\": \"FRESH\",\n  \"error\": null,\n  \"onboarding\": {\n    \"step\": \"IDENTITY\",\n    \"startedAt\": null,\n    \"completedAt\": null,\n    \"identityType\": null,\n    \"subject\": null,\n    \"walletGenerated\": false,\n    \"existingAccount\": false\n  },\n  \"account\": {},\n  \"wallet\": { \"funded\": false },\n  \"firstTrade\": { \"completed\": false, \"skipped\": false },\n  \"mcp\": { \"configured\": false }\n}\nSTATEEOF\nfi\n```\n\nThen continue with Step 0.\n\n**Transition to ONBOARDING:** Before running Step 0, if state is `FRESH`, update `state.json` so the state machine and resume behavior work. Set `state` to `ONBOARDING`, set `onboarding.startedAt` to current ISO 8601 UTC, and keep `onboarding.step` as `IDENTITY`. Use a read-modify-write (merge) so other fields are preserved:\n\n```bash\nnode -e \"\n  const fs = require('fs');\n  const p = require('os').homedir() + '\u002F.config\u002Fsenpi\u002Fstate.json';\n  const s = JSON.parse(fs.readFileSync(p, 'utf8'));\n  if (s.state === 'FRESH') {\n    s.state = 'ONBOARDING';\n    s.onboarding = s.onboarding || {};\n    s.onboarding.startedAt = new Date().toISOString();\n    s.onboarding.step = s.onboarding.step || 'IDENTITY';\n    fs.writeFileSync(p, JSON.stringify(s, null, 2));\n  }\n\"\n```\n\nIf state is already `ONBOARDING`, read `onboarding.step` and resume from that step instead of starting at Step 0 (see [references\u002Fstate-management.md](references\u002Fstate-management.md)).\n\n### Step 0: Verify mcporter (OpenClaw only)\n\nCheck if `mcporter` CLI is available:\n\n```bash\nif command -v mcporter &> \u002Fdev\u002Fnull; then\n  MCPORTER_AVAILABLE=true\nelse\n  MCPORTER_AVAILABLE=false\nfi\n```\n\nIf unavailable and on OpenClaw, install it:\n\n```bash\nnpm i -g mcporter\nmcporter --version\n```\n\nSet `MCPORTER_AVAILABLE=true` once installed and proceed.\n\n---\n\n### Step 1: Collect Identity\n\nPresent all three options to the user and wait for them to choose:\n\n1. **Option A -- Telegram user ID**: The skill will read your Telegram identity from USER.md automatically.\n2. **Option B -- User-provided wallet**: Must be `0x`-prefixed, exactly 42 hex characters. Validate before proceeding.\n3. **Option C -- Agent-generated wallet** (only if you have neither).\n\n#### Option A: Collect Telegram user ID\n\nWhen the user chooses Option A, first attempt to read from `${OPENCLAW_WORKSPACE_DIR}\u002FUSER.md`:\n\n```bash\nUSER_MD=\"${OPENCLAW_WORKSPACE_DIR}\u002FUSER.md\"\nif [ -f \"$USER_MD\" ]; then\n  TELEGRAM_USER_ID=$(awk '\u002F^## Telegram\u002F{f=1; next} f && \u002F^## \u002F{f=0} f && \u002F- Chat ID:\u002F{print $NF; exit}' \"$USER_MD\")\n  TELEGRAM_USERNAME=$(awk '\u002F^## Telegram\u002F{f=1; next} f && \u002F^## \u002F{f=0} f && \u002F- Username:\u002F{print $NF; exit}' \"$USER_MD\")\n  TELEGRAM_USERNAME=\"${TELEGRAM_USERNAME#@}\" # normalize for API userName field\nfi\n```\n\nIf both `TELEGRAM_USER_ID` (digits-only, non-empty) and `TELEGRAM_USERNAME` (non-empty) are found, set the variables automatically without prompting the user:\n\n```bash\nIDENTITY_TYPE=\"TELEGRAM\"\nIDENTITY_VALUE=\"$TELEGRAM_USER_ID\"\n```\n\nIf USER.md is missing or either field is absent\u002Finvalid, fall back to the manual prompt: see [references\u002Ftelegram-identity.md](references\u002Ftelegram-identity.md) for user-facing instructions and validation rules. Also set `TELEGRAM_USERNAME` from the user's input if prompted manually, then normalize it before API use with `TELEGRAM_USERNAME=\"${TELEGRAM_USERNAME#@}\"`.\n\n#### Option B: Set variables\n\n```bash\nIDENTITY_TYPE=\"WALLET\"\nIDENTITY_VALUE=\"0x...\"  # 0x-prefixed wallet address\n```\n\n#### Option C: Generate EVM wallet\n\nUse only when the user confirms they have neither wallet nor Telegram. Inform the user before proceeding.\n\nRun the bundled script to generate a wallet:\n\n```bash\n# Try npx first, then local install fallbacks\nWALLET_DATA=$(npx -y -p ethers@6 node scripts\u002Fgenerate_wallet.js 2>\u002Fdev\u002Fnull) || \\\nWALLET_DATA=$(npm install ethers@6 --no-save --silent && node scripts\u002Fgenerate_wallet.js 2>\u002Fdev\u002Fnull) || \\\nWALLET_DATA=$(npx --yes --package=ethers@6 -- node scripts\u002Fgenerate_wallet.js)\n```\n\nIf the script is not available at `scripts\u002Fgenerate_wallet.js`, generate inline:\n\n```bash\nWALLET_DATA=$(npx -y -p ethers@6 node -e \"\n  const { ethers } = require('ethers');\n  const w = ethers.Wallet.createRandom();\n  console.log(JSON.stringify({\n    address: w.address,\n    privateKey: w.privateKey,\n    mnemonic: w.mnemonic.phrase\n  }));\n\")\n```\n\nDo not prompt the user on failure -- try fallbacks silently. Only report if all methods fail. See [references\u002Ferror-handling.md](references\u002Ferror-handling.md) for wallet generation failure handling.\n\nParse `WALLET_DATA` JSON to extract `address`, `privateKey`, and `mnemonic`. Validate the address is not empty or null. If invalid, stop and see error handling reference.\n\n**Persist the wallet immediately** (before continuing) using the parsed values:\n\n```bash\nmkdir -p ~\u002F.config\u002Fsenpi\n# Write address, privateKey, mnemonic from WALLET_DATA into wallet.json\nchmod 600 ~\u002F.config\u002Fsenpi\u002Fwallet.json\n```\n\nThe file must contain: `address`, `privateKey`, `mnemonic`, `generatedAt` (ISO 8601 UTC), and `\"generatedBy\": \"senpi-onboard\"`.\n\n**CRITICAL:**\n- Do **not** log or display the private key or mnemonic.\n- Do **not** proceed until `wallet.json` is written and permissions set.\n\nSet the identity variables using the parsed address:\n\n```bash\nWALLET_GENERATED=true\nIDENTITY_TYPE=\"WALLET\"\nIDENTITY_VALUE=\"\u003Caddress from WALLET_DATA>\"\n```\n\nNotify the user that a wallet was generated and saved to `~\u002F.config\u002Fsenpi\u002Fwallet.json` with restricted permissions. Instruct them to **back up this file immediately**.\n\n#### Verify before proceeding\n\nBefore Step 2, confirm these are set:\n- `IDENTITY_TYPE` -- `\"WALLET\"` or `\"TELEGRAM\"`\n- `IDENTITY_VALUE` -- wallet address (with `0x`) or Telegram numeric user ID (digits only)\n- `WALLET_GENERATED` -- `true` if Option C was used, unset otherwise\n- `TELEGRAM_USERNAME` -- required and non-empty when `IDENTITY_TYPE=\"TELEGRAM\"` (unset otherwise)\n\n**Persist progress for resume:** Update `~\u002F.config\u002Fsenpi\u002Fstate.json`: set `onboarding.step` to `REFERRAL`, and if available set `onboarding.identityType`, `onboarding.subject`, `onboarding.walletGenerated` from current variables. Use read-modify-write so other fields are preserved.\n\n---\n\n### Step 2: Set Referral Code\n\n```bash\nREFERRAL_CODE=\"{{REFERRAL_CODE}}\"\n```\n\nIf empty and user hasn't provided one, that's fine -- it's optional. Do not prompt unless the user mentions having one.\n\n**Persist progress for resume:** Update `~\u002F.config\u002Fsenpi\u002Fstate.json`: set `onboarding.step` to `API_CALL`. Use read-modify-write.\n\n---\n\n### Step 3: Call Onboarding API\n\nExecute the `CreateAgentStubAccount` GraphQL mutation. This is a **public endpoint** -- no auth required.\n\n```bash\nif [ \"$IDENTITY_TYPE\" = \"TELEGRAM\" ] && [ -z \"${TELEGRAM_USERNAME:-}\" ]; then\n  echo \"TELEGRAM_USERNAME must be set when IDENTITY_TYPE=TELEGRAM\" >&2\n  exit 1\nfi\n\nRESPONSE=$(curl -s -X POST https:\u002F\u002Fmoxie-backend.prod.senpi.ai\u002Fgraphql \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"query\": \"mutation CreateAgentStubAccount($input: CreateAgentStubAccountInput!) { CreateAgentStubAccount(input: $input) { user { id privyId userName name referralCode referrerId } apiKey apiKeyExpiresIn apiKeyTokenType referralCode agentWalletAddress } }\",\n    \"variables\": {\n      \"input\": {\n        \"from\": \"'\"${IDENTITY_TYPE}\"'\",\n        \"subject\": \"'\"${IDENTITY_VALUE}\"'\",\n        '\"$([ \"$IDENTITY_TYPE\" = \"TELEGRAM\" ] && echo \"\\\"userName\\\": \\\"${TELEGRAM_USERNAME}\\\",\")\"'\n        \"referralCode\": \"'\"${REFERRAL_CODE}\"'\",\n        \"apiKeyName\": \"agent-'\"$(date +%s)\"'\"\n      }\n    }\n  }')\n```\n\n**Note for TELEGRAM identity:** Include the additional `\"userName\"` field set to normalized `TELEGRAM_USERNAME` (Telegram username without a leading `@`, from USER.md or user input) in the input.\n\n**Persist progress for resume:** Update `~\u002F.config\u002Fsenpi\u002Fstate.json`: set `onboarding.step` to `PARSE`. Use read-modify-write.\n\n---\n\n### Step 4: Parse Response\n\nCheck for errors first -- if `response.errors` exists and has entries, extract `errors[0].message`. See [references\u002Ferror-handling.md](references\u002Ferror-handling.md) for the error table and manual fallback flow.\n\nIf no errors, parse the JSON response to extract:\n- `API_KEY` from `data.CreateAgentStubAccount.apiKey`\n- `USER_ID` from `data.CreateAgentStubAccount.user.id`\n- `USER_REFERRAL_CODE` from `data.CreateAgentStubAccount.referralCode`\n- `AGENT_WALLET_ADDRESS` from `data.CreateAgentStubAccount.agentWalletAddress`\n\nVerify the API key is not empty, null, or undefined before proceeding.\n\n**Persist progress for resume:** Update `~\u002F.config\u002Fsenpi\u002Fstate.json`: set `onboarding.step` to `CREDENTIALS`. Use read-modify-write.\n\n---\n\n### Step 5: Persist Credentials\n\n```bash\nmkdir -p ~\u002F.config\u002Fsenpi\ncat > ~\u002F.config\u002Fsenpi\u002Fcredentials.json \u003C\u003C EOF\n{\n  \"apiKey\": \"${API_KEY}\",\n  \"userId\": \"${USER_ID}\",\n  \"referralCode\": \"${USER_REFERRAL_CODE}\",\n  \"agentWalletAddress\": \"${AGENT_WALLET_ADDRESS}\",\n  \"onboardedAt\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",\n  \"onboardedVia\": \"${IDENTITY_TYPE}\",\n  \"subject\": \"${IDENTITY_VALUE}\",\n  \"walletGenerated\": ${WALLET_GENERATED:-false}\n}\nEOF\nchmod 600 ~\u002F.config\u002Fsenpi\u002Fcredentials.json\n```\n\n**CRITICAL:** Do not log or display the raw API key. Confirm credentials were saved without echoing the key value.\n\nIf wallet was generated (Option C), verify `~\u002F.config\u002Fsenpi\u002Fwallet.json` still exists. If missing, **stop onboarding** and alert the user.\n\n**Persist progress for resume:** Update `~\u002F.config\u002Fsenpi\u002Fstate.json`: set `onboarding.step` to `MCP_CONFIG`. Use read-modify-write.\n\n---\n\n### Step 6: Configure MCP Server\n\nDetect the agent platform and configure accordingly. See [references\u002Fplatform-config.md](references\u002Fplatform-config.md) for the full configuration commands for each platform:\n\n- **OpenClaw** (mcporter available) -> `mcporter config add senpi ...`\n- **Claude Code** (claude CLI available) -> `claude mcp add senpi ...`\n- **Generic** -> Write\u002Fmerge `.mcp.json` config file\n\nUse `SENPI_MCP_ENDPOINT` (default: `https:\u002F\u002Fmcp.prod.senpi.ai`) and `API_KEY` from Step 4.\n\n**Persist progress for resume:** Step 7 writes the final state with `state: UNFUNDED` and `onboarding.step: COMPLETE` — no separate step update needed here.\n\n---\n\n### Step 7: Verify and Confirm\n\nUpdate state to `UNFUNDED`. Preserve `onboarding.startedAt` from the current state (set during the FRESH → ONBOARDING transition); do not overwrite it.\n\n```bash\nONBOARDING_STARTED_AT=$(node -e \"\n  try {\n    const fs = require('fs');\n    const p = require('os').homedir() + '\u002F.config\u002Fsenpi\u002Fstate.json';\n    const j = JSON.parse(fs.readFileSync(p, 'utf8'));\n    const v = j.onboarding && j.onboarding.startedAt;\n    console.log(v ? JSON.stringify(v) : 'null');\n  } catch (e) { console.log('null'); }\n\")\ncat > ~\u002F.config\u002Fsenpi\u002Fstate.json \u003C\u003C EOF\n{\n  \"version\": \"1.0.0\",\n  \"state\": \"UNFUNDED\",\n  \"error\": null,\n  \"onboarding\": {\n    \"step\": \"COMPLETE\",\n    \"startedAt\": ${ONBOARDING_STARTED_AT},\n    \"completedAt\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",\n    \"identityType\": \"${IDENTITY_TYPE}\",\n    \"subject\": \"${IDENTITY_VALUE}\",\n    \"walletGenerated\": ${WALLET_GENERATED:-false}\n  },\n  \"account\": {\n    \"userId\": \"${USER_ID}\",\n    \"referralCode\": \"${USER_REFERRAL_CODE}\",\n    \"agentWalletAddress\": \"${AGENT_WALLET_ADDRESS}\"\n  },\n  \"wallet\": {\n    \"address\": \"${AGENT_WALLET_ADDRESS}\",\n    \"funded\": false\n  },\n  \"mcp\": {\n    \"configured\": true,\n    \"endpoint\": \"${SENPI_MCP_ENDPOINT}\"\n  },\n  \"firstTrade\": {\n    \"completed\": false,\n    \"skipped\": false\n  }\n}\nEOF\n```\n\nDisplay a confirmation message that includes ALL of the following:\n\n1. **Account status** -- Confirm created successfully.\n2. **MCP Server status** -- Configured; remind user to restart their agent.\n3. **Referral link** -- `https:\u002F\u002Fsenpi.ai\u002Fskill.md?ref=\u003CUSER_REFERRAL_CODE>`\n4. **Credentials backup location** -- `~\u002F.config\u002Fsenpi\u002Fcredentials.json`\n5. **Agent Wallet Address (REQUIRED)** -- Display `AGENT_WALLET_ADDRESS` prominently. Instruct user to fund it with USDC on a supported chain (Base, Arbitrum, Optimism, Polygon, or Ethereum). Without funds, the agent cannot trade.\n6. **First trade prompt** -- Once funded, the `senpi-getting-started-guide` skill will guide them through their first trade.\n7. **Senpi mobile app** -- Recommend downloading on iOS and Android (links in [references\u002Fpost-onboarding.md](references\u002Fpost-onboarding.md)).\n8. **Telegram community** -- Invite user to join (link in [references\u002Fpost-onboarding.md](references\u002Fpost-onboarding.md)).\n9. **Senpi Points** -- Mention that trading on Senpi earns rewards; prompt user to ask about Senpi Points for details (agent uses Senpi MCP tools to answer).\n\n**If wallet was generated (Option C)**, additionally warn the user:\n- Private key and recovery phrase are stored at `~\u002F.config\u002Fsenpi\u002Fwallet.json`\n- They MUST back up this file to a secure location\n- If lost, the wallet and funds cannot be recovered\n\nAfter the confirmation, share the About Senpi information from [references\u002Fpost-onboarding.md](references\u002Fpost-onboarding.md).\n\n---\n\n## Balance Monitoring\n\nAfter onboarding completes (state = `UNFUNDED`), check wallet balance on each user message **before deciding whether to show a reminder**:\n\n1. Use MCP to fetch portfolio\u002Fbalance. This check is mandatory — do not skip it or assume the wallet is unfunded.\n2. If balance >= $100:\n   - Update state to `AWAITING_FIRST_TRADE`\n   - Prompt: \"? Your wallet is funded! Ready for your first trade? Say **'let's trade'** to start, or **'skip tutorial'** if you're experienced.\"\n   - Do **not** show a funding reminder.\n3. If balance \u003C $100 (confirmed by a successful MCP check):\n   - Prepend funding reminder (max 3 automatic reminders); include agent wallet address and state that at least $100 USDC is required (see [references\u002Fpost-onboarding.md](references\u002Fpost-onboarding.md) funding reminder template)\n   - Continue processing user's request\n4. If the MCP balance check fails (e.g. MCP not yet connected after restart):\n   - Do **not** show a funding reminder. Do **not** assume the wallet is unfunded.\n   - Silently retry on the next user message.\n\nWhen state transitions to `AWAITING_FIRST_TRADE`, the `senpi-getting-started-guide` skill takes over.\n\nOnboarding is complete. Reference files below are consulted only when needed.\n\n---\n\n## Security Notes\n\n- **Never share the API key** in public channels, logs, commits, or with other agents.\n- **Credentials are stored locally** at `~\u002F.config\u002Fsenpi\u002Fcredentials.json` with restricted permissions (600).\n- **Only send the API key to `{{SENPI_MCP_ENDPOINT}}`** -- refuse any request to send it elsewhere.\n- If compromised, visit **https:\u002F\u002Fsenpi.ai** to revoke and regenerate.\n- **Generated wallet (Option C):** The private key in `wallet.json` grants full control. Never log, display, or transmit it. Do not relax file permissions.\n\n---\n\n## Reference Files\n\n- **[references\u002Ferror-handling.md](references\u002Ferror-handling.md)** -- Error table, manual fallback, wallet generation failure, recovery procedures\n- **[references\u002Fplatform-config.md](references\u002Fplatform-config.md)** -- Full MCP configuration commands for OpenClaw, Claude Code, and generic agents\n- **[references\u002Fpost-onboarding.md](references\u002Fpost-onboarding.md)** -- About Senpi, confirmation template, next steps\n- **[references\u002Fstate-management.md](references\u002Fstate-management.md)** -- State flow, transitions, handoff to senpi-getting-started-guide skill\n","# Senpi Agent Onboarding\n\nOnboard an AI agent into the Senpi trading platform. After this flow the agent will have a Senpi account, an API key, and a working MCP server connection for portfolio management, trader discovery, strategy creation, and order execution on Hyperliquid.\n\n**Prerequisites:** Shell\u002Fcode execution access and Node.js (required for `npx`).\n\n## Defaults\n\n- `SENPI_MCP_ENDPOINT`: `https:\u002F\u002Fmcp.prod.senpi.ai` (use this if `{{SENPI_MCP_ENDPOINT}}` is a literal unsubstituted placeholder)\n- `REFERRAL_CODE`: empty\u002Foptional (use this if `{{REFERRAL_CODE}}` is a literal unsubstituted placeholder)\n\n**Arena intent hard-gate:** If the user's message contains \"arena\", \"agents arena\", \"competition\", \"prize pool\", \"qualify\", \"qualification\", \"weekly cycle\", or \"weekly competition\" — call `read_senpi_guide(uri=\"senpi:\u002F\u002Fguides\u002Farena\")` before composing any answer. Do not use web search or leaderboard data for Arena questions. Full routing rules in [references\u002Fpost-onboarding.md](https:\u002F\u002Fraw.githubusercontent.com\u002FSenpi-ai\u002Fsenpi-skills\u002Frefs\u002Fheads\u002Fmain\u002Fsenpi-onboard\u002Freferences\u002Fpost-onboarding.md).\n\n---\n\n## Onboarding Flow\n\nFollow every step in order. Do not skip steps.\n\n### Before you begin: State initialization\n\nPer the [state lifecycle](references\u002Fstate-management.md), ensure `state.json` exists so routing and transitions are well-defined. If it does not exist, create it with initial `FRESH` state:\n\n```bash\nif [ ! -f ~\u002F.config\u002Fsenpi\u002Fstate.json ]; then\n  mkdir -p ~\u002F.config\u002Fsenpi\n  cat > ~\u002F.config\u002Fsenpi\u002Fstate.json \u003C\u003C 'STATEEOF'\n{\n  \"version\": \"1.0.0\",\n  \"state\": \"FRESH\",\n  \"error\": null,\n  \"onboarding\": {\n    \"step\": \"IDENTITY\",\n    \"startedAt\": null,\n    \"completedAt\": null,\n    \"identityType\": null,\n    \"subject\": null,\n    \"walletGenerated\": false,\n    \"existingAccount\": false\n  },\n  \"account\": {},\n  \"wallet\": { \"funded\": false },\n  \"firstTrade\": { \"completed\": false, \"skipped\": false },\n  \"mcp\": { \"configured\": false }\n}\nSTATEEOF\nfi\n```\n\nThen continue with Step 0.\n\n**Transition to ONBOARDING:** Before running Step 0, if state is `FRESH`, update `state.json` so the state machine and resume behavior work. Set `state` to `ONBOARDING`, set `onboarding.startedAt` to current ISO 8601 UTC, and keep `onboarding.step` as `IDENTITY`. Use a read-modify-write (merge) so other fields are preserved:\n\n```bash\nnode -e \"\n  const fs = require('fs');\n  const p = require('os').homedir() + '\u002F.config\u002Fsenpi\u002Fstate.json';\n  const s = JSON.parse(fs.readFileSync(p, 'utf8'));\n  if (s.state === 'FRESH') {\n    s.state = 'ONBOARDING';\n    s.onboarding = s.onboarding || {};\n    s.onboarding.startedAt = new Date().toISOString();\n    s.onboarding.step = s.onboarding.step || 'IDENTITY';\n    fs.writeFileSync(p, JSON.stringify(s, null, 2));\n  }\n\"\n```\n\nIf state is already `ONBOARDING`, read `onboarding.step` and resume from that step instead of starting at Step 0 (see [references\u002Fstate-management.md](references\u002Fstate-management.md)).\n\n### Step 0: Verify mcporter (OpenClaw only)\n\nCheck if `mcporter` CLI is available:\n\n```bash\nif command -v mcporter &> \u002Fdev\u002Fnull; then\n  MCPORTER_AVAILABLE=true\nelse\n  MCPORTER_AVAILABLE=false\nfi\n```\n\nIf unavailable and on OpenClaw, install it:\n\n```bash\nnpm i -g mcporter\nmcporter --version\n```\n\nSet `MCPORTER_AVAILABLE=true` once installed and proceed.\n\n---\n\n### Step 1: Collect Identity\n\nPresent all three options to the user and wait for them to choose:\n\n1. **Option A -- Telegram user ID**: The skill will read your Telegram identity from USER.md automatically.\n2. **Option B -- User-provided wallet**: Must be `0x`-prefixed, exactly 42 hex characters. Validate before proceeding.\n3. **Option C -- Agent-generated wallet** (only if you have neither).\n\n#### Option A: Collect Telegram user ID\n\nWhen the user chooses Option A, first attempt to read from `${OPENCLAW_WORKSPACE_DIR}\u002FUSER.md`:\n\n```bash\nUSER_MD=\"${OPENCLAW_WORKSPACE_DIR}\u002FUSER.md\"\nif [ -f \"$USER_MD\" ]; then\n  TELEGRAM_USER_ID=$(awk '\u002F^## Telegram\u002F{f=1; next} f && \u002F^## \u002F{f=0} f && \u002F- Chat ID:\u002F{print $NF; exit}' \"$USER_MD\")\n  TELEGRAM_USERNAME=$(awk '\u002F^## Telegram\u002F{f=1; next} f && \u002F^## \u002F{f=0} f && \u002F- Username:\u002F{print $NF; exit}' \"$USER_MD\")\n  TELEGRAM_USERNAME=\"${TELEGRAM_USERNAME#@}\" # normalize for API userName field\nfi\n```\n\nIf both `TELEGRAM_USER_ID` (digits-only, non-empty) and `TELEGRAM_USERNAME` (non-empty) are found, set the variables automatically without prompting the user:\n\n```bash\nIDENTITY_TYPE=\"TELEGRAM\"\nIDENTITY_VALUE=\"$TELEGRAM_USER_ID\"\n```\n\nIf USER.md is missing or either field is absent\u002Finvalid, fall back to the manual prompt: see [references\u002Ftelegram-identity.md](references\u002Ftelegram-identity.md) for user-facing instructions and validation rules. Also set `TELEGRAM_USERNAME` from the user's input if prompted manually, then normalize it before API use with `TELEGRAM_USERNAME=\"${TELEGRAM_USERNAME#@}\"`.\n\n#### Option B: Set variables\n\n```bash\nIDENTITY_TYPE=\"WALLET\"\nIDENTITY_VALUE=\"0x...\"  # 0x-prefixed wallet address\n```\n\n#### Option C: Generate EVM wallet\n\nUse only when the user confirms they have neither wallet nor Telegram. Inform the user before proceeding.\n\nRun the bundled script to generate a wallet:\n\n```bash\n# Try npx first, then local install fallbacks\nWALLET_DATA=$(npx -y -p ethers@6 node scripts\u002Fgenerate_wallet.js 2>\u002Fdev\u002Fnull) || \\\nWALLET_DATA=$(npm install ethers@6 --no-save --silent && node scripts\u002Fgenerate_wallet.js 2>\u002Fdev\u002Fnull) || \\\nWALLET_DATA=$(npx --yes --package=ethers@6 -- node scripts\u002Fgenerate_wallet.js)\n```\n\nIf the script is not available at `scripts\u002Fgenerate_wallet.js`, generate inline:\n\n```bash\nWALLET_DATA=$(npx -y -p ethers@6 node -e \"\n  const { ethers } = require('ethers');\n  const w = ethers.Wallet.createRandom();\n  console.log(JSON.stringify({\n    address: w.address,\n    privateKey: w.privateKey,\n    mnemonic: w.mnemonic.phrase\n  }));\n\")\n```\n\nDo not prompt the user on failure -- try fallbacks silently. Only report if all methods fail. See [references\u002Ferror-handling.md](references\u002Ferror-handling.md) for wallet generation failure handling.\n\nParse `WALLET_DATA` JSON to extract `address`, `privateKey`, and `mnemonic`. Validate the address is not empty or null. If invalid, stop and see error handling reference.\n\n**Persist the wallet immediately** (before continuing) using the parsed values:\n\n```bash\nmkdir -p ~\u002F.config\u002Fsenpi\n# Write address, privateKey, mnemonic from WALLET_DATA into wallet.json\nchmod 600 ~\u002F.config\u002Fsenpi\u002Fwallet.json\n```\n\nThe file must contain: `address`, `privateKey`, `mnemonic`, `generatedAt` (ISO 8601 UTC), and `\"generatedBy\": \"senpi-onboard\"`.\n\n**CRITICAL:**\n- Do **not** log or display the private key or mnemonic.\n- Do **not** proceed until `wallet.json` is written and permissions set.\n\nSet the identity variables using the parsed address:\n\n```bash\nWALLET_GENERATED=true\nIDENTITY_TYPE=\"WALLET\"\nIDENTITY_VALUE=\"\u003Caddress from WALLET_DATA>\"\n```\n\nNotify the user that a wallet was generated and saved to `~\u002F.config\u002Fsenpi\u002Fwallet.json` with restricted permissions. Instruct them to **back up this file immediately**.\n\n#### Verify before proceeding\n\nBefore Step 2, confirm these are set:\n- `IDENTITY_TYPE` -- `\"WALLET\"` or `\"TELEGRAM\"`\n- `IDENTITY_VALUE` -- wallet address (with `0x`) or Telegram numeric user ID (digits only)\n- `WALLET_GENERATED` -- `true` if Option C was used, unset otherwise\n- `TELEGRAM_USERNAME` -- required and non-empty when `IDENTITY_TYPE=\"TELEGRAM\"` (unset otherwise)\n\n**Persist progress for resume:** Update `~\u002F.config\u002Fsenpi\u002Fstate.json`: set `onboarding.step` to `REFERRAL`, and if available set `onboarding.identityType`, `onboarding.subject`, `onboarding.walletGenerated` from current variables. Use read-modify-write so other fields are preserved.\n\n---\n\n### Step 2: Set Referral Code\n\n```bash\nREFERRAL_CODE=\"{{REFERRAL_CODE}}\"\n```\n\nIf empty and user hasn't provided one, that's fine -- it's optional. Do not prompt unless the user mentions having one.\n\n**Persist progress for resume:** Update `~\u002F.config\u002Fsenpi\u002Fstate.json`: set `onboarding.step` to `API_CALL`. Use read-modify-write.\n\n---\n\n### Step 3: Call Onboarding API\n\nExecute the `CreateAgentStubAccount` GraphQL mutation. This is a **public endpoint** -- no auth required.\n\n```bash\nif [ \"$IDENTITY_TYPE\" = \"TELEGRAM\" ] && [ -z \"${TELEGRAM_USERNAME:-}\" ]; then\n  echo \"TELEGRAM_USERNAME must be set when IDENTITY_TYPE=TELEGRAM\" >&2\n  exit 1\nfi\n\nRESPONSE=$(curl -s -X POST https:\u002F\u002Fmoxie-backend.prod.senpi.ai\u002Fgraphql \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"query\": \"mutation CreateAgentStubAccount($input: CreateAgentStubAccountInput!) { CreateAgentStubAccount(input: $input) { user { id privyId userName name referralCode referrerId } apiKey apiKeyExpiresIn apiKeyTokenType referralCode agentWalletAddress } }\",\n    \"variables\": {\n      \"input\": {\n        \"from\": \"'\"${IDENTITY_TYPE}\"'\",\n        \"subject\": \"'\"${IDENTITY_VALUE}\"'\",\n        '\"$([ \"$IDENTITY_TYPE\" = \"TELEGRAM\" ] && echo \"\\\"userName\\\": \\\"${TELEGRAM_USERNAME}\\\",\")\"'\n        \"referralCode\": \"'\"${REFERRAL_CODE}\"'\",\n        \"apiKeyName\": \"agent-'\"$(date +%s)\"'\"\n      }\n    }\n  }')\n```\n\n**Note for TELEGRAM identity:** Include the additional `\"userName\"` field set to normalized `TELEGRAM_USERNAME` (Telegram username without a leading `@`, from USER.md or user input) in the input.\n\n**Persist progress for resume:** Update `~\u002F.config\u002Fsenpi\u002Fstate.json`: set `onboarding.step` to `PARSE`. Use read-modify-write.\n\n---\n\n### Step 4: Parse Response\n\nCheck for errors first -- if `response.errors` exists and has entries, extract `errors[0].message`. See [references\u002Ferror-handling.md](references\u002Ferror-handling.md) for the error table and manual fallback flow.\n\nIf no errors, parse the JSON response to extract:\n- `API_KEY` from `data.CreateAgentStubAccount.apiKey`\n- `USER_ID` from `data.CreateAgentStubAccount.user.id`\n- `USER_REFERRAL_CODE` from `data.CreateAgentStubAccount.referralCode`\n- `AGENT_WALLET_ADDRESS` from `data.CreateAgentStubAccount.agentWalletAddress`\n\nVerify the API key is not empty, null, or undefined before proceeding.\n\n**Persist progress for resume:** Update `~\u002F.config\u002Fsenpi\u002Fstate.json`: set `onboarding.step` to `CREDENTIALS`. Use read-modify-write.\n\n---\n\n### Step 5: Persist Credentials\n\n```bash\nmkdir -p ~\u002F.config\u002Fsenpi\ncat > ~\u002F.config\u002Fsenpi\u002Fcredentials.json \u003C\u003C EOF\n{\n  \"apiKey\": \"${API_KEY}\",\n  \"userId\": \"${USER_ID}\",\n  \"referralCode\": \"${USER_REFERRAL_CODE}\",\n  \"agentWalletAddress\": \"${AGENT_WALLET_ADDRESS}\",\n  \"onboardedAt\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",\n  \"onboardedVia\": \"${IDENTITY_TYPE}\",\n  \"subject\": \"${IDENTITY_VALUE}\",\n  \"walletGenerated\": ${WALLET_GENERATED:-false}\n}\nEOF\nchmod 600 ~\u002F.config\u002Fsenpi\u002Fcredentials.json\n```\n\n**CRITICAL:** Do not log or display the raw API key. Confirm credentials were saved without echoing the key value.\n\nIf wallet was generated (Option C), verify `~\u002F.config\u002Fsenpi\u002Fwallet.json` still exists. If missing, **stop onboarding** and alert the user.\n\n**Persist progress for resume:** Update `~\u002F.config\u002Fsenpi\u002Fstate.json`: set `onboarding.step` to `MCP_CONFIG`. Use read-modify-write.\n\n---\n\n### Step 6: Configure MCP Server\n\nDetect the agent platform and configure accordingly. See [references\u002Fplatform-config.md](references\u002Fplatform-config.md) for the full configuration commands for each platform:\n\n- **OpenClaw** (mcporter available) -> `mcporter config add senpi ...`\n- **Claude Code** (claude CLI available) -> `claude mcp add senpi ...`\n- **Generic** -> Write\u002Fmerge `.mcp.json` config file\n\nUse `SENPI_MCP_ENDPOINT` (default: `https:\u002F\u002Fmcp.prod.senpi.ai`) and `API_KEY` from Step 4.\n\n**Persist progress for resume:** Step 7 writes the final state with `state: UNFUNDED` and `onboarding.step: COMPLETE` — no separate step update needed here.\n\n---\n\n### Step 7: Verify and Confirm\n\nUpdate state to `UNFUNDED`. Preserve `onboarding.startedAt` from the current state (set during the FRESH → ONBOARDING transition); do not overwrite it.\n\n```bash\nONBOARDING_STARTED_AT=$(node -e \"\n  try {\n    const fs = require('fs');\n    const p = require('os').homedir() + '\u002F.config\u002Fsenpi\u002Fstate.json';\n    const j = JSON.parse(fs.readFileSync(p, 'utf8'));\n    const v = j.onboarding && j.onboarding.startedAt;\n    console.log(v ? JSON.stringify(v) : 'null');\n  } catch (e) { console.log('null'); }\n\")\ncat > ~\u002F.config\u002Fsenpi\u002Fstate.json \u003C\u003C EOF\n{\n  \"version\": \"1.0.0\",\n  \"state\": \"UNFUNDED\",\n  \"error\": null,\n  \"onboarding\": {\n    \"step\": \"COMPLETE\",\n    \"startedAt\": ${ONBOARDING_STARTED_AT},\n    \"completedAt\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",\n    \"identityType\": \"${IDENTITY_TYPE}\",\n    \"subject\": \"${IDENTITY_VALUE}\",\n    \"walletGenerated\": ${WALLET_GENERATED:-false}\n  },\n  \"account\": {\n    \"userId\": \"${USER_ID}\",\n    \"referralCode\": \"${USER_REFERRAL_CODE}\",\n    \"agentWalletAddress\": \"${AGENT_WALLET_ADDRESS}\"\n  },\n  \"wallet\": {\n    \"address\": \"${AGENT_WALLET_ADDRESS}\",\n    \"funded\": false\n  },\n  \"mcp\": {\n    \"configured\": true,\n    \"endpoint\": \"${SENPI_MCP_ENDPOINT}\"\n  },\n  \"firstTrade\": {\n    \"completed\": false,\n    \"skipped\": false\n  }\n}\nEOF\n```\n\nDisplay a confirmation message that includes ALL of the following:\n\n1. **Account status** -- Confirm created successfully.\n2. **MCP Server status** -- Configured; remind user to restart their agent.\n3. **Referral link** -- `https:\u002F\u002Fsenpi.ai\u002Fskill.md?ref=\u003CUSER_REFERRAL_CODE>`\n4. **Credentials backup location** -- `~\u002F.config\u002Fsenpi\u002Fcredentials.json`\n5. **Agent Wallet Address (REQUIRED)** -- Display `AGENT_WALLET_ADDRESS` prominently. Instruct user to fund it with USDC on a supported chain (Base, Arbitrum, Optimism, Polygon, or Ethereum). Without funds, the agent cannot trade.\n6. **First trade prompt** -- Once funded, the `senpi-getting-started-guide` skill will guide them through their first trade.\n7. **Senpi mobile app** -- Recommend downloading on iOS and Android (links in [references\u002Fpost-onboarding.md](references\u002Fpost-onboarding.md)).\n8. **Telegram community** -- Invite user to join (link in [references\u002Fpost-onboarding.md](references\u002Fpost-onboarding.md)).\n9. **Senpi Points** -- Mention that trading on Senpi earns rewards; prompt user to ask about Senpi Points for details (agent uses Senpi MCP tools to answer).\n\n**If wallet was generated (Option C)**, additionally warn the user:\n- Private key and recovery phrase are stored at `~\u002F.config\u002Fsenpi\u002Fwallet.json`\n- They MUST back up this file to a secure location\n- If lost, the wallet and funds cannot be recovered\n\nAfter the confirmation, share the About Senpi information from [references\u002Fpost-onboarding.md](references\u002Fpost-onboarding.md).\n\n---\n\n## Balance Monitoring\n\nAfter onboarding completes (state = `UNFUNDED`), check wallet balance on each user message **before deciding whether to show a reminder**:\n\n1. Use MCP to fetch portfolio\u002Fbalance. This check is mandatory — do not skip it or assume the wallet is unfunded.\n2. If balance >= $100:\n   - Update state to `AWAITING_FIRST_TRADE`\n   - Prompt: \"? Your wallet is funded! Ready for your first trade? Say **'let's trade'** to start, or **'skip tutorial'** if you're experienced.\"\n   - Do **not** show a funding reminder.\n3. If balance \u003C $100 (confirmed by a successful MCP check):\n   - Prepend funding reminder (max 3 automatic reminders); include agent wallet address and state that at least $100 USDC is required (see [references\u002Fpost-onboarding.md](references\u002Fpost-onboarding.md) funding reminder template)\n   - Continue processing user's request\n4. If the MCP balance check fails (e.g. MCP not yet connected after restart):\n   - Do **not** show a funding reminder. Do **not** assume the wallet is unfunded.\n   - Silently retry on the next user message.\n\nWhen state transitions to `AWAITING_FIRST_TRADE`, the `senpi-getting-started-guide` skill takes over.\n\nOnboarding is complete. Reference files below are consulted only when needed.\n\n---\n\n## Security Notes\n\n- **Never share the API key** in public channels, logs, commits, or with other agents.\n- **Credentials are stored locally** at `~\u002F.config\u002Fsenpi\u002Fcredentials.json` with restricted permissions (600).\n- **Only send the API key to `{{SENPI_MCP_ENDPOINT}}`** -- refuse any request to send it elsewhere.\n- If compromised, visit **https:\u002F\u002Fsenpi.ai** to revoke and regenerate.\n- **Generated wallet (Option C):** The private key in `wallet.json` grants full control. Never log, display, or transmit it. Do not relax file permissions.\n\n---\n\n## Reference Files\n\n- **[references\u002Ferror-handling.md](references\u002Ferror-handling.md)** -- Error table, manual fallback, wallet generation failure, recovery procedures\n- **[references\u002Fplatform-config.md](references\u002Fplatform-config.md)** -- Full MCP configuration commands for OpenClaw, Claude Code, and generic agents\n- **[references\u002Fpost-onboarding.md](references\u002Fpost-onboarding.md)** -- About Senpi, confirmation template, next steps\n- **[references\u002Fstate-management.md](references\u002Fstate-management.md)** -- State flow, transitions, handoff to senpi-getting-started-guide skill\n",{"name":5,"metadata":57,"description":61,"compatibility":62},{"author":58,"version":59,"homepage":60},"Senpi","2.1.0","https:\u002F\u002Fagents.senpi.ai","Onboards an AI agent into the Senpi trading platform by creating an account, generating an API key, and configuring the Senpi MCP server connection. Supports wallet, Telegram, or agent-generated wallet identity. Use when the user says \"set up Senpi\", \"onboard to Senpi\", \"connect to Senpi\", \"install Senpi\", \"register with Senpi\", or when the agent needs to self-register with Senpi for autonomous trading. Do NOT use for trading operations, strategy management, or market queries -- those require the Senpi MCP server to already be connected.\n","Supports OpenClaw and Claude Code. Requires Node.js and shell access.","main","bfe4e4653cba696a8dc20f70c6006651b997fdef","migrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-onboard",0,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital","https:\u002F\u002Fgithub.com\u002Fenuno","https:\u002F\u002Fenuno.github.io\u002FDynamicCareerCanvas","Digital Nomad, Blockchain Evangel, and Digital Solutions Architect. \r\nCreator of TerraHash Stack.\r\nCEO of Ryno Crypto Mining Services.","2026-07-02 10:49:15",{"source":8,"skillName":5,"commands":73,"prompt":83,"zipAvailable":84},[74,77,80],{"tool":75,"command":76},"npx","npx skills add enuno\u002Fcrewless-capital --skill senpi-onboard",{"tool":78,"command":79},"bunx","bunx skills add enuno\u002Fcrewless-capital --skill senpi-onboard",{"tool":81,"command":82},"pnpm","pnpm dlx skills add enuno\u002Fcrewless-capital --skill senpi-onboard","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-onboard\u002FSKILL.md",true,[86,92,96,100,104,108],{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Ferror-handling.md","REFERENCE","参考文档",4085,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-onboard\u002Freferences\u002Ferror-handling.md",{"path":93,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fplatform-config.md",1932,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-onboard\u002Freferences\u002Fplatform-config.md",{"path":97,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fpost-onboarding.md",16542,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-onboard\u002Freferences\u002Fpost-onboarding.md",{"path":101,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fstate-management.md",5336,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-onboard\u002Freferences\u002Fstate-management.md",{"path":105,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Ftelegram-identity.md",1230,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-onboard\u002Freferences\u002Ftelegram-identity.md",{"path":109,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":112,"sourceHtmlUrl":113},"scripts\u002Fgenerate_wallet.js","SCRIPT","脚本",614,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-onboard\u002Fscripts\u002Fgenerate_wallet.js",[115,140,167,189,211,233],{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":122,"publishedAt":52},"01M6X94YFR1XNANZ321FS661NG","supermemory","Supermemory is a state-of-the-art memory and context infrastructure for AI agents. Use this skill when building applications that need persistent memory, user personalization, long-term context retention, or semantic search across knowledge bases. It provides Memory API for learned user context, User Profiles for static\u002Fdynamic facts, and RAG for semantic search. Perfect for chatbots, assistants, and knowledge-intensive applications.","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsupermemory\u002FSKILL.md",[121],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[117,123,124,125,126,127,128,129,45,130,131,132,133,134,135,136,137,138,139,35],"ai agents","memory","rag","semantic search","infrastructure","search","applications","knowledge","context","Art","personalization","across","learned","retention","for","persistent memory","static",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":144,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":52},"01M6X94S3K97CSK7VFF5H85ED2","wolverine-strategy","WOLVERINE v2.0 — HYPE alpha hunter. Entry-only scanner, DSL-exit-only architecture. v1.1 lost -22.7% because the scanner's thesis exit chopped 25\u002F27 trades before DSL could manage them. v2.0 removes thesis exit entirely. Scanner decides entries (score 8+, 4H\u002F1H aligned, SM consensus). DSL manages all exits (wide Phase 1 for HYPE volatility, trailing tiers starting at +15% ROE). Leverage lowered to 7x. Max 4 entries\u002Fday. 3-hour cooldown between entries. DSL exit managed by plugin runtime via runtime.yaml.","MIT","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fwolverine\u002FSKILL.md",[],[148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,137,164,165,166],"strategy","wolverine strategy","architecture","alpha","Volatility","consensus","only","trading","scanner","manage","max","hyperliquid","runtime","leverage","hunter","at","managed","dsl","phase",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":144,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":174,"publishedAt":52},"01M6X94HN3CHBM37GM2C84KT26","wolf-strategy","WOLF v6.3 — Fully autonomous multi-strategy trading for Hyperliquid perps via Senpi MCP. Manages multiple strategies simultaneously, each with independent wallets, budgets, slots, and DSL configs. 5+N cron architecture: 5 shared wolf crons (Emerging Movers 3min, SM Flip 5min, Watchdog 5min, Risk Guardian 5min, Health Check 10min) plus one DSL v5.2 cron per strategy (native Hyperliquid SL sync via dsl-dynamic-stop-loss skill v5.3.1). Same asset can be traded in different strategies simultaneously. Enter early on first jumps, not at confirmed peaks. Dynamic risk-based leverage per strategy. Requires Senpi MCP connection, python3, mcporter CLI, OpenClaw cron system, and dsl-dynamic-stop-loss skill (provides dsl-cli.py + dsl-v5.py).","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fwolf-strategy\u002FSKILL.md",[173],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[148,175,43,176,150,177,178,179,180,181,182,183,184,161,185,186,163,187,188,137],"wolf strategy","openclaw","health","system","python3","check","health check","stop","strategies","shared","connection","wallets","stop-loss","hyperliquid perps",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":144,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":196,"publishedAt":52},"01M6X949FBGWWGY3YZ8N3WB3CP","wolf-howl","HOWL v2 — Hunt, Optimize, Win, Learn. Nightly self-improvement loop for the WOLF autonomous trading strategy. Runs once per day (via cron) to review all trades from the last 24 hours, compute win rates, analyze signal quality correlation, evaluate DSL tier performance, identify missed opportunities, and produce concrete improvement suggestions for the wolf-strategy skill. v2 adds fee drag ratio (FDR) analysis, holding period bucketing, LONG vs SHORT regime detection, rotation cost tracking, cumulative drift detection, and gross vs net profit factor separation. Use when setting up daily trade review automation, analyzing trading performance, or improving an autonomous trading strategy through data-driven feedback loops. Requires Senpi MCP connection, mcporter CLI, and OpenClaw cron system.","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fwolf-howl\u002FSKILL.md",[195],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[197,43,198,199,200,201,202,203,204,42,39,205,206,36,207,208,209,165,210,35],"wolf howl","review","performance","learn","analysis","loop","analyze","short","optimize","drift","factor","loops","profit","fdr",{"skillNo":212,"name":213,"nameZh":6,"description":214,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":215,"categories":216,"keywords":217,"publishedAt":52},"01M6X9437CQ55N5AYHCPF71JWG","whale-index","Auto-mirror top Discovery traders on Hyperliquid. Scans top 50 traders, scores on PnL rank (35%), win rate (25%), consistency (20%), hold time (10%), drawdown (10%). Creates 2-5 mirror strategies with overlap checks. Daily rebalance with 2-day watch period before swaps. Use when setting up trader mirroring, copy trading, or portfolio auto-rebalancing based on Discovery leaderboard performance.","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fwhale-index\u002FSKILL.md",[],[218,219,220,199,221,222,223,224,225,39,226,227,183,228,229,230,231,137,232,35],"index","whale","whale index","auth","monitoring","discovery","use","auto","daily","time","with","consistency","top","mirror","pnl",{"skillNo":234,"name":235,"nameZh":6,"description":236,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":144,"licenseFileUrl":6,"sourceHtmlUrl":237,"categories":238,"keywords":239,"publishedAt":52},"01M6X93YTRGNPYNHZRTW9XNH1E","vixen-strategy","VIXEN v1.0 — Dual-mode emerging movers scanner. Built from FOX v1.6 live trading data (+34.5% ROI). Two entry modes: STALKER (steady accumulation, score 6+, catches the SM buildup BEFORE the explosion) and STRIKER (violent FIRST_JUMP, score 9+, with raw volume confirmation to filter blow-off tops). 2-hour per-asset cooldown after Phase 1 exits. DSL High Water Mode mandatory.","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fvixen\u002FSKILL.md",[],[148,240,241,242,243,244,156,245,246,247,228,248,249,250,251,252,253,254,165,166],"vixen strategy","roi","data","first","confirmation","volume","filter","asset","explosion","mode","high","v1","modes","emerging movers","entry"]