senpi-onboard by senpi-ai/senpi-skills
npx skills add https://github.com/senpi-ai/senpi-skills --skill senpi-onboard将 AI 代理接入 Senpi 交易平台。完成此流程后,代理将拥有一个 Senpi 账户、一个 API 密钥以及一个正常工作的 MCP 服务器连接,用于在 Hyperliquid 上进行投资组合管理、交易者发现、策略创建和订单执行。
前提条件: 需要 Shell/代码执行权限和 Node.js(使用 npx 所必需)。
SENPI_MCP_ENDPOINT: https://mcp.prod.senpi.ai(如果 {{SENPI_MCP_ENDPOINT}} 是字面未替换的占位符,则使用此值)REFERRAL_CODE: 空/可选(如果 {{REFERRAL_CODE}} 是字面未替换的占位符,则使用此值)竞技场意图硬性检查: 如果用户消息包含 "arena"、"agents arena"、"competition"、"prize pool"、"qualify"、"qualification"、"weekly cycle" 或 "weekly competition" — 在撰写任何答案之前,调用 read_senpi_guide(uri="senpi://guides/arena")。不要使用网络搜索或排行榜数据来回答竞技场相关问题。完整的路由规则见 。
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
请按顺序执行每一步。不要跳过任何步骤。
根据状态生命周期,确保 state.json 文件存在,以便路由和状态转换有明确定义。如果文件不存在,则使用初始的 FRESH 状态创建它:
if [ ! -f ~/.config/senpi/state.json ]; then
mkdir -p ~/.config/senpi
cat > ~/.config/senpi/state.json << 'STATEEOF'
{
"version": "1.0.0",
"state": "FRESH",
"error": null,
"onboarding": {
"step": "IDENTITY",
"startedAt": null,
"completedAt": null,
"identityType": null,
"subject": null,
"walletGenerated": false,
"existingAccount": false
},
"account": {},
"wallet": { "funded": false },
"firstTrade": { "completed": false, "skipped": false },
"mcp": { "configured": false }
}
STATEEOF
fi
然后继续执行步骤 0。
转换到 ONBOARDING 状态: 在运行步骤 0 之前,如果状态是 FRESH,请更新 state.json 以使状态机和恢复行为正常工作。将 state 设置为 ONBOARDING,将 onboarding.startedAt 设置为当前的 ISO 8601 UTC 时间,并保持 onboarding.step 为 IDENTITY。使用读取-修改-写入(合并)方式,以保留其他字段:
node -e "
const fs = require('fs');
const p = require('os').homedir() + '/.config/senpi/state.json';
const s = JSON.parse(fs.readFileSync(p, 'utf8'));
if (s.state === 'FRESH') {
s.state = 'ONBOARDING';
s.onboarding = s.onboarding || {};
s.onboarding.startedAt = new Date().toISOString();
s.onboarding.step = s.onboarding.step || 'IDENTITY';
fs.writeFileSync(p, JSON.stringify(s, null, 2));
}
"
如果状态已经是 ONBOARDING,则读取 onboarding.step 并从该步骤恢复,而不是从步骤 0 开始(参见 references/state-management.md)。
检查 mcporter CLI 是否可用:
if command -v mcporter &> /dev/null; then
MCPORTER_AVAILABLE=true
else
MCPORTER_AVAILABLE=false
fi
如果不可用且处于 OpenClaw 环境,则安装它:
npm i -g mcporter
mcporter --version
安装完成后设置 MCPORTER_AVAILABLE=true 并继续。
询问用户要使用哪种身份类型。按顺序尝试每个选项:
@ 前缀。0x 开头,恰好 42 个十六进制字符。在继续之前进行验证。IDENTITY_TYPE="TELEGRAM" # 或 "WALLET"
IDENTITY_VALUE="username" # Telegram 用户名(不带 @),或钱包地址 0x...
仅在用户确认他们既没有钱包也没有 Telegram 时使用。在继续之前通知用户。
运行捆绑的脚本来生成钱包:
# 首先尝试 npx,然后是本地安装后备方案
WALLET_DATA=$(npx -y -p ethers@6 node scripts/generate_wallet.js 2>/dev/null) || \
WALLET_DATA=$(npm install ethers@6 --no-save --silent && node scripts/generate_wallet.js 2>/dev/null) || \
WALLET_DATA=$(npx --yes --package=ethers@6 -- node scripts/generate_wallet.js)
如果 scripts/generate_wallet.js 路径下的脚本不可用,则内联生成:
WALLET_DATA=$(npx -y -p ethers@6 node -e "
const { ethers } = require('ethers');
const w = ethers.Wallet.createRandom();
console.log(JSON.stringify({
address: w.address,
privateKey: w.privateKey,
mnemonic: w.mnemonic.phrase
}));
")
失败时不要提示用户 — 静默尝试后备方案。仅在所有方法都失败时报告。有关钱包生成失败的处理,请参阅 references/error-handling.md。
解析 WALLET_DATA JSON 以提取 address、privateKey 和 mnemonic。验证地址不为空或 null。如果无效,请停止并参考错误处理文档。
立即持久化钱包(在继续之前)使用解析出的值:
mkdir -p ~/.config/senpi
# 将 WALLET_DATA 中的 address、privateKey、mnemonic 写入 wallet.json
chmod 600 ~/.config/senpi/wallet.json
文件必须包含:address、privateKey、mnemonic、generatedAt(ISO 8601 UTC)和 "generatedBy": "senpi-onboard"。
关键:
wallet.json 写入且权限设置完成之前,不要继续。使用解析出的地址设置身份变量:
WALLET_GENERATED=true
IDENTITY_TYPE="WALLET"
IDENTITY_VALUE="<address from WALLET_DATA>"
通知用户钱包已生成并保存到具有受限权限的 ~/.config/senpi/wallet.json。指示他们立即备份此文件。
在步骤 2 之前,确认以下变量已设置:
IDENTITY_TYPE — "WALLET" 或 "TELEGRAM"IDENTITY_VALUE — 钱包地址(带 0x)或 Telegram 用户名(不带 @)WALLET_GENERATED — 如果使用了选项 C,则为 true,否则未设置持久化进度以便恢复: 更新 ~/.config/senpi/state.json:将 onboarding.step 设置为 REFERRAL,如果可用,则根据当前变量设置 onboarding.identityType、onboarding.subject、onboarding.walletGenerated。使用读取-修改-写入方式以保留其他字段。
REFERRAL_CODE="{{REFERRAL_CODE}}"
如果为空且用户未提供,那也没关系 — 它是可选的。除非用户提到有推荐码,否则不要提示。
持久化进度以便恢复: 更新 ~/.config/senpi/state.json:将 onboarding.step 设置为 API_CALL。使用读取-修改-写入方式。
执行 CreateAgentStubAccount GraphQL 变更。这是一个公共端点 — 无需身份验证。
RESPONSE=$(curl -s -X POST https://moxie-backend.prod.senpi.ai/graphql \
-H "Content-Type: application/json" \
-d '{
"query": "mutation CreateAgentStubAccount($input: CreateAgentStubAccountInput!) { CreateAgentStubAccount(input: $input) { user { id privyId userName name referralCode referrerId } apiKey apiKeyExpiresIn apiKeyTokenType referralCode agentWalletAddress } }",
"variables": {
"input": {
"from": "'"${IDENTITY_TYPE}"'",
"subject": "'"${IDENTITY_VALUE}"'",
'"$([ "$IDENTITY_TYPE" = "TELEGRAM" ] && echo "\"userName\": \"${IDENTITY_VALUE}\",")"'
"referralCode": "'"${REFERRAL_CODE}"'",
"apiKeyName": "agent-'"$(date +%s)"'"
}
}
}')
对于 TELEGRAM 身份的注意事项: 在输入中包含额外的 "userName" 字段,并将其设置为 IDENTITY_VALUE。
持久化进度以便恢复: 更新 ~/.config/senpi/state.json:将 onboarding.step 设置为 PARSE。使用读取-修改-写入方式。
首先检查错误 — 如果 response.errors 存在且有条目,则提取 errors[0].message。有关错误表和手动后备流程,请参阅 references/error-handling.md。
如果没有错误,则解析 JSON 响应以提取:
API_KEY 来自 data.CreateAgentStubAccount.apiKeyUSER_ID 来自 data.CreateAgentStubAccount.user.idUSER_REFERRAL_CODE 来自 data.CreateAgentStubAccount.referralCodeAGENT_WALLET_ADDRESS 来自 data.CreateAgentStubAccount.agentWalletAddress在继续之前,验证 API 密钥不为空、null 或 undefined。
持久化进度以便恢复: 更新 ~/.config/senpi/state.json:将 onboarding.step 设置为 CREDENTIALS。使用读取-修改-写入方式。
mkdir -p ~/.config/senpi
cat > ~/.config/senpi/credentials.json << EOF
{
"apiKey": "${API_KEY}",
"userId": "${USER_ID}",
"referralCode": "${USER_REFERRAL_CODE}",
"agentWalletAddress": "${AGENT_WALLET_ADDRESS}",
"onboardedAt": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"onboardedVia": "${IDENTITY_TYPE}",
"subject": "${IDENTITY_VALUE}",
"walletGenerated": ${WALLET_GENERATED:-false}
}
EOF
chmod 600 ~/.config/senpi/credentials.json
关键: 不要记录或显示原始 API 密钥。确认凭据已保存,且不回显密钥值。
如果钱包是生成的(选项 C),请验证 ~/.config/senpi/wallet.json 仍然存在。如果丢失,停止接入流程并提醒用户。
持久化进度以便恢复: 更新 ~/.config/senpi/state.json:将 onboarding.step 设置为 MCP_CONFIG。使用读取-修改-写入方式。
检测代理平台并进行相应配置。有关每个平台的完整配置命令,请参阅 references/platform-config.md:
mcporter config add senpi ...claude mcp add senpi ....mcp.json 配置文件使用 SENPI_MCP_ENDPOINT(默认:https://mcp.prod.senpi.ai)和步骤 4 中的 API_KEY。
持久化进度以便恢复: 步骤 7 将写入最终状态,其中包含 state: UNFUNDED 和 onboarding.step: COMPLETE — 此处无需单独的步骤更新。
将状态更新为 UNFUNDED。保留当前状态中的 onboarding.startedAt(在 FRESH → ONBOARDING 转换期间设置);不要覆盖它。
ONBOARDING_STARTED_AT=$(node -e "
try {
const fs = require('fs');
const p = require('os').homedir() + '/.config/senpi/state.json';
const j = JSON.parse(fs.readFileSync(p, 'utf8'));
const v = j.onboarding && j.onboarding.startedAt;
console.log(v ? JSON.stringify(v) : 'null');
} catch (e) { console.log('null'); }
")
cat > ~/.config/senpi/state.json << EOF
{
"version": "1.0.0",
"state": "UNFUNDED",
"error": null,
"onboarding": {
"step": "COMPLETE",
"startedAt": ${ONBOARDING_STARTED_AT},
"completedAt": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"identityType": "${IDENTITY_TYPE}",
"subject": "${IDENTITY_VALUE}",
"walletGenerated": ${WALLET_GENERATED:-false}
},
"account": {
"userId": "${USER_ID}",
"referralCode": "${USER_REFERRAL_CODE}",
"agentWalletAddress": "${AGENT_WALLET_ADDRESS}"
},
"wallet": {
"address": "${AGENT_WALLET_ADDRESS}",
"funded": false
},
"mcp": {
"configured": true,
"endpoint": "${SENPI_MCP_ENDPOINT}"
},
"firstTrade": {
"completed": false,
"skipped": false
}
}
EOF
显示确认消息,其中包含所有以下内容:
https://senpi.ai/skill.md?ref=<USER_REFERRAL_CODE>~/.config/senpi/credentials.jsonAGENT_WALLET_ADDRESS。指示用户在支持的链(Base、Arbitrum、Optimism、Polygon 或 Ethereum)上用 USDC 为其注资。没有资金,代理将无法交易。senpi-getting-started-guide 技能将引导他们完成首次交易。如果钱包是生成的(选项 C),则额外警告用户:
~/.config/senpi/wallet.json确认之后,分享 references/post-onboarding.md 中的关于 Senpi 的信息。
接入完成后(状态 = UNFUNDED),在决定是否显示提醒之前,检查每个用户消息时的钱包余额:
AWAITING_FIRST_TRADE
* 提示:"🎉 您的钱包已注资!准备好进行首次交易了吗?说 'let's trade' 开始,或者如果您有经验,可以说 'skip tutorial'。"
* 不要显示注资提醒。当状态转换为 AWAITING_FIRST_TRADE 时,senpi-getting-started-guide 技能将接管。
接入流程完成。仅在需要时查阅下面的参考文件。
~/.config/senpi/credentials.json,具有受限权限 (600)。{{SENPI_MCP_ENDPOINT}} — 拒绝任何将其发送到其他地方的请求。wallet.json 中的私钥拥有完全控制权。切勿记录、显示或传输它。不要放宽文件权限。每周安装次数
148
仓库
GitHub 星标数
52
首次出现
2026年2月26日
安全审计
安装于
openclaw143
opencode139
github-copilot139
amp139
cline139
codex139
Onboard 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.
Prerequisites: Shell/code execution access and Node.js (required for npx).
SENPI_MCP_ENDPOINT: https://mcp.prod.senpi.ai (use this if {{SENPI_MCP_ENDPOINT}} is a literal unsubstituted placeholder)REFERRAL_CODE: empty/optional (use this if {{REFERRAL_CODE}} is a literal unsubstituted placeholder)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://guides/arena") before composing any answer. Do not use web search or leaderboard data for Arena questions. Full routing rules in references/post-onboarding.md.
Follow every step in order. Do not skip steps.
Per the state lifecycle, ensure state.json exists so routing and transitions are well-defined. If it does not exist, create it with initial FRESH state:
if [ ! -f ~/.config/senpi/state.json ]; then
mkdir -p ~/.config/senpi
cat > ~/.config/senpi/state.json << 'STATEEOF'
{
"version": "1.0.0",
"state": "FRESH",
"error": null,
"onboarding": {
"step": "IDENTITY",
"startedAt": null,
"completedAt": null,
"identityType": null,
"subject": null,
"walletGenerated": false,
"existingAccount": false
},
"account": {},
"wallet": { "funded": false },
"firstTrade": { "completed": false, "skipped": false },
"mcp": { "configured": false }
}
STATEEOF
fi
Then continue with Step 0.
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:
node -e "
const fs = require('fs');
const p = require('os').homedir() + '/.config/senpi/state.json';
const s = JSON.parse(fs.readFileSync(p, 'utf8'));
if (s.state === 'FRESH') {
s.state = 'ONBOARDING';
s.onboarding = s.onboarding || {};
s.onboarding.startedAt = new Date().toISOString();
s.onboarding.step = s.onboarding.step || 'IDENTITY';
fs.writeFileSync(p, JSON.stringify(s, null, 2));
}
"
If state is already ONBOARDING, read onboarding.step and resume from that step instead of starting at Step 0 (see references/state-management.md).
Check if mcporter CLI is available:
if command -v mcporter &> /dev/null; then
MCPORTER_AVAILABLE=true
else
MCPORTER_AVAILABLE=false
fi
If unavailable and on OpenClaw, install it:
npm i -g mcporter
mcporter --version
Set MCPORTER_AVAILABLE=true once installed and proceed.
Ask the user which identity type to use. Try each option in order:
@ prefix before sending to the API.0x-prefixed, exactly 42 hex characters. Validate before proceeding.IDENTITY_TYPE="TELEGRAM" # or "WALLET"
IDENTITY_VALUE="username" # without @ for Telegram, or 0x... for wallet
Use only when the user confirms they have neither wallet nor Telegram. Inform the user before proceeding.
Run the bundled script to generate a wallet:
# Try npx first, then local install fallbacks
WALLET_DATA=$(npx -y -p ethers@6 node scripts/generate_wallet.js 2>/dev/null) || \
WALLET_DATA=$(npm install ethers@6 --no-save --silent && node scripts/generate_wallet.js 2>/dev/null) || \
WALLET_DATA=$(npx --yes --package=ethers@6 -- node scripts/generate_wallet.js)
If the script is not available at scripts/generate_wallet.js, generate inline:
WALLET_DATA=$(npx -y -p ethers@6 node -e "
const { ethers } = require('ethers');
const w = ethers.Wallet.createRandom();
console.log(JSON.stringify({
address: w.address,
privateKey: w.privateKey,
mnemonic: w.mnemonic.phrase
}));
")
Do not prompt the user on failure -- try fallbacks silently. Only report if all methods fail. See references/error-handling.md for wallet generation failure handling.
Parse 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.
Persist the wallet immediately (before continuing) using the parsed values:
mkdir -p ~/.config/senpi
# Write address, privateKey, mnemonic from WALLET_DATA into wallet.json
chmod 600 ~/.config/senpi/wallet.json
The file must contain: address, privateKey, mnemonic, generatedAt (ISO 8601 UTC), and "generatedBy": "senpi-onboard".
CRITICAL:
wallet.json is written and permissions set.Set the identity variables using the parsed address:
WALLET_GENERATED=true
IDENTITY_TYPE="WALLET"
IDENTITY_VALUE="<address from WALLET_DATA>"
Notify the user that a wallet was generated and saved to ~/.config/senpi/wallet.json with restricted permissions. Instruct them to back up this file immediately.
Before Step 2, confirm these are set:
IDENTITY_TYPE -- "WALLET" or "TELEGRAM"IDENTITY_VALUE -- wallet address (with 0x) or Telegram username (without @)WALLET_GENERATED -- true if Option C was used, unset otherwisePersist progress for resume: Update ~/.config/senpi/state.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.
REFERRAL_CODE="{{REFERRAL_CODE}}"
If empty and user hasn't provided one, that's fine -- it's optional. Do not prompt unless the user mentions having one.
Persist progress for resume: Update ~/.config/senpi/state.json: set onboarding.step to API_CALL. Use read-modify-write.
Execute the CreateAgentStubAccount GraphQL mutation. This is a public endpoint -- no auth required.
RESPONSE=$(curl -s -X POST https://moxie-backend.prod.senpi.ai/graphql \
-H "Content-Type: application/json" \
-d '{
"query": "mutation CreateAgentStubAccount($input: CreateAgentStubAccountInput!) { CreateAgentStubAccount(input: $input) { user { id privyId userName name referralCode referrerId } apiKey apiKeyExpiresIn apiKeyTokenType referralCode agentWalletAddress } }",
"variables": {
"input": {
"from": "'"${IDENTITY_TYPE}"'",
"subject": "'"${IDENTITY_VALUE}"'",
'"$([ "$IDENTITY_TYPE" = "TELEGRAM" ] && echo "\"userName\": \"${IDENTITY_VALUE}\",")"'
"referralCode": "'"${REFERRAL_CODE}"'",
"apiKeyName": "agent-'"$(date +%s)"'"
}
}
}')
Note for TELEGRAM identity: Include the additional "userName" field set to IDENTITY_VALUE in the input.
Persist progress for resume: Update ~/.config/senpi/state.json: set onboarding.step to PARSE. Use read-modify-write.
Check for errors first -- if response.errors exists and has entries, extract errors[0].message. See references/error-handling.md for the error table and manual fallback flow.
If no errors, parse the JSON response to extract:
API_KEY from data.CreateAgentStubAccount.apiKeyUSER_ID from data.CreateAgentStubAccount.user.idUSER_REFERRAL_CODE from data.CreateAgentStubAccount.referralCodeAGENT_WALLET_ADDRESS from data.CreateAgentStubAccount.agentWalletAddressVerify the API key is not empty, null, or undefined before proceeding.
Persist progress for resume: Update ~/.config/senpi/state.json: set onboarding.step to CREDENTIALS. Use read-modify-write.
mkdir -p ~/.config/senpi
cat > ~/.config/senpi/credentials.json << EOF
{
"apiKey": "${API_KEY}",
"userId": "${USER_ID}",
"referralCode": "${USER_REFERRAL_CODE}",
"agentWalletAddress": "${AGENT_WALLET_ADDRESS}",
"onboardedAt": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"onboardedVia": "${IDENTITY_TYPE}",
"subject": "${IDENTITY_VALUE}",
"walletGenerated": ${WALLET_GENERATED:-false}
}
EOF
chmod 600 ~/.config/senpi/credentials.json
CRITICAL: Do not log or display the raw API key. Confirm credentials were saved without echoing the key value.
If wallet was generated (Option C), verify ~/.config/senpi/wallet.json still exists. If missing, stop onboarding and alert the user.
Persist progress for resume: Update ~/.config/senpi/state.json: set onboarding.step to MCP_CONFIG. Use read-modify-write.
Detect the agent platform and configure accordingly. See references/platform-config.md for the full configuration commands for each platform:
mcporter config add senpi ...claude mcp add senpi ....mcp.json config fileUse SENPI_MCP_ENDPOINT (default: https://mcp.prod.senpi.ai) and API_KEY from Step 4.
Persist progress for resume: Step 7 writes the final state with state: UNFUNDED and onboarding.step: COMPLETE — no separate step update needed here.
Update state to UNFUNDED. Preserve onboarding.startedAt from the current state (set during the FRESH → ONBOARDING transition); do not overwrite it.
ONBOARDING_STARTED_AT=$(node -e "
try {
const fs = require('fs');
const p = require('os').homedir() + '/.config/senpi/state.json';
const j = JSON.parse(fs.readFileSync(p, 'utf8'));
const v = j.onboarding && j.onboarding.startedAt;
console.log(v ? JSON.stringify(v) : 'null');
} catch (e) { console.log('null'); }
")
cat > ~/.config/senpi/state.json << EOF
{
"version": "1.0.0",
"state": "UNFUNDED",
"error": null,
"onboarding": {
"step": "COMPLETE",
"startedAt": ${ONBOARDING_STARTED_AT},
"completedAt": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"identityType": "${IDENTITY_TYPE}",
"subject": "${IDENTITY_VALUE}",
"walletGenerated": ${WALLET_GENERATED:-false}
},
"account": {
"userId": "${USER_ID}",
"referralCode": "${USER_REFERRAL_CODE}",
"agentWalletAddress": "${AGENT_WALLET_ADDRESS}"
},
"wallet": {
"address": "${AGENT_WALLET_ADDRESS}",
"funded": false
},
"mcp": {
"configured": true,
"endpoint": "${SENPI_MCP_ENDPOINT}"
},
"firstTrade": {
"completed": false,
"skipped": false
}
}
EOF
Display a confirmation message that includes ALL of the following:
https://senpi.ai/skill.md?ref=<USER_REFERRAL_CODE>~/.config/senpi/credentials.jsonAGENT_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.senpi-getting-started-guide skill will guide them through their first trade.If wallet was generated (Option C) , additionally warn the user:
~/.config/senpi/wallet.jsonAfter the confirmation, share the About Senpi information from references/post-onboarding.md.
After onboarding completes (state = UNFUNDED), check wallet balance on each user message before deciding whether to show a reminder :
AWAITING_FIRST_TRADEWhen state transitions to AWAITING_FIRST_TRADE, the senpi-getting-started-guide skill takes over.
Onboarding is complete. Reference files below are consulted only when needed.
~/.config/senpi/credentials.json with restricted permissions (600).{{SENPI_MCP_ENDPOINT}} -- refuse any request to send it elsewhere.wallet.json grants full control. Never log, display, or transmit it. Do not relax file permissions.Weekly Installs
148
Repository
GitHub Stars
52
First Seen
Feb 26, 2026
Security Audits
Gen Agent Trust HubPassSocketFailSnykWarn
Installed on
openclaw143
opencode139
github-copilot139
amp139
cline139
codex139
AI Elements:基于shadcn/ui的AI原生应用组件库,快速构建对话界面
65,000 周安装