skills/persona/SKILL.md
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".
npx skillsauth add b-open-io/prompts personaInstall 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.
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).
${CLAUDE_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:
${CLAUDE_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:
${CLAUDE_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).
${CLAUDE_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)
${CLAUDE_SKILL_DIR}/scripts/track.sh add <username> [--note "reason"]
# Remove a user
${CLAUDE_SKILL_DIR}/scripts/track.sh remove <username>
# List all tracked users with profile status
${CLAUDE_SKILL_DIR}/scripts/track.sh list
# Refresh profiles for one or all users
${CLAUDE_SKILL_DIR}/scripts/track.sh refresh [username]
Run a social intelligence scan via xAI Grok. Requires XAI_API_KEY.
${CLAUDE_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.
${CLAUDE_SKILL_DIR}/scripts/draft.sh [--profile <path>] [--scan <path>] [--topic "angle"] [--parts 3] [--output <path>] [--model <model-id>]
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
${CLAUDE_SKILL_DIR}/scripts/work.sh add --title "Project Name" --desc "What it does" --tags "tag1, tag2" [--repo owner/repo]
# List projects
${CLAUDE_SKILL_DIR}/scripts/work.sh list
# Remove a project
${CLAUDE_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).
${CLAUDE_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.
${CLAUDE_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)
${CLAUDE_SKILL_DIR}/scripts/preview.sh --post <json-path> [--image <path>] [--username <handle>]
# Interactive playground (live editing, image generation, approval workflow)
bun run ${CLAUDE_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 |
tools
This skill should be used when a Claude Code session needs to keep working after Anthropic usage runs out, or when the user asks to run the Claude Code harness on GPT-5.6 Sol. Trigger phrases include "my Anthropic usage ran out", "I'm out of Claude usage", "usage limit reached, what now", "keep working on another model", "run Claude Code on GPT-5.6 Sol", "use GPT-5.6 Sol as the model", "set up claudex", "claudex isn't working", "route the harness through CLIProxyAPI", or "bill against my ChatGPT/Codex subscription". It stands up a local proxy so the Claude Code CLI runs on OpenAI's Codex backend as an escape hatch, and diagnoses that setup when it drifts. macOS + Homebrew.
testing
This skill should be used when the user asks to "open Visual Wayfinder", "answer a Wayfinder ticket visually", "turn this decision into a configurator", "show Wayfinder choices as a dashboard", "prototype the Wayfinder questionnaire", or wants interactive choice cards, tradeoff controls, rankings, ranges, toggles, and consequence previews for one active Wayfinder decision. It wraps the Wayfinder skill and JSON Render; it never replaces the tracker or resolves more than the active decision.
development
This skill should be used when the user asks to "make a visual proposal", "write this up so I can share it", "present these options visually", "diagram the trade-offs", "turn this plan into something reviewable", or requests a shareable design pitch, architecture proposal, RFC, options comparison, or visual roadmap for work that has not been built. It produces one self-contained, theme-aware HTML page led by grounded diagrams. Use visual-review instead for completed code changes; do not use this skill for internal task tracking.
tools
This skill should be used when the user asks to "add plugin settings", "make a plugin configurable", "store per-project plugin configuration", "use settings.local.json", "create a plugin state file", "expose skill settings in Agent Master", or "add a skill interface". Distinguishes official Claude Code settings from project-owned configuration and documents bOpen Agent Master skill interface discovery.