create-dwy 0.19.1 → 0.21.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 (113) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/package.json +1 -1
  3. package/src/cli-help.js +31 -2
  4. package/src/sync-all.js +168 -577
  5. package/src/sync-codex.js +42 -28
  6. package/src/sync-cursor.js +0 -25
  7. package/src/sync-global-skills.js +2 -2
  8. package/src/sync-opencode.js +7 -33
  9. package/src/sync.js +59 -226
  10. package/src/tab-multiselect.js +15 -53
  11. package/src/utils.js +0 -1
  12. package/templates/ai-tools/AGENTS.md +223 -0
  13. package/templates/ai-tools/CHANGELOG.md +195 -0
  14. package/templates/ai-tools/VERSION +1 -1
  15. package/templates/ai-tools/hooks/Git/pre-git-commit-ai-signature-check.sh +5 -4
  16. package/templates/ai-tools/rules/Android/dwy-android-core.md +147 -13
  17. package/templates/ai-tools/rules/Android/dwy-android-layering.md +142 -0
  18. package/templates/ai-tools/rules/Android/dwy-android-mvp.md +55 -0
  19. package/templates/ai-tools/rules/Android/dwy-android-support-only.md +2 -0
  20. package/templates/ai-tools/rules/Docker/dwy-docker.md +23 -1
  21. package/templates/ai-tools/rules/Flutter/dwy-flutter-core.md +2 -0
  22. package/templates/ai-tools/rules/Flutter/dwy-flutter-testing.md +1 -1
  23. package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-build.md +12 -8
  24. package/templates/ai-tools/rules/Python/dwy-python-backend.md +4 -43
  25. package/templates/ai-tools/rules/Python/dwy-python-layering.md +169 -0
  26. package/templates/ai-tools/rules/Vue/dwy-vue-core.md +11 -49
  27. package/templates/ai-tools/rules/Vue/dwy-vue-layering.md +153 -0
  28. package/templates/ai-tools/rules/iOS/dwy-apple-layering.md +133 -0
  29. package/templates/ai-tools/rules/iOS/dwy-swift-core.md +2 -0
  30. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-code-craft.md +83 -0
  31. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-dependency-freshness.md +27 -66
  32. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md +8 -219
  33. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-oss-commercial-license.md +27 -123
  34. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prod-branch.md +31 -0
  35. package/templates/ai-tools/rules//346/225/260/346/215/256/345/272/223/dwy-postgres.md +17 -10
  36. package/templates/ai-tools/rules//346/225/260/346/215/256/345/272/223/dwy-redis.md +6 -3
  37. package/templates/ai-tools/skills/Docker/dwy-deploy-first/SKILL.md +14 -14
  38. package/templates/ai-tools/skills/Docker/dwy-deploy-first/references/chapter-01-mirrors.md +2 -2
  39. package/templates/ai-tools/skills/Docker/dwy-docker/SKILL.md +21 -13
  40. package/templates/ai-tools/skills/Docker/dwy-docker/references/ask-templates.md +13 -12
  41. package/templates/ai-tools/skills/Docker/dwy-docker/references/templates.md +3 -1
  42. package/templates/ai-tools/skills/Docker/dwy-docker/references/version-rules.md +10 -6
  43. package/templates/ai-tools/skills/Docker/dwy-docker/scripts/query_dockerhub.py +21 -6
  44. package/templates/ai-tools/skills/Docker/dwy-docker/scripts/scan_images.sh +2 -2
  45. package/templates/ai-tools/skills/Docker/dwy-mirror-source/SKILL.md +44 -30
  46. package/templates/ai-tools/skills/Docker/dwy-mirror-source/references/dockerfile-snippets.md +2 -0
  47. package/templates/ai-tools/skills/Docker/dwy-mirror-source/references/mirror-providers.md +8 -8
  48. package/templates/ai-tools/skills/Docker/dwy-mirror-source/scripts/apply_mirrors.py +14 -1
  49. package/templates/ai-tools/skills/Docker/dwy-mirror-source/scripts/check_mirrors.py +4 -0
  50. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/SKILL.md +8 -6
  51. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/digest/python-sdk.md +3 -3
  52. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/digest/stream-engine.md +2 -2
  53. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/anti-patterns.md +3 -1
  54. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/change-checklist.md +4 -4
  55. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/lethal-violations.md +5 -5
  56. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/perf-baselines.md +5 -5
  57. package/templates/ai-tools/skills/Python/dwy-eapi/SKILL.md +2 -2
  58. package/templates/ai-tools/skills/Python/dwy-eapi/references/tasks-integration-guide.md +4 -4
  59. package/templates/ai-tools/skills/Python/dwy-eapi/v0/breaking.md +3 -0
  60. package/templates/ai-tools/skills/Python/dwy-eapi/v0/email-canonical.md +28 -3
  61. package/templates/ai-tools/skills/Python/dwy-eapi/v0/index.md +2 -2
  62. package/templates/ai-tools/skills/Python/dwy-eapi/v0/providers-email.md +12 -2
  63. package/templates/ai-tools/skills/Vue/dwy-eui/references/eui-design-guide.md +1 -1
  64. package/templates/ai-tools/skills/Vue/dwy-eui/references/eui-integration-guide.md +12 -0
  65. package/templates/ai-tools/skills/Vue/dwy-eui/shared/config-theme.md +2 -0
  66. package/templates/ai-tools/skills/Vue/dwy-eui/shared/form.md +10 -0
  67. package/templates/ai-tools/skills/Vue/dwy-eui/v2/index.md +5 -0
  68. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-architecture/SKILL.md +11 -14
  69. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-product-launcher/references/state-and-contract.md +1 -1
  70. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-prototype/SKILL.md +1 -1
  71. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-dev/SKILL.md +1 -1
  72. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-github-action-publish/SKILL.md +32 -15
  73. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-github-action-publish/references/electron-release-workflow-template.yml +3 -1
  74. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-github-action-publish/references/release-workflow-template.yml +8 -5
  75. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/SKILL.md +1 -1
  76. 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 +1 -1
  77. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/references/aso.md +2 -0
  78. 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 +1 -1
  79. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/SKILL.md +4 -3
  80. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/android.md +1 -1
  81. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/backend-deploy.md +1 -1
  82. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/changelog.md +45 -27
  83. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/frontend-deploy.md +1 -1
  84. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/generic-release.md +1 -1
  85. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/git-tag.md +1 -1
  86. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/harmony.md +1 -1
  87. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/ios.md +1 -1
  88. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-semver/SKILL.md +8 -0
  89. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/SKILL.md +7 -7
  90. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/references/checks-runtime.md +63 -59
  91. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_base.sh +10 -1
  92. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_capacity.sh +21 -23
  93. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_db.sh +9 -1
  94. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_docker.sh +20 -24
  95. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_logs.sh +3 -3
  96. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/SKILL.md +4 -2
  97. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/references/api.md +1 -1
  98. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/synthesize.py +1 -0
  99. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/SKILL.md +7 -5
  100. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/references/platform-copy-examples.md +5 -3
  101. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-dependency-choice/SKILL.md +140 -0
  102. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-git-commit/SKILL.md +113 -0
  103. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-shared/SKILL.md +17 -14
  104. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-whiteboard-prototype/SKILL.md +1 -1
  105. package/templates/project/fullstack-monorepo/{CLAUDE.md.hbs → AGENTS.md.hbs} +1 -1
  106. package/src/sync-packs.js +0 -223
  107. package/src/sync-scene.js +0 -178
  108. package/templates/ai-tools/CLAUDE.md +0 -210
  109. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-development.md +0 -115
  110. /package/templates/project/backend/{CLAUDE.md.hbs → AGENTS.md.hbs} +0 -0
  111. /package/templates/project/fullstack-monorepo/backend/{CLAUDE.md.hbs → AGENTS.md.hbs} +0 -0
  112. /package/templates/project/fullstack-monorepo/frontend/{CLAUDE.md.hbs → AGENTS.md.hbs} +0 -0
  113. /package/templates/project/web/{CLAUDE.md.hbs → AGENTS.md.hbs} +0 -0
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: dwy-dependency-choice
3
+ description: "新增或升级运行时依赖、选版本、选基础镜像 / SDK、检查开源许可证时必须使用(即使用户没说 skill 名)。只选发布满 7 天的正式版;闭源商用禁止 GPL / AGPL / SSPL / 非商业许可。各栈查发布时间和隐私协议附录模板在本 skill。不负责本包自己的 SemVer(那是 dwy-semver)。已安装的旧版本不用为此升级。"
4
+ ---
5
+
6
+ # 依赖选型(版本 + 许可)
7
+
8
+ 新装或新选依赖、base 镜像、SDK、字体、图标、素材、模型权重时读本 skill。已安装的旧版本不用为此升级。本包自己的版本号走 `dwy-semver`。
9
+
10
+ 没有 skill 的工具只看这两份短 rule,和本 skill 冲突时以本 skill 为准:`rules/开发流程/dwy-dependency-freshness.md`、`rules/开发流程/dwy-oss-commercial-license.md`。
11
+
12
+ ## 一、版本
13
+
14
+ 预发布(beta / rc / alpha)未冻结 API。刚发布的正式版也常带回归。先丢掉预发布,再查正式版的首次发布时间,避开不满 7 天的版本。
15
+
16
+ 适用所有包管理器。下面没列出的栈,查该包实际所在的 registry。
17
+
18
+ ### 适用边界
19
+
20
+ - 只约束首次选型:新项目引入新包、新搭脚手架选 base 镜像 / SDK、原项目引入此前没用过的依赖。
21
+ - 已安装的旧版本无需为此升级。
22
+ - 7 天是下限排除条件,不是「必须选最近一个满 7 天的版本」。最终选哪个稳定正式版,看成熟度、维护、体积、和当前栈是否兼容。
23
+
24
+ ### 硬约束
25
+
26
+ 候选必须同时满足下面两条。给用户的选项同样只列合格版本。
27
+
28
+ - 只选正式版。禁止版本号或 tag 含 `beta` / `rc` / `alpha` / `preview` / `nightly` / `snapshot` / `canary` / `dev` / `experimental`,或 registry 标为 pre-release(npm dist-tag `next` / `beta` / `rc`、GitHub `prerelease: true`、PyPI 版本号带 `a` / `b` / `rc`)。预发布即使超过 7 天也不用。
29
+ - 选定前查该正式版的首次发布时间。用官方 registry 的发布时间,不是上传时间,不是 `latest` / `stable` tag 时间。
30
+ - 禁止采用发布时间距今不满 7 天的版本。含安全补丁,无例外。等满 7 天再用。
31
+ - 禁止 `@latest` / `latest` / `stable` / 浮动 tag / 不带版本号。这些会落到刚发布的版本或预发布通道。
32
+ - 用户口头点名某个 beta / rc:不直接装。说明只选正式版,改给最近一个合格正式版让用户确认。
33
+
34
+ ### 各栈查发布时间
35
+
36
+ 表里的 URL 和字段是当前先验。包不在这个宿主、字段不是首次发布,或请求失败,就换它实际所在的 registry 或发行说明。不要用示例版本号顶上。查到的新入口不要写回本表。
37
+
38
+ | 栈 | 查发布时间 |
39
+ | --- | --- |
40
+ | npm / pnpm | 先验:`npm view <pkg> time --json`。官方 registry 连不上,或包不在 npmjs,改查实际所在的 registry。刚发布的传播延迟不是换源的理由 |
41
+ | uv / pip | 先验:`https://pypi.org/pypi/<pkg>/json`。取该版本各文件里最早的 `upload_time`,不要默认 `[0]` 就是首次。包不在 pypi.org 就查它实际所在的 index |
42
+ | Docker | 查该 tag 的首次发布时间。Hub tags API 的 `last_updated` 会因重复推送变动,不能当成首次发布。Hub 不通或镜像不在 Hub 时改查它所在 registry |
43
+ | Android(Gradle / Maven) | 先验:包所在仓库的 `maven-metadata.xml`。`<lastUpdated>` 会随元数据重写,不能单独当成首次发布。对不上就看该版本的发行说明或 tag。包不在 Maven Central 就查它实际的仓库 |
44
+ | iOS(CocoaPods) | 先验:`https://github.com/CocoaPods/Specs` 或该 pod 源仓库的 release / tag。不在 Specs 里就查实际 spec 源 |
45
+ | iOS(SPM) | 源仓库 release / tag 时间 |
46
+ | 鸿蒙(ohpm) | 先验:ohpm registry 包元数据 publishTime。这个 host 没有该包就查项目实际使用的 ohpm 源 |
47
+ | Flutter(pub) | 先验:`https://pub.dev/packages/<pkg>` 的 published,或 pub API。私有 pub 用那个 host |
48
+
49
+ 拿不到精确发布时间:选更早的正式版,不选「最新」,不选 beta。
50
+
51
+ ```bash
52
+ # 反例:预发布,即使发布超过 7 天也不用
53
+ pnpm add some-pkg@1.3.0-beta.2
54
+ uv add some-pkg==2.0.0rc1
55
+ FROM node:23.0.0-rc
56
+
57
+ # 反例:直接装 latest
58
+ pnpm add some-pkg@latest
59
+ FROM node:latest
60
+
61
+ # 正例:先查正式版发布时间,再锁一个已满 7 天的正式版
62
+ npm view some-pkg time --json
63
+ pnpm add some-pkg@1.2.3
64
+ ```
65
+
66
+ ## 二、许可
67
+
68
+ 闭源商用(收费、SaaS、付费 App、对外交付)引入开源库时查许可。纯学习原型先不挡;一旦上架或收费,补齐本节。
69
+
70
+ 当前仓库本身是对外发布的开源库时,依赖许可按该库自己的许可证评估。GPL 不因为本节自动禁止。
71
+
72
+ 只查直接依赖,不强制盘传递依赖。覆盖 npm/pnpm、PyPI/uv、CocoaPods/SPM、Gradle/Maven、ohpm、pub、Docker 基础镜像、字体、图标、素材、模型权重与 SDK。
73
+
74
+ ### 三条
75
+
76
+ 1. 未确认 license 的包禁止引入。
77
+ 2. 明确不可商用或强 copyleft:换可商用替代,或购买商业授权。不要直接使用。
78
+ 3. 只有许可强制要求署名 / NOTICE 时,才在隐私协议附录声明(含锁定版本)。不强制署名的库不写。
79
+
80
+ ### 禁止引入
81
+
82
+ | 类型 | 常见标识 | 原因 |
83
+ | --- | --- | --- |
84
+ | 明确非商业 | `CC-BY-NC*`、`CC-NC`、`PolyForm-Noncommercial`、许可证写 Non-Commercial / No Commercial Use | 商用即侵权 |
85
+ | 强传染 copyleft(闭源商用) | `GPL-2.0`、`GPL-3.0`、`AGPL-3.0`、`SSPL` | 可能强制整包开源或限制网络服务形态 |
86
+ | 限制竞争 / 生产用途 | `BUSL`(未到 Change Date 且限制 Production)、Commons Clause、部分 Source-Available | 表面开源,实则禁商用或禁竞争 |
87
+ | 仅免费个人 / 评估 | 字体、图标、SDK 写 free for personal use only、evaluation only | 商用需买授权 |
88
+ | 无 license | 仓库无 LICENSE,或 all rights reserved 却当开源用 | 默认不可用 |
89
+
90
+ 已知会把上表许可顶进运行时链接的包也不得引。
91
+
92
+ 例外必须记下来:已购买商业授权且合同覆盖当前用途(授权方、合同编号、到期日);LGPL 不得默认通过,单独评估后再定。
93
+
94
+ 选型对比加一列 License:
95
+
96
+ - `OK-商用`:可商用,无强制署名则声明页可不写
97
+ - `OK-商用+强制署名`:MIT / BSD / Apache-2.0 / ISC 等要求保留版权与许可声明,进隐私协议附录
98
+ - `OK-商用+额外义务`:Apache NOTICE、MPL 文件级 copyleft,按义务处理
99
+ - `禁-不可商用/高风险`:不得作为推荐默认项
100
+
101
+ ### 强制署名时的声明
102
+
103
+ 许可明确要求 attribution / copyright notice / NOTICE / 保留许可文本时才声明。
104
+
105
+ 落点只有隐私协议附录「第三方开源组件」。不写进个人信息处理条款正文。关于页可以链到附录,不替代附录。
106
+
107
+ | 字段 | 说明 |
108
+ | --- | --- |
109
+ | 组件名 | 直接依赖包名 |
110
+ | 版本 | lockfile 里的锁定版本,禁止只写 `latest` |
111
+ | 许可证 | SPDX 标识 |
112
+ | 版权声明 | 来自 LICENSE 或包元数据 |
113
+ | 许可全文或链接 | 全文或稳定 URL |
114
+
115
+ ```text
116
+ 附录:第三方开源组件
117
+
118
+ 本产品直接使用的、且许可证要求保留声明的开源组件如下:
119
+
120
+ 1. axios 1.7.9
121
+ License: MIT
122
+ Copyright (c) 2014-present Matt Zabriskie
123
+ https://github.com/axios/axios/blob/v1.7.9/LICENSE
124
+ ```
125
+
126
+ 只列直接依赖里许可强制署名的项。新增、替换、锁定版本变更时更新附录。发版前附录版本与 lockfile 一致,已移除的组件从附录删掉。
127
+
128
+ ### 常见许可
129
+
130
+ | SPDX | 商用闭源 | 是否强制进附录 |
131
+ | --- | --- | --- |
132
+ | MIT / ISC / BSD-2/3 | 可 | 是 |
133
+ | Apache-2.0 | 可 | 是(保留 NOTICE) |
134
+ | MPL-2.0 | 通常可 | 按义务;改过的 MPL 文件另有开源义务 |
135
+ | LGPL-2.1/3.0 | 须单独评估 | 评估通过后再定 |
136
+ | GPL / AGPL / SSPL | 禁 | — |
137
+ | CC-BY-NC* | 禁 | — |
138
+ | 无 license | 禁 | — |
139
+
140
+ 推荐开源方案时带上 license 和商用结论(OK / OK+强制署名 / 禁 / 需商业授权)。禁区许可不作为默认推荐,改列可商用替代。不得以「业界都在用」跳过核查。
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: dwy-git-commit
3
+ description: "准备 git commit、写 commit message、处理 git pull / rebase 冲突、做提交前检查时必须使用(即使用户没说 skill 名)。先 fetch 再 rebase,冲突未清零不提交;暂存区不进密钥;message 用约定 type;删掉 AI 署名。只改代码、不提交时不要用。"
4
+ ---
5
+
6
+ # Git 提交
7
+
8
+ 本次任务包含提交、commit message、`git pull` / rebase 冲突、提交前检查时读本 skill。只改代码、不提交时不用。
9
+
10
+ 没有 skill 的工具只看 `rules/开发流程/dwy-git-commit.md`。和那份短 rule 冲突时以本 skill 为准。
11
+
12
+ 任一步不通过:中止提交。项目按多人协作处理,本地未基于最新远程提交前,禁止产生新 commit。
13
+
14
+ ## 1. 顺序
15
+
16
+ 1. 拉取远程并处理完全部冲突
17
+ 2. 安全写法检查
18
+ 3. 暂存区敏感扫描
19
+ 4. 变更范围确认
20
+ 5. Scope 与 message 格式
21
+ 6. 删掉 AI 署名
22
+
23
+ ## 2. 先同步远程
24
+
25
+ 未完成同步、冲突未清零:禁止 `git commit`。
26
+
27
+ 先 fetch,再 rebase。工作区有未提交改动时带 `--autostash`,禁止为了拉代码丢弃本地改动。
28
+
29
+ ```bash
30
+ git fetch origin
31
+ git pull --rebase --autostash
32
+ ```
33
+
34
+ 当前分支已设置上游时,上面两条即可。未设置上游但远程存在同名分支:
35
+
36
+ ```bash
37
+ git fetch origin
38
+ git pull --rebase --autostash origin "$(git branch --show-current)"
39
+ ```
40
+
41
+ 无 `origin` 时,对实际存在的 remote 做同等操作。
42
+
43
+ 冲突出现后:
44
+
45
+ 1. 逐处消解 `<<<<<<<` / `=======` / `>>>>>>>`。
46
+ 2. `git add` 已解决文件。
47
+ 3. rebase 进行中用 `git rebase --continue`,不要另开 `git commit` 顶掉 rebase。
48
+ 4. stash 弹出后再次冲突,同样消解并 `git add`。
49
+ 5. 全库无冲突标记、无未结束的 rebase / merge,再做后面的检查。
50
+
51
+ 禁止用 `git rebase --abort` / `git merge --abort` 躲冲突后直接提交。
52
+
53
+ 只有这两种情况可以跳过同步,并在回复里写明原因:仓库没有任何 remote;`git fetch` 后当前分支在所有 remote 上都不存在同名分支。
54
+
55
+ | 情况 | 处理 |
56
+ | --- | --- |
57
+ | fetch / pull 网络失败 | 中止提交 |
58
+ | 仍有冲突标记或 rebase / merge 未结束 | 中止提交 |
59
+ | 已落后远程却未 rebase 完成 | 中止提交 |
60
+ | 改动很小、刚才拉过、先提交再拉、猜远程没人推 | 仍要先 fetch |
61
+ | 用 force push 顶掉远程 | 禁止用强推代替拉取 |
62
+
63
+ ## 3. 命令写法
64
+
65
+ `git commit -m "..."` 会对双引号内容做 shell 展开。出现反引号或 `$(...)` 时,禁止直接使用双引号。
66
+
67
+ 优先把 message 写进文件:
68
+
69
+ ```bash
70
+ git commit -F /tmp/commit-msg.txt
71
+ ```
72
+
73
+ message 内无单引号时,可以用单引号:`git commit -m 'feat: 支持 runConcurrent'`。
74
+
75
+ ## 4. 暂存区敏感扫描
76
+
77
+ 同时看 `git diff --cached` 和 `git diff --cached --name-only`。
78
+
79
+ 禁止提交:`.env*`、`*.pem`、`*.key`、`*.p12`、`*.pfx`、`*.jks`、`*.keystore`、真实数据的 `*.sql`、`*.dump`、`*.sqlite`、敏感表的 `*.xlsx` / `*.csv`、`*.log`、`pgdata/`、`cache/*.json`。
80
+
81
+ 禁止内容:`sk-` 开头的 API Key、`AKIA` 开头的 AWS Key、`ghp_` GitHub Token、`password=`、`token=`、`secret=`、明文数据库连接串、私钥头、`IP:端口`、`ssh user@ip`。
82
+
83
+ `.env.example`、环境变量读取方式、`localhost` / `127.0.0.1` 示例连接串可以留。
84
+
85
+ 命中后停止,输出 `文件名:行号:命中片段` 和改法(`.gitignore`、改环境变量、换占位符)。用户确认后才能继续。用户强制提交时,message body 追加 `GIT-SECURITY: 用户已确认提交此内容`。
86
+
87
+ ## 5. 范围与 message
88
+
89
+ 先看 `git diff --cached`。一条 subject 说不清这次改动,就拆 commit。
90
+
91
+ 格式:`<type>(<scope>): <subject>`,或 `<type>: <subject>`。破坏性变更写成 `feat!:` / `fix!:`(有 scope 时 `feat(<scope>)!:`),body 加 `BREAKING CHANGE: ...`。
92
+
93
+ `type` 只使用:`feat`、`fix`、`refactor`、`chore`、`docs`、`test`、`perf`、`style`、`ci`。
94
+
95
+ Scope 按变更模块和仓库现有习惯。单模块优先加 scope。跨模块可以不加。归不稳时宁可不加,不新造一套 scope。
96
+
97
+ `subject`:中文动宾短语,不超过 72 字符,不用句号,不含 emoji。body 只写为什么。
98
+
99
+ 示例:
100
+
101
+ - `feat(eui): 添加 Image 组件懒加载支持`
102
+ - `refactor(backend): 提取分页逻辑为共享工具`
103
+ - `fix(eui)!: 重构 EDialog open 属性为 v-model:open`
104
+
105
+ ## 6. AI 署名
106
+
107
+ 提交前看完整的 commit 命令和 message 文件。有 AI 署名就删掉再提交。环境会自己往命令里塞署名(例如 `Co-authored-by: Cursor <cursoragent@cursor.com>`),看见就去掉。
108
+
109
+ hook 会拦:`Co-Authored-By:`、`Generated with`、Claude / ChatGPT / GPT / Copilot / Cursor 等产品名、`noreply@anthropic.com`、`noreply@openai.com`。
110
+
111
+ 名单里没有的,提交前自己判断。一行只要是在给 AI 工具、模型、Agent、机器人署名,或声明这段提交由 AI 生成、协助、代写,就删。人写的正常说明留着。
112
+
113
+ 不要加 `--trailer`,不要多一条 `-m` 放署名,不要把署名留在 `-F` 的文件里。hook 拦住之后删掉再交,不绕过 hook。
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: dwy-shared
3
- description: "管理 dwy-shared 模板仓库与 dwy CLI 工具。功能 1:把本机已有的 skill/rule/hook/command 文件加进 dwy-shared 仓库时,自动读现有分类目录、推荐归位、AskUserQuestion 确认后 cp/git mv + commit + push 到 Gitee,让别的项目用 dwy claude sync 拉到。功能 2:管理 dwy npm CLI(create-dwy)的安装/更新/卸载/版本查询/CDN 延迟应急。涉及以下任何场景必须使用此 skill:用户说「加 X 到 dwy-shared」「在 dwy-shared 新增 skill/rule/hook/command」「dwy 仓库整理」「dwy-shared 仓库管理」「换 dwy-shared 仓库路径」「重设 dwy-shared」「升级/装/卸/重装 dwy CLI」「dwy 拉不到最新版」「create-dwy 怎么装」「dwy --version 显示旧版」「dwy CDN 没传播」。"
3
+ description: "管理 dwy-shared 模板仓库与 dwy CLI 工具。功能 1:把本机已有的 skill/rule/hook/command 文件加进 dwy-shared 仓库时,自动读现有分类目录、推荐归位、AskUserQuestion 确认后 cp/git mv + commit + push 到 origin。发布新的 create-dwy 后,其他项目跑 dwy,选同步项目配置。功能 2:管理 dwy npm CLI(create-dwy)的安装/更新/卸载/版本查询/CDN 延迟应急。涉及以下任何场景必须使用此 skill:用户说「加 X 到 dwy-shared」「在 dwy-shared 新增 skill/rule/hook/command」「dwy 仓库整理」「dwy-shared 仓库管理」「换 dwy-shared 仓库路径」「重设 dwy-shared」「升级/装/卸/重装 dwy CLI」「dwy 拉不到最新版」「create-dwy 怎么装」「dwy --version 显示旧版」「dwy CDN 没传播」。"
4
4
  ---
5
5
 
6
6
  # dwy-shared 仓库管理
@@ -29,7 +29,7 @@ skill 与 dwy-shared 仓库深度绑定但**不硬编码路径**。每次执行
29
29
  ```json
30
30
  {
31
31
  "repo_path": "/绝对/路径/到/dwy-shared",
32
- "git_url": "https://gitee.com/snailyuanyuan/dwy-shared.git",
32
+ "git_url": "https://github.com/danweiyuancircle/dwy-ai-experience.git",
33
33
  "configured_at": "2026-05-18T12:34:56Z"
34
34
  }
35
35
  ```
@@ -61,7 +61,7 @@ fi
61
61
  - **未 clone**:输出 git URL 让用户先 clone:
62
62
 
63
63
  ```
64
- git clone https://gitee.com/snailyuanyuan/dwy-shared.git <你想放的位置>
64
+ git clone https://github.com/danweiyuancircle/dwy-ai-experience.git <你想放的位置>
65
65
  ```
66
66
 
67
67
  然后告诉路径
@@ -77,7 +77,7 @@ fi
77
77
  cat > "$HOME/.config/dwy-shared/repo.json" <<EOF
78
78
  {
79
79
  "repo_path": "$PATH",
80
- "git_url": "https://gitee.com/snailyuanyuan/dwy-shared.git",
80
+ "git_url": "https://github.com/danweiyuancircle/dwy-ai-experience.git",
81
81
  "configured_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
82
82
  }
83
83
  EOF
@@ -129,7 +129,7 @@ done
129
129
 
130
130
  读源文件的 description / 内容前 500 字,结合现有分类样例,推荐 1 个最匹配分类。
131
131
 
132
- 分类目录必须和同步 Tab 的包名对齐:技术栈用 `通用` / `Vue` / `Python` / `Docker` 等,场景用 `产品0到1` / `自媒体` / `发布发版` / `安全` / `内容创作` / `DolphinDB`。不要再建 `基础库` / `脚手架` / `元工具` 这种与包不对齐的目录。新文件明显不属于任何现有包时,**主动建议新建分类(同时要在 `sync-packs.js` 加包)**。
132
+ 同步界面按模板实际分类目录自动生成 Tab,Skills 与 Rules 依次逐项勾选。优先复用 `通用` / `Vue` / `Python` / `Docker` / `产品0到1` / `自媒体` / `发布发版` / `安全` / `内容创作` / `DolphinDB` 等已有分类,避免同义分类重复。新文件不属于现有分类时,建议新建分类目录;不再维护技术栈包或场景包映射。
133
133
 
134
134
  ### 步骤 5:AskUserQuestion 确认分类
135
135
 
@@ -188,7 +188,7 @@ git -C "$REPO_PATH" diff --cached --stat
188
188
 
189
189
  ### 步骤 8:生成 commit message
190
190
 
191
- 按项目 `CLAUDE.md` 中 Git Commit Scope 规范:
191
+ 按项目 `AGENTS.md` 中 Git Commit Scope 规范:
192
192
  - scope: `cli`
193
193
  - type: `feat`(新模板)/ `fix`(修复模板)/ `docs`(仅文档)
194
194
  - subject: 中文动宾短语 ≤72 字符;可附 ai-tools 版本号(如 `ai-tools 0.2.0`)
@@ -216,13 +216,16 @@ git -C "$REPO_PATH" push origin master
216
216
  ### 步骤 11:完成提示
217
217
 
218
218
  告知用户:
219
- - ✓ 已 push 到 Gitee
220
- - 更新当前仓库的 `templates/ai-tools/` 后,发布新的 `create-dwy` 版本;其他项目升级 CLI 后即可使用新模板
219
+ - ✓ 已 push 到 origin
220
+ - 更新当前仓库的 `templates/ai-tools/` 后,发布新的 `create-dwy` 版本;其他项目升级 CLI 后跑 `dwy`,选同步项目配置
221
221
  - 提醒:如果对方 dwy CLI <0.12.0,必须先升级 CLI 才能识别分类目录结构
222
222
 
223
223
  ## 工作流程 B:dwy CLI 管理
224
224
 
225
- 固定命令封装:
225
+ 官方 registry `https://registry.npmjs.org/` 是刚发布包的先验,镜像经常落后。先用它。
226
+
227
+ - 传播延迟:刚 publish,`ETARGET` 或 `npm view` 仍是旧版。打官方 registry 看 `dist-tags`。新版已经在官方源上时,等一会儿再装,不要改镜像。
228
+ - 源不可用:官方源超时、证书失败、连不上。这才换源。换到能拿到**同一版本**内容的源,不只是 HTTP 200。在内容正确的源里取延迟最低的。私有源或用户指定的 registry 不参加公网竞速。当次选出的源不要写回本 skill。
226
229
 
227
230
  | 用户意图 | 命令 |
228
231
  |---|---|
@@ -233,17 +236,17 @@ git -C "$REPO_PATH" push origin master
233
236
  | 查 npm 上最新版 | `npm view create-dwy version` |
234
237
  | 应急重装(cache 损坏) | `npm cache clean --force && npm i -g create-dwy@latest --registry=https://registry.npmjs.org/ --prefer-online` |
235
238
 
236
- ### CDN 延迟应急
239
+ 上表的 `--registry` 是先验。官方源不可用时,把 `--registry` 换成这次选出的源,版本号保持不变。
237
240
 
238
- 如果用户刚 publish 完,跑 `npm view create-dwy version` 还显示旧版 / `npm i` 报 `ETARGET` —— 这是 npm CDN 传播延迟(30s ~ 几分钟),**不是失败**。
241
+ ### 传播延迟和源不可达分开
239
242
 
240
- 直接打主 registry 旁路 CDN:
243
+ 如果用户刚 publish 完,跑 `npm view create-dwy version` 还显示旧版 / `npm i` 报 `ETARGET`,先确认是不是传播延迟(30s ~ 几分钟),不是源挂了。
241
244
 
242
245
  ```bash
243
246
  curl -s https://registry.npmjs.org/create-dwy | jq '."dist-tags".latest'
244
247
  ```
245
248
 
246
- 如果显示是新版,等 30s 重试 `npm i` 或加 `--prefer-online --registry=https://registry.npmjs.org/`。
249
+ 官方源已经是新版:等 30s 再装,仍用官方源。官方源本身失败:按上面换内容正确、延迟最低的源。
247
250
 
248
251
  ## 错误处理速查
249
252
 
@@ -265,7 +268,7 @@ skill 文件**零绝对路径**。换台机器装上后第一次用时自动走
265
268
  需要用户机器满足:
266
269
  1. 装了 `git` / `jq` / `npm`(jq 用于解析缓存 JSON)
267
270
  2. clone 了 dwy-shared 仓库到任意位置(skill 引导)
268
- 3. 对 Gitee origin 有 push 权限
271
+ 3. 对 origin(`https://github.com/danweiyuancircle/dwy-ai-experience.git`)有 push 权限
269
272
  4. 缓存文件 `~/.config/dwy-shared/repo.json` 是机器本地配置,**不**随 skill 文件同步出去
270
273
 
271
274
  ## 安全约束
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: dwy-whiteboard-prototype
3
- description: "用 HTML 白板(FigJam/draw.io 风格)画可交互 UI 原型。触发场景:用户说『画原型 / 出原型 / 画白板 / 原型图 / 做个原型 / prototype / 把某页面的各种状态画出来 / 把这几个页面的跳转画清楚』,或要在动手写 UI 代码前先验证页面与交互流程时。产出:每个页面一个 HTML 白板文件,画布二维摆放、SVG 连线表达跳转、左侧导航在白板间切换、右侧标注写交互与边界。这是项目原型的标准做法,画 iOS/移动端页面原型时务必用本 skill,别另起炉灶手搓样式与交互引擎。"
3
+ description: "用 HTML 白板(FigJam/draw.io 风格)画可交互原型。触发场景:用户说『画白板 / 白板原型 / 把状态画出来 / 把跳转画清楚 / whiteboard』。产出:每个页面一个 HTML 白板,画布摆状态、SVG 连线表达跳转。产品 0 到 1 流程里的线框和高保真平面图不走本 skill,走 dwy-prototype。"
4
4
  ---
5
5
 
6
6
  # 白板原型(HTML 可交互)
@@ -19,7 +19,7 @@ Monorepo 全栈骨架:
19
19
  └── docker-compose.prod.yml # prod: backend + db + redis(含资源限制 + 日志轮转)
20
20
  ```
21
21
 
22
- 详细约束见各子目录的 `CLAUDE.md`。
22
+ 详细约束见各子目录的 `AGENTS.md`。
23
23
 
24
24
  ## 端口约定
25
25
 
package/src/sync-packs.js DELETED
@@ -1,223 +0,0 @@
1
- /**
2
- * 按包勾选的包目录:技术栈包 + 场景包。
3
- * 展开结果写入现有 skills/rules/hooks 选择,不改平台 sync 的按名增删。
4
- * 条目按扫描结果的 category / name 匹配,模板里不存在的名字直接跳过。
5
- */
6
-
7
- /** 技术栈包(含通用)。Tab 顺序:通用第一,Android、Vue 随后,其余保持原相对顺序。 */
8
- export const STACK_PACKS = [
9
- {
10
- id: 'common',
11
- label: '通用',
12
- description: '开发流程 rules、Git hooks、跨栈 skill(dwy-shared / semver / 流程文档)',
13
- ruleCategories: ['开发流程'],
14
- hookCategories: ['Git'],
15
- skillCategories: ['通用'],
16
- skillNames: ['dwy-semver'],
17
- },
18
- {
19
- id: 'android',
20
- label: 'Android',
21
- description: 'Android rules',
22
- ruleCategories: ['Android'],
23
- },
24
- {
25
- id: 'vue',
26
- label: 'Vue',
27
- description: 'Vue rules + dwy-eui / dwy-ekit / 全栈脚手架',
28
- ruleCategories: ['Vue'],
29
- skillCategories: ['Vue'],
30
- },
31
- {
32
- id: 'python',
33
- label: 'Python',
34
- description: 'Python rules + dwy-eapi / 全栈脚手架',
35
- ruleCategories: ['Python'],
36
- skillCategories: ['Python'],
37
- skillNames: ['dwy-fullstack-scaffold'],
38
- },
39
- {
40
- id: 'ios',
41
- label: 'iOS',
42
- description: 'iOS / Swift rules。上架 skill 在场景包「发布发版」',
43
- ruleCategories: ['iOS'],
44
- },
45
- {
46
- id: 'flutter',
47
- label: 'Flutter',
48
- description: 'Flutter rules',
49
- ruleCategories: ['Flutter'],
50
- },
51
- {
52
- id: 'harmony',
53
- label: 'HarmonyOS',
54
- description: 'HarmonyOS / ArkTS rules',
55
- ruleCategories: ['HarmonyOS'],
56
- },
57
- {
58
- id: 'docker',
59
- label: 'Docker / 运维',
60
- description: 'Docker rule + 镜像/部署 skill',
61
- ruleCategories: ['Docker'],
62
- skillCategories: ['Docker'],
63
- },
64
- {
65
- id: 'database',
66
- label: '数据库',
67
- description: 'Postgres / Redis / 迁移 rules。DolphinDB skill 在场景包',
68
- ruleCategories: ['数据库'],
69
- },
70
- ]
71
-
72
- /** 场景包。和栈包同一屏 Tab,默认不预勾。 */
73
- export const SCENE_PACKS = [
74
- {
75
- id: 'product-0to1',
76
- label: '产品0到1',
77
- description: '立项到上线的阶段 skill(launcher / PRD / 架构 / TDD…)',
78
- skillCategories: ['产品0到1'],
79
- },
80
- {
81
- id: 'media',
82
- label: '自媒体',
83
- description: '单位圆自媒体流水线 + 豆包配音',
84
- skillCategories: ['自媒体'],
85
- },
86
- {
87
- id: 'release',
88
- label: '发布发版',
89
- description: 'dwy-publish / App Store / SDK 检查 / semver / GitHub Action',
90
- skillCategories: ['发布发版'],
91
- },
92
- {
93
- id: 'security',
94
- label: '安全',
95
- description: '部署巡检与白帽渗透',
96
- skillCategories: ['安全'],
97
- },
98
- {
99
- id: 'article',
100
- label: '内容创作',
101
- description: '技术文章写作 skill',
102
- skillCategories: ['内容创作'],
103
- },
104
- {
105
- id: 'dolphindb',
106
- label: 'DolphinDB',
107
- description: 'DolphinDB 开发与审查 skill(体量大,不跟数据库栈绑定)',
108
- skillCategories: ['DolphinDB'],
109
- },
110
- ]
111
-
112
- const STACK_IDS = new Set(STACK_PACKS.map(pack => pack.id))
113
- const SCENE_IDS = new Set(SCENE_PACKS.map(pack => pack.id))
114
-
115
- /**
116
- * 规范化 sync-state 里的 packs。未知 id 丢弃,避免旧状态撑爆交互默认勾选。
117
- *
118
- * @param {{ stacks?: string[], scenes?: string[] } | null | undefined} raw
119
- */
120
- export function normalizePacks(raw) {
121
- return {
122
- stacks: [...new Set((raw?.stacks || []).filter(id => STACK_IDS.has(id)))],
123
- scenes: [...new Set((raw?.scenes || []).filter(id => SCENE_IDS.has(id)))],
124
- }
125
- }
126
-
127
- /**
128
- * 判断扫描项是否属于某个包。
129
- * 约束:只看本类型对应的 category / 显式名字,避免 skill 目录名误伤 rules。
130
- *
131
- * @param {{ name: string, category?: string }} item
132
- * @param {object} pack
133
- * @param {'skills' | 'rules' | 'hooks'} type
134
- */
135
- export function itemInPack(item, pack, type) {
136
- if (type === 'skills') {
137
- if ((pack.skillNames || []).includes(item.name)) return true
138
- return (pack.skillCategories || []).includes(item.category)
139
- }
140
- if (type === 'rules') return (pack.ruleCategories || []).includes(item.category)
141
- return (pack.hookCategories || []).includes(item.category)
142
- }
143
-
144
- /**
145
- * 按名字去重合并,保持扫描原序。
146
- *
147
- * @param {Array<{ name: string }>} items
148
- */
149
- function uniqueByName(items) {
150
- const seen = new Set()
151
- const result = []
152
- for (const item of items) {
153
- if (seen.has(item.name)) continue
154
- seen.add(item.name)
155
- result.push(item)
156
- }
157
- return result
158
- }
159
-
160
- /**
161
- * 把已选栈 + 场景包展开成 sync 用的条目。
162
- * skillsOnly 时 rules/hooks 必须空数组,调用方不得据此删除项目已有项。
163
- *
164
- * @param {{ skills: object[], rules: object[], commands?: object[], hooks: object[] }} scans
165
- * @param {{ stacks?: string[], scenes?: string[], skillsOnly?: boolean }} selection
166
- */
167
- /**
168
- * 列出某包在当前扫描结果里的子条目,带 type,供界面展示「包下面有哪些」。
169
- *
170
- * @param {object} pack
171
- * @param {{ skills?: object[], rules?: object[], hooks?: object[] }} scans
172
- * @param {{ skillsOnly?: boolean }} [opts]
173
- */
174
- export function listPackItems(pack, scans, { skillsOnly = false } = {}) {
175
- const types = skillsOnly ? ['skills'] : ['skills', 'rules', 'hooks']
176
- const items = []
177
- for (const type of types) {
178
- for (const item of scans[type] || []) {
179
- if (itemInPack(item, pack, type)) items.push({ ...item, type })
180
- }
181
- }
182
- return items
183
- }
184
-
185
- /**
186
- * 条目属于已选包时,用包的中文名做分组前缀。
187
- *
188
- * @param {{ name: string, category?: string }} item
189
- * @param {'skills' | 'rules' | 'hooks'} type
190
- * @param {string[]} packIds
191
- */
192
- export function packLabelForItem(item, type, packIds) {
193
- const packs = [...STACK_PACKS, ...SCENE_PACKS]
194
- const hit = packs.find(pack => packIds.includes(pack.id) && itemInPack(item, pack, type))
195
- return hit?.label || item.category || '其他'
196
- }
197
-
198
- export function expandPackSelection(scans, { stacks = [], scenes = [], skillsOnly = false } = {}) {
199
- const packById = new Map([...STACK_PACKS, ...SCENE_PACKS].map(pack => [pack.id, pack]))
200
- const selectedPacks = [...stacks, ...scenes]
201
- .map(id => packById.get(id))
202
- .filter(Boolean)
203
-
204
- const pick = (type) => uniqueByName(
205
- selectedPacks.flatMap(pack => (scans[type] || []).filter(item => itemInPack(item, pack, type))),
206
- )
207
-
208
- if (skillsOnly) {
209
- return {
210
- skills: pick('skills'),
211
- rules: [],
212
- commands: [],
213
- hooks: [],
214
- }
215
- }
216
-
217
- return {
218
- skills: pick('skills'),
219
- rules: pick('rules'),
220
- commands: [],
221
- hooks: pick('hooks'),
222
- }
223
- }