SuperAPI AI Directory

wjs-mining-articles

Writing & research

View repository

Updated 10-15 23:32

About this skill

wjs-mining-articles

A video's SRT (monologue or conversation) → a table of topic ideas → the user checks a few (for long conversations, "take them all") → each grows into a publishable WeChat article, with a WeChat draft automatically created, and optionally scheduled to post to X.

Core Principle

Spoken language is the ore; an article is the refined metal. A single 王建硕 monologue usually covers several independent points, each worthy of its own article; making each point its own piece fits the WeChat "800–1000 words, one core idea per article" rhythm better than cramming them into one long article.

Subtitles are just raw material; the finished article must be thoroughly written-style— strip out verbal debris like "uh, um, I mean, then"; turn spoken logic into written paragraphs; butkeep the author's word preferences, homely metaphors, and tone, and never turn it into marketing speak or written clichés.

When This Skill Fires

  • The user gives an SRT path and says "turn this video into an article" / "mine articles from the subtitles" / "how many articles can you write"
  • The user runs /wjs-mining-articles <srt-path>

Two kinds of source are supported:Monologue/讲解(you talking alone) andConversation/访谈(you talking with someone else). The two take different recognition paths (see Step 1), but the writing standard is the same.

When NOT to use

  • No SRT, only video/audio— first use wjs-transcribing-audio to produce an SRT, then come back
  • In the conversation, 王建硕 barely speaks at all(pure host, the other person's solo show) — you can't mine a first-person article from him, so don't force it
  • There's already a finished draft to publish— just use wjs-publishing-wechat

Workflow

Step 1 · Read the SRT, determine the source type, identify topic ideas

The script is in this skill's directory; run it from the skill root (or write the full ~/.claude/skills/wjs-mining-articles/scripts/parse-srt.sh):

scripts/parse-srt.sh <srt-path>          # 句子合并、每块前缀 [起–止] 时间区间
scripts/parse-srt.sh <srt-path> --raw    # 一行一 cue: HH:MM:SS<TAB>text(需要细看时)

First determine whether this is a monologue or a conversation. If the SRT has no speaker markers, judge from the content: if there are questions and answers, on-site pleasantries/adjusting equipment, "you/I" addressing each other, someone rebutting — it's aconversation; if one person talks continuously from start to finish, it's amonologue. A file name/directory name containing someone else's name (e.g. "汤维维") is a strong signal.

Skip the filler segments that aren't the main content: pre-recording pleasantries, adjusting the microphone, "what should we talk about", "is this a podcast or a video", and mid-way things like "I'm going to the bathroom", "let me get some water" — none of these are content, so skip them directly when identifying topic ideas (this time that conversation had about 5 minutes of this at the start and several spots in the middle).

ASR names are almost always wrong: treat names in the transcript as suspect first, and check with the user before dispatching an agent to write (this time "黄一孟" was heard as "黄一梦").

Monologue path: read the full output and identify N independent topics, each worthy of its own article(typically 2–6). The [HH:MM:SS–HH:MM:SS] interval before each block is used to mark the topic's time range — when a topic spans multiple blocks, take it from the start of the first block to the end of the last block.There's no hard rule for "how many counts as independent": see whether the author really switched to a point that can stand alone as an article (he often counts them himself, "first/second", so follow that).

Conversation path(two extra steps, and the order can't be skipped):

  1. First confirm who 王建硕 is ⟵ no guessing allowed, andDo not assume by default that the main speaker/the person who talks the most is Wang Jianshuo. Paste a conversation from the beginning verbatim to the user, mark the two roles you infer (who is asking, who is answering), and use AskUserQuestion to have the user confirm which side is Wang Jianshuo. Until the user confirms, do not proceed to topic identification.
  2. Only dig into topics where Wang Jianshuo actually developed a point of view. Topic selection in a dialogue = places where Wang Jianshuo gave a substantial, independently writable opinion; places where the other party is purely asking questions, purely providing background, or purely agreeing do not count as topics. Read the context to determine who said each point—if you are unsure whether a sentence was said by Wang Jianshuo, mark it "uncertain" and hand it to the user to judge; never claim it on his behalf。
  3. The topic list is produced as usual (Step 2), but each item additionally includes a line "In this point, Wang Jianshuo's core claim is X" to make it easier for the user to judge whether it is worth writing.

Step 2 · Produce a topic list and wait for the user to check off selections ⟵ the only human gate

Each candidate gets three things: proposed title / one sentence summarizing what this topic is about / corresponding SRT time range (e.g. 03:12–06:40). For each dialogue item, add one more line: "In this point, Wang Jianshuo's core claim is X."

How the list is presented depends on the number of candidates, in two ways:

  • ≤4 articles: use AskUserQuestion(multiSelect: true), the checkboxes are cleanest.
  • >4 articles (common for long dialogues; a 1–2 hour session can yield 10–16 articles):AskUserQuestion allows at most 4 options per question, which is not enough. Switch toa text table(number | title | core claim | time range), sorted by "how strong + how much it resembles Wang Jianshuo's signature views," mark ⭐ recommendations, and let the userreport numbers directly("1 3 4" / "write the ⭐ ones first" / "all of them").

Only selected items enter Step 3. If the user says "all of them," write all of them.

Step 3 · Write each selected topic as article.md + meta.json

Before writing the body, load wangjianshuo-perspective to ensure the tone is that of the person himself. Write according to wjs-publishing-wechat 's hard constraints(that is the single source of truth; here only the key points are restated):

  • Default 800–1000 words; if over 1200, go back and cut
  • Red bold **...** 2–4 places, applied to punchlines/key conclusions/core concept words. None at all = not finished
  • Do not add AI connectives(firstly/secondly/in summary/it is worth noting), do not add emoji, do not force colloquial speech into rigid formulaic prose
  • By default do not write ## 后注; the body ends with a concluding close

After writing each article.md,run Pangu spacing once(add spaces between Chinese and English; mechanical work, do not rely on memory):

python3 ~/.claude/skills/wjs-publishing-wechat/scripts/pangu.py <folder>/article.md   # 幂等

Additional rule for turning dialogues into articles (attribution red line): the article isin Wang Jianshuo's first person, and its main body is his views and thinking. The other party's words (e.g. Tang Weiwei's)serve only as an introduction/background—"someone asked me..." "when we talked about X..."—and never write the other party's distinctive views as Wang Jianshuo's own claims. If the other party raised a point that Wang Jianshuo did not directly respond to, do not write it into this article.source.srt.md must note that this article is based on a dialogue, who the other party is, and which sentences of theirs were quoted as an introduction.

When many articles are selected (long dialogue), use parallel agents to write in batches: each agent loads wangjianshuo-perspective, gets the corresponding verbatim transcript line range and all the hard constraints above, writes 2–3 articles each, and saves article.md+meta.json+source.srt.md. A 1–2 hour conversation written into 10+ articles at once — serial is too slow, parallel is fast and doesn't interfere with itself (each article is independent).Before dispatching agents, read through the whole transcript once and lock down attribution and factual corrections(for example, this time "黄一孟" was heard by ASR as "黄一梦", so it must be spelled out when dispatching), otherwise each agent guessing on its own easily leads to errors.

Each article goes into anew folder <workspace>/articles/YYYY-MM-DD-{slug}/, writing two files:

File Content
article.md Body
meta.json { "title", "summary", "author": "王建硕", "date", "slug" } — all three reusable scripts depend on it
source.srt.md Raw material backup: SRT source path + this article's corresponding time range + extracted raw spoken segments (traceable)

<workspace> Default ~/Library/Mobile Documents/com~apple~CloudDocs/my/我的项目/我的创作/wechat-publish/, consistent with publishing.

Step 4 · Create drafts directly (fully automatic)

For each selected folder, call publishing'sexisting scripts(do not rewrite), path ~/.claude/skills/wjs-publishing-wechat/scripts/:

gen-cover-ai.sh   <folder>   # 题图 cover.png(读 meta.json 的 title 当目标字词)
gen-illustration.sh <folder> # 解释图 illustration.png + 确保 article.md 引用 ![](./illustration.png)
upload-draft.sh   <folder>   # 上传到微信后台建草稿(只建草稿,不群发)

Delivery: each article is in the state of "a draft already exists in the WeChat backend, ready to publish with one click".Mass sending is done manually by the user in the backend— this skill stops at the draft stage.

Generating illustrations/creating drafts is heavy work; a dozen articles from a long conversation take a long time to run: gen-cover / gen-illustration both use codex to generate images, about 1–3 minutes per article. String them into one background batch script and run it all at once (record success/failure per article, an error in one doesn't affect the others), don't wait manually article by article. In the script, add "skip if the image already exists" to gen-cover / gen-illustration, so that rerunning after a mid-way failure doesn't waste already-generated images.

Step 5 · (Optional) Schedule and post to X

When the user wants to also post these articles as tweets, hand it to wjs-tweeting-from-articles:

  • Post 1 tweet → its default flow (pick an article, generate A/B/C candidates, user chooses,xurl posts).
  • When many articles need to be posted at once(a dozen articles mined from a long conversation) → itsbatch scheduling mode: extract one tweet of ≤120 characters per article and queue it,post-next-from-queue.sh + hourly cron (the script throttles itself) automatically posts at "one tweet every N hours", avoiding a burst of consecutive posts being flagged by X as spam. See that skill for details.

Reuse boundaries

Reuse Usage
wjs-publishing-wechat three scripts cover image/explanation image/create draft, call directly, do not rewrite
wjs-publishing-wechat word count/bolding/no-AI-flavor rules single source of truth, this skill does not establish separate standards
wjs-publishing-wechat/scripts/pangu.py Pangu spacing, run it once after each article.md is finished
wangjianshuo-perspective load when writing the body, to preserve tone
wjs-tweeting-from-articles (Optional) Step 5 schedules articles and posts them to X

The only newly added code in this skill:scripts/parse-srt.sh。

Common Mistakes

  • Cramming multiple topics into one long article — violates "one core per article". If several independent topics are identified, produce that many candidates and let the user choose
  • Copying spoken language verbatim, keeping "uh/then/I mean" — subtitles are raw material, not a finished draft; they must be thoroughly turned into written language
  • Forgetting to write meta.json — all three reusable scripts depend on it; without it, neither the cover image nor the draft can be created
  • Forgetting red bold — if there isn't a single one, it isn't finished
  • Automatically going off to mass send — this skill only creates drafts; actual publishing is the user's manual decision
  • In conversations, defaulting to "whoever talks the most is Wang Jianshuo" — Big mistake. The user must be made to confirm identities; perhaps the main speaker is the guest, and Wang Jianshuo is the one asking questions
  • Writing the other party's viewpoint as Wang Jianshuo's assertion — Attribution red line. The other party's words can only serve as a lead-in; if it is unclear who said it, mark it as uncertain