@alanwang-merit/meritdata-platform-skill-package 1.0.2 → 1.0.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/package.json +9 -6
- package/scripts/postinstall.js +39 -0
- package/CHANGELOG.md +0 -1094
- package/docs//344/270/211/346/226/271skill/346/230/240/345/260/204/345/205/263/347/263/273/346/270/205/345/215/225_20260907.md +0 -349
- package/docs//344/272/214/345/274/20012/351/230/266/346/256/265/345/274/200/345/217/221/346/265/201/347/250/213/346/226/207/346/241/243/346/241/206/346/236/266/346/217/220/345/217/226_20260907.md +0 -286
- package/tools/skill-authoring-workflow/README.md +0 -260
- package/tools/skill-authoring-workflow/templates/SKILL-template.md +0 -35
- package/tools/skill-authoring-workflow/templates/references-template.md +0 -59
- package/tools/skill-stocktake/README.md +0 -121
- package/tools/skill-stocktake/run.sh +0 -153
- package/tools/skill-vetter/README.md +0 -119
- package/tools/skill-vetter/run.sh +0 -294
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
# skill-authoring-workflow
|
|
2
|
-
|
|
3
|
-
> 新建 skill 的标准工作流:模板 + 校验清单 + 流程。
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 1. 新建 skill 流程
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
1. 选定 layer / sub-layer / stack
|
|
11
|
-
↓
|
|
12
|
-
2. 复制模板
|
|
13
|
-
↓
|
|
14
|
-
3. 填 SKILL.md frontmatter
|
|
15
|
-
↓
|
|
16
|
-
4. 写触发 / 不触发 / 前置约束 / 路由
|
|
17
|
-
↓
|
|
18
|
-
5. 编写 references/*.md(详细文档)
|
|
19
|
-
↓
|
|
20
|
-
6. 运行 skill-vetter 校验
|
|
21
|
-
↓
|
|
22
|
-
7. 提交 PR
|
|
23
|
-
↓
|
|
24
|
-
8. 架构组 review
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## 2. 模板
|
|
28
|
-
|
|
29
|
-
### 2.1 SKILL.md 模板
|
|
30
|
-
|
|
31
|
-
```yaml
|
|
32
|
-
---
|
|
33
|
-
name: meritdata-platform-<topic>
|
|
34
|
-
description: <一句话描述 + 触发关键词>。当用户说"<关键词1> / <关键词2> / <关键词3>"时使用。
|
|
35
|
-
metadata:
|
|
36
|
-
version: "1.0.0"
|
|
37
|
-
risk: low|medium|high
|
|
38
|
-
layer: L1 | L2 | L3 | L4
|
|
39
|
-
sub-layer: L2-M | L2-C | L2-F | L3-C | L3-F | L4-T
|
|
40
|
-
stack: methodology | java | frontend | tool
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
# meritdata-platform-<topic>
|
|
44
|
-
|
|
45
|
-
## 触发
|
|
46
|
-
|
|
47
|
-
- 用户说"<关键词1>"
|
|
48
|
-
- 用户说"<关键词2>"
|
|
49
|
-
- <场景 3>
|
|
50
|
-
- <场景 4>
|
|
51
|
-
|
|
52
|
-
## 不触发
|
|
53
|
-
|
|
54
|
-
- <场景 A>(→ `<其他 skill>`)
|
|
55
|
-
- <场景 B>(→ `<其他 skill>`)
|
|
56
|
-
- <场景 C>(→ `<其他 skill>`)
|
|
57
|
-
|
|
58
|
-
## 前置约束
|
|
59
|
-
|
|
60
|
-
- 必须先读 `<rules 文件 1>`
|
|
61
|
-
- 必须遵守 `<rules 文件 2>` §章节
|
|
62
|
-
- 必须引用 `<rules 文件 3>`
|
|
63
|
-
|
|
64
|
-
## 路由
|
|
65
|
-
|
|
66
|
-
- [guide.md](references/guide.md) — <一句话说明>
|
|
67
|
-
- [topic-a.md](references/topic-a.md) — <一句话说明>
|
|
68
|
-
- [topic-b.md](references/topic-b.md) — <一句话说明>
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### 2.2 references/*.md 模板
|
|
72
|
-
|
|
73
|
-
```markdown
|
|
74
|
-
# <标题>
|
|
75
|
-
|
|
76
|
-
> <一句话说明本文件主题>。
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## 1. <章节 1>
|
|
81
|
-
|
|
82
|
-
<内容>
|
|
83
|
-
|
|
84
|
-
### 1.1 <子章节>
|
|
85
|
-
|
|
86
|
-
```java
|
|
87
|
-
// 代码示例
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### 1.2 <子章节>
|
|
91
|
-
|
|
92
|
-
<内容>
|
|
93
|
-
|
|
94
|
-
## 2. <章节 2>
|
|
95
|
-
|
|
96
|
-
<内容>
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## ❌ 反模式
|
|
101
|
-
|
|
102
|
-
### <反模式 1>
|
|
103
|
-
|
|
104
|
-
```java
|
|
105
|
-
// ❌ 错
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
```java
|
|
109
|
-
// ✅ 正确
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## 关联阅读
|
|
115
|
-
|
|
116
|
-
- [guide.md](guide.md) — <一句话>
|
|
117
|
-
- [SKILL.md](../SKILL.md)
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
详见 [templates/SKILL-template.md](templates/SKILL-template.md) 和 [templates/references-template.md](templates/references-template.md)。
|
|
121
|
-
|
|
122
|
-
## 3. 命名规范
|
|
123
|
-
|
|
124
|
-
### 3.1 Skill 命名
|
|
125
|
-
|
|
126
|
-
```
|
|
127
|
-
meritdata-platform-<topic>
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
| 类别 | 命名示例 |
|
|
131
|
-
|------|---------|
|
|
132
|
-
| L1 入口 | `meritdata-platform-playbook` |
|
|
133
|
-
| L2 方法论 | `meritdata-platform-code-spec` |
|
|
134
|
-
| L2 平台能力 | `meritdata-platform-bpm` |
|
|
135
|
-
| L3 单点 API | `meritdata-platform-cache` |
|
|
136
|
-
| L4 工具 | `meritdata-bootstrap-2nd-dev` |
|
|
137
|
-
|
|
138
|
-
### 3.2 文件命名
|
|
139
|
-
|
|
140
|
-
| 类型 | 规则 |
|
|
141
|
-
|------|------|
|
|
142
|
-
| SKILL.md | 固定名 |
|
|
143
|
-
| references/ | kebab-case.md |
|
|
144
|
-
| 索引文件 | guide.md / README.md |
|
|
145
|
-
|
|
146
|
-
## 4. 前置约束写法
|
|
147
|
-
|
|
148
|
-
**必须**引用 rules 文件,**禁止**重复 rules 正文:
|
|
149
|
-
|
|
150
|
-
```markdown
|
|
151
|
-
## 前置约束
|
|
152
|
-
|
|
153
|
-
- 必须遵守 [`rules/code-dev-rules.md`](../../rules/code-dev-rules.md) §八
|
|
154
|
-
- 必须遵守 [`rules/meritdata-platform-data-boundary.md`](../../rules/meritdata-platform-data-boundary.md) §1.1
|
|
155
|
-
- 必须引用 [`rules/naming-conventions-rules.md`](../../rules/naming-conventions-rules.md)
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
## 5. 路由写法
|
|
159
|
-
|
|
160
|
-
**必须**指向 `references/*.md`,**禁止**指向 rules:
|
|
161
|
-
|
|
162
|
-
```markdown
|
|
163
|
-
## 路由
|
|
164
|
-
|
|
165
|
-
- [guide.md](references/guide.md) — 总览
|
|
166
|
-
- [topic-a.md](references/topic-a.md) — 主题 A
|
|
167
|
-
- [topic-b.md](references/topic-b.md) — 主题 B
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
## 6. 校验清单
|
|
171
|
-
|
|
172
|
-
新建 skill 后,跑 [skill-vetter](../skill-vetter/README.md):
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
bash tools/skill-vetter/run.sh meritdata-platform-new-skill
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
通过条件:
|
|
179
|
-
|
|
180
|
-
- [ ] frontmatter 含所有必填字段
|
|
181
|
-
- [ ] 4 大章节齐全(触发 / 不触发 / 前置约束 / 路由)
|
|
182
|
-
- [ ] SKILL.md 行数 ≤ 60
|
|
183
|
-
- [ ] references/ 至少 1 个文件
|
|
184
|
-
- [ ] 前置约束引用 rules(不重复正文)
|
|
185
|
-
- [ ] 路由指向 references/(不指向 rules)
|
|
186
|
-
|
|
187
|
-
## 7. PR 模板
|
|
188
|
-
|
|
189
|
-
```markdown
|
|
190
|
-
## 新建 skill: meritdata-platform-<topic>
|
|
191
|
-
|
|
192
|
-
**Layer**: L2-M / L2-C / L2-F / L3-C / L3-F / L4-T
|
|
193
|
-
**Stack**: methodology / java / frontend / tool
|
|
194
|
-
**Risk**: low / medium / high
|
|
195
|
-
|
|
196
|
-
### 背景
|
|
197
|
-
|
|
198
|
-
<为什么需要这个 skill>
|
|
199
|
-
|
|
200
|
-
### 内容
|
|
201
|
-
|
|
202
|
-
- SKILL.md(~38 行):触发 / 不触发 / 前置约束 / 路由
|
|
203
|
-
- references/guide.md:总览
|
|
204
|
-
- references/topic-a.md:主题 A
|
|
205
|
-
- references/topic-b.md:主题 B
|
|
206
|
-
|
|
207
|
-
### 校验
|
|
208
|
-
|
|
209
|
-
- [ ] skill-vetter 通过
|
|
210
|
-
- [ ] 引用了正确的 rules
|
|
211
|
-
- [ ] 没有重复 rules 正文
|
|
212
|
-
|
|
213
|
-
### Reviewer
|
|
214
|
-
|
|
215
|
-
@架构组
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
## 8. ❌ 反模式
|
|
219
|
-
|
|
220
|
-
### 8.1 ❌ SKILL.md 直接写铁律
|
|
221
|
-
|
|
222
|
-
```markdown
|
|
223
|
-
❌ 错:
|
|
224
|
-
## 数据访问边界
|
|
225
|
-
1. 不映射 PF_ 平台表
|
|
226
|
-
2. 不分页循环 Feign
|
|
227
|
-
...
|
|
228
|
-
|
|
229
|
-
✅ 正确:
|
|
230
|
-
## 前置约束
|
|
231
|
-
- 必须遵守 `rules/meritdata-platform-data-boundary.md`
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
### 8.2 ❌ references 写"是什么"
|
|
235
|
-
|
|
236
|
-
```markdown
|
|
237
|
-
❌ 错:
|
|
238
|
-
# 缓存是什么
|
|
239
|
-
缓存是一种...
|
|
240
|
-
|
|
241
|
-
✅ 正确:
|
|
242
|
-
# 多级缓存配置指南
|
|
243
|
-
## 1. Caffeine L1 配置
|
|
244
|
-
...
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
### 8.3 ❌ SKILL.md 行数过长
|
|
248
|
-
|
|
249
|
-
```markdown
|
|
250
|
-
❌ 错:SKILL.md 100 行(详情都在)
|
|
251
|
-
|
|
252
|
-
✅ 正确:SKILL.md 38 行(路由),详情在 references/
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
## 9. 关联阅读
|
|
256
|
-
|
|
257
|
-
- [templates/SKILL-template.md](templates/SKILL-template.md) — SKILL.md 模板
|
|
258
|
-
- [templates/references-template.md](templates/references-template.md) — references 模板
|
|
259
|
-
- [../skill-vetter/README.md](../skill-vetter/README.md) — 校验
|
|
260
|
-
- [../skill-stocktake/README.md](../skill-stocktake/README.md) — 清单盘点
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: meritdata-platform-<topic>
|
|
3
|
-
description: <一句话描述,包含 3-5 个触发关键词>。当用户说"<kw1> / <kw2> / <kw3>"时使用。
|
|
4
|
-
metadata:
|
|
5
|
-
version: "1.0.0"
|
|
6
|
-
risk: low
|
|
7
|
-
layer: L3
|
|
8
|
-
sub-layer: L3-C
|
|
9
|
-
stack: java
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# meritdata-platform-<topic>
|
|
13
|
-
|
|
14
|
-
## 触发
|
|
15
|
-
|
|
16
|
-
- 用户说"<kw1>"
|
|
17
|
-
- 用户说"<kw2>"
|
|
18
|
-
- <场景 3>
|
|
19
|
-
- <场景 4>
|
|
20
|
-
|
|
21
|
-
## 不触发
|
|
22
|
-
|
|
23
|
-
- <场景 A>(→ `meritdata-platform-<other-skill>`)
|
|
24
|
-
- <场景 B>(→ `meritdata-platform-<other-skill>`)
|
|
25
|
-
|
|
26
|
-
## 前置约束
|
|
27
|
-
|
|
28
|
-
- 必须遵守 [`rules/code-dev-rules.md`](../../rules/code-dev-rules.md)
|
|
29
|
-
- 必须遵守 [`rules/naming-conventions-rules.md`](../../rules/naming-conventions-rules.md)
|
|
30
|
-
|
|
31
|
-
## 路由
|
|
32
|
-
|
|
33
|
-
- [guide.md](references/guide.md) — 总览
|
|
34
|
-
- [topic-a.md](references/topic-a.md) — 主题 A
|
|
35
|
-
- [topic-b.md](references/topic-b.md) — 主题 B
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# <标题>
|
|
2
|
-
|
|
3
|
-
> <一句话说明本文件主题>。
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 1. <章节 1>
|
|
8
|
-
|
|
9
|
-
<内容>
|
|
10
|
-
|
|
11
|
-
### 1.1 <子章节>
|
|
12
|
-
|
|
13
|
-
```java
|
|
14
|
-
// 代码示例
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
### 1.2 <子章节>
|
|
18
|
-
|
|
19
|
-
<内容>
|
|
20
|
-
|
|
21
|
-
## 2. <章节 2>
|
|
22
|
-
|
|
23
|
-
<内容>
|
|
24
|
-
|
|
25
|
-
```java
|
|
26
|
-
// 代码示例
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## 3. <章节 3>
|
|
30
|
-
|
|
31
|
-
### 3.1 <子章节>
|
|
32
|
-
|
|
33
|
-
<内容>
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## ❌ 反模式
|
|
38
|
-
|
|
39
|
-
### ❌ <反模式 1>
|
|
40
|
-
|
|
41
|
-
```java
|
|
42
|
-
// ❌ 错
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
```java
|
|
46
|
-
// ✅ 正确
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### ❌ <反模式 2>
|
|
50
|
-
|
|
51
|
-
<说明>
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
## 关联阅读
|
|
56
|
-
|
|
57
|
-
- [guide.md](guide.md) — <一句话>
|
|
58
|
-
- [SKILL.md](../SKILL.md)
|
|
59
|
-
- [相关 rules](../../rules/<file>.md)
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
# skill-stocktake
|
|
2
|
-
|
|
3
|
-
> 生成 meritdata-platform-suite 中所有 skill 的清单报告。
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 用途
|
|
8
|
-
|
|
9
|
-
- 套件盘点:了解当前 skill 全貌
|
|
10
|
-
- 月度同步:统计 skill 数量 / 规模变化
|
|
11
|
-
- 阶段验收:交付前的清单核查
|
|
12
|
-
- 报告输出:JSON / Markdown 格式
|
|
13
|
-
|
|
14
|
-
## 报告内容
|
|
15
|
-
|
|
16
|
-
- 总数 + references 总行数
|
|
17
|
-
- Layer / Sub-Layer / Stack 分布
|
|
18
|
-
- 每个 skill 的:name / layer / sub-layer / stack / version / risk / SKILL.md 行数 / references 数量 / references 行数
|
|
19
|
-
|
|
20
|
-
## 用法
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
# 控制台输出
|
|
24
|
-
bash tools/skill-stocktake/run.sh
|
|
25
|
-
|
|
26
|
-
# JSON 格式
|
|
27
|
-
bash tools/skill-stocktake/run.sh json stocktake.json
|
|
28
|
-
|
|
29
|
-
# Markdown 格式
|
|
30
|
-
bash tools/skill-stocktake/run.sh markdown stocktake.md
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## 输出示例(console)
|
|
34
|
-
|
|
35
|
-
```
|
|
36
|
-
========================================
|
|
37
|
-
skill-stocktake: skill 清单盘点
|
|
38
|
-
========================================
|
|
39
|
-
生成时间: 2026-09-07 18:30:00
|
|
40
|
-
总数: 35 个 skill
|
|
41
|
-
References 总行数: 12450
|
|
42
|
-
|
|
43
|
-
Layer 分布:
|
|
44
|
-
L1 1
|
|
45
|
-
L2 13
|
|
46
|
-
L3 15
|
|
47
|
-
L4 3
|
|
48
|
-
L5 3
|
|
49
|
-
|
|
50
|
-
Sub-Layer 分布:
|
|
51
|
-
L2-C 6
|
|
52
|
-
L2-F 1
|
|
53
|
-
L2-M 6
|
|
54
|
-
L3-C 13
|
|
55
|
-
L3-F 2
|
|
56
|
-
L4-T 3
|
|
57
|
-
|
|
58
|
-
Skill 列表:
|
|
59
|
-
Name Layer Sub Stack Ver
|
|
60
|
-
---------------------------------------------------------------------------------
|
|
61
|
-
meritdata-platform-backend-deploy L3 L3-C java 1.0.0
|
|
62
|
-
meritdata-platform-bpm L2 L2-C java 1.0.0
|
|
63
|
-
meritdata-platform-cache L3 L3-C java 1.0.0
|
|
64
|
-
...
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## 输出示例(JSON)
|
|
68
|
-
|
|
69
|
-
```json
|
|
70
|
-
{
|
|
71
|
-
"scanTime": "2026-09-07 18:30:00",
|
|
72
|
-
"totalSkills": 35,
|
|
73
|
-
"totalRefLines": 12450,
|
|
74
|
-
"layers": {
|
|
75
|
-
"L1": 1,
|
|
76
|
-
"L2": 13,
|
|
77
|
-
"L3": 15,
|
|
78
|
-
"L4": 3
|
|
79
|
-
},
|
|
80
|
-
"subLayers": {
|
|
81
|
-
"L2-M": 6,
|
|
82
|
-
"L2-C": 6,
|
|
83
|
-
"L2-F": 1,
|
|
84
|
-
"L3-C": 13,
|
|
85
|
-
"L3-F": 2,
|
|
86
|
-
"L4-T": 3
|
|
87
|
-
},
|
|
88
|
-
"skills": [
|
|
89
|
-
{
|
|
90
|
-
"name": "meritdata-platform-cache",
|
|
91
|
-
"layer": "L3",
|
|
92
|
-
"subLayer": "L3-C",
|
|
93
|
-
"stack": "java",
|
|
94
|
-
"version": "1.0.0",
|
|
95
|
-
"risk": "medium",
|
|
96
|
-
"skillLines": 38,
|
|
97
|
-
"refCount": 3,
|
|
98
|
-
"refLines": 720,
|
|
99
|
-
"description": "多级缓存(Caffeine + Redis + DB)"
|
|
100
|
-
}
|
|
101
|
-
]
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
## 集成 CI
|
|
106
|
-
|
|
107
|
-
```yaml
|
|
108
|
-
# GitLab CI
|
|
109
|
-
stocktake:
|
|
110
|
-
stage: report
|
|
111
|
-
script:
|
|
112
|
-
- bash tools/skill-stocktake/run.sh markdown stocktake.md
|
|
113
|
-
artifacts:
|
|
114
|
-
paths:
|
|
115
|
-
- stocktake.md
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## 关联阅读
|
|
119
|
-
|
|
120
|
-
- [../skill-vetter/README.md](../skill-vetter/README.md) — 校验工具
|
|
121
|
-
- [../skill-authoring-workflow/README.md](../skill-authoring-workflow/README.md) — 编写规范
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# skill-stocktake: 生成 meritdata-platform-suite 中所有 skill 的清单报告
|
|
3
|
-
#
|
|
4
|
-
# 用法: bash tools/skill-stocktake/run.sh [output-format] [output-file]
|
|
5
|
-
# output-format: console | json | markdown (默认 console)
|
|
6
|
-
# output-file: 输出文件路径(默认 stdout)
|
|
7
|
-
|
|
8
|
-
set -e
|
|
9
|
-
|
|
10
|
-
SUITE_DIR="${SUITE_DIR:-$(cd "$(dirname "$0")/../.." && pwd)}"
|
|
11
|
-
SKILLS_DIR="$SUITE_DIR/skills"
|
|
12
|
-
FORMAT="${1:-console}"
|
|
13
|
-
OUTPUT="${2:-}"
|
|
14
|
-
|
|
15
|
-
NOW=$(date '+%Y-%m-%d %H:%M:%S')
|
|
16
|
-
|
|
17
|
-
# 收集数据
|
|
18
|
-
skills_data=()
|
|
19
|
-
while IFS= read -r skill_dir; do
|
|
20
|
-
skill_name=$(basename "$skill_dir")
|
|
21
|
-
skill_md="$skill_dir/SKILL.md"
|
|
22
|
-
|
|
23
|
-
if [ ! -f "$skill_md" ]; then
|
|
24
|
-
continue
|
|
25
|
-
fi
|
|
26
|
-
|
|
27
|
-
layer=$(grep -E '^[[:space:]]+layer:' "$skill_md" | head -1 | sed 's/.*layer:[[:space:]]*//')
|
|
28
|
-
sub_layer=$(grep -E '^[[:space:]]+sub-layer:' "$skill_md" | head -1 | sed 's/.*sub-layer:[[:space:]]*//')
|
|
29
|
-
[ -z "$sub_layer" ] && sub_layer="(无)"
|
|
30
|
-
stack=$(grep -E '^[[:space:]]+stack:' "$skill_md" | head -1 | sed 's/.*stack:[[:space:]]*//')
|
|
31
|
-
[ -z "$stack" ] && stack="(无)"
|
|
32
|
-
version=$(grep -E '^[[:space:]]+version:' "$skill_md" | head -1 | sed "s/.*version:[[:space:]]*[\"']//;s/[\"']//")
|
|
33
|
-
risk=$(grep -E '^[[:space:]]+risk:' "$skill_md" | head -1 | sed 's/.*risk:[[:space:]]*//')
|
|
34
|
-
desc=$(grep -E '^description:' "$skill_md" | head -1 | sed 's/description:\s*//')
|
|
35
|
-
skill_lines=$(wc -l < "$skill_md")
|
|
36
|
-
ref_count=$(find "$skill_dir/references" -type f -name '*.md' 2>/dev/null | wc -l)
|
|
37
|
-
ref_lines=$(find "$skill_dir/references" -type f -name '*.md' 2>/dev/null -exec wc -l {} + 2>/dev/null | tail -1 | awk '{print $1}')
|
|
38
|
-
ref_lines=${ref_lines:-0}
|
|
39
|
-
|
|
40
|
-
skills_data+=("$skill_name|$layer|$sub_layer|$stack|$version|$risk|$skill_lines|$ref_count|$ref_lines|$desc")
|
|
41
|
-
done < <(find "$SKILLS_DIR" -mindepth 1 -maxdepth 1 -type d | sort)
|
|
42
|
-
|
|
43
|
-
total_count=${#skills_data[@]}
|
|
44
|
-
total_ref_lines=0
|
|
45
|
-
for line in "${skills_data[@]}"; do
|
|
46
|
-
total_ref_lines=$((total_ref_lines + $(echo "$line" | cut -d'|' -f9)))
|
|
47
|
-
done
|
|
48
|
-
|
|
49
|
-
# 按 layer / sub-layer 统计
|
|
50
|
-
declare -A layer_count
|
|
51
|
-
declare -A sub_layer_count
|
|
52
|
-
declare -A stack_count
|
|
53
|
-
for line in "${skills_data[@]}"; do
|
|
54
|
-
IFS='|' read -r _ l sl s _ _ _ _ _ _ <<< "$line"
|
|
55
|
-
layer_count[$l]=$((${layer_count[$l]:-0} + 1))
|
|
56
|
-
[ -n "$sl" ] && sub_layer_count[$sl]=$((${sub_layer_count[$sl]:-0} + 1))
|
|
57
|
-
[ -n "$s" ] && stack_count[$s]=$((${stack_count[$s]:-0} + 1))
|
|
58
|
-
done
|
|
59
|
-
|
|
60
|
-
# 输出
|
|
61
|
-
output_text=""
|
|
62
|
-
case "$FORMAT" in
|
|
63
|
-
json)
|
|
64
|
-
output_text+="{\n"
|
|
65
|
-
output_text+=" \"scanTime\": \"$NOW\",\n"
|
|
66
|
-
output_text+=" \"totalSkills\": $total_count,\n"
|
|
67
|
-
output_text+=" \"totalRefLines\": $total_ref_lines,\n"
|
|
68
|
-
output_text+=" \"layers\": {\n"
|
|
69
|
-
first=true
|
|
70
|
-
for key in "${!layer_count[@]}"; do
|
|
71
|
-
if [ "$first" = true ]; then first=false; else output_text+=",\n"; fi
|
|
72
|
-
output_text+=" \"$key\": ${layer_count[$key]}"
|
|
73
|
-
done
|
|
74
|
-
output_text+="\n },\n"
|
|
75
|
-
output_text+=" \"subLayers\": {\n"
|
|
76
|
-
first=true
|
|
77
|
-
for key in "${!sub_layer_count[@]}"; do
|
|
78
|
-
if [ "$first" = true ]; then first=false; else output_text+=",\n"; fi
|
|
79
|
-
output_text+=" \"$key\": ${sub_layer_count[$key]}"
|
|
80
|
-
done
|
|
81
|
-
output_text+="\n },\n"
|
|
82
|
-
output_text+=" \"skills\": [\n"
|
|
83
|
-
first=true
|
|
84
|
-
for line in "${skills_data[@]}"; do
|
|
85
|
-
IFS='|' read -r name l sl s v r sl_l rc rl d <<< "$line"
|
|
86
|
-
if [ "$first" = true ]; then first=false; else output_text+=",\n"; fi
|
|
87
|
-
d_escaped=$(echo "$d" | sed 's/"/\\"/g')
|
|
88
|
-
output_text+=" {\"name\":\"$name\",\"layer\":\"$l\",\"subLayer\":\"$sl\",\"stack\":\"$s\",\"version\":\"$v\",\"risk\":\"$r\",\"skillLines\":$sl_l,\"refCount\":$rc,\"refLines\":$rl,\"description\":\"$d_escaped\"}"
|
|
89
|
-
done
|
|
90
|
-
output_text+="\n ]\n"
|
|
91
|
-
output_text+="}\n"
|
|
92
|
-
;;
|
|
93
|
-
|
|
94
|
-
markdown)
|
|
95
|
-
output_text+="# Skill 清单盘点\n\n"
|
|
96
|
-
output_text+="**生成时间**:$NOW\n\n"
|
|
97
|
-
output_text+="**总数**:$total_count 个 skill\n\n"
|
|
98
|
-
output_text+="**总 references 行数**:$total_ref_lines\n\n"
|
|
99
|
-
output_text+="## Layer 分布\n\n"
|
|
100
|
-
output_text+="| Layer | 数量 |\n|-------|------|\n"
|
|
101
|
-
for key in $(echo "${!layer_count[@]}" | tr ' ' '\n' | sort); do
|
|
102
|
-
output_text+="| $key | ${layer_count[$key]} |\n"
|
|
103
|
-
done
|
|
104
|
-
output_text+="\n## Sub-Layer 分布\n\n"
|
|
105
|
-
output_text+="| Sub-Layer | 数量 |\n|-----------|------|\n"
|
|
106
|
-
for key in $(echo "${!sub_layer_count[@]}" | tr ' ' '\n' | sort); do
|
|
107
|
-
output_text+="| $key | ${sub_layer_count[$key]} |\n"
|
|
108
|
-
done
|
|
109
|
-
output_text+="\n## Skill 列表\n\n"
|
|
110
|
-
output_text+="| Name | Layer | Sub-Layer | Stack | Ver | Risk | SKILL 行 | Refs | Ref 行 |\n"
|
|
111
|
-
output_text+="|------|-------|-----------|-------|-----|------|----------|------|--------|\n"
|
|
112
|
-
for line in "${skills_data[@]}"; do
|
|
113
|
-
IFS='|' read -r name l sl s v r sl_l rc rl _ <<< "$line"
|
|
114
|
-
output_text+="| $name | $l | $sl | $s | $v | $r | $sl_l | $rc | $rl |\n"
|
|
115
|
-
done
|
|
116
|
-
;;
|
|
117
|
-
|
|
118
|
-
*)
|
|
119
|
-
# console
|
|
120
|
-
echo "========================================"
|
|
121
|
-
echo " skill-stocktake: skill 清单盘点"
|
|
122
|
-
echo "========================================"
|
|
123
|
-
echo "生成时间: $NOW"
|
|
124
|
-
echo "总数: $total_count 个 skill"
|
|
125
|
-
echo "References 总行数: $total_ref_lines"
|
|
126
|
-
echo ""
|
|
127
|
-
echo "Layer 分布:"
|
|
128
|
-
for key in $(echo "${!layer_count[@]}" | tr ' ' '\n' | sort); do
|
|
129
|
-
printf " %-8s %d\n" "$key" "${layer_count[$key]}"
|
|
130
|
-
done
|
|
131
|
-
echo ""
|
|
132
|
-
echo "Sub-Layer 分布:"
|
|
133
|
-
for key in $(echo "${!sub_layer_count[@]}" | tr ' ' '\n' | sort); do
|
|
134
|
-
printf " %-8s %d\n" "$key" "${sub_layer_count[$key]}"
|
|
135
|
-
done
|
|
136
|
-
echo ""
|
|
137
|
-
echo "Skill 列表:"
|
|
138
|
-
printf " %-45s %-5s %-7s %-12s %s\n" "Name" "Layer" "Sub" "Stack" "Ver"
|
|
139
|
-
echo " ---------------------------------------------------------------------------------"
|
|
140
|
-
for line in "${skills_data[@]}"; do
|
|
141
|
-
IFS='|' read -r name l sl s v _ _ _ _ _ <<< "$line"
|
|
142
|
-
printf " %-45s %-5s %-7s %-12s %s\n" "$name" "$l" "$sl" "$s" "$v"
|
|
143
|
-
done
|
|
144
|
-
echo ""
|
|
145
|
-
;;
|
|
146
|
-
esac
|
|
147
|
-
|
|
148
|
-
if [ -n "$OUTPUT" ]; then
|
|
149
|
-
echo -e "$output_text" > "$OUTPUT"
|
|
150
|
-
echo "已写入: $OUTPUT"
|
|
151
|
-
else
|
|
152
|
-
echo -e "$output_text"
|
|
153
|
-
fi
|