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.
- package/CHANGELOG.md +25 -0
- package/package.json +1 -1
- package/src/cli-help.js +31 -2
- package/src/sync-all.js +168 -577
- package/src/sync-codex.js +42 -28
- package/src/sync-cursor.js +0 -25
- package/src/sync-global-skills.js +2 -2
- package/src/sync-opencode.js +7 -33
- package/src/sync.js +59 -226
- package/src/tab-multiselect.js +15 -53
- package/src/utils.js +0 -1
- package/templates/ai-tools/AGENTS.md +223 -0
- package/templates/ai-tools/CHANGELOG.md +195 -0
- package/templates/ai-tools/VERSION +1 -1
- package/templates/ai-tools/hooks/Git/pre-git-commit-ai-signature-check.sh +5 -4
- package/templates/ai-tools/rules/Android/dwy-android-core.md +147 -13
- package/templates/ai-tools/rules/Android/dwy-android-layering.md +142 -0
- package/templates/ai-tools/rules/Android/dwy-android-mvp.md +55 -0
- package/templates/ai-tools/rules/Android/dwy-android-support-only.md +2 -0
- package/templates/ai-tools/rules/Docker/dwy-docker.md +23 -1
- package/templates/ai-tools/rules/Flutter/dwy-flutter-core.md +2 -0
- package/templates/ai-tools/rules/Flutter/dwy-flutter-testing.md +1 -1
- package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-build.md +12 -8
- package/templates/ai-tools/rules/Python/dwy-python-backend.md +4 -43
- package/templates/ai-tools/rules/Python/dwy-python-layering.md +169 -0
- package/templates/ai-tools/rules/Vue/dwy-vue-core.md +11 -49
- package/templates/ai-tools/rules/Vue/dwy-vue-layering.md +153 -0
- package/templates/ai-tools/rules/iOS/dwy-apple-layering.md +133 -0
- package/templates/ai-tools/rules/iOS/dwy-swift-core.md +2 -0
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-code-craft.md +83 -0
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-dependency-freshness.md +27 -66
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md +8 -219
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-oss-commercial-license.md +27 -123
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prod-branch.md +31 -0
- package/templates/ai-tools/rules//346/225/260/346/215/256/345/272/223/dwy-postgres.md +17 -10
- package/templates/ai-tools/rules//346/225/260/346/215/256/345/272/223/dwy-redis.md +6 -3
- package/templates/ai-tools/skills/Docker/dwy-deploy-first/SKILL.md +14 -14
- package/templates/ai-tools/skills/Docker/dwy-deploy-first/references/chapter-01-mirrors.md +2 -2
- package/templates/ai-tools/skills/Docker/dwy-docker/SKILL.md +21 -13
- package/templates/ai-tools/skills/Docker/dwy-docker/references/ask-templates.md +13 -12
- package/templates/ai-tools/skills/Docker/dwy-docker/references/templates.md +3 -1
- package/templates/ai-tools/skills/Docker/dwy-docker/references/version-rules.md +10 -6
- package/templates/ai-tools/skills/Docker/dwy-docker/scripts/query_dockerhub.py +21 -6
- package/templates/ai-tools/skills/Docker/dwy-docker/scripts/scan_images.sh +2 -2
- package/templates/ai-tools/skills/Docker/dwy-mirror-source/SKILL.md +44 -30
- package/templates/ai-tools/skills/Docker/dwy-mirror-source/references/dockerfile-snippets.md +2 -0
- package/templates/ai-tools/skills/Docker/dwy-mirror-source/references/mirror-providers.md +8 -8
- package/templates/ai-tools/skills/Docker/dwy-mirror-source/scripts/apply_mirrors.py +14 -1
- package/templates/ai-tools/skills/Docker/dwy-mirror-source/scripts/check_mirrors.py +4 -0
- package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/SKILL.md +8 -6
- package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/digest/python-sdk.md +3 -3
- package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/digest/stream-engine.md +2 -2
- package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/anti-patterns.md +3 -1
- package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/change-checklist.md +4 -4
- package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/lethal-violations.md +5 -5
- package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/perf-baselines.md +5 -5
- package/templates/ai-tools/skills/Python/dwy-eapi/SKILL.md +2 -2
- package/templates/ai-tools/skills/Python/dwy-eapi/references/tasks-integration-guide.md +4 -4
- package/templates/ai-tools/skills/Python/dwy-eapi/v0/breaking.md +3 -0
- package/templates/ai-tools/skills/Python/dwy-eapi/v0/email-canonical.md +28 -3
- package/templates/ai-tools/skills/Python/dwy-eapi/v0/index.md +2 -2
- package/templates/ai-tools/skills/Python/dwy-eapi/v0/providers-email.md +12 -2
- package/templates/ai-tools/skills/Vue/dwy-eui/references/eui-design-guide.md +1 -1
- package/templates/ai-tools/skills/Vue/dwy-eui/references/eui-integration-guide.md +12 -0
- package/templates/ai-tools/skills/Vue/dwy-eui/shared/config-theme.md +2 -0
- package/templates/ai-tools/skills/Vue/dwy-eui/shared/form.md +10 -0
- package/templates/ai-tools/skills/Vue/dwy-eui/v2/index.md +5 -0
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-architecture/SKILL.md +11 -14
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-product-launcher/references/state-and-contract.md +1 -1
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-prototype/SKILL.md +1 -1
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-dev/SKILL.md +1 -1
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/SKILL.md +4 -3
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/android.md +1 -1
- 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
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/changelog.md +45 -27
- 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
- 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
- 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
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/harmony.md +1 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/ios.md +1 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-semver/SKILL.md +8 -0
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/SKILL.md +7 -7
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/references/checks-runtime.md +63 -59
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_base.sh +10 -1
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_capacity.sh +21 -23
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_db.sh +9 -1
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_docker.sh +20 -24
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_logs.sh +3 -3
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/SKILL.md +4 -2
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/references/api.md +1 -1
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/synthesize.py +1 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/SKILL.md +7 -5
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/references/platform-copy-examples.md +5 -3
- package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-dependency-choice/SKILL.md +140 -0
- package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-git-commit/SKILL.md +113 -0
- package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-shared/SKILL.md +17 -14
- package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-whiteboard-prototype/SKILL.md +1 -1
- package/templates/project/fullstack-monorepo/{CLAUDE.md.hbs → AGENTS.md.hbs} +1 -1
- package/src/sync-packs.js +0 -223
- package/src/sync-scene.js +0 -178
- package/templates/ai-tools/CLAUDE.md +0 -210
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-development.md +0 -115
- /package/templates/project/backend/{CLAUDE.md.hbs → AGENTS.md.hbs} +0 -0
- /package/templates/project/fullstack-monorepo/backend/{CLAUDE.md.hbs → AGENTS.md.hbs} +0 -0
- /package/templates/project/fullstack-monorepo/frontend/{CLAUDE.md.hbs → AGENTS.md.hbs} +0 -0
- /package/templates/project/web/{CLAUDE.md.hbs → AGENTS.md.hbs} +0 -0
|
@@ -1,71 +1,32 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: 新装依赖只选发布满 7 天的正式版。查各栈发布时间和命令见 skill dwy-dependency-choice。只在改依赖清单时注入。
|
|
3
|
+
paths:
|
|
4
|
+
- "**/package.json"
|
|
5
|
+
- "**/pnpm-lock.yaml"
|
|
6
|
+
- "**/yarn.lock"
|
|
7
|
+
- "**/package-lock.json"
|
|
8
|
+
- "**/pyproject.toml"
|
|
9
|
+
- "**/uv.lock"
|
|
10
|
+
- "**/requirements*.txt"
|
|
11
|
+
- "**/Podfile"
|
|
12
|
+
- "**/Package.swift"
|
|
13
|
+
- "**/Package.resolved"
|
|
14
|
+
- "**/build.gradle"
|
|
15
|
+
- "**/build.gradle.kts"
|
|
16
|
+
- "**/libs.versions.toml"
|
|
17
|
+
- "**/oh-package.json5"
|
|
18
|
+
- "**/pubspec.yaml"
|
|
19
|
+
- "**/go.mod"
|
|
20
|
+
- "**/Cargo.toml"
|
|
21
|
+
- "**/Dockerfile"
|
|
22
|
+
- "**/Dockerfile.*"
|
|
3
23
|
---
|
|
4
24
|
|
|
5
|
-
#
|
|
25
|
+
# 依赖版本(硬约束)
|
|
6
26
|
|
|
7
|
-
|
|
8
|
-
>
|
|
9
|
-
> 适用**所有技术栈**:npm/pnpm、uv/pip、Docker、Android(Gradle/Maven)、iOS(CocoaPods/SPM)、鸿蒙(ohpm)、Flutter(pub) 以及未来出现的任何包管理器。下面给出总约束 + 各栈示例,未列出的栈按「查官方 registry 发布时间」通用流程自行判断。
|
|
27
|
+
只在新装或新选依赖、base 镜像、SDK 时遵守。已安装的旧版本不用为此升级。各栈怎么查发布时间见 skill `dwy-dependency-choice`。和本文件冲突时以该 skill 为准。
|
|
10
28
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
- 7 天是**下限排除条件**,不是「必须选最近一个 ≥7 天的版本」。最终选哪个稳定正式版由 AI 综合判断(成熟度、维护活跃度、依赖体积、与项目栈兼容性)。
|
|
16
|
-
|
|
17
|
-
## 二、核心约束
|
|
18
|
-
|
|
19
|
-
候选版本必须**同时**满足下面两条,缺一不可。给用户的 AskUserQuestion 选项同样只列合格版本,禁止把预发布号摆上去让用户选。
|
|
20
|
-
|
|
21
|
-
- **必须只选正式版**
|
|
22
|
-
- **禁止**采用预发布:版本号或 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`)
|
|
23
|
-
- 先滤掉预发布,再进入 7 天判断;预发布即使发布超过 7 天也不用
|
|
24
|
-
- **必须**在首次安装 / 选定版本前,查候选**正式版**的「首次发布时间」
|
|
25
|
-
- 用官方 registry 的发布时间,**不是**上传时间、**不是** `latest` / `stable` tag 时间
|
|
26
|
-
- **禁止**采用发布时间距今 **<7 天**的版本
|
|
27
|
-
- **禁止**无脑用 `@latest` / `latest` / `stable` / 浮动 tag / 不带版本号安装——这些随时可能落到刚发布的新版本或预发布通道上
|
|
28
|
-
- 已安装版本**无需**为此规则升级
|
|
29
|
-
|
|
30
|
-
## 三、各栈查发布时间示例
|
|
31
|
-
|
|
32
|
-
未列出的栈,按「查官方 registry 元数据 → 取发布时间」自行处理。查的对象必须是正式版,预发布条目直接跳过。
|
|
33
|
-
|
|
34
|
-
| 栈 | 查发布时间方法 |
|
|
35
|
-
|---|---|
|
|
36
|
-
| npm / pnpm | `npm view <pkg> time --json`(取目标版本对应的时间字段) |
|
|
37
|
-
| uv / pip | PyPI JSON API:`https://pypi.org/pypi/<pkg>/json` 的 `releases[<version>][0].upload_time` |
|
|
38
|
-
| Docker | Docker Hub 镜像页 / API 的 `last_updated`;优先看具体 tag 的 push 时间 |
|
|
39
|
-
| Android (Gradle/Maven) | Maven Central `maven-metadata.xml` 的 `<lastUpdated>`(格式 yyyyMMddHHmmss) |
|
|
40
|
-
| iOS (CocoaPods) | `https://github.com/CocoaPods/Specs` 或仓库 release / tag 时间 |
|
|
41
|
-
| iOS (SPM) | 源仓库 release / tag 时间 |
|
|
42
|
-
| 鸿蒙 (ohpm) | ohpm registry 包元数据 publishTime |
|
|
43
|
-
| Flutter (pub) | `https://pub.dev/packages/<pkg>/versions` 页 published 时间 |
|
|
44
|
-
|
|
45
|
-
## 四、正反例
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
# 反例:预发布,即使发布超过 7 天也不用
|
|
49
|
-
pnpm add some-pkg@1.3.0-beta.2
|
|
50
|
-
uv add some-pkg==2.0.0rc1
|
|
51
|
-
FROM node:23.0.0-rc
|
|
52
|
-
implementation 'com.example:lib:1.0.0-alpha'
|
|
53
|
-
|
|
54
|
-
# 反例:直接装 latest,可能落到昨天才发的正式版或预发布通道
|
|
55
|
-
pnpm add some-pkg@latest
|
|
56
|
-
uv add some-pkg # 不锁版本
|
|
57
|
-
FROM node:latest # 随时被新镜像覆盖
|
|
58
|
-
implementation 'com.example:lib:latest'
|
|
59
|
-
|
|
60
|
-
# 正例:正式版,且发布 ≥7 天
|
|
61
|
-
npm view some-pkg time --json # 看候选正式版发布时间
|
|
62
|
-
pnpm add some-pkg@1.2.3 # 1.2.3 是正式版,发布已满 7 天
|
|
63
|
-
FROM node:20.18.1-slim # 该 tag 是正式版,push 已满 7 天
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## 五、AI 自判提示
|
|
67
|
-
|
|
68
|
-
- 栈未列全时,先找该栈的**官方 registry**(包管理器背后的中央仓库),丢掉预发布条目,再查正式版发布时间字段。
|
|
69
|
-
- 拿不到精确发布时间时,保守处理:选发布更早、更稳定的正式版,不要选「最新」,更不要选 beta。
|
|
70
|
-
- 7 天窗口内的新正式版,**等待**而非采用,**无任何例外**(含安全补丁)。等满 7 天再用。
|
|
71
|
-
- 用户口头点名某个 beta / rc:**不要直接装**。说明本规则只选正式版,改给最近一个合格正式版让用户确认。
|
|
29
|
+
- 只选正式版。禁止 `beta` / `rc` / `alpha` / `preview` / `nightly` / `snapshot` / `canary` / `dev` / `experimental`,以及 registry 标成 pre-release 的号。预发布超过 7 天也不用。
|
|
30
|
+
- 正式版的首次发布须满 7 天,含安全补丁。7 天是排除线,不是必须选刚满 7 天的那个。
|
|
31
|
+
- 禁止 `@latest` / `latest` / `stable` / 浮动 tag / 不锁版本。
|
|
32
|
+
- 用户点名 beta 或 rc:不直接装,改给最近一个合格正式版确认。
|
package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md
CHANGED
|
@@ -1,224 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Git
|
|
2
|
+
description: Git 提交硬约束(先同步远程、敏感信息、message 格式、AI 署名)。命令和冲突步骤见 skill dwy-git-commit。无 paths,每次注入;不提交时忽略。
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
# Git
|
|
5
|
+
# Git 提交(硬约束)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
只在本次任务包含提交、commit message、`git pull` / rebase 冲突、提交前检查时遵守。只改代码、不提交时忽略本文件。命令、冲突步骤、敏感名单见 skill `dwy-git-commit`。和本文件冲突时以该 skill 为准。
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
- 为提交生成或校验 commit message 的场景
|
|
15
|
-
|
|
16
|
-
项目按多人协作处理:本地未基于最新远程提交前,禁止产生新 commit。
|
|
17
|
-
|
|
18
|
-
任一步骤不通过:中止当前提交流交付流程。
|
|
19
|
-
|
|
20
|
-
## 2. 执行顺序(硬约束)
|
|
21
|
-
|
|
22
|
-
1. 拉取远程并处理完全部冲突
|
|
23
|
-
2. 安全写法检查
|
|
24
|
-
3. Stage 级敏感扫描
|
|
25
|
-
4. 变更范围确认
|
|
26
|
-
5. Scope 与 message 格式校验
|
|
27
|
-
6. AI 署名与生成声明校验
|
|
28
|
-
|
|
29
|
-
## 3. 提交前同步远程(强制)
|
|
30
|
-
|
|
31
|
-
多人同时改同一仓库。未拉远程就提交,会把过期基线写进历史,后续推送非快进或把冲突甩给别人。
|
|
32
|
-
|
|
33
|
-
**未完成同步、冲突未清零:禁止 `git commit`。**
|
|
34
|
-
|
|
35
|
-
### 3.1 命令
|
|
36
|
-
|
|
37
|
-
先 fetch,再 rebase 到上游。工作区有未提交改动时必须带 `--autostash`,禁止为了拉代码丢弃本地改动。
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
git fetch origin
|
|
41
|
-
git pull --rebase --autostash
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
当前分支已设置上游时,上面两条即可。未设置上游但远程存在同名分支:
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
git fetch origin
|
|
48
|
-
git pull --rebase --autostash origin "$(git branch --show-current)"
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
无 `origin` 时,对实际存在的 remote 执行同等操作。
|
|
52
|
-
|
|
53
|
-
### 3.2 冲突处理
|
|
54
|
-
|
|
55
|
-
同步产生冲突后,必须先处理完,才能做新提交:
|
|
56
|
-
|
|
57
|
-
1. 打开全部冲突文件,逐处消解 `<<<<<<<` / `=======` / `>>>>>>>`。
|
|
58
|
-
2. `git add` 已解决文件。
|
|
59
|
-
3. rebase 进行中:`git rebase --continue`(不要另开 `git commit` 顶掉 rebase)。
|
|
60
|
-
4. stash 弹出后再次冲突:同样消解并 `git add`。
|
|
61
|
-
5. 全库确认无冲突标记、无 `REBASE_HEAD` / 未结束 merge,再进入后续检查与 `git commit`。
|
|
62
|
-
|
|
63
|
-
禁止用 `git rebase --abort` / `git merge --abort` 躲冲突后直接提交。
|
|
64
|
-
|
|
65
|
-
### 3.3 可跳过的唯一情况
|
|
66
|
-
|
|
67
|
-
仅以下任一成立才可跳过同步:
|
|
68
|
-
|
|
69
|
-
- 仓库没有任何 remote
|
|
70
|
-
- `git fetch` 后当前分支在所有 remote 上都不存在对应分支(全新本地分支,远程无同名分支)
|
|
71
|
-
|
|
72
|
-
跳过时在回复里写明原因。其余情况一律同步。
|
|
73
|
-
|
|
74
|
-
### 3.4 失败即停
|
|
75
|
-
|
|
76
|
-
| 情况 | 处理 |
|
|
77
|
-
| --- | --- |
|
|
78
|
-
| fetch / pull 网络失败 | 中止提交,不得在「不知是否落后」时 commit |
|
|
79
|
-
| 仍有冲突标记或 rebase/merge 未结束 | 中止提交 |
|
|
80
|
-
| 已落后远程却未 rebase 完成 | 中止提交 |
|
|
81
|
-
|
|
82
|
-
### 3.5 禁止借口
|
|
83
|
-
|
|
84
|
-
| 借口 | 处理 |
|
|
85
|
-
| --- | --- |
|
|
86
|
-
| 改动很小不用拉 | 改动大小与是否落后无关,先拉 |
|
|
87
|
-
| 刚才 / 早上拉过了 | 每次准备 commit 前重新 fetch |
|
|
88
|
-
| 先提交再拉 | 顺序写死:先同步,再 commit |
|
|
89
|
-
| 有冲突先把本地提交保住 | 冲突未清零禁止新 commit |
|
|
90
|
-
| 远程大概没人推 | 必须 fetch,不许猜 |
|
|
91
|
-
| 用 force push 顶掉远程 | 禁止用强推代替拉取与消冲突 |
|
|
92
|
-
|
|
93
|
-
## 4. 安全写法(命令注入防护)
|
|
94
|
-
|
|
95
|
-
`git commit -m "..."` 会对双引号内内容做 shell 展开。出现反引号或 `$(...)` 时,禁止直接使用双引号形式。
|
|
96
|
-
|
|
97
|
-
### 4.1 推荐:消息文件提交(优先)
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
git commit -F /tmp/commit-msg.txt
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
cat > /tmp/commit-msg.txt <<'EOF'
|
|
105
|
-
feat: 示例提交说明
|
|
106
|
-
|
|
107
|
-
- 修改点 A
|
|
108
|
-
- 修改点 B
|
|
109
|
-
EOF
|
|
110
|
-
git commit -F /tmp/commit-msg.txt
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### 4.2 允许:单引号提交
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
git commit -m 'feat: 支持 runConcurrent'
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
前提:message 内无单引号字符。
|
|
120
|
-
|
|
121
|
-
### 4.3 禁止:双引号直接携带反引号
|
|
122
|
-
|
|
123
|
-
```bash
|
|
124
|
-
git commit -m "feat: run `build-tool`"
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
上例存在命令替换风险。
|
|
128
|
-
|
|
129
|
-
### 4.4 兜底:转义(不推荐)
|
|
130
|
-
|
|
131
|
-
```bash
|
|
132
|
-
git commit -m "feat: run \`build-tool\`"
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## 5. Stage 级敏感扫描(强制)
|
|
136
|
-
|
|
137
|
-
同时扫描:
|
|
138
|
-
- `git diff --cached`
|
|
139
|
-
- `git diff --cached --name-only`
|
|
140
|
-
|
|
141
|
-
### 5.1 禁止提交文件
|
|
142
|
-
|
|
143
|
-
`.env*`、`*.pem`、`*.key`、`*.p12`、`*.pfx`、`*.jks`、`*.keystore`、`*.sql`(真实数据)、`*.dump`、`*.sqlite`、`*.xlsx`、`*.csv`(敏感表)、`*.log`、`pgdata/`、`cache/*.json`。
|
|
144
|
-
|
|
145
|
-
### 5.2 禁止内容片段(示例)
|
|
146
|
-
|
|
147
|
-
`sk-` 开头 API Key、`AKIA` 开头 AWS Key、`ghp_` GitHub Token、`password=...`、`token=...`、`secret=...`、明文数据库连接串、私钥头、`IP:端口`、`ssh user@ip`。
|
|
148
|
-
|
|
149
|
-
### 5.3 例外
|
|
150
|
-
|
|
151
|
-
`.env.example`、环境变量读取方式、`localhost`/`127.0.0.1` 示例连接串可保留。
|
|
152
|
-
|
|
153
|
-
### 5.4 处理失败
|
|
154
|
-
|
|
155
|
-
1. 立即停止。
|
|
156
|
-
2. 输出 `文件名:行号:命中片段`。
|
|
157
|
-
3. 给出修复建议(`.gitignore`、改环境变量、替换占位符)。
|
|
158
|
-
4. 用户确认后继续;用户强制提交时,message body 追加:
|
|
159
|
-
- `GIT-SECURITY: 用户已确认提交此内容`
|
|
160
|
-
|
|
161
|
-
## 6. 变更范围与提交拆分
|
|
162
|
-
|
|
163
|
-
先执行 `git diff --cached`,明确:修改了哪些模块、影响边界、是否一次可归因。
|
|
164
|
-
|
|
165
|
-
若单条 message 无法在 `subject` 中清晰表达,必须拆分 commit。
|
|
166
|
-
|
|
167
|
-
## 7. Commit Scope
|
|
168
|
-
|
|
169
|
-
Scope 由 AI 根据变更模块与项目语义自行决定,保持与现有提交习惯一致且可读。
|
|
170
|
-
|
|
171
|
-
- 单模块改动:优先加 scope,名称贴近主改动模块(如 `eui` / `backend` / `cli` 等)。
|
|
172
|
-
- 跨模块改动:可不带 scope。
|
|
173
|
-
- 无法稳定归类:短期使用无 scope,避免强行造新约束。
|
|
174
|
-
|
|
175
|
-
## 8. Commit Message 规则
|
|
176
|
-
|
|
177
|
-
格式:
|
|
178
|
-
|
|
179
|
-
`<type>(<scope>): <subject>`
|
|
180
|
-
|
|
181
|
-
或
|
|
182
|
-
|
|
183
|
-
`<type>: <subject>`
|
|
184
|
-
|
|
185
|
-
或
|
|
186
|
-
|
|
187
|
-
`<type>!: <subject>`
|
|
188
|
-
|
|
189
|
-
或
|
|
190
|
-
|
|
191
|
-
`<type>(<scope>)!: <subject>`
|
|
192
|
-
|
|
193
|
-
`type` 限定为:`feat`、`fix`、`refactor`、`chore`、`docs`、`test`、`perf`、`style`、`ci`。
|
|
194
|
-
|
|
195
|
-
`subject` 规则:
|
|
196
|
-
|
|
197
|
-
- 中文、动宾短语。
|
|
198
|
-
- ≤72 字符。
|
|
199
|
-
- 不用句号、不用“了”。
|
|
200
|
-
- 不得含 emoji。
|
|
201
|
-
- 可选 body 仅说明 why,不要复述 what。
|
|
202
|
-
- 破坏性变更:`feat!:` / `fix!:`(带 scope 时写成 `feat(<scope>)!:` / `fix(<scope>)!:`) + `BREAKING CHANGE: ...`
|
|
203
|
-
|
|
204
|
-
## 9. AI 署名与生成声明治理
|
|
205
|
-
|
|
206
|
-
commit 的 subject、body、footer、trailer 中禁止出现任何形式的 AI 署名或生成声明。AI 应自行判断:凡由 AI 工具(Claude、ChatGPT、GPT、Copilot、Cursor、Gemini、Llama、LLM 等)生成或参与撰写的署名、尾随声明、自动生成标记,均不得写入 commit message。
|
|
207
|
-
|
|
208
|
-
包括但不限于:
|
|
209
|
-
|
|
210
|
-
- `Co-Authored-By: <AI 名称> <noreply@...>`(任何 AI 产品 + 邮箱组合)
|
|
211
|
-
- `Generated with Claude Code` / `Generated with ...`(任何"由 XX 生成"声明)
|
|
212
|
-
- 含 AI 产品名的署名行(Claude、ChatGPT、GPT、Copilot、Cursor、Gemini、LLM 等)
|
|
213
|
-
- AI 平台noreply 邮箱(noreply@anthropic.com、noreply@openai.com 等)
|
|
214
|
-
|
|
215
|
-
`git commit -m "..."` 不得附带 AI 署名 trailer。
|
|
216
|
-
|
|
217
|
-
> PreToolUse hook `pre-git-commit-ai-signature-check.sh` 会在 commit message 中检出 Co-Authored-By / Generated with 等 AI 署名模式时硬拦截(exit 2),规则约束 + 工程兜底双保险。
|
|
218
|
-
|
|
219
|
-
## 10. 参考示例
|
|
220
|
-
|
|
221
|
-
- `feat(eui): 添加 Image 组件懒加载支持`
|
|
222
|
-
- `refactor(backend): 提取分页逻辑为共享工具`
|
|
223
|
-
- `fix(eui)!: 重构 EDialog open 属性为 v-model:open`
|
|
224
|
-
- `BREAKING CHANGE: EDialog 不再接受 visible 属性,请改用 v-model:open`
|
|
9
|
+
1. 先 `git fetch origin`,再 `git pull --rebase --autostash`。冲突未清零禁止新 commit。没有 remote,或远程没有同名分支,可以跳过并写明原因。
|
|
10
|
+
2. message 用 `git commit -F` 或单引号。禁止双引号里带反引号或 `$(...)`。
|
|
11
|
+
3. 提交前看暂存区。密钥、证书、真实数据、明文连接串不进仓库。
|
|
12
|
+
4. 格式 `<type>(<scope>): <subject>`。`type` 只用 `feat` / `fix` / `refactor` / `chore` / `docs` / `test` / `perf` / `style` / `ci`。subject 用中文动宾,不超过 72 字。
|
|
13
|
+
5. 删掉 AI 署名和「由 AI 生成」声明,含环境自动塞入的 `Co-authored-by`。hook 拦住就删掉再交,不绕过。
|
|
@@ -1,128 +1,32 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: 闭源商用新装依赖的许可硬约束。声明模板和许可表见 skill dwy-dependency-choice。只在改依赖清单时注入。开源库仓库按该库自身许可证评估。
|
|
3
|
+
paths:
|
|
4
|
+
- "**/package.json"
|
|
5
|
+
- "**/pnpm-lock.yaml"
|
|
6
|
+
- "**/yarn.lock"
|
|
7
|
+
- "**/package-lock.json"
|
|
8
|
+
- "**/pyproject.toml"
|
|
9
|
+
- "**/uv.lock"
|
|
10
|
+
- "**/requirements*.txt"
|
|
11
|
+
- "**/Podfile"
|
|
12
|
+
- "**/Package.swift"
|
|
13
|
+
- "**/Package.resolved"
|
|
14
|
+
- "**/build.gradle"
|
|
15
|
+
- "**/build.gradle.kts"
|
|
16
|
+
- "**/libs.versions.toml"
|
|
17
|
+
- "**/oh-package.json5"
|
|
18
|
+
- "**/pubspec.yaml"
|
|
19
|
+
- "**/go.mod"
|
|
20
|
+
- "**/Cargo.toml"
|
|
21
|
+
- "**/Dockerfile"
|
|
22
|
+
- "**/Dockerfile.*"
|
|
3
23
|
---
|
|
4
24
|
|
|
5
|
-
#
|
|
25
|
+
# 商用依赖许可(硬约束)
|
|
6
26
|
|
|
7
|
-
|
|
8
|
-
> 许可不合规会带来版权/违约风险。本规则约束:选型禁区 + 强制署名时的声明义务。
|
|
27
|
+
闭源商用产品新装直接依赖时遵守。学习原型在上架或收费前补齐。当前仓库本身是对外开源库时,按该库自己的许可证评估,GPL 不因此自动禁止。附录模板和许可表见 skill `dwy-dependency-choice`。和本文件冲突时以该 skill 为准。
|
|
9
28
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
- **覆盖栈**:npm/pnpm、PyPI/uv、CocoaPods/SPM、Gradle/Maven、ohpm、pub、Docker 基础镜像、字体/图标/素材、模型权重与 SDK
|
|
15
|
-
- **声明范围**:仅 **直接依赖**;不强制盘传递依赖
|
|
16
|
-
|
|
17
|
-
## 二、核心原则(三条)
|
|
18
|
-
|
|
19
|
-
1. **先查许可,再装依赖** — 未确认 license 的包禁止引入
|
|
20
|
-
2. **明确不可商用 / 强 copyleft → 禁止直接使用** — 换可商用替代,或购买商业授权
|
|
21
|
-
3. **仅当许可强制要求署名 / NOTICE 时**,才在隐私协议附录中声明(含版本);**不强制署名的库不必写**
|
|
22
|
-
|
|
23
|
-
## 三、禁止引入(不可商用 / 高法律风险)
|
|
24
|
-
|
|
25
|
-
以下类型**默认禁止**写入依赖树(直接依赖必须查;已知会把禁区 license 顶进运行时链接的包也不得引):
|
|
26
|
-
|
|
27
|
-
| 类型 | 常见标识 | 原因 |
|
|
28
|
-
|---|---|---|
|
|
29
|
-
| 明确非商业 | `CC-BY-NC*`、`CC-NC`、`PolyForm-Noncommercial`、许可证写 Non-Commercial / No Commercial Use | 商用即侵权 |
|
|
30
|
-
| 强传染 copyleft(闭源商用) | `GPL-2.0`、`GPL-3.0`、`AGPL-3.0`、`SSPL` | 可能强制整包开源或限制网络服务形态;**闭源商用一律禁止** |
|
|
31
|
-
| 限制竞争/生产用途 | `BUSL`(未到 Change Date 且限制 Production)、Commons Clause、部分 Source-Available | 表面开源,实则禁商用或禁竞争 |
|
|
32
|
-
| 仅免费个人/评估 | 字体/图标/SDK 写 "free for personal use only"、"evaluation only" | 商用需买授权 |
|
|
33
|
-
| 无 license / 自定义模糊条款 | 仓库无 LICENSE、或 "all rights reserved" 却当开源用 | 默认不可用 |
|
|
34
|
-
|
|
35
|
-
### 例外(必须显式记录)
|
|
36
|
-
|
|
37
|
-
- 已购买**商业授权**且合同覆盖当前用途 → 可引入,记录授权方、合同编号、到期日
|
|
38
|
-
- LGPL 等边界许可 → 不得默认通过,须单独评估后再定
|
|
39
|
-
|
|
40
|
-
### 选型动作(强制)
|
|
41
|
-
|
|
42
|
-
引入新依赖时在选型对比中增加一列 **License**,并标注:
|
|
43
|
-
|
|
44
|
-
- `OK-商用`(可商用;若无强制署名义务则声明页可不写)
|
|
45
|
-
- `OK-商用+强制署名`(MIT/BSD/Apache-2.0/ISC 等要求保留版权与许可声明 → 须进隐私协议附录)
|
|
46
|
-
- `OK-商用+额外义务`(如 Apache NOTICE、MPL 文件级 copyleft 等 → 按义务处理,署名类进附录)
|
|
47
|
-
- `禁-不可商用/高风险`(上表)→ **不得推荐为默认项**
|
|
48
|
-
|
|
49
|
-
## 四、强制署名时的声明义务
|
|
50
|
-
|
|
51
|
-
### 4.1 何时必须声明(仅此场景)
|
|
52
|
-
|
|
53
|
-
直接依赖的 license **明确要求** attribution / copyright notice / NOTICE / 保留许可文本时,必须声明。
|
|
54
|
-
|
|
55
|
-
**不强制署名则不写**:无保留声明义务的可商用库,不必塞进隐私协议或开源列表。
|
|
56
|
-
|
|
57
|
-
### 4.2 声明落点
|
|
58
|
-
|
|
59
|
-
- **唯一约定落点**:隐私协议 **附录**「第三方开源组件」
|
|
60
|
-
- 不与个人信息处理条款正文混写;附录与正文分节
|
|
61
|
-
- 若产品另有「关于 / 法律信息」页,可链到该附录,不替代附录本身
|
|
62
|
-
|
|
63
|
-
### 4.3 每条声明最低字段(强制)
|
|
64
|
-
|
|
65
|
-
| 字段 | 说明 | 示例 |
|
|
66
|
-
|---|---|---|
|
|
67
|
-
| 组件名 | 直接依赖包名 | `axios` |
|
|
68
|
-
| 版本 | **实际锁定版本**(lockfile / 构建锁定) | `1.7.9` |
|
|
69
|
-
| 许可证 | SPDX 标识 | `MIT` |
|
|
70
|
-
| 版权声明 | 来自 LICENSE / 包元数据 | `Copyright (c) 2014-present Matt Zabriskie` |
|
|
71
|
-
| 许可全文或链接 | 全文或稳定 URL | `https://opensource.org/licenses/MIT` |
|
|
72
|
-
|
|
73
|
-
**版本必须写锁定版本**,禁止只写 `latest` 或不写版本。
|
|
74
|
-
|
|
75
|
-
### 4.4 声明模板(可直接贴进隐私协议附录)
|
|
76
|
-
|
|
77
|
-
```text
|
|
78
|
-
附录:第三方开源组件
|
|
79
|
-
|
|
80
|
-
本产品直接使用的、且许可证要求保留声明的开源组件如下:
|
|
81
|
-
|
|
82
|
-
1. axios 1.7.9
|
|
83
|
-
License: MIT
|
|
84
|
-
Copyright (c) 2014-present Matt Zabriskie
|
|
85
|
-
https://github.com/axios/axios/blob/v1.7.9/LICENSE
|
|
86
|
-
|
|
87
|
-
2. dayjs 1.11.13
|
|
88
|
-
License: MIT
|
|
89
|
-
Copyright (c) 2018-present, iamkun
|
|
90
|
-
https://github.com/iamkun/dayjs/blob/v1.11.13/LICENSE
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
仅列 **直接依赖 + 许可强制署名** 的项;无强制署名义务的直接依赖不列。
|
|
94
|
-
|
|
95
|
-
### 4.5 何时更新声明
|
|
96
|
-
|
|
97
|
-
- 新增/替换直接依赖,且其许可强制署名
|
|
98
|
-
- 已声明组件的主版本或锁定版本变更
|
|
99
|
-
- 发版前:附录中的版本 vs lockfile **必须一致**;已移除的组件从附录删掉
|
|
100
|
-
|
|
101
|
-
## 五、执行检查清单(引入依赖 / 发版前)
|
|
102
|
-
|
|
103
|
-
- [ ] 直接依赖均有明确 SPDX license(或等价官方许可文本)
|
|
104
|
-
- [ ] 无 NC / 非商业 / GPL / AGPL / SSPL / 评估版字体图标等禁区
|
|
105
|
-
- [ ] 无未评估的 LGPL / 商业授权到期风险
|
|
106
|
-
- [ ] 仅对「许可强制署名」的直接依赖写入隐私协议附录(含版本号)
|
|
107
|
-
- [ ] 不强制署名的库未滥写进附录
|
|
108
|
-
- [ ] 附录版本与 lockfile 一致
|
|
109
|
-
|
|
110
|
-
## 六、AI 行为约束
|
|
111
|
-
|
|
112
|
-
- 推荐开源方案时:**必须带 license 与商用结论**(OK / OK+强制署名 / 禁 / 需商业授权)
|
|
113
|
-
- 候选为 NC / GPL / AGPL / SSPL / 无 license:**不得作为推荐默认项**;列出可商用替代
|
|
114
|
-
- 生成/修改隐私协议时:扫描直接依赖,**只把强制署名的项**写入附录「第三方开源组件」
|
|
115
|
-
- 不得以「业界都在用」跳过 license 核查
|
|
116
|
-
- 不得把无强制署名义务的库整表刷进隐私协议
|
|
117
|
-
|
|
118
|
-
## 七、常见许可速查(非穷尽)
|
|
119
|
-
|
|
120
|
-
| SPDX | 商用闭源 | 是否强制进隐私协议附录 |
|
|
121
|
-
|---|---|---|
|
|
122
|
-
| MIT / ISC / BSD-2/3 | 可 | **是**(要求保留版权与许可声明) |
|
|
123
|
-
| Apache-2.0 | 可 | **是**(保留 NOTICE / 声明) |
|
|
124
|
-
| MPL-2.0 | 通常可 | 按义务;修改过的 MPL 文件另有开源义务 |
|
|
125
|
-
| LGPL-2.1/3.0 | 须单独评估 | 评估通过后再定声明 |
|
|
126
|
-
| GPL / AGPL / SSPL | **禁** | —(不得引入) |
|
|
127
|
-
| CC-BY-NC* | **禁** | —(不得引入) |
|
|
128
|
-
| 无 license | **禁** | —(不得引入) |
|
|
29
|
+
- 先查许可证再装。无 LICENSE,或 all rights reserved 却当开源用:禁止。
|
|
30
|
+
- 禁止直接依赖:`CC-BY-NC*`、`PolyForm-Noncommercial`、`GPL-2.0`、`GPL-3.0`、`AGPL-3.0`、`SSPL`、未到期且限制生产的 `BUSL`、Commons Clause、仅个人或评估可用的字体 / 图标 / SDK。
|
|
31
|
+
- LGPL 和已购商业授权不默认通过,单独记一笔再定。
|
|
32
|
+
- 只有许可证强制署名或 NOTICE 的直接依赖才写入隐私协议附录,并写 lockfile 里的版本。不强制署名的不写。
|
package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prod-branch.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 只有 develop 和 preview。develop 只发 beta/rc 到测试环境,正式版只从 preview 发。仓库没按这个来要先提醒。只在部署和发版相关文件上注入。
|
|
3
|
+
paths:
|
|
4
|
+
- "**/.github/workflows/**"
|
|
5
|
+
- "**/docker-compose*.yml"
|
|
6
|
+
- "**/docker-compose*.yaml"
|
|
7
|
+
- "**/compose.yml"
|
|
8
|
+
- "**/compose.yaml"
|
|
9
|
+
- "**/deploy*"
|
|
10
|
+
- "**/Dockerfile"
|
|
11
|
+
- "**/Dockerfile.*"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# 正式环境分支
|
|
15
|
+
|
|
16
|
+
只在部署、发版时遵守。日常改业务代码时忽略本文件。
|
|
17
|
+
|
|
18
|
+
只有两条长期分支,不另建 release / hotfix 分支。
|
|
19
|
+
|
|
20
|
+
- `develop`:开发,只更新测试环境。这里发出的版本只能是 `beta` 或 `rc`。还在改用 `beta`,准备进 `preview` 用 `rc`。
|
|
21
|
+
- `preview`:正式环境。只有这里发正式版,版本号不带 `-beta` / `-rc`。
|
|
22
|
+
|
|
23
|
+
仓库没有这两条分支,或正式环境不是从 `preview` 发:先提醒,不要自行建分支,不要把 `main` / `master` 当成 `preview`。
|
|
24
|
+
|
|
25
|
+
用 `develop` 部署正式环境,或在 `develop` 上打不带预发布的正式号:先停,按下面这段问。确认前不要做。
|
|
26
|
+
|
|
27
|
+
> 当前在 develop。develop 只更新测试环境,版本只能是 beta 或 rc。
|
|
28
|
+
> 正式版要到 preview 上发。
|
|
29
|
+
> 请确认这次是否仍要继续。
|
|
30
|
+
|
|
31
|
+
用户不确认:不要部署,不要打正式号。用户明确确认后,才可以继续这一次。
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: PostgreSQL 安全与配置规范(参数化查询、应用用户最小权限、连接池上限、SSL
|
|
2
|
+
description: PostgreSQL 安全与配置规范(参数化查询、应用用户最小权限、连接池上限、SSL、敏感字段按业务决定是否 AES-GCM)。只在后端和迁移文件上注入。
|
|
3
|
+
paths:
|
|
4
|
+
- "**/*.py"
|
|
5
|
+
- "**/alembic.ini"
|
|
6
|
+
- "**/alembic/**"
|
|
7
|
+
- "**/docker-compose*.yml"
|
|
8
|
+
- "**/docker-compose*.yaml"
|
|
3
9
|
---
|
|
4
10
|
|
|
5
11
|
# PostgreSQL 安全与配置规范
|
|
@@ -16,7 +22,7 @@ description: PostgreSQL 安全与配置规范(参数化查询、应用用户
|
|
|
16
22
|
| 应用用户权限 | 只授予 SELECT / INSERT / UPDATE / DELETE,**不给** DROP / CREATE / ALTER / SUPERUSER |
|
|
17
23
|
| 端口暴露 | **禁止**将 `5432` 直接暴露到公网;仅允许 VPC / 内网 / 跳板机访问 |
|
|
18
24
|
| 运行权限 | PostgreSQL 服务进程**禁止**以 `root` 用户运行,必须使用专用低权限系统用户 |
|
|
19
|
-
| 连接池 | `
|
|
25
|
+
| 连接池 | 没有实测时的冷启动先验:`pool_size` 20、`max_overflow` 10。有 `max_connections`、实例数和峰值连接后按实测定。无上限,或各实例合计能打满库的 `max_connections`,才算违规。大于 20 / 10 本身不是违规 |
|
|
20
26
|
| SSL 连接 | 生产环境启用 `sslmode=require` |
|
|
21
27
|
| 敏感字段加密 | 身份证号 / 银行卡 / 手机号原文等使用 AES 加密**存储**,不仅展示脱敏 |
|
|
22
28
|
| 迁移 | 通过 Alembic 管理 schema,**禁止**手动执行 DDL(详见 `dwy-db-migration` rule) |
|
|
@@ -67,16 +73,17 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
|
67
73
|
|
|
68
74
|
---
|
|
69
75
|
|
|
70
|
-
##
|
|
76
|
+
## 四、敏感字段
|
|
71
77
|
|
|
72
|
-
|
|
78
|
+
展示脱敏(详见 `dwy-python-backend` 7.4 响应安全)只管响应,不管落库。
|
|
73
79
|
|
|
74
|
-
|
|
75
|
-
- 银行卡号
|
|
76
|
-
- 手机号(视业务敏感等级)
|
|
77
|
-
- 真实姓名 + 地址组合(PII)
|
|
80
|
+
身份证号、银行卡号是否在写入前加密,由业务决定,不默认上 AES。要加密时:
|
|
78
81
|
|
|
79
|
-
|
|
82
|
+
- 用 AES-GCM(或同等认证加密)。不要用 ECB,不要只写「AES」不写模式。
|
|
83
|
+
- 密钥从环境变量或 KMS 读取,**禁止**和库备份放在一起。
|
|
84
|
+
- 加密后还要等值查询或建索引的字段,先说明方案再写。不要先加密再发现查不了。
|
|
85
|
+
|
|
86
|
+
手机号、姓名、地址默认落库明文,响应里脱敏。业务明确要求加密时再按上面三条做。
|
|
80
87
|
|
|
81
88
|
---
|
|
82
89
|
|
|
@@ -89,7 +96,7 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
|
89
96
|
| 超级用户跑应用 | 应用以 `postgres` 或其他超级用户身份连接 | **致命 → STOP** |
|
|
90
97
|
| 公网开放 5432 | 安全组 / 防火墙 / LB 允许公网直连 PostgreSQL 端口 | **致命 → STOP** |
|
|
91
98
|
| root 运行数据库 | PostgreSQL 服务进程以 `root` 身份运行 | **致命 → STOP** |
|
|
92
|
-
|
|
|
99
|
+
| 连接池 | 无上限,或各实例合计能打满 `max_connections`。大于先验 20/10 本身不是违规 | 高 |
|
|
93
100
|
| 无 SSL | 生产环境连接串无 `sslmode=require` | 高 |
|
|
94
101
|
| 敏感字段明文 | 身份证 / 银行卡等明文落库 | 高 |
|
|
95
102
|
| 硬编码连接串 | 连接串写死在代码中 | **致命 → STOP** |
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Redis 安全与使用规范(必须用 dwyeapi
|
|
2
|
+
description: Redis 安全与使用规范(必须用 dwyeapi 客户端、密码、绑定、危险命令禁用、缓存 key TTL 与前缀、敏感数据禁存)。只在后端代码上注入。
|
|
3
|
+
paths:
|
|
4
|
+
- "**/*.py"
|
|
5
|
+
- "**/redis.conf"
|
|
3
6
|
---
|
|
4
7
|
|
|
5
8
|
# Redis 安全与使用规范
|
|
@@ -54,7 +57,7 @@ Group=redis
|
|
|
54
57
|
|
|
55
58
|
| 规则 | 说明 |
|
|
56
59
|
|------|------|
|
|
57
|
-
|
|
|
60
|
+
| 缓存必须 TTL | 缓存、会话、限流计数**必须**设置过期时间(`ex` / `pexpire`)。故意不过期的 key(例如需要长期存在的配置)要在旁边写明原因 |
|
|
58
61
|
| 必须项目前缀 | 所有 key 必须有项目前缀,格式 `{app}:{domain}:{detail}`(如 `myapp:token:blacklist:abc123`) |
|
|
59
62
|
| snake_case | key 段用 snake_case,**禁止**驼峰或中文 |
|
|
60
63
|
| 不存敏感原文 | **禁止**存储密码、身份证、银行卡、token 原文(token 存哈希) |
|
|
@@ -64,7 +67,7 @@ Group=redis
|
|
|
64
67
|
```python
|
|
65
68
|
# 反例
|
|
66
69
|
await redis.set("abc123", "1") # 无前缀
|
|
67
|
-
await redis.set("myapp:
|
|
70
|
+
await redis.set("myapp:cache:user:uuid:f7e2", json_data) # 缓存无 TTL
|
|
68
71
|
await redis.set("myapp:user:password", "123456") # 存敏感原文
|
|
69
72
|
await redis.set("myapp:userToken", "ey...") # 驼峰命名
|
|
70
73
|
|