create-dwy 0.9.1 → 0.11.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 (75) hide show
  1. package/package.json +3 -2
  2. package/src/create.js +5 -2
  3. package/src/prompts/grouped-checkbox.js +223 -0
  4. package/src/sync.js +45 -19
  5. package/templates/claude-global/hooks/pre-git-commit-sensitive-check.sh +0 -0
  6. package/templates/claude-global/rules/dwy-android-core.md +1 -0
  7. package/templates/claude-global/rules/dwy-db-migration.md +1 -0
  8. package/templates/claude-global/rules/dwy-flutter-core.md +1 -0
  9. package/templates/claude-global/rules/dwy-flutter-network.md +1 -0
  10. package/templates/claude-global/rules/dwy-flutter-router.md +1 -0
  11. package/templates/claude-global/rules/dwy-flutter-testing.md +1 -0
  12. package/templates/claude-global/rules/dwy-postgres.md +1 -0
  13. package/templates/claude-global/rules/dwy-python-backend.md +44 -3
  14. package/templates/claude-global/rules/dwy-python-core.md +36 -2
  15. package/templates/claude-global/rules/dwy-python-testing.md +1 -0
  16. package/templates/claude-global/rules/dwy-redis.md +1 -0
  17. package/templates/claude-global/rules/dwy-tdd-development.md +1 -0
  18. package/templates/claude-global/rules/dwy-vue-core.md +3 -43
  19. package/templates/claude-global/rules/dwy-vue-pinia.md +1 -0
  20. package/templates/claude-global/rules/dwy-vue-testing.md +1 -0
  21. package/templates/claude-global/skills/dwy-cibuildwheel/SKILL.md +355 -0
  22. package/templates/claude-global/skills/dwy-cibuildwheel/references/release-workflow-template.yml +99 -0
  23. package/templates/claude-global/skills/dwy-deploy-audit/SKILL.md +1 -0
  24. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_base.sh +0 -0
  25. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_capacity.sh +0 -0
  26. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_db.sh +0 -0
  27. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_docker.sh +0 -0
  28. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_env.sh +0 -0
  29. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_https.sh +0 -0
  30. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_logs.sh +0 -0
  31. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_nginx.sh +0 -0
  32. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_resilience.sh +0 -0
  33. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_secrets.sh +0 -0
  34. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_services.sh +0 -0
  35. package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_ssh.sh +0 -0
  36. package/templates/claude-global/skills/dwy-deploy-audit/scripts/run_all.sh +0 -0
  37. package/templates/claude-global/skills/dwy-dev-qa/SKILL.md +1 -0
  38. package/templates/claude-global/skills/dwy-docker/SKILL.md +1 -0
  39. package/templates/claude-global/skills/dwy-docker/scripts/query_dockerhub.py +0 -0
  40. package/templates/claude-global/skills/dwy-docker/scripts/scan_images.sh +0 -0
  41. package/templates/claude-global/skills/dwy-dolphindb/SKILL.md +123 -76
  42. package/templates/claude-global/skills/dwy-dolphindb/references/create-database-table.md +219 -0
  43. package/templates/claude-global/skills/dwy-dolphindb/references/crud-operations.md +281 -0
  44. package/templates/claude-global/skills/dwy-dolphindb/references/data-import.md +271 -0
  45. package/templates/claude-global/skills/dwy-dolphindb/references/docker-deployment.md +63 -0
  46. package/templates/claude-global/skills/dwy-dolphindb/references/performance-tuning.md +223 -0
  47. package/templates/claude-global/skills/dwy-dolphindb/references/pitfalls-and-best-practices.md +352 -0
  48. package/templates/claude-global/skills/dwy-dolphindb/references/python-api.md +306 -0
  49. package/templates/claude-global/skills/dwy-dolphindb/references/setup-and-connection.md +143 -0
  50. package/templates/claude-global/skills/dwy-dolphindb/references/sources.md +46 -0
  51. package/templates/claude-global/skills/dwy-dolphindb/references/sql-batch-compute.md +206 -0
  52. package/templates/claude-global/skills/dwy-eapi/SKILL.md +134 -402
  53. package/templates/claude-global/skills/dwy-ekit/SKILL.md +1 -0
  54. package/templates/claude-global/skills/dwy-eui/SKILL.md +1 -0
  55. package/templates/claude-global/skills/dwy-fullstack-scaffold/SKILL.md +14 -7
  56. package/templates/claude-global/skills/dwy-git-commit/SKILL.md +1 -0
  57. package/templates/claude-global/skills/dwy-mirror-source/SKILL.md +1 -0
  58. package/templates/claude-global/skills/dwy-mirror-source/scripts/apply_mirrors.py +0 -0
  59. package/templates/claude-global/skills/dwy-mirror-source/scripts/check_mirrors.py +0 -0
  60. package/templates/claude-global/skills/dwy-pentest/SKILL.md +1 -0
  61. package/templates/claude-global/skills/dwy-publish/SKILL.md +1 -0
  62. package/templates/claude-global/skills/dwy-tech-stack/SKILL.md +1 -0
  63. package/templates/project/fullstack-monorepo/CLAUDE.md.hbs +21 -9
  64. package/templates/project/fullstack-monorepo/backend/Dockerfile.prod +40 -0
  65. package/templates/project/fullstack-monorepo/backend/_env.example.hbs +26 -0
  66. package/templates/project/fullstack-monorepo/docker-compose.dev.yml.hbs +4 -4
  67. package/templates/project/fullstack-monorepo/docker-compose.prod.yml.hbs +116 -0
  68. package/templates/project/fullstack-monorepo/docs/.gitkeep +0 -0
  69. package/templates/project/fullstack-monorepo/frontend/_env.example.hbs +19 -0
  70. package/templates/project/fullstack-monorepo/{dev.sh.hbs → scripts/dev.sh.hbs} +2 -2
  71. package/templates/claude-global/skills/dwy-dolphindb/evals/evals.json +0 -67
  72. package/templates/claude-global/skills/dwy-dolphindb/references/dolphindb-rules.md +0 -441
  73. package/templates/claude-global/skills/dwy-eapi/references/health.md +0 -47
  74. package/templates/claude-global/skills/dwy-eapi/references/logger.md +0 -60
  75. package/templates/project/fullstack-monorepo/_env.example.hbs +0 -24
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: dwy-fullstack-scaffold
3
3
  description: "调用 dwy create CLI 生成全栈 Vue 3 + FastAPI monorepo 骨架,并完成 post-create 安装 + health check 编排。触发条件:用户说'创建新项目'、'搭骨架'、'新建全栈项目'、'fullstack monorepo'、'全栈脚手架'、'scaffold'、'开新项目'时。"
4
+ category: 脚手架
4
5
  ---
5
6
 
6
7
  # dwy-fullstack-scaffold
@@ -37,7 +38,8 @@ description: "调用 dwy create CLI 生成全栈 Vue 3 + FastAPI monorepo 骨架
37
38
  **推荐做法**:让用户在终端跑 `dwy create <project_name>` 自己回答交互(每次脚手架问题需要人 review),然后 skill 介入做 post-action。
38
39
  ↓
39
40
  4. 安装依赖(在 <target_parent_dir>/<project_name> 下):
40
- - cp .env.example .env (如未存在)
41
+ - cp backend/.env.example backend/.env (如未存在)
42
+ - cp frontend/.env.example frontend/.env (仅当 include_frontend=true 且未存在)
41
43
  - cd backend && uv sync --dev
42
44
  - cd frontend && pnpm install (仅当 include_frontend=true)
43
45
  ↓
@@ -62,14 +64,17 @@ description: "调用 dwy create CLI 生成全栈 Vue 3 + FastAPI monorepo 骨架
62
64
  ```
63
65
  <project_name>/
64
66
  ├── CLAUDE.md # 项目级总入口
65
- ├── dev.sh # 一键启动: 杀端口 + Docker + backend + frontend
66
- ├── docker-compose.dev.yml # PG + Redis(端口前缀 <port_prefix>xxxx)
67
- ├── .env.example
67
+ ├── scripts/
68
+ │ └── dev.sh # 一键启动: 杀端口 + Docker + backend + frontend
69
+ ├── docs/ # 设计文档占位
70
+ ├── docker-compose.dev.yml # dev: PG + Redis(端口前缀 <port_prefix>xxxx)
71
+ ├── docker-compose.prod.yml # prod: backend + db + redis(资源限制 + 日志轮转)
68
72
  ├── .gitignore
69
73
  ├── backend/
70
74
  │ ├── CLAUDE.md # 后端约束(域分包 / Provider / dwyeapi 优先)
75
+ │ ├── .env.example # backend 环境变量样例
71
76
  │ ├── pyproject.toml # uv workspace + 双 index + 版本中心
72
- │ ├── Dockerfile.dev
77
+ │ ├── Dockerfile.dev / Dockerfile.prod
73
78
  │ ├── alembic.ini + alembic/env.py
74
79
  │ ├── src/app/ # 装配层
75
80
  │ │ ├── main.py # FastAPI lifespan + register 业务包
@@ -91,6 +96,7 @@ description: "调用 dwy create CLI 生成全栈 Vue 3 + FastAPI monorepo 骨架
91
96
  │ └── tests/conftest.py
92
97
  └── frontend/ # 仅当 include_frontend=true
93
98
  ├── CLAUDE.md # 前端约束(eui 优先 / catalog / features 域分包)
99
+ ├── .env.example # Vite VITE_* 变量样例
94
100
  ├── package.json
95
101
  ├── pnpm-workspace.yaml # catalog 统一版本
96
102
  ├── tsconfig.base.json
@@ -157,8 +163,9 @@ description: "调用 dwy create CLI 生成全栈 Vue 3 + FastAPI monorepo 骨架
157
163
 
158
164
  🚀 下一步:
159
165
  cd /Users/chances/WebstormProjects/<project_name>
160
- cp .env.example .env # 修改 DATABASE_URL / SECRET_KEY 等
161
- ./dev.sh
166
+ cp backend/.env.example backend/.env # dev 默认值可直接用,prod 改 DATABASE_URL/SECRET_KEY
167
+ cp frontend/.env.example frontend/.env # Vite 变量(仅 include_frontend=true 时)
168
+ ./scripts/dev.sh
162
169
 
163
170
  🛠 业务开发起点:
164
171
  - backend: backend/src/app/main.py 装载 packages/<scope>-<domain>/
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: dwy-git-commit
3
3
  description: "Git commit 强制规范(敏感数据扫描 + message 格式 + 禁 AI 署名)。触发场景:用户说'提交' / 'commit' / 'git commit' / 'git add';AI 准备执行 `git add` / `git commit` 之前;用户让你帮忙写 commit message;review 已有 commit message。强制:先扫描暂存物是否含 .env / 密钥 / API Key / 连接串等敏感数据;再检查 CLAUDE.md 的 Git Commit Scope 段;subject 用中文动宾短语 ≤72 字符;message 任何位置禁止 Claude / GPT / Copilot / AI / LLM 字样及 Co-Authored-By trailer。"
4
+ category: 开发流程
4
5
  ---
5
6
 
6
7
  # Git Commit 强制规范
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: dwy-mirror-source
3
3
  description: "国内镜像源加速配置检查与修复:扫描 pip/uv/poetry/npm/pnpm/yarn/Docker/Go/Cargo/Maven/Gradle/Homebrew/Flutter 等 13 类工具的用户级和项目级配置,识别使用境外默认源或缺失配置的项,提供阿里云/清华/中科大镜像源切换。触发条件:用户说'检查镜像源'、'配置加速'、'换镜像源'、'mirror 检查'、'安装慢'、'下载慢' 时。"
4
+ category: 运维发布
4
5
  ---
5
6
 
6
7
  # 镜像源加速配置(mirror-source)
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: dwy-pentest
3
3
  description: "白帽渗透测试:对指定服务器执行全面安全评估。触发条件:用户说'渗透测试'、'pentest'、'安全测试'、'漏洞扫描'、'安全审计' 时。"
4
+ category: 安全
4
5
  ---
5
6
 
6
7
  # 白帽渗透测试
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: dwy-publish
3
3
  description: "发布版本:测试 → bump → changelog → build → publish → tag。触发条件:用户说'发版'、'发布'、'release'、'bump version' 时。"
4
+ category: 运维发布
4
5
  ---
5
6
 
6
7
  # 发布版本流程
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: dwy-tech-stack
3
3
  description: 跨栈技术选型强制约束(FastAPI / Vue 3 / Flutter / UV / pnpm / Docker / S3 / DolphinDB 等)。触发场景:用户提到「用什么 ORM / 缓存 / 状态管理 / 路由 / 包管理 / 组件库」/ 引入新依赖 / 替换现有库 / 调研选型 / 新项目初始化 / 架构评估;AI 准备执行 `pnpm add` / `uv add` / `pip install` / `flutter pub add` / `npm install` 前;讨论涉及后端 Web 框架、ORM、关系数据库、缓存、消息队列、异步任务、JWT / 密码哈希、Linter;前端 Vue 框架、构建工具、组件库、状态管理、样式方案、表单校验、测试;移动端 Flutter、状态管理、HTTP 客户端、路由、本地存储、代码生成;容器化、对象存储、时序数据库时。强制:每个领域只有唯一方案,AI 不得选替代,不得「建议改用 XX」。
4
+ category: 脚手架
4
5
  ---
5
6
 
6
7
  # 跨栈技术选型强制约束
@@ -8,11 +8,15 @@ Monorepo 全栈骨架:
8
8
 
9
9
  ```
10
10
  {{projectName}}/
11
- ├── backend/ # FastAPI 后端(uv workspace + 域分包)
12
- ├── frontend/ # Vue 3 前端(pnpm workspace + catalog)
13
- ├── docker-compose.dev.yml # PostgreSQL + Redis 基础设施
14
- ├── dev.sh # 一键启动脚本
15
- └── .env.example
11
+ ├── backend/ # FastAPI 后端(uv workspace + 域分包)
12
+ │ └── .env.example # backend 自己的环境变量样例
13
+ ├── frontend/ # Vue 3 前端(pnpm workspace + catalog)
14
+ │ └── .env.example # Vite VITE_* 变量样例
15
+ ├── scripts/ # 项目脚本
16
+ │ └── dev.sh # 一键启动 (Docker + backend + frontend)
17
+ ├── docs/ # 设计文档占位
18
+ ├── docker-compose.dev.yml # dev: PostgreSQL + Redis(端口前缀 {{portPrefix}}xxxx)
19
+ └── docker-compose.prod.yml # prod: backend + db + redis(含资源限制 + 日志轮转)
16
20
  ```
17
21
 
18
22
  详细约束见各子目录的 `CLAUDE.md`。
@@ -31,17 +35,25 @@ Monorepo 全栈骨架:
31
35
  ## 启动
32
36
 
33
37
  ```bash
34
- # 1. 复制环境变量
35
- cp .env.example .env
38
+ # 1. 复制环境变量(dev 环境通常不需要改默认值)
39
+ cp backend/.env.example backend/.env
40
+ cp frontend/.env.example frontend/.env
36
41
 
37
42
  # 2. 安装依赖
38
43
  cd backend && uv sync --dev && cd ..
39
44
  cd frontend && pnpm install && cd ..
40
45
 
41
46
  # 3. 一键启动(Docker + backend + frontend)
42
- ./dev.sh
47
+ ./scripts/dev.sh
43
48
  ```
44
49
 
50
+ dev 数据库默认 `postgres / postgres` 密码,docker-compose.dev.yml 内硬编码,
51
+ backend 通过 `DATABASE_URL` 连入(见 `backend/.env.example`)。
52
+
53
+ 生产部署:`docker compose -f docker-compose.prod.yml up -d --build`,
54
+ 凭据从 `backend/.env`(env_file)+ 根级 `POSTGRES_PASSWORD` / `REDIS_PASSWORD`
55
+ 环境变量传入。
56
+
45
57
  ## 常用命令
46
58
 
47
59
  ```bash
@@ -55,7 +67,7 @@ uv run ruff check src/ && uv run ruff format src/
55
67
  # Frontend
56
68
  cd frontend
57
69
  pnpm install
58
- pnpm dev # 单独启 frontend
70
+ pnpm dev # 单独启 frontend (端口 {{portPrefix}}5173)
59
71
  pnpm build
60
72
  pnpm typecheck
61
73
 
@@ -0,0 +1,40 @@
1
+ FROM python:3.11.15-slim AS builder
2
+
3
+ ENV PYTHONDONTWRITEBYTECODE=1 \
4
+ PYTHONUNBUFFERED=1 \
5
+ UV_LINK_MODE=copy \
6
+ UV_COMPILE_BYTECODE=1
7
+
8
+ RUN apt-get update && apt-get install -y --no-install-recommends \
9
+ build-essential curl \
10
+ && rm -rf /var/lib/apt/lists/*
11
+
12
+ # 安装 uv
13
+ COPY --from=ghcr.io/astral-sh/uv:0.4 /uv /usr/local/bin/uv
14
+
15
+ WORKDIR /app
16
+ COPY pyproject.toml uv.lock* ./
17
+ COPY packages ./packages
18
+ COPY src ./src
19
+ RUN uv sync --frozen --no-dev
20
+
21
+
22
+ FROM python:3.11.15-slim AS runtime
23
+
24
+ ENV PYTHONDONTWRITEBYTECODE=1 \
25
+ PYTHONUNBUFFERED=1 \
26
+ PATH="/app/.venv/bin:$PATH" \
27
+ PYTHONPATH=/app/src
28
+
29
+ RUN apt-get update && apt-get install -y --no-install-recommends \
30
+ libpq5 \
31
+ && rm -rf /var/lib/apt/lists/* \
32
+ && groupadd -r app && useradd -r -g app -d /app -s /usr/sbin/nologin app
33
+
34
+ WORKDIR /app
35
+ COPY --from=builder --chown=app:app /app /app
36
+
37
+ USER app
38
+ EXPOSE 8000
39
+
40
+ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]
@@ -0,0 +1,26 @@
1
+ # ============================================================
2
+ # {{projectName}} backend — 环境变量样例
3
+ # ============================================================
4
+ # 复制为 backend/.env 并填入真实值。.env 已 gitignored。
5
+ # dev 环境直接走 docker-compose.dev.yml(密码硬编码 postgres/postgres),
6
+ # 此文件主要供 prod 部署(docker-compose.prod.yml 的 backend env_file)。
7
+
8
+ # ── 基础 ──
9
+ ENVIRONMENT=prod
10
+ SECRET_KEY=change-me-in-production
11
+ LOG_LEVEL=INFO
12
+
13
+ # ── PostgreSQL ──
14
+ # dev: 默认连本地 docker-compose.dev.yml(127.0.0.1:{{portPrefix}}5432/{{projectName}}, postgres/postgres)
15
+ # prod: db 容器 service 名为 db(同 compose 网络下),端口仍是 5432
16
+ DATABASE_URL=postgresql+asyncpg://app_user:CHANGE_ME@db:5432/{{projectName}}
17
+
18
+ # ── Redis ──
19
+ REDIS_URL=redis://:CHANGE_ME@redis:6379/0
20
+
21
+ # ── 跨域 ──
22
+ ALLOWED_ORIGINS=https://example.com
23
+
24
+ # ── 服务端口 ──
25
+ # 容器内固定 8000,docker-compose.prod.yml 映射到宿主 127.0.0.1:{{portPrefix}}8002
26
+ BACKEND_PORT=8000
@@ -6,14 +6,14 @@ services:
6
6
  environment:
7
7
  TZ: Asia/Shanghai
8
8
  PGTZ: Asia/Shanghai
9
- POSTGRES_DB: ${POSTGRES_DB}
10
- POSTGRES_USER: ${POSTGRES_USER}
11
- POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
9
+ POSTGRES_DB: {{projectName}}
10
+ POSTGRES_USER: postgres
11
+ POSTGRES_PASSWORD: postgres
12
12
  command: ["postgres", "-c", "timezone=Asia/Shanghai"]
13
13
  volumes:
14
14
  - pgdata:/var/lib/postgresql/data
15
15
  healthcheck:
16
- test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
16
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
17
17
  interval: 5s
18
18
  timeout: 5s
19
19
  retries: 5
@@ -0,0 +1,116 @@
1
+ # {{projectName}} 生产 compose -- 三服务(backend + db + redis)+ 资源限制 + 日志轮转
2
+ #
3
+ # 部署假设:
4
+ # - 前端由宿主机全局 nginx 托管(静态文件在 /var/www/{{projectName}}/dist),
5
+ # 配置见 deploy/nginx/{{projectName}}.conf(用户自维护)。
6
+ # - backend 仅绑定 127.0.0.1:{{portPrefix}}8002,由宿主 nginx 反代上游。
7
+ # - 敏感凭据来自 backend/.env(env_file 引用),不要在 yml 硬编码。
8
+
9
+ x-logging: &default-logging
10
+ driver: json-file
11
+ options:
12
+ max-size: "10m"
13
+ max-file: "5"
14
+ compress: "true"
15
+
16
+ services:
17
+ backend:
18
+ image: {{projectName}}-backend:${BACKEND_TAG:-prod}
19
+ build:
20
+ context: ./backend
21
+ dockerfile: Dockerfile.prod
22
+ ports:
23
+ - "127.0.0.1:{{portPrefix}}8002:8000"
24
+ env_file:
25
+ - ./backend/.env
26
+ depends_on:
27
+ db:
28
+ condition: service_healthy
29
+ redis:
30
+ condition: service_healthy
31
+ healthcheck:
32
+ test: ["CMD-SHELL", "python -c 'import httpx; httpx.get(\"http://127.0.0.1:8000/api/health\")'"]
33
+ interval: 10s
34
+ timeout: 5s
35
+ retries: 5
36
+ start_period: 10s
37
+ read_only: true
38
+ tmpfs:
39
+ - /tmp
40
+ mem_limit: 1g
41
+ logging: *default-logging
42
+ restart: unless-stopped
43
+
44
+ db:
45
+ image: postgres:16.12-alpine3.23
46
+ shm_size: 256m
47
+ environment:
48
+ TZ: Asia/Shanghai
49
+ PGTZ: Asia/Shanghai
50
+ POSTGRES_DB: {{projectName}}
51
+ POSTGRES_USER: ${POSTGRES_USER:-app_user}
52
+ POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD required}
53
+ # 1G 容器: shared_buffers=25%, effective_cache_size=75%
54
+ command:
55
+ - "postgres"
56
+ - "-c"
57
+ - "timezone=Asia/Shanghai"
58
+ - "-c"
59
+ - "max_connections=100"
60
+ - "-c"
61
+ - "shared_buffers=256MB"
62
+ - "-c"
63
+ - "effective_cache_size=768MB"
64
+ - "-c"
65
+ - "work_mem=4MB"
66
+ - "-c"
67
+ - "maintenance_work_mem=64MB"
68
+ - "-c"
69
+ - "log_min_duration_statement=500"
70
+ volumes:
71
+ - pgdata:/var/lib/postgresql/data
72
+ healthcheck:
73
+ test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-app_user} -d {{projectName}}"]
74
+ interval: 5s
75
+ timeout: 3s
76
+ retries: 5
77
+ mem_limit: 1g
78
+ logging:
79
+ driver: json-file
80
+ options:
81
+ max-size: "20m"
82
+ max-file: "10"
83
+ compress: "true"
84
+ # 生产环境不暴露端口
85
+ restart: unless-stopped
86
+
87
+ redis:
88
+ image: redis:7.4.9-alpine3.21
89
+ # maxmemory 256mb 是 Redis 进程自管上限;mem_limit 384m 给 RDB/AOF fork
90
+ # 的 COW 留 buffer,避免被宿主 OOM-killer 杀掉。
91
+ # AOF + RDB 双持久化:重启不丢业务数据(验证码/nonce/限流计数等)。
92
+ command: [
93
+ "redis-server",
94
+ "--requirepass", "${REDIS_PASSWORD:?REDIS_PASSWORD required}",
95
+ "--maxmemory", "256mb",
96
+ "--maxmemory-policy", "allkeys-lru",
97
+ "--appendonly", "yes",
98
+ "--appendfsync", "everysec",
99
+ "--save", "900 1",
100
+ "--save", "300 10"
101
+ ]
102
+ volumes:
103
+ - redisdata:/data
104
+ healthcheck:
105
+ test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "--no-auth-warning", "ping"]
106
+ interval: 5s
107
+ timeout: 3s
108
+ retries: 5
109
+ mem_limit: 384m
110
+ logging: *default-logging
111
+ # 生产环境不暴露端口
112
+ restart: unless-stopped
113
+
114
+ volumes:
115
+ pgdata:
116
+ redisdata:
@@ -0,0 +1,19 @@
1
+ # ============================================================
2
+ # {{projectName}} frontend — Vite 环境变量样例
3
+ # ============================================================
4
+ # 复制为 frontend/.env 并按需调整。.env 已 gitignored。
5
+ # Vite 约定:只有 VITE_ 前缀的变量会暴露给客户端 bundle。
6
+ #
7
+ # 多环境覆盖:
8
+ # .env 所有模式
9
+ # .env.local 所有模式(本地,gitignored)
10
+ # .env.development dev 模式
11
+ # .env.production prod 模式
12
+
13
+ # ── API 基础路径 ──
14
+ # dev: '/api'(走 vite.config.ts 的 proxy → http://127.0.0.1:{{portPrefix}}8001)
15
+ # prod: '/api' 或 'https://api.example.com'(由宿主 nginx 反代)
16
+ VITE_API_BASE_URL=/api
17
+
18
+ # ── 站点元信息 ──
19
+ VITE_APP_TITLE={{projectName}}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
4
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
5
5
  BACKEND_PORT={{portPrefix}}8001
6
6
  FRONTEND_PORT={{portPrefix}}5173
7
7
  BACKEND_PID=""
@@ -42,7 +42,7 @@ echo "▶ 启动 Docker 基础设施..."
42
42
  docker compose -f "$SCRIPT_DIR/docker-compose.dev.yml" up -d --remove-orphans
43
43
 
44
44
  echo "▶ 等待 PostgreSQL 就绪..."
45
- until docker compose -f "$SCRIPT_DIR/docker-compose.dev.yml" exec -T db pg_isready > /dev/null 2>&1; do
45
+ until docker compose -f "$SCRIPT_DIR/docker-compose.dev.yml" exec -T db pg_isready -U postgres > /dev/null 2>&1; do
46
46
  sleep 1
47
47
  done
48
48
 
@@ -1,67 +0,0 @@
1
- {
2
- "skill_name": "dwy-dolphindb",
3
- "evals": [
4
- {
5
- "id": 1,
6
- "prompt": "帮我写一个 Python 函数,把一个大 pandas DataFrame(约 200 万行 tick 数据)写入 DolphinDB 的 tickDB snapshots 表。表的分区列是 trade_date 和 order_book_id。函数接收 filepath(feather 格式)和 trade_date 参数。",
7
- "expected_output": "生成的代码必须使用 DDBSession 复用连接、分批次 ≤500K 行写入、每批后 del + gc.collect()、用 pyarrow 分片读取、外部输入经过校验、使用 run_ddb_with_data 或 session.upload_and_run。不能出现连接池 upload、单次 append 全部数据、pd.read_feather 全量加载。",
8
- "files": [],
9
- "assertions": [
10
- "代码中包含 BATCH_SIZE 且值 ≤ 500000",
11
- "代码中使用了 gc.collect()",
12
- "代码中没有使用 pd.read_feather 一次性读取大文件",
13
- "代码中使用了 DDBSession 或 run_ddb_with_data 而非连接池做 upload",
14
- "代码中包含对外部输入(如 trade_date、filepath)的校验逻辑"
15
- ]
16
- },
17
- {
18
- "id": 2,
19
- "prompt": "写一个 FastAPI 端点 /api/tick/query,接收 stock_code、start_date、end_date 参数,从 DolphinDB tickDB snapshots 表查询数据并返回。请直接写实现代码。",
20
- "expected_output": "生成的代码必须对输入参数校验、WHERE 条件直接命中分区列(trade_date 和 order_book_id)而不使用函数包裹、只 select 需要的列、使用 DolphinDB 分页语法 limit offset, count(而非 LIMIT OFFSET)、使用 PIVOT BY 或合并聚合查询减少往返。",
21
- "files": [],
22
- "assertions": [
23
- "WHERE 子句中没有 date()、month()、year() 等函数包裹分区列",
24
- "查询中没有 select *",
25
- "分页语法是 limit {offset}, {page_size} 而不是 limit {page_size} offset {offset}",
26
- "代码中包含输入校验(validate_stock_code 或类似逻辑)",
27
- "没有使用 asyncio.to_thread(pool.run)"
28
- ]
29
- },
30
- {
31
- "id": 3,
32
- "prompt": "审查以下代码是否符合 DolphinDB 开发规范,指出所有问题并给出修复后的代码:\n```python\nasync def import_tick_data(filepath: str, trade_date: str):\n df = pd.read_feather(filepath)\n script = f'append!{loadTable(\"dfs://tickDB\", \"snapshots\"), data}'\n await run_ddb(f'upload data = {df}')\n await run_ddb(script)\n return {\"status\": \"ok\"}\n\nasync def query_ticks(stock_code: str, start: str, end: str):\n script = (\n f'select * from loadTable(\"dfs://tickDB\", \"snapshots\") '\n f'where date(trade_date) >= {start} and date(trade_date) <= {end} '\n f'and order_book_id = \"{stock_code}\" '\n f'limit 100 offset 0'\n )\n return await run_ddb(script)\n```",
33
- "expected_output": "审查报告必须指出:1) pd.read_feather 全量加载问题;2) 连接池 upload + run 导致变量跨连接不可见;3) 未校验 filepath、trade_date、stock_code;4) date(trade_date) 函数包裹分区列导致全表扫描;5) select *;6) limit 100 offset 0 语法错误;7) 缺少 BATCH_SIZE 和 gc.collect()。每项必须给出修复代码。",
34
- "files": [],
35
- "assertions": [
36
- "输出中明确指出了 date(trade_date) 或分区列被函数包裹的问题",
37
- "输出中明确指出了 select * 的问题",
38
- "输出中明确指出了 limit 100 offset 0 语法错误",
39
- "输出中明确指出了连接池 upload + run 的问题",
40
- "输出中为每个问题都提供了修复后的代码片段"
41
- ]
42
- },
43
- {
44
- "id": 4,
45
- "prompt": "审查以下 DolphinDB 查询脚本是否能触发分区剪枝,并给出修复后的脚本:\n```sql\nselect * from loadTable(\"dfs://tickDB\", \"snapshots\")\nwhere 2022.12.01 <= TradeDate <= 2022.12.03\n and order_book_id = \"000001.SZ\"\n```",
46
- "expected_output": "审查必须指出:1) `2022.12.01 <= TradeDate <= 2022.12.03` 是链式比较,DolphinDB 不识别两端边界,无法做分区剪枝,会扫描全部分区;2) 给出修复方案:改为 `TradeDate between 2022.12.01 and 2022.12.03` 或拆成 `TradeDate >= 2022.12.01 and TradeDate <= 2022.12.03`;3) 同时指出 select * 浪费带宽,应只取需要的列。",
47
- "files": [],
48
- "assertions": [
49
- "输出中明确指出了链式比较无法触发分区剪枝",
50
- "输出中提供了 between ... and ... 或拆分为两个独立条件的修复方案",
51
- "输出中提到了 select * 的问题"
52
- ]
53
- },
54
- {
55
- "id": 5,
56
- "prompt": "帮我设计一张存储股票 tick 数据的 DolphinDB 分布式表,每天约 5000 万条记录,覆盖国内 5000 只股票,使用 TSDB 引擎。给出分区方案并说明理由。",
57
- "expected_output": "方案必须:1) 一级 VALUE 分区按 TradeDate,二级用 HASH 分区按 SecurityID(约 20 桶),而不是 VALUE 分区,避免每天 5000+ 个小分区命中 maxPartitionNumPerQuery=65536 限制;2) 估算单分区大小(每天 3GB / 20 桶 ≈ 150MB,落在 TSDB 推荐区间 400MB~1GB 之下但仍可接受,或调整桶数让单分区更接近 400MB);3) 提醒分区方案一经确定无法调整;4) 提醒 SYMBOL 列 SecurityID 写入前需校验 ≤255 字节。",
58
- "files": [],
59
- "assertions": [
60
- "方案中二级分区使用 HASH 而非 VALUE",
61
- "方案中包含单分区大小估算并参考 TSDB 100MB~1GB 推荐区间",
62
- "方案中提到 maxPartitionNumPerQuery=65536 或避免分区数爆炸",
63
- "方案中提到 SYMBOL 列长度校验或 ≤255 字节限制"
64
- ]
65
- }
66
- ]
67
- }