본문으로 건너뛰기
cccskills
무료GitHub에 공개한국어 소개

X

X API v2와 xurl CLI로 게시물 읽기와 검색, 북마크 가져오기, 프로필 조회를 수행하고 미디어가 포함된 게시물과 스레드, X Articles를 작성하거나 게시합니다. 게시 후 결과를 다시 읽어 확인합니다.

원문원문 설명 보기

Runs all X (Twitter) operations via X API v2 and the xurl CLI: post tweets and threads with media, publish X Articles, search, fetch bookmarks, sweep new bookmarks into idea-issues with LifeOS Upgrade analysis, look up profiles, read tweets. USE WHEN post to X, tweet, post thread, search X, search Twitter, X bookmarks, fetch bookmarks, pull bookmarks, check bookmarks, twitter bookmarks, what have I bookmarked, bookmarks for upgrades, tb, bookmark sweep, bookmark ideas, read tweet, X article, X profile, Twitter profile, lookup user, who is on X, authorize X. NOT FOR posting the same content to several platforms at once, writing social copy, Instagram/LinkedIn/TikTok data (Apify within each platform’s terms), bulk reads beyond what the X API plan allows (use your own exported data or a data product X licenses).

danielmiessler/LifeOS스타 19,635(GitHub 19,635 + cccskills 0)

실행 점수 미검증

설치 방법 보기

이럴 때 유용합니다

  • X에 게시물이나 스레드 올리기
  • X에서 주제나 계정 검색하기
  • 북마크를 가져와 정리하기
  • X 프로필이나 게시물 확인하기

한국어 소개

할 수 있는 일

이 스킬은 X API v2와 xurl CLI를 통해 X 작업을 처리합니다. 게시물을 읽고 검색하거나 프로필을 조회하고 북마크를 가져올 수 있습니다. 이미지나 동영상이 포함된 단일 게시물과 스레드를 작성하고, 장문 X Articles를 초안으로 만들거나 게시할 수도 있습니다. 새 북마크를 확인해 아이디어 후보를 작업 항목으로 정리하는 기능도 있습니다. 게시물이나 기사를 공개한 뒤에는 다시 읽어 결과를 확인합니다.

이럴 때 유용합니다

X에 게시물을 올리거나, 특정 주제 또는 계정의 게시물을 찾거나, 저장한 북마크와 계정 프로필을 확인할 때 사용할 수 있습니다. 여러 X 작업의 인증 처리를 한곳에서 다룹니다.

사용 예시

  • “이 내용을 X에 게시해 주세요.”
  • “최근 북마크 20개를 보여 주세요.”
  • “이 X 게시물을 읽고 내용을 확인해 주세요.”

주의 사항

사용하려면 X API 인증 설정이 필요합니다. 게시물과 기사를 공개하면 실제 계정에 반영되며, 실행 전에 본인 확인을 요청합니다. X API 이용 한도를 넘는 대량 조회와 Instagram, LinkedIn, TikTok 작업은 지원하지 않습니다. X Articles는 공개 후 API로 수정하거나 삭제할 수 없으므로 공개는 되돌릴 수 없습니다.

이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.

문서 점검

AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.

안전성전송·삭제·명령 실행 등을 명시하고 있는가
A양호게시 전에 확인을 요청하며 공개된 기사는 수정하거나 삭제할 수 없다고 명시합니다.
도입의 용이성필요한 도구나 API 키가 적고 적혀 있는가
B일부 부족Setup.md와 인증 정보 이름은 나오지만 전체 설정 절차는 제공된 자료에 없습니다.

점수에는 넣지 않았습니다. 2026년 10월 28일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.

평가가 다르다고 생각되면 재검토를 요청하기

어느 항목이 왜 다르다고 생각하는지 적어 주세요. 로그인은 필요 없습니다. SKILL.md와 대조해 평가를 다시 만들고 이곳에 반영합니다.

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

포함된 파일(19)

  • SKILL.md12.8 KB
  • Intents/Bookmarks.md2.1 KB
  • Intents/Post.md3.7 KB
  • Intents/Profile.md827 B
  • Intents/PullBookmarks.md12.2 KB
  • Intents/Read.md1.7 KB
  • Intents/Search.md1.4 KB
  • Setup.md8.0 KB
  • Tools/article.ts28.3 KB
  • Tools/bookmark-issue.ts15.6 KB
  • Tools/bookmarks.ts12.7 KB
  • Tools/delete.ts1.8 KB
  • Tools/media.ts9.0 KB
  • Tools/post.ts12.4 KB
  • Tools/profile.ts2.6 KB
  • Tools/read.ts3.7 KB
  • Tools/search.ts2.8 KB
  • Tools/TwitterText.ts3.0 KB
  • Tools/x-client.ts25.0 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

X — Unified X (Twitter) API

Contents: Ideal State · Intent Routing · Tools Reference · CLI: xurl · Data & Config · Gotchas · Examples

Handles every X (Twitter) operation through the X API v2 (direct fetch()) and the xurl CLI: post single tweets, threads and media, publish long-form Articles, search recent tweets, fetch bookmarks, look up user profiles, and read tweets by ID or URL. Other skills delegate their X work here, so the credentials, the auth handling and the OAuth 2.0 token store live in one place; if each skill wired up its own, the secrets would sprawl and the refresh chain would break.

Not for posting the same content to several platforms (Broadcast), writing social copy (a copywriting skill), or bulk collection beyond what the X API allows. X reads use the official API or the principal’s own exported data; when X refuses a read, the intent stops and reports it.

Ideal State

  • Every X operation runs through this skill's tools or xurl on the auth mode it needs, and every X read goes through Tools/read.ts, never a web fetch or browser.
  • Nothing reaches the account (a tweet, thread, media post or published Article) without the principal's confirmation, and a post is reported done only after reading it back.
  • Posted text and URLs go out exactly as given, measured by X's weighted count; over-limit text is rejected, never cut.
  • The OAuth 2.0 grant survives every run: one refresher per grant, and a missing scope or revoked grant ends in a surfaced re-authorization URL, never a guess.

Intent Routing

IntentTriggerFile
Post"post to X", "tweet", "post tweet", "send tweet", "thread"Intents/Post.md
Search"search X", "search twitter", "find tweets"Intents/Search.md
Bookmarks"X bookmarks", "fetch bookmarks", "re-authorize bookmarks", "authorize X", "bookmark token expired"Intents/Bookmarks.md
PullBookmarks"pull bookmarks", "check bookmarks", "bookmark sweep", "bookmarks for upgrades", "tb", "quick bookmark check"Intents/PullBookmarks.md
Profile"X profile", "twitter profile", "lookup user", "who is @user"Intents/Profile.md
Read"read tweet", "get tweet", "fetch tweet"Intents/Read.md
Article"X article", "Twitter article", "long-form on X", "publish an article to X"Tools/article.ts: create --file piece.md drafts (the default), --publish publishes, then read the post back with Tools/read.ts. Publishing is irreversible through the API.
FileRead when
Setup.mdfirst-time setup: the token-store Config.md, the X app and its secrets, and the first-run proof

Tools Reference

All tools are in ~/.claude/skills/X/Tools/ and run with bun. Each intent carries the command for its own tool (post.ts, search.ts, profile.ts, read.ts, bookmarks.ts, and bookmark-issue.ts for the sweep's check, create, skip and audit); this table holds only the tools no intent owns. Which auth mode each path uses is in Gotchas.

ToolPurposeUsage
x-client.tsCredential loader, token store, auth helpersImported by the other tools
media.tsChunked media upload (video/image/GIF)bun run media.ts upload clip.mp4
article.tsLong-form X Articles: markdown to content_state, draft, publishbun run article.ts create --file piece.md --publish
delete.tsDelete tweets by idbun run delete.ts <id> [<id> ...]
send gate, video PII gateWhat stops a post and how each block is reportedPost intent § Tool contract (Intents/Post.md)

CLI: xurl

xurl is the official X CLI. Use for quick API calls not covered by tools:

# Quick lookups
xurl /2/users/me
xurl /2/tweets/1234567890

# Search
xurl "/2/tweets/search/recent?query=from:<username>&max_results=10"

# Post (use Tools/post.ts instead for threads)
xurl -X POST /2/tweets -d '{"text":"Hello"}'

Data & Config

Config: LIFEOS/USER/CUSTOMIZATIONS/SKILLS/X/Config.md (a fenced yaml block choosing the OAuth 2.0 token store: local, a 0600 file on this machine that x-client.ts refreshes, or cloudflare-kv, a KV namespace that another process such as a scheduled Worker refreshes). Setup, field table and first-run proof: Setup.md. Without it, reads still work on the bearer token, posting falls back to OAuth 1.0a text-only, and every OAuth 2.0 path (media, Articles, bookmarks, delete) stops with an error naming Setup.md.

The bookmark sweep (PullBookmarks) reads three more things from the same directory and the work-tracking config: the bookmark_sweep mapping in that yaml block (issue labels, property label prefix), PREFERENCES.md (relevance profile and what counts as an idea), and the repo for idea-issues (bookmark_sweep.repo, default the repo in LIFEOS/USER/WORK/work_repo.json). Its state lives outside the skill tree in LIFEOS/MEMORY/STATE/X/ (bookmarks-state.json, bookmark-issues.json). The caller outside the skill is Pulse's Synapse module, which reads bookmark-issues.json; the former scheduled sweep that shelled out to Tools/bookmark-issue.ts is retired.

Secrets, all from ~/.claude/.env, loaded by Tools/x-client.ts and never hardcoded (names only):

VarPurpose
TWITTER_CLIENT_IDOAuth 2.0 client ID (authorize + local refresh)
TWITTER_CLIENT_SECRETOAuth 2.0 client secret
X_BEARER_TOKENApp-only bearer token (reads)
TWITTER_API_KEY, TWITTER_API_KEY_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRETOptional OAuth 1.0a text-only posting fallback
CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN, X_TOKENS_KV_NAMESPACEOnly for token_store: cloudflare-kv

Gotchas

  • A published X Article cannot be deleted or edited through the API. X documents POST /2/articles/draft and POST /2/articles/{id}/publish and nothing else — no GET, no PATCH, no DELETE. Drafts are free to create and invisible until published, so iterate on drafts and treat --publish as one-way. article.ts defaults to draft-only for exactly this reason. The X web UI does offer Edit and Delete on a published Article, so a bad publish is recoverable by hand in the browser, not in code.
  • Article content_state is DraftJS in snake_case, not the camelCase DraftJS raw state every online example shows: inline_style_ranges, entity_ranges, and a flat entities array of {key, value} rather than an entityMap object. Offsets index the stripped text (markers removed). Images, embedded posts, code and dividers are atomic blocks whose single-space text is covered entirely by one entity range — a zero-length atomic block is rejected.
  • X's 280-character limit is weighted, not JavaScript text.length. HTTP(S) URLs count as exactly 23 characters and emoji/Unicode follow X weighting in Tools/TwitterText.ts. Tools/post.ts sends the exact caller input or rejects it (Post intent).
  • read.ts returns article and long-tweet text in one call. It requests tweet.fields=article,note_tweet, while X answers WebFetch with 402 and automation browsers are usually logged out, so any other route first only burns time.
  • One refresh chain per grant, ever. X rotates the refresh token on every refresh and treats reuse of a consumed one as theft, revoking the whole grant until a human re-authorizes. With token_store: local, x-client.ts is the only refresher: refreshes run behind <token_file>.lock, waiters re-read the file instead of replaying a consumed token, and writes are tmp+rename. With cloudflare-kv, the external owner refreshes and this client never does. Never call the token endpoint directly with a stored refresh token — always go through getValidTokens() — and never point two installs' local stores at the same grant.
  • Three auth modes, not one. Posting, media, Articles and delete = OAuth 2.0 user context (OAuth 1.0a text-only fallback when no OAuth 2.0 store is configured), reads (search, profiles, tweets) = app-only bearer token, bookmarks = OAuth 2.0 PKCE. A 401 on one path says nothing about the other two.
  • Prefer the OAuth 2.0 store for posting. OAuth 1.0a portal keys can be revoked or regenerated without notice and then 401 on every post; post.ts uses the OAuth 2.0 store whenever one is configured and falls back to OAuth 1.0a only without one. If posting 403s, read the body first: type: …/spend-cap-reached means the account's Billing Cycle Cap in the X developer console is hit (every endpoint 403s until the cap is raised or the cycle resets). Otherwise the grant lacks tweet.write: re-run bookmarks.ts authorize. The consent click is a human's, so surface the URL; if the app grant is still active on the account, authorize completes with no click.
  • Media upload needs its own scope: media.write. Without it POST /2/media/upload returns a bare 403 while /2/tweets keeps working, which reads as "video posting is broken" rather than "the grant is short a scope". SCOPES in bookmarks.ts carries it; a grant authorized without it must be re-authorized once.
  • The v2 media endpoints are sub-paths, not command= parameters, and X's own chunked-upload doc still describes the retired v1.1 shape. The working contract is: POST /2/media/upload/initialize (JSON body: media_type, total_bytes, media_category) → POST /2/media/upload/{id}/append (multipart: segment_index, media, segments ≤5MB) → POST /2/media/upload/{id}/finalize. Sending command=INIT to the base path returns 400 "Missing media field in JSON" — the parameter is ignored and the call is read as a simple upload, so the error names the wrong problem. Images ≤5MB skip all of it: one multipart POST /2/media/upload with a media field.
  • Status is the one call that still speaks the old dialect: GET /2/media/upload?media_id=<id>&command=STATUS. It rejects media_ids (the plural that every other v2 endpoint takes) and has no sub-path form. Video/GIF process asynchronously — poll to succeeded before attaching, because an unprocessed media_id publishes a tweet with no video and no error. All of this is encoded in Tools/media.ts.

Examples

Example 1: Read a tweet link

User: "read this: https://x.com/<user>/status/<id>"
→ bun run Tools/read.ts <url> (immediately — no browser attempts)
→ Returns the tweet, plus the full article plain_text when the post carries an X Article

read.ts takes a status URL or a numeric tweet ID. A bare x.com/i/article/<id> link is an article ID, not a tweet ID, and the API has no read-by-article-ID call; use the status URL of the post that carries the article.

Example 2: Fetch recent bookmarks

User: "show my last 20 X bookmarks"
→ Bookmarks intent: bun run Tools/bookmarks.ts fetch 20
→ Author, text and links per bookmark

Example 3: Bookmark sweep

User: "tb"  (or "just check bookmarks" for quick mode: last 30, MEDIUM skipped)
→ PullBookmarks intent: fetch 50 --json, filter seenIds
→ each new bookmark created-or-skipped inline via bookmark-issue.ts, audit passes, Upgrade report with prior-work tags

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

AnnualReports

무료요약 있음

여러 업체와 공공기관의 사이버 보안 보고서를 검색하고 가져와 위협, 랜섬웨어, 침해 통계 등의 추세를 비교합니다. 분석에는 출처별 업체, 연도, 보고서를 표시하고 자료 간 차이도 따로 다룹니다.

  • 분류별 위협 보고서를 찾을 때
  • 특정 업체의 보고서를 가져올 때
  • 여러 업체의 랜섬웨어 동향을 비교할 때
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

ApertureOscillation

무료요약 있음

기능이나 구성 요소 자체의 설계 요구와 시스템 전체의 목표를 세 단계로 비교합니다. 설계상의 충돌과 적절한 구현 범위를 정리하고, 제안한 설계가 전체 방향과 맞는지 평가합니다.

  • 서비스나 라이브러리를 분리할지 판단하기
  • 기능 요구와 제품 방향 비교하기
  • 새 구성 요소와 기존 시스템의 정합성 확인하기
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

Aphorisms

무료요약 있음

글의 주제에 맞는 격언과 인용문을 찾아 저자와 선정 이유를 함께 제안합니다. 출처가 있는 인용문을 추가하고, 사상가의 말을 주제별로 조사하며, 사용 기록을 관리해 같은 인용문을 반복하지 않도록 돕습니다.

  • 뉴스레터에 어울리는 인용문 찾기
  • 출처와 함께 중복 없이 인용문 저장하기
  • 주제별로 사상가의 말 조사하기
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

Art

무료요약 있음

블로그 삽화, 기술 도표, 비교 그림, 만화, 아이콘 등을 용도에 맞는 절차로 제작합니다. 구도와 색상, 이미지 모델을 정하고 검토용 이미지를 출력합니다.

  • 블로그 제목 이미지를 만들 때
  • 시스템 구조를 그림으로 설명할 때
  • 비교나 연대표를 시각화할 때
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

ArtDirection

무료요약 있음

브리프와 제작 기준에 따라 이미지, 영상, 슬라이드, 사이트 화면 캡처의 시각 품질을 평가합니다. 두 비전 심사자가 점수와 결함 우선순위를 제시하고, 정해진 횟수 안에서 수정을 돕습니다. 평가를 통과한 결과물만 전달할 수 있으며, 사람의 점수와 의견은 별도 기록해 심사 보정에 활용합니다.

  • 이미지 수정 항목의 우선순위 정리
  • 기준에 따라 영상이나 슬라이드 평가
  • 공개 전 시각 품질 점검
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

ArXiv

무료요약 있음

주제, 연구 분야, 논문 ID로 arXiv 논문을 찾고 제목, 저자, 초록, 링크를 정리합니다. 새 논문을 확인하고, 제공되는 경우 AlphaXiv의 AI 생성 개요도 가져옵니다.

  • AI·머신러닝 분야의 새 논문 확인
  • 특정 주제의 논문 검색
  • 논문 ID나 arXiv 주소로 조회
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

danielmiessler의 스킬 모두 보기

이 스킬의 문제 신고