@wdyy/skills 0.1.12 → 0.1.13

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 (19) hide show
  1. package/.well-known/skills/index.json +2 -2
  2. package/.well-known/skills/wdyy-deployment-standard/SKILL.md +30 -46
  3. package/.well-known/skills/wdyy-deployment-standard/agents/openai.yaml +2 -2
  4. package/.well-known/skills/wdyy-deployment-standard/reference/docker-delivery-rules.md +103 -0
  5. package/.well-known/skills/wdyy-deployment-standard/scripts/generate-deployment-files.mjs +138 -155
  6. package/.well-known/skills/wdyy-deployment-standard/scripts/generate-deployment-files.test.mjs +97 -97
  7. package/.well-known/skills/wdyy-deployment-standard/scripts/validate-deployment-package.mjs +93 -116
  8. package/.well-known/skills/wdyy-deployment-standard/scripts/validate-deployment-package.test.mjs +185 -311
  9. package/.well-known/skills/wdyy-deployment-standard/templates/{Dockerfile.template → backend.Dockerfile.template} +5 -9
  10. package/.well-known/skills/wdyy-deployment-standard/templates/deploy.sh.template +210 -256
  11. package/.well-known/skills/wdyy-deployment-standard/templates/docker-compose.yml +11 -13
  12. package/.well-known/skills/wdyy-deployment-standard/templates/dockerignore.template +1 -1
  13. package/.well-known/skills/wdyy-deployment-standard/templates/env.example.template +0 -19
  14. package/.well-known/skills/wdyy-deployment-standard/templates/frontend-container.conf.template +0 -6
  15. package/.well-known/skills/wdyy-deployment-standard/templates/frontend.Dockerfile.template +9 -4
  16. package/README.md +2 -2
  17. package/lib/wdyy-cli.js +2 -1
  18. package/package.json +1 -1
  19. package/.well-known/skills/wdyy-deployment-standard/reference/linux-deployment-rules.md +0 -99
@@ -1,35 +1,33 @@
1
1
  services:
2
2
  frontend:
3
- image: ${FRONTEND_IMAGE:?FRONTEND_IMAGE is required}
4
- env_file: ../../.env
3
+ image: "${PROJECT_NAME:?PROJECT_NAME is required}_frontend:latest"
4
+ env_file: ./.env
5
5
  environment:
6
- NGINX_ENVSUBST_FILTER: "^(FRONTEND_URL|FRONTEND_PORT|RELEASE_VERSION)$"
7
- RELEASE_VERSION: ${RELEASE_VERSION:?RELEASE_VERSION is required}
6
+ NGINX_ENVSUBST_FILTER: "^(FRONTEND_URL|FRONTEND_PORT)$"
8
7
  ports:
9
8
  - "${DOCKER_BIND_IP}:${FRONTEND_PORT}:${FRONTEND_PORT}"
10
9
  volumes:
11
- - ../../logs:/app/logs
10
+ - ./logs:/app/logs
12
11
  restart: unless-stopped
13
12
  healthcheck:
14
- test: ["CMD-SHELL", "probe_host=$${FRONTEND_URL}; [ \"$${probe_host}\" != 0.0.0.0 ] || probe_host=127.0.0.1; wget -qO- \"http://$${probe_host}:$${FRONTEND_PORT}/health\""]
13
+ test: ["CMD", "nginx", "-t"]
15
14
  interval: 10s
16
15
  timeout: 3s
17
16
  retries: 6
18
17
 
19
18
  backend:
20
- image: ${BACKEND_IMAGE:?BACKEND_IMAGE is required}
21
- env_file: ../../.env
19
+ image: "${PROJECT_NAME:?PROJECT_NAME is required}_backend:latest"
20
+ env_file: ./.env
22
21
  environment:
23
- HOST: ${BACKEND_URL}
24
- PORT: ${BACKEND_PORT}
25
- RELEASE_VERSION: ${RELEASE_VERSION:?RELEASE_VERSION is required}
22
+ HOST: "${BACKEND_URL}"
23
+ PORT: "${BACKEND_PORT}"
26
24
  ports:
27
25
  - "${DOCKER_BIND_IP}:${BACKEND_PORT}:${BACKEND_PORT}"
28
26
  volumes:
29
- - ../../logs:/app/logs
27
+ - ./logs:/app/logs
30
28
  restart: unless-stopped
31
29
  healthcheck:
32
- test: ["CMD-SHELL", "probe_host=$${BACKEND_URL}; [ \"$${probe_host}\" != 0.0.0.0 ] || probe_host=127.0.0.1; wget -qO- \"http://$${probe_host}:$${BACKEND_PORT}/health\""]
30
+ test: ["CMD-SHELL", "node -e \"const http=require('http');const r=http.get({host:'127.0.0.1',port:process.env.BACKEND_PORT,path:'/health'},x=>process.exit(x.statusCode===200?0:1));r.on('error',()=>process.exit(1));r.setTimeout(2500,()=>{r.destroy();process.exit(1)})\""]
33
31
  interval: 10s
34
32
  timeout: 3s
35
33
  retries: 6
@@ -14,4 +14,4 @@ node_modules/
14
14
  venv/
15
15
  .pnpm-store/
16
16
  .deploy-build.lock/
17
- .deploy-build.*
17
+ .deploy-build.*/
@@ -1,22 +1,3 @@
1
- # 前端
2
- FRONTEND_URL=0.0.0.0
3
- FRONTEND_PORT=5173
4
-
5
- # 后端
6
- BACKEND_URL=0.0.0.0
7
- BACKEND_PORT=3000
8
-
9
- # 数据库
10
- DB_URL=
11
- DB_PORT=5432
12
- DB_USER=
13
- DB_PASSWORD=
14
- DB_NAME=
15
- DB_SCHEMA=
16
-
17
- # API
18
-
19
- # 部署
20
1
  PROJECT_NAME=
21
2
  DOCKER_BIND_IP=
22
3
  FRONTEND_BASE_IMAGE=nginx:stable
@@ -12,12 +12,6 @@ server {
12
12
  return 200 'ok';
13
13
  }
14
14
 
15
- location = /version {
16
- access_log off;
17
- default_type text/plain;
18
- return 200 '${RELEASE_VERSION}';
19
- }
20
-
21
15
  location / {
22
16
  try_files $uri $uri/ /index.html;
23
17
  }
@@ -1,7 +1,12 @@
1
+ ARG BACKEND_BASE_IMAGE
1
2
  ARG FRONTEND_BASE_IMAGE
3
+ FROM ${BACKEND_BASE_IMAGE} AS build
4
+ WORKDIR /app
5
+ COPY . .
6
+ RUN corepack enable && pnpm install --frozen-lockfile
7
+ RUN pnpm --dir src/frontend build
8
+
2
9
  FROM ${FRONTEND_BASE_IMAGE}
3
- ARG RELEASE_VERSION
4
- ENV RELEASE_VERSION=${RELEASE_VERSION}
5
- LABEL org.opencontainers.image.version=${RELEASE_VERSION}
6
- COPY src/frontend/dist/ /usr/share/nginx/html/
10
+ LABEL org.opencontainers.image.title="wdyy-frontend"
11
+ COPY --from=build /app/src/frontend/dist/ /usr/share/nginx/html/
7
12
  COPY scripts/deployment/frontend-container.conf.template /etc/nginx/templates/default.conf.template
package/README.md CHANGED
@@ -18,7 +18,7 @@ OpenSpec 单项变更的需求、设计、任务、实
18
18
  | `wdyy-api-standard` | 根据“获取XX数据”“使用XX接口”等需求定位接口 reference,并按已确认契约写入调用方式。 |
19
19
  | `wdyy-bug-record` | 手动汇总当前任务已解决的问题,并按模板追加至 `docs/bug_record.md`。 |
20
20
  | `wdyy-logging-standard` | 结构化日志、敏感字段移除、traceId、前端异常上报与日志轮转。 |
21
- | `wdyy-deployment-standard` | 扩充标准五段环境配置,生成带版本前后端双镜像、人工上传、直接宿主机端口与服务器交互菜单部署文件;不使用蓝绿部署。 |
21
+ | `wdyy-deployment-standard` | 使用本地基础镜像构建前后端独立镜像,分别导出并统一压缩交付,远程数据库直连,服务器一键部署整个项目栈。 |
22
22
 
23
23
  ## 使用方式
24
24
 
@@ -43,7 +43,7 @@ wdyy update-skill --all
43
43
 
44
44
  `wdyy update-skill <skill-name>` 只接受 5 个受管理的 `wdyy-*` Skill,且仅替换系统用户目录 `.agents/skills/` 中的指定目录;`--all` 替换全部 5 个受管理 Skill。两种方式都不会写入调用项目的 `AGENTS.md`、`AGENTS_new.md`、`docs/bug_record.md` 或 `.agents/skills/`,也不会执行 `openspec init`。首次初始化或需要重新生成项目规则时,使用 `wdyy init`。
45
45
 
46
- 部署 Skill 生成的标准流程为:在本地项目根目录执行 `./deploy.sh build`,构建并导出 `<项目名>_frontend:<YYYYMMDD-NNN>` 与 `<项目名>_backend:<YYYYMMDD-NNN>`,人工上传完整 `deploy/` 内容作为服务器项目根目录;服务器无参数执行 `./deploy.sh`,选择运行或替换前端、运行或替换后端、运行或替换前后端,或同时停止两个服务。前后端直接暴露 `.env` 中的宿主机端口,不生成蓝绿服务或宿主机 Nginx 配置。应用、前端 Nginx 与部署操作日志均直接保存在服务器项目根目录 `logs/`。
46
+ 部署 Skill 生成的标准流程为:在本地项目根目录执行 `./deploy.sh build`,只使用本地已有的 Node、Nginx 基础镜像构建 `<项目名>_frontend:latest` 与 `<项目名>_backend:latest`,分别导出两个镜像 tar,并统一封装为 `deploy/<项目名>-docker.tar.gz`。工程师人工上传并解压该压缩包,服务器无参数执行 `./deploy.sh` 即校验、加载并整体部署前后端;另可执行 `./deploy.sh stop` 和 `./deploy.sh status`。数据库通过 `.env` 直连远程 PostgreSQL,不生成数据库容器;前后端直接暴露 `.env` 中的宿主机端口,日志直接保存在服务器部署根 `logs/`。
47
47
 
48
48
  中大型变更先使用 `/opsx:explore` 或 `/opsx:propose <change-name>`,在方案确认后使用 `/opsx:apply`;完成验证后使用 `/opsx:archive`。涉及数据库、内部 API、日志、部署时,按 `AGENTS.md` 的路由加载相应企业 Skill。所有 URL、端口和 IP 地址从 `.env` 读取,不得硬编码;所有项目管理的日志直接写入项目根目录 `logs/`;生产部署不使用蓝绿发布。不得提交秘密或生产环境 `.env`。项目完成后创建 `README.md`,说明技术栈、目录结构和安装部署。
49
49
 
package/lib/wdyy-cli.js CHANGED
@@ -82,7 +82,7 @@ const generatedAgentsContent = `# 企业开发规则
82
82
  | 获取已登记接口数据、使用已登记接口 | \`wdyy-api-standard\` |
83
83
  | 汇总当前任务已解决的 BUG、漏洞或运行异常 | 手动调用 \`wdyy-bug-record\`,追加写入 \`docs/bug_record.md\` |
84
84
  | 结构化日志、traceId、完整原始入参、前端异常上报 | \`wdyy-logging-standard\` |
85
- | Linux 发布、带版本双镜像、人工上传、直接端口与服务器菜单 | \`wdyy-deployment-standard\` |
85
+ | 统一 Docker 交付、本地双镜像、远程数据库与整栈一键部署 | \`wdyy-deployment-standard\` |
86
86
 
87
87
  ## 通用边界
88
88
 
@@ -90,6 +90,7 @@ const generatedAgentsContent = `# 企业开发规则
90
90
  - 代码、配置、迁移、测试与部署文件必须以实际实现为准;不得用模板虚构已实现能力。
91
91
  - 所有需求(如数据库变更、流程变更、功能变更、从零开发项目等),必须先使用\`openspec-explore\`技能确认需求,再根据实际情况,使用\`openspec\`的其它技能。
92
92
  - 所有项目管理的日志必须直接写入项目根目录 \`logs/\`,不得通过环境变量改写目录或创建服务、实例、日期等日志子目录。
93
+ - 生产部署必须使用 \`wdyy-deployment-standard\`:本地只使用已有基础镜像构建前后端两个独立镜像,分别导出后封装为一个压缩包;数据库直连远程实例且不得使用数据库容器;服务器解压后无参数执行 \`./deploy.sh\`,一次性部署整个前后端项目栈。禁止自动拉取镜像、交互菜单和单独操作一个服务。
93
94
  - 不得静默吞错、跳过验证、以兜底逻辑掩盖未决问题。
94
95
  `;
95
96
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wdyy/skills",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "企业内部开发 Skill 与项目初始化命令",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,99 +0,0 @@
1
- # Linux 部署规则
2
-
3
- ## 目录和受控源文件
4
-
5
- 目标项目必须维护:
6
-
7
- ```text
8
- deploy.sh
9
- .dockerignore
10
- src/frontend/Dockerfile
11
- src/backend/Dockerfile
12
- scripts/deployment/docker-compose.yml
13
- scripts/deployment/frontend-container.conf.template
14
- .env.example
15
- ```
16
-
17
- 这些文件必须由 `scripts/generate-deployment-files.mjs --target <project-root> --write` 按固定映射原子生成,templates 是唯一源。既有差异默认失败,工程师审查确认后才允许 `--force`。生成后执行 `--check`。相同输入连续构建时 deploy.sh 与 Compose 必须字节一致。
18
-
19
- ## 根 .env
20
-
21
- 根 `.env` 是本地 build、上传包和服务器 Compose 的唯一配置文件。`.env` 与 `.env.example` 固定按“前端、后端、数据库、API、部署”排列。部署前至少要求:
22
-
23
- ```dotenv
24
- FRONTEND_URL=0.0.0.0
25
- FRONTEND_PORT=5173
26
- BACKEND_URL=0.0.0.0
27
- BACKEND_PORT=3000
28
- DB_URL=
29
- DB_PORT=5432
30
- DB_USER=
31
- DB_PASSWORD=
32
- DB_NAME=
33
- DB_SCHEMA=
34
- PROJECT_NAME=example_project
35
- DOCKER_BIND_IP=0.0.0.0
36
- FRONTEND_BASE_IMAGE=nginx:stable
37
- BACKEND_BASE_IMAGE=node:24-alpine3.24
38
- ```
39
-
40
- `FRONTEND_PORT`、`BACKEND_PORT` 同时是容器监听端口与宿主机直接暴露端口,二者必须不同且位于 1–65535。`PROJECT_NAME` 只允许 `^[a-z][a-z0-9_]*$`。`.env` 权限必须为 `0600` 或只读的 `0400`。脚本按数据解析环境文件,不得 `source` 或 `eval`。
41
-
42
- 可选路径键为 `FRONTEND_DOCKERFILE`、`BACKEND_DOCKERFILE`、`DOCKERIGNORE_FILE`、`DEPLOY_CONFIG_DIR` 和 `COMPOSE_SOURCE`;它们不属于标准 `.env.example`,只在目标项目确有非标准结构且已确认时使用。
43
-
44
- ## Docker 与日志
45
-
46
- - 前端镜像:`${PROJECT_NAME}_frontend:${RELEASE_VERSION}`。
47
- - 后端镜像:`${PROJECT_NAME}_backend:${RELEASE_VERSION}`。
48
- - Compose project 使用 `$PROJECT_NAME`,只定义 frontend、backend,不设置 `container_name`。
49
- - frontend 端口映射为 `${DOCKER_BIND_IP}:${FRONTEND_PORT}:${FRONTEND_PORT}`;backend 同理使用 `BACKEND_PORT`。
50
- - 两个服务均使用 `../../.env`,且只挂载 `../../logs:/app/logs`。
51
- - 前端 Nginx access/error 直接写 `/app/logs/frontend-access.log`、`/app/logs/frontend-error.log`。
52
- - 后端日志直接写 `/app/logs`;服务器菜单操作追加到部署根 `logs/deploy.log`。
53
- - `.dockerignore` 必须排除 `.env`、秘密、deploy、logs、Git、依赖缓存和虚拟环境。
54
-
55
- ## 发布账本与本地包
56
-
57
- `AGENTS.md` 只允许一个固定两列表:
58
-
59
- ```markdown
60
- ## 发布记录
61
-
62
- | 版本号 | 构建时间 |
63
- |---|---|
64
- | 20260808-001 | 2026-08-08 09:30:00 +08:00 |
65
- ```
66
-
67
- build 使用项目级原子锁,严格验证账本后生成当天下一序号。全部门禁、双镜像、包结构和确定性校验通过后才写账本。
68
-
69
- ```text
70
- deploy/
71
- ├── .env
72
- ├── deploy.sh
73
- ├── release.env
74
- └── YYYYMMDD-NNN/
75
- ├── frontend-image.tar
76
- ├── backend-image.tar
77
- ├── manifest.sha256
78
- └── docker/docker-compose.yml
79
- ```
80
-
81
- `release.env` 只包含当前版本。manifest 覆盖版本目录内除自身外的全部普通文件。根 `.env` 可上传,但版本目录与镜像不得包含它。
82
-
83
- ## 服务器菜单
84
-
85
- 工程师把 `deploy/` 内容完整上传为服务器项目根目录,随后无参数执行 `./deploy.sh`:
86
-
87
- 1. 运行或替换前端:验证包和前端镜像标签,只载入并重建 frontend,验证 `/health` 与 `/version`。
88
- 2. 运行或替换后端:验证包和后端镜像标签,只载入并重建 backend,验证 `/health` 与 `/version`。
89
- 3. 运行或替换前后端:载入并重建两个服务,两个服务全部验证成功后报告成功。
90
- 4. 停止:同时停止 frontend 和 backend,保留容器、镜像、上传文件和日志。
91
-
92
- 菜单操作使用 `release.env` 指向的版本,不接受版本参数。非法输入必须在 Docker 状态变更前失败。部署根始终由脚本物理路径确定。
93
-
94
- ## 数据库和失败边界
95
-
96
- - 部署 Skill 不接受数据库迁移参数,不打包、校验、提示或执行迁移文件。
97
- - 固定服务替换允许短暂停机;失败时返回非零并记录阶段,不自动回滚或伪造成功。
98
- - 脚本不得上传文件、拉取代码、安装软件、修改宿主机 Nginx 或操作其他项目资源。
99
- - 旧蓝绿容器、状态和宿主机 Nginx 配置必须由工程师按旧部署实际状态单独迁移,新脚本不得猜测并自动删除。