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
package/src/sync.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import fs from 'fs-extra'
|
|
2
2
|
import path from 'path'
|
|
3
|
-
import {
|
|
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
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
|
|
244
|
+
// 可搜索多选 + 底部说明区(聚焦项描述不跟在行尾)
|
|
245
|
+
const selectedNames = await searchableMultiselect({
|
|
242
246
|
message: `选择 ${label}`,
|
|
243
|
-
options:
|
|
247
|
+
options: buildSearchableOptions(items),
|
|
244
248
|
initialValues: [...defaultNames],
|
|
245
249
|
maxItems: 15,
|
|
246
250
|
required: false,
|
|
247
|
-
|
|
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 <
|
|
265
|
-
const { key, label } =
|
|
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 ===
|
|
285
|
+
if (i === categories.length - 1) break
|
|
273
286
|
|
|
274
|
-
const nextLabel =
|
|
275
|
-
const prevLabel = i > 0 ?
|
|
276
|
-
|
|
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
|
|
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
|
|
310
|
+
const final = await searchableSelect({
|
|
296
311
|
message: '确认提交还是重选?',
|
|
297
312
|
options: [
|
|
298
313
|
{ label: '确认提交', value: 'confirm' },
|
|
299
|
-
...
|
|
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 =
|
|
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
|
|
@@ -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
|