@wdyy/skills 0.1.27 → 0.1.30
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 +8 -3
- package/.well-known/skills/wdyy-database-standard/SKILL.md +5 -5
- package/.well-known/skills/wdyy-database-standard/reference/database-rules.md +2 -1
- package/.well-known/skills/wdyy-database-standard/scripts/validate-table-design.mjs +10 -3
- package/.well-known/skills/wdyy-database-standard/scripts/validate-table-design.test.mjs +36 -0
- package/.well-known/skills/wdyy-database-standard/templates/table-design.template.md +3 -2
- package/.well-known/skills/wdyy-logging-standard/SKILL.md +16 -13
- package/.well-known/skills/wdyy-logging-standard/agents/openai.yaml +1 -1
- package/.well-known/skills/wdyy-logging-standard/reference/logging-rules.md +17 -8
- package/.well-known/skills/wdyy-logging-standard/scripts/validate-log-entry.mjs +23 -4
- package/.well-known/skills/wdyy-logging-standard/scripts/validate-log-entry.test.mjs +200 -303
- package/.well-known/skills/wdyy-logging-standard/templates/logger.template.ts +167 -89
- package/.well-known/skills/wdyy-logging-standard/templates/nestjs-http-logging.middleware.template.ts +68 -46
- package/.well-known/skills/wdyy-logging-standard/templates/pino-logger.template.ts +38 -0
- package/.well-known/skills/wdyy-logging-standard/templates/security-audit-logger.template.ts +9 -14
- package/.well-known/skills/wdyy-safety-review/SKILL.md +54 -0
- package/.well-known/skills/wdyy-safety-review/agents/openai.yaml +4 -0
- package/.well-known/skills/wdyy-safety-review/references/security-review-rules.md +51 -0
- package/.well-known/skills/wdyy-safety-review/scripts/validate-security-checklist.mjs +66 -0
- package/.well-known/skills/wdyy-safety-review/scripts/validate-security-checklist.test.mjs +69 -0
- package/.well-known/skills/wdyy-safety-review/templates/security-checklist.template.md +17 -0
- package/README.md +8 -6
- package/lib/wdyy-cli.js +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# 六类软件安全审核规则
|
|
2
|
+
|
|
3
|
+
## 证据与合规基线
|
|
4
|
+
|
|
5
|
+
法律法规和标准是审核依据而非自动合规结论。执行时从发布机关或官方标准平台核验现行状态、适用范围和版本;将法定义务、适用标准、工程建议及待确认事实分开记录。
|
|
6
|
+
|
|
7
|
+
- 《网络安全法》要求等级保护、安全管理、攻击和入侵防护、监测记录、网络日志留存不少于六个月、数据分类和加密等措施。
|
|
8
|
+
- 《个人信息保护法》要求最小必要,医疗健康等敏感个人信息需特定目的、充分必要和严格保护;处理者应采取分类管理、加密、去标识化和权限控制等措施。
|
|
9
|
+
- 《数据安全法》要求数据分类分级、全流程管理、风险监测和漏洞补救。
|
|
10
|
+
- 医疗卫生机构适用时,按《医疗卫生机构网络安全管理办法》进行年度文档核验、漏洞扫描、渗透测试和整改。
|
|
11
|
+
- 参考现行 GB/T 22239-2019、GB/T 35273-2020、GB/T 38674-2020、GB/T 40645-2021;数据接口风险监测可参考 GB/T 46796-2025。工程控制不得被误称为法律逐项强制要求。
|
|
12
|
+
|
|
13
|
+
## 1. 身份认证与权限
|
|
14
|
+
|
|
15
|
+
检查登录入口、账号枚举提示、失败次数和验证码抗绕过、密码复杂度与强 Hash、MFA 的适用性、JWT 算法/签名/受众/有效期、Session 固定与失效、Token 撤销、RBAC 和服务端接口授权。
|
|
16
|
+
|
|
17
|
+
对每个受保护操作检查匿名、低权限、高权限和不同数据主体的行为,重点验证:
|
|
18
|
+
|
|
19
|
+
- 水平越权:变更对象 ID、文件 ID 或查询条件不能访问其他主体数据。
|
|
20
|
+
- 垂直越权:低权限角色不能调用管理功能、权限变更、导出或运维接口。
|
|
21
|
+
- 未授权访问:认证、接口、对象、字段和数据范围均由服务端逐层判定。
|
|
22
|
+
|
|
23
|
+
## 2. Web/API 安全
|
|
24
|
+
|
|
25
|
+
检查输入类型、长度、格式、范围、内容类型与请求体大小;数据库使用参数化查询,命令调用使用固定允许列表;输出按上下文编码;浏览器请求有适当 CSRF 与 CORS 边界;服务端出网访问使用地址、协议、DNS 重解析和私网地址限制。
|
|
26
|
+
|
|
27
|
+
检查路径规范化、重定向、错误响应和调试开关。对外接口检查强鉴权、接口/对象/字段授权、请求签名和重放防护、分页上限、IP/账号/调用方凭据维度限流、配额、并发控制、异常检测和告警。签名 profile 必须规范化并覆盖语义相关组件,避免直接字符串拼接歧义;nonce 一次性消费、时间窗、密钥轮换和失败关闭需要服务端证据。
|
|
28
|
+
|
|
29
|
+
## 3. 文件安全
|
|
30
|
+
|
|
31
|
+
检查上传、下载、预览和导出全链路:服务端限制类型、大小、数量和内容特征;随机化存储名;隔离可执行目录;拒绝路径分隔符与保留名称;防止覆盖;预览与下载使用对象授权;响应头防止浏览器错误解释内容。
|
|
32
|
+
|
|
33
|
+
不要把扩展名或前端校验作为唯一控制。发现恶意文件、压缩包、Office/PDF、图片解析或外部预览器时,记录所用解析组件和隔离策略。
|
|
34
|
+
|
|
35
|
+
## 4. 数据与敏感信息安全
|
|
36
|
+
|
|
37
|
+
建立字段清单,标记身份证、手机号、患者信息、认证数据和业务敏感数据。检查采集目的、最小必要、字段允许列表、传输 HTTPS、存储加密或去标识化、密码强 Hash、访问控制、导出控制、缓存与留存。
|
|
38
|
+
|
|
39
|
+
使用只读方式检查代码、模板、受 Git 跟踪配置和历史提交中的硬编码密码、API Key、Token、私钥、数据库连接秘密。发现时不得输出原文;要求撤销轮换、从历史清理并迁移至经确认的秘密管理方式。
|
|
40
|
+
|
|
41
|
+
## 5. 代码与依赖安全
|
|
42
|
+
|
|
43
|
+
先识别项目已有的 SAST、SCA、npm/Maven 审计、SBOM、Git 秘密扫描、容器或 IaC 扫描能力。新增工具前核验官方最新稳定版、兼容性和公开漏洞状态,并等待工程师确认。
|
|
44
|
+
|
|
45
|
+
检查锁文件、直接与传递依赖、EOL 或过期组件、许可证和 SBOM;检查危险函数、反序列化、动态执行、不安全随机数、调试模式、默认账户、宽松 CORS、明文协议和环境变量泄露。扫描结果须关联实际版本、影响路径、可达性和修复版本。
|
|
46
|
+
|
|
47
|
+
## 6. 安全日志与漏洞验证
|
|
48
|
+
|
|
49
|
+
检查登录失败、认证失败、权限拒绝、数据修改、敏感查询/导出、配置与权限变更是否记录时间、主体内部标识、来源、动作、对象、结果和 trace 标识。日志中不得保留密码、Token、签名、密钥、Cookie、身份证、患者信息或完整敏感请求体。
|
|
50
|
+
|
|
51
|
+
日志实现使用 `wdyy-logging-standard`。漏洞扫描、DAST、模糊测试和渗透测试前,确认资产所有权或授权、目标与排除项、环境、允许技术、速率、时窗、联系人、停止条件和证据保存规则。授权不完整时仅复核已有报告或执行本地静态检查,清单标记 `未检查`。
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
|
|
4
|
+
const [inputPath] = process.argv.slice(2);
|
|
5
|
+
if (!inputPath || process.argv.length !== 3) {
|
|
6
|
+
throw new Error('Usage: validate-security-checklist.mjs <checklist.md>');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const requiredHeaders = ['检查类型', '检查项目', '检查结果', '修复方案'];
|
|
10
|
+
const requiredCategories = new Set([
|
|
11
|
+
'身份认证与权限',
|
|
12
|
+
'Web/API 安全',
|
|
13
|
+
'文件安全',
|
|
14
|
+
'数据与敏感信息安全',
|
|
15
|
+
'代码与依赖安全',
|
|
16
|
+
'安全日志与漏洞验证',
|
|
17
|
+
]);
|
|
18
|
+
const validResults = new Set(['通过', '不通过', '未检查', '不适用']);
|
|
19
|
+
|
|
20
|
+
function parseRow(line) {
|
|
21
|
+
const cells = line.trim().split('|').slice(1, -1).map((cell) => cell.trim());
|
|
22
|
+
if (cells.length !== 4) throw new Error(`Checklist row must have exactly four columns: ${line}`);
|
|
23
|
+
return cells;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isDelimiter(cells) {
|
|
27
|
+
return cells.every((cell) => /^:?-{3,}:?$/.test(cell));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const source = await readFile(inputPath, 'utf8');
|
|
31
|
+
const lines = source.split(/\r?\n/);
|
|
32
|
+
const headerIndex = lines.findIndex((line) => line.trim() === `| ${requiredHeaders.join(' | ')} |`);
|
|
33
|
+
if (headerIndex === -1) throw new Error('Checklist table must use the required four headers');
|
|
34
|
+
if (headerIndex + 1 >= lines.length || !isDelimiter(parseRow(lines[headerIndex + 1]))) {
|
|
35
|
+
throw new Error('Checklist table is missing a valid delimiter row');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const categories = new Set();
|
|
39
|
+
let rowCount = 0;
|
|
40
|
+
for (const line of lines.slice(headerIndex + 2)) {
|
|
41
|
+
if (line.trim() === '') break;
|
|
42
|
+
if (!line.trim().startsWith('|')) break;
|
|
43
|
+
const [category, item, result, remediation] = parseRow(line);
|
|
44
|
+
if (!requiredCategories.has(category)) throw new Error(`Unexpected checklist category: ${category}`);
|
|
45
|
+
if (categories.has(category)) throw new Error(`Checklist category is duplicated: ${category}`);
|
|
46
|
+
if (!item || !remediation) throw new Error(`Checklist row is missing item or remediation: ${category}`);
|
|
47
|
+
if (!validResults.has(result)) throw new Error(`Invalid checklist result: ${result}`);
|
|
48
|
+
if (result === '通过' && !/无需修复|无须修复/.test(remediation)) {
|
|
49
|
+
throw new Error(`Passed checklist row must state no remediation is needed: ${category}`);
|
|
50
|
+
}
|
|
51
|
+
if (result !== '通过' && /无需修复|无须修复|已通过/.test(remediation)) {
|
|
52
|
+
throw new Error(`Non-passed checklist row cannot claim completion: ${category}`);
|
|
53
|
+
}
|
|
54
|
+
if (result === '未检查' && !/补充|授权|执行条件|待确认/.test(remediation)) {
|
|
55
|
+
throw new Error(`Unchecked checklist row must state missing evidence or authorization: ${category}`);
|
|
56
|
+
}
|
|
57
|
+
categories.add(category);
|
|
58
|
+
rowCount += 1;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (rowCount !== requiredCategories.size || categories.size !== requiredCategories.size) {
|
|
62
|
+
const missing = [...requiredCategories].filter((category) => !categories.has(category));
|
|
63
|
+
throw new Error(`Checklist must cover all six categories; missing: ${missing.join('、')}`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
process.stdout.write('valid software security checklist\n');
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import test from 'node:test';
|
|
7
|
+
|
|
8
|
+
const validator = new URL('./validate-security-checklist.mjs', import.meta.url);
|
|
9
|
+
const temporaryDirectories = [];
|
|
10
|
+
|
|
11
|
+
test.afterEach(async () => {
|
|
12
|
+
await Promise.all(temporaryDirectories.splice(0).map((directory) => rm(directory, { force: true, recursive: true })));
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const validChecklist = `# 软件安全检查清单
|
|
16
|
+
|
|
17
|
+
| 检查类型 | 检查项目 | 检查结果 | 修复方案 |
|
|
18
|
+
| --- | --- | --- | --- |
|
|
19
|
+
| 身份认证与权限 | 证据:auth/service.ts | 通过 | 无需修复。 |
|
|
20
|
+
| Web/API 安全 | 证据:api/routes.ts | 不通过 | 使用参数化查询并添加回归测试。 |
|
|
21
|
+
| 文件安全 | 证据:upload.ts | 未检查 | 补充经授权的文件上传验证证据。 |
|
|
22
|
+
| 数据与敏感信息安全 | 证据:dto.ts | 不适用 | 当前范围不处理个人数据,保留证据备查。 |
|
|
23
|
+
| 代码与依赖安全 | 证据:package-lock.json | 通过 | 无需修复。 |
|
|
24
|
+
| 安全日志与漏洞验证 | 证据:audit.ts | 未检查 | 补充主动验证授权和脱敏日志证据。 |
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
async function run(source) {
|
|
28
|
+
const directory = await mkdtemp(join(tmpdir(), 'wdyy-safety-checklist-'));
|
|
29
|
+
temporaryDirectories.push(directory);
|
|
30
|
+
const inputPath = join(directory, 'checklist.md');
|
|
31
|
+
await writeFile(inputPath, source, 'utf8');
|
|
32
|
+
return spawnSync(process.execPath, [validator.pathname, inputPath], { encoding: 'utf8' });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
test('accepts the required four-column checklist with all six categories', async () => {
|
|
36
|
+
const result = await run(validChecklist);
|
|
37
|
+
assert.equal(result.status, 0, result.stderr);
|
|
38
|
+
assert.match(result.stdout, /valid software security checklist/);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('rejects a checklist that omits a required category', async () => {
|
|
42
|
+
const result = await run(validChecklist.replace('| 文件安全 | 证据:upload.ts | 未检查 | 补充经授权的文件上传验证证据。 |\n', ''));
|
|
43
|
+
assert.notEqual(result.status, 0);
|
|
44
|
+
assert.match(result.stderr, /must cover all six categories/);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('rejects an extra table column', async () => {
|
|
48
|
+
const result = await run(validChecklist.replace('检查结果 | 修复方案', '检查结果 | 修复方案 | 风险等级'));
|
|
49
|
+
assert.notEqual(result.status, 0);
|
|
50
|
+
assert.match(result.stderr, /required four headers/);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('rejects an invalid result value', async () => {
|
|
54
|
+
const result = await run(validChecklist.replace('| Web/API 安全 | 证据:api/routes.ts | 不通过 |', '| Web/API 安全 | 证据:api/routes.ts | 高风险 |'));
|
|
55
|
+
assert.notEqual(result.status, 0);
|
|
56
|
+
assert.match(result.stderr, /Invalid checklist result/);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('rejects a non-passed row that claims it is already passed', async () => {
|
|
60
|
+
const result = await run(validChecklist.replace('补充经授权的文件上传验证证据。', '已通过,无需修复。'));
|
|
61
|
+
assert.notEqual(result.status, 0);
|
|
62
|
+
assert.match(result.stderr, /cannot claim completion/);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('rejects an unchecked row with no evidence or authorization action', async () => {
|
|
66
|
+
const result = await run(validChecklist.replace('补充主动验证授权和脱敏日志证据。', '后续处理。'));
|
|
67
|
+
assert.notEqual(result.status, 0);
|
|
68
|
+
assert.match(result.stderr, /must state missing evidence or authorization/);
|
|
69
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# 软件安全检查清单
|
|
2
|
+
|
|
3
|
+
## 范围与限制
|
|
4
|
+
|
|
5
|
+
- 审核范围:待填写
|
|
6
|
+
- 审核时间:待填写
|
|
7
|
+
- 证据来源:待填写;不得包含秘密或敏感个人信息原文。
|
|
8
|
+
- 主动测试授权:待确认;未确认时不得执行主动扫描、漏洞验证或渗透测试。
|
|
9
|
+
|
|
10
|
+
| 检查类型 | 检查项目 | 检查结果 | 修复方案 |
|
|
11
|
+
| --- | --- | --- | --- |
|
|
12
|
+
| 身份认证与权限 | 登录、密码 Hash、Token/Session、RBAC、接口/对象/字段授权;证据:待填写 | 未检查 | 补充源码、配置和角色测试证据;必要时取得主动验证授权。 |
|
|
13
|
+
| Web/API 安全 | 注入、XSS、CSRF、SSRF、路径遍历、重放、遍历、限流、异常泄露;证据:待填写 | 未检查 | 补充代码审查和经授权的验证证据。 |
|
|
14
|
+
| 文件安全 | 上传、下载、预览、导出、类型大小、存储隔离、覆盖和越权;证据:待填写 | 未检查 | 补充文件处理链路与对象授权证据。 |
|
|
15
|
+
| 数据与敏感信息安全 | 敏感字段、脱敏、HTTPS、密码 Hash、日志与硬编码秘密;证据:待填写 | 未检查 | 补充字段清单、传输存储和秘密扫描证据。 |
|
|
16
|
+
| 代码与依赖安全 | SAST、SCA、npm/Maven、SBOM、Git 秘密、危险函数和配置;证据:待填写 | 未检查 | 补充依赖清单和经确认工具的扫描结果。 |
|
|
17
|
+
| 安全日志与漏洞验证 | 登录失败、权限拒绝、数据修改、敏感操作日志及漏洞验证授权;证据:待填写 | 未检查 | 补充脱敏审计日志和完整授权边界。 |
|
package/README.md
CHANGED
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
```text
|
|
8
8
|
AGENTS.md 全局基线、技术栈、OpenSpec 流程与 Skill 路由
|
|
9
9
|
OpenSpec 单项变更的需求、设计、任务、实施与归档
|
|
10
|
-
.well-known/skills/wdyy-* 数据库、日志、部署、医院 UI
|
|
10
|
+
.well-known/skills/wdyy-* 数据库、日志、部署、医院 UI、软件安全审核的专业规则
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
当前 `.well-known/skills/index.json` 登记
|
|
13
|
+
当前 `.well-known/skills/index.json` 登记 6 个企业 Skill。
|
|
14
14
|
|
|
15
15
|
| Skill | 职责 |
|
|
16
16
|
|---|---|
|
|
@@ -19,6 +19,7 @@ OpenSpec 单项变更的需求、设计、任务、实
|
|
|
19
19
|
| `wdyy-logging-standard` | 访问、应用、安全与审计日志,递归敏感字段净化、W3C trace、前端异常上报、轮转与哈希链校验。 |
|
|
20
20
|
| `wdyy-deployment-standard` | 在 Linux、macOS Docker Desktop 或 Windows Docker Desktop + WSL2/Linux 容器模式中,使用本地基础镜像构建前后端独立镜像,分别导出并统一压缩交付,远程数据库直连并一键部署整个项目栈。 |
|
|
21
21
|
| `wdyy-ui` | 统一医院信息系统页面的布局、清新生命绿配色、医院 Logo、常用组件和响应式行为,不定义业务流程、接口或数据模型。 |
|
|
22
|
+
| `wdyy-safety-review` | 审核身份认证与权限、Web/API、文件、敏感数据、代码与依赖、安全日志与漏洞验证,并输出四列 Markdown 安全检查清单。 |
|
|
22
23
|
|
|
23
24
|
## 使用方式
|
|
24
25
|
|
|
@@ -35,9 +36,9 @@ wdyy init
|
|
|
35
36
|
|
|
36
37
|
`wdyy init` 启动时会再次显示上述外部依赖安装命令,但不会自动执行 npm 或 npx。命令在写入前集中检查 Node.js 24、pnpm 12.1.0、Git、OpenSpec、CodeGraph,以及规则强制使用的公共 Skill;任一项缺失或版本不符时一次性报告全部问题并退出。
|
|
37
38
|
|
|
38
|
-
预检通过后,`wdyy init` 会在系统用户目录 `.agents/skills/` 安装或更新
|
|
39
|
+
预检通过后,`wdyy init` 会在系统用户目录 `.agents/skills/` 安装或更新 6 个受管理 Skill,并删除其中旧的 `wdyy-api-standard`。它还会初始化 Git、默认目录、环境模板、BUG 模板、OpenSpec 与 CodeGraph。已有环境文件和 BUG 记录保持不变;已有 `AGENTS.md` 时生成 `AGENTS_new.md`。全部步骤成功后生成 `.wdyy/toolchain.json`,记录初始化器与工具版本、实际规则文件以及公共和企业 Skill 的 SHA-256;清单不含用户名、凭据或绝对主目录。
|
|
39
40
|
|
|
40
|
-
生成规则负责项目边界与 Skill 路由:`grill-me` 澄清需求和验收标准,`grill-with-docs` 记录 PRD、术语与 ADR;文档沉淀完成后先使用 `openspec-explore` 探索方案、约束与风险,再使用 `openspec-propose`
|
|
41
|
+
生成规则负责项目边界与 Skill 路由:`grill-me` 澄清需求和验收标准,`grill-with-docs` 记录 PRD、术语与 ADR;文档沉淀完成后先使用 `openspec-explore` 探索方案、约束与风险,再使用 `openspec-propose` 形成可评审计划并进入实施流程。数据库、日志、部署、UI 和软件安全审核的执行细节由对应 Skill 唯一维护。自建接口由 Agent 根据已确认需求生成 OpenAPI 3.1 YAML 并交工程师验收;第三方接口只依据工程师提供的契约或官方文档。
|
|
41
42
|
|
|
42
43
|
初始化后在项目根目录执行以下只读验收;命令集中检查初始化产物、工具版本、Skill 和工具链清单漂移,不会自动修复文件:
|
|
43
44
|
|
|
@@ -55,14 +56,15 @@ wdyy validate
|
|
|
55
56
|
npm install -g @wdyy/skills@latest
|
|
56
57
|
wdyy update-skill wdyy-logging-standard
|
|
57
58
|
wdyy update-skill wdyy-ui
|
|
59
|
+
wdyy update-skill wdyy-safety-review
|
|
58
60
|
wdyy update-skill --all
|
|
59
61
|
```
|
|
60
62
|
|
|
61
|
-
`wdyy update-skill <skill-name>` 只接受
|
|
63
|
+
`wdyy update-skill <skill-name>` 只接受 6 个受管理的 `wdyy-*` Skill,且仅替换系统用户目录 `.agents/skills/` 中的指定目录;`--all` 替换全部 6 个受管理 Skill并删除旧的 `wdyy-api-standard`。两种方式都不会写入调用项目的 `AGENTS.md`、`AGENTS_new.md`、`docs/bug_record.md` 或 `.agents/skills/`,也不会执行 `openspec init`。首次初始化或需要重新生成项目规则时,使用 `wdyy init`。
|
|
62
64
|
|
|
63
65
|
部署 Skill 生成的标准流程为:在 Linux、macOS Docker Desktop,或 Windows Docker Desktop + WSL2/Linux 文件系统的项目根目录执行 `./deploy.sh build`,只使用本地已有的 Node、Nginx 基础镜像构建 `<项目名>_frontend:latest` 与 `<项目名>_backend:latest`,分别导出两个镜像 tar,并统一封装为 `deploy/<项目名>-docker.tar.gz`。工程师人工复制并解压该压缩包,在受支持的 Linux engine 上无参数执行 `./deploy.sh` 即校验、加载并整体部署前后端;macOS/arm64 Docker Desktop 可通过禁止拉取的实际目标镜像探针验证并运行 `linux/amd64` 包,而不是仅按 Server 原生架构拒绝。另可执行 `./deploy.sh stop` 和 `./deploy.sh status`。数据库通过 `.env` 直连远程 PostgreSQL,不生成数据库容器;前后端的宿主机与容器端口都来自 `.env`,容器名与镜像 repository 相同,使用 `unless-stopped`,并验证 24 小时制 CST(UTC+8);日志直接保存在部署根 `logs/`。不支持原生 PowerShell 或 Windows 容器模式。
|
|
64
66
|
|
|
65
|
-
中大型变更先使用 `/opsx:explore` 或 `/opsx:propose <change-name>`,在方案确认后使用 `/opsx:apply`;完成验证后使用 `/opsx:archive
|
|
67
|
+
中大型变更先使用 `/opsx:explore` 或 `/opsx:propose <change-name>`,在方案确认后使用 `/opsx:apply`;完成验证后使用 `/opsx:archive`。涉及数据库、日志、部署、医院信息系统 UI 或软件安全审核时,按 `AGENTS.md` 的路由加载相应企业 Skill。自建接口由 Agent 生成 OpenAPI 3.1 YAML 并交工程师验收,第三方接口依据工程师提供的契约或官方文档。所有 URL、端口和 IP 地址从 `.env` 读取,不得硬编码;不得提交秘密或生产环境 `.env`。项目完成后创建 `README.md`,说明技术栈、目录结构和安装部署。
|
|
66
68
|
|
|
67
69
|
## 固定技术栈
|
|
68
70
|
|
package/lib/wdyy-cli.js
CHANGED
|
@@ -11,7 +11,8 @@ const managedSkillNames = [
|
|
|
11
11
|
'wdyy-bug-record',
|
|
12
12
|
'wdyy-logging-standard',
|
|
13
13
|
'wdyy-deployment-standard',
|
|
14
|
-
'wdyy-ui'
|
|
14
|
+
'wdyy-ui',
|
|
15
|
+
'wdyy-safety-review'
|
|
15
16
|
];
|
|
16
17
|
|
|
17
18
|
const removedManagedSkillNames = ['wdyy-api-standard'];
|
|
@@ -115,6 +116,7 @@ const generatedAgentsContent = `# 项目开发规则
|
|
|
115
116
|
| 架构图、时序图、流程图 | \`archify\`,产出放入 \`docs/\` |
|
|
116
117
|
| PostgreSQL 表、DDL、迁移、数据兼容性 | \`wdyy-database-standard\` |
|
|
117
118
|
| 访问、应用、安全与审计日志、W3C trace、净化后的完整业务参数、前端异常上报 | \`wdyy-logging-standard\` |
|
|
119
|
+
| 身份认证与权限、Web/API、文件、敏感数据、代码与依赖、安全日志与漏洞验证的安全审核 | \`wdyy-safety-review\`;主动扫描、漏洞验证或渗透测试须先确认完整授权边界 |
|
|
118
120
|
| 统一 Docker 交付、Linux/Mac/Windows WSL2 双镜像、远程数据库与整栈一键部署 | \`wdyy-deployment-standard\` |
|
|
119
121
|
| 汇总当前任务已解决的 BUG、漏洞或运行异常 | 手动调用 \`wdyy-bug-record\`,追加写入 \`docs/bug_record.md\` |
|
|
120
122
|
|