@wji.ai/cli 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +63 -2
  2. package/dist/commands/backreel.js +260 -0
  3. package/dist/commands/canvas.js +588 -88
  4. package/dist/commands/class.js +395 -0
  5. package/dist/commands/npc.js +413 -0
  6. package/dist/commands/workspace.js +109 -24
  7. package/dist/core/members.js +54 -0
  8. package/dist/core/npc.js +108 -0
  9. package/dist/core/output.js +4 -2
  10. package/dist/index.js +8 -0
  11. package/package.json +1 -1
  12. package/skill/ads/SKILL.md +176 -0
  13. package/skill/ads/reference/ai-consistency.md +109 -0
  14. package/skill/ads/reference/brief-template.md +103 -0
  15. package/skill/ads/reference/compliance.md +66 -0
  16. package/skill/ads/reference/formats-image.md +108 -0
  17. package/skill/ads/reference/formats-video.md +121 -0
  18. package/skill/ads/reference/models.md +90 -0
  19. package/skill/ads/reference/product-photography.md +119 -0
  20. package/skill/ads/reference/styles.md +70 -0
  21. package/skill/short-drama/SKILL.md +90 -8
  22. package/skill/short-drama/reference/action-bullet-time.md +47 -0
  23. package/skill/short-drama/reference/action-car-chase.md +51 -0
  24. package/skill/short-drama/reference/action-gun-fu.md +52 -0
  25. package/skill/short-drama/reference/action-historical-realist.md +50 -0
  26. package/skill/short-drama/reference/action-hk-kungfu.md +54 -0
  27. package/skill/short-drama/reference/action-street-brawl.md +49 -0
  28. package/skill/short-drama/reference/action-superhero.md +50 -0
  29. package/skill/short-drama/reference/action-wuxia-fantasy.md +51 -0
  30. package/skill/short-drama/reference/action.md +94 -0
  31. package/skill/short-drama/reference/cinematography-costume-dark.md +117 -0
  32. package/skill/short-drama/reference/cinematography-costume-idol.md +126 -0
  33. package/skill/short-drama/reference/cinematography-low-key.md +115 -0
  34. package/skill/short-drama/reference/cinematography-period-nostalgia.md +106 -0
  35. package/skill/short-drama/reference/cinematography-scifi-hard.md +63 -0
  36. package/skill/short-drama/reference/cinematography-scifi-soft.md +66 -0
  37. package/skill/short-drama/reference/cinematography-sweet-romance.md +175 -0
  38. package/skill/short-drama/reference/cinematography.md +83 -0
  39. package/skill/short-drama/reference/composition-art-first.md +74 -0
  40. package/skill/short-drama/reference/craft-shots.md +3 -1
  41. package/skill/short-drama/reference/craft-story.md +4 -1
  42. package/skill/short-drama/reference/format.md +94 -0
  43. package/skill/short-drama/reference/grammar-comedy.md +105 -0
  44. package/skill/short-drama/reference/grammar-faceslap.md +67 -0
  45. package/skill/short-drama/reference/grammar.md +103 -0
  46. package/skill/short-drama/reference/operations-cli.md +1 -1
  47. package/skill/short-drama/reference/schema.md +34 -3
  48. package/skill/short-drama/reference/stage-art.md +1 -1
  49. package/skill/short-drama/reference/stage-outline.md +21 -0
  50. package/skill/short-drama/reference/stage-script.md +10 -0
  51. package/skill/short-drama/reference/stage-storyboard.md +15 -0
  52. package/skill/short-drama/reference/story-angst.md +117 -0
  53. package/skill/short-drama/reference/story-comedy.md +136 -0
  54. package/skill/short-drama/reference/story-cultivation.md +109 -0
  55. package/skill/short-drama/reference/story-family.md +119 -0
  56. package/skill/short-drama/reference/story-horror.md +124 -0
  57. package/skill/short-drama/reference/story-mystery.md +127 -0
  58. package/skill/short-drama/reference/story-palace.md +103 -0
  59. package/skill/short-drama/reference/story-revenge.md +124 -0
  60. package/skill/short-drama/reference/story-scifi.md +112 -0
  61. package/skill/short-drama/reference/story-sweet.md +128 -0
  62. package/skill/short-drama/reference/story.md +127 -0
  63. package/skill/short-drama/scripts/selftest.mjs +809 -1
  64. package/skill/short-drama/scripts/short-drama.mjs +1608 -16
  65. package/skill/social-media/SKILL.md +152 -0
  66. package/skill/social-media/reference/content-craft.md +124 -0
  67. package/skill/social-media/reference/plan-template.md +171 -0
  68. package/skill/social-media/reference/platforms-china.md +94 -0
  69. package/skill/social-media/reference/platforms-global.md +122 -0
  70. package/skill/social-media/reference/ratio-map.md +100 -0
  71. package/skill/social-media/reference/repurpose.md +119 -0
  72. package/skill/wji/SKILL.md +66 -2
  73. package/skill/wji/reference/commands.md +76 -15
  74. package/skill/wji-classroom/SKILL.md +161 -0
@@ -0,0 +1,152 @@
1
+ ---
2
+ name: social-media
3
+ description: Make and size content for social platforms on WJI through the `wji` CLI — the image and video specs of Instagram, TikTok, YouTube / Shorts, Facebook, X, LinkedIn, Pinterest, Threads, Snapchat, 小红书, 抖音, 快手, 视频号, B站, 微博 and 微信公众号 (ratio, pixels, duration, file size, safe zones, caption / title / hashtag limits, covers and thumbnails), what performs on each (the 3-second hook, loops, on-screen text), and the repurposing recipes: one master into every placement, a short-drama episode into vertical teasers and a poster set, an ad master into all its placements. Use whenever a task mentions social media / 社群 / 社交媒体, posting / 发文, Reels, Shorts, TikTok, 小红书 / 抖音 / 视频号, a cover / 封面, poster / 海报, thumbnail, teaser / 预告, or asks what size or length a platform wants. Combines with the short-drama and ads skills. Works together with the `wji` skill.
4
+ ---
5
+
6
+ # Social media on WJI
7
+
8
+ You are the person who knows every platform's numbers and turns one piece of work into the
9
+ right post for each of them. **You write the spec sheet, the hooks and the copy**; the `wji`
10
+ CLI keeps the plan as a dataset and generates the per-ratio images and videos on a canvas;
11
+ local `sharp` or `ffmpeg` (when installed) crops to exact pixels. Nothing is generated until
12
+ the user has said yes to the quote (or the message carried `-auto`, see the `wji` skill).
13
+
14
+ ```
15
+ what & where ──▶ spec sheet ──▶ source assets ──▶ generate per ratio ──▶ covers ──▶ copy ──▶ post plan
16
+ │ │ │ │ │ │
17
+ platforms, one row per existing nodes / images: native thumbnail, caption,
18
+ goal, market surface from short-drama / ratio then crop; poster, hashtags,
19
+ the tables ads / new video: regenerate 图文 cover slot, label
20
+ ```
21
+
22
+ `{baseDir}` = this skill. The `wji` skill governs every CLI call.
23
+
24
+ | Read | When |
25
+ | --- | --- |
26
+ | `reference/platforms-global.md` | any Instagram / TikTok / YouTube / Facebook / X / LinkedIn / Pinterest / Threads / Snapchat question — the spec tables and safe zones |
27
+ | `reference/platforms-china.md` | 抖音 / 快手 / 小红书 / 视频号 / B站 / 微博 / 公众号 — specs, and China-specific practice (AI label, titles, 图文) |
28
+ | `reference/ratio-map.md` | before generating: which WJI model makes which ratio natively, what must be cropped and how to anchor the crop |
29
+ | `reference/content-craft.md` | hooks, loops, overlays, captions and hashtags per platform, posting times, cover design, carousel / 图文 storytelling |
30
+ | `reference/repurpose.md` | master → placements, drama episode → teaser + posters, ad master → placements, the deliverables checklist |
31
+ | `reference/plan-template.md` | the post spec sheet — write one row per post before touching the canvas |
32
+
33
+ ## Operations
34
+
35
+ ### Where the plan lives
36
+
37
+ Locally: `social/<campaign>/plan.md` (the spec sheet, one row per post, plus the copy and the
38
+ deliverables) and `prompts/`. On WJI: the same plan as a dataset `SOCIAL <campaign>` in the
39
+ workspace's **story** folder.
40
+
41
+ ```bash
42
+ wji auth whoami --json && wji profile wallet
43
+ wji ws use <workspaceId>
44
+ wji ws app list # the Dataset app id → DS_APP
45
+ wji --json ws fs --app DS_APP | jq -r '.. | objects | select(.content.semanticKey? == "story") | .id' # → STORY
46
+ wji dataset new STORY "SOCIAL <campaign>" -t other -d "<one line>" --json | jq -r .id # → PLAN
47
+ wji fs set PLAN --merge content=@social/<campaign>/plan.md --merge viewMode=content
48
+ wji canvas list # the masters, keyframes, sheets already there
49
+ wji canvas nodes -c <canvas> --json | jq '.[] | {id,name,kind,assetId}'
50
+ wji asset download <assetId…> -o /tmp/social # look before you write about it
51
+ wji asset upload <file> # the user's own material
52
+ wji models get <model> # the ratio list ratio-map.md summarises
53
+ ```
54
+
55
+ ### Generating per ratio
56
+
57
+ One canvas `SOCIAL · <campaign>` (`wji canvas create "SOCIAL · <campaign>" --json | jq -r .id`),
58
+ one row per platform surface:
59
+
60
+ | Need | Command |
61
+ | --- | --- |
62
+ | image at a native ratio | `wji canvas add image -c SC -n "小红书 cover" --from <source nodes> -m <image model> -r 3:4 --resolution 2K --prompt-file prompts/xhs-cover.txt` — the source keyframe / KV / sheet first in `--from` |
63
+ | video at the platform ratio | `wji canvas add video -c SC -n "Reels teaser A" --from <same references as the master> -m <video model> -r 9:16 -d 20 --prompt-file prompts/reels-a.txt` — **regenerated, never cropped** |
64
+ | quote → yes → run | `wji canvas gen <nodeIds…>` (prints the cost, refuses) → tell the user → `wji canvas gen <nodeIds…> --yes --wait` |
65
+ | adjust | `wji canvas set <node> -p … / -r … / -d …`, `wji canvas connect <from> <to>` |
66
+ | one-off still | `wji gen image -m <model> -p "…" -r 4:5 --ref <assetId> --wait` |
67
+
68
+ ### Exact pixels
69
+
70
+ A model generates a ratio, not a pixel size. When the placement needs exact pixels or a ratio no
71
+ model has (1200×628, 1080×1260 视频号, 1146×717 B站, 900×383 公众号, banner sizes), generate at the
72
+ nearest native ratio from `reference/ratio-map.md`, download the asset, and crop locally:
73
+ `npx sharp-cli` / a five-line node script with `sharp` (`resize(w, h, { fit: 'cover', position })`)
74
+ or `ffmpeg -i in.png -vf "crop=w:h:x:y,scale=W:H" out.png` — whichever is installed; if neither
75
+ is, deliver the generated frame plus the crop box (left, top, width, height) and say so. Anchor
76
+ every crop as `reference/ratio-map.md` §"Crop anchoring" says: faces, then product centre, then
77
+ the headline zone. Upload the result with `wji asset upload` and add it to the canvas as a display
78
+ node so the plan's ids point at the final file.
79
+
80
+ ## Before anything else
81
+
82
+ 1. **Ask what and where, in one message**: what is being promoted (a drama episode, an ad, a
83
+ product, an account), which platforms and surfaces (feed vs Reels vs Stories are different
84
+ posts), the goal (views, follows, clicks to the full episode, sales), the market and language
85
+ (mainland / overseas / both — it changes the platform list and the label rules). **Never guess
86
+ the platform.** Offer the usual sets: 短剧 launch = 抖音 + 小红书 + 视频号 (+ TikTok + Reels +
87
+ Shorts overseas); product = Instagram feed + Reels + TikTok + 小红书.
88
+ 2. **Write the spec sheet** (`reference/plan-template.md`): one row per post with the platform's
89
+ own numbers copied from the tables — ratio, pixels, duration cap, safe zone, caption / title /
90
+ hashtag limits, cover spec. Rows marked *(verify)* in the tables stay marked in the sheet.
91
+ 3. **Find the source material** before proposing generation: the canvases and datasets already
92
+ in the workspace, the user's files, or the other skills' work (next section). Generate new
93
+ material only for what does not exist.
94
+ 4. **Quote the whole plan** (`wji gen cost` per node kind) before the first generation.
95
+
96
+ ## Combining with other skills
97
+
98
+ - **A short-drama project is present** (a folder with `project.json` and `episodes/`, or the
99
+ short-drama skill is installed beside this one at `../short-drama/`) → *drama mode*. Read the
100
+ episode with the engine: `node ../short-drama/scripts/short-drama.mjs render <project> script --ep N`
101
+ for the lines and `… render <project> segment E0N-01` per segment (or read
102
+ `storyboard.segments` in `<project>/episodes/E0N.json` directly); `… manifest <project> --ep N`
103
+ tells you the episode canvas id, and
104
+ `wji canvas nodes -c <E0N canvas>` lists its keyframes, sheets and clips. Then
105
+ `reference/repurpose.md` §"Drama episode → teaser + poster set": pick the hook line from the middle of the
106
+ episode, build the 4-beat 15–45 s teaser (hook 0–3 s → context → escalation → cut before the
107
+ payoff + 「主页看全集」) as **new 9:16 video nodes generated from the same character and scene
108
+ sheets** (never a crop of the 16:9 clips), 2–3 variants that differ only in the hook, and the
109
+ poster set (小红书 3:4, Instagram 4:5, Pinterest 2:3, YouTube thumbnail 16:9, B站 1146×717,
110
+ 视频号 6:7) from the episode keyframes with the title zone kept clear. Record the node ids in
111
+ `plan.md`; do not write into the drama's `project.json`.
112
+ - **An ads brief is present** (`ads/<product>/brief.md` or the `AD <product>` dataset) →
113
+ *campaign mode*. Read the brief and the `AD · <product>` canvas (KV, stills, clips, master
114
+ ratio). `reference/repurpose.md` §"Ad master → placements": one row per placement, KV
115
+ regenerated at native ratios or cropped for the rest, vertical / square video regenerated from
116
+ the same stills, per-platform copy written from the brief's CTA and legal lines, the AI-content
117
+ label toggled where the ads skill's `reference/compliance.md` says so.
118
+ - **Neither** → standalone: the user's assets or fresh generation, same spec sheet.
119
+ - If the material the user describes belongs to a skill that is **not installed**, say which one
120
+ (short-drama / ads) rather than rebuilding its data by hand.
121
+
122
+ ## Making the posts
123
+
124
+ - **Images**: generate at the native ratio where one exists (`reference/ratio-map.md`), with the
125
+ source node first in `--from` so the subject stays the same; crop only for non-native sizes.
126
+ One ratio for every card of a carousel / 图文.
127
+ - **Video**: one node per platform ratio, regenerated with the master's references and a prompt
128
+ reframed on the faces / product for vertical; `-d` under the surface's cap; captions and
129
+ on-screen text are overlays inside the safe zone, never generated.
130
+ - **Covers and thumbnails**: face + ≤4 words, high contrast, the series template repeated
131
+ (`reference/content-craft.md` §"Cover and thumbnail design"); 小红书 cover is the hook of the 图文.
132
+ - **Copy**: hook line, body, CTA, hashtags within the platform's limits (Instagram ≤5 hashtags,
133
+ 小红书 title ≤20 chars, X 280) — written into `plan.md`, one block per post.
134
+ - **Posting slots** from `reference/content-craft.md` are starting points, said as such.
135
+
136
+ ## Reporting
137
+
138
+ After the spec sheet: the rows and what will be generated vs cropped, with the quote. After
139
+ generation: the deliverables table from `reference/repurpose.md` (post, file / node, ratio, pixels,
140
+ duration, cover, caption, hashtags, slot, AI label) and anything the user still has to do in
141
+ their editor (captions, subtitles, crops you could not make).
142
+
143
+ ## Rules specific to this skill
144
+
145
+ - **Ask before every generation**; a batch is one quote.
146
+ - **Never invent a platform limit** — cite the table row; keep *(verify)* flags; if a platform
147
+ is not in the tables, say so and ask the user for its spec.
148
+ - Video is regenerated at the target ratio, never cropped; images are cropped only when no model
149
+ has the ratio.
150
+ - Text stays out of the platform's UI zones; one ratio per carousel; the drama's dialogue is
151
+ quoted verbatim in teasers.
152
+ - Do not compile or store personal data of real people from the platforms; all-audiences content only.
@@ -0,0 +1,124 @@
1
+ # Content craft — hooks, loops, overlays, captions, covers, carousels
2
+
3
+ What makes a post perform once the size is right: the first three seconds, the ending that
4
+ re-plays, text that stays inside the safe zone, a caption shaped for each platform's reading
5
+ pattern, a posting slot to start from, a cover that reads at thumbnail size, and a carousel that
6
+ tells one story. Sizes and limits are quoted from platforms-global.md and platforms-china.md,
7
+ not restated here; teaser and poster recipes built on these rules are in repurpose.md.
8
+
9
+ ## The first 3 seconds
10
+
11
+ Feeds decide in the first swipe-length. The product, the face or the question is on screen by
12
+ second 3, in motion, with no logo card, no fade-in and no "hi guys". Hook types, with a line
13
+ each (drama and product examples side by side):
14
+
15
+ | Hook type | Drama teaser | Product / brand |
16
+ | --- | --- | --- |
17
+ | Shocking line, mid-scene | 「你以为我不知道孩子是谁的?」 cut in on the reaction | "This is the last one we could get made." |
18
+ | Result first, cause later | the slap, the arrest, the reveal — then 「三天前…」 | the after-state (clean pan, finished room), then the before |
19
+ | Direct question | 「如果你婆婆当众撕了你的结婚证,你会怎么做?」 | "Why does every white sneaker turn yellow in a month?" |
20
+ | Contradiction / mismatch | the bride in a wedding dress signing divorce papers | a luxury unboxing on a bus |
21
+ | Countdown / stakes | 「还有十分钟,她就要嫁给别人了」 | "Three tests. One survives." |
22
+ | Visual anomaly | one impossible detail in an ordinary frame (a wet footprint indoors) | the product doing the one thing rivals cannot |
23
+ | Named audience | 「二婚的姐妹看过来」 | "If you edit on a phone, watch this." |
24
+
25
+ Rules: one hook per cut, the first frame is already the strongest frame (it is also the cover),
26
+ sound-off comprehension — the hook line is burned in as text. Write 2–3 hooks for the same body
27
+ and let the platform pick (repurpose.md, variants).
28
+
29
+ ## Loop-friendly endings
30
+
31
+ Reels, TikTok and 抖音 count re-watches. End on a frame that matches the first frame (same
32
+ composition, same subject position) so the loop hides the seam; or end one beat *before* the
33
+ answer the hook promised, so the viewer re-watches to catch it; or end on the CTA card that is
34
+ also the cover. Never end on a logo fade or a black frame. For a drama teaser the ending is the
35
+ cut before the payoff plus the line 「主页看全集 / full episode in bio」 (repurpose.md).
36
+
37
+ ## On-screen text and burned subtitles
38
+
39
+ - Keep every word inside the safe zone of the 9:16 diagram (platforms-global.md): headline in the
40
+ upper safe band, subtitles at the lower edge of the safe band (≈y 1100–1240 on 1080×1920), never
41
+ behind the caption or the right rail.
42
+ - Subtitles are burned in (most feeds autoplay muted): 2 lines maximum, ≤ 14 CJK chars or ≤ 32
43
+ Latin chars per line, high-contrast box or stroke, one style for the whole account.
44
+ - Headline type ≥ 60 px on 1080×1920, ≤ 6 words / 8 chars; a second overlay only when the first
45
+ has left. Do not repeat the caption on screen.
46
+ - Text is added after the crop and at the final ratio (ratio-map.md, crop anchoring); text
47
+ generated inside the picture is only for covers that are never cropped again.
48
+ - 「AI生成」 label where required (platforms-china.md) is the platform's toggle, not an overlay
49
+ you design — but do not place other text where the platform paints its label (top-left on most
50
+ Chinese apps).
51
+
52
+ ## Caption structure per platform
53
+
54
+ | Platform | Structure | Hashtags / tags | Length notes |
55
+ | --- | --- | --- | --- |
56
+ | Instagram | hook line (shown before "more") → 2–4 short lines → CTA (save / share / comment) | **≤5** (Dec 2025 cap) — 3 niche + 2 broad | 2,200 max; the first 125 chars are the post |
57
+ | TikTok / 抖音 | one-line hook + a question that invites comments | 3–5 hashtags / 话题, one is the series tag | 4,000 max on TikTok; 抖音 shows ≈20 chars of title |
58
+ | YouTube | title ≤ 60–70 chars shown; description: 2-line summary, links, chapters, disclosure | 3–5 hashtags at the end of the description | title 100 hard cap |
59
+ | Facebook | short hook, link in the first comment or the post, CTA | 1–3 | shares outweigh hashtags |
60
+ | X | the hook is the whole post; thread for detail | 1–2 or none | 280 |
61
+ | LinkedIn | hook in the first two lines → line-broken story → question → 3 hashtags | 3 | 3,000; "see more" after ≈3 lines |
62
+ | Pinterest | keyword title ≤ 100, description with 2–3 search phrases | none | description 500–800 *(verify)* |
63
+ | Threads | one sentence; the picture carries the rest | none | 500 |
64
+ | 小红书 | 标题 ≤ 20 with the keyword first → 正文 in short lines with emoji markers → 话题 tags | keyword + 3–6 话题 (#…#) | 正文 1,000 (长文 6,000) |
65
+ | 视频号 / 公众号 | one-line 描述 with 话题; the article's first line is the hook | 1–3 话题 | limits not confirmed |
66
+ | B站 | 标题 with the series and episode number; 简介 with timestamps | tags on upload (platform field) | limits not confirmed |
67
+
68
+ A CTA is one verb: 关注 / follow, 主页看全集 / full episode in bio, save, comment the answer.
69
+ Platform buttons (shop, link, subscribe) are not drawn into the picture.
70
+
71
+ ## Posting-time starting points
72
+
73
+ Sprout Social 2026 aggregates, to be treated as **starting points** and replaced by the
74
+ account's own insights after two weeks: Instagram Mon–Thu 10:00–15:00; TikTok Wed 14:00–17:00;
75
+ LinkedIn Tue 11:00–17:00. Local time of the audience, not of the account. Other platforms and
76
+ the Chinese apps: not confirmed in the research — plan lunchtime (12–13) and evening (20–22)
77
+ slots in the audience's time zone and measure. Series content posts at the same slot every
78
+ time; the second post of a series goes out within 24 h of the first while the hook is fresh.
79
+
80
+ ## Cover and thumbnail design
81
+
82
+ - **Face + ≤ 4 words** (≤ 8 CJK chars): the face at 40–60 % of the frame height, looking at the
83
+ camera or at the text; the words in one colour band, one weight.
84
+ - **High contrast**: light text on a darkened lower third or dark text on a light band; check
85
+ it at 120 px wide (the 小红书 / 快手 tile is half a phone).
86
+ - **One template per series**: same title position, same colour, same type; the episode number
87
+ changes, nothing else. Recognition beats novelty in a grid.
88
+ - **Ratio per platform** (ratio-map.md): 16:9 1280×720 YouTube; 3:4 小红书 / IG grid; 9:16 Reels
89
+ / TikTok / 抖音 with the text in the centre 60 % because the grid crops to a taller tile;
90
+ 1146×717 B站 with the bottom-left clear; 6:7 视频号 composed for its 1:1 share crop.
91
+ - Covers are generated **with** the text only at the final ratio (nano-banana-pro, gpt-image-2.5
92
+ or seedream-5-pro for reliable multilingual type); every other size gets the text overlaid
93
+ after the crop.
94
+
95
+ ## Carousel / 图文 storytelling
96
+
97
+ 1. **Cover as hook** — the question, the contrast or the result; it must work alone in the feed.
98
+ 2. **One idea per card**, one line of text per card, the same layout grid on every card.
99
+ 3. **Escalate**: cards 2–N answer the cover in order of surprise, not of logic; the strongest
100
+ proof sits two cards before the end.
101
+ 4. **Last card = CTA** (follow, save, 主页看全集, 领取), in the same template as the cover so the
102
+ loop back to card 1 feels designed.
103
+ 5. **One ratio for the whole set** (IG ≤ 20 slides, 小红书 ≤ 18 images, TikTok photo mode ≤ 35):
104
+ generate every card at the same `ratio` and crop to the same box.
105
+ 6. Caption repeats the cover's keyword in the first line; on 小红书 the 话题 tags close the body.
106
+
107
+ ## Trending audio
108
+
109
+ Trending sounds lift reach on TikTok / 抖音 / Reels, but a business account may only use
110
+ tracks from the platform's **commercially licensed library**; personal-account sounds are
111
+ muted or the post is removed when the account is business-typed. AI-generated soundtracks
112
+ (Seed Audio, generated per teaser) avoid the problem and can be reused across the series.
113
+ Never lip-sync a drama clip to a licensed pop song for a paid promotion.
114
+
115
+ ## What to avoid
116
+
117
+ - A logo intro, a fade-in, a title card before the hook.
118
+ - Letterboxed 16:9 inside a 9:16 post (regenerate — ratio-map.md).
119
+ - Text in the top 270 px or the bottom 670 px of a vertical frame; text under the right rail.
120
+ - More than 5 hashtags on Instagram; hashtag walls anywhere; hashtags that do not exist yet.
121
+ - Sub-1080-px sources, upscaled 1K frames, JPEG re-compression of a re-compression.
122
+ - Cross-platform reposts with the other platform's watermark or overlay language.
123
+ - Engagement bait ("like if…", fake polls), fake countdowns, fake UI buttons drawn into the frame.
124
+ - Claiming AI footage is real footage; skipping the AI label where it is required.
@@ -0,0 +1,171 @@
1
+ # Plan template — the post spec sheet
2
+
3
+ One spec sheet per post (one platform × one surface × one asset). It is written before any
4
+ generation, filled from the platform row (platforms-global.md / platforms-china.md), the ratio
5
+ row (ratio-map.md) and the craft rules (content-craft.md); the campaign's sheets together are
6
+ the deliverables checklist of repurpose.md. The block below is the template; after it, one
7
+ filled example — a 3-episode 短剧 launch on 小红书, 抖音 and Instagram Reels with a teaser and a
8
+ poster per platform. Every figure in a sheet is copied from a reference row or marked
9
+ "not confirmed"; nothing is invented in the sheet.
10
+
11
+ ## Fields
12
+
13
+ | Field | Meaning | Where it comes from |
14
+ | --- | --- | --- |
15
+ | campaign | name of the launch / series / promotion | the user |
16
+ | platform | 小红书, 抖音, Instagram … | the user |
17
+ | surface | the row: 图文, video note, Reels, Stories, thumbnail … | platform file |
18
+ | ratio | delivered ratio | platform row |
19
+ | px | delivered pixel size | platform row |
20
+ | duration cap | the surface's cap and the planned length | platform row; content-craft.md |
21
+ | safe zone | the pixel bands text and faces avoid | platform row / 9:16 diagram |
22
+ | source asset | episode + segment ids, KV id, uploaded file | short-drama storyboard / ads brief / user assets |
23
+ | generation plan | model, `ratio`, `resolution`, `duration`, references (`@imageN`), prompt notes (framing sentence) | ratio-map.md |
24
+ | crop | native ratio → target px, anchor | ratio-map.md, crop anchoring |
25
+ | cover | file or "first frame"; template name | content-craft.md, covers |
26
+ | caption | hook line + body + CTA, within the limit | content-craft.md, captions |
27
+ | hashtags | count and list, within the cap | content-craft.md |
28
+ | CTA | one verb | the brief / series plan |
29
+ | posting slot | day + time in the audience's time zone; "starting point" or "from insights" | content-craft.md, posting times |
30
+ | disclosure | the platform's AI toggle and its state; 「AI生成」 for China | platforms-china.md; repurpose.md §3 |
31
+ | status | planned · quoted · generated · cropped · overlaid · scheduled · posted | the work |
32
+
33
+ ## Template block
34
+
35
+ ```
36
+ campaign:
37
+ platform:
38
+ surface:
39
+ ratio:
40
+ px:
41
+ duration cap: (surface cap) / planned:
42
+ safe zone:
43
+ source asset:
44
+ generation plan:
45
+ model:
46
+ ratio:
47
+ resolution:
48
+ duration:
49
+ references: @image1 = … · @image2 = …
50
+ prompt notes:
51
+ crop: native → target, anchor:
52
+ cover:
53
+ caption:
54
+ hashtags: (n / cap)
55
+ CTA:
56
+ posting slot:
57
+ disclosure:
58
+ status:
59
+ ```
60
+
61
+ ## Filled example — 《穿越战神》 3-episode launch, 小红书 + 抖音 + Instagram Reels
62
+
63
+ Six sheets: a teaser and a poster per platform. Beats and references are the same across the
64
+ three teasers; only the ratio (all 9:16 here), the copy and the covers differ.
65
+
66
+ ```
67
+ campaign: 穿越战神 E01–E03 launch, week 1
68
+ platform: 抖音
69
+ surface: video
70
+ ratio: 9:16
71
+ px: 1080×1920
72
+ duration cap: 60 min (verify) / planned: 30 s
73
+ safe zone: pixel bands not confirmed for 抖音 — using the 9:16 diagram union: x 120–960, y 270–1248
74
+ source asset: E01 storyboard segments 03 (turn), 05 (爽点), 07 (cliff); character sheets C01, C02; scene sheet S02 (the ancestral hall)
75
+ generation plan:
76
+ model: seedance-2.5-ref
77
+ ratio: 9:16
78
+ resolution: 1080p
79
+ duration: 4 segments × 7–8 s (hook 3 s inside segment 1)
80
+ references: @image1 = C01 sheet · @image2 = C02 sheet · @image3 = S02 sheet · @audio1 = C01 voice sample
81
+ prompt notes: vertical, faces at the upper third, hall built in depth (pillar foreground, altar behind); hook variant A = the line 「跪下的应该是你」 cut in cold; subtitles burned in at y 1100–1240
82
+ crop: none (video is regenerated at 9:16)
83
+ cover: first frame of variant A, title template 「穿越战神 · 第1集」 in the centre 60 %
84
+ caption: 「跪下的应该是你。」 穿越战神 第1集 — 他回来了,这次跪的是谁? 主页看全集
85
+ hashtags: 4 / no fixed cap: #穿越战神 #短剧 #逆袭 #第1集
86
+ CTA: 主页看全集
87
+ posting slot: Wed 20:00 CST — not confirmed for 抖音, starting point; replace from insights after week 1
88
+ disclosure: 「AI生成」 toggle on (标识办法 2025-09-01)
89
+ status: quoted
90
+ ```
91
+
92
+ ```
93
+ campaign: 穿越战神 E01–E03 launch, week 1
94
+ platform: 小红书
95
+ surface: 图文 (poster + 3 cards)
96
+ ratio: 3:4
97
+ px: 1242×1660
98
+ duration cap: — / 4 images (≤ 18)
99
+ safe zone: title inside the middle 70 %; the tile is half a screen
100
+ source asset: E01 爽点 keyframe (C01 standing over C02 in the hall); scene sheet S02
101
+ generation plan:
102
+ model: nano-banana-pro
103
+ ratio: 3:4
104
+ resolution: 2K
105
+ references: @image1 = C01 sheet · @image2 = C02 sheet · @image3 = S02 sheet
106
+ prompt notes: poster: two figures, C01 lit from the altar candles, title band lower third with 「穿越战神」 + 「第1集 · 跪下的应该是你」 rendered in the picture; cards 2–4 without text (overlaid after)
107
+ crop: 3:4 2K frame → cover-fit to 1660 high → trim 1–2 px each side → 1242×1660
108
+ cover: card 1 (the poster) — template 「剧名 / 第N集 / one-line hook」
109
+ caption: 标题 (18 chars): 穿越战神|第1集他回来了跪的是谁 · 正文: 3 short lines with emoji markers, the keyword 穿越战神 in line 1, 主页看全集 as the last line
110
+ hashtags: 6 / no fixed cap: #穿越战神 #短剧推荐 #逆袭 #穿越 #第1集 #AI短剧
111
+ CTA: 关注 + 主页看全集
112
+ posting slot: Thu 12:30 CST — not confirmed for 小红书, starting point
113
+ disclosure: 「AI生成」 toggle on
114
+ status: planned
115
+ ```
116
+
117
+ ```
118
+ campaign: 穿越战神 E01–E03 launch, week 1
119
+ platform: Instagram
120
+ surface: Reels
121
+ ratio: 9:16
122
+ px: 1080×1920
123
+ duration cap: 3 min in-app / planned: 30 s
124
+ safe zone: Meta unified (Mar 2026): 269 px top, 384–672 px bottom, 65 px sides
125
+ source asset: the 抖音 teaser's segments (same references), English subtitle layer regenerated
126
+ generation plan:
127
+ model: same clips as 抖音 (no new generation); overlay layer in English at the final ratio
128
+ ratio: 9:16
129
+ resolution: 1080p
130
+ duration: 30 s
131
+ references: —
132
+ prompt notes: hook variant B for this market: the result-first cut (the kneel) before the line
133
+ crop: none
134
+ cover: first frame of variant B; title in the centre — the grid tile is 3:4
135
+ caption: "You should be the one kneeling." Ep 1 of 穿越战神 — full episode in bio.
136
+ hashtags: 5 / 5: #shortdrama #aidrama #cdrama #reels #ep1
137
+ CTA: full episode in bio
138
+ posting slot: Tue 12:00 local — Sprout 2026 starting point (Mon–Thu 10–15)
139
+ disclosure: Meta AI label per policy (auto-detected from Jun 2026; state it in the caption as well)
140
+ status: planned
141
+ ```
142
+
143
+ ```
144
+ campaign: 穿越战神 E01–E03 launch, week 1
145
+ platform: Instagram
146
+ surface: feed poster (4:5)
147
+ ratio: 4:5
148
+ px: 1080×1350
149
+ duration cap: —
150
+ safe zone: avoid the outer 3 % per side (3:4 grid crop since Jan 2025)
151
+ source asset: the 小红书 poster's references
152
+ generation plan:
153
+ model: nano-banana-pro
154
+ ratio: 4:5
155
+ resolution: 2K
156
+ references: @image1 = C01 sheet · @image2 = C02 sheet · @image3 = S02 sheet
157
+ prompt notes: same composition as the 3:4 poster; English title band 「WARLORD RETURNS · EP 1」 rendered in the picture
158
+ crop: none (4:5 is native to nano-banana-pro)
159
+ cover: itself
160
+ caption: hook line + 2 lines + "full episode in bio"
161
+ hashtags: 5 / 5
162
+ CTA: full episode in bio
163
+ posting slot: with the Reel, same day
164
+ disclosure: Meta AI label per policy
165
+ status: planned
166
+ ```
167
+
168
+ The 抖音 poster sheet mirrors the 小红书 one at 9:16 (a native 9:16 generation, title in the
169
+ centre 60 %), and the 抖音 teaser variant C (the direct question hook) is a fourth video sheet
170
+ with only the hook segment regenerated. Six sheets, one references set, two image generations
171
+ per ratio, four video segments plus two extra hook segments — that is the whole quote.
@@ -0,0 +1,94 @@
1
+ # Platform specs — China (抖音, 快手, 小红书, 视频号, B站, 微博, 微信公众号)
2
+
3
+ The same table shape as platforms-global.md for the mainland platforms: per surface, the ratio
4
+ and pixel size, duration and file caps, the safe zone, the text limits, and the conventions that
5
+ decide whether a post is read at all. Chinese trade terms are kept in Chinese (图文, 封面, 话题,
6
+ 标题) because that is how the platform's own upload screens name them. Rows marked *(verify)*
7
+ had conflicting figures in the 2025–2026 research; "not confirmed" means no figure was found —
8
+ say so in the plan rather than guess. Generation ratios and crop boxes per row are in
9
+ ratio-map.md.
10
+
11
+ ## 抖音 (Douyin)
12
+
13
+ | Surface | Ratio · px | Duration | File size | Safe zone | Text limits | Notes |
14
+ | --- | --- | --- | --- | --- | --- | --- |
15
+ | Video | 9:16 1080×1920 (16:9 accepted, letterboxed); 30 or 60 fps | 60 min *(verify; older figure 15 min)* | web upload ≤4 GB | pixel bands not confirmed — same layout as TikTok (right rail, bottom caption): use the 9:16 diagram in platforms-global.md until verified | 标题 ≈20 chars visible; 话题 tags (#…#) appended | product or hook inside 3 s; 抖音 ranks completion rate and re-watches |
16
+ | 图文 | 3:4 or 9:16 images, one ratio per post | — | not confirmed | as video | 标题 ≈20 chars | image count cap not confirmed; swipes with music like TikTok photo mode |
17
+ | 封面 | 9:16 frame (a chosen frame or an uploaded cover) | — | not confirmed | profile grid crops to a taller tile — keep cover text in the centre 60 % | cover text ≤ ≈8 chars readable at thumbnail size | series use one template: same title position, same colour band |
18
+
19
+ ## 快手 (Kuaishou)
20
+
21
+ | Surface | Ratio · px | Duration | File size | Safe zone | Text limits | Notes |
22
+ | --- | --- | --- | --- | --- | --- | --- |
23
+ | Video | 9:16 1080×1920 | ≈10 min | 2–3 GB *(verify)* | not confirmed — use the 9:16 diagram | not confirmed | double-column feed on the home tab: the 封面 is a tile, so its text must survive being half-width |
24
+ | 封面 | 9:16 or 3:4 | — | not confirmed | — | not confirmed | one idea, big type, face if there is one |
25
+
26
+ ## 小红书 (Xiaohongshu / RED)
27
+
28
+ | Surface | Ratio · px | Duration | File size | Safe zone | Text limits | Notes |
29
+ | --- | --- | --- | --- | --- | --- | --- |
30
+ | 图文 note | 3:4 1242×1660 (or 1080×1440); 1:1 and 9:16 accepted | — | ≤18 images, ≤20 MB each | the feed card shows the first image at 3:4 — a 1:1 or 9:16 first image is cropped; titles inside the image sit in the middle 70 % | 标题 ≤20 chars; 正文 ≤1,000 (长文 6,000); 话题 tags inside the body | **one ratio per note**: the first image sets the frame for all; the cover is the hook (see content-craft.md) |
31
+ | Video note | 9:16 or 3:4 | ≤15 min | not confirmed | not confirmed — use the 9:16 diagram | 标题 ≤20; 正文 ≤1,000 | 3:4 video shows larger in the two-column feed than 9:16 |
32
+ | 封面 | 3:4 or 9:16 | — | ≤5 MB | two-column feed: the tile is half the screen width — cover text must read at that size | cover text ≤ ≈8 chars, ≤2 lines | 3:4 covers dominate the discovery feed; a 9:16 cover is cropped to 3:4 on the card |
33
+
34
+ ## 视频号 (WeChat Channels)
35
+
36
+ | Surface | Ratio · px | Duration | File size | Safe zone | Text limits | Notes |
37
+ | --- | --- | --- | --- | --- | --- | --- |
38
+ | Feed video | 6:7 1080×1260 (largest in the feed); 9:16 1080×1920; 4:3 1080×810; 1:1 1080×1080; any ratio 0.33–3.0 accepted | web 3 s–8 h; phone ≤60 min | ≤2 GB | 9:16 plays with black bars in the feed until tapped — 6:7 fills the card without bars | 描述 limit not confirmed; 话题 tags supported | 6:7 has no native generation ratio — crop from 3:4 or 1:1 (ratio-map.md) |
39
+ | 封面 | same ratio as the video; **朋友圈 share crops the cover to 1:1** | — | not confirmed | keep the title and face inside the central square of the cover | — | a 6:7 cover loses 90 px top and bottom in the 朋友圈 card |
40
+ | Live / 直播 preview | 9:16 | — | — | — | — | not covered here |
41
+
42
+ ## B站 (Bilibili)
43
+
44
+ | Surface | Ratio · px | Duration | File size | Safe zone | Text limits | Notes |
45
+ | --- | --- | --- | --- | --- | --- | --- |
46
+ | Video | 16:9 1920×1080 or 3840×2160 | not confirmed | not confirmed | — | 标题 and 简介 limits not confirmed | 横屏 first; vertical is accepted but shown pillar-boxed on desktop |
47
+ | 封面 | 1146×717 (≈16:10) or 1920×1200 | — | ≤2–5 MB | **keep the bottom-left corner clear** (duration badge overlays it); the title of the card sits under the cover, not on it | cover text ≤ ≈10 chars | crop from 3:2 or 16:9 — see ratio-map.md |
48
+ | 动态 (dynamic post) | 1:1 or 4:3 images | — | not confirmed | — | not confirmed | nine-grid like 微博 |
49
+
50
+ ## 微博 (Weibo)
51
+
52
+ | Surface | Ratio · px | Duration | File size | Safe zone | Text limits | Notes |
53
+ | --- | --- | --- | --- | --- | --- | --- |
54
+ | 头条文章 cover | 1000×562 (safe area 1000×400) or 900×500 | — | not confirmed | the card crops top and bottom: keep the title inside the middle 400 px | article title limit not confirmed | crop from 16:9 — see ratio-map.md |
55
+ | Post images | not confirmed | — | not confirmed | not confirmed | post text limit not confirmed | nine-grid: the first three images are seen; make the first the hook |
56
+ | Video | *(verify)* | *(verify)* | *(verify)* | — | *(verify)* | the research produced no reliable 2026 figures for 微博 video |
57
+
58
+ ## 微信公众号 (WeChat Official Account)
59
+
60
+ | Surface | Ratio · px | Duration | File size | Safe zone | Text limits | Notes |
61
+ | --- | --- | --- | --- | --- | --- | --- |
62
+ | 头图 / cover | 2.35:1 900×383 — **plus the 1:1 share crop** taken from its centre | — | not confirmed | title and face inside the central 383×383 square so the 1:1 share card still reads | article title limit not confirmed | crop from 21:9 — see ratio-map.md |
63
+ | Secondary cover (次条) | 1:1 200×200, export at 2× (400×400) | — | not confirmed | — | — | small: one object or one face, no text |
64
+ | 图文 body | images the width of the article column; 900 px wide matches the cover width (practice, not a platform rule) | — | not confirmed | — | body length not confirmed | see 图文 layout notes below |
65
+
66
+ 图文 layout notes: the article opens on the cover and the first line, so the first image after
67
+ the title is a second hook, not a decoration; one image per point, captions under images in a
68
+ lighter weight; a share card at the end repeats the CTA; the 1:1 share crop is what most
69
+ readers see first in a chat, so the cover's centre square is the real cover.
70
+
71
+ ## China-specific practice
72
+
73
+ - **「AI生成」 label.** 《人工智能生成合成内容标识办法》 has been in force since 2025-09-01: AI-generated
74
+ or AI-edited video, images and audio carry a visible 「AI生成」 label (most platforms add a
75
+ toggle on upload — switch it on) and the file keeps implicit metadata / watermark marking. Do
76
+ not strip the marking in the crop step; do not describe AI footage as real footage.
77
+ - **Title style.** 小红书 标题 ≤20 chars and the platform hides more; 抖音 shows ≈20. Front-load the
78
+ keyword the search box will match (product, place, problem), then the twist. Number + result
79
+ patterns (「3个…」「第2集…」) and bracketed qualifiers (【】) read as native; clickbait without the
80
+ payoff in the body is down-ranked.
81
+ - **Emoji and keyword conventions.** Emoji as bullet markers at line starts, not inside
82
+ sentences; the body repeats the title's keyword once in the first line; 话题 tags (#…#) go at
83
+ the end of the body, 3–6 on 小红书, and they are searchable — use the platform's suggested
84
+ spellings, not invented ones.
85
+ - **图文 storytelling.** The cover is the hook (question, contrast, result), each following image
86
+ is one idea with one line of text on it, the last image is the CTA (follow / 主页看全集 / 领取).
87
+ One ratio for the whole set, one title template for the whole account.
88
+ - **Cover text is the headline.** On 小红书 and 快手 the tile is half the screen: ≤8 chars, one
89
+ colour band behind the text, face or product filling the rest.
90
+ - **Search first.** 小红书 and 抖音 surface posts by search as much as by feed: the title, the
91
+ cover text and the first body line should agree on one keyword.
92
+ - **Platform video-style borrowing.** 抖音 audiences reject an obvious repost from TikTok (English
93
+ overlays, foreign sounds); regenerate the overlay layer in Chinese rather than translating on
94
+ top of the old one.