@wdyy/skills 0.1.11 → 0.1.12

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 (21) hide show
  1. package/.well-known/skills/index.json +2 -2
  2. package/.well-known/skills/wdyy-deployment-standard/SKILL.md +31 -40
  3. package/.well-known/skills/wdyy-deployment-standard/agents/openai.yaml +2 -2
  4. package/.well-known/skills/wdyy-deployment-standard/reference/linux-deployment-rules.md +27 -55
  5. package/.well-known/skills/wdyy-deployment-standard/scripts/generate-deployment-files.mjs +9 -5
  6. package/.well-known/skills/wdyy-deployment-standard/scripts/generate-deployment-files.test.mjs +14 -2
  7. package/.well-known/skills/wdyy-deployment-standard/scripts/validate-deployment-package.mjs +60 -109
  8. package/.well-known/skills/wdyy-deployment-standard/scripts/validate-deployment-package.test.mjs +151 -277
  9. package/.well-known/skills/wdyy-deployment-standard/templates/deploy.sh.template +182 -576
  10. package/.well-known/skills/wdyy-deployment-standard/templates/docker-compose.yml +35 -0
  11. package/.well-known/skills/wdyy-deployment-standard/templates/env.example.template +0 -5
  12. package/.well-known/skills/wdyy-deployment-standard/templates/frontend-container.conf.template +2 -2
  13. package/.well-known/skills/wdyy-logging-standard/SKILL.md +2 -2
  14. package/.well-known/skills/wdyy-logging-standard/agents/openai.yaml +1 -1
  15. package/.well-known/skills/wdyy-logging-standard/reference/logging-rules.md +2 -2
  16. package/.well-known/skills/wdyy-logging-standard/scripts/validate-log-entry.test.mjs +1 -1
  17. package/README.md +4 -2
  18. package/lib/wdyy-cli.js +3 -2
  19. package/package.json +1 -1
  20. package/.well-known/skills/wdyy-deployment-standard/templates/docker-compose.blue-green.yml +0 -70
  21. package/.well-known/skills/wdyy-deployment-standard/templates/nginx-upstream.template.conf +0 -25
@@ -0,0 +1,35 @@
1
+ services:
2
+ frontend:
3
+ image: ${FRONTEND_IMAGE:?FRONTEND_IMAGE is required}
4
+ env_file: ../../.env
5
+ environment:
6
+ NGINX_ENVSUBST_FILTER: "^(FRONTEND_URL|FRONTEND_PORT|RELEASE_VERSION)$"
7
+ RELEASE_VERSION: ${RELEASE_VERSION:?RELEASE_VERSION is required}
8
+ ports:
9
+ - "${DOCKER_BIND_IP}:${FRONTEND_PORT}:${FRONTEND_PORT}"
10
+ volumes:
11
+ - ../../logs:/app/logs
12
+ restart: unless-stopped
13
+ 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\""]
15
+ interval: 10s
16
+ timeout: 3s
17
+ retries: 6
18
+
19
+ backend:
20
+ image: ${BACKEND_IMAGE:?BACKEND_IMAGE is required}
21
+ env_file: ../../.env
22
+ environment:
23
+ HOST: ${BACKEND_URL}
24
+ PORT: ${BACKEND_PORT}
25
+ RELEASE_VERSION: ${RELEASE_VERSION:?RELEASE_VERSION is required}
26
+ ports:
27
+ - "${DOCKER_BIND_IP}:${BACKEND_PORT}:${BACKEND_PORT}"
28
+ volumes:
29
+ - ../../logs:/app/logs
30
+ restart: unless-stopped
31
+ 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\""]
33
+ interval: 10s
34
+ timeout: 3s
35
+ retries: 6
@@ -18,11 +18,6 @@ DB_SCHEMA=
18
18
 
19
19
  # 部署
20
20
  PROJECT_NAME=
21
- PROJECT_HTTP_PORT=
22
21
  DOCKER_BIND_IP=
23
- FRONTEND_BLUE_PORT=
24
- FRONTEND_GREEN_PORT=
25
- BACKEND_BLUE_PORT=
26
- BACKEND_GREEN_PORT=
27
22
  FRONTEND_BASE_IMAGE=nginx:stable
28
23
  BACKEND_BASE_IMAGE=node:24-alpine3.24
@@ -3,8 +3,8 @@ server {
3
3
  server_name _;
4
4
  root /usr/share/nginx/html;
5
5
  index index.html;
6
- access_log /app/logs/frontend-${INSTANCE_ID}-access.log;
7
- error_log /app/logs/frontend-${INSTANCE_ID}-error.log warn;
6
+ access_log /app/logs/frontend-access.log;
7
+ error_log /app/logs/frontend-error.log warn;
8
8
 
9
9
  location = /health {
10
10
  access_log off;
@@ -19,7 +19,7 @@ description: 为 NestJS 和 Vue 项目实现仅写入项目根目录 ./logs 的
19
19
 
20
20
  ## 输入与输出
21
21
 
22
- - 输入:服务名、实例标识、环境和请求上下文;应用从项目根目录启动。
22
+ - 输入:服务名、进程实例标识、环境和请求上下文;应用从项目根目录启动。
23
23
  - 输出:统一 logger、前端异常上报客户端、HTTP 日志中间件、日志文件命名规则和日志验证结果。
24
24
  - 使用 [日志规则](reference/logging-rules.md) 和 [logger 模板](templates/logger.template.ts)。
25
25
 
@@ -37,7 +37,7 @@ description: 为 NestJS 和 Vue 项目实现仅写入项目根目录 ./logs 的
37
37
 
38
38
  - 不得将 `message` 仅限制为 `success` 或 `error`。
39
39
  - 不得用 console 输出替代业务日志。
40
- - 不得将日志写入项目根目录 `./logs` 之外,或按服务、实例、日期、blue/green 颜色创建日志子目录。
40
+ - 不得将日志写入项目根目录 `./logs` 之外,或按服务、实例、日期等维度创建日志子目录。
41
41
 
42
42
  ## Red Flags
43
43
 
@@ -1,4 +1,4 @@
1
1
  interface:
2
- display_name: "Enterprise Logging Standard"
2
+ display_name: "wdyy-logging-standard"
3
3
  short_description: "Write full-context logs only to project-root ./logs"
4
4
  default_prompt: "Use $wdyy-logging-standard to implement full-context structured logs that write only to project-root ./logs."
@@ -3,11 +3,11 @@
3
3
  - 日志为一行 JSON,最小字段见 `logger.template.ts`。
4
4
  - `logger.template.ts` 必须可在未安装 `@types/node` 的项目中独立类型检查;读取环境变量时通过 `globalThis` 声明最小运行时形状,不直接依赖 Node.js 全局类型。
5
5
  - `timestamp` 使用服务器本地时间 `YYYY-MM-DD HH:mm:ss`,精确到秒;不得包含毫秒、`T` 或 `Z`。
6
- - 应用必须从项目根目录启动,只允许创建项目根目录 `./logs`,并将文件直接写入该目录;不得读取 `LOG_DIR`、`HOST_LOG_DIR` 或其他目录配置,不得创建服务、实例、日期、blue/green 颜色或其他日志子目录。
6
+ - 应用必须从项目根目录启动,只允许创建项目根目录 `./logs`,并将文件直接写入该目录;不得读取 `LOG_DIR`、`HOST_LOG_DIR` 或其他目录配置,不得创建服务、实例、日期或其他日志子目录。
7
7
  - 文件名使用服务器本地时间 `yyyy-mm-dd_hh24-mm-ss.log`。使用排他创建;同一秒内文件名冲突时依次尝试 `yyyy-mm-dd_hh24-mm-ss_1.log`、`yyyy-mm-dd_hh24-mm-ss_2.log`,不得先检查后覆盖写入。最新日志文件大于 2MB 时在同一 `./logs` 中创建新文件,既有日志文件不得移动、重命名或覆盖。
8
8
  - 日志仅记录关键业务事件、请求和异常;`params`、`query`、`body` 和 `response` 均保留完整原始值,不执行脱敏、数组截断或大对象裁剪。授权请求可记录实际用户、模式、表和权限等入参。
9
9
  - HTTP 日志必须保留 `statusCode`。服务端成功返回时 `result` 为 `success`;失败返回时 `result` 为 `failure`,并在 `response` 中保留完整失败内容。100–399 为成功,400–599 为失败。
10
10
  - HTTP 入口和内部服务调用必须透传 traceId。
11
- - 每条日志必须包含 `instanceId`;blue、green 与其他进程共享同一 `./logs`,通过排他创建和同秒递增后缀避免覆盖。
11
+ - 每条日志必须包含 `instanceId`;所有进程共享同一 `./logs`,通过排他创建和同秒递增后缀避免覆盖。
12
12
  - Vue 未处理异常和 Promise 拒绝必须上报后端;后端校验请求身份后写入统一日志。
13
13
  - 容器必须将宿主机项目根目录 `./logs` 挂载到应用根目录 `/app/logs`,替换容器不得删除历史日志。
@@ -83,7 +83,7 @@ test('2MB 轮转阈值使用同一 logs 目录的下一个候选路径', () => {
83
83
  assert.equal(createLogFilePath(date, 3), './logs/2026-07-28_09-05-03_3.log');
84
84
  });
85
85
 
86
- test('蓝绿实例日志必须包含 instanceId', async () => {
86
+ test('多进程日志必须包含 instanceId', async () => {
87
87
  const result = await validate({
88
88
  timestamp: '2026-07-09 08:00:00',
89
89
  level: 'info',
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` | 扩充标准五段环境配置,生成人工交付、双 Docker 蓝绿发布与回滚文件。 |
21
+ | `wdyy-deployment-standard` | 扩充标准五段环境配置,生成带版本前后端双镜像、人工上传、直接宿主机端口与服务器交互菜单部署文件;不使用蓝绿部署。 |
22
22
 
23
23
  ## 使用方式
24
24
 
@@ -43,7 +43,9 @@ 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
- 中大型变更先使用 `/opsx:explore` 或 `/opsx:propose <change-name>`,在方案确认后使用 `/opsx:apply`;完成验证后使用 `/opsx:archive`。涉及数据库、内部 API、日志、部署时,按 `AGENTS.md` 的路由加载相应企业 Skill。所有 URL、端口和 IP 地址从 `.env` 读取,不得硬编码;不得提交秘密或生产环境 `.env`。项目完成后创建 `README.md`,说明技术栈、目录结构和安装部署。
46
+ 部署 Skill 生成的标准流程为:在本地项目根目录执行 `./deploy.sh build`,构建并导出 `<项目名>_frontend:<YYYYMMDD-NNN>` 与 `<项目名>_backend:<YYYYMMDD-NNN>`,人工上传完整 `deploy/` 内容作为服务器项目根目录;服务器无参数执行 `./deploy.sh`,选择运行或替换前端、运行或替换后端、运行或替换前后端,或同时停止两个服务。前后端直接暴露 `.env` 中的宿主机端口,不生成蓝绿服务或宿主机 Nginx 配置。应用、前端 Nginx 与部署操作日志均直接保存在服务器项目根目录 `logs/`。
47
+
48
+ 中大型变更先使用 `/opsx:explore` 或 `/opsx:propose <change-name>`,在方案确认后使用 `/opsx:apply`;完成验证后使用 `/opsx:archive`。涉及数据库、内部 API、日志、部署时,按 `AGENTS.md` 的路由加载相应企业 Skill。所有 URL、端口和 IP 地址从 `.env` 读取,不得硬编码;所有项目管理的日志直接写入项目根目录 `logs/`;生产部署不使用蓝绿发布。不得提交秘密或生产环境 `.env`。项目完成后创建 `README.md`,说明技术栈、目录结构和安装部署。
47
49
 
48
50
  ## 固定技术栈
49
51
 
package/lib/wdyy-cli.js CHANGED
@@ -81,14 +81,15 @@ const generatedAgentsContent = `# 企业开发规则
81
81
  | PostgreSQL 表、DDL、迁移、数据兼容性 | \`wdyy-database-standard\` |
82
82
  | 获取已登记接口数据、使用已登记接口 | \`wdyy-api-standard\` |
83
83
  | 汇总当前任务已解决的 BUG、漏洞或运行异常 | 手动调用 \`wdyy-bug-record\`,追加写入 \`docs/bug_record.md\` |
84
- | 结构化日志、traceId、脱敏、前端异常上报 | \`wdyy-logging-standard\` |
85
- | Linux 发布、Docker 蓝绿、Nginx 切流、回滚 | \`wdyy-deployment-standard\` |
84
+ | 结构化日志、traceId、完整原始入参、前端异常上报 | \`wdyy-logging-standard\` |
85
+ | Linux 发布、带版本双镜像、人工上传、直接端口与服务器菜单 | \`wdyy-deployment-standard\` |
86
86
 
87
87
  ## 通用边界
88
88
 
89
89
  - 项目根目录应提供真实可执行的 \`pnpm dev\`、\`pnpm build\`、\`pnpm test\`、\`pnpm lint\` 命令;\`pnpm dev\` 只负责前后端的启动,不得启动或管理数据库。
90
90
  - 代码、配置、迁移、测试与部署文件必须以实际实现为准;不得用模板虚构已实现能力。
91
91
  - 所有需求(如数据库变更、流程变更、功能变更、从零开发项目等),必须先使用\`openspec-explore\`技能确认需求,再根据实际情况,使用\`openspec\`的其它技能。
92
+ - 所有项目管理的日志必须直接写入项目根目录 \`logs/\`,不得通过环境变量改写目录或创建服务、实例、日期等日志子目录。
92
93
  - 不得静默吞错、跳过验证、以兜底逻辑掩盖未决问题。
93
94
  `;
94
95
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wdyy/skills",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "企业内部开发 Skill 与项目初始化命令",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,70 +0,0 @@
1
- services:
2
- frontend-blue:
3
- image: ${FRONTEND_IMAGE:?FRONTEND_IMAGE is required}
4
- env_file: ../../.env
5
- environment:
6
- INSTANCE_ID: blue
7
- NGINX_ENVSUBST_FILTER: "^(INSTANCE_ID|FRONTEND_URL|FRONTEND_PORT|RELEASE_VERSION)$"
8
- ports:
9
- - "${DOCKER_BIND_IP}:${FRONTEND_BLUE_PORT}:${FRONTEND_PORT}"
10
- volumes:
11
- - ../../logs:/app/logs
12
- restart: unless-stopped
13
- 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\""]
15
- interval: 10s
16
- timeout: 3s
17
- retries: 6
18
-
19
- backend-blue:
20
- image: ${BACKEND_IMAGE:?BACKEND_IMAGE is required}
21
- env_file: ../../.env
22
- environment:
23
- INSTANCE_ID: blue
24
- HOST: ${BACKEND_URL}
25
- PORT: ${BACKEND_PORT}
26
- ports:
27
- - "${DOCKER_BIND_IP}:${BACKEND_BLUE_PORT}:${BACKEND_PORT}"
28
- volumes:
29
- - ../../logs:/app/logs
30
- restart: unless-stopped
31
- 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\""]
33
- interval: 10s
34
- timeout: 3s
35
- retries: 6
36
-
37
- frontend-green:
38
- image: ${FRONTEND_IMAGE:?FRONTEND_IMAGE is required}
39
- env_file: ../../.env
40
- environment:
41
- INSTANCE_ID: green
42
- NGINX_ENVSUBST_FILTER: "^(INSTANCE_ID|FRONTEND_URL|FRONTEND_PORT|RELEASE_VERSION)$"
43
- ports:
44
- - "${DOCKER_BIND_IP}:${FRONTEND_GREEN_PORT}:${FRONTEND_PORT}"
45
- volumes:
46
- - ../../logs:/app/logs
47
- restart: unless-stopped
48
- healthcheck:
49
- 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\""]
50
- interval: 10s
51
- timeout: 3s
52
- retries: 6
53
-
54
- backend-green:
55
- image: ${BACKEND_IMAGE:?BACKEND_IMAGE is required}
56
- env_file: ../../.env
57
- environment:
58
- INSTANCE_ID: green
59
- HOST: ${BACKEND_URL}
60
- PORT: ${BACKEND_PORT}
61
- ports:
62
- - "${DOCKER_BIND_IP}:${BACKEND_GREEN_PORT}:${BACKEND_PORT}"
63
- volumes:
64
- - ../../logs:/app/logs
65
- restart: unless-stopped
66
- healthcheck:
67
- 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\""]
68
- interval: 10s
69
- timeout: 3s
70
- retries: 6
@@ -1,25 +0,0 @@
1
- # wdyy-project: __PROJECT_NAME__
2
- # wdyy-port: __PROJECT_HTTP_PORT__
3
- include "__DEPLOY_ROOT__/nginx/active-upstreams.conf";
4
-
5
- server {
6
- listen __PROJECT_HTTP_PORT__;
7
- server_name _;
8
-
9
- location /api/ {
10
- proxy_pass http://__BACKEND_UPSTREAM_NAME__;
11
- proxy_set_header Host $host;
12
- proxy_set_header X-Real-IP $remote_addr;
13
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
14
- proxy_set_header X-Forwarded-Proto $scheme;
15
- proxy_set_header X-Trace-Id $request_id;
16
- }
17
-
18
- location / {
19
- proxy_pass http://__FRONTEND_UPSTREAM_NAME__;
20
- proxy_set_header Host $host;
21
- proxy_set_header X-Real-IP $remote_addr;
22
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
23
- proxy_set_header X-Forwarded-Proto $scheme;
24
- }
25
- }