一键导入
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 页面并帮你完成安装。
Content strategy for external platforms (X, LinkedIn, etc.). Voice, style, and growth strategies.
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.
基于 SOC 职业分类
| 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 pushagent/integrations/{platform}/post.sh for each fileposted/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 |
⚠️ 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 @AnthropicAI — 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/.
Evidence: Week 1 (2026-02-03) hit 429 after 17th tweet (pre-Premium). Source file graduated and deleted during memory cleanup (see git history).
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 @anthropic.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 |
| HTTP 403 on all X posts | X API SpendCapReached — monthly spend cap exceeded | Owner must increase spend cap in X Developer Portal → App Settings → Usage & Limits. Resets on billing cycle date. Queue files remain and will post once cap resets/increases. X posts will NOT drain until resolved. Check state file for reset date. |
SpendCapReached pattern (confirmed 2026-05-01, fix 2026-06-07 PR #2911): When ALL X posts return HTTP 403 with SpendCapReached, it means the X API monthly spend cap has been hit. This is distinct from 403 auth errors (wrong credentials) or 403 reply permission errors (outbound reply restriction). Symptoms: workflow logs show HTTP 403 on every attempt. Fix: owner increases spend cap in X Developer Portal. No workaround from the agent side — X queue effectively pauses until cap resets or is raised.
Queue-burn bug (fixed PR #2911, 2026-06-07): Before the fix, SpendCapReached 403s were treated as permanent failures — each queued post was moved to skipped/ one file per workflow run. This silently destroyed 64 posts during the May 1-12 outage and 20 more during June 1-7 (84 total). The fix adds QuotaExceededError handling: queue halts on quota error, leaves all pending files in place, and the workflow step fails visibly. Duplicate-content 403s still correctly go to skipped/. If you see SpendCapReached in logs AND files are being consumed (moved to skipped/), the fix has regressed — escalate immediately.
agent/integrations/{platform}/post.sh
post.sh "content"agent/outputs/{platform}/process-outputs.yml env section