一键导入
integrations
Technical details for external platform integrations (APIs, credentials, rate limits). Use when posting, debugging issues, or adding new integrations.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Technical details for external platform integrations (APIs, credentials, rate limits). Use when posting, debugging issues, or adding new integrations.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Strategy for engaging with others' posts across platforms (X, LinkedIn, etc.). Finding targets, writing valuable replies, building connections.
Gather context about repo owner, products, and domain. Build domain expertise by reading top voices. Use proactively before creating content.
| name | integrations |
| description | Technical details for external platform integrations (APIs, credentials, rate limits). Use when posting, debugging issues, or adding new integrations. |
| user-invocable | false |
agent/outputs/{platform}/process-outputs.yml workflow runs on scheduleposted/Stable tokens that don't expire.
| Name | Type | Description |
|---|---|---|
X_API_KEY | var | Consumer API Key |
X_API_KEY_SECRET | secret | Consumer API Secret |
X_ACCESS_TOKEN | secret | Access Token |
X_ACCESS_TOKEN_SECRET | secret | Access Token Secret |
Warning: Refresh token rotates on each use - not recommended.
| Name | Type | Description |
|---|---|---|
X_CLIENT_ID | var | OAuth 2.0 Client ID |
X_CLIENT_SECRET | secret | OAuth 2.0 Client Secret |
X_REFRESH_TOKEN | secret | Refresh token (rotates!) |
Reply files use REPLY_TO: header with the numeric tweet ID (NOT a handle or URL).
REPLY_TO: 1893847362910283745
Your reply text here...
NEVER use handles like @SomeUser — the API requires numeric IDs matching ^[0-9]{10,}$.
To find a tweet ID: it's the number at the end of the tweet URL (e.g., https://x.com/user/status/1893847362910283745).
Invalid reply targets are auto-skipped to skipped/.
App password authentication (no OAuth complexity).
| Name | Type | Description |
|---|---|---|
BLUESKY_HANDLE | var | Bluesky handle (e.g., user.bsky.social) |
BLUESKY_APP_PASSWORD | secret | App password (Settings > App Passwords) |
Reply files use REPLY_TO: header with an AT URI (NOT a handle or URL).
REPLY_TO: at://did:plc:nphpplr7dcdi4wyjuizmz2wg/app.bsky.feed.post/3mfhgscgm4h2o
Your reply text here...
NEVER use handles like @someone.com — the API requires AT URIs starting with at://.
Script resolves URI → CID automatically for strong refs.
Invalid reply targets are auto-skipped to skipped/.
Same --- separator as X. Each part must be under 300 graphemes.
Thread replies chain via reply.root (first post) + reply.parent (previous post).
gh variable list | grep X_
If variables exist, presume secrets are also configured.
gh run list --workflow=process-outputs.yml --limit 5
gh run view <run-id> --log
# Step 1: Get latest run ID
gh run list --workflow=process-outputs.yml --limit 1 --json databaseId,createdAt
# Step 2: Extract tweet IDs from that run's logs
gh run view <run_id> --log 2>/dev/null | grep 'INFO Response:' | head -5
Log format: INFO Response: {"data": {"id": "2033632169034125426", "text": "..."}}
Extract the numeric ID from "id": "XXXXXXXXXX" — use this as REPLY_TO: value.
Timing: Only do this when the run completed <25 minutes ago (to hit the 150x <30min reply-to-own window).
| Symptom | Cause | Fix |
|---|---|---|
| 429 errors | Rate limit | Wait 15+ min |
Files in posted/ but not posted | Bad exit code | Check integration script logs |
Files in skipped/ | Invalid content (bad reply target, duplicate, etc.) | Check reply format — must use numeric ID (X) or AT URI (Bluesky), not handles |
| Auth errors | Missing credentials | Check gh variable list |
agent/integrations/{platform}/post.sh
post.sh "content"agent/outputs/{platform}/process-outputs.yml env section