create-dwy 0.16.0 → 0.17.0
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.
- package/CHANGELOG.md +17 -0
- package/bin/index.js +1 -1
- package/package.json +3 -2
- package/src/searchable-select.js +419 -0
- package/src/sync-all.js +313 -65
- package/src/sync-global-skills.js +167 -0
- package/src/sync.js +59 -43
- package/templates/ai-tools/CHANGELOG.md +210 -0
- package/templates/ai-tools/VERSION +1 -0
- package/templates/ai-tools/hook-manifests/hooks.json +7 -0
- package/templates/ai-tools/hooks/Git/pre-git-commit-ai-signature-check.sh +57 -0
- package/templates/ai-tools/rules/Android/dwy-android-core.md +280 -5
- package/templates/ai-tools/rules/Docker/dwy-docker.md +52 -1
- package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-build.md +50 -1
- package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-design.md +139 -0
- package/templates/ai-tools/rules/HarmonyOS/dwy-harmony-pitfalls.md +72 -0
- package/templates/ai-tools/rules/Python/dwy-python-core.md +47 -0
- package/templates/ai-tools/rules/Vue/dwy-vue-core.md +55 -0
- package/templates/ai-tools/rules/iOS/dwy-ios-pitfalls.md +7 -0
- package/templates/ai-tools/rules/iOS/dwy-swift-core.md +46 -0
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md +9 -6
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-oss-commercial-license.md +128 -0
- package/templates/ai-tools/skills//345/205/203/345/267/245/345/205/267/dwy-shared/SKILL.md +22 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/SKILL.md +65 -0
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/assets/appstore-submission.yaml +43 -0
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/references/api-workflow.md +17 -0
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/references/in-app-purchase-review.md +16 -0
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/references/screenshot-workflow.md +16 -0
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/scripts/appstore_config.sh +140 -0
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/SKILL.md +11 -8
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/android.md +2 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/backend-deploy.md +2 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/changelog.md +24 -4
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/frontend-deploy.md +2 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/generic-release.md +2 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/git-tag.md +82 -0
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/harmony.md +2 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/ios.md +3 -2
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/monitor-notify.md +2 -2
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-semver/SKILL.md +1 -1
- package/templates/ai-tools/skills//345/237/272/347/241/200/345/272/223/dwy-eapi/references/tasks-integration-guide.md +2 -2
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/SKILL.md +1 -1
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/references/checks-runtime.md +2 -2
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_docker.sh +3 -3
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_secrets.sh +1 -1
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/README.md +57 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/SKILL.md +147 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/references/api.md +43 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/references/config.example.yaml +33 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/global_config.py +89 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/setup_config.py +175 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/synthesize.py +339 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/SKILL.md +127 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/assets/cover-style-master-v1.png +0 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/references/platform-copy-examples.md +37 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/references/platform-posting-times.md +193 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0005-ideation/SKILL.md +42 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0005-ideation/templates/topic-backlog.template.md +50 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0005-ideation/templates//351/200/211/351/242/230/346/261/240.template.md +16 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0010-product/SKILL.md +106 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0010-product/templates/channel-profile.template.md +52 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0010-product/templates//344/272/247/345/223/201/345/215/241.template.md +132 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/SKILL.md +60 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/scripts/build_facts_html.py +430 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/scripts/generate_html.py +1287 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/scripts/generate_report.py +189 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/templates//344/272/213/345/256/236/350/265/204/346/226/231/345/272/223.template.md +55 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/SKILL.md +36 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates/README.md +10 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates//344/272/213/345/256/236.template.md +82 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates//345/215/225/351/233/206/346/226/207/346/241/243.template.md +175 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates//350/204/232/346/234/254.template.md +69 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates//351/252/250/346/236/266-v1.1.md +174 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0050-design/SKILL.md +55 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0060-assets/SKILL.md +29 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package/SKILL.md +42 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package/scripts/validate_shots.py +207 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package/shots.schema.json +186 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package//344/272/272/345/256/241/345/214/205.template.md +1 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package//344/272/272/345/256/241/350/257/264/346/230/216.md +15 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package//346/210/220/347/211/207/345/214/205.template.md +49 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0080-factory/SKILL.md +58 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-comic-kit/SKILL.md +424 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-comic-kit/evals.md +41 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-flow/CONTRACT.md +123 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-flow/SKILL.md +81 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-flow//346/211/247/350/241/214/346/270/205/345/215/225.template.md +60 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/SKILL.md +78 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/agents/openai.yaml +4 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/knowledge-town-paper-film-v1.json +80 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/AudioTracks.tsx +20 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/CaptionLayer.tsx +18 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/CueTimeline.ts +24 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/KnowledgeTownComposition.tsx +21 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/references/cinematic-direction.md +73 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/references/sticker-asset-production.md +30 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/references/style-guide.md +43 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/scripts/build_cue_timeline.py +75 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/scripts/validate_cue_timeline.py +68 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/scripts/validate_style_preset.py +22 -0
- package/templates/ai-tools/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-first/SKILL.md +176 -0
- package/templates/ai-tools/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-first/references/chapter-01-mirrors.md +112 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# 单集科普骨架 · v1.1(标准主体结构)
|
|
2
|
+
|
|
3
|
+
> **用途:** 3–5 分钟、单概念、讲故事式自媒体短片的**默认骨架**。
|
|
4
|
+
> **原则:** 主体结构统一;**各段可裁剪/降级**,非每段都必须满配。
|
|
5
|
+
> **复用:** 新集复制同目录 [`单集文档.template.md`](./单集文档.template.md),按本文件填段。
|
|
6
|
+
> **所属 skill:** `uc-media-0040-script` · 标准目录 `templates/`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 一句话
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
钩子(场景+缺口)→ 历史(何以至此)→ 事实(1 个机制)
|
|
14
|
+
→ 生活(1 主例)→ 边界(需要时)→ 验证(动手|演示|真图)→ 落点+下集
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
画面原则(贯穿,不是单独一大段):**真截图 / 真 UI 优先**;插画只解释结构。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 2. 七段定义
|
|
22
|
+
|
|
23
|
+
| 代号 | 段名 | 目标(观众得到什么) | 默认时长 | 必选? |
|
|
24
|
+
|------|------|----------------------|----------|--------|
|
|
25
|
+
| **H** | 钩子 | 场景 + 认知缺口:为什么要看完 | 25–35s | **必选** |
|
|
26
|
+
| **T** | 历史 | ≤4 锚点,只服务「何以至此」 | 40–50s | 默认有;可 **缩/并** |
|
|
27
|
+
| **F** | 事实 | **1 个**机制模型,人话 | 60–75s | **必选** |
|
|
28
|
+
| **L** | 生活 | 1 主例 + 可选 1 辅 | 40–50s | **必选**(至少 1 主例) |
|
|
29
|
+
| **B** | 边界 | 幻觉 / 误用 / 能力边界 | 20–30s | **按需** |
|
|
30
|
+
| **V** | 验证 | 动手 \| 演示 \| 真图对照 | 30–40s | **按需**(三选一或组合) |
|
|
31
|
+
| **C** | 落点 | 记住一句 + 下集钩子 | 15–25s | **必选** |
|
|
32
|
+
|
|
33
|
+
合计默认约 **3:30–5:00**。压到 3′ 时优先砍 **T 与 V 时长**,不砍 H/F/L/C 的存在。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 3. 必选 / 可裁剪规则
|
|
38
|
+
|
|
39
|
+
### 3.1 硬必选(缺了不像完整单集)
|
|
40
|
+
|
|
41
|
+
| 段 | 最低交付 |
|
|
42
|
+
|----|----------|
|
|
43
|
+
| **H** | 1 个观众已有场景 + 1 句缺口问题 |
|
|
44
|
+
| **F** | 1 个机制模型(可配「名字拆开」) |
|
|
45
|
+
| **L** | 1 个生活主例(辅例可删) |
|
|
46
|
+
| **C** | 1 句落点;系列片加下集钩子 |
|
|
47
|
+
|
|
48
|
+
### 3.2 默认可裁剪
|
|
49
|
+
|
|
50
|
+
| 段 | 何时保留 | 何时缩/删 | 降级写法 |
|
|
51
|
+
|----|----------|-----------|----------|
|
|
52
|
+
| **T 历史** | 名词有明确「进日常」节点 | 无公开史、或纯工具操作集 | 缩成 **1 句**「从…变成你桌上的…」并进 H 或 F |
|
|
53
|
+
| **B 边界** | 易神化/易误用(LLM、Agent、幻觉相关) | 纯中性术语且误用成本低 | 并入 F 末尾 1 句警告 |
|
|
54
|
+
| **V 验证** | 观众 30s 内能复现或看懂 | 训练全流程等无法跟做 | 改为 **演示录屏** 或 **1 张真图对照** |
|
|
55
|
+
|
|
56
|
+
### 3.3 验证段三选一(V)
|
|
57
|
+
|
|
58
|
+
| 模式 | 适用 | 例子 |
|
|
59
|
+
|------|------|------|
|
|
60
|
+
| **动手** | 对话框/设置里能点 | 半句续写、改一句 Prompt |
|
|
61
|
+
| **演示** | 环境重、需账号/装环境 | MCP 接工具、本地跑命令 |
|
|
62
|
+
| **真图对照** | 重在「认界面」 | Token 用量页、上下文截断提示 |
|
|
63
|
+
|
|
64
|
+
可组合:动手 20s + 真图 10s。
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 4. 时长配比(默认 4′ 片)
|
|
69
|
+
|
|
70
|
+
| 段 | 占比 | 约秒 | 硬顶 |
|
|
71
|
+
|----|------|------|------|
|
|
72
|
+
| H | 10–15% | 25–35 | — |
|
|
73
|
+
| T | 15–20% | 40–50 | **≤50s**;锚点 **≤4** |
|
|
74
|
+
| F | 25–30% | 60–75 | 机制只保留 **1 个主模型** |
|
|
75
|
+
| L | 15–20% | 40–50 | 主例 1;辅例 ≤1 |
|
|
76
|
+
| B | 8–12% | 20–30 | 可 0 |
|
|
77
|
+
| V | 10–15% | 30–40 | 可 0 或改演示 |
|
|
78
|
+
| C | 5–8% | 15–25 | 落点句必须有 |
|
|
79
|
+
|
|
80
|
+
**超时优先砍:** T 参数堆砌 → L 第二例子 → V 步骤数 → F 的次要比喻。
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 5. 各段写法清单(复用检查)
|
|
85
|
+
|
|
86
|
+
### H · 钩子
|
|
87
|
+
|
|
88
|
+
- [ ] 场景是观众**已经在做的事**(打开对话框、贴长文、看用量…)
|
|
89
|
+
- [ ] 有**认知缺口**(不是「今天讲 XXX」)
|
|
90
|
+
- [ ] 3 秒内出现本集名词或问题句
|
|
91
|
+
|
|
92
|
+
### T · 历史
|
|
93
|
+
|
|
94
|
+
- [ ] 每个锚点都服务「何以进到你生活」
|
|
95
|
+
- [ ] ≤4 点;不报排行榜/参数竞赛(除非本集主题就是规模)
|
|
96
|
+
- [ ] 日期/机构可溯源(写进事实底稿)
|
|
97
|
+
|
|
98
|
+
### F · 事实
|
|
99
|
+
|
|
100
|
+
- [ ] 只有 **1 条主机制**(如「猜下一个 token」)
|
|
101
|
+
- [ ] 人话优先;公式/实现细节默认不进
|
|
102
|
+
- [ ] 与 L 的例子不重复讲同一套比喻两遍
|
|
103
|
+
|
|
104
|
+
### L · 生活
|
|
105
|
+
|
|
106
|
+
- [ ] 主例高共鸣、可一秒懂映射
|
|
107
|
+
- [ ] 辅例可删;不新开第三条机制
|
|
108
|
+
|
|
109
|
+
### B · 边界
|
|
110
|
+
|
|
111
|
+
- [ ] 具体误用场景,不空洞「要理性」
|
|
112
|
+
- [ ] 与落点句一致(防神话)
|
|
113
|
+
|
|
114
|
+
### V · 验证
|
|
115
|
+
|
|
116
|
+
- [ ] 步骤 ≤3;可静帧给观众照做
|
|
117
|
+
- [ ] 真 UI,不 AI 假界面冒充
|
|
118
|
+
|
|
119
|
+
### C · 落点
|
|
120
|
+
|
|
121
|
+
- [ ] **一句**可被记住(片尾花字)
|
|
122
|
+
- [ ] 单集闭环:没看过上集也听得懂
|
|
123
|
+
- [ ] 系列:下集钩子 1 句,不剧透成长文
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 6. 内容适配速查(本系列九站)
|
|
128
|
+
|
|
129
|
+
| 主题 | T | B | V 建议 |
|
|
130
|
+
|------|---|---|--------|
|
|
131
|
+
| LLM | 满配 3–4 锚点 | **要**(幻觉) | 动手:续写+冷门题 |
|
|
132
|
+
| 训练 | 可短 | 要(不是一次聊天就「学会」) | 演示/类比图,难动手 |
|
|
133
|
+
| Token | 可短 | 可选 | 真图:用量/计数界面 |
|
|
134
|
+
| Prompt | 可短 | 可选 | 动手:同一题两种写法 |
|
|
135
|
+
| 上下文 | 可短 | 要(会忘/装不下) | 真图:超长贴入被截 |
|
|
136
|
+
| 多模态 | 中 | 要(乱认图) | 演示:图+文同问 |
|
|
137
|
+
| Agent | 中 | **要**(乱调工具) | 演示:想做看循环 |
|
|
138
|
+
| MCP | 要(谁发布) | 可选 | 演示:接一个 server |
|
|
139
|
+
| Skills | 要(和 prompt 区别) | 可选 | 真图:技能包/说明页 |
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 7. 目录与流水线(和 media 契约对齐)
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
0N-主题/
|
|
147
|
+
research/事实-*.md # 0040 向:只锁可讲事实
|
|
148
|
+
scripts/单集文档-*.md # 按 单集文档.template 填满 v1.1
|
|
149
|
+
assets/_real-shots/ # 真截图
|
|
150
|
+
package/ # 可选:短片 shots.json + 人审包
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
开发顺序建议(由 **uc-media-0040-script** 短集模式执行):
|
|
154
|
+
|
|
155
|
+
```text
|
|
156
|
+
1. 填产品卡 + 选定段(哪些满配/缩/删)
|
|
157
|
+
2. 事实底稿(口播只讲有源内容;字段见 事实.template.md)
|
|
158
|
+
3. 按 H→…→C 写口播(对时长表)
|
|
159
|
+
4. 分镜 + 真图清单
|
|
160
|
+
5. 人审 → 配音/package/成片
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
模板路径:本 skill 包内 `templates/`(sync 后:`.claude/skills/uc-media-0040-script/templates/` 或 `.agents/skills/…`)
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 8. 版本
|
|
168
|
+
|
|
169
|
+
| 版本 | 日期 | 说明 |
|
|
170
|
+
|------|------|------|
|
|
171
|
+
| v1.1 | 2026-07-27 | 七段主体;T 硬顶;B/V 按需;验证三选一;真图贯穿 |
|
|
172
|
+
| v1.0 | — | 早期:钩子-历史-事实-生活-实操-落点(实操偏强制) |
|
|
173
|
+
|
|
174
|
+
升级规则:改默认配比或必选规则 → 升 v1.x;推倒七段 → v2。
|
package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0050-design/SKILL.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uc-media-0050-design
|
|
3
|
+
description: |
|
|
4
|
+
制作设计(0050):本集 design-lock.md;优先复用跨集 design-defaults,只写本集增量。
|
|
5
|
+
触发词:设计风格、style-lock、制作技术、0050。
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# uc-media-0050-design · 制作设计
|
|
9
|
+
|
|
10
|
+
## 行为(本 skill 内聚)
|
|
11
|
+
|
|
12
|
+
1. **先读跨集默认(若有)**
|
|
13
|
+
`{project_root}/.dwy/uc-media/design-defaults.md`
|
|
14
|
+
无则从频道档案气质 + 近集惯例推断,并可**首次**写入 defaults(用户未反对时)。
|
|
15
|
+
2. **写本集** `design-lock.md`:= defaults 引用 + **本集增量/例外**(勿整份重抄气质长文)。
|
|
16
|
+
3. **不确定不胡编**:工厂只写 **偏好** / `undecided`;最终以 **0080 人选** 为准。
|
|
17
|
+
|
|
18
|
+
**硬停:** 人审前不进 0060。
|
|
19
|
+
**flow `fast`:** 本步确认后可连跑 0060,在 0070 再停(见 flow 硬停表)。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 大步骤契约
|
|
24
|
+
|
|
25
|
+
| 项 | 内容 |
|
|
26
|
+
|----|------|
|
|
27
|
+
| **序** | 0050 |
|
|
28
|
+
| **stage** | `design` |
|
|
29
|
+
| **目录** | `{work_dir}/0050-design/` |
|
|
30
|
+
| **主文档** | **`design-lock.md`** |
|
|
31
|
+
| **上游** | `0040-script` 已人审;频道档案;可选 `design-defaults.md` |
|
|
32
|
+
| **风格扩展** | `uc-media-comic-kit` / `uc-media-knowledge-town`(若项目采用,按各自 skill 挂载) |
|
|
33
|
+
| **不做** | 批量生图;替用户最终锁定工厂 |
|
|
34
|
+
|
|
35
|
+
### design-lock 要点
|
|
36
|
+
|
|
37
|
+
- `style_id` / 气质 / 禁止项(可写「同 design-defaults」)
|
|
38
|
+
- `production_stack` **偏好**:`remotion` | `hyperframe` | `undecided`
|
|
39
|
+
- 若 defaults 已有默认工厂偏好,本集只写覆盖
|
|
40
|
+
- `asset_model` / 字幕安全区 / comic-kit 与否
|
|
41
|
+
- 本集例外表(仅本集)
|
|
42
|
+
- 签字:可进 0060
|
|
43
|
+
|
|
44
|
+
### 跨集 design-defaults(可选,建议)
|
|
45
|
+
|
|
46
|
+
路径:`.dwy/uc-media/design-defaults.md`
|
|
47
|
+
|
|
48
|
+
| 块 | 内容 |
|
|
49
|
+
|----|------|
|
|
50
|
+
| 默认 style_id / 气质关键词 | 与频道档案对齐 |
|
|
51
|
+
| 默认 production_stack 偏好 | |
|
|
52
|
+
| 禁止项 / 字幕安全区 | |
|
|
53
|
+
| 风格 skill | comic-kit / knowledge-town / 无 |
|
|
54
|
+
|
|
55
|
+
刷新:用户说「更新设计默认 / 重设画风默认」。
|
package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0060-assets/SKILL.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uc-media-0060-assets
|
|
3
|
+
description: |
|
|
4
|
+
素材(0060):0060-assets/素材清单.md + files/。触发词:素材、配图、生图、logo、0060。
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# uc-media-0060-assets · 素材
|
|
8
|
+
|
|
9
|
+
## 行为(本 skill 内聚)
|
|
10
|
+
|
|
11
|
+
1. **能自动的全部自动**:按脚本镜号 + design-lock 生成完整 `素材清单.md`;能从 `shared/icons` 定位的 logo 先填好。
|
|
12
|
+
2. **产出可改终稿**:用户改 method、补 `user_provided` 即可。
|
|
13
|
+
3. **不确定不胡编**:找不到的官方 Logo 不 AI 乱画当真标;路径不存在标 `missing`。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 大步骤契约
|
|
18
|
+
|
|
19
|
+
| 项 | 内容 |
|
|
20
|
+
|----|------|
|
|
21
|
+
| **序** | 0060 |
|
|
22
|
+
| **stage** | `assets` |
|
|
23
|
+
| **目录** | `{work_dir}/0060-assets/` |
|
|
24
|
+
| **主文档** | **`素材清单.md`** |
|
|
25
|
+
| **媒体** | `files/**` |
|
|
26
|
+
| **上游** | `0050-design/design-lock.md` + `0040-script/脚本-*.md` |
|
|
27
|
+
| **禁止** | 每镜一篇说明 md 当真源 |
|
|
28
|
+
|
|
29
|
+
清单表含:shot_id / 层 / method / 路径 / 就绪;支持 `user_provided`。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uc-media-0070-package
|
|
3
|
+
description: |
|
|
4
|
+
成片包(0070):0070-package/成片包.md + shots.json。工厂入口。
|
|
5
|
+
触发词:package、成片包、对轨冻结、0070。
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# uc-media-0070-package · 成片包
|
|
9
|
+
|
|
10
|
+
**Schema:** [`shots.schema.json`](./shots.schema.json)
|
|
11
|
+
**模板:** [`成片包.template.md`](./成片包.template.md)
|
|
12
|
+
**说明:** [`人审说明.md`](./人审说明.md)
|
|
13
|
+
|
|
14
|
+
## 行为(本 skill 内聚)
|
|
15
|
+
|
|
16
|
+
1. **能自动的全部自动**:从脚本 + design-lock + 素材清单组装 `成片包.md` + `shots.json`,并跑 validate。
|
|
17
|
+
2. **产出可改终稿**:人审改时长/vo 后重校验。
|
|
18
|
+
3. **不确定不胡编**:上游缺失不猜秒数、不编 vo。
|
|
19
|
+
|
|
20
|
+
使用 `knowledge-town-paper-film-v1` 时,另产出 `cue-timeline.json` 作为字幕、旁白、视觉动作与 SFX 的唯一对轨真源;`shots.json` 写入 `cue_timeline_file` 和每镜 `cue_ids`,但不复制或改写 cue 时码。
|
|
21
|
+
|
|
22
|
+
**本步硬停:** 人审通过前不进 0080。
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 大步骤契约
|
|
27
|
+
|
|
28
|
+
| 项 | 内容 |
|
|
29
|
+
|----|------|
|
|
30
|
+
| **序** | 0070 |
|
|
31
|
+
| **stage** | `package` |
|
|
32
|
+
| **目录** | `{work_dir}/0070-package/` |
|
|
33
|
+
| **人读** | **`成片包.md`** |
|
|
34
|
+
| **机读** | **`shots.json`** |
|
|
35
|
+
| **上游** | 脚本 + design-lock + `0060-assets/素材清单.md` |
|
|
36
|
+
| **下游** | 0080-factory |
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 脚本相对本 skill 包(sync 后:.claude/skills/uc-media-0070-package/ 或 .agents/skills/…)
|
|
40
|
+
python3 scripts/validate_shots.py \
|
|
41
|
+
"{work_dir}/0070-package/shots.json"
|
|
42
|
+
```
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate media package shots.json (schema version 1).
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python validate_shots.py path/to/shots.json
|
|
6
|
+
python validate_shots.py path/to/package/ # reads shots.json inside
|
|
7
|
+
|
|
8
|
+
Exit 0 = ok; 1 = validation errors; 2 = usage/io error.
|
|
9
|
+
Does not require jsonschema package: checks the critical contract rules inline.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import math
|
|
15
|
+
import re
|
|
16
|
+
import sys
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
SHOT_ID_RE = re.compile(r"^[A-Z][0-9]{2}$")
|
|
20
|
+
PRESETS = {
|
|
21
|
+
"hold",
|
|
22
|
+
"fade_up",
|
|
23
|
+
"scale_in",
|
|
24
|
+
"draw_on",
|
|
25
|
+
"highlight_pulse",
|
|
26
|
+
"slide_in",
|
|
27
|
+
"crossfade",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def load_package(path: Path) -> tuple[dict, Path]:
|
|
32
|
+
if path.is_dir():
|
|
33
|
+
path = path / "shots.json"
|
|
34
|
+
if not path.is_file():
|
|
35
|
+
raise FileNotFoundError(f"shots.json not found: {path}")
|
|
36
|
+
with path.open(encoding="utf-8") as f:
|
|
37
|
+
data = json.load(f)
|
|
38
|
+
return data, path
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def validate(data: dict, fps_tol: float = 0.51) -> list[str]:
|
|
42
|
+
errs: list[str] = []
|
|
43
|
+
|
|
44
|
+
if data.get("version") != 1:
|
|
45
|
+
errs.append(f"version must be 1, got {data.get('version')!r}")
|
|
46
|
+
|
|
47
|
+
for key in ("fps", "width", "height", "chapters", "shots"):
|
|
48
|
+
if key not in data:
|
|
49
|
+
errs.append(f"missing top-level field: {key}")
|
|
50
|
+
|
|
51
|
+
if errs:
|
|
52
|
+
return errs
|
|
53
|
+
|
|
54
|
+
fps = data["fps"]
|
|
55
|
+
if not isinstance(fps, (int, float)) or fps <= 0:
|
|
56
|
+
errs.append(f"fps must be > 0, got {fps!r}")
|
|
57
|
+
|
|
58
|
+
chapters = data.get("chapters") or []
|
|
59
|
+
shots = data.get("shots") or []
|
|
60
|
+
if not isinstance(chapters, list) or len(chapters) < 1:
|
|
61
|
+
errs.append("chapters must be a non-empty array")
|
|
62
|
+
if not isinstance(shots, list) or len(shots) < 1:
|
|
63
|
+
errs.append("shots must be a non-empty array")
|
|
64
|
+
return errs
|
|
65
|
+
|
|
66
|
+
shot_by_id: dict[str, dict] = {}
|
|
67
|
+
for i, s in enumerate(shots):
|
|
68
|
+
if not isinstance(s, dict):
|
|
69
|
+
errs.append(f"shots[{i}] not an object")
|
|
70
|
+
continue
|
|
71
|
+
sid = s.get("shot_id")
|
|
72
|
+
if not sid or not isinstance(sid, str) or not SHOT_ID_RE.match(sid):
|
|
73
|
+
errs.append(f"shots[{i}].shot_id invalid: {sid!r} (expect A00-style)")
|
|
74
|
+
else:
|
|
75
|
+
if sid in shot_by_id:
|
|
76
|
+
errs.append(f"duplicate shot_id: {sid}")
|
|
77
|
+
shot_by_id[sid] = s
|
|
78
|
+
|
|
79
|
+
for req in (
|
|
80
|
+
"chapter_id",
|
|
81
|
+
"order",
|
|
82
|
+
"vo_text",
|
|
83
|
+
"duration_sec",
|
|
84
|
+
"duration_frames",
|
|
85
|
+
):
|
|
86
|
+
if req not in s:
|
|
87
|
+
errs.append(f"shot {sid or i}: missing {req}")
|
|
88
|
+
|
|
89
|
+
vo = s.get("vo_text")
|
|
90
|
+
if not isinstance(vo, str) or not vo.strip():
|
|
91
|
+
errs.append(f"shot {sid or i}: vo_text empty")
|
|
92
|
+
|
|
93
|
+
sec = s.get("duration_sec")
|
|
94
|
+
frames = s.get("duration_frames")
|
|
95
|
+
if isinstance(sec, (int, float)) and sec <= 0:
|
|
96
|
+
errs.append(f"shot {sid}: duration_sec must be > 0")
|
|
97
|
+
if isinstance(frames, int) and frames <= 0:
|
|
98
|
+
errs.append(f"shot {sid}: duration_frames must be > 0")
|
|
99
|
+
if (
|
|
100
|
+
isinstance(sec, (int, float))
|
|
101
|
+
and isinstance(frames, int)
|
|
102
|
+
and isinstance(fps, (int, float))
|
|
103
|
+
and fps > 0
|
|
104
|
+
and sec > 0
|
|
105
|
+
):
|
|
106
|
+
expected = round(sec * fps)
|
|
107
|
+
if abs(expected - frames) > fps_tol:
|
|
108
|
+
errs.append(
|
|
109
|
+
f"shot {sid}: duration_frames={frames} != round(sec*fps)={expected}"
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
motion = s.get("motion") or {}
|
|
113
|
+
if isinstance(motion, dict):
|
|
114
|
+
preset = motion.get("preset")
|
|
115
|
+
if preset is not None and preset not in PRESETS:
|
|
116
|
+
errs.append(f"shot {sid}: unknown motion.preset {preset!r}")
|
|
117
|
+
|
|
118
|
+
builds = s.get("builds_on")
|
|
119
|
+
if builds and isinstance(builds, str) and builds not in shot_by_id and builds:
|
|
120
|
+
# may appear later in list; check after pass
|
|
121
|
+
pass
|
|
122
|
+
|
|
123
|
+
assets = s.get("assets")
|
|
124
|
+
if assets is not None:
|
|
125
|
+
if not isinstance(assets, list):
|
|
126
|
+
errs.append(f"shot {sid}: assets must be array")
|
|
127
|
+
else:
|
|
128
|
+
for j, a in enumerate(assets):
|
|
129
|
+
if not isinstance(a, dict):
|
|
130
|
+
errs.append(f"shot {sid} assets[{j}] not object")
|
|
131
|
+
continue
|
|
132
|
+
if a.get("type_only"):
|
|
133
|
+
continue
|
|
134
|
+
if not a.get("role") or not a.get("path"):
|
|
135
|
+
errs.append(
|
|
136
|
+
f"shot {sid} assets[{j}]: need role+path (or type_only)"
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
# builds_on integrity (after all ids known)
|
|
140
|
+
for sid, s in shot_by_id.items():
|
|
141
|
+
builds = s.get("builds_on")
|
|
142
|
+
if builds in (None, "", "null"):
|
|
143
|
+
continue
|
|
144
|
+
if isinstance(builds, str) and builds not in shot_by_id:
|
|
145
|
+
errs.append(f"shot {sid}: builds_on {builds!r} not in shots")
|
|
146
|
+
|
|
147
|
+
# chapters vs shots
|
|
148
|
+
chapter_ids = set()
|
|
149
|
+
for ci, ch in enumerate(chapters):
|
|
150
|
+
if not isinstance(ch, dict):
|
|
151
|
+
errs.append(f"chapters[{ci}] not an object")
|
|
152
|
+
continue
|
|
153
|
+
cid = ch.get("chapter_id")
|
|
154
|
+
if not cid:
|
|
155
|
+
errs.append(f"chapters[{ci}]: missing chapter_id")
|
|
156
|
+
else:
|
|
157
|
+
chapter_ids.add(cid)
|
|
158
|
+
ids = ch.get("shot_ids") or []
|
|
159
|
+
if not ids:
|
|
160
|
+
errs.append(f"chapter {cid}: shot_ids empty")
|
|
161
|
+
for sid in ids:
|
|
162
|
+
if sid not in shot_by_id:
|
|
163
|
+
errs.append(f"chapter {cid}: shot_id {sid} missing from shots[]")
|
|
164
|
+
|
|
165
|
+
for sid, s in shot_by_id.items():
|
|
166
|
+
cid = s.get("chapter_id")
|
|
167
|
+
if cid and chapter_ids and cid not in chapter_ids:
|
|
168
|
+
errs.append(f"shot {sid}: chapter_id {cid!r} not in chapters")
|
|
169
|
+
|
|
170
|
+
# optional totals
|
|
171
|
+
if "total_duration_frames" in data and shot_by_id:
|
|
172
|
+
sum_f = sum(
|
|
173
|
+
s.get("duration_frames", 0)
|
|
174
|
+
for s in shot_by_id.values()
|
|
175
|
+
if isinstance(s.get("duration_frames"), int)
|
|
176
|
+
)
|
|
177
|
+
if data["total_duration_frames"] != sum_f:
|
|
178
|
+
errs.append(
|
|
179
|
+
f"total_duration_frames={data['total_duration_frames']} != sum shots {sum_f}"
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
return errs
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def main(argv: list[str]) -> int:
|
|
186
|
+
if len(argv) != 2:
|
|
187
|
+
print(__doc__.strip(), file=sys.stderr)
|
|
188
|
+
return 2
|
|
189
|
+
try:
|
|
190
|
+
data, path = load_package(Path(argv[1]))
|
|
191
|
+
except Exception as e:
|
|
192
|
+
print(f"IO error: {e}", file=sys.stderr)
|
|
193
|
+
return 2
|
|
194
|
+
|
|
195
|
+
errs = validate(data)
|
|
196
|
+
if errs:
|
|
197
|
+
print(f"FAIL {path} ({len(errs)} error(s))")
|
|
198
|
+
for e in errs:
|
|
199
|
+
print(f" - {e}")
|
|
200
|
+
return 1
|
|
201
|
+
n = len(data.get("shots") or [])
|
|
202
|
+
print(f"OK {path} version=1 shots={n}")
|
|
203
|
+
return 0
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
if __name__ == "__main__":
|
|
207
|
+
sys.exit(main(sys.argv))
|