[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JDPFX44GRF0P034RXTVSJ4":3,"skill-same:01M6JDPFX44GRF0P034RXTVSJ4":76},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":27,"publishedAt":48,"linkOnly":49,"markdownContent":50,"markdownBody":51,"frontMatter":52,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":59,"ownerHtmlUrl":60,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":61,"install":62,"resources":75},"01M6JDPFX44GRF0P034RXTVSJ4","x-api",null,"X\u002FTwitter API integration for posting tweets, threads, reading timelines, search, and analytics. Covers OAuth auth patterns, rate limits, and platform-native content posting. Use when the user wants to interact with X programmatically.","S3YED\u002Fappie-kit","S3YED","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F62743867?v=4","01M6JBKBRRVP6KMS0VWZ27T3R6","01M6JBKBX0KG30284PW1DBYJT1",14,"MIT","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fecc\u002Fx-api\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"api","x api","patterns","auth patterns","for","oauth auth","threads","reading","with","native","posting","platform","auth","api integration","use","twitter","OAuth","integration","search","analytics","2026-11-10 10:12:30",false,"---\nname: x-api\ndescription: X\u002FTwitter API integration for posting tweets, threads, reading timelines, search, and analytics. Covers OAuth auth patterns, rate limits, and platform-native content posting. Use when the user wants to interact with X programmatically.\norigin: ECC\n---\n\n# X API\n\n> **Drift-prone skill.** X API endpoints, access tiers, quotas, and write\n> permissions change frequently. Verify current developer docs and account\n> access before quoting rate limits or implementing a posting\u002Fsearch flow.\n\nProgrammatic interaction with X (Twitter) for posting, reading, searching, and analytics.\n\n## When to Activate\n\n- User wants to post tweets or threads programmatically\n- Reading timeline, mentions, or user data from X\n- Searching X for content, trends, or conversations\n- Building X integrations or bots\n- Analytics and engagement tracking\n- User says \"post to X\", \"tweet\", \"X API\", or \"Twitter API\"\n\n## Authentication\n\n### OAuth 2.0 Bearer Token (App-Only)\n\nBest for: read-heavy operations, search, public data.\n\n```bash\n# Environment setup\nexport X_BEARER_TOKEN=\"your-bearer-token\"\n```\n\n```python\nimport os\nimport requests\n\nbearer = os.environ[\"X_BEARER_TOKEN\"]\nheaders = {\"Authorization\": f\"Bearer {bearer}\"}\n\n# Search recent tweets\nresp = requests.get(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\u002Fsearch\u002Frecent\",\n    headers=headers,\n    params={\"query\": \"claude code\", \"max_results\": 10}\n)\ntweets = resp.json()\n```\n\n### OAuth 1.0a (User Context)\n\nRequired for: posting tweets, managing account, DMs, and any write flow.\n\n```bash\n# Environment setup — source before use\nexport X_CONSUMER_KEY=\"your-consumer-key\"\nexport X_CONSUMER_SECRET=\"your-consumer-secret\"\nexport X_ACCESS_TOKEN=\"your-access-token\"\nexport X_ACCESS_TOKEN_SECRET=\"your-access-token-secret\"\n```\n\nLegacy aliases such as `X_API_KEY`, `X_API_SECRET`, and `X_ACCESS_SECRET` may exist in older setups. Prefer the `X_CONSUMER_*` and `X_ACCESS_TOKEN_SECRET` names when documenting or wiring new flows.\n\n```python\nimport os\nfrom requests_oauthlib import OAuth1Session\n\noauth = OAuth1Session(\n    os.environ[\"X_CONSUMER_KEY\"],\n    client_secret=os.environ[\"X_CONSUMER_SECRET\"],\n    resource_owner_key=os.environ[\"X_ACCESS_TOKEN\"],\n    resource_owner_secret=os.environ[\"X_ACCESS_TOKEN_SECRET\"],\n)\n```\n\n## Core Operations\n\n### Post a Tweet\n\n```python\nresp = oauth.post(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\",\n    json={\"text\": \"Hello from Claude Code\"}\n)\nresp.raise_for_status()\ntweet_id = resp.json()[\"data\"][\"id\"]\n```\n\n### Post a Thread\n\n```python\ndef post_thread(oauth, tweets: list[str]) -> list[str]:\n    ids = []\n    reply_to = None\n    for text in tweets:\n        payload = {\"text\": text}\n        if reply_to:\n            payload[\"reply\"] = {\"in_reply_to_tweet_id\": reply_to}\n        resp = oauth.post(\"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\", json=payload)\n        tweet_id = resp.json()[\"data\"][\"id\"]\n        ids.append(tweet_id)\n        reply_to = tweet_id\n    return ids\n```\n\n### Read User Timeline\n\n```python\nresp = requests.get(\n    f\"https:\u002F\u002Fapi.x.com\u002F2\u002Fusers\u002F{user_id}\u002Ftweets\",\n    headers=headers,\n    params={\n        \"max_results\": 10,\n        \"tweet.fields\": \"created_at,public_metrics\",\n    }\n)\n```\n\n### Search Tweets\n\n```python\nresp = requests.get(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\u002Fsearch\u002Frecent\",\n    headers=headers,\n    params={\n        \"query\": \"from:affaanmustafa -is:retweet\",\n        \"max_results\": 10,\n        \"tweet.fields\": \"public_metrics,created_at\",\n    }\n)\n```\n\n### Pull Recent Original Posts for Voice Modeling\n\n```python\nresp = requests.get(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\u002Fsearch\u002Frecent\",\n    headers=headers,\n    params={\n        \"query\": \"from:affaanmustafa -is:retweet -is:reply\",\n        \"max_results\": 25,\n        \"tweet.fields\": \"created_at,public_metrics\",\n    }\n)\nvoice_samples = resp.json()\n```\n\n### Get User by Username\n\n```python\nresp = requests.get(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Fusers\u002Fby\u002Fusername\u002Faffaanmustafa\",\n    headers=headers,\n    params={\"user.fields\": \"public_metrics,description,created_at\"}\n)\n```\n\n### Upload Media and Post\n\n```python\n# Media upload uses v1.1 endpoint\n\n# Step 1: Upload media\nmedia_resp = oauth.post(\n    \"https:\u002F\u002Fupload.twitter.com\u002F1.1\u002Fmedia\u002Fupload.json\",\n    files={\"media\": open(\"image.png\", \"rb\")}\n)\nmedia_id = media_resp.json()[\"media_id_string\"]\n\n# Step 2: Post with media\nresp = oauth.post(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\",\n    json={\"text\": \"Check this out\", \"media\": {\"media_ids\": [media_id]}}\n)\n```\n\n## Rate Limits\n\nX API rate limits vary by endpoint, auth method, and account tier, and they change over time. Always:\n- Check the current X developer docs before hardcoding assumptions\n- Read `x-rate-limit-remaining` and `x-rate-limit-reset` headers at runtime\n- Back off automatically instead of relying on static tables in code\n\n```python\nimport time\n\nremaining = int(resp.headers.get(\"x-rate-limit-remaining\", 0))\nif remaining \u003C 5:\n    reset = int(resp.headers.get(\"x-rate-limit-reset\", 0))\n    wait = max(0, reset - int(time.time()))\n    print(f\"Rate limit approaching. Resets in {wait}s\")\n```\n\n## Error Handling\n\n```python\nresp = oauth.post(\"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\", json={\"text\": content})\nif resp.status_code == 201:\n    return resp.json()[\"data\"][\"id\"]\nelif resp.status_code == 429:\n    reset = int(resp.headers[\"x-rate-limit-reset\"])\n    raise Exception(f\"Rate limited. Resets at {reset}\")\nelif resp.status_code == 403:\n    raise Exception(f\"Forbidden: {resp.json().get('detail', 'check permissions')}\")\nelse:\n    raise Exception(f\"X API error {resp.status_code}: {resp.text}\")\n```\n\n## Security\n\n- **Never hardcode tokens.** Use environment variables or `.env` files.\n- **Never commit `.env` files.** Add to `.gitignore`.\n- **Rotate tokens** if exposed. Regenerate at developer.x.com.\n- **Use read-only tokens** when write access is not needed.\n- **Store OAuth secrets securely** — not in source code or logs.\n\n## Integration with Content Engine\n\nUse `brand-voice` plus `content-engine` to generate platform-native content, then post via X API:\n1. Pull recent original posts when voice matching matters\n2. Build or reuse a `VOICE PROFILE`\n3. Generate content with `content-engine` in X-native format\n4. Validate length and thread structure\n5. Return the draft for approval unless the user explicitly asked to post now\n6. Post via X API only after approval\n7. Track engagement via public_metrics\n\n## Related Skills\n\n- `brand-voice` — Build a reusable voice profile from real X and site\u002Fsource material\n- `content-engine` — Generate platform-native content for X\n- `crosspost` — Distribute content across X, LinkedIn, and other platforms\n- `connections-optimizer` — Reorganize the X graph before drafting network-driven outreach\n","# X API\n\n> **Drift-prone skill.** X API endpoints, access tiers, quotas, and write\n> permissions change frequently. Verify current developer docs and account\n> access before quoting rate limits or implementing a posting\u002Fsearch flow.\n\nProgrammatic interaction with X (Twitter) for posting, reading, searching, and analytics.\n\n## When to Activate\n\n- User wants to post tweets or threads programmatically\n- Reading timeline, mentions, or user data from X\n- Searching X for content, trends, or conversations\n- Building X integrations or bots\n- Analytics and engagement tracking\n- User says \"post to X\", \"tweet\", \"X API\", or \"Twitter API\"\n\n## Authentication\n\n### OAuth 2.0 Bearer Token (App-Only)\n\nBest for: read-heavy operations, search, public data.\n\n```bash\n# Environment setup\nexport X_BEARER_TOKEN=\"your-bearer-token\"\n```\n\n```python\nimport os\nimport requests\n\nbearer = os.environ[\"X_BEARER_TOKEN\"]\nheaders = {\"Authorization\": f\"Bearer {bearer}\"}\n\n# Search recent tweets\nresp = requests.get(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\u002Fsearch\u002Frecent\",\n    headers=headers,\n    params={\"query\": \"claude code\", \"max_results\": 10}\n)\ntweets = resp.json()\n```\n\n### OAuth 1.0a (User Context)\n\nRequired for: posting tweets, managing account, DMs, and any write flow.\n\n```bash\n# Environment setup — source before use\nexport X_CONSUMER_KEY=\"your-consumer-key\"\nexport X_CONSUMER_SECRET=\"your-consumer-secret\"\nexport X_ACCESS_TOKEN=\"your-access-token\"\nexport X_ACCESS_TOKEN_SECRET=\"your-access-token-secret\"\n```\n\nLegacy aliases such as `X_API_KEY`, `X_API_SECRET`, and `X_ACCESS_SECRET` may exist in older setups. Prefer the `X_CONSUMER_*` and `X_ACCESS_TOKEN_SECRET` names when documenting or wiring new flows.\n\n```python\nimport os\nfrom requests_oauthlib import OAuth1Session\n\noauth = OAuth1Session(\n    os.environ[\"X_CONSUMER_KEY\"],\n    client_secret=os.environ[\"X_CONSUMER_SECRET\"],\n    resource_owner_key=os.environ[\"X_ACCESS_TOKEN\"],\n    resource_owner_secret=os.environ[\"X_ACCESS_TOKEN_SECRET\"],\n)\n```\n\n## Core Operations\n\n### Post a Tweet\n\n```python\nresp = oauth.post(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\",\n    json={\"text\": \"Hello from Claude Code\"}\n)\nresp.raise_for_status()\ntweet_id = resp.json()[\"data\"][\"id\"]\n```\n\n### Post a Thread\n\n```python\ndef post_thread(oauth, tweets: list[str]) -> list[str]:\n    ids = []\n    reply_to = None\n    for text in tweets:\n        payload = {\"text\": text}\n        if reply_to:\n            payload[\"reply\"] = {\"in_reply_to_tweet_id\": reply_to}\n        resp = oauth.post(\"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\", json=payload)\n        tweet_id = resp.json()[\"data\"][\"id\"]\n        ids.append(tweet_id)\n        reply_to = tweet_id\n    return ids\n```\n\n### Read User Timeline\n\n```python\nresp = requests.get(\n    f\"https:\u002F\u002Fapi.x.com\u002F2\u002Fusers\u002F{user_id}\u002Ftweets\",\n    headers=headers,\n    params={\n        \"max_results\": 10,\n        \"tweet.fields\": \"created_at,public_metrics\",\n    }\n)\n```\n\n### Search Tweets\n\n```python\nresp = requests.get(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\u002Fsearch\u002Frecent\",\n    headers=headers,\n    params={\n        \"query\": \"from:affaanmustafa -is:retweet\",\n        \"max_results\": 10,\n        \"tweet.fields\": \"public_metrics,created_at\",\n    }\n)\n```\n\n### Pull Recent Original Posts for Voice Modeling\n\n```python\nresp = requests.get(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\u002Fsearch\u002Frecent\",\n    headers=headers,\n    params={\n        \"query\": \"from:affaanmustafa -is:retweet -is:reply\",\n        \"max_results\": 25,\n        \"tweet.fields\": \"created_at,public_metrics\",\n    }\n)\nvoice_samples = resp.json()\n```\n\n### Get User by Username\n\n```python\nresp = requests.get(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Fusers\u002Fby\u002Fusername\u002Faffaanmustafa\",\n    headers=headers,\n    params={\"user.fields\": \"public_metrics,description,created_at\"}\n)\n```\n\n### Upload Media and Post\n\n```python\n# Media upload uses v1.1 endpoint\n\n# Step 1: Upload media\nmedia_resp = oauth.post(\n    \"https:\u002F\u002Fupload.twitter.com\u002F1.1\u002Fmedia\u002Fupload.json\",\n    files={\"media\": open(\"image.png\", \"rb\")}\n)\nmedia_id = media_resp.json()[\"media_id_string\"]\n\n# Step 2: Post with media\nresp = oauth.post(\n    \"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\",\n    json={\"text\": \"Check this out\", \"media\": {\"media_ids\": [media_id]}}\n)\n```\n\n## Rate Limits\n\nX API rate limits vary by endpoint, auth method, and account tier, and they change over time. Always:\n- Check the current X developer docs before hardcoding assumptions\n- Read `x-rate-limit-remaining` and `x-rate-limit-reset` headers at runtime\n- Back off automatically instead of relying on static tables in code\n\n```python\nimport time\n\nremaining = int(resp.headers.get(\"x-rate-limit-remaining\", 0))\nif remaining \u003C 5:\n    reset = int(resp.headers.get(\"x-rate-limit-reset\", 0))\n    wait = max(0, reset - int(time.time()))\n    print(f\"Rate limit approaching. Resets in {wait}s\")\n```\n\n## Error Handling\n\n```python\nresp = oauth.post(\"https:\u002F\u002Fapi.x.com\u002F2\u002Ftweets\", json={\"text\": content})\nif resp.status_code == 201:\n    return resp.json()[\"data\"][\"id\"]\nelif resp.status_code == 429:\n    reset = int(resp.headers[\"x-rate-limit-reset\"])\n    raise Exception(f\"Rate limited. Resets at {reset}\")\nelif resp.status_code == 403:\n    raise Exception(f\"Forbidden: {resp.json().get('detail', 'check permissions')}\")\nelse:\n    raise Exception(f\"X API error {resp.status_code}: {resp.text}\")\n```\n\n## Security\n\n- **Never hardcode tokens.** Use environment variables or `.env` files.\n- **Never commit `.env` files.** Add to `.gitignore`.\n- **Rotate tokens** if exposed. Regenerate at developer.x.com.\n- **Use read-only tokens** when write access is not needed.\n- **Store OAuth secrets securely** — not in source code or logs.\n\n## Integration with Content Engine\n\nUse `brand-voice` plus `content-engine` to generate platform-native content, then post via X API:\n1. Pull recent original posts when voice matching matters\n2. Build or reuse a `VOICE PROFILE`\n3. Generate content with `content-engine` in X-native format\n4. Validate length and thread structure\n5. Return the draft for approval unless the user explicitly asked to post now\n6. Post via X API only after approval\n7. Track engagement via public_metrics\n\n## Related Skills\n\n- `brand-voice` — Build a reusable voice profile from real X and site\u002Fsource material\n- `content-engine` — Generate platform-native content for X\n- `crosspost` — Distribute content across X, LinkedIn, and other platforms\n- `connections-optimizer` — Reorganize the X graph before drafting network-driven outreach\n",{"name":5,"origin":53,"description":7},"ECC","master","8ec37df6d71fb664ea19d32c079e7d3ff931a8e0","skills\u002Fecc\u002Fx-api",3,"https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit","https:\u002F\u002Fweblyfe.ai","https:\u002F\u002Fgithub.com\u002FS3YED","2026-08-27 01:54:02",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add S3YED\u002Fappie-kit --skill x-api",{"tool":68,"command":69},"bunx","bunx skills add S3YED\u002Fappie-kit --skill x-api",{"tool":71,"command":72},"pnpm","pnpm dlx skills add S3YED\u002Fappie-kit --skill x-api","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fecc\u002Fx-api\u002FSKILL.md",true,[],[77,111,144,169,199,223],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":92,"publishedAt":48},"01M6JFD4M6N4DSGC7TXEJ5R3J2","ai-music","AI music generation and audio tools: HeartMuLa lyrics-to-music generation, songwriting craft (+ Suno prompts), and audio spectrogram\u002Ffeature visualization.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fwethlete\u002Fai-music\u002FSKILL.md",[83,86,89],{"categoryNo":84,"categoryName":85,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":87,"categoryName":88,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110],"music","ai music","humanizer","visualization","Tools","Audio","hermes","hermes agent","songwriting","suno","lyrics","prompts","heartmula","craft","generation","feature","ai music generation","music generation",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":123,"publishedAt":48},"01M6JFCZE4XNFQFMNZDHKHT5V5","agentic-webdesign-design-system-ingestion","Use v0 Design Systems 2.0, Bolt Design System Agents, or Lovable to generate production UI from a client's real design system components — not generic Tailwind. Use when building a client website where brand consistency matters.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-design-system-ingestion\u002FSKILL.md",[117,120],{"categoryNo":118,"categoryName":119,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":121,"categoryName":122,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000032","设计师",[124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143],"design","agentic","design system","system","ingestion","webdesign","agentic webdesign design system ingestion","components","generate","design systems","website","ui","Tailwind","bolt","lovable","v0","design-system","wed","design system components","appie",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":152,"publishedAt":48},"01M6JFCVPX3913CFAS6QQJ33ZB","agentic-webdesign-agent-elements","Use 21st.dev Agent Elements — 25 shadcn\u002Fui components purpose-built for AI agent UIs. Tool cards (Bash, Edit, Search, Plan, Subagent, MCP), chat, input, streaming. Open source, shadcn-registry install, no runtime lock-in.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-agent-elements\u002FSKILL.md",[150,151],{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":121,"categoryName":122,"taxonomyType":25,"taxonomyTypeDesc":26},[125,153,129,154,155,156,131,157,46,158,159,160,161,162,163,164,165,166,167,168],"elements","agentic webdesign agent elements","MCP","ai agent","registry","streaming","open source","open","Bash","plan","subagent","edit","install","input","lock","source",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":179,"publishedAt":48},"01M6JFCQC7H65M9QJ6TRE71BS1","vercel-deployment","Deploy static sites and frontends to Vercel — handles both CLI and REST API paths, including the CLI token sanitization workaround.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fvercel-deployment\u002FSKILL.md",[175,178],{"categoryNo":176,"categoryName":177,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},[180,181,182,183,184,185,186,187,188,189,28,190,191,192,193,194,195,196,197,198],"deployment","vercel deployment","vercel","macos","cli","linux","windows","deploy","vercel deploy","REST","site","deploy to vercel","token","rest api","host","sites","paths","sanitization","static site",{"skillNo":200,"name":201,"nameZh":6,"description":202,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":203,"categories":204,"keywords":206,"publishedAt":48},"01M6JFCM4SMTXBM5A01BK2YQG1","software-quality-workflows","Umbrella workflow for TDD, debugging, code simplification, spikes, pre-commit review, and debugger-assisted investigation.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fsoftware-quality-workflows\u002FSKILL.md",[205],{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},[207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,32],"workflows","quality","software","software quality workflows","review","tdd","workflow","commit","debugging","code","debugger","pre-commit","investigation","code simplification","user","simplification",{"skillNo":224,"name":225,"nameZh":6,"description":226,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":227,"categories":228,"keywords":236,"publishedAt":48},"01M6JFCGD0M6CEATY01W7YN6DB","react-component-refactoring","Safely refactor large React components into smaller, maintainable pieces using proven patterns","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Freact-component-refactoring\u002FSKILL.md",[229,232,235],{"categoryNo":230,"categoryName":231,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":233,"categoryName":234,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},[237,238,239,240,241,242,243,244,183,245,246,131,247,186,248,216,249,250,30,251],"react","component","refactoring","component refactoring","react component","react component refactoring","frontend","writing","safe","typescript","react components","modular","refactor","simplify","test-driven-development"]