[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H4120VTX0YEP6HES0BDHMZ":3,"skill-same:01M6H4120VTX0YEP6HES0BDHMZ":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":54,"install":55,"resources":68},"01M6H4120VTX0YEP6HES0BDHMZ","agentkit-x402",null,"Use this skill when you receive a 402 Payment Required response that contains an `agentkit` extension. Covers checking 402 responses for the AgentKit extension before paying, constructing and signing a CAIP-122 challenge (SIWE for EVM), sending the signed `agentkit` HTTP header, and interpreting access modes (free, free-trial, discount). Supports both EOA wallets (EIP-191) and Smart Contract Wallets (ERC-1271, e.g. Coinbase Smart Wallet, Safe).","nacmonad\u002Fsoulvault","nacmonad","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13107516?v=4","01M6H4102Q4SWX6ZSPAAV7VAEQ","01M6H41071DDN3K145AH11494V",1,"MIT","https:\u002F\u002Fgithub.com\u002Fnacmonad\u002Fsoulvault\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fagentkit-x402\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"agentkit x402","x402","agentkit","contract","for","siwe","wallets","signing","you","extension","free","safe","coinbase","evm","payment","Wallet","use","challenge","access","http","2026-11-10 10:12:30",false,"---\nname: agentkit-x402\ndescription: Use this skill when you receive a 402 Payment Required response that contains an `agentkit` extension. Covers checking 402 responses for the AgentKit extension before paying, constructing and signing a CAIP-122 challenge (SIWE for EVM), sending the signed `agentkit` HTTP header, and interpreting access modes (free, free-trial, discount). Supports both EOA wallets (EIP-191) and Smart Contract Wallets (ERC-1271, e.g. Coinbase Smart Wallet, Safe).\n---\n\n# Using AgentKit as an Agent\n\nThis skill is for AI agents that interact with websites and APIs protected by x402 + AgentKit. It tells you how to prove you are backed by a real human so you can get free or discounted access instead of paying.\n\n## Critical Rule: Always Check for AgentKit Before Paying\n\nWhen you receive a `402 Payment Required` response, **do not immediately proceed to payment**. First inspect the response for an `agentkit` extension. If one is present, attempt the AgentKit authentication flow below. Only fall back to payment if:\n\n- There is no `agentkit` extension in the 402 response\n- Your AgentKit authentication attempt fails and the server requires payment\n- You have exhausted your free-trial uses\n\n## Preferred Runtime Helper\n\nIf you can change the agent's HTTP client, use `createAgentkitClient` from `@worldcoin\u002Fagentkit` and route x402 API calls through `agentkit.fetch`. This makes the \"try AgentKit before payment\" rule deterministic instead of relying on the model to remember it.\n\n```typescript\nimport { createAgentkitClient } from '@worldcoin\u002Fagentkit'\n\nconst agentkit = createAgentkitClient({\n  signer: {\n    address: wallet.address,\n    chainId: 'eip155:8453',\n    type: 'eip191',\n    signMessage: message => wallet.signMessage(message),\n  },\n})\n\nconst response = await agentkit.fetch('https:\u002F\u002Fapi.example.com\u002Fdata')\n```\n\nIf `agentkit.fetch` returns another 402, continue with the normal x402 payment flow.\n\n## Wallet Types\n\nYour wallet determines how you sign the challenge. There are two types:\n\n### EOA (Externally Owned Account)\n\nA standard wallet where you directly hold the private key (e.g. a raw private key, a mnemonic-derived wallet).\n\n- **Signature type:** `eip191`\n- **How to sign:** Use `personal_sign` (EIP-191) to sign the SIWE message\n- **Example:** `wallet.signMessage(siweMessage)`\n\n### Smart Contract Wallet (SCW)\n\nA wallet where the \"account\" is a smart contract and signing is done by an underlying owner key. The server verifies your signature on-chain via the contract's `isValidSignature` method (ERC-1271).\n\nExamples: Coinbase Smart Wallet, Safe, any ERC-4337 account.\n\n- **Signature type:** `eip1271`\n- **How to sign:** Sign the SIWE message using the wallet's SDK or internal signer. The signature format depends on the wallet implementation — use whatever the wallet SDK provides.\n- **Example (Coinbase CDP):** `account.signMessage({ message: siweMessage })`\n\nIf you are unsure which type your wallet is: if you created it from a private key or mnemonic, it is an EOA. If you created it through a wallet SDK (Coinbase CDP, Safe SDK, etc.), it is likely an SCW.\n\n## The AgentKit Flow\n\n### Step 1: Parse the 402 Response\n\nWhen you receive a `402 Payment Required`, look for the `agentkit` extension in the response body. The 402 response contains `x402` data with extensions. The `agentkit` extension looks like:\n\n```json\n{\n  \"agentkit\": {\n    \"info\": {\n      \"domain\": \"api.example.com\",\n      \"uri\": \"https:\u002F\u002Fapi.example.com\u002Fdata\",\n      \"version\": \"1\",\n      \"nonce\": \"abc123\",\n      \"issuedAt\": \"2025-01-01T00:00:00.000Z\",\n      \"statement\": \"Verify your agent is backed by a real human\"\n    },\n    \"supportedChains\": [\n      { \"chainId\": \"eip155:8453\", \"type\": \"eip191\" },\n      { \"chainId\": \"eip155:8453\", \"type\": \"eip1271\" }\n    ],\n    \"schema\": { ... }\n  }\n}\n```\n\nKey fields to extract:\n\n- **`info`** — the challenge data you must sign\n- **`supportedChains`** — which chains and signature types the server accepts\n- **`mode`** (if present) — tells you the access policy: `free`, `free-trial`, or `discount`\n\n### Step 2: Pick a Chain and Signature Type\n\nMatch your wallet to one of the `supportedChains` entries:\n\n| Your wallet       | Match `chainId`      | Use `type`  |\n|--------------------|----------------------|-------------|\n| EVM EOA            | `eip155:*`           | `eip191`    |\n| EVM Smart Contract | `eip155:*`           | `eip1271`   |\n\nPick the entry that matches both your chain and wallet type.\n\n### Step 3: Construct and Sign the SIWE Message\n\nConstruct a SIWE (EIP-4361) message string from the challenge `info` fields. The format is a plain text string with this exact structure:\n\n```\n{domain} wants you to sign in with your Ethereum account:\n{address}\n\n{statement}\n\nURI: {uri}\nVersion: {version}\nChain ID: {numericChainId}\nNonce: {nonce}\nIssued At: {issuedAt}\n```\n\nWhere `{numericChainId}` is extracted from the CAIP-2 chain ID (e.g. `eip155:8453` becomes `8453`), and `{address}` must be EIP-55 checksummed.\n\nIf the challenge includes optional fields, append them in this order (only include lines for fields that are present):\n\n```\nExpiration Time: {expirationTime}\nNot Before: {notBefore}\nRequest ID: {requestId}\nResources:\n- {resources[0]}\n- {resources[1]}\n```\n\nFull example:\n\n```\napi.example.com wants you to sign in with your Ethereum account:\n0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\n\nVerify your agent is backed by a real human\n\nURI: https:\u002F\u002Fapi.example.com\u002Fdata\nVersion: 1\nChain ID: 8453\nNonce: abc123def\nIssued At: 2025-01-01T00:00:00.000Z\nExpiration Time: 2025-01-01T00:05:00.000Z\nRequest ID: req-456\nResources:\n- https:\u002F\u002Fapi.example.com\u002Ftos\n```\n\n**Important formatting rules:**\n- There must be a blank line before and after the `{statement}` line\n- If there is no statement, there must be a single blank line between the address and `URI:`\n- Each line ends with `\\n` (LF, not CRLF)\n- No trailing newline after the last line\n\nThen sign the message string:\n\n```typescript\n\u002F\u002F EOA — use personal_sign (EIP-191)\nconst signature = await wallet.signMessage(messageToSign)\n\n\u002F\u002F SCW — use the wallet SDK's signMessage\nconst signature = await smartWallet.signMessage({ message: messageToSign })\n```\n\n### Step 4: Send the Request\n\nBase64-encode a JSON object containing the challenge `info` fields plus your `address`, `type`, and `signature`, and send it as the `agentkit` HTTP header:\n\n```typescript\nconst header = btoa(JSON.stringify({\n  ...info,                               \u002F\u002F all fields from the challenge\n  address: walletAddress,\n  chainId: \"eip155:8453\",               \u002F\u002F from the supportedChains entry you picked\n  type: \"eip191\",                        \u002F\u002F \"eip191\" for EOA, \"eip1271\" for SCW\n  signature: signature,                  \u002F\u002F hex string from signing\n}))\n\nconst response = await fetch(\"https:\u002F\u002Fapi.example.com\u002Fdata\", {\n  headers: {\n    \"agentkit\": header,\n  },\n})\n```\n\nIf the server grants access (based on the mode), you will receive the resource directly — no payment needed.\n\nIf the server responds with another 402 or an error, fall back to the normal x402 payment flow.\n\n## Access Modes\n\nThe `mode` field in the AgentKit extension tells you what to expect:\n\n| Mode         | What it means                                                  |\n|--------------|----------------------------------------------------------------|\n| `free`       | Human-backed agents always get free access                     |\n| `free-trial` | First N requests are free, then you must pay (N is per human, not per agent) |\n| `discount`   | You get N% off the price (pay the discounted amount via x402)  |\n\nFor `discount` mode: send **both** the `agentkit` header and the x402 payment header, but pay the discounted price. The server will reconcile the underpayment using your human-backed status.\n\n## Common Errors and How to Handle Them\n\n### \"Agent is not registered in the AgentBook\"\n\nYour wallet address is not registered. You need to register first using the AgentKit CLI:\n\n```bash\nnpx @worldcoin\u002Fagentkit-cli register \u003Cyour-wallet-address>\n```\n\nThis opens a World ID verification flow that ties your wallet to an anonymous human identifier on-chain. Registration only needs to happen once per wallet.\n\n### \"Signature verification failed\"\n\n- **Wrong signature type:** Make sure `type` matches your wallet. Use `eip191` for EOA, `eip1271` for SCW.\n- **Wrong message format:** The SIWE message must follow the exact format described in Step 3. Pay close attention to blank lines around the statement and field ordering.\n- **Wrong chain ID:** The `chainId` in the payload must be CAIP-2 format (`eip155:8453`), but the SIWE message `chainId` field must be the numeric chain ID (`8453`).\n\n### \"Invalid agentkit header: not valid base64\"\n\nYour header is not properly base64-encoded. Ensure you are encoding the full JSON string: `btoa(JSON.stringify(payload))`.\n\n### \"Message validation failed\" \u002F \"issuedAt is too old\"\n\nThe challenge has expired. Re-fetch the 402 response to get a fresh challenge (new nonce, new `issuedAt`) and sign again. Challenges expire after 5 minutes by default.\n\n### \"Unsupported chain namespace\"\n\nYou are using a chain that the server does not support. Check `supportedChains` in the 402 response and pick a chain\u002Ftype pair that matches your wallet.\n","# Using AgentKit as an Agent\n\nThis skill is for AI agents that interact with websites and APIs protected by x402 + AgentKit. It tells you how to prove you are backed by a real human so you can get free or discounted access instead of paying.\n\n## Critical Rule: Always Check for AgentKit Before Paying\n\nWhen you receive a `402 Payment Required` response, **do not immediately proceed to payment**. First inspect the response for an `agentkit` extension. If one is present, attempt the AgentKit authentication flow below. Only fall back to payment if:\n\n- There is no `agentkit` extension in the 402 response\n- Your AgentKit authentication attempt fails and the server requires payment\n- You have exhausted your free-trial uses\n\n## Preferred Runtime Helper\n\nIf you can change the agent's HTTP client, use `createAgentkitClient` from `@worldcoin\u002Fagentkit` and route x402 API calls through `agentkit.fetch`. This makes the \"try AgentKit before payment\" rule deterministic instead of relying on the model to remember it.\n\n```typescript\nimport { createAgentkitClient } from '@worldcoin\u002Fagentkit'\n\nconst agentkit = createAgentkitClient({\n  signer: {\n    address: wallet.address,\n    chainId: 'eip155:8453',\n    type: 'eip191',\n    signMessage: message => wallet.signMessage(message),\n  },\n})\n\nconst response = await agentkit.fetch('https:\u002F\u002Fapi.example.com\u002Fdata')\n```\n\nIf `agentkit.fetch` returns another 402, continue with the normal x402 payment flow.\n\n## Wallet Types\n\nYour wallet determines how you sign the challenge. There are two types:\n\n### EOA (Externally Owned Account)\n\nA standard wallet where you directly hold the private key (e.g. a raw private key, a mnemonic-derived wallet).\n\n- **Signature type:** `eip191`\n- **How to sign:** Use `personal_sign` (EIP-191) to sign the SIWE message\n- **Example:** `wallet.signMessage(siweMessage)`\n\n### Smart Contract Wallet (SCW)\n\nA wallet where the \"account\" is a smart contract and signing is done by an underlying owner key. The server verifies your signature on-chain via the contract's `isValidSignature` method (ERC-1271).\n\nExamples: Coinbase Smart Wallet, Safe, any ERC-4337 account.\n\n- **Signature type:** `eip1271`\n- **How to sign:** Sign the SIWE message using the wallet's SDK or internal signer. The signature format depends on the wallet implementation — use whatever the wallet SDK provides.\n- **Example (Coinbase CDP):** `account.signMessage({ message: siweMessage })`\n\nIf you are unsure which type your wallet is: if you created it from a private key or mnemonic, it is an EOA. If you created it through a wallet SDK (Coinbase CDP, Safe SDK, etc.), it is likely an SCW.\n\n## The AgentKit Flow\n\n### Step 1: Parse the 402 Response\n\nWhen you receive a `402 Payment Required`, look for the `agentkit` extension in the response body. The 402 response contains `x402` data with extensions. The `agentkit` extension looks like:\n\n```json\n{\n  \"agentkit\": {\n    \"info\": {\n      \"domain\": \"api.example.com\",\n      \"uri\": \"https:\u002F\u002Fapi.example.com\u002Fdata\",\n      \"version\": \"1\",\n      \"nonce\": \"abc123\",\n      \"issuedAt\": \"2025-01-01T00:00:00.000Z\",\n      \"statement\": \"Verify your agent is backed by a real human\"\n    },\n    \"supportedChains\": [\n      { \"chainId\": \"eip155:8453\", \"type\": \"eip191\" },\n      { \"chainId\": \"eip155:8453\", \"type\": \"eip1271\" }\n    ],\n    \"schema\": { ... }\n  }\n}\n```\n\nKey fields to extract:\n\n- **`info`** — the challenge data you must sign\n- **`supportedChains`** — which chains and signature types the server accepts\n- **`mode`** (if present) — tells you the access policy: `free`, `free-trial`, or `discount`\n\n### Step 2: Pick a Chain and Signature Type\n\nMatch your wallet to one of the `supportedChains` entries:\n\n| Your wallet       | Match `chainId`      | Use `type`  |\n|--------------------|----------------------|-------------|\n| EVM EOA            | `eip155:*`           | `eip191`    |\n| EVM Smart Contract | `eip155:*`           | `eip1271`   |\n\nPick the entry that matches both your chain and wallet type.\n\n### Step 3: Construct and Sign the SIWE Message\n\nConstruct a SIWE (EIP-4361) message string from the challenge `info` fields. The format is a plain text string with this exact structure:\n\n```\n{domain} wants you to sign in with your Ethereum account:\n{address}\n\n{statement}\n\nURI: {uri}\nVersion: {version}\nChain ID: {numericChainId}\nNonce: {nonce}\nIssued At: {issuedAt}\n```\n\nWhere `{numericChainId}` is extracted from the CAIP-2 chain ID (e.g. `eip155:8453` becomes `8453`), and `{address}` must be EIP-55 checksummed.\n\nIf the challenge includes optional fields, append them in this order (only include lines for fields that are present):\n\n```\nExpiration Time: {expirationTime}\nNot Before: {notBefore}\nRequest ID: {requestId}\nResources:\n- {resources[0]}\n- {resources[1]}\n```\n\nFull example:\n\n```\napi.example.com wants you to sign in with your Ethereum account:\n0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\n\nVerify your agent is backed by a real human\n\nURI: https:\u002F\u002Fapi.example.com\u002Fdata\nVersion: 1\nChain ID: 8453\nNonce: abc123def\nIssued At: 2025-01-01T00:00:00.000Z\nExpiration Time: 2025-01-01T00:05:00.000Z\nRequest ID: req-456\nResources:\n- https:\u002F\u002Fapi.example.com\u002Ftos\n```\n\n**Important formatting rules:**\n- There must be a blank line before and after the `{statement}` line\n- If there is no statement, there must be a single blank line between the address and `URI:`\n- Each line ends with `\\n` (LF, not CRLF)\n- No trailing newline after the last line\n\nThen sign the message string:\n\n```typescript\n\u002F\u002F EOA — use personal_sign (EIP-191)\nconst signature = await wallet.signMessage(messageToSign)\n\n\u002F\u002F SCW — use the wallet SDK's signMessage\nconst signature = await smartWallet.signMessage({ message: messageToSign })\n```\n\n### Step 4: Send the Request\n\nBase64-encode a JSON object containing the challenge `info` fields plus your `address`, `type`, and `signature`, and send it as the `agentkit` HTTP header:\n\n```typescript\nconst header = btoa(JSON.stringify({\n  ...info,                               \u002F\u002F all fields from the challenge\n  address: walletAddress,\n  chainId: \"eip155:8453\",               \u002F\u002F from the supportedChains entry you picked\n  type: \"eip191\",                        \u002F\u002F \"eip191\" for EOA, \"eip1271\" for SCW\n  signature: signature,                  \u002F\u002F hex string from signing\n}))\n\nconst response = await fetch(\"https:\u002F\u002Fapi.example.com\u002Fdata\", {\n  headers: {\n    \"agentkit\": header,\n  },\n})\n```\n\nIf the server grants access (based on the mode), you will receive the resource directly — no payment needed.\n\nIf the server responds with another 402 or an error, fall back to the normal x402 payment flow.\n\n## Access Modes\n\nThe `mode` field in the AgentKit extension tells you what to expect:\n\n| Mode         | What it means                                                  |\n|--------------|----------------------------------------------------------------|\n| `free`       | Human-backed agents always get free access                     |\n| `free-trial` | First N requests are free, then you must pay (N is per human, not per agent) |\n| `discount`   | You get N% off the price (pay the discounted amount via x402)  |\n\nFor `discount` mode: send **both** the `agentkit` header and the x402 payment header, but pay the discounted price. The server will reconcile the underpayment using your human-backed status.\n\n## Common Errors and How to Handle Them\n\n### \"Agent is not registered in the AgentBook\"\n\nYour wallet address is not registered. You need to register first using the AgentKit CLI:\n\n```bash\nnpx @worldcoin\u002Fagentkit-cli register \u003Cyour-wallet-address>\n```\n\nThis opens a World ID verification flow that ties your wallet to an anonymous human identifier on-chain. Registration only needs to happen once per wallet.\n\n### \"Signature verification failed\"\n\n- **Wrong signature type:** Make sure `type` matches your wallet. Use `eip191` for EOA, `eip1271` for SCW.\n- **Wrong message format:** The SIWE message must follow the exact format described in Step 3. Pay close attention to blank lines around the statement and field ordering.\n- **Wrong chain ID:** The `chainId` in the payload must be CAIP-2 format (`eip155:8453`), but the SIWE message `chainId` field must be the numeric chain ID (`8453`).\n\n### \"Invalid agentkit header: not valid base64\"\n\nYour header is not properly base64-encoded. Ensure you are encoding the full JSON string: `btoa(JSON.stringify(payload))`.\n\n### \"Message validation failed\" \u002F \"issuedAt is too old\"\n\nThe challenge has expired. Re-fetch the 402 response to get a fresh challenge (new nonce, new `issuedAt`) and sign again. Challenges expire after 5 minutes by default.\n\n### \"Unsupported chain namespace\"\n\nYou are using a chain that the server does not support. Check `supportedChains` in the 402 response and pick a chain\u002Ftype pair that matches your wallet.\n",{"name":5,"description":7},"main","c8f4cf0617435584bebec29395be208f2e717994",".agents\u002Fskills\u002Fagentkit-x402",0,"https:\u002F\u002Fgithub.com\u002Fnacmonad\u002Fsoulvault","https:\u002F\u002Fgithub.com\u002Fnacmonad","2026-09-15 01:22:14",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add nacmonad\u002Fsoulvault --skill agentkit-x402",{"tool":61,"command":62},"bunx","bunx skills add nacmonad\u002Fsoulvault --skill agentkit-x402",{"tool":64,"command":65},"pnpm","pnpm dlx skills add nacmonad\u002Fsoulvault --skill agentkit-x402","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fnacmonad\u002Fsoulvault\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fagentkit-x402\u002FSKILL.md",true,[],[70,95,103,126,152,177],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":77,"publishedAt":43},"01M6H41SQQTYRCRNFX7TKJNCTE","soulvault","Operate SoulVault swarms and agent identities. Use when working with the SoulVault CLI, swarm membership, epoch rotation, backup\u002Frestore, historical key grants, 0G-backed encrypted state publication, ERC-8004 agent identity registration, or when an agent needs to watch\u002Frespond to SoulVault swarm contract events such as JoinApproved, EpochRotated, BackupRequested, MemberFileMappingUpdated, HistoricalKeyBundleGranted, or AgentMessagePosted.","https:\u002F\u002Fgithub.com\u002Fnacmonad\u002Fsoulvault\u002Fblob\u002Fmain\u002Fskills\u002Fsoulvault\u002FSKILL.md",[76],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[72,78,79,80,81,82,39,83,84,85,26,86,87,88,89,90,91,92,93,94],"cli","state","backup","swarm","grants","restore","registration","erc-8004","as","epoch","respond","with","encrypted","operate","8004 agent","rotation","8004",{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":43},"01M6H41PG1XVNCC7VS2DJW1KDF","dmk-speculos-browser","https:\u002F\u002Fgithub.com\u002Fnacmonad\u002Fsoulvault\u002Fblob\u002Fmain\u002Fpackages\u002Fdmk-speculos-browser\u002FSKILL.md",[],[101,102],"browser","dmk speculos browser",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":109,"publishedAt":43},"01M6H41JDQPF6XPPMCV4QNWYEF","ledger-dmk-implementation","Execute Ledger Device Management Kit (DMK) signing operations safely: initialize the SDK, establish a device session, verify device state, open the correct chain app, perform signing or device management operations, and return the result. Use when a developer needs to implement a signing operation (transaction, message, typed data), derive or retrieve an address from a Ledger device, send any command to a Ledger device, or perform device management operations such as genuine check, app install, or app uninstall.","https:\u002F\u002Fgithub.com\u002Fnacmonad\u002Fsoulvault\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fledger-dmk-implementation\u002FSKILL.md",[],[110,111,112,113,114,79,115,116,117,118,119,39,120,86,121,122,123,124,125,30],"implementation","ledger","ledger dmk implementation","uninstall","implement","open","correct","check","initialize","session","transaction","app","chain","operation","device management","kit",{"skillNo":127,"name":97,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":136,"publishedAt":43},"01M6H41E4WXGRC57R42M9VC4WE","Drive Ledger DMK browser tests against Speculos, Ledger's device emulator, using @soulvault\u002Fdmk-speculos-browser. Use when a developer needs to run browser-based Ledger signing tests (Playwright + Chromium), wire the emulated transport into DMK, control the emulated device screen and buttons from a test, or record a reproducible proof of a device-signed flow. Covers the transport registration, the test controller, the Playwright fixture, required environment variables, and the concurrency rule that tests must never auto-approve device actions.","https:\u002F\u002Fgithub.com\u002Fnacmonad\u002Fsoulvault\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdmk-speculos-browser\u002FSKILL.md",[131],{"categoryNo":132,"categoryName":133,"taxonomyType":134,"taxonomyTypeDesc":135},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[101,102,137,138,139,140,141,142,143,144,39,145,146,84,147,148,149,150,151,30],"chromium","playwright","test","actions","Reproducible","controller","concurrency","environment","auto","never","record","fixture","control","tests","Variables",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":161,"publishedAt":43},"01M6H41A77HPQS3VVFY65A1C8N","dmk-intent-vocabulary","Map developer intent and natural language to the correct Ledger Device Management Kit (DMK) components, operations, and API methods. Use when a developer's request is phrased informally, incompletely, or in terms of outcomes rather than API methods, when the intent is ambiguous and needs mapping to a specific DMK component or operation, or when a developer asks 'how do I...', 'what's the difference between...', or describes a symptom rather than an API.","https:\u002F\u002Fgithub.com\u002Fnacmonad\u002Fsoulvault\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdmk-intent-vocabulary\u002FSKILL.md",[158],{"categoryNo":159,"categoryName":160,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000030","开发工程师",[162,163,164,165,166,167,168,169,116,170,39,171,172,173,174,175,176,123,124,125],"intent","vocabulary","dmk intent vocabulary","components","component","developer","api","how","operations","outcomes","methods","do","natural language","map","mapping",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":184,"publishedAt":43},"01M6H4164305CKMZQKKRPBQCTY","dmk-business-logic","Explain the design rationale and domain concepts behind the Ledger Device Management Kit (DMK) API, including Clear Signing, Secure Channel, Ledger OS (BOLOS), Device Actions vs Commands, sessions, transports, derivation paths, and Genuine Check. Use when a developer asks 'what is X?' about a DMK concept, 'why does X work this way?' about an API design decision, or 'what's the difference between X and Y?' for DMK components.","https:\u002F\u002Fgithub.com\u002Fnacmonad\u002Fsoulvault\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdmk-business-logic\u002FSKILL.md",[183],{"categoryNo":159,"categoryName":160,"taxonomyType":20,"taxonomyTypeDesc":21},[185,186,187,188,165,189,140,167,168,190,191,192,193,194,195,196,124,197,125,198],"business","logic","dmk business logic","design","secure","why","decision","work","domain","commands","os","paths","concepts","concept"]