skills/kangarooking/x-publish/SKILL.md
Publish tweets and threads to X (Twitter) draft using browser automation. Use when user wants to publish content to X, save to drafts, or mentions "publish to X", "post tweet", "x-publish", "发布推文". Supports short tweets and threads. NEVER auto-publish, always saves to draft.
npx skillsauth add aiskillstore/marketplace x-publishInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Publish tweets and threads to X draft using Playwright browser automation.
pip install Pillow pyobjc-framework-Cocoapip install Pillow pywin32Single tweet ≤280 characters
Multiple tweets connected (3-10 tweets)
Copy text to system clipboard for paste operation:
# Copy text to clipboard
python scripts/copy_to_clipboard.py text "Tweet content here"
# Copy from file
python scripts/copy_to_clipboard.py text --file /tmp/tweet.txt
Step 1: Prepare Content
# Save tweet to temp file
echo "Tweet content" > /tmp/tweet.txt
# Copy to clipboard
python scripts/copy_to_clipboard.py text --file /tmp/tweet.txt
Step 2: Open Compose
browser_navigate: https://x.com/compose/post
Step 3: Paste Content
browser_snapshot → Find tweet textbox
browser_click: textbox
browser_press_key: Meta+v
Step 4: Save Draft
browser_click: X (close button)
browser_click: "Save" or "保存" in dialog
Step 5: Verify
Report: "Draft saved. Please review at https://x.com/compose/drafts"
Step 1: Prepare Content Parse thread into individual tweets:
### 1/5
First tweet content...
### 2/5
Second tweet content...
Step 2: Open Compose
browser_navigate: https://x.com/compose/post
Step 3: Add First Tweet
python scripts/copy_to_clipboard.py text "First tweet content"
browser_click: textbox
browser_press_key: Meta+v
Step 4: Add More Tweets For each additional tweet:
browser_click: "Add another post" / "添加" button
browser_press_key: Meta+v (after copying next tweet)
Step 5: Save Draft
browser_click: X (close button)
browser_click: "Save" in dialog
Step 6: Verify
Report: "Thread draft saved ({n} tweets). Review at https://x.com/compose/drafts"
❌ browser_snapshot after every action
✅ Use action return values for next step
✅ Prepare all tweet content before browser operations
✅ Copy to clipboard while navigating
Navigate → Paste first tweet → Add tweet → Paste → ... → Save
Common elements in X compose:
| Element | Description | Typical ref pattern | |---------|-------------|-------------------| | Tweet textbox | Main input area | textbox with "What's happening" | | Add tweet button | "+" or "添加" | button near compose area | | Close button | X icon | button top-left | | Save draft | In close dialog | "Save" / "保存" button | | Drafts link | View saved drafts | link to /compose/drafts |
User: /x-publish "Claude 4.5发布了,extended thinking是真正的游戏规则改变者。"
# 1. Copy to clipboard
python scripts/copy_to_clipboard.py text "Claude 4.5发布了,extended thinking是真正的游戏规则改变者。"
# 2. Navigate and paste
browser_navigate: https://x.com/compose/post
browser_snapshot → find textbox
browser_click: textbox
browser_press_key: Meta+v
# 3. Close and save
browser_click: close button (X)
browser_click: "Save" button
# 4. Report
"Draft saved! Review at: https://x.com/compose/drafts"
User: /x-publish (with thread content from x-create)
Thread:
### 1/3
First point about AI...
### 2/3
Second point...
### 3/3
Conclusion...
Execution:
# Prepare all tweets
tweet1="First point about AI..."
tweet2="Second point..."
tweet3="Conclusion..."
# Navigate
browser_navigate: https://x.com/compose/post
# Tweet 1
python copy_to_clipboard.py text "$tweet1"
browser_click: textbox
browser_press_key: Meta+v
# Tweet 2
python copy_to_clipboard.py text "$tweet2"
browser_click: "Add another post" button
browser_press_key: Meta+v
# Tweet 3
python copy_to_clipboard.py text "$tweet3"
browser_click: "Add another post" button
browser_press_key: Meta+v
# Save
browser_click: close button
browser_click: "Save"
# Report
"Thread draft saved (3 tweets). Review at: https://x.com/compose/drafts"
If login page detected:
→ "Please log in to X first, then run /x-publish again"
If tweet > 280 chars:
→ Split into thread or truncate with warning
If page fails to load:
→ Retry once, then report error
After publishing:
推文已保存到草稿箱!
- 类型: {short/thread}
- 条数: {n}
- 草稿链接: https://x.com/compose/drafts
请手动审核后发布。
development
Apple Human Interface Guidelines for content display components. Use this skill when the user asks about charts component, collection view, image view, web view, color well, image well, activity view, lockup, data visualization, content display, displaying images, rendering web content, color pickers, or presenting collections of items in Apple apps. Also use when the user says how should I display charts, what's the best way to show images, should I use a web view, how do I build a grid of items, what component shows media, or how do I present a share sheet. Cross-references: hig-foundations for color/typography/accessibility, hig-patterns for data visualization patterns, hig-components-layout for structural containers, hig-platforms for platform-specific component behavior.
tools
Automate HelpDesk tasks via Rube MCP (Composio): list tickets, manage views, use canned responses, and configure custom fields. Always search tools first for current schemas.
testing
Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.
tools
GraphQL gives clients exactly the data they need - no more, no less. One endpoint, typed schema, introspection. But the flexibility that makes it powerful also makes it dangerous. Without proper controls, clients can craft queries that bring down your server. This skill covers schema design, resolvers, DataLoader for N+1 prevention, federation for microservices, and client integration with Apollo/urql. Key insight: GraphQL is a contract. The schema is the API documentation. Design it carefully.