@zhouhao4221/devflow-skills 0.2.0 → 0.3.1
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/README.md +57 -235
- package/install.js +406 -116
- package/package.json +2 -1
- package/plugins/api/skills/api/SKILL.md +102 -0
- package/plugins/api/skills/api-field-mapper/SKILL.md +95 -0
- package/plugins/api/skills/config/SKILL.md +140 -0
- package/plugins/api/skills/gen/SKILL.md +345 -0
- package/plugins/api/skills/help/SKILL.md +121 -0
- package/plugins/api/skills/import/SKILL.md +95 -0
- package/plugins/api/skills/map/SKILL.md +152 -0
- package/plugins/api/skills/search/SKILL.md +95 -0
- package/plugins/diag/skills/audit/SKILL.md +103 -0
- package/plugins/diag/skills/diag/SKILL.md +41 -0
- package/plugins/diag/skills/diagnose/SKILL.md +167 -0
- package/plugins/diag/skills/init/SKILL.md +142 -0
- package/plugins/diag/skills/stack-analyzer/SKILL.md +150 -0
- package/plugins/pm/skills/ask/SKILL.md +89 -0
- package/plugins/pm/skills/brief/SKILL.md +95 -0
- package/plugins/pm/skills/export/SKILL.md +93 -0
- package/plugins/pm/skills/help/SKILL.md +257 -0
- package/plugins/pm/skills/milestone/SKILL.md +102 -0
- package/plugins/pm/skills/monthly/SKILL.md +111 -0
- package/plugins/pm/skills/plan/SKILL.md +96 -0
- package/plugins/pm/skills/pm/SKILL.md +174 -0
- package/plugins/pm/skills/progress/SKILL.md +113 -0
- package/plugins/pm/skills/report-generator/SKILL.md +104 -0
- package/plugins/pm/skills/risk/SKILL.md +223 -0
- package/plugins/pm/skills/standup/SKILL.md +96 -0
- package/plugins/pm/skills/stats/SKILL.md +158 -0
- package/plugins/pm/skills/weekly/SKILL.md +157 -0
- package/plugins/req/skills/branch/SKILL.md +447 -0
- package/plugins/req/skills/cache/SKILL.md +232 -0
- package/plugins/req/skills/changelog/SKILL.md +187 -0
- package/plugins/req/skills/changelog-generator/SKILL.md +106 -0
- package/plugins/req/skills/code-impact-analyzer/SKILL.md +48 -0
- package/plugins/req/skills/commit/SKILL.md +308 -0
- package/plugins/req/skills/dev/SKILL.md +229 -0
- package/plugins/req/skills/dev-guide/SKILL.md +530 -0
- package/plugins/req/skills/do/SKILL.md +191 -0
- package/plugins/req/skills/done/SKILL.md +95 -0
- package/plugins/req/skills/edit/SKILL.md +187 -0
- package/plugins/req/skills/fix/SKILL.md +300 -0
- package/plugins/req/skills/help/SKILL.md +136 -0
- package/plugins/req/skills/init/SKILL.md +505 -0
- package/plugins/req/skills/issue/SKILL.md +237 -0
- package/plugins/req/skills/issue-guide/SKILL.md +125 -0
- package/plugins/req/skills/migrate/SKILL.md +128 -0
- package/plugins/req/skills/modules/SKILL.md +195 -0
- package/plugins/req/skills/natural-language-dispatcher/SKILL.md +545 -0
- package/plugins/req/skills/new/SKILL.md +172 -0
- package/plugins/req/skills/new-quick/SKILL.md +246 -0
- package/plugins/req/skills/pr/SKILL.md +157 -0
- package/plugins/req/skills/prd/SKILL.md +187 -0
- package/plugins/req/skills/prd-analyzer/SKILL.md +131 -0
- package/plugins/req/skills/prd-edit/SKILL.md +201 -0
- package/plugins/req/skills/projects/SKILL.md +115 -0
- package/plugins/req/skills/quick-fix-guide/SKILL.md +51 -0
- package/plugins/req/skills/release/SKILL.md +300 -0
- package/plugins/req/skills/release-rationale/SKILL.md +213 -0
- package/plugins/req/skills/req/SKILL.md +173 -0
- package/plugins/req/skills/requirement-analyzer/SKILL.md +274 -0
- package/plugins/req/skills/review/SKILL.md +201 -0
- package/plugins/req/skills/review-pr/SKILL.md +699 -0
- package/plugins/req/skills/show/SKILL.md +302 -0
- package/plugins/req/skills/specs/SKILL.md +99 -0
- package/plugins/req/skills/split/SKILL.md +164 -0
- package/plugins/req/skills/status/SKILL.md +184 -0
- package/plugins/req/skills/test/SKILL.md +431 -0
- package/plugins/req/skills/test-guide/SKILL.md +304 -0
- package/plugins/req/skills/test_new/SKILL.md +417 -0
- package/plugins/req/skills/test_regression/SKILL.md +298 -0
- package/plugins/req/skills/update/SKILL.md +131 -0
- package/plugins/req/skills/update-template/SKILL.md +203 -0
- package/plugins/req/skills/upgrade/SKILL.md +178 -0
- package/plugins/req/skills/use/SKILL.md +158 -0
- package/plugins/req/skills/version-bumper/SKILL.md +113 -0
- package/plugins/uat/skills/bug/SKILL.md +153 -0
- package/plugins/uat/skills/init/SKILL.md +88 -0
- package/plugins/uat/skills/new/SKILL.md +131 -0
- package/plugins/uat/skills/report/SKILL.md +48 -0
- package/plugins/uat/skills/run/SKILL.md +78 -0
- package/plugins/uat/skills/uat/SKILL.md +64 -0
- package/plugins/uat/skills/uat-executor/SKILL.md +299 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: import
|
|
3
|
+
description: |
|
|
4
|
+
导入 Swagger - 解析 OpenAPI 文档并展示接口概览
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 导入 Swagger
|
|
8
|
+
|
|
9
|
+
从配置的数据源解析 Swagger/OpenAPI 文档,展示接口概览。
|
|
10
|
+
|
|
11
|
+
## 命令格式
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
/api:import [--name=服务名] [--url=临时URL] [--file=临时文件]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 参数说明
|
|
18
|
+
|
|
19
|
+
| 参数 | 说明 |
|
|
20
|
+
|------|------|
|
|
21
|
+
| `--name` | 仅导入指定名称的数据源(默认导入所有) |
|
|
22
|
+
| `--url` | 临时指定 URL,不修改配置文件 |
|
|
23
|
+
| `--file` | 临时指定本地文件,不修改配置文件 |
|
|
24
|
+
|
|
25
|
+
## 执行流程
|
|
26
|
+
|
|
27
|
+
### 前置检查
|
|
28
|
+
|
|
29
|
+
参考 `_common.md` 的「命令执行前置检查」。
|
|
30
|
+
|
|
31
|
+
### 解析流程
|
|
32
|
+
|
|
33
|
+
1. **读取数据源配置**
|
|
34
|
+
- 有 `--url` 或 `--file` 参数 → 使用临时数据源
|
|
35
|
+
- 无参数 → 从 `.api-config.json` 读取所有 sources
|
|
36
|
+
- 有 `--name` → 过滤匹配的 source
|
|
37
|
+
|
|
38
|
+
2. **逐个解析数据源**
|
|
39
|
+
|
|
40
|
+
对每个 source 调用 `swagger-parser.py`(`mode=summary`;URL 数据源用 `--url`,本地文件用 `--file`)。
|
|
41
|
+
|
|
42
|
+
3. **展示解析结果**
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
导入 Swagger 文档
|
|
46
|
+
|
|
47
|
+
=== 主服务 (http://localhost:8080/swagger/doc.json) ===
|
|
48
|
+
版本:OpenAPI 3.0.1
|
|
49
|
+
标题:My API Server
|
|
50
|
+
接口总数:42
|
|
51
|
+
|
|
52
|
+
按 Tag 分组:
|
|
53
|
+
|
|
54
|
+
Tag 数量 描述
|
|
55
|
+
|
|
56
|
+
用户管理 8 用户注册、登录、信息管理
|
|
57
|
+
订单管理 12 订单创建、查询、状态流转
|
|
58
|
+
商品管理 10 商品 CRUD、分类、搜索
|
|
59
|
+
系统设置 6 权限、角色、配置管理
|
|
60
|
+
无分组 6 未归类接口
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
✅ 导入完成,使用 /api:search <关键词> 搜索接口
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
4. **解析失败处理**
|
|
67
|
+
|
|
68
|
+
| 错误 | 提示 |
|
|
69
|
+
|------|------|
|
|
70
|
+
| URL 无法访问 | `❌ 无法访问 <url>,请检查后端服务是否启动` |
|
|
71
|
+
| 文件不存在 | `❌ 文件 <path> 不存在` |
|
|
72
|
+
| 格式错误 | `❌ 文件格式不是有效的 OpenAPI 文档` |
|
|
73
|
+
| Python 未安装 | `❌ 需要 Python 3,请先安装:brew install python3` |
|
|
74
|
+
|
|
75
|
+
## 多数据源导入
|
|
76
|
+
|
|
77
|
+
配置了多个数据源时,逐个导入并汇总:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
导入 Swagger 文档
|
|
81
|
+
|
|
82
|
+
=== 主服务 ===
|
|
83
|
+
接口总数:42 ✅
|
|
84
|
+
|
|
85
|
+
=== 支付服务 ===
|
|
86
|
+
接口总数:15 ✅
|
|
87
|
+
|
|
88
|
+
汇总:2 个数据源,57 个接口
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 注意事项
|
|
92
|
+
|
|
93
|
+
- 每次 import 都是实时解析,不做缓存
|
|
94
|
+
- 大型 Swagger 文档(>500 接口)时,Python 脚本仅输出摘要,具体接口按需查询
|
|
95
|
+
- 如果 Swagger 文档需要认证(如 Bearer Token),需在 URL 中携带或在配置中添加 headers(后续版本支持)
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: map
|
|
3
|
+
description: |
|
|
4
|
+
字段映射 - 分析接口请求/响应字段并映射到前端类型
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 字段映射
|
|
8
|
+
|
|
9
|
+
解析指定 API 接口的请求参数和响应字段,展示后端到前端的完整字段映射关系。
|
|
10
|
+
|
|
11
|
+
## 命令格式
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
/api:map <METHOD> <path> [--name=服务名] [--case=camelCase|snake_case|original]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 参数说明
|
|
18
|
+
|
|
19
|
+
| 参数 | 必填 | 说明 |
|
|
20
|
+
|------|------|------|
|
|
21
|
+
| `METHOD` | 是 | HTTP 方法:GET / POST / PUT / DELETE / PATCH |
|
|
22
|
+
| `path` | 是 | API 路径,如 `/api/v1/users/{id}` |
|
|
23
|
+
| `--name` | 否 | 指定数据源,默认搜索所有数据源 |
|
|
24
|
+
| `--case` | 否 | 覆盖配置的字段命名风格 |
|
|
25
|
+
|
|
26
|
+
## 执行流程
|
|
27
|
+
|
|
28
|
+
### 前置检查
|
|
29
|
+
|
|
30
|
+
参考 `_common.md` 的「命令执行前置检查」。
|
|
31
|
+
|
|
32
|
+
### 映射流程
|
|
33
|
+
|
|
34
|
+
1. **解析接口定义**
|
|
35
|
+
|
|
36
|
+
调用 `swagger-parser.py`(`mode=detail`,传入接口路径),获取该接口的完整 schema(参数、请求体、响应体、$ref 解析后的结构)。
|
|
37
|
+
|
|
38
|
+
2. **AI 分析字段映射**
|
|
39
|
+
|
|
40
|
+
读取 Python 脚本输出的 JSON,按 `_common.md` 中的「字段映射规则」和「类型映射」进行分析。
|
|
41
|
+
|
|
42
|
+
3. **展示映射结果**
|
|
43
|
+
|
|
44
|
+
分三个部分展示:路径/查询参数、请求体、响应体。
|
|
45
|
+
|
|
46
|
+
### 输出格式
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
字段映射:GET /api/v1/users/{id}
|
|
50
|
+
|
|
51
|
+
描述:获取用户详情
|
|
52
|
+
Tag:用户管理
|
|
53
|
+
|
|
54
|
+
路径参数
|
|
55
|
+
|
|
56
|
+
| 字段 | 类型 | 必填 | 前端字段名 | 说明 |
|
|
57
|
+
|------|------|------|-----------|------|
|
|
58
|
+
| id | integer | ✅ | id | 用户ID |
|
|
59
|
+
|
|
60
|
+
查询参数
|
|
61
|
+
|
|
62
|
+
(无)
|
|
63
|
+
|
|
64
|
+
响应字段映射 (200)
|
|
65
|
+
|
|
66
|
+
| # | 后端字段 | 类型 | 必填 | 前端字段名 | 转换 | 说明 |
|
|
67
|
+
|---|---------|------|------|-----------|------|------|
|
|
68
|
+
| 1 | id | integer | ✅ | id | — | 用户ID |
|
|
69
|
+
| 2 | user_name | string | ✅ | userName | snake→camel | 用户名 |
|
|
70
|
+
| 3 | avatar_url | string | — | avatarUrl | snake→camel | 头像地址 |
|
|
71
|
+
| 4 | email | string | ✅ | email | — | 邮箱 |
|
|
72
|
+
| 5 | created_at | string(date-time) | ✅ | createdAt | snake→camel | 创建时间 |
|
|
73
|
+
| 6 | is_active | boolean | — | isActive | snake→camel | 是否激活 |
|
|
74
|
+
| 7 | role_list | array | — | roleList | snake→camel | 角色列表 |
|
|
75
|
+
| 7.1 | role_id | integer | ✅ | roleId | snake→camel | 角色ID |
|
|
76
|
+
| 7.2 | role_name | string | ✅ | roleName | snake→camel | 角色名 |
|
|
77
|
+
| 8 | department | object | — | department | — | 所属部门 |
|
|
78
|
+
| 8.1 | dept_id | integer | ✅ | deptId | snake→camel | 部门ID |
|
|
79
|
+
| 8.2 | dept_name | string | ✅ | deptName | snake→camel | 部门名 |
|
|
80
|
+
|
|
81
|
+
TypeScript 类型预览
|
|
82
|
+
|
|
83
|
+
interface UserDetailResponse {
|
|
84
|
+
id: number;
|
|
85
|
+
userName: string;
|
|
86
|
+
avatarUrl?: string;
|
|
87
|
+
email: string;
|
|
88
|
+
createdAt: string;
|
|
89
|
+
isActive?: boolean;
|
|
90
|
+
roleList?: {
|
|
91
|
+
roleId: number;
|
|
92
|
+
roleName: string;
|
|
93
|
+
}[];
|
|
94
|
+
department?: {
|
|
95
|
+
deptId: number;
|
|
96
|
+
deptName: string;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
使用 /api:gen GET /api/v1/users/{id} 生成完整代码
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### POST/PUT 请求体映射
|
|
104
|
+
|
|
105
|
+
POST/PUT 等有请求体的接口,额外展示请求体映射:
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
请求体字段映射 (application/json)
|
|
109
|
+
|
|
110
|
+
| # | 后端字段 | 类型 | 必填 | 前端字段名 | 转换 | 说明 |
|
|
111
|
+
|---|---------|------|------|-----------|------|------|
|
|
112
|
+
| 1 | user_name | string | ✅ | userName | snake→camel | 用户名 |
|
|
113
|
+
| 2 | email | string | ✅ | email | — | 邮箱 |
|
|
114
|
+
| 3 | password | string | ✅ | password | — | 密码 |
|
|
115
|
+
| 4 | role_ids | array[integer] | — | roleIds | snake→camel | 角色ID列表 |
|
|
116
|
+
|
|
117
|
+
TypeScript 类型预览
|
|
118
|
+
|
|
119
|
+
interface CreateUserParams {
|
|
120
|
+
userName: string;
|
|
121
|
+
email: string;
|
|
122
|
+
password: string;
|
|
123
|
+
roleIds?: number[];
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 嵌套对象处理
|
|
128
|
+
|
|
129
|
+
- 嵌套对象使用 `` 缩进展示层级关系
|
|
130
|
+
- 编号使用点号分隔表示层级(如 `7.1`、`7.2`)
|
|
131
|
+
- TypeScript 类型中,嵌套对象复杂时提取为独立 interface
|
|
132
|
+
|
|
133
|
+
### 接口未找到
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
❌ 未找到接口:GET /api/v1/users/{id}
|
|
137
|
+
|
|
138
|
+
可能原因:
|
|
139
|
+
- 路径拼写有误
|
|
140
|
+
- 使用 /api:search 用户 查找正确路径
|
|
141
|
+
- 使用 /api:import 确认数据源已导入
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## 批量映射
|
|
145
|
+
|
|
146
|
+
支持通配符批量映射同一路径下的所有方法:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
/api:map * /api/v1/users/{id}
|
|
150
|
+
|
|
151
|
+
→ 展示 GET、PUT、DELETE /api/v1/users/{id} 的所有映射
|
|
152
|
+
```
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: search
|
|
3
|
+
description: |
|
|
4
|
+
搜索接口 - 按关键词搜索 Swagger 中的 API 接口
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 搜索接口
|
|
8
|
+
|
|
9
|
+
从 Swagger 文档中按关键词搜索匹配的 API 接口。
|
|
10
|
+
|
|
11
|
+
## 命令格式
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
/api:search <关键词> [--name=服务名] [--tag=分组名] [--method=GET|POST|PUT|DELETE]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 参数说明
|
|
18
|
+
|
|
19
|
+
| 参数 | 必填 | 说明 |
|
|
20
|
+
|------|------|------|
|
|
21
|
+
| `关键词` | 是 | 搜索关键词,匹配路径、描述、summary |
|
|
22
|
+
| `--name` | 否 | 指定数据源名称,默认搜索所有 |
|
|
23
|
+
| `--tag` | 否 | 按 Tag 分组过滤 |
|
|
24
|
+
| `--method` | 否 | 按 HTTP 方法过滤 |
|
|
25
|
+
|
|
26
|
+
## 执行流程
|
|
27
|
+
|
|
28
|
+
### 前置检查
|
|
29
|
+
|
|
30
|
+
参考 `_common.md` 的「命令执行前置检查」。
|
|
31
|
+
|
|
32
|
+
### 搜索流程
|
|
33
|
+
|
|
34
|
+
1. **读取数据源配置**
|
|
35
|
+
|
|
36
|
+
2. **调用 `swagger-parser.py`**(`mode=search`,传入关键词)搜索匹配接口。
|
|
37
|
+
|
|
38
|
+
3. **展示搜索结果**
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
搜索「用户」
|
|
42
|
+
|
|
43
|
+
找到 5 个匹配接口(主服务):
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# 方法 路径 描述
|
|
47
|
+
|
|
48
|
+
1 GET /api/v1/users 获取用户列表
|
|
49
|
+
2 POST /api/v1/users 创建用户
|
|
50
|
+
3 GET /api/v1/users/{id} 获取用户详情
|
|
51
|
+
4 PUT /api/v1/users/{id} 更新用户信息
|
|
52
|
+
5 DELETE /api/v1/users/{id} 删除用户
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
使用 /api:map GET /api/v1/users/{id} 查看字段映射
|
|
56
|
+
使用 /api:gen GET /api/v1/users/{id} 生成代码
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
4. **无结果时**
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
搜索「xxx」
|
|
63
|
+
|
|
64
|
+
未找到匹配接口。
|
|
65
|
+
|
|
66
|
+
尝试:
|
|
67
|
+
- 使用更短的关键词
|
|
68
|
+
- /api:import 确认数据源已导入
|
|
69
|
+
- /api:search --tag=用户管理 按分组浏览
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 搜索匹配规则
|
|
73
|
+
|
|
74
|
+
关键词同时匹配以下字段(任一匹配即返回):
|
|
75
|
+
- API 路径(如 `/users` 匹配 `/api/v1/users`)
|
|
76
|
+
- summary / description(中英文模糊匹配)
|
|
77
|
+
- operationId
|
|
78
|
+
- Tag 名称
|
|
79
|
+
|
|
80
|
+
### 按 Tag 浏览
|
|
81
|
+
|
|
82
|
+
不传关键词时列出所有 Tag 供浏览:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
/api:search --tag=用户管理
|
|
86
|
+
|
|
87
|
+
用户管理 — 8 个接口
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# 方法 路径 描述
|
|
91
|
+
|
|
92
|
+
1 GET /api/v1/users 获取用户列表
|
|
93
|
+
...... ... ...
|
|
94
|
+
|
|
95
|
+
```
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audit
|
|
3
|
+
description: |
|
|
4
|
+
查询 Diag 审计日志 - 按主机/服务/时间过滤
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /diag:audit - 审计查询
|
|
8
|
+
|
|
9
|
+
查询 Diag 插件的 SSH 命令审计日志。审计记录按日切分,保留 30 天。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 参数
|
|
14
|
+
|
|
15
|
+
| 参数 | 说明 | 默认 |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| `--host=<name>` | 按目标主机过滤 | 全部 |
|
|
18
|
+
| `--service=<name>` | 按服务名过滤 | 全部 |
|
|
19
|
+
| `--from=YYYY-MM-DD` | 起始日期(本地时区) | 7 天前 |
|
|
20
|
+
| `--to=YYYY-MM-DD` | 截止日期 | 今天 |
|
|
21
|
+
| `--limit=<N>` | 最多输出条数 | 50 |
|
|
22
|
+
| `--temp-files` | 只显示有远端临时文件写入的记录 | 关闭 |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 执行流程
|
|
27
|
+
|
|
28
|
+
### 1. 扫描审计文件
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
ls ~/.claude-diag/audit/command_audit-*.jsonl 2>/dev/null
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
若目录不存在或无文件 → 提示"暂无审计记录,`/diag:init` 初始化后使用 `/diag:diagnose` 会产生记录"。
|
|
35
|
+
|
|
36
|
+
### 2. 按日期过滤文件
|
|
37
|
+
|
|
38
|
+
审计文件名是 `command_audit-YYYY-MM-DD.jsonl`,按 `--from` / `--to` 范围筛选要读的文件。
|
|
39
|
+
|
|
40
|
+
默认 `--from` = 今天前 7 天,`--to` = 今天。
|
|
41
|
+
|
|
42
|
+
### 3. 读取并过滤记录
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
cat ~/.claude-diag/audit/command_audit-{dates}.jsonl | jq -c '
|
|
46
|
+
select(
|
|
47
|
+
(.host == "<host>" or "<host>" == "") and
|
|
48
|
+
(.service == "<service>" or "<service>" == "")
|
|
49
|
+
)
|
|
50
|
+
' | tail -n <limit>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
字段:`timestamp / session_id / diag_session_id / operator / host / service / command / exit_code / stdout_length / log_snippet_hash / tmp_write / hooks_passed`
|
|
54
|
+
|
|
55
|
+
`--temp-files` 时用 jq 过滤 `tmp_write != null`:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
cat ... | jq -c 'select(.tmp_write != null)'
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 4. 格式化输出
|
|
62
|
+
|
|
63
|
+
表格形式(默认):
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
Diag 审计(2026-04-13 至 2026-04-20,共 23 条)
|
|
67
|
+
|
|
68
|
+
时间 主机 服务 命令 退出码
|
|
69
|
+
2026-04-20T02:30:15Z prod-web-01 order-api ssh prod-web-01 tail -n 2000 /v/l/order.l 0
|
|
70
|
+
2026-04-20T02:31:08Z prod-web-01 order-api ssh prod-web-01 grep ERROR /v/l/order.l 0
|
|
71
|
+
2026-04-19T22:05:42Z prod-web-02 user-svc ssh prod-web-02 tail -n 500 /v/l/user.log 0
|
|
72
|
+
...
|
|
73
|
+
|
|
74
|
+
完整记录:cat ~/.claude-diag/audit/command_audit-*.jsonl | jq '.'
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
聚合摘要(若记录 > 20):
|
|
78
|
+
```
|
|
79
|
+
统计
|
|
80
|
+
- 主机分布:prod-web-01 (15), prod-web-02 (8)
|
|
81
|
+
- 服务分布:order-api (15), user-svc (8)
|
|
82
|
+
- 成功率:23/23 (100%)
|
|
83
|
+
- 高频命令:tail (18), grep (5)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 5. 边界说明
|
|
87
|
+
|
|
88
|
+
- 审计日志**不含** stdout 全文(只存 SHA-256 哈希 + 字节长度),保护敏感信息
|
|
89
|
+
- 若审计文件损坏(无效 JSON 行),跳过该行并提示"⚠️ 第 N 行 JSON 解析失败"
|
|
90
|
+
- 只读查询,**不修改**审计文件
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 常用场景
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
/diag:audit # 近 7 天全部
|
|
98
|
+
/diag:audit --host=prod-web-01 # 指定主机
|
|
99
|
+
/diag:audit --service=order-api --from=2026-04-15 # 服务 + 起始日期
|
|
100
|
+
/diag:audit --limit=5 # 只看最近 5 条
|
|
101
|
+
/diag:audit --temp-files # 只看有远端临时文件写入的记录
|
|
102
|
+
/diag:audit --temp-files --host=prod-web-01 # 指定主机的临时文件记录
|
|
103
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: diag
|
|
3
|
+
description: |
|
|
4
|
+
生产诊断插件 - 列出 init / diagnose / audit 子命令
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Diag - 生产诊断插件
|
|
8
|
+
|
|
9
|
+
**只读拉日志 · AI 解析堆栈 · 关联代码 · 给修复建议**
|
|
10
|
+
|
|
11
|
+
与 [claude-safe-ops](https://github.com/zhouhao4221/claude-safe-ops) 互补:它管**执行类**运维动作,本插件管**只读诊断**。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 子命令
|
|
16
|
+
|
|
17
|
+
| 命令 | 用途 |
|
|
18
|
+
|---|---|
|
|
19
|
+
| `/diag:init` | 初始化 `~/.claude-diag/` + 生成服务清单模板 + 依赖检查 |
|
|
20
|
+
| `/diag:diagnose <报错描述> [--service=<name>]` | 报错定位主流程(SSH 拉日志 → 堆栈解析 → 代码关联 → 修复建议) |
|
|
21
|
+
| `/diag:audit [--host] [--service] [--from] [--to] [--limit]` | 审计日志查询(默认近 7 天) |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 快速开始
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
/diag:init # 初始化配置
|
|
29
|
+
# 编辑 ~/.claude-diag/config/services.yaml,登记真实服务
|
|
30
|
+
/diag:diagnose 订单接口刚才报 500 # 开始诊断
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 核心边界
|
|
36
|
+
|
|
37
|
+
- ✅ **读**:`tail / head / cat / grep / awk / sed / less / wc / find -name / ls / ps / df / free / uptime` 等只读命令
|
|
38
|
+
- ❌ **写**:禁止 `rm / mv / cp / chmod / 重定向 / 服务控制 / 包管理 / DB 写 / 一切修改类操作`
|
|
39
|
+
- ❌ **代码**:修复建议以文字形式给出,插件**不触发** Edit / Write 改动仓库
|
|
40
|
+
|
|
41
|
+
所有 SSH 操作都会被 5 类风控 Hook 拦截校验,并落 JSONL 审计。
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: diagnose
|
|
3
|
+
description: |
|
|
4
|
+
生产报错定位 - SSH 拉日志 → AI 解析堆栈 → 本地代码关联 → 修复建议
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /diag:diagnose - 报错定位
|
|
8
|
+
|
|
9
|
+
通过自然语言描述报错 → 插件拉取生产日志 → AI 识别堆栈 → 在本地代码关联源码 → 输出诊断报告和修复建议。
|
|
10
|
+
|
|
11
|
+
**全程只读**,所有 SSH 命令都会经过 5 类 Hook 校验,审计落盘。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 参数
|
|
16
|
+
|
|
17
|
+
| 参数 | 说明 | 默认 |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| `<报错描述>` | 自然语言描述(必填),如 "订单提交接口刚才报 500" | - |
|
|
20
|
+
| `--service=<name>` | 指定服务(可选,否则让用户选) | - |
|
|
21
|
+
| `--lines=<N>` | 拉取日志的行数(tail -n N) | 2000 |
|
|
22
|
+
| `--pattern=<regex>` | grep 过滤的正则,覆盖默认 | `ERROR\|Exception\|FATAL\|PANIC` |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 执行流程
|
|
27
|
+
|
|
28
|
+
### 0. Session 初始化
|
|
29
|
+
|
|
30
|
+
每次执行 `/diag:diagnose` 时,在读取服务清单前先完成 session 管理:
|
|
31
|
+
|
|
32
|
+
1. 清理本地超过 2h 的遗留 session 文件(`$DIAG_HOME/tmp/.current-session`、`runtime/tmp-*.json`)
|
|
33
|
+
2. 若上一轮 session 文件仍存在,读取旧 session id,对本次诊断涉及的每台主机各执行一次远端清理(`rm -f /tmp/claude-diag-<OLD_SESSION>-*`);此命令通过 write-guard 的 tmp 白名单,审计落盘
|
|
34
|
+
3. 生成新 session id(8 位十六进制),写入本地 session 文件
|
|
35
|
+
|
|
36
|
+
### 1. 读取服务清单
|
|
37
|
+
|
|
38
|
+
调用 `services-config.sh list` 获取服务列表。配置文件不存在 → 提示 `/diag:init`,终止。
|
|
39
|
+
|
|
40
|
+
### 2. 选择目标服务
|
|
41
|
+
|
|
42
|
+
- `--service` 已指定 → 校验存在后使用
|
|
43
|
+
- 未指定 → 向用户展示服务列表,让用户选(单选或"全部")
|
|
44
|
+
|
|
45
|
+
也接受自然语言匹配:用户描述里提到 "订单接口",AI 可以匹配 `order-api` 服务,展示后让用户确认。
|
|
46
|
+
|
|
47
|
+
### 3. 构造 SSH 拉日志命令
|
|
48
|
+
|
|
49
|
+
从选中服务读取:
|
|
50
|
+
- `host`
|
|
51
|
+
- `log_paths`(数组)
|
|
52
|
+
- `language_hint`(可选,传给 stack-analyzer 技能作识别提示)
|
|
53
|
+
|
|
54
|
+
**命令模板**(每条日志单独执行一次):
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# 标准只读(优先使用)
|
|
58
|
+
ssh <host> "tail -n <lines> <log_path> | grep -B2 -A 30 -E '<pattern>'"
|
|
59
|
+
|
|
60
|
+
# 落远端临时文件(数据量大、需要多步处理时使用)
|
|
61
|
+
ssh <host> "tail -n <lines> <log_path> | grep -E '<pattern>' | tee -a /tmp/claude-diag-<session>-<topic>.log"
|
|
62
|
+
# 之后读回
|
|
63
|
+
ssh <host> "cat /tmp/claude-diag-<session>-<topic>.log"
|
|
64
|
+
# 清理(诊断结束时执行)
|
|
65
|
+
ssh <host> "rm -f /tmp/claude-diag-<session>-*"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**命令约束**:
|
|
69
|
+
- 优先纯 stream(stdout 回本地),避免不必要的远端写入
|
|
70
|
+
- 远端临时文件路径必须以 `/tmp/claude-diag-<session>-` 开头(`<session>` 即当前 session id)
|
|
71
|
+
- 写入只允许 `tee -a`(append),禁止裸 `>` / `>>`
|
|
72
|
+
- 清理只允许 `rm -f /tmp/claude-diag-<session>-*`,禁止 `-r` / `-rf`
|
|
73
|
+
- 禁止在 `/tmp` 下创建子目录
|
|
74
|
+
- 生产机 `/tmp` 可能有容量或 noexec 限制;若 `tee -a` 失败,降级到纯 stream 模式
|
|
75
|
+
- 目标 host 必须在 `services.yaml` 登记
|
|
76
|
+
|
|
77
|
+
### 4. 执行 SSH 拉日志
|
|
78
|
+
|
|
79
|
+
通过 Bash 工具执行构造好的命令。Hook 链会依次校验:
|
|
80
|
+
- `validate-hooks`(首次校验完整性)
|
|
81
|
+
- `host-whitelist`(host 在白名单)
|
|
82
|
+
- `command-whitelist`(每个 verb 在白名单)
|
|
83
|
+
- `write-guard`(无写操作)
|
|
84
|
+
|
|
85
|
+
若任一 Hook 拒绝 → 展示拒绝理由给用户,**不要**尝试绕过(如删选项、改写命令),而是向用户说明并询问是否调整需求。
|
|
86
|
+
|
|
87
|
+
### 5. AI 识别堆栈(stack-analyzer 技能)
|
|
88
|
+
|
|
89
|
+
日志拉回后,由 `stack-analyzer` 技能(自动触发)根据 `language_hint` 识别堆栈格式,抽取:
|
|
90
|
+
- 异常类 / 错误类型
|
|
91
|
+
- 错误消息
|
|
92
|
+
- 堆栈帧(文件、行号、方法名)
|
|
93
|
+
|
|
94
|
+
### 6. 本地代码关联
|
|
95
|
+
|
|
96
|
+
对每个堆栈帧:
|
|
97
|
+
- 用 `Grep` 在当前仓库按 类名 / 方法名 / 文件名 查找
|
|
98
|
+
- 用 `Read` 查看命中位置的前后 15 行,理解上下文
|
|
99
|
+
|
|
100
|
+
若堆栈帧对应的源码在当前仓库找不到 → 标注"**本仓库外**",不强行定位。
|
|
101
|
+
|
|
102
|
+
### 7. 生成诊断报告
|
|
103
|
+
|
|
104
|
+
**固定模板**:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
原因:<异常类型> - <根本原因推断>
|
|
108
|
+
|
|
109
|
+
相关代码:
|
|
110
|
+
- <file_path>:<line> - <方法/类>(<匹配方式:精确匹配 / 模糊匹配 / 本仓库外>)
|
|
111
|
+
- ...
|
|
112
|
+
|
|
113
|
+
完整堆栈:
|
|
114
|
+
<堆栈前 5-10 帧>
|
|
115
|
+
|
|
116
|
+
修复建议:
|
|
117
|
+
<具体到文件/函数的文字建议;必要时给出代码片段,但不自动应用>
|
|
118
|
+
|
|
119
|
+
审计:
|
|
120
|
+
- 主机:<host>
|
|
121
|
+
- 拉取日志:<log_paths>
|
|
122
|
+
- SSH 命令:<3-5 条>
|
|
123
|
+
- 审计记录:~/.claude-diag/audit/command_audit-<date>.jsonl
|
|
124
|
+
|
|
125
|
+
未改动任何远程资源和本地代码。如需应用修复,你自己决定并手动执行。
|
|
126
|
+
|
|
127
|
+
Session 清理:
|
|
128
|
+
- 远端临时文件:/tmp/claude-diag-<session>-* 已清理 / 无遗留
|
|
129
|
+
- 本地 session 文件:~/.claude-diag/tmp/.current-session
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 8. 清理远端临时文件
|
|
133
|
+
|
|
134
|
+
诊断结束后(输出报告之前),对本次涉及的每台主机执行清理:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
ssh <host> "rm -f /tmp/claude-diag-<session>-*"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**条件**:仅在本次诊断过程中确实用了 `tee -a` 写入过远端临时文件时执行;纯 stream 模式无需清理。
|
|
141
|
+
|
|
142
|
+
清理失败不中断诊断报告输出,但在 Session 清理一栏标注"⚠️ 清理失败,请手动执行"。
|
|
143
|
+
|
|
144
|
+
### 9. 可选:追查链路
|
|
145
|
+
|
|
146
|
+
若用户要求深入("再看下 user.log"),按同样流程再拉一次,不主动扩大范围。
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 边界
|
|
151
|
+
|
|
152
|
+
- **只拉日志**:本期不查 DB、不摸文件内容、不看进程
|
|
153
|
+
- **不改代码**:修复建议纯文字,不触发 Edit / Write
|
|
154
|
+
- **不递归**:Claude 不应在本次会话中"为了调查而 SSH 到其他未登记主机"
|
|
155
|
+
- **审计友好**:所有 SSH 命令走 Bash 工具,自动被 `audit-log.sh` 记录
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 故障排查
|
|
160
|
+
|
|
161
|
+
| 现象 | 可能原因 |
|
|
162
|
+
|---|---|
|
|
163
|
+
| Hook 拒绝 host | 服务未在 `services.yaml` 登记 → `/diag:init` 补充 |
|
|
164
|
+
| Hook 拒绝命令 | AI 构造了非白名单命令,需要调整(如不要用 `tee`) |
|
|
165
|
+
| 拉不到日志 | SSH 本身不通(key / agent / 网络)→ 先本地测 `ssh <host> echo ok` |
|
|
166
|
+
| 堆栈识别不准 | 服务设置 `language_hint` 后重试;或把日志片段粘给用户让其确认 |
|
|
167
|
+
| 本地找不到代码 | 堆栈属于第三方依赖或其他仓库,标注后跳过,不要硬猜 |
|