sumulige-claude 1.1.1 → 1.1.2
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/.claude/settings.local.json +3 -1
- package/AGENTS.md +416 -177
- package/Q&A.md +230 -213
- package/README.md +256 -230
- package/docs/DEVELOPMENT.md +329 -291
- package/package.json +1 -1
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -1,115 +1,192 @@
|
|
|
1
|
-
# Development Guide -
|
|
1
|
+
# Development Guide - 开发指南
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## 目录
|
|
6
|
-
|
|
7
|
-
- [架构概述](#架构概述)
|
|
8
|
-
- [项目结构](#项目结构)
|
|
9
|
-
- [添加新技能](#添加新技能)
|
|
10
|
-
- [同步机制原理](#同步机制原理)
|
|
11
|
-
- [命令开发](#命令开发)
|
|
12
|
-
- [调试指南](#调试指南)
|
|
3
|
+
> 从零开始理解项目架构,逐步深入开发细节
|
|
13
4
|
|
|
14
5
|
---
|
|
15
6
|
|
|
16
|
-
##
|
|
7
|
+
## Level 1: 项目概述 (5 分钟)
|
|
17
8
|
|
|
18
|
-
###
|
|
9
|
+
### 这是一个什么项目?
|
|
19
10
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
└─────────────────────────────────────────────────────────────┘
|
|
28
|
-
│ │ │
|
|
29
|
-
▼ ▼ ▼
|
|
30
|
-
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
|
|
31
|
-
│ sources.yaml │ │ sync-external.mjs│ │ update-registry │
|
|
32
|
-
│ │ │ │ │ .mjs │
|
|
33
|
-
└──────────────────┘ └──────────────────┘ └──────────────────┘
|
|
34
|
-
│ │ │
|
|
35
|
-
▼ ▼ ▼
|
|
36
|
-
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
|
|
37
|
-
│ External Repos │ │ Template Skills │ │ marketplace.json │
|
|
38
|
-
│ (GitHub) │ │ │ │ │
|
|
39
|
-
└──────────────────┘ └──────────────────┘ └──────────────────┘
|
|
40
|
-
```
|
|
11
|
+
**一句话**:为 Claude Code 添加多 Agent 编排能力的 CLI 工具。
|
|
12
|
+
|
|
13
|
+
**核心功能**:
|
|
14
|
+
1. **多 Agent 协作** - 5 个专业 AI Agent 配合工作
|
|
15
|
+
2. **技能管理** - 发现、安装、管理可复用的 AI 技能
|
|
16
|
+
3. **项目模板** - 一键部署配置好的 AI 开发环境
|
|
17
|
+
4. **质量门禁** - 自动代码质量检查
|
|
41
18
|
|
|
42
|
-
###
|
|
19
|
+
### 技术栈
|
|
43
20
|
|
|
44
21
|
```
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
22
|
+
语言: JavaScript (CommonJS + ES Modules)
|
|
23
|
+
运行时: Node.js >= 16.0
|
|
24
|
+
测试: Jest
|
|
25
|
+
发布: npm
|
|
26
|
+
依赖: ajv, ajv-formats (配置验证)
|
|
49
27
|
```
|
|
50
28
|
|
|
51
29
|
---
|
|
52
30
|
|
|
53
|
-
## 项目结构
|
|
31
|
+
## Level 2: 项目结构 (10 分钟)
|
|
32
|
+
|
|
33
|
+
### 目录树
|
|
54
34
|
|
|
55
35
|
```
|
|
56
36
|
sumulige-claude/
|
|
57
|
-
├── .
|
|
58
|
-
│
|
|
59
|
-
├──
|
|
60
|
-
│
|
|
61
|
-
├── scripts/
|
|
62
|
-
│ ├── sync-external.mjs # 同步引擎 (ES Module)
|
|
63
|
-
│ └── update-registry.mjs # 注册表生成器 (ES Module)
|
|
64
|
-
├── config/
|
|
65
|
-
│ └── skill-categories.json # 技能分类配置
|
|
66
|
-
├── lib/
|
|
67
|
-
│ ├── commands.js # 基础命令 (CommonJS)
|
|
37
|
+
├── cli.js # 入口文件
|
|
38
|
+
│
|
|
39
|
+
├── lib/ # 核心代码 (CommonJS)
|
|
40
|
+
│ ├── commands.js # 命令实现
|
|
68
41
|
│ ├── config.js # 配置管理
|
|
69
|
-
│ ├── marketplace.js #
|
|
42
|
+
│ ├── marketplace.js # 技能市场
|
|
43
|
+
│ ├── config-schema.js # 配置 Schema
|
|
44
|
+
│ ├── config-validator.js # 配置验证
|
|
45
|
+
│ ├── config-manager.js # 配置管理器
|
|
46
|
+
│ ├── quality-rules.js # 质量规则
|
|
47
|
+
│ ├── quality-gate.js # 质量门禁
|
|
48
|
+
│ ├── errors.js # 错误类型
|
|
70
49
|
│ └── utils.js # 工具函数
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
│
|
|
50
|
+
│
|
|
51
|
+
├── template/.claude/ # 项目模板
|
|
52
|
+
│ ├── commands/ # 斜杠命令
|
|
53
|
+
│ ├── skills/ # 技能库
|
|
54
|
+
│ ├── hooks/ # 自动化钩子
|
|
55
|
+
│ └── settings.json # 默认配置
|
|
56
|
+
│
|
|
57
|
+
├── scripts/ # 工具脚本 (ES Modules)
|
|
58
|
+
│ ├── sync-external.mjs # 同步外部技能
|
|
59
|
+
│ └── update-registry.mjs # 更新技能注册表
|
|
60
|
+
│
|
|
61
|
+
├── config/ # 配置文件
|
|
62
|
+
│ ├── defaults.json # 默认配置
|
|
63
|
+
│ ├── quality-gate.json # 质量门禁配置
|
|
64
|
+
│ └── skill-categories.json # 技能分类
|
|
65
|
+
│
|
|
74
66
|
├── sources.yaml # 外部技能清单
|
|
75
|
-
├──
|
|
67
|
+
├── .claude-plugin/ # Claude Code 插件
|
|
68
|
+
│ └── marketplace.json # 技能注册表
|
|
69
|
+
│
|
|
76
70
|
└── package.json # 项目配置
|
|
77
71
|
```
|
|
78
72
|
|
|
73
|
+
### 模块职责
|
|
74
|
+
|
|
75
|
+
| 模块 | 职责 | 类型 |
|
|
76
|
+
|------|------|------|
|
|
77
|
+
| `cli.js` | 命令入口、分发 | CommonJS |
|
|
78
|
+
| `lib/commands.js` | 核心命令实现 | CommonJS |
|
|
79
|
+
| `lib/marketplace.js` | 技能市场命令 | CommonJS |
|
|
80
|
+
| `lib/config*.js` | 配置系统 | CommonJS |
|
|
81
|
+
| `lib/quality*.js` | 质量门禁系统 | CommonJS |
|
|
82
|
+
| `scripts/*.mjs` | 工具脚本 | ES Module |
|
|
83
|
+
|
|
79
84
|
---
|
|
80
85
|
|
|
81
|
-
##
|
|
86
|
+
## Level 3: 命令系统 (15 分钟)
|
|
82
87
|
|
|
83
|
-
###
|
|
88
|
+
### 命令分发的数据流
|
|
84
89
|
|
|
85
|
-
|
|
90
|
+
```
|
|
91
|
+
用户输入
|
|
92
|
+
│
|
|
93
|
+
▼
|
|
94
|
+
┌─────────────┐
|
|
95
|
+
│ cli.js │ 解析命令
|
|
96
|
+
└──────┬──────┘
|
|
97
|
+
│
|
|
98
|
+
▼
|
|
99
|
+
┌─────────────────────────────────┐
|
|
100
|
+
│ COMMANDS 注册表 │
|
|
101
|
+
│ { │
|
|
102
|
+
│ 'init': { help, args }, │
|
|
103
|
+
│ 'sync': { help, args }, │
|
|
104
|
+
│ ... │
|
|
105
|
+
│ } │
|
|
106
|
+
└────────────┬────────────────────┘
|
|
107
|
+
│
|
|
108
|
+
▼
|
|
109
|
+
┌─────────────────────────────────┐
|
|
110
|
+
│ runCommand(cmd, args) │
|
|
111
|
+
│ ├─ 核心命令 → lib/commands.js │
|
|
112
|
+
│ ├─ 市场命令 → lib/marketplace.js│
|
|
113
|
+
│ └─ 技能命令 → lib/commands.js │
|
|
114
|
+
└─────────────────────────────────┘
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 添加新命令
|
|
118
|
+
|
|
119
|
+
**Step 1**: 在 `lib/commands.js` 添加实现
|
|
120
|
+
|
|
121
|
+
```javascript
|
|
122
|
+
const commands = {
|
|
123
|
+
// 新命令
|
|
124
|
+
'my:command': (arg1) => {
|
|
125
|
+
console.log('执行命令,参数:', arg1);
|
|
126
|
+
// 你的逻辑
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Step 2**: 在 `cli.js` 注册
|
|
132
|
+
|
|
133
|
+
```javascript
|
|
134
|
+
const COMMANDS = {
|
|
135
|
+
'my:command': {
|
|
136
|
+
help: '命令描述',
|
|
137
|
+
args: '<arg1>'
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Step 3**: 测试
|
|
86
143
|
|
|
87
144
|
```bash
|
|
145
|
+
node cli.js my:command test
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Level 4: 技能系统 (20 分钟)
|
|
151
|
+
|
|
152
|
+
### 什么是技能?
|
|
153
|
+
|
|
154
|
+
**技能 = 知识 + 指令 + 资源**
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
my-skill/
|
|
158
|
+
├── SKILL.md # 知识和指令
|
|
159
|
+
├── metadata.yaml # 技能元数据
|
|
160
|
+
├── scripts/ # 可执行脚本 (资源)
|
|
161
|
+
└── templates/ # 模板文件 (资源)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 添加本地技能
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# 1. 创建技能目录
|
|
88
168
|
mkdir -p template/.claude/skills/my-skill
|
|
89
|
-
cd template/.claude/skills/my-skill
|
|
90
169
|
|
|
91
|
-
# 创建 SKILL.md
|
|
92
|
-
cat > SKILL.md << 'EOF'
|
|
170
|
+
# 2. 创建 SKILL.md
|
|
171
|
+
cat > template/.claude/skills/my-skill/SKILL.md << 'EOF'
|
|
93
172
|
# My Skill
|
|
94
173
|
|
|
95
|
-
>
|
|
174
|
+
> 技能描述
|
|
96
175
|
|
|
97
|
-
##
|
|
176
|
+
## 使用场景
|
|
98
177
|
|
|
99
|
-
|
|
178
|
+
当用户需要...时使用此技能。
|
|
100
179
|
|
|
101
180
|
EOF
|
|
102
181
|
|
|
103
|
-
# 创建 metadata.yaml
|
|
104
|
-
cat > metadata.yaml << 'EOF'
|
|
182
|
+
# 3. 创建 metadata.yaml
|
|
183
|
+
cat > template/.claude/skills/my-skill/metadata.yaml << 'EOF'
|
|
105
184
|
name: my-skill
|
|
106
|
-
description:
|
|
185
|
+
description: 技能描述
|
|
107
186
|
version: 1.0.0
|
|
108
187
|
category: tools
|
|
109
188
|
keywords:
|
|
110
189
|
- my-skill
|
|
111
|
-
- example
|
|
112
|
-
dependencies: []
|
|
113
190
|
author:
|
|
114
191
|
name: Your Name
|
|
115
192
|
github: yourusername
|
|
@@ -117,29 +194,13 @@ license: MIT
|
|
|
117
194
|
EOF
|
|
118
195
|
```
|
|
119
196
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
```yaml
|
|
123
|
-
- name: my-skill
|
|
124
|
-
description: "A brief description"
|
|
125
|
-
native: true
|
|
126
|
-
target:
|
|
127
|
-
category: tools
|
|
128
|
-
path: template/.claude/skills/my-skill
|
|
129
|
-
author:
|
|
130
|
-
name: Your Name
|
|
131
|
-
github: yourusername
|
|
132
|
-
license: MIT
|
|
133
|
-
homepage: https://github.com/yourusername/your-repo
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### 2. 外部技能 (External Skill)
|
|
197
|
+
### 添加外部技能
|
|
137
198
|
|
|
138
|
-
编辑 `sources.yaml
|
|
199
|
+
编辑 `sources.yaml`:
|
|
139
200
|
|
|
140
201
|
```yaml
|
|
141
202
|
- name: external-skill
|
|
142
|
-
description: "
|
|
203
|
+
description: "来自外部仓库的技能"
|
|
143
204
|
source:
|
|
144
205
|
repo: owner/repo
|
|
145
206
|
path: skills/external-skill
|
|
@@ -147,277 +208,254 @@ EOF
|
|
|
147
208
|
target:
|
|
148
209
|
category: automation
|
|
149
210
|
path: template/.claude/skills/automation/external-skill
|
|
150
|
-
author:
|
|
151
|
-
name: Owner Name
|
|
152
|
-
github: owner
|
|
153
|
-
license: MIT
|
|
154
|
-
homepage: https://github.com/owner/repo
|
|
155
|
-
verified: false
|
|
156
211
|
sync:
|
|
157
212
|
include:
|
|
158
213
|
- SKILL.md
|
|
159
214
|
- src/
|
|
160
215
|
exclude:
|
|
161
216
|
- node_modules/
|
|
162
|
-
- "*.lock"
|
|
163
217
|
```
|
|
164
218
|
|
|
165
|
-
|
|
219
|
+
运行同步:
|
|
166
220
|
|
|
167
221
|
```bash
|
|
168
|
-
# 同步外部技能
|
|
169
|
-
npm run sync
|
|
170
|
-
|
|
171
|
-
# 更新市场注册表
|
|
172
|
-
npm run update-registry
|
|
173
|
-
|
|
174
|
-
# 或一次性执行
|
|
175
222
|
npm run sync:all
|
|
176
223
|
```
|
|
177
224
|
|
|
178
225
|
---
|
|
179
226
|
|
|
180
|
-
##
|
|
227
|
+
## Level 5: 同步机制 (25 分钟)
|
|
181
228
|
|
|
182
|
-
###
|
|
229
|
+
### 自动同步工作流
|
|
183
230
|
|
|
184
231
|
```
|
|
185
232
|
┌─────────────────────────────────────────────────────────────┐
|
|
186
|
-
│
|
|
187
|
-
│
|
|
188
|
-
│
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
233
|
+
│ sources.yaml │
|
|
234
|
+
│ ├─ native 技能 (本地) │
|
|
235
|
+
│ └─ external 技能 (GitHub) │
|
|
236
|
+
└──────────────┬──────────────────────────────────────────────┘
|
|
237
|
+
│
|
|
238
|
+
▼
|
|
192
239
|
┌─────────────────────────────────────────────────────────────┐
|
|
193
|
-
│
|
|
194
|
-
│
|
|
195
|
-
│
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
240
|
+
│ sync-external.mjs │
|
|
241
|
+
│ ├─ 克隆外部仓库 │
|
|
242
|
+
│ ├─ 过滤文件 (include/exclude) │
|
|
243
|
+
│ └─ 复制到 template/.claude/skills/ │
|
|
244
|
+
└──────────────┬──────────────────────────────────────────────┘
|
|
245
|
+
│
|
|
246
|
+
▼
|
|
199
247
|
┌─────────────────────────────────────────────────────────────┐
|
|
200
|
-
│
|
|
201
|
-
│
|
|
202
|
-
│
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
│ 4. 复制文件到目标目录 │
|
|
208
|
-
│ - 根据 sync.include 过滤文件 │
|
|
209
|
-
│ - 根据 sync.exclude 排除文件 │
|
|
210
|
-
└─────────────────────────────────────────────────────────────┘
|
|
211
|
-
│
|
|
212
|
-
▼
|
|
248
|
+
│ update-registry.mjs │
|
|
249
|
+
│ ├─ 扫描技能目录 │
|
|
250
|
+
│ ├─ 提取元数据 │
|
|
251
|
+
│ └─ 生成 marketplace.json │
|
|
252
|
+
└──────────────┬──────────────────────────────────────────────┘
|
|
253
|
+
│
|
|
254
|
+
▼
|
|
213
255
|
┌─────────────────────────────────────────────────────────────┐
|
|
214
|
-
│
|
|
215
|
-
│
|
|
216
|
-
│ - 记录同步时间和来源 │
|
|
217
|
-
└─────────────────────────────────────────────────────────────┘
|
|
218
|
-
│
|
|
219
|
-
▼
|
|
220
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
221
|
-
│ 6. 清理临时文件 │
|
|
222
|
-
│ - 删除克隆的临时目录 │
|
|
256
|
+
│ .claude-plugin/marketplace.json │
|
|
257
|
+
│ (Claude Code 读取的注册表) │
|
|
223
258
|
└─────────────────────────────────────────────────────────────┘
|
|
224
259
|
```
|
|
225
260
|
|
|
226
|
-
###
|
|
261
|
+
### GitHub Actions 自动同步
|
|
227
262
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
└─────────────────────────────────────────────────────────────┘
|
|
248
|
-
│
|
|
249
|
-
▼
|
|
250
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
251
|
-
│ 4. 构建插件注册表 │
|
|
252
|
-
│ - 按分类组织技能 │
|
|
253
|
-
│ - 添加元数据 (版本、时间戳、数量) │
|
|
254
|
-
└─────────────────────────────────────────────────────────────┘
|
|
255
|
-
│
|
|
256
|
-
▼
|
|
257
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
258
|
-
│ 5. 写入 marketplace.json │
|
|
259
|
-
│ - 格式化为 JSON │
|
|
260
|
-
│ - 符合 Claude Code 插件规范 │
|
|
261
|
-
└─────────────────────────────────────────────────────────────┘
|
|
263
|
+
`.github/workflows/sync-skills.yml`:
|
|
264
|
+
|
|
265
|
+
```yaml
|
|
266
|
+
name: Sync External Skills
|
|
267
|
+
on:
|
|
268
|
+
schedule:
|
|
269
|
+
- cron: '0 0 * * *' # 每天运行
|
|
270
|
+
workflow_dispatch: # 手动触发
|
|
271
|
+
jobs:
|
|
272
|
+
sync:
|
|
273
|
+
runs-on: ubuntu-latest
|
|
274
|
+
steps:
|
|
275
|
+
- uses: actions/checkout@v3
|
|
276
|
+
- run: npm install
|
|
277
|
+
- run: npm run sync:all
|
|
278
|
+
- run: git config user.name "github-actions[bot]"
|
|
279
|
+
- run: git add .claude-plugin/
|
|
280
|
+
- run: git commit -m "chore: sync skills"
|
|
281
|
+
- run: git push
|
|
262
282
|
```
|
|
263
283
|
|
|
264
284
|
---
|
|
265
285
|
|
|
266
|
-
##
|
|
286
|
+
## Level 6: 配置系统 (30 分钟)
|
|
267
287
|
|
|
268
|
-
###
|
|
269
|
-
|
|
270
|
-
#### 1. 在 `lib/commands.js` 或 `lib/marketplace.js` 添加处理函数
|
|
271
|
-
|
|
272
|
-
```javascript
|
|
273
|
-
const commands = {
|
|
274
|
-
// ...existing commands...
|
|
288
|
+
### 三层配置
|
|
275
289
|
|
|
276
|
-
// 新命令
|
|
277
|
-
'my:command': (arg1, arg2) => {
|
|
278
|
-
console.log('Executing my:command with:', arg1, arg2);
|
|
279
|
-
// 命令逻辑
|
|
280
|
-
}
|
|
281
|
-
};
|
|
282
290
|
```
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
291
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
292
|
+
│ 全局配置 (~/.claude/config.json) │
|
|
293
|
+
│ ├─ Agent 定义 │
|
|
294
|
+
│ ├─ 默认模型 │
|
|
295
|
+
│ └─ 技能列表 │
|
|
296
|
+
├─────────────────────────────────────────────────────────────┤
|
|
297
|
+
│ 项目配置 (./.claude/settings.json) │
|
|
298
|
+
│ ├─ Hook 配置 │
|
|
299
|
+
│ └─ 项目覆盖设置 │
|
|
300
|
+
├─────────────────────────────────────────────────────────────┤
|
|
301
|
+
│ 质量配置 (./.claude/quality-gate.json) │
|
|
302
|
+
│ ├─ 规则启用设置 │
|
|
303
|
+
│ └─ 门禁触发条件 │
|
|
304
|
+
└─────────────────────────────────────────────────────────────┘
|
|
295
305
|
```
|
|
296
306
|
|
|
297
|
-
|
|
307
|
+
### 配置验证流程
|
|
298
308
|
|
|
299
|
-
```javascript
|
|
300
|
-
// 在 showHelp() 函数的 Examples 部分
|
|
301
|
-
console.log(' smc my:command value1 value2');
|
|
302
309
|
```
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
310
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
311
|
+
│ config-schema.js │
|
|
312
|
+
│ ├─ CONFIG_SCHEMA (JSON Schema) │
|
|
313
|
+
│ ├─ SETTINGS_SCHEMA │
|
|
314
|
+
│ └─ QUALITY_GATE_SCHEMA │
|
|
315
|
+
└──────────────┬──────────────────────────────────────────────┘
|
|
316
|
+
│
|
|
317
|
+
▼
|
|
318
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
319
|
+
│ config-validator.js │
|
|
320
|
+
│ ├─ AJV 验证器 │
|
|
321
|
+
│ ├─ validate(config, schema) │
|
|
322
|
+
│ └─ validateFile(path, schema) │
|
|
323
|
+
└──────────────┬──────────────────────────────────────────────┘
|
|
324
|
+
│
|
|
325
|
+
▼
|
|
326
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
327
|
+
│ config-manager.js │
|
|
328
|
+
│ ├─ backup() - 创建备份 │
|
|
329
|
+
│ ├─ rollback() - 回滚配置 │
|
|
330
|
+
│ ├─ diff() - 配置对比 │
|
|
331
|
+
│ └─ _expandEnvVars() - 环境变量展开 │
|
|
332
|
+
└─────────────────────────────────────────────────────────────┘
|
|
319
333
|
```
|
|
320
334
|
|
|
321
|
-
###
|
|
335
|
+
### 环境变量展开
|
|
322
336
|
|
|
323
|
-
|
|
324
|
-
# 查看市场状态
|
|
325
|
-
smc marketplace:status
|
|
337
|
+
配置支持环境变量语法:
|
|
326
338
|
|
|
327
|
-
|
|
328
|
-
|
|
339
|
+
```json
|
|
340
|
+
{
|
|
341
|
+
"apiKey": "${API_KEY:default-key}",
|
|
342
|
+
"endpoint": "${ENDPOINT:-https://api.example.com}"
|
|
343
|
+
}
|
|
329
344
|
```
|
|
330
345
|
|
|
331
|
-
|
|
346
|
+
---
|
|
332
347
|
|
|
333
|
-
|
|
348
|
+
## Level 7: 质量门禁 (35 分钟)
|
|
334
349
|
|
|
335
|
-
|
|
336
|
-
# 验证 YAML 语法
|
|
337
|
-
node -e "const yaml = require('yaml'); console.log(yaml.parse(require('fs').readFileSync('sources.yaml', 'utf8')))"
|
|
338
|
-
```
|
|
350
|
+
### 质量检查流程
|
|
339
351
|
|
|
340
|
-
#### 2. Git 克隆失败
|
|
341
|
-
|
|
342
|
-
```bash
|
|
343
|
-
# 手动测试克隆
|
|
344
|
-
git clone --depth 1 https://github.com/owner/repo /tmp/test-repo
|
|
345
352
|
```
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
353
|
+
git commit
|
|
354
|
+
│
|
|
355
|
+
▼
|
|
356
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
357
|
+
│ pre-commit hook │
|
|
358
|
+
│ ├─ 读取 .claude/quality-gate.json │
|
|
359
|
+
│ └─ 调用 quality-gate.js │
|
|
360
|
+
└──────────────┬──────────────────────────────────────────────┘
|
|
361
|
+
│
|
|
362
|
+
▼
|
|
363
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
364
|
+
│ quality-gate.js │
|
|
365
|
+
│ ├─ 加载启用的规则 │
|
|
366
|
+
│ ├─ 遍历暂存的文件 │
|
|
367
|
+
│ └─ 执行每个规则的 check() │
|
|
368
|
+
└──────────────┬──────────────────────────────────────────────┘
|
|
369
|
+
│
|
|
370
|
+
▼
|
|
371
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
372
|
+
│ quality-rules.js │
|
|
373
|
+
│ ├─ file-size-limit (文件大小) │
|
|
374
|
+
│ ├─ line-count-limit (行数) │
|
|
375
|
+
│ ├─ no-console-logs (无 console) │
|
|
376
|
+
│ ├─ todo-comments (TODO 检查) │
|
|
377
|
+
│ ├─ directory-depth (目录深度) │
|
|
378
|
+
│ ├─ no-empty-files (无空文件) │
|
|
379
|
+
│ ├─ no-trailing-whitespace (无尾随空格) │
|
|
380
|
+
│ └─ function-length (函数长度) │
|
|
381
|
+
└──────────────┬──────────────────────────────────────────────┘
|
|
382
|
+
│
|
|
383
|
+
┌───────┴────────┐
|
|
384
|
+
▼ ▼
|
|
385
|
+
通过 ✅ 失败 ❌
|
|
386
|
+
│ │
|
|
387
|
+
▼ ▼
|
|
388
|
+
允许提交 阻止提交
|
|
355
389
|
```
|
|
356
390
|
|
|
357
|
-
###
|
|
391
|
+
### 添加自定义规则
|
|
358
392
|
|
|
359
|
-
|
|
393
|
+
编辑 `lib/quality-rules.js`:
|
|
360
394
|
|
|
361
|
-
```
|
|
362
|
-
|
|
395
|
+
```javascript
|
|
396
|
+
RuleRegistry.register('my-rule', {
|
|
397
|
+
name: 'My Custom Rule',
|
|
398
|
+
description: '规则描述',
|
|
399
|
+
severity: 'warn',
|
|
400
|
+
|
|
401
|
+
check(file, config) {
|
|
402
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
403
|
+
const issues = [];
|
|
404
|
+
|
|
405
|
+
// 你的检查逻辑
|
|
406
|
+
if (content.includes('TODO')) {
|
|
407
|
+
issues.push({
|
|
408
|
+
line: 1,
|
|
409
|
+
message: 'Found TODO',
|
|
410
|
+
fix: 'Resolve TODOs'
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return issues;
|
|
415
|
+
}
|
|
416
|
+
});
|
|
363
417
|
```
|
|
364
418
|
|
|
365
419
|
---
|
|
366
420
|
|
|
367
|
-
##
|
|
421
|
+
## 快速参考
|
|
368
422
|
|
|
369
|
-
###
|
|
423
|
+
### 开发工作流
|
|
370
424
|
|
|
371
425
|
```bash
|
|
372
|
-
#
|
|
373
|
-
|
|
426
|
+
# 1. 修改代码
|
|
427
|
+
vim lib/commands.js
|
|
374
428
|
|
|
375
|
-
#
|
|
376
|
-
npm
|
|
429
|
+
# 2. 运行测试
|
|
430
|
+
npm test
|
|
377
431
|
|
|
378
|
-
#
|
|
379
|
-
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
### CI/CD 测试
|
|
432
|
+
# 3. 本地测试
|
|
433
|
+
node cli.js my-command
|
|
383
434
|
|
|
384
|
-
|
|
435
|
+
# 4. 更新版本
|
|
436
|
+
npm version patch
|
|
385
437
|
|
|
386
|
-
|
|
438
|
+
# 5. 发布
|
|
439
|
+
npm run sync:all
|
|
387
440
|
git add .
|
|
388
|
-
git commit -m "
|
|
389
|
-
git push
|
|
441
|
+
git commit -m "chore: release"
|
|
442
|
+
git push --follow-tags
|
|
443
|
+
npm publish
|
|
390
444
|
```
|
|
391
445
|
|
|
392
|
-
|
|
393
|
-
1. 进入 GitHub 仓库页面
|
|
394
|
-
2. 点击 "Actions" 标签
|
|
395
|
-
3. 选择 "Sync External Skills" 工作流
|
|
396
|
-
4. 点击 "Run workflow"
|
|
397
|
-
|
|
398
|
-
---
|
|
399
|
-
|
|
400
|
-
## 发布
|
|
401
|
-
|
|
402
|
-
### 更新版本号
|
|
446
|
+
### 调试技巧
|
|
403
447
|
|
|
404
448
|
```bash
|
|
405
|
-
#
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
# 更新 marketplace.json 中的版本
|
|
409
|
-
npm run update-registry
|
|
410
|
-
```
|
|
449
|
+
# 详细输出
|
|
450
|
+
node --trace-warnings cli.js my-command
|
|
411
451
|
|
|
412
|
-
|
|
452
|
+
# 检查配置
|
|
453
|
+
node cli.js config:validate
|
|
413
454
|
|
|
414
|
-
|
|
415
|
-
|
|
455
|
+
# 质量检查
|
|
456
|
+
node cli.js qg:check
|
|
416
457
|
```
|
|
417
458
|
|
|
418
|
-
|
|
459
|
+
---
|
|
419
460
|
|
|
420
|
-
|
|
421
|
-
git tag v$(node -p "require('./package.json').version")
|
|
422
|
-
git push --tags
|
|
423
|
-
```
|
|
461
|
+
*更多细节查看 [README.md](../README.md) | [Q&A.md](../Q&A.md) | [AGENTS.md](../AGENTS.md)*
|