@linyjs/cli 0.0.3 → 0.0.5
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/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +55 -4
- package/dist/commands/init.js.map +1 -1
- package/package.json +5 -1
- package/DESIGN.md +0 -901
- package/ZERO_CONFIG_GUIDE.md +0 -462
- package/src/commands/dev.ts +0 -251
- package/src/commands/init.ts +0 -75
- package/src/commands/pack.ts +0 -315
- package/src/index.ts +0 -84
- package/src/utils/builder.ts +0 -472
- package/tsconfig.json +0 -9
package/DESIGN.md
DELETED
|
@@ -1,901 +0,0 @@
|
|
|
1
|
-
# Ling CLI 命令行工具设计文档
|
|
2
|
-
|
|
3
|
-
## 📖 目录
|
|
4
|
-
|
|
5
|
-
- [1. 概述](#1-概述)
|
|
6
|
-
- [2. 核心功能](#2-核心功能)
|
|
7
|
-
- [3. 命令设计](#3-命令设计)
|
|
8
|
-
- [4. 技术架构](#4-技术架构)
|
|
9
|
-
- [5. 实现细节](#5-实现细节)
|
|
10
|
-
- [6. 使用示例](#6-使用示例)
|
|
11
|
-
- [7. 扩展计划](#7-扩展计划)
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## 1. 概述
|
|
16
|
-
|
|
17
|
-
### 1.1 项目背景
|
|
18
|
-
|
|
19
|
-
Ling 框架采用插件化架构,开发者需要频繁打包 `.mpk` 格式的插件文件。当前手动打包流程繁琐:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
# 当前流程(繁琐)
|
|
23
|
-
npm run build
|
|
24
|
-
cd dist
|
|
25
|
-
zip -r ../my-plugin.mpk .
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
**问题:**
|
|
29
|
-
- ❌ 需要手动执行多个步骤
|
|
30
|
-
- ❌ 容易遗漏 manifest.json 生成
|
|
31
|
-
- ❌ 无法验证插件结构完整性
|
|
32
|
-
- ❌ 不支持自动化 CI/CD 流程
|
|
33
|
-
|
|
34
|
-
### 1.2 解决方案
|
|
35
|
-
|
|
36
|
-
创建 `@linyjs/cli` 命令行工具,提供一键打包功能:
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
# 简化后的流程
|
|
40
|
-
npx @linyjs/cli pack
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
**优势:**
|
|
44
|
-
- ✅ 一键完成构建、验证、打包
|
|
45
|
-
- ✅ 自动生成 manifest.json
|
|
46
|
-
- ✅ 智能错误检测和提示
|
|
47
|
-
- ✅ 支持 CI/CD 集成
|
|
48
|
-
|
|
49
|
-
### 1.3 目标用户
|
|
50
|
-
|
|
51
|
-
- **插件开发者** - 快速打包和测试插件
|
|
52
|
-
- **CI/CD 流水线** - 自动化构建和发布
|
|
53
|
-
- **插件市场管理员** - 批量处理插件包
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## 2. 核心功能
|
|
58
|
-
|
|
59
|
-
### 2.1 插件打包 (`pack`)
|
|
60
|
-
|
|
61
|
-
#### 主要功能
|
|
62
|
-
|
|
63
|
-
1. **自动构建**
|
|
64
|
-
- 检测并执行 TypeScript 编译
|
|
65
|
-
- 支持自定义构建命令
|
|
66
|
-
- 增量构建优化
|
|
67
|
-
|
|
68
|
-
2. **manifest.json 生成**
|
|
69
|
-
- 从 package.json 提取元数据
|
|
70
|
-
- 自动检测服务端/客户端入口
|
|
71
|
-
- 分析依赖关系
|
|
72
|
-
|
|
73
|
-
3. **结构验证**
|
|
74
|
-
- 检查必需文件是否存在
|
|
75
|
-
- 验证 manifest.json 格式
|
|
76
|
-
- 检测常见配置错误
|
|
77
|
-
|
|
78
|
-
4. **打包压缩**
|
|
79
|
-
- ZIP 格式压缩
|
|
80
|
-
- 优化文件大小
|
|
81
|
-
- 保留目录结构
|
|
82
|
-
|
|
83
|
-
5. **签名支持** (可选)
|
|
84
|
-
- 为插件添加数字签名
|
|
85
|
-
- 验证签名完整性
|
|
86
|
-
|
|
87
|
-
#### 工作流程
|
|
88
|
-
|
|
89
|
-
```
|
|
90
|
-
┌─────────────┐
|
|
91
|
-
│ 读取配置 │
|
|
92
|
-
│ package.json│
|
|
93
|
-
└──────┬──────┘
|
|
94
|
-
│
|
|
95
|
-
▼
|
|
96
|
-
┌─────────────┐
|
|
97
|
-
│ 构建项目 │
|
|
98
|
-
│ npm run build│
|
|
99
|
-
└──────┬──────┘
|
|
100
|
-
│
|
|
101
|
-
▼
|
|
102
|
-
┌─────────────┐
|
|
103
|
-
│ 生成 │
|
|
104
|
-
│ manifest.json│
|
|
105
|
-
└──────┬──────┘
|
|
106
|
-
│
|
|
107
|
-
▼
|
|
108
|
-
┌─────────────┐
|
|
109
|
-
│ 验证结构 │
|
|
110
|
-
│ 检查必需文件 │
|
|
111
|
-
└──────┬──────┘
|
|
112
|
-
│
|
|
113
|
-
▼
|
|
114
|
-
┌─────────────┐
|
|
115
|
-
│ 打包为 .mpk │
|
|
116
|
-
│ ZIP 压缩 │
|
|
117
|
-
└──────┬──────┘
|
|
118
|
-
│
|
|
119
|
-
▼
|
|
120
|
-
┌─────────────┐
|
|
121
|
-
│ 输出结果 │
|
|
122
|
-
│ 显示统计信息 │
|
|
123
|
-
└─────────────┘
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### 2.2 插件验证 (`validate`)
|
|
127
|
-
|
|
128
|
-
#### 功能说明
|
|
129
|
-
|
|
130
|
-
验证已存在的 `.mpk` 文件或插件目录是否符合规范。
|
|
131
|
-
|
|
132
|
-
**检查项:**
|
|
133
|
-
- ✅ manifest.json 存在且格式正确
|
|
134
|
-
- ✅ 服务端/客户端入口文件存在
|
|
135
|
-
- ✅ 依赖声明完整
|
|
136
|
-
- ✅ 权限声明合理
|
|
137
|
-
- ✅ 无安全风险(如路径遍历)
|
|
138
|
-
|
|
139
|
-
#### 使用场景
|
|
140
|
-
|
|
141
|
-
- 上传插件前的预检查
|
|
142
|
-
- CI/CD 流水线质量门禁
|
|
143
|
-
- 插件市场审核辅助
|
|
144
|
-
|
|
145
|
-
### 2.3 插件发布 (`publish`)
|
|
146
|
-
|
|
147
|
-
#### 功能说明
|
|
148
|
-
|
|
149
|
-
将打包好的 `.mpk` 文件发布到插件市场。
|
|
150
|
-
|
|
151
|
-
**功能点:**
|
|
152
|
-
- 上传到中央仓库
|
|
153
|
-
- 版本管理
|
|
154
|
-
- 发布状态跟踪
|
|
155
|
-
- 回滚支持
|
|
156
|
-
|
|
157
|
-
#### 工作流程
|
|
158
|
-
|
|
159
|
-
```bash
|
|
160
|
-
# 1. 打包
|
|
161
|
-
npx @linyjs/cli pack
|
|
162
|
-
|
|
163
|
-
# 2. 发布
|
|
164
|
-
npx @linyjs/cli publish my-plugin.mpk --token=xxx
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
### 2.4 项目初始化 (`init`)
|
|
168
|
-
|
|
169
|
-
#### 功能说明
|
|
170
|
-
|
|
171
|
-
快速创建新的插件项目模板。
|
|
172
|
-
|
|
173
|
-
**提供的模板:**
|
|
174
|
-
- `minimal` - 最小化插件(Hello World)
|
|
175
|
-
- `full` - 完整功能插件(包含所有特性)
|
|
176
|
-
- `admin-extension` - 管理后台扩展
|
|
177
|
-
- `api-service` - 纯 API 服务插件
|
|
178
|
-
|
|
179
|
-
#### 使用示例
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
# 创建新项目
|
|
183
|
-
npx @linyjs/cli init my-plugin --template=full
|
|
184
|
-
|
|
185
|
-
# 交互式选择
|
|
186
|
-
npx @linyjs/cli init
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
---
|
|
190
|
-
|
|
191
|
-
## 3. 命令设计
|
|
192
|
-
|
|
193
|
-
### 3.1 全局命令结构
|
|
194
|
-
|
|
195
|
-
```bash
|
|
196
|
-
@linyjs/cli <command> [options]
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
**Cleye 风格特点:**
|
|
200
|
-
- 使用函数式 API 定义命令
|
|
201
|
-
- 自动类型推断(无需手动定义接口)
|
|
202
|
-
- 内置参数验证和错误提示
|
|
203
|
-
|
|
204
|
-
### 3.2 详细命令定义
|
|
205
|
-
|
|
206
|
-
#### `pack` - 打包插件
|
|
207
|
-
|
|
208
|
-
```bash
|
|
209
|
-
npx @linyjs/cli pack [options]
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
**选项:**
|
|
213
|
-
|
|
214
|
-
| 选项 | 简写 | 类型 | 默认值 | 说明 |
|
|
215
|
-
|------|------|------|--------|------|
|
|
216
|
-
| `--output` | `-o` | string | `.` | 输出目录 |
|
|
217
|
-
| `--name` | `-n` | string | - | 插件名称(覆盖 package.json) |
|
|
218
|
-
| `--version` | `-v` | string | - | 版本号(覆盖 package.json) |
|
|
219
|
-
| `--no-build` | - | boolean | false | 跳过构建步骤 |
|
|
220
|
-
| `--manifest` | - | string | - | 自定义 manifest.json 路径 |
|
|
221
|
-
| `--sign` | - | boolean | false | 为插件添加签名 |
|
|
222
|
-
| `--verbose` | - | boolean | false | 显示详细日志 |
|
|
223
|
-
|
|
224
|
-
**示例:**
|
|
225
|
-
|
|
226
|
-
```bash
|
|
227
|
-
# 基本用法
|
|
228
|
-
npx @linyjs/cli pack
|
|
229
|
-
|
|
230
|
-
# 指定输出目录
|
|
231
|
-
npx @linyjs/cli pack -o ./releases
|
|
232
|
-
|
|
233
|
-
# 跳过构建(已有 dist/)
|
|
234
|
-
npx @linyjs/cli pack --no-build
|
|
235
|
-
|
|
236
|
-
# 详细模式
|
|
237
|
-
npx @linyjs/cli pack --verbose
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
#### `validate` - 验证插件
|
|
241
|
-
|
|
242
|
-
```bash
|
|
243
|
-
npx @linyjs/cli validate <path> [options]
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
**参数:**
|
|
247
|
-
- `path` - 插件路径(.mpk 文件或目录)
|
|
248
|
-
|
|
249
|
-
**选项:**
|
|
250
|
-
|
|
251
|
-
| 选项 | 简写 | 类型 | 默认值 | 说明 |
|
|
252
|
-
|------|------|------|--------|------|
|
|
253
|
-
| `--strict` | - | boolean | false | 严格模式(警告也报错) |
|
|
254
|
-
| `--json` | - | boolean | false | JSON 格式输出 |
|
|
255
|
-
|
|
256
|
-
**示例:**
|
|
257
|
-
|
|
258
|
-
```bash
|
|
259
|
-
# 验证目录
|
|
260
|
-
npx @linyjs/cli validate ./my-plugin
|
|
261
|
-
|
|
262
|
-
# 验证 .mpk 文件
|
|
263
|
-
npx @linyjs/cli validate my-plugin.mpk
|
|
264
|
-
|
|
265
|
-
# JSON 输出
|
|
266
|
-
npx @linyjs/cli validate my-plugin.mpk --json
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
#### `publish` - 发布插件
|
|
270
|
-
|
|
271
|
-
```bash
|
|
272
|
-
npx @linyjs/cli publish <file> [options]
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
**参数:**
|
|
276
|
-
- `file` - .mpk 文件路径
|
|
277
|
-
|
|
278
|
-
**选项:**
|
|
279
|
-
|
|
280
|
-
| 选项 | 简写 | 类型 | 默认值 | 说明 |
|
|
281
|
-
|------|------|------|--------|------|
|
|
282
|
-
| `--token` | `-t` | string | - | API Token(必需) |
|
|
283
|
-
| `--registry` | - | string | - | 自定义仓库地址 |
|
|
284
|
-
| `--dry-run` | - | boolean | false | 模拟运行(不实际上传) |
|
|
285
|
-
|
|
286
|
-
**示例:**
|
|
287
|
-
|
|
288
|
-
```bash
|
|
289
|
-
# 发布到官方仓库
|
|
290
|
-
npx @linyjs/cli publish my-plugin.mpk --token=xxx
|
|
291
|
-
|
|
292
|
-
# 发布到私有仓库
|
|
293
|
-
npx @linyjs/cli publish my-plugin.mpk \
|
|
294
|
-
--token=xxx \
|
|
295
|
-
--registry=https://my-registry.com
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
#### `init` - 初始化项目
|
|
299
|
-
|
|
300
|
-
```bash
|
|
301
|
-
npx @linyjs/cli init [name] [options]
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
**参数:**
|
|
305
|
-
- `name` - 项目名称(可选)
|
|
306
|
-
|
|
307
|
-
**选项:**
|
|
308
|
-
|
|
309
|
-
| 选项 | 简写 | 类型 | 默认值 | 说明 |
|
|
310
|
-
|------|------|------|--------|------|
|
|
311
|
-
| `--template` | `-t` | string | `minimal` | 项目模板 |
|
|
312
|
-
| `--yes` | `-y` | boolean | false | 跳过确认 |
|
|
313
|
-
|
|
314
|
-
**可用模板:**
|
|
315
|
-
- `minimal` - 最小化插件
|
|
316
|
-
- `full` - 完整功能插件
|
|
317
|
-
- `admin-extension` - 管理后台扩展
|
|
318
|
-
- `api-service` - 纯 API 服务
|
|
319
|
-
|
|
320
|
-
**示例:**
|
|
321
|
-
|
|
322
|
-
```bash
|
|
323
|
-
# 交互式创建
|
|
324
|
-
npx @linyjs/cli init
|
|
325
|
-
|
|
326
|
-
# 指定名称和模板
|
|
327
|
-
npx @linyjs/cli init my-blog --template=full
|
|
328
|
-
|
|
329
|
-
# 非交互模式
|
|
330
|
-
npx @linyjs/cli init my-plugin -t minimal -y
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
---
|
|
334
|
-
|
|
335
|
-
## 4. 技术架构
|
|
336
|
-
|
|
337
|
-
### 4.1 项目结构
|
|
338
|
-
|
|
339
|
-
```
|
|
340
|
-
packages/cli/
|
|
341
|
-
├── src/
|
|
342
|
-
│ ├── index.ts # CLI 入口
|
|
343
|
-
│ ├── commands/ # 命令实现
|
|
344
|
-
│ │ ├── pack.ts # pack 命令
|
|
345
|
-
│ │ ├── validate.ts # validate 命令
|
|
346
|
-
│ │ ├── publish.ts # publish 命令
|
|
347
|
-
│ │ └── init.ts # init 命令
|
|
348
|
-
│ ├── utils/ # 工具函数
|
|
349
|
-
│ │ ├── builder.ts # 构建工具
|
|
350
|
-
│ │ ├── packager.ts # 打包工具
|
|
351
|
-
│ │ ├── validator.ts # 验证工具
|
|
352
|
-
│ │ ├── manifest.ts # manifest 生成
|
|
353
|
-
│ │ └── logger.ts # 日志工具
|
|
354
|
-
│ ├── templates/ # 项目模板
|
|
355
|
-
│ │ ├── minimal/
|
|
356
|
-
│ │ ├── full/
|
|
357
|
-
│ │ ├── admin-extension/
|
|
358
|
-
│ │ └── api-service/
|
|
359
|
-
│ └── types/ # 类型定义
|
|
360
|
-
│ ├── plugin.ts # 插件相关类型
|
|
361
|
-
│ └── config.ts # 配置类型
|
|
362
|
-
├── package.json
|
|
363
|
-
├── tsconfig.json
|
|
364
|
-
└── README.md
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
### 4.2 技术栈
|
|
368
|
-
|
|
369
|
-
**为什么选择 Cleye?**
|
|
370
|
-
|
|
371
|
-
Cleye 相比 Commander.js 的优势:
|
|
372
|
-
- ✅ **零配置 TypeScript** - 自动类型推断,无需手动定义类型
|
|
373
|
-
- ✅ **更简洁的 API** - 函数式风格,代码更清晰
|
|
374
|
-
- ✅ **内置帮助信息** - 自动生成美观的帮助文本
|
|
375
|
-
- ✅ **更好的错误处理** - 自动验证参数类型
|
|
376
|
-
- ✅ **更小体积** - 依赖更少,启动更快
|
|
377
|
-
|
|
378
|
-
| 技术 | 用途 | 版本要求 |
|
|
379
|
-
|------|------|----------|
|
|
380
|
-
| **cleye** | CLI 框架(替代 commander) | ^1.3.0 |
|
|
381
|
-
| **archiver** | ZIP 压缩 | ^6.0.0 |
|
|
382
|
-
| **chalk** | 终端着色 | ^5.0.0 |
|
|
383
|
-
| **inquirer** | 交互式问答 | ^9.0.0 |
|
|
384
|
-
| **fs-extra** | 文件系统操作 | ^11.0.0 |
|
|
385
|
-
| **zod** | 数据验证 | ^3.0.0 |
|
|
386
|
-
| **ora** | 加载动画 | ^7.0.0 |
|
|
387
|
-
|
|
388
|
-
### 4.3 核心模块设计
|
|
389
|
-
|
|
390
|
-
#### 4.3.1 Builder(构建器)
|
|
391
|
-
|
|
392
|
-
```typescript
|
|
393
|
-
interface IBuilder {
|
|
394
|
-
// 检测是否需要构建
|
|
395
|
-
needsBuild(): boolean;
|
|
396
|
-
|
|
397
|
-
// 执行构建
|
|
398
|
-
build(options: BuildOptions): Promise<void>;
|
|
399
|
-
|
|
400
|
-
// 清理构建产物
|
|
401
|
-
clean(): Promise<void>;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
class TypeScriptBuilder implements IBuilder {
|
|
405
|
-
constructor(private projectRoot: string);
|
|
406
|
-
|
|
407
|
-
async build() {
|
|
408
|
-
// 1. 检查 tsconfig.json
|
|
409
|
-
// 2. 执行 tsc 或 esbuild
|
|
410
|
-
// 3. 返回构建结果
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
#### 4.3.2 ManifestGenerator(清单生成器)
|
|
416
|
-
|
|
417
|
-
```typescript
|
|
418
|
-
interface IManifestGenerator {
|
|
419
|
-
// 从 package.json 生成 manifest
|
|
420
|
-
generateFromPackage(pkg: PackageJson): PluginManifest;
|
|
421
|
-
|
|
422
|
-
// 合并自定义 manifest
|
|
423
|
-
mergeWithCustom(base: PluginManifest, customPath?: string): PluginManifest;
|
|
424
|
-
|
|
425
|
-
// 验证 manifest 格式
|
|
426
|
-
validate(manifest: PluginManifest): ValidationResult;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
class ManifestGenerator implements IManifestGenerator {
|
|
430
|
-
generateFromPackage(pkg: PackageJson): PluginManifest {
|
|
431
|
-
return {
|
|
432
|
-
name: pkg.name,
|
|
433
|
-
version: pkg.version,
|
|
434
|
-
description: pkg.description,
|
|
435
|
-
author: typeof pkg.author === 'string'
|
|
436
|
-
? pkg.author
|
|
437
|
-
: pkg.author?.name,
|
|
438
|
-
serverEntry: this.detectServerEntry(),
|
|
439
|
-
clientEntry: this.detectClientEntry(),
|
|
440
|
-
dependencies: this.extractDependencies(pkg),
|
|
441
|
-
permissions: this.extractPermissions(pkg)
|
|
442
|
-
};
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
#### 4.3.3 Packager(打包器)
|
|
448
|
-
|
|
449
|
-
```typescript
|
|
450
|
-
interface IPackager {
|
|
451
|
-
// 打包为 .mpk
|
|
452
|
-
pack(sourceDir: string, outputPath: string): Promise<PackResult>;
|
|
453
|
-
|
|
454
|
-
// 获取打包统计信息
|
|
455
|
-
getStats(): PackStats;
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
class ZipPackager implements IPackager {
|
|
459
|
-
async pack(sourceDir: string, outputPath: string) {
|
|
460
|
-
// 1. 创建 ZIP 归档
|
|
461
|
-
// 2. 添加文件(排除 node_modules 等)
|
|
462
|
-
// 3. 计算文件大小和哈希
|
|
463
|
-
// 4. 返回打包结果
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
```
|
|
467
|
-
|
|
468
|
-
#### 4.3.4 Validator(验证器)
|
|
469
|
-
|
|
470
|
-
```typescript
|
|
471
|
-
interface IValidator {
|
|
472
|
-
// 验证插件结构
|
|
473
|
-
validateStructure(pluginPath: string): ValidationResult;
|
|
474
|
-
|
|
475
|
-
// 验证 manifest
|
|
476
|
-
validateManifest(manifest: PluginManifest): ValidationResult;
|
|
477
|
-
|
|
478
|
-
// 安全检查
|
|
479
|
-
securityCheck(pluginPath: string): SecurityReport;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
class PluginValidator implements IValidator {
|
|
483
|
-
validateStructure(pluginPath: string): ValidationResult {
|
|
484
|
-
const errors: ValidationError[] = [];
|
|
485
|
-
|
|
486
|
-
// 检查必需文件
|
|
487
|
-
if (!existsSync(join(pluginPath, 'manifest.json'))) {
|
|
488
|
-
errors.push({
|
|
489
|
-
level: 'error',
|
|
490
|
-
message: 'manifest.json is missing'
|
|
491
|
-
});
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
// 检查入口文件
|
|
495
|
-
// ...
|
|
496
|
-
|
|
497
|
-
return { valid: errors.length === 0, errors };
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
### 4.4 数据流图
|
|
503
|
-
|
|
504
|
-
```
|
|
505
|
-
┌─────────────────────────────────────────┐
|
|
506
|
-
│ CLI Command Entry │
|
|
507
|
-
│ npx @linyjs/cli pack [options] │
|
|
508
|
-
└──────────────┬──────────────────────────┘
|
|
509
|
-
│
|
|
510
|
-
▼
|
|
511
|
-
┌─────────────────────────────────────────┐
|
|
512
|
-
│ Configuration Loader │
|
|
513
|
-
│ - Read package.json │
|
|
514
|
-
│ - Read .lingrc (if exists) │
|
|
515
|
-
│ - Merge CLI options │
|
|
516
|
-
└──────────────┬──────────────────────────┘
|
|
517
|
-
│
|
|
518
|
-
▼
|
|
519
|
-
┌─────────────────────────────────────────┐
|
|
520
|
-
│ Builder │
|
|
521
|
-
│ - Detect build system │
|
|
522
|
-
│ - Execute build │
|
|
523
|
-
│ - Report errors │
|
|
524
|
-
└──────────────┬──────────────────────────┘
|
|
525
|
-
│
|
|
526
|
-
▼
|
|
527
|
-
┌─────────────────────────────────────────┐
|
|
528
|
-
│ Manifest Generator │
|
|
529
|
-
│ - Extract metadata │
|
|
530
|
-
│ - Detect entries │
|
|
531
|
-
│ - Generate manifest.json │
|
|
532
|
-
└──────────────┬──────────────────────────┘
|
|
533
|
-
│
|
|
534
|
-
▼
|
|
535
|
-
┌─────────────────────────────────────────┐
|
|
536
|
-
│ Validator │
|
|
537
|
-
│ - Validate structure │
|
|
538
|
-
│ - Check dependencies │
|
|
539
|
-
│ - Security scan │
|
|
540
|
-
└──────────────┬──────────────────────────┘
|
|
541
|
-
│
|
|
542
|
-
▼
|
|
543
|
-
┌─────────────────────────────────────────┐
|
|
544
|
-
│ Packager │
|
|
545
|
-
│ - Create ZIP archive │
|
|
546
|
-
│ - Compress files │
|
|
547
|
-
│ - Calculate checksum │
|
|
548
|
-
└──────────────┬──────────────────────────┘
|
|
549
|
-
│
|
|
550
|
-
▼
|
|
551
|
-
┌─────────────────────────────────────────┐
|
|
552
|
-
│ Output Reporter │
|
|
553
|
-
│ - Display result │
|
|
554
|
-
│ - Show statistics │
|
|
555
|
-
│ - Provide next steps │
|
|
556
|
-
└─────────────────────────────────────────┘
|
|
557
|
-
```
|
|
558
|
-
|
|
559
|
-
---
|
|
560
|
-
|
|
561
|
-
## 5. 实现细节
|
|
562
|
-
|
|
563
|
-
### 5.1 配置文件支持
|
|
564
|
-
|
|
565
|
-
#### `.lingrc.json`
|
|
566
|
-
|
|
567
|
-
```json
|
|
568
|
-
{
|
|
569
|
-
"build": {
|
|
570
|
-
"command": "npm run build",
|
|
571
|
-
"outputDir": "dist"
|
|
572
|
-
},
|
|
573
|
-
"pack": {
|
|
574
|
-
"exclude": [
|
|
575
|
-
"node_modules",
|
|
576
|
-
".git",
|
|
577
|
-
"*.test.ts",
|
|
578
|
-
"*.spec.ts"
|
|
579
|
-
],
|
|
580
|
-
"include": [
|
|
581
|
-
"**/*"
|
|
582
|
-
]
|
|
583
|
-
},
|
|
584
|
-
"manifest": {
|
|
585
|
-
"customFields": {
|
|
586
|
-
"homepage": "https://example.com"
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
```
|
|
591
|
-
|
|
592
|
-
### 5.2 错误处理策略
|
|
593
|
-
|
|
594
|
-
```typescript
|
|
595
|
-
class CliError extends Error {
|
|
596
|
-
constructor(
|
|
597
|
-
message: string,
|
|
598
|
-
public code: string,
|
|
599
|
-
public suggestions?: string[]
|
|
600
|
-
) {
|
|
601
|
-
super(message);
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
// 使用示例
|
|
606
|
-
try {
|
|
607
|
-
await builder.build();
|
|
608
|
-
} catch (error) {
|
|
609
|
-
if (error.code === 'BUILD_FAILED') {
|
|
610
|
-
console.error('❌ Build failed');
|
|
611
|
-
console.log('\n💡 Suggestions:');
|
|
612
|
-
error.suggestions?.forEach(s => console.log(` - ${s}`));
|
|
613
|
-
process.exit(1);
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
```
|
|
617
|
-
|
|
618
|
-
### 5.3 日志系统
|
|
619
|
-
|
|
620
|
-
```typescript
|
|
621
|
-
import chalk from 'chalk';
|
|
622
|
-
import ora from 'ora';
|
|
623
|
-
|
|
624
|
-
class Logger {
|
|
625
|
-
info(message: string) {
|
|
626
|
-
console.log(chalk.blue('ℹ'), message);
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
success(message: string) {
|
|
630
|
-
console.log(chalk.green('✓'), message);
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
error(message: string) {
|
|
634
|
-
console.error(chalk.red('✗'), message);
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
warn(message: string) {
|
|
638
|
-
console.warn(chalk.yellow('⚠'), message);
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
spinner(text: string) {
|
|
642
|
-
return ora(text).start();
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
```
|
|
646
|
-
|
|
647
|
-
### 5.4 进度指示
|
|
648
|
-
|
|
649
|
-
```typescript
|
|
650
|
-
const spinner = logger.spinner('Building project...');
|
|
651
|
-
|
|
652
|
-
try {
|
|
653
|
-
await builder.build();
|
|
654
|
-
spinner.succeed('Build completed');
|
|
655
|
-
} catch (error) {
|
|
656
|
-
spinner.fail('Build failed');
|
|
657
|
-
throw error;
|
|
658
|
-
}
|
|
659
|
-
```
|
|
660
|
-
|
|
661
|
-
### 5.5 性能优化
|
|
662
|
-
|
|
663
|
-
#### 增量构建
|
|
664
|
-
|
|
665
|
-
```typescript
|
|
666
|
-
class IncrementalBuilder {
|
|
667
|
-
private cacheDir = '.ling-cache';
|
|
668
|
-
|
|
669
|
-
async build() {
|
|
670
|
-
const cacheHash = this.calculateHash();
|
|
671
|
-
const cachedHash = this.readCacheHash();
|
|
672
|
-
|
|
673
|
-
if (cacheHash === cachedHash) {
|
|
674
|
-
logger.info('Using cached build');
|
|
675
|
-
return;
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
await this.fullBuild();
|
|
679
|
-
this.writeCacheHash(cacheHash);
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
```
|
|
683
|
-
|
|
684
|
-
#### 并行处理
|
|
685
|
-
|
|
686
|
-
```typescript
|
|
687
|
-
// 并行验证多个文件
|
|
688
|
-
const validationResults = await Promise.all([
|
|
689
|
-
validateManifest(manifest),
|
|
690
|
-
validateEntries(entries),
|
|
691
|
-
validateDependencies(deps)
|
|
692
|
-
]);
|
|
693
|
-
```
|
|
694
|
-
|
|
695
|
-
---
|
|
696
|
-
|
|
697
|
-
## 6. 使用示例
|
|
698
|
-
|
|
699
|
-
### 6.1 基本工作流
|
|
700
|
-
|
|
701
|
-
```bash
|
|
702
|
-
# 1. 创建新项目
|
|
703
|
-
npx @linyjs/cli init my-blog-plugin --template=full
|
|
704
|
-
|
|
705
|
-
# 2. 进入项目目录
|
|
706
|
-
cd my-blog-plugin
|
|
707
|
-
|
|
708
|
-
# 3. 安装依赖
|
|
709
|
-
npm install
|
|
710
|
-
|
|
711
|
-
# 4. 开发插件
|
|
712
|
-
# ... 编写代码 ...
|
|
713
|
-
|
|
714
|
-
# 5. 打包插件
|
|
715
|
-
npx @linyjs/cli pack
|
|
716
|
-
|
|
717
|
-
# 6. 验证插件
|
|
718
|
-
npx @linyjs/cli validate my-blog-plugin.mpk
|
|
719
|
-
|
|
720
|
-
# 7. 发布插件
|
|
721
|
-
npx @linyjs/cli publish my-blog-plugin.mpk --token=xxx
|
|
722
|
-
```
|
|
723
|
-
|
|
724
|
-
### 6.2 CI/CD 集成
|
|
725
|
-
|
|
726
|
-
#### GitHub Actions
|
|
727
|
-
|
|
728
|
-
```yaml
|
|
729
|
-
name: Build and Publish Plugin
|
|
730
|
-
|
|
731
|
-
on:
|
|
732
|
-
push:
|
|
733
|
-
tags:
|
|
734
|
-
- 'v*'
|
|
735
|
-
|
|
736
|
-
jobs:
|
|
737
|
-
build:
|
|
738
|
-
runs-on: ubuntu-latest
|
|
739
|
-
|
|
740
|
-
steps:
|
|
741
|
-
- uses: actions/checkout@v3
|
|
742
|
-
|
|
743
|
-
- name: Setup Node.js
|
|
744
|
-
uses: actions/setup-node@v3
|
|
745
|
-
with:
|
|
746
|
-
node-version: '18'
|
|
747
|
-
|
|
748
|
-
- name: Install dependencies
|
|
749
|
-
run: npm ci
|
|
750
|
-
|
|
751
|
-
- name: Build plugin
|
|
752
|
-
run: npx @linyjs/cli pack --output ./dist
|
|
753
|
-
|
|
754
|
-
- name: Validate plugin
|
|
755
|
-
run: npx @linyjs/cli validate ./dist/*.mpk
|
|
756
|
-
|
|
757
|
-
- name: Publish to registry
|
|
758
|
-
run: npx @linyjs/cli publish ./dist/*.mpk --token=${{ secrets.PLUGIN_TOKEN }}
|
|
759
|
-
```
|
|
760
|
-
|
|
761
|
-
### 6.3 本地开发
|
|
762
|
-
|
|
763
|
-
```bash
|
|
764
|
-
# 监听模式(自动重新打包)
|
|
765
|
-
npx @linyjs/cli pack --watch
|
|
766
|
-
|
|
767
|
-
# 快速迭代(跳过构建)
|
|
768
|
-
npx @linyjs/cli pack --no-build
|
|
769
|
-
|
|
770
|
-
# 输出到特定目录
|
|
771
|
-
npx @linyjs/cli pack -o ~/ling-plugins/
|
|
772
|
-
```
|
|
773
|
-
|
|
774
|
-
### 6.4 批量处理
|
|
775
|
-
|
|
776
|
-
```bash
|
|
777
|
-
# 打包多个插件
|
|
778
|
-
for dir in plugins/*/; do
|
|
779
|
-
cd "$dir"
|
|
780
|
-
npx @linyjs/cli pack -o ../../releases/
|
|
781
|
-
cd ../..
|
|
782
|
-
done
|
|
783
|
-
```
|
|
784
|
-
|
|
785
|
-
---
|
|
786
|
-
|
|
787
|
-
## 7. 扩展计划
|
|
788
|
-
|
|
789
|
-
### 7.1 短期计划(v0.1 - v0.3)
|
|
790
|
-
|
|
791
|
-
#### v0.1 - MVP
|
|
792
|
-
- ✅ `pack` 命令基础功能
|
|
793
|
-
- ✅ 基本的 manifest 生成
|
|
794
|
-
- ✅ ZIP 打包
|
|
795
|
-
- ✅ 简单的错误提示
|
|
796
|
-
|
|
797
|
-
#### v0.2 - 增强功能
|
|
798
|
-
- 🔲 `validate` 命令
|
|
799
|
-
- 🔲 完整的 manifest 验证
|
|
800
|
-
- 🔲 详细的错误报告
|
|
801
|
-
- 🔲 进度指示器
|
|
802
|
-
|
|
803
|
-
#### v0.3 - 用户体验
|
|
804
|
-
- 🔲 `init` 命令和项目模板
|
|
805
|
-
- 🔲 交互式向导
|
|
806
|
-
- 🔲 彩色输出
|
|
807
|
-
- 🔲 配置文件支持
|
|
808
|
-
|
|
809
|
-
### 7.2 中期计划(v0.4 - v0.6)
|
|
810
|
-
|
|
811
|
-
#### v0.4 - 发布功能
|
|
812
|
-
- 🔲 `publish` 命令
|
|
813
|
-
- 🔲 插件市场 API 集成
|
|
814
|
-
- 🔲 版本管理
|
|
815
|
-
- 🔲 发布历史
|
|
816
|
-
|
|
817
|
-
#### v0.5 - 高级功能
|
|
818
|
-
- 🔲 插件签名
|
|
819
|
-
- 🔲 增量构建
|
|
820
|
-
- 🔲 缓存优化
|
|
821
|
-
- 🔲 并行处理
|
|
822
|
-
|
|
823
|
-
#### v0.6 - 生态系统
|
|
824
|
-
- 🔲 插件依赖解析
|
|
825
|
-
- 🔲 自动更新检查
|
|
826
|
-
- 🔲 插件兼容性检查
|
|
827
|
-
- 🔲 迁移工具
|
|
828
|
-
|
|
829
|
-
### 7.3 长期愿景
|
|
830
|
-
|
|
831
|
-
#### 插件市场集成
|
|
832
|
-
- 在线浏览插件
|
|
833
|
-
- 一键安装/卸载
|
|
834
|
-
- 评分和评论
|
|
835
|
-
- 使用统计
|
|
836
|
-
|
|
837
|
-
#### 开发者工具
|
|
838
|
-
- 插件调试工具
|
|
839
|
-
- 性能分析
|
|
840
|
-
- 依赖可视化
|
|
841
|
-
- 代码生成器
|
|
842
|
-
|
|
843
|
-
#### 企业级功能
|
|
844
|
-
- 私有仓库支持
|
|
845
|
-
- SSO 认证
|
|
846
|
-
- 审计日志
|
|
847
|
-
- 团队协作
|
|
848
|
-
|
|
849
|
-
---
|
|
850
|
-
|
|
851
|
-
## 8. 附录
|
|
852
|
-
|
|
853
|
-
### A. 参考资源
|
|
854
|
-
|
|
855
|
-
- [Cleye](https://github.com/zthh/cleye) - 现代化 CLI 框架
|
|
856
|
-
- [Archiver](https://github.com/archiverjs/node-archiver) - ZIP 压缩
|
|
857
|
-
- [Inquirer](https://github.com/SBoudrias/Inquirer.js) - 交互式问答
|
|
858
|
-
- [Chalk](https://github.com/chalk/chalk) - 终端着色
|
|
859
|
-
|
|
860
|
-
### B. 类似工具
|
|
861
|
-
|
|
862
|
-
- **create-react-app** - React 项目脚手架
|
|
863
|
-
- **vue-cli** - Vue.js CLI 工具
|
|
864
|
-
- **angular-cli** - Angular CLI
|
|
865
|
-
- **webpack-cli** - Webpack 命令行
|
|
866
|
-
|
|
867
|
-
### C. 最佳实践
|
|
868
|
-
|
|
869
|
-
1. **用户友好**
|
|
870
|
-
- 清晰的错误消息
|
|
871
|
-
- 提供解决建议
|
|
872
|
-
- 友好的交互体验
|
|
873
|
-
|
|
874
|
-
2. **性能优先**
|
|
875
|
-
- 增量构建
|
|
876
|
-
- 缓存利用
|
|
877
|
-
- 并行处理
|
|
878
|
-
|
|
879
|
-
3. **可扩展性**
|
|
880
|
-
- 插件化架构
|
|
881
|
-
- 自定义配置
|
|
882
|
-
- 钩子系统
|
|
883
|
-
|
|
884
|
-
4. **安全性**
|
|
885
|
-
- 输入验证
|
|
886
|
-
- 沙箱执行
|
|
887
|
-
- 签名验证
|
|
888
|
-
|
|
889
|
-
---
|
|
890
|
-
|
|
891
|
-
## 总结
|
|
892
|
-
|
|
893
|
-
本设计文档详细描述了 `@linyjs/cli` 命令行工具的架构和功能。通过提供一键打包、验证、发布等功能,将极大提升 Ling 框架插件开发的效率和体验。
|
|
894
|
-
|
|
895
|
-
**核心价值:**
|
|
896
|
-
- 🚀 **提升效率** - 从多步手动操作简化为一键命令
|
|
897
|
-
- ✅ **保证质量** - 自动验证和错误检测
|
|
898
|
-
- 🔄 **支持自动化** - CI/CD 友好
|
|
899
|
-
- 📦 **标准化** - 统一的打包流程和格式
|
|
900
|
-
|
|
901
|
-
下一步将开始实现 v0.1 MVP 版本,首先完成 `pack` 命令的基础功能。
|