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,13 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dwy-dolphindb
|
|
3
|
-
description: "DolphinDB
|
|
3
|
+
description: "DolphinDB 开发与审查 skill:写 DolphinDB Script (.dos)、用与当前 server 配套的 Python SDK(一次常见配套是 dolphindb 3.0.4)、设计 DFS 分区表(TSDB/OLAP/PKEY/IMOLTP/VECTORDB 引擎选型)、导入 tick/snapshot/kline 金融数据、优化慢查询、排查 OOM / 卡死作业、Docker 部署、查询日期/字符串/聚合等内置函数、流计算、回测、集群运维。可基于项目级 .claude/dolphindb/schemas/ 真实 DDL 做查询性能评估。也用于代码审查:检查分区裁剪、链式比较、批量写入上限、SYMBOL 字节限制、STRING/BLOB 静默截断、输入校验防脚本注入、连接池配置、pool.run async/sync 用法。关键字触发:dolphindb, DDB, .dos, loadTable, loadTextEx, createPartitionedTable, append!, dropPartition, DBConnectionPool, tableAppender, PartitionedTableAppender, MultithreadedTableWriter, TSDB, OLAP, PKEY, IMOLTP, VECTORDB, getClusterPerf, getConsoleJobs, level2, tick 数据, 时序数据库, 8848 端口, 交易日历, 函数参考, K线合成, 流引擎, 回测引擎."
|
|
4
4
|
source_url_base: https://docs.dolphindb.cn/zh
|
|
5
5
|
fetched_at: 2026-05-19
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# DolphinDB 3.0 Skill
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## 某次实测环境(先验,不是所有任务的机器)
|
|
11
|
+
|
|
12
|
+
连哪台、内存、磁盘、端口、连接数以本次 `getClusterPerf()` 和 license 为准。下表是一次社区版小集群的记录。IP、已分配内存、磁盘和当前连接数不要套到别的机器。社区版许可常见 2 核 8G,许可变了以本次 license 为准。SDK 版本跟当前 server 的配套说明走,`3.0.4` 只是这次配套。
|
|
11
13
|
|
|
12
14
|
| 项 | 值 |
|
|
13
15
|
|---|---|
|
|
@@ -17,7 +19,7 @@ fetched_at: 2026-05-19
|
|
|
17
19
|
| 端口 | Web/控制 `http://localhost:8848`,集群另含 `192.168.0.107:8848` / `172.17.0.1:8848` 等 |
|
|
18
20
|
| Worker | 4 线程,连接上限 512(当前 15) |
|
|
19
21
|
| Python SDK | `dolphindb==3.0.4` |
|
|
20
|
-
| 场景 | 个人/小团队 +
|
|
22
|
+
| 场景 | 个人/小团队 + 教学,这次把单查询按 2GB 控制 |
|
|
21
23
|
|
|
22
24
|
## 文档分层(按访问顺序)
|
|
23
25
|
|
|
@@ -103,12 +105,12 @@ s.run("cancelJob(`xxxx)") // 异步作业
|
|
|
103
105
|
s.run("cancelConsoleJob(`xxxx)") // 同步作业
|
|
104
106
|
```
|
|
105
107
|
|
|
106
|
-
##
|
|
108
|
+
## 核心原则
|
|
107
109
|
|
|
108
|
-
1.
|
|
110
|
+
1. **单查询内存按这次机器的预算**:2 核 8G 上的先验是 2GB,详见 [[review-rules/perf-baselines]]。机器或许可不同就按本次内存重算,不要把 2GB 当所有集群的死刑线
|
|
109
111
|
2. **任何 WHERE 必带分区列**且不被函数包裹 / 不写链式比较
|
|
110
112
|
3. **TSDB sortColumns 不要选唯一/高基数列**(索引膨胀)
|
|
111
|
-
4. **写入用 PartitionedTableAppender + DBConnectionPool
|
|
113
|
+
4. **写入用 PartitionedTableAppender + DBConnectionPool**。pool size 按本次 worker,2 核 8G 的先验是 3
|
|
112
114
|
5. **删数据按分区 `dropPartition`**,不用 `delete from`
|
|
113
115
|
|
|
114
116
|
完整规则 → [[review-rules/lethal-violations]] + [[review-rules/anti-patterns]]
|
|
@@ -16,9 +16,9 @@ Python 应用接入 DolphinDB:建连、连接池、批量写入、流订阅、
|
|
|
16
16
|
|
|
17
17
|
## 安装与版本
|
|
18
18
|
|
|
19
|
-
- 包名 `dolphindb
|
|
20
|
-
-
|
|
21
|
-
- API 版本须匹配 server:1.30.x / 2.00.9 之前订阅需指定本地端口;2.00.9+
|
|
19
|
+
- 包名 `dolphindb`。版本跟当前 server 的发行说明走。`3.0.4`、Python 3.8–3.11 是一次配套先验,不是唯一合法安装。
|
|
20
|
+
- pip 失败或 server 拒绝客户端:查当前配套 wheel。该版本没有对应平台 wheel 时再走 conda 或源码。不要把新选定的版本写回本文件。
|
|
21
|
+
- API 版本须匹配 server:1.30.x / 2.00.9 之前订阅需指定本地端口;2.00.9+ 反向推送,端口参数忽略。先看这次 server 版本,再决定 `enableStreaming` 要不要端口。
|
|
22
22
|
|
|
23
23
|
## session.connect 关键参数
|
|
24
24
|
|
package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/digest/stream-engine.md
CHANGED
|
@@ -63,7 +63,7 @@ Python API:
|
|
|
63
63
|
import dolphindb as ddb
|
|
64
64
|
s = ddb.session()
|
|
65
65
|
s.connect("127.0.0.1", 8848, "admin", "123456")
|
|
66
|
-
s.enableStreaming(9999) #
|
|
66
|
+
s.enableStreaming(9999) # 2.00.9 之前要本机端口。2.00.9+ 反向推送,端口可省略。9999 只是示例
|
|
67
67
|
|
|
68
68
|
def handler(msg):
|
|
69
69
|
print(msg) # msg 为 list 或 DataFrame,取决于 msgAsTable
|
|
@@ -121,7 +121,7 @@ subscribeTable(
|
|
|
121
121
|
- **流计算函数限制**:响应式状态引擎只支持「状态函数」(内置滑窗/累积/topN 或 `@state` 修饰的自定义函数);普通自定义函数若有状态依赖必须显式声明 `@state`。
|
|
122
122
|
- **不支持聚合嵌套**:时序引擎 `metrics` 中禁止 `sum(spread(ask,bid))` 这种聚合套聚合。
|
|
123
123
|
- **窗口边界规整**:第一个窗口起点按数据时间向 step 取整(不是数据到达时间);窗口结束需要后续数据触发,最后一个不完整窗口不会被计算(除非用 `forceTriggerTime` / `closed=\`left` 等参数)。
|
|
124
|
-
- **Python
|
|
124
|
+
- **Python 订阅端口**:2.00.9 之前 `enableStreaming(port)` 监听的是**客户端**端口,需保证防火墙放行 server → client 方向;否则订阅创建成功但 handler 收不到数据。2.00.9+ 反向推送,不要再把示例端口 9999 当成必填。先看这次 server 版本。
|
|
125
125
|
- **offset 含义**:`-1` = 从订阅当下最新位置开始;`0` = 从流表第一条开始;正整数 = 从该位置开始。回测/补数据用 `0`,实盘用 `-1`。
|
|
126
126
|
- **outputTable 类型**:普通 table → 终点;share streamTable → 可被下游引擎再订阅串接。
|
|
127
127
|
|
package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/anti-patterns.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# DolphinDB 反模式与最佳实践
|
|
2
2
|
|
|
3
3
|
> 何时引用:审查 DDB 代码 / SQL / Python SDK 用法,命中具体反模式时引用对应章节。
|
|
4
|
-
>
|
|
4
|
+
> 来源:真实踩坑。语言语义以本文件为准,直到官方文档改写了这条语义。字节上限、分区数、行数以当前 server 文档和报错为准,下面的数字是当时的上限。
|
|
5
5
|
|
|
6
6
|
## 类型陷阱
|
|
7
7
|
|
|
@@ -55,6 +55,8 @@ DDB 和 Python/SQL **相反**!老手都踩过。要小数结果用 `\`。
|
|
|
55
55
|
|
|
56
56
|
### 5. SYMBOL ≤255 字节 / STRING 64KB / BLOB 64MB 静默截断(**1.30.23 / 2.00.11 起**)
|
|
57
57
|
|
|
58
|
+
255 字节、64KB、64MB 是这些版本起的已知上限。连上的 server 文档或实际报错不同,以那次为准。
|
|
59
|
+
|
|
58
60
|
| 类型 | 上限 | 超限行为 |
|
|
59
61
|
|---|---|---|
|
|
60
62
|
| `SYMBOL` | **≤ 255 字节** | **整批 append 直接抛异常**,写入失败 |
|
|
@@ -7,18 +7,18 @@
|
|
|
7
7
|
|
|
8
8
|
- [ ] WHERE 是否命中分区列?分区列是否被函数包裹(`year()` / `date()` / `temporalAdd()`)?
|
|
9
9
|
- [ ] 范围条件用了 `between ... and ...` 或两个独立条件?没有链式比较 `a <= col <= b`?
|
|
10
|
-
- [ ] 单次 `append`
|
|
10
|
+
- [ ] 单次 `append` 低于当前 server 的单消息上限?写作时常见约 500K 行,以本次报错为准。循环里有 `del + gc.collect()`?
|
|
11
11
|
- [ ] 大文件用 pyarrow `read_table + slice`,不是 `pd.read_feather` 全量加载?
|
|
12
12
|
- [ ] 拼接 DDB 脚本时,外部输入有正则白名单校验?(防注入)
|
|
13
13
|
- [ ] `pool.run()` 用 `await`(原生 async),`Session.run()` 用 `asyncio.to_thread()`?
|
|
14
|
-
- [ ]
|
|
14
|
+
- [ ] 连接池大小按本次 worker?2 核 8G、4 worker 的先验是 pool 3,不是所有集群的上限。
|
|
15
15
|
- [ ] `select` 只取需要的列?没有 `select *`?
|
|
16
16
|
- [ ] 多次聚合查询能否合并为一次?
|
|
17
17
|
- [ ] 多因子横向查询用了 `pivot by`,不是 Python 端 merge?
|
|
18
18
|
- [ ] backtick 列名定义在单行内?
|
|
19
19
|
- [ ] 分页用 `limit offset, count`(**不是** `LIMIT x OFFSET y`)?
|
|
20
|
-
- [ ]
|
|
21
|
-
- [ ] 写入 SYMBOL
|
|
20
|
+
- [ ] 新建库表:单分区估算大小落在引擎区间?总分区数低于该节点 `maxPartitionNumPerQuery`(默认常见 65536)?二级高基数列走 `HASH` 不是 `VALUE`?
|
|
21
|
+
- [ ] 写入 SYMBOL 列前校验当前版本字节上限(常见 255)?STRING/BLOB 有长度断言防静默截断?
|
|
22
22
|
- [ ] 删数据用 `dropPartition`,不是 `delete from`?
|
|
23
23
|
- [ ] pandas → DDB:`uint` 是否 `.astype('int64')`?NaN→int 是否 `.fillna(0)`?
|
|
24
24
|
- [ ] Session / Pool 有 `try/finally close()`?
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
# 10 条致命违规(零容忍)
|
|
2
2
|
|
|
3
|
-
> 何时引用:审查 DDB 代码 / SQL / Python SDK
|
|
4
|
-
>
|
|
3
|
+
> 何时引用:审查 DDB 代码 / SQL / Python SDK 用法。
|
|
4
|
+
> 分区剪枝、注入、连接池变量这些是语言约束,命中就要改。行数、字节、分区数是当时 server 的上限。官方文档或这次报错更准时,以那次为准,不要用本表压过当前版本文档。
|
|
5
5
|
|
|
6
6
|
| # | 违规 | 后果 |
|
|
7
7
|
|---|---|---|
|
|
8
8
|
| 1 | 分区列被函数包裹(`date(col)` / `year(col)` / `temporalAdd(col,...)`) | 全表扫 → OOM |
|
|
9
9
|
| 2 | 链式比较 `a <= col <= b` | 不触发剪枝 → 全表扫 |
|
|
10
|
-
| 3 | 单次 `append`
|
|
10
|
+
| 3 | 单次 `append` 超过当前 server 的单消息上限(写作时常见约 500K 行) | TSDB 报 `exceeds max limit`。不是永远 500K |
|
|
11
11
|
| 4 | 未校验外部输入拼到脚本 | 脚本注入 |
|
|
12
12
|
| 5 | 连接池里 upload + run(变量跨连接不可见) | 变量找不到 |
|
|
13
13
|
| 6 | `select *`(30+ 列全传) | 浪费带宽和内存 |
|
|
14
14
|
| 7 | 分页用 `LIMIT x OFFSET y` | DDB 不支持 OFFSET 关键字(要用 `limit offset, count`) |
|
|
15
15
|
| 8 | `asyncio.to_thread(pool.run, script)` | SDK v3 `pool.run` 已是原生 async |
|
|
16
|
-
| 9 | SYMBOL
|
|
17
|
-
| 10 |
|
|
16
|
+
| 9 | SYMBOL 列写入未校验当前版本字节上限(1.30.23 / 2.00.11 起常见 255 字节) | 整批写入失败。以本次 server 文档为准 |
|
|
17
|
+
| 10 | 单分区过小且总分区数超过该节点 `maxPartitionNumPerQuery`(默认常见 65536) | 触达查询分区上限。配置改过就用配置值 |
|
|
18
18
|
|
|
19
19
|
## 审查输出格式
|
|
20
20
|
|
package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/perf-baselines.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# 性能基线(DolphinDB 3.0 社区版 2 核 8G)
|
|
2
2
|
|
|
3
3
|
> 何时引用:评估查询/写入性能、判断是否需要优化、配置 dolphindb.cfg。
|
|
4
|
-
>
|
|
4
|
+
> 来源:一次 2 核 8G 社区版实测。有 `getClusterPerf`、license 或节点配置时以实测为准。偏离下表不是违规。超过表只说明要排查。
|
|
5
5
|
|
|
6
|
-
##
|
|
6
|
+
## 资源预算(这次 2 核 8G 的冷启动先验)
|
|
7
7
|
|
|
8
8
|
```
|
|
9
9
|
总内存 8 GB
|
|
@@ -29,7 +29,7 @@ where TradeDate between 2024.01.01 and 2024.01.05
|
|
|
29
29
|
|
|
30
30
|
## 配置调优(社区版 dolphindb.cfg)
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
下面是 2 核 8G 社区版的起点。许可或机器不同,按本次核数和内存重算,不要照抄。
|
|
33
33
|
|
|
34
34
|
| 参数 | 建议值 | 说明 |
|
|
35
35
|
|---|---|---|
|
|
@@ -54,7 +54,7 @@ where TradeDate between 2024.01.01 and 2024.01.05
|
|
|
54
54
|
| Python 拉 100 万行 → DataFrame | 2-5s |
|
|
55
55
|
| `PartitionedTableAppender` 写入 | 200-400 万行/s |
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
**比这张表慢 2-3 倍要排查**,不是判死刑:剪枝是否生效(`select [HINT_EXPLAIN]`)、索引是否覆盖、并发是否争抢同分区。机器不同,时延表本身就作废。
|
|
58
58
|
|
|
59
59
|
## 分区粒度目标
|
|
60
60
|
|
|
@@ -63,7 +63,7 @@ where TradeDate between 2024.01.01 and 2024.01.05
|
|
|
63
63
|
| TSDB | 400 MB - 1 GB |
|
|
64
64
|
| OLAP | 100 MB - 300 MB |
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
总分区数不要超过该节点的 `maxPartitionNumPerQuery`。默认常见 65536,配置改过就用配置值,不要死守 65536。
|
|
67
67
|
|
|
68
68
|
## 连接池大小
|
|
69
69
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dwy-eapi
|
|
3
|
-
description: "Use when building or changing FastAPI backends that use dwyeapi: Pydantic Settings, async SQLAlchemy, Redis, JWT/bcrypt, AppError/NotFoundError/BusinessError, ApiResponse/PageData, pagination, loguru, health checks, PII masking, timezone-aware dt, ARQ tasks, email verification codes, Gmail alias canonicalization. The single navigation skill for dwyeapi."
|
|
3
|
+
description: "Use when building or changing FastAPI backends that use dwyeapi: Pydantic Settings, async SQLAlchemy, Redis, JWT/bcrypt, AppError/NotFoundError/BusinessError, ApiResponse/PageData, pagination, loguru, health checks, PII masking, timezone-aware dt, ARQ tasks, email verification codes, Gmail alias canonicalization, common email-domain allowlist. The single navigation skill for dwyeapi."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# dwyeapi
|
|
@@ -71,7 +71,7 @@ editable 安装时这个路径就是消费方正在跑的代码,当作安装
|
|
|
71
71
|
| `shared/anticorruption.md` | 禁止直调 redis/jwt/logging |
|
|
72
72
|
| `v0/index.md` | 0.x 模块清单、接入、陷阱 |
|
|
73
73
|
| `v0/providers-email.md` | 邮件 Provider 注册表 |
|
|
74
|
-
| `v0/email-canonical.md` | Gmail 规范化(≥0.9.6) |
|
|
74
|
+
| `v0/email-canonical.md` | Gmail 规范化(≥0.9.6)+ 常见域名白名单 / 发码校验(≥0.10.0) |
|
|
75
75
|
| `v0/breaking.md` | 0.x 内部 breaking |
|
|
76
76
|
| `references/tasks-integration-guide.md` | 只用 tasks 时读 |
|
|
77
77
|
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
## 1. 安装
|
|
6
6
|
|
|
7
|
+
从公开 PyPI 安装已发布版本,无需源码仓库权限:
|
|
8
|
+
|
|
7
9
|
```bash
|
|
8
|
-
pip install dwyeapi[tasks]
|
|
9
|
-
# 或
|
|
10
|
-
uv add "dwyeapi[tasks]"
|
|
10
|
+
python -m pip install 'dwyeapi[tasks]'
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
`tasks` extra 包含 `arq` 异步任务队列依赖。运行时需要 Redis 实例。
|
|
14
14
|
|
|
15
15
|
## 2. 快速接入
|
|
16
16
|
|
|
@@ -8,5 +8,8 @@
|
|
|
8
8
|
|------|--------|
|
|
9
9
|
| 0.6.0 | 信封改为 `ApiResponse[T]` / `PageData[T]`;删除 `success` / `fail` / `paginated`;`code` 成功态从 int `200` 改为 `"SUCCESS"` |
|
|
10
10
|
| 0.9.0 | 删除 `MockEmailProvider`、`AliyunEmailProvider`、整个 `providers.sms`;`EMAIL__PROVIDER` 改为自由字符串;mock/阿里云改业务 `register_email_provider` |
|
|
11
|
+
| 0.10.0 | `send_code` 默认校验常见邮箱域名;非白名单抛 `EMAIL_DOMAIN_NOT_ALLOWED`。B2B 设 `EMAIL__REQUIRE_COMMON_DOMAIN=false` |
|
|
11
12
|
|
|
12
13
|
0.9.6 起新增 `dwyeapi.email` 与 Redis key 规范化,对旧调用方兼容(发码 key 折到同一收件箱)。能力下限见 `email-canonical.md`。
|
|
14
|
+
|
|
15
|
+
常见域名白名单:`send_code` 默认启用 `require_common_email_domain`(≥0.10.0,`EMAIL__REQUIRE_COMMON_DOMAIN=true`)。B2B 可关。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 邮箱规范化与常见域名白名单(≥0.9.6)
|
|
2
2
|
|
|
3
3
|
安装版本 `< 0.9.6`:没有 `dwyeapi.email`,不要 import。
|
|
4
4
|
|
|
@@ -9,10 +9,35 @@ canonicalize_email("Bai.Wen+1@Gmail.com") # baiwen@gmail.com
|
|
|
9
9
|
canonicalize_email("a.b@googlemail.com") # ab@gmail.com
|
|
10
10
|
canonicalize_email("a+x@icloud.com") # a+x@icloud.com
|
|
11
11
|
is_folded_alias("a+x@gmail.com") # True
|
|
12
|
-
is_folded_alias("A@gmail.com")
|
|
12
|
+
is_folded_alias("A@gmail.com") # False
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
- 注册查重、登录查找、用户表写入 **必须** 走 `canonicalize_email`
|
|
16
16
|
- Gmail 把 plus / 点号 / `googlemail.com` 当成同一收件箱,不折会开多个号、绕过发码冷却
|
|
17
17
|
- 其它域名只做 strip + lower,保留 `+` 与点
|
|
18
|
-
- `send_code` / `verify_code` 的 Redis key
|
|
18
|
+
- `send_code` / `verify_code` 的 Redis key 已自动规范化;发信信封仍用用户输入地址
|
|
19
|
+
|
|
20
|
+
## 常见域名白名单(≥0.10.0)
|
|
21
|
+
|
|
22
|
+
安装版本 `< 0.10.0`:没有 `is_common_email_domain`,不要 import。一次性邮箱会换马甲域,黑名单跟不上。
|
|
23
|
+
|
|
24
|
+
**`send_code` 默认校验**(`EMAIL__REQUIRE_COMMON_DOMAIN=true`)。不在白名单:抛 `BusinessError(code="EMAIL_DOMAIN_NOT_ALLOWED")`,不发信、不写 Redis。B2B 可关。
|
|
25
|
+
|
|
26
|
+
```python
|
|
27
|
+
from dwyeapi.email import require_common_email_domain
|
|
28
|
+
from dwyeapi.providers.email import EmailSettings
|
|
29
|
+
|
|
30
|
+
# 发码已默认走白名单;业务也可在注册/换绑再调一次
|
|
31
|
+
email = require_common_email_domain(raw)
|
|
32
|
+
|
|
33
|
+
# .env
|
|
34
|
+
# EMAIL__REQUIRE_COMMON_DOMAIN=true
|
|
35
|
+
# EMAIL__EXTRA_ALLOW_DOMAINS=chances.com.cn
|
|
36
|
+
# EMAIL__ALLOW_EDU=true
|
|
37
|
+
# EMAIL__ALLOW_EDU_CN=true
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- 精确匹配 `COMMON_EMAIL_DOMAINS`(qq / 163 / gmail / outlook / icloud / proton 等),`mail.qq.com` 不等于 `qq.com`
|
|
41
|
+
- 默认放行美国 `.edu`(`columbia.edu`)与 `edu.cn` / `*.edu.cn`;**不**放行 `edu.kg` / `edu.pl` 等国家教育后缀
|
|
42
|
+
- 企业 / 机构域用 `extra_allow` / `EMAIL__EXTRA_ALLOW_DOMAINS`(如 `chances.com.cn`),不要把公司域写进框架常量表
|
|
43
|
+
- 自定义 provider 的 factory 必须把 `require_common_domain` / `extra_allow_domain_list()` / `allow_edu` / `allow_edu_cn` 传给 `EmailProviderBase`
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
| `dt` | 中国时区时间工具 | ≥0.7 左右;`timedelta`/`after` ≥0.9.4 |
|
|
20
20
|
| `logger` | loguru | |
|
|
21
21
|
| `masking` | PII 脱敏 | |
|
|
22
|
-
| `email` | Gmail 规范化 | ≥0.9.6 |
|
|
22
|
+
| `email` | Gmail 规范化 + 常见域名白名单 | 规范化 ≥0.9.6;白名单 / 发码校验 ≥0.10.0 |
|
|
23
23
|
| `health` | 只探活健康检查 | ≥0.7.0 |
|
|
24
24
|
| `tasks` | ARQ 异步任务,需 `[tasks]` | ≥0.7 后 |
|
|
25
25
|
| `providers.email` | 邮件验证码,内置 resend | 工厂注册表 ≥0.9.0 |
|
|
@@ -100,4 +100,4 @@ app.include_router(create_health_router(service_name=settings.service_name, vers
|
|
|
100
100
|
### 邮件 / Gmail
|
|
101
101
|
|
|
102
102
|
- Provider:`v0/providers-email.md`
|
|
103
|
-
-
|
|
103
|
+
- 规范化 / 常见域名白名单:`v0/email-canonical.md`(规范化 ≥0.9.6;白名单 / 发码校验 ≥0.10.0)
|
|
@@ -13,7 +13,7 @@ from dwyeapi.providers.email import (
|
|
|
13
13
|
)
|
|
14
14
|
|
|
15
15
|
provider = make_email_provider(settings.email)
|
|
16
|
-
await provider.send_code("user@
|
|
16
|
+
await provider.send_code("user@qq.com")
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
自定义(**不用改 eapi**):
|
|
@@ -25,7 +25,16 @@ class TencentSesProvider(EmailProviderBase):
|
|
|
25
25
|
text = self._render_code_text(code)
|
|
26
26
|
return True
|
|
27
27
|
|
|
28
|
-
register_email_provider(
|
|
28
|
+
register_email_provider(
|
|
29
|
+
"tencent_ses",
|
|
30
|
+
lambda s: TencentSesProvider(
|
|
31
|
+
code_ttl=s.code_ttl,
|
|
32
|
+
require_common_domain=s.require_common_domain,
|
|
33
|
+
extra_allow_domains=s.extra_allow_domain_list(),
|
|
34
|
+
allow_edu=s.allow_edu,
|
|
35
|
+
allow_edu_cn=s.allow_edu_cn,
|
|
36
|
+
),
|
|
37
|
+
)
|
|
29
38
|
# .env: EMAIL__PROVIDER=tencent_ses
|
|
30
39
|
```
|
|
31
40
|
|
|
@@ -34,6 +43,7 @@ register_email_provider("tencent_ses", lambda s: TencentSesProvider(code_ttl=s.c
|
|
|
34
43
|
- 自定义同名二次注册会覆盖并 warning
|
|
35
44
|
- 必须在 `make_email_provider` **之前** register
|
|
36
45
|
- `send_code` / `verify_code` 的 Redis key 自 **0.9.6** 走 `canonicalize_email`;发信信封仍用用户输入地址
|
|
46
|
+
- `send_code` **默认**校验常见邮箱域名(`EMAIL__REQUIRE_COMMON_DOMAIN`,≥0.10.0);失败不发信。详见 `email-canonical.md`
|
|
37
47
|
- 缺 extra 构造内置 provider → `ImportError`,提示 `pip install dwyeapi[email-resend]`
|
|
38
48
|
|
|
39
49
|
0.9.0 删除了内置 mock / 阿里云占位 / 整个 sms 模块,见 `breaking.md`。
|
|
@@ -218,7 +218,7 @@ neutral(默认)| blue | green | rose | orange | violet | slate
|
|
|
218
218
|
| 场景 | 要求 |
|
|
219
219
|
|------|------|
|
|
220
220
|
| 布局壳 | `EAdminLayout` 375px 可开抽屉;顶栏不裁切 |
|
|
221
|
-
| 列表 |
|
|
221
|
+
| 列表 | 默认横滑。内容型列表(摘要、说明)用 `mobile-layout="stack"` 出卡片键值。操作密的后台表保持 `scroll`。**禁止**页面 `if (isMobile) 删 columns`。`EPagination` 默认 `mode="auto"` |
|
|
222
222
|
| 表单 | 标签置顶 / `EField orientation="responsive"` |
|
|
223
223
|
| 提示 | 禁止 hover-only 作为唯一入口(`ETooltip trigger="auto"`) |
|
|
224
224
|
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
### 安装组件库
|
|
8
8
|
|
|
9
|
+
从公开 npm 安装已发布版本,无需源码仓库权限:
|
|
10
|
+
|
|
9
11
|
```bash
|
|
10
12
|
pnpm add @dwydev/eui
|
|
11
13
|
```
|
|
@@ -128,6 +130,8 @@ import { EConfigProvider } from '@dwydev/eui'
|
|
|
128
130
|
|
|
129
131
|
locale 是一个扁平的键值对象,`name` 字段为 BCP 47 语言标签,控制日期类组件的本地化显示;其余字段为 UI 通用文案。
|
|
130
132
|
|
|
133
|
+
文案支持局部覆盖并与默认中文合并;运行期更新响应式生效。`name` 不会自动翻译 UI 文案,切换语言时应同时提供对应文案。`EDatePicker` 显式的 `placeholder`、`startPlaceholder`、`endPlaceholder`、`rangeSeparator` 优先于 locale,包括显式空字符串。
|
|
134
|
+
|
|
131
135
|
| 字段 | 默认值 | 说明 |
|
|
132
136
|
|------|--------|------|
|
|
133
137
|
| name | `'zh-CN'` | BCP 47 语言标签,控制 EDatePicker、ECalendar 等组件的月份名、星期名、年份格式 |
|
|
@@ -139,6 +143,10 @@ locale 是一个扁平的键值对象,`name` 字段为 BCP 47 语言标签,
|
|
|
139
143
|
| search | `'搜索'` | 搜索占位文案 |
|
|
140
144
|
| selectPlaceholder | `'请选择'` | 选择器默认占位文案 |
|
|
141
145
|
| inputPlaceholder | `'请输入'` | 输入框默认占位文案 |
|
|
146
|
+
| datePickerPlaceholder | `'请选择日期'` | 日期、月、年模式默认占位文案 |
|
|
147
|
+
| datePickerStartPlaceholder | `'开始日期'` | 区间起始占位文案 |
|
|
148
|
+
| datePickerEndPlaceholder | `'结束日期'` | 区间结束占位文案 |
|
|
149
|
+
| datePickerRangeSeparator | `'至'` | 区间占位及已选值分隔符 |
|
|
142
150
|
|
|
143
151
|
### 自定义配置示例
|
|
144
152
|
|
|
@@ -156,6 +164,10 @@ locale 是一个扁平的键值对象,`name` 字段为 BCP 47 语言标签,
|
|
|
156
164
|
search: 'Search',
|
|
157
165
|
selectPlaceholder: 'Please select',
|
|
158
166
|
inputPlaceholder: 'Please input',
|
|
167
|
+
datePickerPlaceholder: 'Pick a date',
|
|
168
|
+
datePickerStartPlaceholder: 'Start date',
|
|
169
|
+
datePickerEndPlaceholder: 'End date',
|
|
170
|
+
datePickerRangeSeparator: 'to',
|
|
159
171
|
}"
|
|
160
172
|
>
|
|
161
173
|
<RouterView />
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
- **必须**在 App 根包 `EConfigProvider`(locale / 默认尺寸 / zIndex)。缺了日期英文、z-index 乱、文案回退。
|
|
4
4
|
- `locale.name` 用 BCP 47(`zh-CN` / `en-US`),默认 `zh-CN`。
|
|
5
|
+
- `locale.name` 控制日历日期格式,不自动翻译 UI 文案;扁平文案表支持局部覆盖并与默认中文合并。
|
|
6
|
+
- `EDatePicker` 的 `datePickerPlaceholder`(日期/月/年)、`datePickerStartPlaceholder`、`datePickerEndPlaceholder`、`datePickerRangeSeparator` 默认依次为「请选择日期 / 开始日期 / 结束日期 / 至」,运行期更新立即生效。组件 `placeholder`、`startPlaceholder`、`endPlaceholder`、`rangeSeparator` 显式值优先,包括空串;分隔符同时用于空态和已选值。
|
|
5
7
|
- 类名合并走 `cn()`(clsx + tailwind-merge)。
|
|
6
8
|
- 主题走 `useTheme()` 的 `setColorTheme` / `toggleDark`,**不要**手改 `<html class="dark">`。
|
|
7
9
|
- 样式入口:`import '@dwydev/eui/theme'`。
|
|
@@ -4,3 +4,13 @@
|
|
|
4
4
|
- `ESelect` 的 `option.value` **不能是 `''`**,reka-ui 不支持。筛选项用哨兵(如 `'all'`),请求时再转 `undefined`。
|
|
5
5
|
- 校验优先 zod schema 交给 `EForm` 的 `rules`。
|
|
6
6
|
- `useFormField` 只在 `EFormItem` 内有值;表单外返回 `null`,不要当 vee-validate `<FormField>` 用。
|
|
7
|
+
|
|
8
|
+
## 表单对话框(EUI ≥2.7.0)
|
|
9
|
+
|
|
10
|
+
- `EForm :id="formId"` 与 `EFormDialog :form="formId"` 配对;`formId` 在页面内唯一,可用 Vue `useId()`。`id` 透传到 `EForm` 根 `<form>`,不是新 prop。
|
|
11
|
+
- 保存函数只绑定 `EForm @submit`:默认确认按钮通过原生 submit 进入 vee-validate 校验,通过后才触发 `submit`。不要同时绑定 `EFormDialog @confirm` 保存;关联 `form` 时不派发 `confirm`。
|
|
12
|
+
- `confirm-disabled` 只禁用默认确认按钮;`description` 提供可访问说明;`#footer-leading` 在默认按钮前追加操作,追加按钮显式设 `type="button"`。
|
|
13
|
+
- `loading` 阻止默认取消、确认、X、Esc、遮罩关闭;父组件仍可 `open=false`。业务提交函数仍需检查 loading,覆盖键盘或程序提交防重入。
|
|
14
|
+
- `#footer` 整体覆盖默认 footer 与 `#footer-leading`,自定义按钮行为由调用方负责。
|
|
15
|
+
- 旧项目不传 `form` 时保留 `@confirm`,默认确认为普通按钮;可继续手动 `validate()`。迁移时改为 `EForm @submit` 单入口。
|
|
16
|
+
- 程序提交使用 `requestSubmit()`;原生 `form.submit()` 会绕过 submit 事件与校验。完整 Vue 示例见仓库 `frontend/eui/README.md`。
|
|
@@ -37,6 +37,11 @@
|
|
|
37
37
|
|
|
38
38
|
## 2.x 陷阱
|
|
39
39
|
|
|
40
|
+
### EFormDialog(≥2.7.0)
|
|
41
|
+
|
|
42
|
+
- 新增原生表单关联:`EForm :id="formId"` + `EFormDialog :form="formId"` + `EForm @submit`;关联后不再派发 `confirm`。未传 `form` 的旧 `@confirm` 用法保持兼容。
|
|
43
|
+
- `confirm-disabled`、`description` 与 `#footer-leading` 用法和 loading 关闭边界见 `../shared/form.md`;精确签名仍按安装版本查询。
|
|
44
|
+
|
|
40
45
|
### 汉堡 / 抽屉
|
|
41
46
|
|
|
42
47
|
- `ESheet` / `EAdminLayout` 的 Boolean `open` / `mobileOpen` **缺省必须是 `undefined`**,不能是 `false`。`false` 会让非受控开关永远打不开(≥2.4.0)。
|
package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-architecture/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dwy-architecture
|
|
3
|
-
description: "【dwy·技术架构】产品 0 到 1 设计与架构阶段。触发场景:用户说『设计架构 / 出技术方案 / 设计库表 / 定接口契约 / 技术架构 / architecture
|
|
3
|
+
description: "【dwy·技术架构】产品 0 到 1 设计与架构阶段。触发场景:用户说『设计架构 / 出技术方案 / 设计库表 / 定接口契约 / 技术架构 / architecture』,要在开发前定下技术架构、数据库设计和接口契约时。按对应栈 dwy-*-layering(四层 + 单向依赖)+ 统一选型(Python+FastAPI、Vue+Vite)产出。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
## 职责(单一)
|
|
@@ -37,24 +37,21 @@ description: "【dwy·技术架构】产品 0 到 1 设计与架构阶段。触
|
|
|
37
37
|
- **CI/CD 走 GitHub Actions + OIDC**(发布鉴权用 OIDC,禁长期静态凭据)
|
|
38
38
|
- **基线不适用就先确认**:任一项基线与上下文冲突(如纯前端无需 Docker/DB、要换其他 DB/MQ/中间件、不能用某项)→ 先 `AskUserQuestion` 跟用户确认,确认后在架构文档写明偏离基线的理由
|
|
39
39
|
|
|
40
|
-
###
|
|
40
|
+
### 四层架构
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|---|---|---|---|
|
|
44
|
-
| **装配层 (Assembly)** | 实例化 / 依赖注入 / 路由挂载 / 生命周期,**零业务逻辑** | `src/app/`(main.py 装 Provider/Hook、factories) | `apps/web`(路由、stores、main.ts) |
|
|
45
|
-
| **Features (业务功能层)** | 各业务域领域逻辑,域内 router+service+schema+model **聚在同一目录** | `<域>/`(如 `factor/`、`plan/`、`quota/`) | `features/*`(如 auth、settings) |
|
|
46
|
-
| **业务基础层 (BizFoundation)** | 业务相关但跨业务域复用:鉴权、领域协议/Provider、领域设施 | `auth`、各包 `protocols.py`/`providers` | 跨域复用的业务 composable/store |
|
|
47
|
-
| **业务无关层 (Foundation)** | 与业务完全无关的 kernel | `shared`(DB/Redis/签名/中间件) | `core`(httpClient/格式化/常量) |
|
|
42
|
+
层名、依赖边、分包树以对应栈的 layering rule 为准,本 skill **不另定义目录**:
|
|
48
43
|
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
44
|
+
- Python → `dwy-python-layering`
|
|
45
|
+
- Vue → `dwy-vue-layering`
|
|
46
|
+
- Android → `dwy-android-layering`
|
|
47
|
+
- iOS / macOS → `dwy-apple-layering`
|
|
48
|
+
|
|
49
|
+
铁律(细节与正反例见上列 rule):依赖只许向下;`features/*` 互不依赖;具体实现只在 Assembly 注入;第三方版本只写在仓库根 catalog。
|
|
53
50
|
|
|
54
51
|
## 实现
|
|
55
52
|
[自写型]
|
|
56
53
|
1. 读项目 `.claude/rules/`,结合上方架构约束产出架构(项目 rules 优先,本约束兜底)
|
|
57
|
-
2.
|
|
54
|
+
2. 技术架构:**先读对应栈 `dwy-*-layering` 按四层归位模块、按业务域聚目录**,再写分层/模块边界/选型理由;选型不确定处走 `AskUserQuestion`
|
|
58
55
|
3. **判有无后端**(读选型/PRD:有 API / 持久化 / 账户体系 → 有后端):
|
|
59
56
|
- **有后端** → 必出数据库设计,且**建模到位**:库表清单 / 字段(类型·约束·默认·可空) / 主外键关系 / 索引 / 必要的范式或反范式说明,与接口契约 schema 对齐
|
|
60
57
|
- **纯前端**(无后端)→ 跳过数据库设计,在 `技术架构.md` 注明「无后端,不涉及库表」
|
|
@@ -64,7 +61,7 @@ description: "【dwy·技术架构】产品 0 到 1 设计与架构阶段。触
|
|
|
64
61
|
## 产出契约(硬约束)
|
|
65
62
|
- 落到:`.dwy/prod/[项目]/04-架构设计/技术架构.md`、`接口契约.md`,**有后端时**加 `数据库设计.md`
|
|
66
63
|
- 固定章节:
|
|
67
|
-
- 技术架构.md
|
|
64
|
+
- 技术架构.md:**按对应 `dwy-*-layering` 写四层划分 + 各业务域目录结构** / 模块边界 / 技术选型(按缺省基线写明 Python+FastAPI+uv+Alembic+pydantic-settings+JWT、前端 Vue+Vite+TS+Tailwind+pnpm+Pinia+axios+Playwright、CI/CD GitHub Actions OIDC;有 DB 写明 PostgreSQL+Redis+Docker+Nginx;偏离基线处写明原因)/ 选型不明或偏离基线处的 AskUserQuestion 确认记录 / 有无后端结论
|
|
68
65
|
- 数据库设计.md(**有后端必出**):库表清单 / 字段定义(类型·约束·默认·可空) / 主外键关系与索引 / 与接口契约对齐
|
|
69
66
|
- 接口契约.md:接口清单 / 请求响应 schema / 错误码
|
|
70
67
|
- 回写 state.json:`confirmed.architecture`
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
|
|
107
107
|
- 每个外部 skill 是**整个目录**(含 scripts/ 与配套 .md,不止 SKILL.md)
|
|
108
108
|
- 由 `dwy` 选「刷新全局外部 skill」安装/更新(clone 两仓库的指定 stable tag → 搬整目录 + LICENSE → 写 `VERSIONS.json`)
|
|
109
|
-
- `dwy
|
|
109
|
+
- `dwy` 日常同步自检:`~/.dwy/skills/` 缺失时自动装一次
|
|
110
110
|
- 当前 stable:pm-skills **v2.0.0** | superpowers **v6.0.3**(升级改 cli 的 `skills-install.js` 清单 tag)
|
|
111
111
|
- 原子 skill 运行时**只读** `~/.dwy/skills/<name>/`,缺失则提示用户先跑 `dwy`,选「刷新全局外部 skill」,不自己拉、不降级
|
|
112
112
|
|
package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-prototype/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dwy-prototype
|
|
3
|
-
description: "【dwy·UI原型】产品 0 到 1
|
|
3
|
+
description: "【dwy·UI原型】产品 0 到 1 的静态原型。触发场景:用户说『产品流程出原型 / 线框初稿 / 高保真平面图 / 0到1 原型』。两轮串行门控:先低保真线框,用户通过后再做高保真平面图。可交互白板、状态跳转连线不走本 skill,走 dwy-whiteboard-prototype。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
## 职责(单一)
|
package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-dev/SKILL.md
CHANGED
|
@@ -19,7 +19,7 @@ description: "【dwy·TDD开发阶段】产品 0 到 1 的第四阶段编排。
|
|
|
19
19
|
调度前**必须先分析每个任务的前后 block 关系**(由任务 Interfaces 推出:`Consumes`=被谁 block、`Produces`=block 谁)。判定铁律:
|
|
20
20
|
- **无 block 的任务 → 多 Agent 并行**
|
|
21
21
|
- **有 block 的任务 → 串行**,被 block 的下游必须等其所有前置 block 任务 done 才能启动
|
|
22
|
-
- 与 `ai-tools/
|
|
22
|
+
- 与 `ai-tools/AGENTS.md`「任务执行前必须先分析 block;无 block 的任务用多 Agent 并行」一致
|
|
23
23
|
|
|
24
24
|
### 第二步·agent 池调度
|
|
25
25
|
- 按 block 分析结果建 **ready 队列**(所有前置 block 已 done 的任务,即当前无 block 的)
|