Capture writing style profiles, track a pool of users, scan social intelligence, and apply style-matching to draft content. Use when asked to "capture my writing style", "draft a post in my voice", "scan what's trending", "add someone to the pool", or "track @username".
From bopen-toolsnpx claudepluginhub b-open-io/claude-plugins --plugin bopen-toolsThis skill is limited to using the following tools:
images/avatar-wildsatchmo.pnginterface.penreferences/content-strategy.mdscripts/apply.shscripts/capture.shscripts/draft.shscripts/git-activity.shscripts/playground.tsscripts/preview.shscripts/save-token.shscripts/scan.shscripts/setup-token.shscripts/track.shscripts/work.shscripts/x-token.shSearches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
IMPORTANT: If any script fails with TOKEN_SETUP_NEEDED, you MUST run this setup flow before retrying. Do not just report the error — fix it.
Uses agent-browser for browser automation (same pattern as npm-publish skill).
${SKILL_DIR}/scripts/setup-token.sh navigate --username <handle>
Status codes:
ALREADY_VALID — token works, nothing to doNAVIGATED + PAGE_SNAPSHOT + APPS_FOUND — portal is open, proceed to Step 2NOT_LOGGED_IN — tell user: "Log into X at x.com in Chrome, then I'll try again"NO_BROWSER — agent-browser unavailable, fall back to manual instructionsThe script outputs a page snapshot and list of apps. Use agent-browser to navigate:
AB="agent-browser --auto-connect"
# See the page structure
$AB snapshot -i
# Navigate to the app (use href from APPS_FOUND output)
$AB open "<app-url>"
sleep 3
# Find and click "Keys and tokens" tab
$AB snapshot -i
# Look for a link/tab containing "Keys and tokens" → get its ref
$AB click "@<ref>"
sleep 3
Adapt to what you see on the page. The portal structure is:
Dashboard → Projects list → Click app → "Keys and tokens" tab → Bearer Token
If the Bearer Token needs regenerating, find the Regenerate button and click it.
Once on the Keys and tokens page:
${SKILL_DIR}/scripts/setup-token.sh capture --username <handle>
The capture script:
pbpaste)~/.claude/persona/tokens.jsonStatus codes:
TOKEN_SAVED — success, retry the original operationCAPTURE_TIMEOUT — couldn't find token, ask user to copy it manuallyManual fallback: If capture times out, ask the user to copy the Bearer Token value, then:
${SKILL_DIR}/scripts/save-token.sh --username <handle> --token <bearer_token>
Build a writing profile from a user's X posts. Requires a valid X API token (stored in tokens.json or env var).
${SKILL_DIR}/scripts/capture.sh --username <handle> [--count 50] [--output <path>] [--refresh]
.claude/persona/<username>.json--refresh to force re-fetchManage a pool of X users to monitor. Pool stored in .claude/persona/pool.json.
# Add a user (validates via X API, auto-captures profile)
${SKILL_DIR}/scripts/track.sh add <username> [--note "reason"]
# Remove a user
${SKILL_DIR}/scripts/track.sh remove <username>
# List all tracked users with profile status
${SKILL_DIR}/scripts/track.sh list
# Refresh profiles for one or all users
${SKILL_DIR}/scripts/track.sh refresh [username]
Run a social intelligence scan via xAI Grok. Requires XAI_API_KEY.
${SKILL_DIR}/scripts/scan.sh [--topics "Bitcoin SV, AI agents"] [--pool] [--save-topics] [--refresh]
--pool includes recent activity from tracked users--save-topics persists topics to .claude/persona/topics.json--refresh to forceGenerate a styled draft post by combining all context layers — persona profile, body of work, git activity, social intelligence, and content strategy. Calls the Claude API directly.
${SKILL_DIR}/scripts/draft.sh [--profile <path>] [--scan <path>] [--topic "angle"] [--parts 3] [--output <path>] [--model claude-sonnet-4-6]
Context assembly (mirrors satchmo.dev pipeline):
.claude/persona/work.jsonThe LLM cross-references all layers — connecting trending topics to your actual work and recent commits. Requires ANTHROPIC_API_KEY.
Configure the projects/products you've built — gives the LLM context about what to connect trending topics to.
# Add a project
${SKILL_DIR}/scripts/work.sh add --title "Project Name" --desc "What it does" --tags "tag1, tag2" [--repo owner/repo]
# List projects
${SKILL_DIR}/scripts/work.sh list
# Remove a project
${SKILL_DIR}/scripts/work.sh remove "Project Name"
Projects with a --repo field also feed into git activity fetching.
Fetch recent commits from configured repos (pulled from work.json repo fields + explicit repos).
${SKILL_DIR}/scripts/git-activity.sh [--repos "owner/repo1, owner/repo2"] [--per-repo 5] [--hours 48]
Uses GITHUB_TOKEN for private repos. Public repos work without auth.
Assemble a style-matching prompt from a profile and draft content. Does NOT call an LLM — outputs a prompt payload for you to use. Use draft.sh instead for the full pipeline.
${SKILL_DIR}/scripts/apply.sh --draft <path-or--> [--profile <path>] [--format thread|single] [--max-chars 280]
system, prompt, and output_schema fieldsgenerateText() or your preferred modelOpen a local preview of a styled post in the browser. Fully offline — no external services.
# Static preview (self-contained HTML, auto-opens browser)
${SKILL_DIR}/scripts/preview.sh --post <json-path> [--image <path>] [--username <handle>]
# Interactive playground (live editing, image generation, approval workflow)
bun run ${SKILL_DIR}/scripts/playground.ts --data <json-path> [--port 4747] [--open]
--open flag opens browser automatically (default: no auto-open)claude plugin install gemskills@b-open-io)work.sh add --title "..." --desc "..." --tags "..." --repo "..."capture.sh --username <handle>scan.sh --topics "..."draft.sh --parts 3 --output post.jsonbun run playground.ts --data post.json --openOr with a specific topic from the scan:
4b. draft.sh --topic "opportunity from scan" --parts 2 --output post.json
apply.sh --draft <path> --profile .claude/persona/<handle>.jsonpreview.sh --post <output.json>track.sh add wildsatchmo --note "self"track.sh add somedev --note "BSV builder"track.sh list — verify pool and profile statusscan.sh --pool — include pool activity in scansAll data lives in .claude/persona/ in the project root:
.claude/persona/
├── <username>.json # Individual writing profiles
├── tokens.json # X API tokens keyed by username (multi-account)
├── pool.json # Tracked user roster
├── work.json # Body of work / projects config
├── topics.json # Configured scan topics
└── last-scan.json # Cached social intelligence scan
X API tokens are resolved in this order:
tokens.json by username — Multi-account: each persona has its own token in ~/.claude/persona/tokens.json (user-global, outside any repo)tokens.json any account — Falls back to any valid token from other accountsX_BEARER_TOKEN env var — App-only bearer token (legacy, single-account)X_ACCESS_TOKEN env var — OAuth 2.0 user tokenX_REFRESH_TOKEN + X_CLIENT_SECRET_IDTOKEN_SETUP_NEEDED — All methods exhausted, model should run setup-token.shStored at ~/.claude/persona/tokens.json (user-global, never committed to any repo):
{
"wildsatchmo": { "bearer": "AAA...", "added": "2026-03-16T19:00:00Z" },
"bopen_io": { "bearer": "BBB...", "added": "2026-03-16T19:00:00Z" }
}
Env vars are a fallback — prefer tokens.json for multi-account support.
| Variable | Required For | Where to Get | Notes |
|---|---|---|---|
X_BEARER_TOKEN | capture, track (fallback) | https://developer.x.com/en/portal/dashboard | Single-account fallback |
X_ACCESS_TOKEN | capture, track (fallback) | OAuth 2.0 flow | User token, works for reads too |
X_REFRESH_TOKEN | auto-refresh | OAuth 2.0 flow | Used with X_CLIENT_SECRET_ID |
X_CLIENT_SECRET_ID | auto-refresh | https://developer.x.com/en/portal/dashboard | OAuth client ID |
XAI_API_KEY | scan | https://x.ai/api | xAI Grok for social intelligence |
ANTHROPIC_API_KEY | draft | https://console.anthropic.com/ | Claude API for draft generation |
GITHUB_TOKEN | git-activity | https://github.com/settings/tokens | For private repo commit fetching |