kld-sdd 2.6.17 → 2.7.3
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/bin/kld-sdd-init.js +4 -0
- package/kld-sdd-guide.html +22 -0
- package/lib/init.js +160 -73
- package/package.json +3 -3
- package/skywalk-sdd/index.cjs +155 -25
- package/skywalk-sdd/lib/git-identity.cjs +270 -0
- package/skywalk-sdd/lib/shared.cjs +150 -2
- package/skywalk-sdd/lib/usage-contract.cjs +207 -0
- package/skywalk-sdd/lib/usage-reporter.cjs +460 -0
- package/skywalk-sdd/lib/user-config.cjs +132 -0
- package/skywalk-sdd/ontology/artifact-parser.cjs +1 -2
- package/templates/git-hooks/commit-msg +58 -15
- package/templates/git-hooks/hooks.config +19 -0
- package/templates/git-hooks/pre-commit +45 -11
- package/templates/git-hooks/pre-commit-consistency-check.cjs +271 -116
- package/templates/git-hooks/pre-push +53 -11
- package/templates/git-hooks/pre-push-consistency-check.cjs +357 -118
- package/templates/skills/kld-sdd/opsx-check/SKILL.md +1 -1
- package/templates/skills/kld-sdd/opsx-consistency-check/SKILL.md +187 -257
- package/templates/skills/kld-sdd/opsx-consistency-check/reference.md +129 -0
- package/templates/skills/kld-sdd/opsx-kb-config/SKILL.md +27 -6
- package/templates/skills/kld-sdd/opsx-kb-config/reference.md +12 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# 判定标准参考
|
|
2
|
+
|
|
3
|
+
## 一、问题分类
|
|
4
|
+
|
|
5
|
+
首先将每个差异归类为以下四种类型之一:
|
|
6
|
+
|
|
7
|
+
| 问题类型 | 说明 | 示例 |
|
|
8
|
+
|---------|------|------|
|
|
9
|
+
| **代码有 spec 没有(业务)** | 代码实现了业务功能但 spec 未描述 | 代码有 `/api/export` 接口但 spec 未记录 |
|
|
10
|
+
| **代码有 spec 没有(技术)** | 代码实现了纯技术支撑逻辑,不涉及业务契约 | 工具方法、防御性校验、日志打印、框架样板代码、DTO 转换 |
|
|
11
|
+
| **spec 有代码没有** | spec 定义了但代码未实现 | spec 定义了权限校验但代码未实现 |
|
|
12
|
+
| **不一致** | 代码和 spec 都有但不匹配 | spec 定义字段 `token`,代码返回 `accessToken` |
|
|
13
|
+
|
|
14
|
+
> **技术实现 vs 业务实现的区分标准**:
|
|
15
|
+
>
|
|
16
|
+
> 以下类别属于**纯技术实现**,不要求 spec 覆盖:
|
|
17
|
+
>
|
|
18
|
+
> | 类别 | 说明 | 示例 |
|
|
19
|
+
> |------|------|------|
|
|
20
|
+
> | 工具/基础设施代码 | 通用工具方法、辅助函数 | `DateUtils.format()`, `StringUtils.isBlank()` |
|
|
21
|
+
> | 防御性代码 | 空值检查、边界保护、异常兜底 | `if (param == null) throw ...` |
|
|
22
|
+
> | 日志/监控代码 | 日志打印、埋点、健康检查 | `log.info("request: {}", param)` |
|
|
23
|
+
> | 框架样板代码 | 框架要求的固定结构 | Spring `@Configuration`、序列化配置 |
|
|
24
|
+
> | DTO/VO 转换 | 对象拷贝、字段映射 | `BeanUtils.copyProperties()` |
|
|
25
|
+
> | 配置类 | 技术配置、环境配置 | 数据库连接池、线程池配置 |
|
|
26
|
+
>
|
|
27
|
+
> **判断原则**:若代码行为不影响外部可观测的业务契约(接口路径、请求/响应字段、业务规则、错误码),则视为纯技术实现。
|
|
28
|
+
|
|
29
|
+
## 二、置信度判定规则
|
|
30
|
+
|
|
31
|
+
按以下顺序依次判定(最终置信度取最严重的结果):
|
|
32
|
+
|
|
33
|
+
**步骤 1:判断 spec 相关的问题(spec 有代码没有 / 不一致)**
|
|
34
|
+
|
|
35
|
+
| 关键性 | 置信度 | 说明 |
|
|
36
|
+
|--------|--------|------|
|
|
37
|
+
| 关键 | **low** | 影响核心业务流程、安全、前端决策 |
|
|
38
|
+
| 非关键 | **medium** | 辅助功能、非核心字段、提示性信息 |
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
示例:
|
|
42
|
+
- spec 定义了核心接口 /api/orders 但代码未实现 → low(关键)
|
|
43
|
+
- spec 定义了权限校验但代码未实现 → low(关键)
|
|
44
|
+
- 缺少提示性错误码 → medium(非关键)
|
|
45
|
+
- 前端非核心字段名与后端不一致 → medium(非关键)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**步骤 2:判断代码多出来的内容(代码有 spec 没有)→ 分级兜底规则**
|
|
49
|
+
|
|
50
|
+
根据代码多出来的内容性质,分级处理:
|
|
51
|
+
|
|
52
|
+
| 代码多出的内容 | 置信度 | 说明 |
|
|
53
|
+
|--------------|--------|------|
|
|
54
|
+
| **业务功能**(接口、业务逻辑、业务错误码) | **low** | 核心业务行为必须有 spec 记录 |
|
|
55
|
+
| **辅助业务功能**(导出、审计、非核心扩展) | **medium** | 辅助功能建议记录但不强制 |
|
|
56
|
+
| **纯技术实现**(工具方法、防御性代码、日志、框架样板、DTO 转换、配置类) | **不降级** | 技术支撑代码不要求 spec 覆盖 |
|
|
57
|
+
|
|
58
|
+
此步骤用于确保业务代码实现都有对应的 spec 记录,同时避免对纯技术细节的过度管控。如果步骤 1 已判定为 low,此步骤结果也是 low,最终结果不变。如果步骤 1 是 medium,此步骤发现代码有**业务功能** spec 没有,则升级为 low。
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
示例:
|
|
62
|
+
- 代码有业务接口 /api/export 但 spec 未记录 → low(业务功能)
|
|
63
|
+
- 代码有权限校验逻辑但 spec 未记录 → low(业务功能)
|
|
64
|
+
- 代码有错误码 400 但 spec 未记录 → low(业务功能)
|
|
65
|
+
- 代码有 DateUtils.format() 工具方法但 spec 未记录 → 不降级(纯技术实现)
|
|
66
|
+
- 代码有 if (param == null) throw 防御性校验但 spec 未记录 → 不降级(纯技术实现)
|
|
67
|
+
- 代码有 log.info() 日志打印但 spec 未记录 → 不降级(纯技术实现)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**最终置信度**:取步骤 1 和步骤 2 中最严重的结果(low > medium > high)。
|
|
71
|
+
|
|
72
|
+
## 三、关键性判断标准
|
|
73
|
+
|
|
74
|
+
步骤 1 中需要判断差异是否"关键",按以下标准执行(满足任一即为关键):
|
|
75
|
+
|
|
76
|
+
**关键(→ low):**
|
|
77
|
+
|
|
78
|
+
| 类别 | 说明 | 示例 |
|
|
79
|
+
|------|------|------|
|
|
80
|
+
| 核心业务流程 | 影响主流程的接口/逻辑 | 登录、注册、下单、支付、审批 |
|
|
81
|
+
| 数据写入操作 | POST / PUT / DELETE / PATCH 操作 | 创建、编辑、删除接口 |
|
|
82
|
+
| 认证与授权 | 决定用户身份和权限的逻辑 | 401→登录页、403→权限页、角色校验 |
|
|
83
|
+
| 安全相关 | 防注入、防越权、敏感数据处理 | 密码加密、SQL 注入防护、数据脱敏 |
|
|
84
|
+
| 前端核心决策字段 | 决定页面跳转、功能开关的字段 | token、userId、status、role |
|
|
85
|
+
| 核心展示字段 | 用户可见的主要数据 | 订单金额、用户名、商品名称 |
|
|
86
|
+
|
|
87
|
+
**非关键(→ medium):**
|
|
88
|
+
|
|
89
|
+
同时满足以下全部条件即为非关键:
|
|
90
|
+
|
|
91
|
+
| 条件 | 说明 |
|
|
92
|
+
|------|------|
|
|
93
|
+
| 不影响核心业务流程 | 非主流程接口 |
|
|
94
|
+
| 不影响前端核心决策 | 不决定页面跳转或功能开关 |
|
|
95
|
+
| 非安全相关 | 不涉及认证、授权、数据校验 |
|
|
96
|
+
| 辅助功能 | 导出、日志、审计、健康检查、监控 |
|
|
97
|
+
|
|
98
|
+
**判断优先级**:当无法明确判断时,**默认视为关键**(宁可误报,不可漏报)。
|
|
99
|
+
|
|
100
|
+
## 四、维度判定参考
|
|
101
|
+
|
|
102
|
+
各维度的 pass/warning/fail 判定参考:
|
|
103
|
+
|
|
104
|
+
| 维度 | pass | warning(→ medium) | fail(→ low) |
|
|
105
|
+
|------|------|------------------|-------------------|
|
|
106
|
+
| **接口契约** | 所有检查项 ✅ | 辅助接口未记录 | 接口差异;代码有**业务接口**但 spec 未记录 |
|
|
107
|
+
| **业务规则** | 所有规则一致 | 非关键规则不一致 | 规则不一致;代码有**业务逻辑**但 spec 未记录 |
|
|
108
|
+
| **校验规则** | 所有约束一致 | 非关键约束不一致 | 必填字段无校验;代码有**业务校验逻辑**但 spec 未记录 |
|
|
109
|
+
| **错误码** | 所有错误码一致 | 非关键错误码缺失 | 错误码不一致;代码有**业务错误码**但 spec 未记录 |
|
|
110
|
+
| **前后端一致性** | 所有字段匹配 | 非核心字段不匹配 | 核心字段不匹配 |
|
|
111
|
+
|
|
112
|
+
> **注意**:纯技术实现(工具方法、防御性代码、日志、框架样板、DTO 转换、配置类)不影响维度判定,各维度均为 pass。
|
|
113
|
+
|
|
114
|
+
## 五、示例
|
|
115
|
+
|
|
116
|
+
| 场景 | 问题类型 | 关键性 | 置信度 |
|
|
117
|
+
|------|---------|--------|--------|
|
|
118
|
+
| 响应字段名错误(token → accessToken) | 不一致 | 关键 | **low** |
|
|
119
|
+
| 缺少密码复杂度校验 | spec 有代码没有 | 关键 | **low** |
|
|
120
|
+
| 代码有业务接口 /api/orders 但 spec 未记录 | 代码有 spec 没有(业务) | — | **low** |
|
|
121
|
+
| 代码有权限校验逻辑但 spec 未记录 | 代码有 spec 没有(业务) | — | **low** |
|
|
122
|
+
| 代码有辅助导出接口但 spec 未记录 | 代码有 spec 没有(业务) | 非关键 | **medium** |
|
|
123
|
+
| spec 定义了核心接口 /api/orders 但代码未实现 | spec 有代码没有 | 关键 | **low** |
|
|
124
|
+
| 缺少提示性错误码 | spec 有代码没有 | 非关键 | **medium** |
|
|
125
|
+
| 前端非核心字段名与后端不一致 | 不一致 | 非关键 | **medium** |
|
|
126
|
+
| 代码有 DateUtils 工具方法但 spec 未记录 | 代码有 spec 没有(技术) | — | **不降级** |
|
|
127
|
+
| 代码有防御性空值校验但 spec 未记录 | 代码有 spec 没有(技术) | — | **不降级** |
|
|
128
|
+
| 代码有日志打印但 spec 未记录 | 代码有 spec 没有(技术) | — | **不降级** |
|
|
129
|
+
| 所有维度完美匹配 | — | — | **high** |
|
|
@@ -35,10 +35,11 @@ allowed-tools:
|
|
|
35
35
|
|
|
36
36
|
| 场景 | 说明 |
|
|
37
37
|
|------|------|
|
|
38
|
-
| 首次配置 | 输入 API Key → 选择 Space/KB → 创建 project-identity.json |
|
|
39
|
-
| 更换 API Key | 清空 apiKey
|
|
38
|
+
| 首次配置 | 输入 API Key → 绑定监控项目(可留空)→ 选择 Space/KB → 创建 project-identity.json |
|
|
39
|
+
| 更换 API Key | 清空 apiKey,重新输入;随后需重新校验监控项目绑定 |
|
|
40
40
|
| 更换知识库 | 清空 targets,重新选择 Space/KB |
|
|
41
|
-
|
|
|
41
|
+
| 绑定/更换监控项目 | 写入或清除 `projectName`(Step 2.5) |
|
|
42
|
+
| 查看当前配置 | 展示已配置的 Space/KB 列表与项目绑定 |
|
|
42
43
|
| 校验配置 | 探活 API + 校验 project_id 与 spaceKey 一致 |
|
|
43
44
|
|
|
44
45
|
## 配置步骤
|
|
@@ -62,7 +63,7 @@ SPEC_ROOT=$(node <spec-package>/skywalk-sdd/spec-root.cjs)
|
|
|
62
63
|
|
|
63
64
|
若 `state.apiKey` 为空或用户要求换密钥:
|
|
64
65
|
|
|
65
|
-
1. 请用户提供 API Key(控制台「API 密钥」创建,scope 建议同时勾选 `context:read` + `archive:ingest
|
|
66
|
+
1. 请用户提供 API Key(控制台「API 密钥」创建,scope 建议同时勾选 `context:read` + `archive:ingest`,使查询与入库都能复用)。
|
|
66
67
|
2. 可选:请用户确认 `api`(默认 `http://10.29.213.80:8080/api`)与 `tenantKey`(默认 `default`)。
|
|
67
68
|
3. 写入 `kb-state.json`(spec 仓根目录,已 gitignore)。
|
|
68
69
|
4. 用 `GET $API/health` 探活;再用 `GET $API/v1/spaces?tenantKey=…` + Bearer 校验 key。
|
|
@@ -72,6 +73,24 @@ SPEC_ROOT=$(node <spec-package>/skywalk-sdd/spec-root.cjs)
|
|
|
72
73
|
- 401/403 → 清掉 apiKey 请用户重贴,勿循环重试。
|
|
73
74
|
- **不要** `POST /auth/login`。
|
|
74
75
|
|
|
76
|
+
### 2.5. 监控项目绑定(`projectName`,可留空)
|
|
77
|
+
|
|
78
|
+
实时监控按"用户 / 项目"维度展示 Run:上传事件时服务端会根据 API 密钥解析上传用户,并按此处绑定的项目名称写入投影(服务端校验该用户必须是项目成员,否则项目留空、不阻断上传)。
|
|
79
|
+
|
|
80
|
+
1. 询问用户项目名称;**留空** → 写 `projectName: null`(不绑定),跳到 Step 3。
|
|
81
|
+
2. 非空 → 用共享库做成员预校验(Bearer = 当前 apiKey):
|
|
82
|
+
```js
|
|
83
|
+
// 临时 .cjs 脚本(遵循本文件头部跨平台规则):
|
|
84
|
+
const shared = require('<SPEC_ROOT>/skywalk-sdd/lib/shared.cjs');
|
|
85
|
+
const r = await shared.verifyProjectMembershipViaServer(SPEC_ROOT, '<项目名称>');
|
|
86
|
+
```
|
|
87
|
+
- `member === true` → `shared.setKbProjectName(SPEC_ROOT, '<项目名称>')` 写入,提示绑定生效。
|
|
88
|
+
- `member === false` → 提示"绑定不会生效,上传记录的项目将留空",让用户选择**重填**或**留空**(`setKbProjectName(SPEC_ROOT, null)`);不要直接保存非成员名称。
|
|
89
|
+
- `ok === false`(`reason: 'endpoint_unavailable'`,服务端未上线该端点或不可达)→ 软警告"平台暂不支持项目成员校验,绑定将在上传时由服务端裁决",允许用户选择保存或留空。
|
|
90
|
+
3. 换密钥后原 `projectName` 可能对新密钥用户失效 → 换密钥流程完成后重走本步校验。
|
|
91
|
+
|
|
92
|
+
> 写入位置:`kb-state.json` 的 `projectName` 键(与 api/apiKey 同文件,已 gitignore)。同步代理每次上报批次时重读该配置,改绑/解绑后新事件即按新配置上报,无需重启或迁移。
|
|
93
|
+
|
|
75
94
|
### 3. 选择空间与知识库(支持多选)
|
|
76
95
|
|
|
77
96
|
若 `state.targets` 为空,或用户要求重新选择:
|
|
@@ -139,6 +158,7 @@ SPEC_ROOT=$(node <spec-package>/skywalk-sdd/spec-root.cjs)
|
|
|
139
158
|
- API 地址:{api}
|
|
140
159
|
- 租户:{tenantKey}
|
|
141
160
|
- API Key:{前缀}****(已配置 / 未配置)
|
|
161
|
+
- 项目绑定:{projectName 或 未绑定}
|
|
142
162
|
- 目标 Space/KB:
|
|
143
163
|
1. {spaceName}(spaceKey: {spaceKey})→ {kbName}
|
|
144
164
|
2. ...
|
|
@@ -149,8 +169,9 @@ SPEC_ROOT=$(node <spec-package>/skywalk-sdd/spec-root.cjs)
|
|
|
149
169
|
|
|
150
170
|
| 用户说 | Agent 做 |
|
|
151
171
|
|--------|----------|
|
|
152
|
-
| 配置知识库 / 首次使用 | 走完 Step 1→2→3→4 |
|
|
153
|
-
| 换密钥 / 重置 API Key | 清 apiKey,重走 Step 2 |
|
|
172
|
+
| 配置知识库 / 首次使用 | 走完 Step 1→2→2.5→3→4 |
|
|
173
|
+
| 换密钥 / 重置 API Key | 清 apiKey,重走 Step 2,再重走 Step 2.5 校验项目绑定 |
|
|
174
|
+
| 换项目 / 重新绑定项目 / 解绑项目 | 重走 Step 2.5(保留 apiKey 与 targets) |
|
|
154
175
|
| 换空间 / 换知识库 / 重新选择 | 清 targets,重走 Step 3→4 |
|
|
155
176
|
| 看配置 / 当前配置 | 读取 kb-state.json + project-identity.json 并展示 |
|
|
156
177
|
| 校验配置 | 探活 + 校验 project_id === spaceKey |
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"api": "http://10.29.213.80:8080/api",
|
|
12
12
|
"tenantKey": "default",
|
|
13
13
|
"apiKey": "sk_sdd_…",
|
|
14
|
+
"projectName": "支付网关重构",
|
|
14
15
|
"updatedAt": "2026-07-19T12:00:00Z",
|
|
15
16
|
"targets": [
|
|
16
17
|
{
|
|
@@ -29,9 +30,18 @@
|
|
|
29
30
|
| `api` | 是 | API 根,含 `/api` |
|
|
30
31
|
| `tenantKey` | 是 | 列空间用;默认 `default` |
|
|
31
32
|
| `apiKey` | 是 | 控制台创建的 `sk_sdd_…`,scope 建议 `context:read` + `archive:ingest` |
|
|
33
|
+
| `projectName` | 否 | 监控项目绑定名;`null`/缺失/空白 = 未绑定,上传批次不携带 `project_name` |
|
|
34
|
+
| `scopes` | 建议 | API Client scope 列表 |
|
|
32
35
|
| `targets` | 操作前必填 | 多选;可为空仅当尚未完成选择 |
|
|
33
36
|
| `updatedAt` | 建议 | ISO-8601 |
|
|
34
37
|
|
|
38
|
+
## 监控项目绑定与上传
|
|
39
|
+
|
|
40
|
+
- 配置期预校验:`GET {api}/v1/sdd-runs/dimensions`(Bearer),返回当前密钥用户可见的 `projects[]`;条目名称匹配即视为成员。端点 404/不可达表示服务端尚未上线该能力 → 软警告后可保存,服务端在上传时做权威裁决(非成员项目置空、不阻断)。
|
|
41
|
+
- 客户端辅助函数:`verifyProjectMembershipViaServer(specRoot, projectName)`(预校验,软返回)、`setKbProjectName(specRoot, projectName|null)`(原子写入/清除),均在 `skywalk-sdd/lib/shared.cjs`。
|
|
42
|
+
- 上传行为:同步代理每次组 batch 时重读 `kb-state.json`;`projectName` 非空 → batch 请求体顶层附带可选 `project_name` 字段(`sdd-progress-batch-v1.schema.json`,1-128 字符);未配置 → 请求体与历史版本完全一致。
|
|
43
|
+
- 环境变量兜底:`ENGINEERING_KB_PROJECT_NAME`(kb-state 无 `projectName` 时生效)。
|
|
44
|
+
|
|
35
45
|
## `project-identity.json`
|
|
36
46
|
|
|
37
47
|
路径:`<spec-root>/skywalk-sdd/project-identity.json`(**提交到 Git,团队共享**)。
|
|
@@ -61,7 +71,8 @@ Authorization: Bearer sk_sdd_…
|
|
|
61
71
|
```
|
|
62
72
|
|
|
63
73
|
- **不要** `POST /auth/login`。
|
|
64
|
-
- Key 在控制台「API 密钥」创建;创建时建议勾选 **读取上下文 / context:read** + **入库 / archive:ingest
|
|
74
|
+
- Key 在控制台「API 密钥」创建;创建时建议勾选 **读取上下文 / context:read** + **入库 / archive:ingest**(查询与入库都需要)。
|
|
75
|
+
- 如需查看 API Client 当前 scopes,可调用 `GET {api}/v1/spaces/{spaceId}/api-clients/me`,响应字段:`data.name`、`data.scopes`(string[])。
|
|
65
76
|
- 401/403:清掉 state 里的 `apiKey`,请用户重贴;勿循环重试。
|
|
66
77
|
|
|
67
78
|
探活与校验(PowerShell 用 `Invoke-RestMethod`,**禁止** `curl`):
|