create-dwy 0.27.0 → 0.28.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 (41) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/package.json +1 -1
  3. package/src/cli-help.js +11 -13
  4. package/src/sync-all.js +45 -25
  5. package/templates/ai-tools/CHANGELOG.md +6 -0
  6. package/templates/ai-tools/VERSION +1 -1
  7. package/templates/ai-tools/skills/Android/dwy-android-architecture/SKILL.md +10 -0
  8. package/templates/ai-tools/skills/Android/dwy-android-development/SKILL.md +16 -0
  9. package/templates/ai-tools/skills/Docker/dwy-docker/SKILL.md +2 -0
  10. package/templates/ai-tools/skills/Flutter/dwy-flutter-development/SKILL.md +15 -0
  11. package/templates/ai-tools/skills/HarmonyOS/dwy-harmony-development/SKILL.md +15 -0
  12. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-architecture/SKILL.md +2 -2
  13. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/SKILL.md +2 -0
  14. package/templates/ai-tools/skills//346/225/260/346/215/256/345/272/223/dwy-alembic/SKILL.md +8 -0
  15. package/templates/ai-tools/skills//346/225/260/346/215/256/345/272/223/dwy-postgres/SKILL.md +10 -0
  16. package/templates/ai-tools/skills//346/225/260/346/215/256/345/272/223/dwy-redis/SKILL.md +8 -0
  17. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-dependency-choice/SKILL.md +1 -1
  18. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-development-review/SKILL.md +2 -0
  19. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-git-commit/SKILL.md +1 -1
  20. /package/templates/ai-tools/{rules/Android → skills/Android/dwy-android-architecture/references}/dwy-android-layering.md +0 -0
  21. /package/templates/ai-tools/{rules/Android → skills/Android/dwy-android-architecture/references}/dwy-android-mvp.md +0 -0
  22. /package/templates/ai-tools/{rules/Android → skills/Android/dwy-android-development/references}/dwy-android-core.md +0 -0
  23. /package/templates/ai-tools/{rules/Android → skills/Android/dwy-android-development/references}/dwy-android-pitfalls.md +0 -0
  24. /package/templates/ai-tools/{rules/Android → skills/Android/dwy-android-development/references}/dwy-android-support-only.md +0 -0
  25. /package/templates/ai-tools/{rules/Docker → skills/Docker/dwy-docker/references}/dwy-docker.md +0 -0
  26. /package/templates/ai-tools/{rules/Flutter → skills/Flutter/dwy-flutter-development/references}/dwy-flutter-core.md +0 -0
  27. /package/templates/ai-tools/{rules/Flutter → skills/Flutter/dwy-flutter-development/references}/dwy-flutter-network.md +0 -0
  28. /package/templates/ai-tools/{rules/Flutter → skills/Flutter/dwy-flutter-development/references}/dwy-flutter-router.md +0 -0
  29. /package/templates/ai-tools/{rules/Flutter → skills/Flutter/dwy-flutter-development/references}/dwy-flutter-testing.md +0 -0
  30. /package/templates/ai-tools/{rules/HarmonyOS → skills/HarmonyOS/dwy-harmony-development/references}/dwy-arkts-strict.md +0 -0
  31. /package/templates/ai-tools/{rules/HarmonyOS → skills/HarmonyOS/dwy-harmony-development/references}/dwy-arkts-ui-build.md +0 -0
  32. /package/templates/ai-tools/{rules/HarmonyOS → skills/HarmonyOS/dwy-harmony-development/references}/dwy-arkts-ui-design.md +0 -0
  33. /package/templates/ai-tools/{rules/HarmonyOS → skills/HarmonyOS/dwy-harmony-development/references}/dwy-harmony-pitfalls.md +0 -0
  34. /package/templates/ai-tools/{rules//345/274/200/345/217/221/346/265/201/347/250/213 → skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references}/dwy-prod-branch.md" +0 -0
  35. /package/templates/ai-tools/{rules//346/225/260/346/215/256/345/272/223 → skills//346/225/260/346/215/256/345/272/223/dwy-alembic/references}/dwy-db-migration.md" +0 -0
  36. /package/templates/ai-tools/{rules//346/225/260/346/215/256/345/272/223 → skills//346/225/260/346/215/256/345/272/223/dwy-postgres/references}/dwy-postgres.md" +0 -0
  37. /package/templates/ai-tools/{rules//346/225/260/346/215/256/345/272/223 → skills//346/225/260/346/215/256/345/272/223/dwy-redis/references}/dwy-redis.md" +0 -0
  38. /package/templates/ai-tools/{rules//345/274/200/345/217/221/346/265/201/347/250/213 → skills//351/200/232/347/224/250/dwy-dependency-choice/references}/dwy-dependency-freshness.md" +0 -0
  39. /package/templates/ai-tools/{rules//345/274/200/345/217/221/346/265/201/347/250/213 → skills//351/200/232/347/224/250/dwy-dependency-choice/references}/dwy-oss-commercial-license.md" +0 -0
  40. /package/templates/ai-tools/{rules//345/274/200/345/217/221/346/265/201/347/250/213 → skills//351/200/232/347/224/250/dwy-development-review/references}/dwy-code-craft.md" +0 -0
  41. /package/templates/ai-tools/{rules//345/274/200/345/217/221/346/265/201/347/250/213 → skills//351/200/232/347/224/250/dwy-git-commit/references}/dwy-git-commit.md" +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # create-dwy
2
2
 
3
+ ## [0.28.1] - 2026-11-08
4
+
5
+ ### Changed
6
+
7
+ - 项目同步在确认后清理可识别的旧 Rules 托管内容,不再因旧规则自动勾选替代 Skills;个人内容和无法确认归属的文件继续保留。
8
+
9
+ ---
10
+
11
+ ## [0.28.0] - 2026-11-08
12
+
13
+ ### Changed
14
+
15
+ - 将 Android、Flutter、HarmonyOS、数据库、Docker 和开发流程的剩余 Rules 迁移到按需安装的 Skills;补充旧项目的安全迁移与选择。
16
+ - 同步交互不再分发或选择 Rules;Claude Code、Codex 和 OpenCode 保持支持,原 Cursor 配置保留且不再提供同步入口。
17
+ - 模板详情见 ai-tools 0.35.0。
18
+
19
+ ---
20
+
3
21
  ## [0.27.0] - 2026-11-07
4
22
 
5
23
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-dwy",
3
- "version": "0.27.0",
3
+ "version": "0.28.1",
4
4
  "description": "项目脚手架与多平台 AI 配置同步工具",
5
5
  "type": "module",
6
6
  "bin": {
package/src/cli-help.js CHANGED
@@ -25,24 +25,23 @@ export function buildHelpText(version) {
25
25
  '同步步骤:',
26
26
  ' 1. 选择同步范围:当前项目或全局。',
27
27
  ' 2. 选择 Skills。',
28
- ' 3. 仅项目范围选择 Rules;全局跳过。',
29
- ' 4. 选择 AGENTS.md 通用规范,默认启用。',
30
- ' 5. 选择 Hooks,默认启用。',
28
+ ' 3. 选择 AGENTS.md 通用规范,默认启用。',
29
+ ' 4. 选择 Hooks,默认启用。',
31
30
  ' 项目已有有效全局规范或全部所需全局 Hooks 时,跳过对应操作页。',
32
- ' 6. 最后选择 CLI;首次只选 Codex,后续恢复当前范围同步过的 CLI 与有效旧托管入口。',
33
- ' 7. 按最终 CLI 重新核算覆盖,预览实际写入、迁移、备份和清理清单。',
34
- ' 8. 确认后执行,显示实际完成信息;取消不改同步目标。',
31
+ ' 5. 最后选择 CLI;首次只选 Codex,后续恢复当前范围同步过的 CLI 与有效旧托管入口。',
32
+ ' 6. 按最终 CLI 重新核算覆盖,预览实际写入、迁移、备份和清理清单。',
33
+ ' 7. 确认后执行,显示实际完成信息;取消不改同步目标。',
35
34
  ' Commands 不参与同步。',
36
35
  '',
37
36
  '交互按键:',
38
- ' Skills / Rules:←/→ 切分类,↑/↓ 移动,Space 勾选,a 全选/清空当前分类。',
37
+ ' Skills:←/→ 切分类,↑/↓ 移动,Space 勾选,a 全选/清空当前分类。',
39
38
  ' 范围 / 通用规范 / Hooks / CLI:↑/↓ 移动;CLI 用 Space 勾选,可输入关键字筛选。',
40
39
  ' Enter 确认当前步骤,Esc 或 Ctrl+C 取消。',
41
40
  '',
42
41
  '常见用法:',
43
42
  ' 同步当前项目:cd your-project 后执行 dwy,选择「当前项目」。',
44
43
  ' 同步全局:执行 dwy,选择「全局」。',
45
- ' 移除配置:在当前范围取消 Skills / Rules 勾选,或关闭 Hooks / 通用规范,再确认。',
44
+ ' 移除配置:在当前范围取消 Skills 勾选,或关闭 Hooks / 通用规范,再确认。',
46
45
  ' 更新或调整配置:再次执行 dwy sync,检查勾选项,再确认同步。',
47
46
  ' 更新 CLI:dwy upgrade(全局安装时可用;更新后执行 dwy --version 查看版本)。',
48
47
  ' 迁移老项目:cd your-project 后执行 dwy migrate,无需重新勾选。',
@@ -50,10 +49,9 @@ export function buildHelpText(version) {
50
49
  ' 首次安装:npm install -g create-dwy@latest',
51
50
  '',
52
51
  '平台支持:',
53
- ' Claude Code:全局 ~/.claude/CLAUDE.md;项目 Rules 使用根 AGENTS.md。',
52
+ ' Claude Code:全局 ~/.claude/CLAUDE.md;项目可使用根 AGENTS.md。',
54
53
  ' Codex:全局 $CODEX_HOME/AGENTS.md(默认 ~/.codex/AGENTS.md);项目根 AGENTS.md。',
55
54
  ' OpenCode:全局 ~/.config/opencode/AGENTS.md;项目根 AGENTS.md;当前不支持 Hooks。',
56
- ' Cursor:仅项目 Rules;全局规则在 Cursor 设置中管理。',
57
55
  '',
58
56
  '同步按当前范围和最终 CLI 执行;项目 AGENTS.md 由多个 CLI 共享。',
59
57
  '用户主目录不能作为项目范围同步,请选择全局或进入项目目录。',
@@ -64,8 +62,8 @@ export function buildHelpText(version) {
64
62
  'Hooks 与 Skills 独立;整组管理,项目仅安装缺少有效全局注册的 Hooks。',
65
63
  '全局 Hook 的脚本与对应事件、matcher、完整命令注册均有效时,项目禁止重复安装。',
66
64
  '任一适用 CLI 已有 dwy 全局通用规范时,项目继承并清理重复基线;其他 CLI 缺失的全局规范另选全局范围补齐。',
67
- '手写 AGENTS.md 本身不算全局已安装;通用规范与 Rules 共用文件但独立管理。',
68
- '移除通用规范仅删除基线块;项目 Rules 独立管理,保留手写内容。',
65
+ '手写 AGENTS.md 本身不算全局已安装;通用规范仅管理其托管块,保留手写内容。',
66
+ '旧托管 Rules 确认后清理,Skills 自行选择;无法确认归属的内容保留。',
69
67
  '全局启用会明确列出当前项目重复项清理;全局移除不会自动向项目补装。',
70
68
  '项目同步只清理项目重复入口,不改写有效全局提供者;真实目录先备份。',
71
69
  '确认前不改项目/全局配置或已安装共享内容;确认后才同步配置,并刷新所选共享 Skills。',
@@ -74,7 +72,7 @@ export function buildHelpText(version) {
74
72
  '产品流程缺失的外部依赖也列入清单,确认后联网补齐,已有内容保留。',
75
73
  '旧真实目录备份到同步根的 .dwy/skill-backups;个人 Skills、Rules、Hooks 不参与 migrate。',
76
74
  '旧项目首次需执行 dwy migrate;迁移后无需逐项目刷新 Skills。',
77
- 'Rules / Hooks 的模板更新仍需执行 dwy sync;已有会话缓存的 Skill 可能需要重新加载。',
75
+ 'Hooks 的模板更新仍需执行 dwy sync;已有会话缓存的 Skill 可能需要重新加载。',
78
76
  '',
79
77
  '模板更新:',
80
78
  ' 模板随 CLI 包分发,启动不联网检查模板。',
package/src/sync-all.js CHANGED
@@ -15,10 +15,9 @@ import { buildSyncPlan, contentOptions, projectSkillChoices, PLATFORM_LABELS, PL
15
15
  import { assertConfigPath, baselineProviders, globalBaselinePath, globalHookNames, hasManagedHookConfig } from './sync-inheritance.js'
16
16
 
17
17
  const PLATFORM_OPTIONS = [
18
- { value: 'claude', label: 'Claude Code', description: '支持 Skills、项目 Rules、Hooks 和全局通用规范' },
19
- { value: 'codex', label: 'Codex', description: '支持 Skills、项目 Rules、Hooks 和全局通用规范' },
20
- { value: 'opencode', label: 'OpenCode', description: '支持 Skills、项目 Rules 和全局通用规范;不支持 Hooks' },
21
- { value: 'cursor', label: 'Cursor', description: '只支持项目 Rules' },
18
+ { value: 'claude', label: 'Claude Code', description: '支持 Skills、Hooks 和全局通用规范' },
19
+ { value: 'codex', label: 'Codex', description: '支持 Skills、Hooks 和全局通用规范' },
20
+ { value: 'opencode', label: 'OpenCode', description: '支持 Skills 和全局通用规范;不支持 Hooks' },
22
21
  ]
23
22
  const SYNC_STATE_PATH = ['.dwy', 'sync-state.json']
24
23
  /** 按显式选中的内容同步;保留已有脚本的模式标识。 */
@@ -96,7 +95,7 @@ async function selectPlatforms(root, scope, initialValues) {
96
95
  options: PLATFORM_OPTIONS.filter(option => scope === 'project' || option.value !== 'cursor')
97
96
  .map(option => ({ ...option, description: [state.platforms[option.value] ? '已有同步记录,将核对并修复本地配置' : '',
98
97
  contentOptions(scope, [option.value]).map(item => item.label).join('、')].filter(Boolean).join(';') })),
99
- initialValues,
98
+ initialValues: initialValues.filter(platform => PLATFORM_OPTIONS.some(option => option.value === platform)),
100
99
  required: true, maxItems: 6, placeholder: SEARCH_PLACEHOLDER,
101
100
  })
102
101
  return isCancel(result) ? null : result
@@ -159,11 +158,28 @@ const RULE_SKILL_MIGRATIONS = {
159
158
  'dwy-apple-layering.md': ['dwy-apple-architecture'],
160
159
  'dwy-ios-layout-adaptation.md': ['dwy-ios-development'],
161
160
  'dwy-ios-pitfalls.md': ['dwy-ios-development'],
162
- }
163
-
164
- /** 将旧托管规则映射为可选的对应技能,保留用户最终选择。 */
165
- export function migratedRuleSkills(names) {
166
- return new Set([...names].flatMap(name => RULE_SKILL_MIGRATIONS[name] || []))
161
+ 'dwy-android-core.md': ['dwy-android-development'],
162
+ 'dwy-android-pitfalls.md': ['dwy-android-development'],
163
+ 'dwy-android-support-only.md': ['dwy-android-development'],
164
+ 'dwy-android-layering.md': ['dwy-android-architecture'],
165
+ 'dwy-android-mvp.md': ['dwy-android-architecture'],
166
+ 'dwy-flutter-core.md': ['dwy-flutter-development'],
167
+ 'dwy-flutter-network.md': ['dwy-flutter-development'],
168
+ 'dwy-flutter-router.md': ['dwy-flutter-development'],
169
+ 'dwy-flutter-testing.md': ['dwy-flutter-development'],
170
+ 'dwy-arkts-strict.md': ['dwy-harmony-development'],
171
+ 'dwy-arkts-ui-build.md': ['dwy-harmony-development'],
172
+ 'dwy-arkts-ui-design.md': ['dwy-harmony-development'],
173
+ 'dwy-harmony-pitfalls.md': ['dwy-harmony-development'],
174
+ 'dwy-postgres.md': ['dwy-postgres'],
175
+ 'dwy-redis.md': ['dwy-redis'],
176
+ 'dwy-db-migration.md': ['dwy-alembic'],
177
+ 'dwy-docker.md': ['dwy-docker'],
178
+ 'dwy-code-craft.md': ['dwy-development-review'],
179
+ 'dwy-dependency-freshness.md': ['dwy-dependency-choice'],
180
+ 'dwy-oss-commercial-license.md': ['dwy-dependency-choice'],
181
+ 'dwy-git-commit.md': ['dwy-git-commit'],
182
+ 'dwy-prod-branch.md': ['dwy-publish'],
167
183
  }
168
184
 
169
185
  function staleEntries(scans, state, existing, platforms) {
@@ -173,7 +189,8 @@ function staleEntries(scans, state, existing, platforms) {
173
189
  result[platform] = {}
174
190
  for (const type of PLATFORM_SYNC_TYPES[platform].filter(type => current[type])) {
175
191
  const historical = state.platforms[platform]?.[type] || []
176
- const knownRules = type === 'rules' && platform !== 'cursor' ? [...existing.projectRules].filter(name => RULE_SKILL_MIGRATIONS[name]) : []
192
+ const knownRules = type === 'rules' && platform !== 'cursor'
193
+ ? [...existing.projectRules].filter(name => !scans.rules.length || RULE_SKILL_MIGRATIONS[name]) : []
177
194
  result[platform][type] = [...new Set([...historical, ...knownRules])].filter(name =>
178
195
  !current[type].has(name) && existing[platform][type].has(platform === 'cursor' && type === 'rules' ? buildCursorRuleName(name) : name))
179
196
  }
@@ -186,7 +203,7 @@ function normalizeRemovals(raw) {
186
203
  Object.fromEntries(Object.entries(types).map(([type, names]) => [type, new Set(names)]))]))
187
204
  }
188
205
 
189
- /** `dwy` 和 `dwy sync` 共用范围 → Skills → 项目 Rules → 规范 → Hooks → CLI → 确认。 */
206
+ /** `dwy` 和 `dwy sync` 共用范围 → Skills → 规范 → Hooks → CLI → 确认。 */
190
207
  export async function runDwy(opts = {}) {
191
208
  console.log(chalk.bold.cyan('\ndwy') + chalk.gray(' · AI 开发工具\n'))
192
209
  const action = normalizeAction(opts.action)
@@ -275,7 +292,7 @@ export async function syncAll({
275
292
  const scope = scopeOverride || (selectedOverride || platformsOverride ? 'project' : await searchableSelect({
276
293
  message: '选择同步范围',
277
294
  options: [
278
- { value: 'project', label: '当前项目', description: '管理 Skills、Hooks、Rules 和通用规范;继承有效全局配置' },
295
+ { value: 'project', label: '当前项目', description: '管理 Skills、Hooks 和通用规范;继承有效全局配置' },
279
296
  { value: 'global', label: '全局', description: '管理 Skills、Hooks 和通用规范;清理当前项目重复入口' },
280
297
  ], initialValue: 'project',
281
298
  }))
@@ -283,6 +300,7 @@ export async function syncAll({
283
300
  if (!['project', 'global'].includes(scope)) throw new Error('无效同步范围')
284
301
  const global = scope === 'global', targetRoot = global ? homeDir : projectDir
285
302
  let platforms = platformsOverride || await buildPlatformDefaultsFromLocalState(targetRoot, scope, codexHome)
303
+ if (!platformsOverride) platforms = platforms.filter(platform => PLATFORM_OPTIONS.some(option => option.value === platform))
286
304
  if (platforms.length === 0 || platforms.some(platform => !PLATFORM_SYNC_TYPES[platform] || (global && platform === 'cursor'))) throw new Error('所选平台不支持此同步范围')
287
305
  const projectState = await loadSyncState(projectDir), globalState = await loadSyncState(homeDir)
288
306
  const targetState = global ? globalState : projectState
@@ -307,10 +325,6 @@ export async function syncAll({
307
325
  unionSets(...platforms.map(platform => platform === 'cursor' && type === 'rules' ? cursorRules : existing[platform][type]))]))
308
326
  const defaults = buildSelectionDefaultsFromSyncState(current, targetState, platforms)
309
327
  for (const type of ['skills', 'rules', 'hooks']) defaults[type] = unionSets(defaults[type], current[type])
310
- if (!global && contentTypes.includes('skills')) {
311
- const oldRules = unionSets(current.rules, ...platforms.map(platform => new Set(targetState.platforms[platform]?.rules || [])))
312
- defaults.skills = unionSets(defaults.skills, migratedRuleSkills(oldRules))
313
- }
314
328
  const choices = !global && contentTypes.includes('skills')
315
329
  ? { ...scans, skills: await projectSkillChoices(scans.skills, platforms, { homeDir, codexHome }) } : scans
316
330
  const selected = selectedOverride
@@ -362,11 +376,13 @@ export async function syncAll({
362
376
  const stale = staleEntries(scans, targetState, existing, platforms)
363
377
  const removals = normalizeRemovals(removalsOverride || stale)
364
378
  if (!removalsOverride) {
365
- const availableSkills = new Set(scans.skills.map(skill => skill.name))
366
- const selectedSkills = new Set(selected.skills.map(skill => skill.name).filter(name => availableSkills.has(name)))
367
379
  for (const platform of platforms) for (const name of removals[platform]?.rules || []) {
368
- const required = RULE_SKILL_MIGRATIONS[name]
369
- if (required && (platform === 'cursor' || !contentTypes.includes('skills') || required.some(skill => !selectedSkills.has(skill)))) {
380
+ const knownRule = RULE_SKILL_MIGRATIONS[name]
381
+ if (!knownRule && !scans.rules.length) {
382
+ removals[platform].rules.delete(name)
383
+ continue
384
+ }
385
+ if (knownRule && platform === 'cursor') {
370
386
  removals[platform].rules.delete(name)
371
387
  }
372
388
  }
@@ -375,8 +391,10 @@ export async function syncAll({
375
391
  const plan = await buildSyncPlan({
376
392
  scope, platforms, contentTypes, selected, scans, sourceDir, projectDir, homeDir, codexHome,
377
393
  projectState, globalState, staleRemovals: removals, staleEntries: stale, baseline,
378
- migratedRuleSources: Object.fromEntries(Object.entries(RULE_SKILL_MIGRATIONS).map(([name, skills]) => [name,
379
- path.join(sourceDir, 'skills', name.startsWith('dwy-python-') ? 'Python' : name.startsWith('dwy-vue-') ? 'Vue' : 'Apple', skills[0], 'references', name)])),
394
+ migratedRuleSources: Object.fromEntries(Object.entries(RULE_SKILL_MIGRATIONS).flatMap(([name, skills]) => {
395
+ const skill = scans.skills.find(item => item.name === skills[0])
396
+ return skill ? [[name, path.join(skill.sourcePath, 'references', name)]] : []
397
+ })),
380
398
  contentActions,
381
399
  refreshSkills: mainFlow,
382
400
  skillScope: normalizeSkillScope(skillScopeOverride),
@@ -397,9 +415,11 @@ export async function syncAll({
397
415
  })
398
416
  if (global && plan.projectChanged) await assertConfigPath(path.join(projectDir, ...SYNC_STATE_PATH), projectDir)
399
417
  console.log(`\n同步范围:${global ? '全局' : '当前项目'};平台:${platforms.map(p => PLATFORM_LABELS[p]).join('、')}`)
400
- console.log(`处理内容:${contentTypes.map(type => options.find(option => option.value === type).label).join('、')}`)
418
+ console.log(`处理内容:${contentTypes.map(type => type === 'rules' && !scans.rules.length ? '旧规则迁移' : options.find(option => option.value === type).label).join('、')}`)
401
419
  if (contentTypes.includes('skills')) console.log(`Skills:${selected.skills.map(item => item.name).join('、') || '无项目安装选择;已有全局入口仅去重'}`)
402
- if (contentTypes.includes('rules')) console.log(`Rules:${selected.rules.map(item => item.name).join('、') || '移除当前项目托管规则'}`)
420
+ if (contentTypes.includes('rules')) console.log(scans.rules.length
421
+ ? `Rules:${selected.rules.map(item => item.name).join('、') || '移除当前项目托管规则'}`
422
+ : '旧 Rules:清理可识别的托管项,其他内容保留;Skills 自行选择')
403
423
  if (contentTypes.includes('baseline')) console.log(`通用规范:${contentActions.baseline === 'remove' ? '显式移除' : baseline.split('\n').filter(line => /^#/.test(line)).slice(0,3).join(';')}`)
404
424
  for (const operation of plan.operations) {
405
425
  console.log(operation.label)
@@ -1,5 +1,11 @@
1
1
  # ai-tools 内部版本
2
2
 
3
+ ## 0.35.0 - 2026-11-08
4
+
5
+ - 新增 Android 开发与架构、Flutter、HarmonyOS、PostgreSQL、Redis 和 Alembic Skills,按任务加载迁移后的规范和踩坑。
6
+ - Docker、Git 提交、依赖选型、开发审查和发布 Skills 吸收原有流程资料,不再分发项目 Rules。
7
+ - 更新技术架构的 Android Skill 引用;历史项目规则仅在替代 Skills 已选中并确认后迁移,无法确认归属的旧文件保留。
8
+
3
9
  ## 0.34.0 - 2026-11-07
4
10
 
5
11
  - 新增 `skills/Python/dwy-python-*`、Python 基础包 Skills、`skills/Vue/dwy-vue-*`、管理与认证包 Skills,以及 `skills/Apple/dwy-apple-appkit`;按能力和实际版本导航,保留已发布版本接入资料。
@@ -1 +1 @@
1
- 0.34.0
1
+ 0.35.0
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: dwy-android-architecture
3
+ description: 设计、开发或评审 Android 的模块分层、依赖方向或 MVP 页面架构时使用。
4
+ ---
5
+
6
+ # Android 架构
7
+
8
+ 先检查项目实际结构、依赖方向、调用方和页面模式,不因启用本技能重建已有工程。需要模块边界时读 [分层与依赖](references/dwy-android-layering.md),项目采用 MVP 或用户明确要求时读 [MVP](references/dwy-android-mvp.md)。新项目按照团队约定和实际规模决定,现有架构及用户要求优先。
9
+
10
+ 历史资料中的 `dwy-android-core` 指 `dwy-android-development`;`dwy-android-layering` 和 `dwy-android-mvp` 指本 Skill 的对应资料。
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: dwy-android-development
3
+ description: 开发、修改或排查 Android 原生应用时使用;覆盖 Java、Kotlin、XML、系统适配及常见问题。
4
+ ---
5
+
6
+ # Android 开发
7
+
8
+ 先检查项目现有语言、SDK、Gradle、依赖与设备目标;已有项目遵循实际技术栈,不擅自替换 Support、AndroidX 或 UI 框架。需要架构设计时同时使用可用的 `dwy-android-architecture`。
9
+
10
+ - [开发规范与界面适配](references/dwy-android-core.md):按任务阅读语言、布局、资源和生命周期相关部分;其中 AndroidAutoSize 是团队特定选型,新项目也需按依赖选型规则核实,不能在未授权时自动添加。
11
+ - [Support 老项目兼容](references/dwy-android-support-only.md):仅项目实际使用 Support 时阅读。
12
+ - [常见踩坑](references/dwy-android-pitfalls.md):按工程、设备、界面或生命周期问题查阅。
13
+
14
+ 涉及 UI、系统权限或设备行为时,区分编译通过和目标设备实际验证。
15
+
16
+ 历史资料中的 `dwy-android-layering`、`dwy-android-mvp` 指 `dwy-android-architecture` 的对应参考资料,不是独立 Rule 或 Skill。
@@ -7,6 +7,8 @@ description: "Docker 工程规范检查与镜像版本管理。触发场景:
7
7
 
8
8
  涵盖镜像版本选择 + Dockerfile / docker-compose / k8s manifest 工程结构。
9
9
 
10
+ 按需阅读 [镜像、容器资源和配置变更](references/dwy-docker.md),核实项目实际容器运行方式;已有项目遵循用户要求和现有约定,不为套用示例擅自修改运行环境。
11
+
10
12
  **脚本目录:** `./scripts/`(以下简称 `{scripts}`)
11
13
 
12
14
  **参考文件:** `./references/`
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: dwy-flutter-development
3
+ description: 开发、测试或排查 Flutter 和 Dart 应用时使用,按需覆盖状态、网络、路由和界面适配。
4
+ ---
5
+
6
+ # Flutter 开发
7
+
8
+ 先核实项目 Flutter/Dart 版本、依赖和现有状态、网络与路由方案。参考资料中的 Riverpod、Dio 和 GoRouter 只适用于已使用这些库或用户明确选择的项目;不自动引入或替换依赖。
9
+
10
+ - [Dart、项目结构与界面](references/dwy-flutter-core.md)
11
+ - [网络与错误](references/dwy-flutter-network.md)
12
+ - [路由](references/dwy-flutter-router.md)
13
+ - [测试](references/dwy-flutter-testing.md)
14
+
15
+ 按任务阅读对应资料,核实真实运行平台、安全区域及必要的交互测试。
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: dwy-harmony-development
3
+ description: 开发、测试或排查 HarmonyOS ArkTS 与 ArkUI 应用时使用,覆盖工程、界面和设备问题。
4
+ ---
5
+
6
+ # HarmonyOS 开发
7
+
8
+ 先检查项目实际 SDK、API 版本、状态管理方式、依赖与目标设备。编写 `.ets` 时使用当前环境可用且适用的 HarmonyOS 官方开发技能和文档;没有时按官方 SDK 文档继续,不自动安装工具。
9
+
10
+ - [ArkTS 严格语法](references/dwy-arkts-strict.md)
11
+ - [ArkUI 构建与运行](references/dwy-arkts-ui-build.md)
12
+ - [界面设计与安全区](references/dwy-arkts-ui-design.md)
13
+ - [常见踩坑](references/dwy-harmony-pitfalls.md)
14
+
15
+ 资料中的版本特定规则先核实当前 SDK;构建通过不能代替目标设备的运行和交互验证。
@@ -43,7 +43,7 @@ description: "【dwy·技术架构】产品 0 到 1 设计与架构阶段。触
43
43
 
44
44
  - Python → `dwy-python-architecture`
45
45
  - Vue → `dwy-vue-architecture`
46
- - Android → `dwy-android-layering`
46
+ - Android → `dwy-android-architecture`
47
47
  - iOS / macOS → `dwy-apple-architecture`
48
48
 
49
49
  团队新项目参考对应架构指引;既有项目先核实当前依赖边和模块组织,避免擅自重构。
@@ -51,7 +51,7 @@ description: "【dwy·技术架构】产品 0 到 1 设计与架构阶段。触
51
51
  ## 实现
52
52
  [自写型]
53
53
  1. 读项目 `.claude/rules/`,结合上方架构约束产出架构(项目 rules 优先,本约束兜底)
54
- 2. 技术架构:先读可用的对应栈架构 Skill 或 Android layering 规则,再写分层、模块边界和选型理由;选型不确定处走 `AskUserQuestion`
54
+ 2. 技术架构:先读可用的对应栈架构 Skill,再写分层、模块边界和选型理由;选型不确定处走 `AskUserQuestion`
55
55
  3. **判有无后端**(读选型/PRD:有 API / 持久化 / 账户体系 → 有后端):
56
56
  - **有后端** → 必出数据库设计,且**建模到位**:库表清单 / 字段(类型·约束·默认·可空) / 主外键关系 / 索引 / 必要的范式或反范式说明,与接口契约 schema 对齐
57
57
  - **纯前端**(无后端)→ 跳过数据库设计,在 `技术架构.md` 注明「无后端,不涉及库表」
@@ -7,6 +7,8 @@ description: "Use when 用户要求整理工程版本、更新 changelog、打
7
7
 
8
8
  先识别工程及变更,再为需要更新的工程维护版本、changelog 和 tag;是否发布及发布方式按用户意图和项目上下文判断。
9
9
 
10
+ 分支与环境关系应先核实当前项目的约定及实际工作流。[历史 develop/preview 规则](references/dwy-prod-branch.md)仅适用于明确采用该约定的项目,不覆盖其他项目的分支策略或用户授权。
11
+
10
12
  ## 流程
11
13
 
12
14
  1. 读取仓库指令、结构、构建配置、版本来源、changelog、Git 状态和历史 tag,识别独立工程及共享版本边界。依据实际依赖判断共享代码影响;不要把每个子目录当成独立工程。优先遵循用户指定范围,分不清边界时询问。
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: dwy-alembic
3
+ description: 创建、审查或排查使用 Alembic 的 SQLAlchemy 数据库结构迁移时使用。
4
+ ---
5
+
6
+ # Alembic 迁移
7
+
8
+ 先检查项目现有 Alembic 配置、元数据、迁移历史与目标数据库,避免重建已初始化的环境。按任务读 [Alembic 迁移](references/dwy-db-migration.md);示例导入路径需按当前项目替换。自动生成后人工检查升级、回滚和现有数据兼容性;生产执行与破坏性变更按用户授权及项目流程处理。
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: dwy-postgres
3
+ description: 设计、修改或排查 PostgreSQL 数据库、连接、权限与敏感数据时使用。
4
+ ---
5
+
6
+ # PostgreSQL 开发
7
+
8
+ 先核实实际 PostgreSQL 版本、连接方式、用户权限、数据规模和项目已有迁移机制。按任务读 [PostgreSQL 规范](references/dwy-postgres.md);数据库连接与凭据从环境或配置获取,不写入代码、日志或示例。涉及数据变更先评估兼容性与回滚,破坏性操作遵循已有授权边界。
9
+
10
+ 历史资料提到的 `dwy-db-migration` 对应 `dwy-alembic`;只有项目使用 Alembic 时才适用。
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: dwy-redis
3
+ description: 设计、修改或排查 Redis 客户端、键、消息和部署配置时使用。
4
+ ---
5
+
6
+ # Redis 开发
7
+
8
+ 先核实实际 Redis 版本、客户端、拓扑与业务数据生命周期。按任务读 [Redis 规范](references/dwy-redis.md),避免把团队特定客户端强加给已有项目;配置、凭据和外部输入按实际边界处理。涉及数据删除、迁移或生产设置时先核实影响与授权。
@@ -7,7 +7,7 @@ description: "新增或升级运行时依赖、选版本、选基础镜像 / SDK
7
7
 
8
8
  新装或新选依赖、base 镜像、SDK、字体、图标、素材、模型权重时读本 skill。已安装的旧版本不用为此升级。本包自己的发版版本号按 `dwy-publish` 决策。
9
9
 
10
- 没有 skill 的工具只看这两份短 rule,和本 skill 冲突时以本 skill 为准:`rules/开发流程/dwy-dependency-freshness.md`、`rules/开发流程/dwy-oss-commercial-license.md`。
10
+ 旧模板摘要仅供识别迁移时的历史托管文件,不作为独立 Rules 分发;依赖版本和许可判断以本 Skill 及当前项目要求为准。
11
11
 
12
12
  ## 一、版本
13
13
 
@@ -9,6 +9,8 @@ description: Use when starting or completing code development, implementing feat
9
9
 
10
10
  本 Skill 只定义通用流程,不依赖特定 CLI、模型、语言、框架或其他 Skill。自动加载取决于宿主的技能发现能力;本文件本身不是强制执行器,也不授予额外权限。
11
11
 
12
+ 需要检查代码简约、行为变更及测试位置时,按需阅读 [代码质量](references/dwy-code-craft.md)。项目和用户明确要求优先。
13
+
12
14
  ## 入口与决策
13
15
 
14
16
  - **开发任务**:从第 1 步走完整闭环,不把计划、候选方案或测试通过当作最终交付。
@@ -7,7 +7,7 @@ description: "准备 git commit、写 commit message、处理 git pull / rebase
7
7
 
8
8
  本次任务包含提交、commit message、`git pull` / rebase 冲突、提交前检查时读本 skill。只改代码、不提交时不用。
9
9
 
10
- 没有 skill 的工具只看 `rules/开发流程/dwy-git-commit.md`。和那份短 rule 冲突时以本 skill 为准。
10
+ 旧模板摘要仅供识别迁移时的历史托管文件,不作为独立 Rules 分发;提交流程以本 Skill 和当前项目要求为准。
11
11
 
12
12
  任一步不通过:中止提交。项目按多人协作处理,本地未基于最新远程提交前,禁止产生新 commit。
13
13