一键导入
post-to-x
// Use when announcing a release, paper, grant, talk, award, or project update on X (Twitter) from this repo. Covers drafting, style compliance, cost preview, and posting via scripts/post_to_x.py.
// Use when announcing a release, paper, grant, talk, award, or project update on X (Twitter) from this repo. Covers drafting, style compliance, cost preview, and posting via scripts/post_to_x.py.
Systematic web search for news, media, policy, and industry coverage of FORTIS Lab publications, tools, and research. Use when the user asks for a news audit, media coverage check, broader impact evidence, or visibility search for their work.
Systematic bibliometric audit of citing-paper author affiliations across OpenAlex and Dimensions Analytics. Use when the user wants to find which notable institutions (government agencies, foundation model companies, national labs, Big Tech, finance, pharma) have authors who cite their published work. Pair with the news-search skill for full external-impact evidence; this skill is the bibliometric half, news-search is the editorial-coverage half. Also use for legacy prompts: "citation audit", "affiliation audit", "citation-affiliation audit", or "Dimension 9 audit" (this skill was previously Dimension 9 inside news-search; split out 2026-05).
Add or update content that must appear on both the website and the LaTeX CV. Use when the user mentions adding a new paper, award, grant, service role, teaching course, PhD student, open-source project, or any other content that overlaps between the website and CV.
Use when announcing a release, paper, grant, talk, award, or project update on LinkedIn from this repo. Covers drafting, OAuth setup, token refresh, and posting via scripts/post_to_linkedin.py.
Create 1-page or 2-page CV variants from a longer master LaTeX CV. Use when the user asks for a short CV, concise CV, one-page CV, two-page CV, resume-style version, or a role-specific application CV derived from `cv/cv-full.tex` or another master CV source.
| name | post-to-x |
| description | Use when announcing a release, paper, grant, talk, award, or project update on X (Twitter) from this repo. Covers drafting, style compliance, cost preview, and posting via scripts/post_to_x.py. |
Compose and post announcement tweets from this repo via scripts/post_to_x.py. The account holder has X Premium, so single long posts (up to 25,000 chars) are the default; threads are opt-in.
Do not use for: drafting LinkedIn posts, email newsletters, or non-public announcements.
Two gates. Drafting and previewing require less than posting; do not block the user on posting-only items when they just want to draft.
Gate 1: drafting and previewing (steps 1 to 4 of the workflow)
~/miniforge3/envs/py312/python.exe has tweepy and python-dotenv installed (pip install -r scripts/requirements-post.txt). tweepy is imported at module load even for --dry-run, so it must be present.data/open-source.json, data/publications.json, or user-provided text.If Gate 1 fails, stop and report.
Gate 2: real post (step 5)
.env at repo root contains X_API_KEY, X_API_KEY_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET. Do not ask the user to paste them into chat; they are gitignored by design.console.x.com → Billing).If Gate 2 fails, stop and report before posting. Drafting and previewing may continue.
1. Identify source → open-source.json / publications.json / user-provided
2. Draft to file → scripts/drafts/<slug>.md (use references/draft-patterns.md)
For data/open-source.json entries, seed with:
python scripts/post_to_x.py --project <name>
That writes scripts/drafts/<slug>.md with TODO markers and exits.
3. Preview dry-run → python scripts/post_to_x.py --dry-run --draft <path>
4. Iterate → show preview, accept user edits, re-preview
5. Post → python scripts/post_to_x.py --yes --draft <path>
Attach images with --media <path> (repeatable, up to 4).
In thread mode, media attaches to the first tweet only.
6. Report URL → return https://x.com/i/web/status/<id>
Always run step 3 before step 5. No exceptions. --project seeds a draft but never posts directly; the script refuses to post any draft that still contains <!-- TODO markers.
references/hashtag-sets.md. Never more than 5; algorithm penalizes stuffing.—) or en dashes (–) as casual sentence punctuation. Use commas, colons, semicolons, or parentheses instead.AGENTS.md / CLAUDE.md Writing Defaults.it is) over contractions where natural.U+202F.| Scenario | Cost |
|---|---|
| Single long post, no URL | $0.015 |
| Single long post, with URL | $0.20 |
| 3-part thread, all with URLs | $0.60 |
| 5-part thread, all with URLs | $1.00 |
| Mistake | Fix |
|---|---|
| Leading with a side feature (e.g., "multi-modal") when the core change is elsewhere (e.g., "agentic") | Ask the user what the core change is before drafting, do not infer from JSON alone |
| Drafting without hashtags | Always append 3 to 5 from references/hashtag-sets.md |
Em dash slips into draft (—) | Replace with : or , before preview; the guard hook will block Writes with banned style anyway |
| Defaulting to thread mode | Premium user gets single long post by default; --thread only on explicit request |
| Posting without dry-run confirmation | Always run --dry-run first, get user yes/no, then run with --yes |
| Fabricated social proof ("300+ companies") | Only cite numbers from data/open-source.json, data/publications.json, or user-stated facts |
skills/post-to-x/references/draft-patterns.mdskills/post-to-x/references/hashtag-sets.mdscripts/drafts/pyod-3.0.md (PyOD 3 release)scripts/post_to_x.py--help