@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.
- package/.well-known/skills/index.json +2 -2
- package/.well-known/skills/wdyy-deployment-standard/SKILL.md +30 -46
- package/.well-known/skills/wdyy-deployment-standard/agents/openai.yaml +2 -2
- package/.well-known/skills/wdyy-deployment-standard/reference/docker-delivery-rules.md +103 -0
- package/.well-known/skills/wdyy-deployment-standard/scripts/generate-deployment-files.mjs +138 -155
- package/.well-known/skills/wdyy-deployment-standard/scripts/generate-deployment-files.test.mjs +97 -97
- package/.well-known/skills/wdyy-deployment-standard/scripts/validate-deployment-package.mjs +93 -116
- package/.well-known/skills/wdyy-deployment-standard/scripts/validate-deployment-package.test.mjs +185 -311
- package/.well-known/skills/wdyy-deployment-standard/templates/{Dockerfile.template → backend.Dockerfile.template} +5 -9
- package/.well-known/skills/wdyy-deployment-standard/templates/deploy.sh.template +210 -256
- package/.well-known/skills/wdyy-deployment-standard/templates/docker-compose.yml +11 -13
- package/.well-known/skills/wdyy-deployment-standard/templates/dockerignore.template +1 -1
- package/.well-known/skills/wdyy-deployment-standard/templates/env.example.template +0 -19
- package/.well-known/skills/wdyy-deployment-standard/templates/frontend-container.conf.template +0 -6
- package/.well-known/skills/wdyy-deployment-standard/templates/frontend.Dockerfile.template +9 -4
- package/README.md +2 -2
- package/lib/wdyy-cli.js +2 -1
- package/package.json +1 -1
- 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: ${
|
|
4
|
-
env_file:
|
|
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
|
|
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
|
-
-
|
|
10
|
+
- ./logs:/app/logs
|
|
12
11
|
restart: unless-stopped
|
|
13
12
|
healthcheck:
|
|
14
|
-
test: ["CMD
|
|
13
|
+
test: ["CMD", "nginx", "-t"]
|
|
15
14
|
interval: 10s
|
|
16
15
|
timeout: 3s
|
|
17
16
|
retries: 6
|
|
18
17
|
|
|
19
18
|
backend:
|
|
20
|
-
image: ${
|
|
21
|
-
env_file:
|
|
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
|
-
-
|
|
27
|
+
- ./logs:/app/logs
|
|
30
28
|
restart: unless-stopped
|
|
31
29
|
healthcheck:
|
|
32
|
-
test: ["CMD-SHELL", "
|
|
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
|
|
@@ -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
|
|
@@ -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
|
-
|
|
4
|
-
|
|
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
|
|
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
|
-
|
|
|
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,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 配置必须由工程师按旧部署实际状态单独迁移,新脚本不得猜测并自动删除。
|