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.
Files changed (102) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/bin/index.js +1 -1
  3. package/package.json +3 -2
  4. package/src/searchable-select.js +419 -0
  5. package/src/sync-all.js +313 -65
  6. package/src/sync-global-skills.js +167 -0
  7. package/src/sync.js +59 -43
  8. package/templates/ai-tools/CHANGELOG.md +210 -0
  9. package/templates/ai-tools/VERSION +1 -0
  10. package/templates/ai-tools/hook-manifests/hooks.json +7 -0
  11. package/templates/ai-tools/hooks/Git/pre-git-commit-ai-signature-check.sh +57 -0
  12. package/templates/ai-tools/rules/Android/dwy-android-core.md +280 -5
  13. package/templates/ai-tools/rules/Docker/dwy-docker.md +52 -1
  14. package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-build.md +50 -1
  15. package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-design.md +139 -0
  16. package/templates/ai-tools/rules/HarmonyOS/dwy-harmony-pitfalls.md +72 -0
  17. package/templates/ai-tools/rules/Python/dwy-python-core.md +47 -0
  18. package/templates/ai-tools/rules/Vue/dwy-vue-core.md +55 -0
  19. package/templates/ai-tools/rules/iOS/dwy-ios-pitfalls.md +7 -0
  20. package/templates/ai-tools/rules/iOS/dwy-swift-core.md +46 -0
  21. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md +9 -6
  22. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-oss-commercial-license.md +128 -0
  23. package/templates/ai-tools/skills//345/205/203/345/267/245/345/205/267/dwy-shared/SKILL.md +22 -1
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/SKILL.md +11 -8
  31. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/android.md +2 -1
  32. 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
  33. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/changelog.md +24 -4
  34. 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
  35. 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
  36. 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
  37. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/harmony.md +2 -1
  38. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/ios.md +3 -2
  39. 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
  40. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-semver/SKILL.md +1 -1
  41. package/templates/ai-tools/skills//345/237/272/347/241/200/345/272/223/dwy-eapi/references/tasks-integration-guide.md +2 -2
  42. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/SKILL.md +1 -1
  43. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/references/checks-runtime.md +2 -2
  44. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_docker.sh +3 -3
  45. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_secrets.sh +1 -1
  46. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/README.md +57 -0
  47. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/SKILL.md +147 -0
  48. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/references/api.md +43 -0
  49. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/references/config.example.yaml +33 -0
  50. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/global_config.py +89 -0
  51. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/setup_config.py +175 -0
  52. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/synthesize.py +339 -0
  53. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/SKILL.md +127 -0
  54. 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
  55. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/references/platform-copy-examples.md +37 -0
  56. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/references/platform-posting-times.md +193 -0
  57. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0005-ideation/SKILL.md +42 -0
  58. 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
  59. 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
  60. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0010-product/SKILL.md +106 -0
  61. 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
  62. 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
  63. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/SKILL.md +60 -0
  64. 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
  65. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/scripts/generate_html.py +1287 -0
  66. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/scripts/generate_report.py +189 -0
  67. 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
  68. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/SKILL.md +36 -0
  69. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates/README.md +10 -0
  70. 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
  71. 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
  72. 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
  73. 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
  74. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0050-design/SKILL.md +55 -0
  75. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0060-assets/SKILL.md +29 -0
  76. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package/SKILL.md +42 -0
  77. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package/scripts/validate_shots.py +207 -0
  78. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package/shots.schema.json +186 -0
  79. 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
  80. 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
  81. 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
  82. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0080-factory/SKILL.md +58 -0
  83. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-comic-kit/SKILL.md +424 -0
  84. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-comic-kit/evals.md +41 -0
  85. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-flow/CONTRACT.md +123 -0
  86. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-flow/SKILL.md +81 -0
  87. 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
  88. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/SKILL.md +78 -0
  89. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/agents/openai.yaml +4 -0
  90. 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
  91. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/AudioTracks.tsx +20 -0
  92. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/CaptionLayer.tsx +18 -0
  93. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/CueTimeline.ts +24 -0
  94. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/KnowledgeTownComposition.tsx +21 -0
  95. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/references/cinematic-direction.md +73 -0
  96. 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
  97. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/references/style-guide.md +43 -0
  98. 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
  99. 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
  100. 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
  101. package/templates/ai-tools/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-first/SKILL.md +176 -0
  102. 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
package/src/sync.js CHANGED
@@ -1,6 +1,11 @@
1
1
  import fs from 'fs-extra'
2
2
  import path from 'path'
3
- import { groupMultiselect, isCancel, select } from '@clack/prompts'
3
+ import { isCancel } from '@clack/prompts'
4
+ import {
5
+ SEARCH_PLACEHOLDER,
6
+ searchableMultiselect,
7
+ searchableSelect,
8
+ } from './searchable-select.js'
4
9
  import { chalk, DEFAULT_TEMPLATE_REPO_URL, getDwyHomeDir, runGit } from './utils.js'
5
10
 
6
11
  const CATEGORIES = [
@@ -208,44 +213,42 @@ export async function scanExisting(projectTargetDir, typePlural) {
208
213
  return new Set(entries.filter(name => name !== '.gitkeep' && name !== '.DS_Store'))
209
214
  }
210
215
 
211
- function buildGroupedOptions(items) {
212
- const groups = new Map()
213
- for (const item of items) {
214
- const category = item.category || '其他'
215
- const options = groups.get(category) || []
216
- const hint = item.description
217
- ? item.description.length > 72
218
- ? `${item.description.slice(0, 72)}...`
219
- : item.description
220
- : undefined
221
-
222
- options.push({
223
- value: item.name,
224
- label: hint ? `${item.name}(${hint})` : item.name,
216
+ /**
217
+ * 将扫描项转为可搜索扁平 options。
218
+ * label 带分类前缀便于筛选;完整 description 进底部公共说明区(不截断塞 hint)。
219
+ *
220
+ * @param {Array<{ name: string, category?: string, description?: string }>} items
221
+ * @returns {Array<{ value: string, label: string, description?: string }>}
222
+ */
223
+ function buildSearchableOptions(items) {
224
+ return items
225
+ .slice()
226
+ .sort((a, b) => {
227
+ const catCmp = (a.category || '其他').localeCompare(b.category || '其他', 'zh')
228
+ if (catCmp !== 0) return catCmp
229
+ return a.name.localeCompare(b.name, 'zh')
230
+ })
231
+ .map(item => {
232
+ const category = item.category || '其他'
233
+ return {
234
+ value: item.name,
235
+ label: `${category} / ${item.name}`,
236
+ // 完整描述给底部公共区;搜索也匹配 description
237
+ description: item.description || undefined,
238
+ }
225
239
  })
226
- groups.set(category, options)
227
- }
228
-
229
- return Object.fromEntries(
230
- [...groups.entries()]
231
- .sort(([a], [b]) => a.localeCompare(b, 'zh'))
232
- .map(([category, options]) => [
233
- category,
234
- options.sort((a, b) => a.label.localeCompare(b.label, 'zh')),
235
- ]),
236
- )
237
240
  }
238
241
 
239
242
  async function promptSelection(items, label, defaultNames) {
240
243
  if (items.length === 0) return []
241
- const selectedNames = await groupMultiselect({
244
+ // 可搜索多选 + 底部说明区(聚焦项描述不跟在行尾)
245
+ const selectedNames = await searchableMultiselect({
242
246
  message: `选择 ${label}`,
243
- options: buildGroupedOptions(items),
247
+ options: buildSearchableOptions(items),
244
248
  initialValues: [...defaultNames],
245
249
  maxItems: 15,
246
250
  required: false,
247
- groupSpacing: 1,
248
- selectableGroups: true,
251
+ placeholder: SEARCH_PLACEHOLDER,
249
252
  })
250
253
  if (isCancel(selectedNames)) return null
251
254
  const selectedSet = new Set(selectedNames)
@@ -254,26 +257,37 @@ async function promptSelection(items, label, defaultNames) {
254
257
 
255
258
  /**
256
259
  * 交互式选择:每步可回退到上一步,最后总览支持任意类别重选。
260
+ * categories 可缩成仅 Skills,未出现的类别返回空数组(调用方不得据此删除已有项)。
257
261
  * 返回 { skills, rules, commands, hooks } 或 null(取消)。
262
+ *
263
+ * @param {object} scans
264
+ * @param {object} existing
265
+ * @param {{ categories?: Array<{ key: string, label: string }> }} [opts]
258
266
  */
259
- export async function interactiveSelect(scans, existing) {
260
- const sel = {}
267
+ export async function interactiveSelect(scans, existing, { categories = CATEGORIES } = {}) {
268
+ const sel = {
269
+ skills: [],
270
+ rules: [],
271
+ commands: [],
272
+ hooks: [],
273
+ }
261
274
 
262
275
  // 第一轮:顺序遍历,每步给导航
263
276
  let i = 0
264
- while (i < CATEGORIES.length) {
265
- const { key, label } = CATEGORIES[i]
266
- const defaultNames = sel[key]
277
+ while (i < categories.length) {
278
+ const { key, label } = categories[i]
279
+ const defaultNames = sel[key]?.length
267
280
  ? new Set(sel[key].map(x => x.name))
268
281
  : existing[key]
269
282
  sel[key] = await promptSelection(scans[key], label, defaultNames)
270
283
  if (sel[key] === null) return null
271
284
 
272
- if (i === CATEGORIES.length - 1) break
285
+ if (i === categories.length - 1) break
273
286
 
274
- const nextLabel = CATEGORIES[i + 1].label
275
- const prevLabel = i > 0 ? CATEGORIES[i - 1].label : null
276
- const nav = await select({
287
+ const nextLabel = categories[i + 1].label
288
+ const prevLabel = i > 0 ? categories[i - 1].label : null
289
+ // 导航步可搜索单选(选项少,交互与多选一致)
290
+ const nav = await searchableSelect({
277
291
  message: `${label} 已选 ${sel[key].length} 项。下一步:`,
278
292
  options: [
279
293
  { label: `继续选 ${nextLabel}`, value: 'next' },
@@ -281,6 +295,7 @@ export async function interactiveSelect(scans, existing) {
281
295
  { label: '取消同步', value: 'cancel' },
282
296
  ],
283
297
  initialValue: 'next',
298
+ placeholder: SEARCH_PLACEHOLDER,
284
299
  })
285
300
  if (isCancel(nav) || nav === 'cancel') return null
286
301
  i = nav === 'back' ? i - 1 : i + 1
@@ -289,21 +304,22 @@ export async function interactiveSelect(scans, existing) {
289
304
  // 第二轮:总览 + 任意重选
290
305
  while (true) {
291
306
  console.log(chalk.gray('\n选择汇总:'))
292
- for (const { key, label } of CATEGORIES) {
307
+ for (const { key, label } of categories) {
293
308
  console.log(chalk.gray(` ${label.padEnd(10)} ${sel[key].length} 项`))
294
309
  }
295
- const final = await select({
310
+ const final = await searchableSelect({
296
311
  message: '确认提交还是重选?',
297
312
  options: [
298
313
  { label: '确认提交', value: 'confirm' },
299
- ...CATEGORIES.map(c => ({ label: `重选 ${c.label}`, value: c.key })),
314
+ ...categories.map(c => ({ label: `重选 ${c.label}`, value: c.key })),
300
315
  { label: '取消同步', value: 'cancel' },
301
316
  ],
302
317
  initialValue: 'confirm',
318
+ placeholder: SEARCH_PLACEHOLDER,
303
319
  })
304
320
  if (isCancel(final) || final === 'cancel') return null
305
321
  if (final === 'confirm') return sel
306
- const cat = CATEGORIES.find(c => c.key === final)
322
+ const cat = categories.find(c => c.key === final)
307
323
  sel[final] = await promptSelection(scans[final], cat.label, new Set(sel[final].map(x => x.name)))
308
324
  if (sel[final] === null) return null
309
325
  }
@@ -0,0 +1,210 @@
1
+ # ai-tools 内部版本
2
+
3
+ 本目录(`dwy-cli/templates/ai-tools`)rules / skills / hooks / commands / CLAUDE.md 等模板资产的**内部版本**,与 `create-dwy` npm 版本**解耦**。
4
+
5
+ - 当前版本:见同目录 `VERSION`(单一事实源)
6
+ - 用途:模板变更可追溯;发 `create-dwy` 时可对照本 CHANGELOG 摘发布说明;本地/多仓对照「模板包」新旧
7
+
8
+ ## 维护约定(强制)
9
+
10
+ **每次**修改本目录下任意内容(含新增 / 删除 / 重命名)时,同一变更必须:
11
+
12
+ 1. 按下方规则 bump `VERSION`
13
+ 2. 在本文件**顶部**(当前版本段之上)追加新版本段
14
+ 3. 条目写清路径与行为变化,不写空话
15
+
16
+ 禁止:改了模板却不 bump、不写 CHANGELOG。
17
+
18
+ ### 版本号(SemVer,0.x 阶段)
19
+
20
+ | 级别 | 何时 |
21
+ | ---- | ---- |
22
+ | **MAJOR**(`x.0.0`) | 破坏性:同步目录结构变更、托管块语义不兼容、删除已被广泛依赖的 skill/rule 且无迁移说明 |
23
+ | **MINOR**(`0.y.0`) | 新增 skill / rule / hook / command;既有规范**新增强制约束**或大段能力 |
24
+ | **PATCH**(`0.y.z`) | 文案修正、正反例补充、链接修复、不改变强制语义的小改 |
25
+
26
+ 0.x 阶段允许不稳定;仍用 minor / patch 区分「新增能力」与「修正」。
27
+
28
+ ### 版本段格式
29
+
30
+ ```markdown
31
+ ## x.y.z — YYYY-MM-DD
32
+
33
+ ### Added
34
+ - …
35
+
36
+ ### Changed
37
+ - …
38
+
39
+ ### Fixed
40
+ - …
41
+
42
+ ### Removed
43
+ - …
44
+ ```
45
+
46
+ 无某类变更可省略对应小节。日期用实际合并/提交日(`YYYY-MM-DD`)。
47
+
48
+ ### 与 create-dwy 的关系
49
+
50
+ - 改本目录 ≠ 自动发 npm;发布 `create-dwy` 时另走 CLI 发版流程,并在 `dwy-cli/CHANGELOG.md` 摘要用户可感变化
51
+ - 本文件是模板侧明细;CLI CHANGELOG 可只写要点并指向 ai-tools 版本号(如 `ai-tools 0.1.0`)
52
+
53
+ ---
54
+
55
+ ## 0.10.0 — 2026-08-13
56
+
57
+ ### Added
58
+
59
+ - `skills/自媒体/dwy-doubao-tts`:豆包声音复刻 2.0 口播配音
60
+ - 脚本随 skill 同步,不放 `~/.grok/skills`
61
+ - API Key / 音色 ID 只读用户全局 `~/.dwy/config.yaml` 的 `doubao_tts`,禁止写入仓库
62
+
63
+ ---
64
+
65
+ ## 0.9.0 — 2026-08-11
66
+
67
+ ### Changed
68
+
69
+ - **0010 合并竞品 + 演讲地图**:删除分步 `uc-media-0010-topic` / `uc-media-0020-product`
70
+ - 新单一 skill `uc-media-0010-product`:竞品/差异化后 **AI 强制自动填写** 讲/不讲/内容柱/时长
71
+ - 主文档 `0010-product/产品卡-*.md`(§1 竞品 · §2 洞察 · §3 AI 地图)
72
+ - 内容轨:`主题 → 0010 → 0030 按地图扩事实 → 0040`(无 0020 步)
73
+ - flow / CONTRACT / 清单 v7 / 0005 / 0030 / 0040 / README 对齐
74
+
75
+ ---
76
+
77
+ ## 0.8.0 — 2026-08-11
78
+
79
+ ### Changed
80
+
81
+ - **内容轨因果修正**:`主题 → 0010 竞品 → 0020 演讲地图 → 0030 按地图扩事实 → 0040 蒸馏`
82
+ - skill 重命名:`uc-media-0010-topic`(竞品)、`uc-media-0020-product`(产品卡/地图)
83
+ - 目录:`0010-topic/竞品-*.md`、`0020-product/产品卡-*.md`
84
+ - 0030/0040/0005/flow/CONTRACT/README 全量对齐;清单 version 6
85
+ - 兼容:旧先产品后竞品、旧路径映射表
86
+
87
+ ---
88
+
89
+ ## 0.7.0 — 2026-08-11
90
+
91
+ ### Changed
92
+
93
+ - **流程优化(P0/P1)**
94
+ - `uc-media-0005-ideation`:候选强制 `seed_links`;人选带入 0020
95
+ - `uc-media-0020-topic`:先消化 seed 再补检;「不做」回写池 `rejected`;正文称竞品包
96
+ - `uc-media-flow` / `CONTRACT`:fast 下 **0050 确认后连跑 0060→0070**;硬停收敛;风格 skill 挂载表
97
+ - `uc-media-0050-design`:可选跨集 `design-defaults.md`,本集只写增量
98
+ - `media-platform-packaging`:登记为可选 **0090 packaging**
99
+ - 执行清单 **version 5**;README 总览流程图
100
+
101
+ ---
102
+
103
+ ## 0.6.0 — 2026-08-11
104
+
105
+ ### Added
106
+
107
+ - `skills/自媒体/uc-media-0005-ideation/`:选题发现 skill
108
+ - 硬依赖频道档案;多 agent(B站 / YouTube / 短视频 / 可选社区)搜集受众兴趣主题
109
+ - 跨集真源 `.dwy/uc-media/topic-backlog.md`;可选本集快照 `0005-ideation/选题池-*.md`
110
+ - **人选定**后进 0010;禁止自动代选;支持「刷新选题」force
111
+ - 模板:`topic-backlog.template.md` · `选题池.template.md`
112
+
113
+ ### Changed
114
+
115
+ - `skills/自媒体/uc-media-flow/CONTRACT.md` · `SKILL.md` · `执行清单.template.md`(version 4):接入 stage `ideation`、PATHS `topic_backlog`、硬停「0005 人选」
116
+ - `skills/自媒体/uc-media-0010-product/`:无主题优先导向 0005;主题可来自选题池 `picked`
117
+ - `skills/自媒体/uc-media-0020-topic/`:明确为单题竞品,选题发现归 0005
118
+ - `skills/自媒体/README.md`:登记 0005 与 `topic-backlog.md`
119
+
120
+ ---
121
+
122
+ ## 0.5.0 — 2026-08-11
123
+
124
+ ### Added
125
+
126
+ - `skills/自媒体/uc-media-0010-product/templates/channel-profile.template.md`:频道定位·受众·默认分发跨集模板
127
+ - `skills/自媒体/uc-media-0010-product/templates/产品卡.template.md`:本集产品卡模板(§0 只读引用频道档案)
128
+
129
+ ### Changed
130
+
131
+ - `skills/自媒体/uc-media-0010-product/SKILL.md`:拆分双真源——频道档案写 `<project_root>/.dwy/uc-media/channel-profile.md`(有则复用),本集产品卡只写主题·讲/不讲·分块时长;支持「更新频道定位 / 重写受众」强制刷新
132
+ - `skills/自媒体/uc-media-flow/CONTRACT.md` · `SKILL.md` · `执行清单.template.md`:频道闸门、PATHS `channel_profile`、进度表 channel 行
133
+ - `skills/自媒体/uc-media-0020-topic/` · `uc-media-0040-script/` · `uc-media-0050-design/`:上游必读频道档案;受众/语气/气质不再从本集卡重生成
134
+ - `skills/自媒体/README.md`:目录结构补充 `.dwy/uc-media/`
135
+
136
+ ---
137
+
138
+ ## 0.4.2 — 2026-08-10
139
+
140
+ ### Added
141
+
142
+ - `skills/自媒体/media-platform-packaging/assets/cover-style-master-v1.png`:封面视觉母版(style reference)
143
+
144
+ ### Changed
145
+
146
+ - `skills/自媒体/media-platform-packaging/SKILL.md`:固定视觉母版约束 + 提示词骨架强制引用该母版;生成后 25% 缩放可读性检查
147
+
148
+ ---
149
+
150
+ ## 0.4.1 — 2026-08-10
151
+
152
+ ### Changed
153
+
154
+ - `skills/自媒体/media-platform-packaging/`:同步源仓更新
155
+ - 平台表拆分 B站 / YouTube:B站用 `#标签`,YouTube 标签字段用英文逗号分隔关键词
156
+ - `references/platform-copy-examples.md` 增补 YouTube 标签格式示例
157
+
158
+ ---
159
+
160
+ ## 0.4.0 — 2026-08-10
161
+
162
+ ### Added
163
+
164
+ - `skills/自媒体/media-platform-packaging/`:多平台自媒体包装与封面(源:`xiaoyuan-knowledge-town/.agents/skills/media-platform-packaging`)
165
+ - B站 / 抖音 / 小红书 / 微信视频号标题、简介、标签规则
166
+ - 16:9、4:3、3:4 封面版式与生图流程(依赖 `imagegen`)
167
+ - `references/platform-copy-examples.md`:标题长度与封面文字优先级示例
168
+ - 产出约定写入 `media/0070-package/` 包装清单
169
+
170
+ ### Changed
171
+
172
+ - `skills/自媒体/README.md`:Skills 表登记 `media-platform-packaging`
173
+
174
+ ---
175
+
176
+ ## 0.3.0 — 2026-08-07
177
+
178
+ ### Added
179
+
180
+ - 新分类 `skills/自媒体/`:迁入短视频 / 科普自媒体全流程 skills(源:`xiaoyuan-knowledge-town/function-tools/skills`)
181
+ - **编排**:`uc-media-flow`(CONTRACT + 执行清单模板,`fast`/`standard`)
182
+ - **流水线**:`uc-media-0010-product` → `0020-topic` → `0030-facts` → `0040-script` → `0050-design` → `0060-assets` → `0070-package` → `0080-factory`
183
+ - **扩展**:`uc-media-comic-kit`(漫画科普表达)、`uc-media-knowledge-town`(知识小城视觉 / Remotion 预设)
184
+ - 含 scripts(facts HTML、shots 校验、cue timeline)、templates、schema、Remotion 组件资产
185
+ - 硬编路径 `templates/skills/…` 改为 skill 包相对路径,适配 `dwy` sync 后 `.claude/skills/` / `.agents/skills/`
186
+
187
+ ---
188
+
189
+ ## 0.2.0 — 2026-07-23
190
+
191
+ ### Added
192
+
193
+ - `skills/运维发布/dwy-deploy-first/`:通用「首次部署」skill(分章)
194
+ - 第 1 章:镜像源强制配置 — apt → 阿里云;uv/pip → 阿里云 PyPI
195
+ - 禁止默认 `astral.sh/uv/install.sh`;与 `dwy-mirror-source`(本机工具源)、`dwy-docker`(工程规范)边界划清
196
+ - `references/chapter-01-mirrors.md`:通用 Dockerfile 片段(Debian/Ubuntu/Alpine + uv/pip)
197
+
198
+ ---
199
+
200
+ ## 0.1.0 — 2026-07-20
201
+
202
+ ### Added
203
+
204
+ - 建立 ai-tools 内部版本:`VERSION` + 本 `CHANGELOG.md` 及维护约定
205
+ - `skills/元工具/dwy-shared/SKILL.md`:入库流程增加步骤 6.5,改模板必须同批 bump `VERSION` + `CHANGELOG.md`
206
+ - `rules/Android/dwy-android-core.md`:新增「数据实体类封装(强制)」
207
+ - **Java**:字段 `private`,提供 `getXxx`/`setXxx` 与 `toString`;禁止 public 实例字段
208
+ - **Kotlin**:优先 `data class` + `val`(自带 `toString`);禁止 `@JvmField`;非 data class 必须手写 `toString`
209
+ - 不强制 `equals`/`hashCode`
210
+ - 联动 §2.6 注释、§八反模式、§九自检项 #22
@@ -0,0 +1 @@
1
+ 0.10.0
@@ -12,5 +12,12 @@
12
12
  "matcher": "Bash",
13
13
  "platforms": ["claude", "codex"],
14
14
  "timeout": 30
15
+ },
16
+ {
17
+ "name": "pre-git-commit-ai-signature-check.sh",
18
+ "event": "PreToolUse",
19
+ "matcher": "Bash",
20
+ "platforms": ["claude", "codex"],
21
+ "timeout": 30
15
22
  }
16
23
  ]
@@ -0,0 +1,57 @@
1
+ #!/bin/bash
2
+ # Claude Code PreToolUse Hook
3
+ # 拦截 git commit message 中的 AI 署名 / 生成声明
4
+ #
5
+ # 背景:AI agent 常在 commit message 中附加 Co-Authored-By: Claude / Generated with Claude Code 等署名。
6
+ # 本 hook 检出此类模式后硬拦截(exit 2),要求人工确认或清理后再提交。
7
+ #
8
+ # 覆盖模式(不区分大小写):
9
+ # Co-Authored-By: <ai-name> <noreply@...>
10
+ # Generated with Claude Code
11
+ # Generated with ...
12
+ # noreply@anthropic.com / noreply@openai.com
13
+ # Claude / ChatGPT / GPT / Copilot / Cursor / AI / LLM (在签名行上下文)
14
+
15
+ # 从 stdin 读 JSON 取待执行命令(Claude Code 与 Codex 同样通过 stdin 传 .tool_input.command)
16
+ CMD=$(python3 -c 'import sys,json; print(json.load(sys.stdin).get("tool_input",{}).get("command",""))')
17
+
18
+ # 只在含 git commit 的命令上检查
19
+ printf '%s' "$CMD" | grep -q 'git commit' || exit 0
20
+
21
+ # AI 署名匹配模式
22
+ AI_PATTERNS=(
23
+ # Co-Authored-By trailer(任意 AI 名称 + 含 < 的邮箱)
24
+ "Co-Authored-By:"
25
+ # 生成声明
26
+ "Generated with"
27
+ # 常见 AI 署名邮箱
28
+ "noreply@anthropic\.com"
29
+ "noreply@openai\.com"
30
+ # AI 产品名(在签名行上下文,前面有 Co-Authored-By 或单独出现在行尾)
31
+ "Co-Authored-By:.*[Cc]laude"
32
+ "Co-Authored-By:.*[Cc]hatGPT"
33
+ "Co-Authored-By:.*GPT"
34
+ "Co-Authored-By:.*[Cc]opilot"
35
+ "Co-Authored-By:.*[Cc]ursor"
36
+ )
37
+
38
+ REGEX=$(IFS='|'; echo "${AI_PATTERNS[*]}")
39
+
40
+ HIT=$(printf '%s' "$CMD" | grep -inE "$REGEX" 2>/dev/null)
41
+
42
+ if [ -n "$HIT" ]; then
43
+ echo "========================================"
44
+ echo " WARNING: AI 署名 detected"
45
+ echo "========================================"
46
+ echo ""
47
+ echo "$HIT"
48
+ echo ""
49
+ echo "commit message 中禁止出现 Co-Authored-By / Generated with 等 AI 署名。"
50
+ echo "请清理 AI 署名后再提交。"
51
+ echo ""
52
+ echo "如果要强制提交,请手动执行 git commit(绕过 hook)。"
53
+ echo "========================================"
54
+ exit 2 # 暂停等待人工审批
55
+ fi
56
+
57
+ exit 0