@quantacenter/quanta-problem-cli 0.0.0-stage → 1.0.0
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 +337 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4134 -0
- package/dist/index.js.map +1 -0
- package/dist/program.d.ts +134 -0
- package/dist/program.js +125 -0
- package/dist/program.js.map +1 -0
- package/package.json +60 -5
- package/templates/backend_service/README.md +55 -0
- package/templates/backend_service/answer/package.json +9 -0
- package/templates/backend_service/answer/pnpm-lock.yaml +9 -0
- package/templates/backend_service/answer/server.js +61 -0
- package/templates/backend_service/detail.md +30 -0
- package/templates/backend_service/gitignore +5 -0
- package/templates/backend_service/judge.js +43 -0
- package/templates/backend_service/problem.config.ts +37 -0
- package/templates/backend_service/template/package.json +9 -0
- package/templates/backend_service/template/pnpm-lock.yaml +9 -0
- package/templates/backend_service/template/server.js +28 -0
- package/templates/frontend/README.md +34 -0
- package/templates/frontend/answer/index.html +97 -0
- package/templates/frontend/gitignore +5 -0
- package/templates/frontend/judge.js +41 -0
- package/templates/frontend/problem.config.ts +34 -0
- package/templates/frontend/template/index.html +74 -0
package/README.md
CHANGED
|
@@ -1,3 +1,338 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @challenge/problem-creator-cli
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
出题 CLI:脚手架生成、离线预检、上传、审计等待、发布。
|
|
4
|
+
|
|
5
|
+
## 快速开始
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm --filter @challenge/problem-creator-cli build # 仓库根执行
|
|
9
|
+
|
|
10
|
+
pnpm qpc --help # 从仓库根调用
|
|
11
|
+
cd packages/problem-creator-cli && pnpm dev --help # tsx 直跑源码
|
|
12
|
+
node packages/problem-creator-cli/dist/index.js --help # 构建产物
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
基本流程:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
qpc init my-problem --type frontend --name "购物车合计" --difficulty easy
|
|
19
|
+
cd my-problem
|
|
20
|
+
qpc check # 离线预检
|
|
21
|
+
qpc login # 设备码授权
|
|
22
|
+
qpc upload --wait # 上传并等待审计,输出检查点明细
|
|
23
|
+
qpc publish 123 # 发布,123 为 upload 返回的 pid
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
后端服务题(`--type backend_service`):模板不同,无首屏可截图,需先生成封面:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
qpc init my-api --type backend_service --name "待办清单 HTTP API"
|
|
30
|
+
cd my-api
|
|
31
|
+
qpc cover --upload --write # 生成封面并写回 imageId
|
|
32
|
+
qpc check
|
|
33
|
+
qpc upload --wait
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 命令一览
|
|
37
|
+
|
|
38
|
+
| 命令 | 作用 | 需要登录 |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| `qpc init [dir]` | 生成题目骨架;`--type` 选题型,不传时交互选择 | 否 |
|
|
41
|
+
| `qpc check [dir]` | 离线预检;`--strict` 使警告也算失败 | 否 |
|
|
42
|
+
| `qpc cover [dir]` | 生成封面图;`--random` 随机配色、`--upload` 上传、`--write` 写回配置 | 上传时 |
|
|
43
|
+
| `qpc tag [dir]` | 查看平台标签;`--write` 交互多选、`--set <id...>` 指定 id,写回 tagIds | 否 |
|
|
44
|
+
| `qpc upload [dir]` | 上传题目:配置了 `problemId` 追加新版本,否则新建;默认等待审计 | 是 |
|
|
45
|
+
| `qpc status <pid>` | 查看状态与最近一次审计的检查点明细;`--watch` 持续刷新 | 是 |
|
|
46
|
+
| `qpc publish <pid>` | 发布(`ready → published`);`--unpublish` 下架 | 是 |
|
|
47
|
+
| `qpc login` | 登录并保存凭据;默认设备码授权,密码登录用 `--email` / `--password-stdin` | 否 |
|
|
48
|
+
| `qpc doctor` | 自检:Node 版本、凭据权限、API 可达性、登录角色 | 否 |
|
|
49
|
+
|
|
50
|
+
全局参数:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
--api <url> Web 应用地址(默认 QUANTA_API_URL 或 http://localhost:3000)
|
|
54
|
+
--token <token> 访问令牌(默认 QUANTA_TOKEN,不落盘)
|
|
55
|
+
--cwd <dir> 题目根目录(解析顺序:--cwd > INIT_CWD > 进程 cwd)
|
|
56
|
+
--json 输出 JSON(stdout 只有一份结果,日志走 stderr)
|
|
57
|
+
--quiet 隐藏进度信息
|
|
58
|
+
--verbose 调试信息(错误堆栈、被忽略的文件等)
|
|
59
|
+
--no-color 关闭彩色输出(非 TTY 默认关闭)
|
|
60
|
+
-y, --yes 跳过交互确认
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 退出码
|
|
64
|
+
|
|
65
|
+
| 码 | 含义 |
|
|
66
|
+
|---|---|
|
|
67
|
+
| 0 | 成功 |
|
|
68
|
+
| 1 | 运行时错误(含 doctor 检查失败) |
|
|
69
|
+
| 2 | 用法/配置错误 |
|
|
70
|
+
| 3 | 预检或审计未通过 |
|
|
71
|
+
| 4 | 网络/服务端不可达或 5xx |
|
|
72
|
+
| 5 | 未登录、令牌失效、无权限 |
|
|
73
|
+
| 130 | Ctrl-C 中断 |
|
|
74
|
+
|
|
75
|
+
## 题目目录结构
|
|
76
|
+
|
|
77
|
+
`--type` 选择题型;非交互环境(管道/CI)、`--yes`、`--json` 下默认 `frontend`。
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
# frontend(默认)
|
|
81
|
+
my-problem/
|
|
82
|
+
├── problem.config.ts # 配置:标题、难度、标签、运行命令
|
|
83
|
+
├── judge.js # 判题脚本
|
|
84
|
+
├── template/index.html # 学生起点,通常低分
|
|
85
|
+
├── answer/index.html # 参考解,必须满分;默认封面取首屏截图
|
|
86
|
+
└── README.md
|
|
87
|
+
|
|
88
|
+
# backend_service
|
|
89
|
+
my-api/
|
|
90
|
+
├── problem.config.ts # type: 'backend_service',含镜像/端口/启动命令
|
|
91
|
+
├── detail.md # 题面
|
|
92
|
+
├── judge.js # 用 http 发请求、断言响应
|
|
93
|
+
├── template/ # 学生起点(含 pnpm-lock.yaml)
|
|
94
|
+
├── answer/ # 参考解(含 pnpm-lock.yaml)
|
|
95
|
+
└── cover.png # init 已按 cover.generate 渲染,未上传
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
后端题差异(详见 [`docs/BACKEND_SERVICE_PROBLEM.md`](../../docs/BACKEND_SERVICE_PROBLEM.md)):
|
|
99
|
+
|
|
100
|
+
- 判题脚本用 `defineTestHandler(async ({ http, $ }) => ...)`,不是 `page`。
|
|
101
|
+
- 必须自定义封面:`--type backend_service` 会写好 `cover: { mode: 'custom', generate: {...} }` 并本地渲染 `cover.png`,仍需 `qpc cover --upload --write` 上传获取 `imageId`(否则 `IMG001` 拦截)。
|
|
102
|
+
- `template/` 与 `answer/` 是独立工程,均需 `pnpm-lock.yaml`(容器离线安装)。
|
|
103
|
+
- `runtime.bootCommand` 由镜像决定;服务启动命令写 `runtime.initCommand`。
|
|
104
|
+
|
|
105
|
+
### `problem.config.ts`
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
import { defineProblemConfig } from '@challenge/problem-creator-cli';
|
|
109
|
+
|
|
110
|
+
export default defineProblemConfig({
|
|
111
|
+
title: '购物车合计',
|
|
112
|
+
problemId: 123, // 首次上传后写回;有它才追加新版本
|
|
113
|
+
detail: '题面(Markdown)', // 或 detailFile: 'statement.md'
|
|
114
|
+
difficulty: 'easy', // easy | medium | hard | very_hard
|
|
115
|
+
tagIds: [1], // 必须是已有标签 id(qpc tag 查看)
|
|
116
|
+
// totalScore: 20, // 留空取检查点之和
|
|
117
|
+
cover: { mode: 'default' }, // 后端题用 { mode: 'custom', generate: {...} }
|
|
118
|
+
runtime: {
|
|
119
|
+
judgeUploadPath: 'project', // = 快照挂载路径
|
|
120
|
+
initCommand: 'npx serve -l 3000 project', // 站点根须等于该目录
|
|
121
|
+
buildCommand: undefined,
|
|
122
|
+
},
|
|
123
|
+
paths: { template: 'template', answer: 'answer', judge: 'judge.js' },
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
配置由 [jiti](https://github.com/unjs/jiti) 加载,支持 `.ts` / `.mts` / `.js` / `.json`。CLI 将 `@challenge/problem-creator-cli` 别名到自身模块,仓库外目录同样可用(IDE 补全需安装该包,或用普通对象 + `import type`)。
|
|
128
|
+
|
|
129
|
+
## 预检规则
|
|
130
|
+
|
|
131
|
+
`qpc check` 覆盖 `PROBLEM_AUTHORING.md` 中可静态判定的项,规则按编号可在 CI 中定位。完整表格见 [`docs/RULES.md`](./docs/RULES.md)。
|
|
132
|
+
|
|
133
|
+
```text
|
|
134
|
+
$ qpc check
|
|
135
|
+
> 读取题目配置 → /path/to/my-problem
|
|
136
|
+
错误 × 1
|
|
137
|
+
JUD004 judge.js:12 检查点「合计应为 10.50」的 handler 没有 return 分数
|
|
138
|
+
handler 末尾补 `return 10;`。不 return 时即使断言全过也记 0 分。
|
|
139
|
+
> 预检结果
|
|
140
|
+
检查点 3 个,合计 20 分
|
|
141
|
+
答案模板 1 个文件,2.1 KB
|
|
142
|
+
参考解 1 个文件,2.6 KB
|
|
143
|
+
判题脚本 45 行
|
|
144
|
+
结论 未通过(1 个错误)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
预检不能替代线上审计(参考解是否满分、封面效果需真实判题机验证)。`qpc upload --wait` 会拉回并打印审计的检查点明细。
|
|
148
|
+
|
|
149
|
+
## 标签(`qpc tag`)
|
|
150
|
+
|
|
151
|
+
`tagIds` 必须是平台标签库里已有的 id。`qpc tag` 从平台拉取(`public.tag.list`,无需登录)并写回配置:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
qpc tag # 列出全部标签(id / 名称 / 颜色)
|
|
155
|
+
qpc tag --write # 交互多选,写回 tagIds
|
|
156
|
+
qpc tag --set 1,3 # 指定 id,写回(CI / 非交互)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
写回为原子写盘,写完重新加载校验,失败回滚。旧配置缺 `tagIds` 也可用 `--set` / `--write` 补上。非交互环境 `--write` 报用法错误。
|
|
160
|
+
|
|
161
|
+
## 上传与版本管理(`qpc upload`)
|
|
162
|
+
|
|
163
|
+
服务端题目分「基础题(base)」与「版本(pid)」两层。默认每次上传新建基础题;配置 `problemId` 后在同一题下追加新版本(`reupload`),旧版本保留。
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
qpc upload --write # 首次:新建题目并写回 pid
|
|
167
|
+
qpc upload # 之后:追加新版本
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
`--write` 只在命令成功后写回:审计未通过时不写回 `problemId`(`--no-wait` 时上传成功即写回)。写盘原子(临时文件 + rename),写完重新校验,失败回滚。
|
|
171
|
+
|
|
172
|
+
| 参数 | 说明 |
|
|
173
|
+
|---|---|
|
|
174
|
+
| `--problem <pid>` | 本次在该题目下追加版本(覆盖配置 `problemId`) |
|
|
175
|
+
| `--new` | 强制新建题目(与 `--problem` 互斥) |
|
|
176
|
+
| `--write` | 写回题目 id |
|
|
177
|
+
|
|
178
|
+
追加版本前按 `problemId` 查基础题 id,该 id 须属于当前账号。任意版本的 pid 均可定位基础题。
|
|
179
|
+
|
|
180
|
+
## 封面生成(`qpc cover`)
|
|
181
|
+
|
|
182
|
+
后端题型必须自定义封面,需平台 `imageId`。在配置声明配色后一条命令完成生成、上传、写回:
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
export default defineProblemConfig({
|
|
186
|
+
cover: {
|
|
187
|
+
mode: 'custom',
|
|
188
|
+
generate: {
|
|
189
|
+
bg: '#0F172A', // 背景色(纯色)
|
|
190
|
+
bgTo: '#14432A', // 提供时为对角线渐变
|
|
191
|
+
accent: '#A6FB1D', // 竖条 + 副标题颜色
|
|
192
|
+
subtitle: 'GET /books POST /borrow',
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
qpc cover --upload --write # 渲染 cover.png → 上传 → 写回 imageId
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
流程:渲染 PNG 到 `cover.generate.out`(默认 `cover.png`)→ `admin.image.upload` 获取 id → 写回配置 `imageId`。写盘原子,写完重新加载校验,失败回滚。
|
|
203
|
+
|
|
204
|
+
命令行参数覆盖配置同名项(优先级:显式参数 > `--random` > 配置 > 默认值):
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
qpc cover --bg "#101828" --bg-to "#123B2A" --subtitle "GET /health"
|
|
208
|
+
qpc cover --out /tmp/preview.png --width 1600 --height 900
|
|
209
|
+
qpc cover # 只生成,不上传
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
| 参数 | 说明 | 默认值 |
|
|
213
|
+
|---|---|---|
|
|
214
|
+
| `--out <file>` | 输出文件(相对题目目录) | `generate.out` 或 `cover.png` |
|
|
215
|
+
| `--bg <color>` | 背景色 | `#0F172A` |
|
|
216
|
+
| `--bg-to <color>` | 渐变终止色,提供时画渐变 | 无 |
|
|
217
|
+
| `--accent <color>` | 强调色(竖条 / 副标题) | `#A6FB1D` |
|
|
218
|
+
| `--text <color>` | 主标题颜色 | `#F8FAFC` |
|
|
219
|
+
| `--subtitle <text>` | 副标题;空字符串不渲染 | `generate.subtitle` |
|
|
220
|
+
| `--footer <text>` | 左下角页脚 | `Quanta Challenge` |
|
|
221
|
+
| `--width/--height <px>` | 画布尺寸(200~4096) | `1200 × 675` |
|
|
222
|
+
| `--random` | 随机生成配色 | 否 |
|
|
223
|
+
| `--seed <n>` | 固定随机种子 | 无 |
|
|
224
|
+
| `--upload` | 上传并输出 `imageId` | 否 |
|
|
225
|
+
| `--write` | 写回 `imageId` 与 `--random` 配色(隐含 `--upload`) | 否 |
|
|
226
|
+
|
|
227
|
+
### 随机配色(`--random`)
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
qpc cover --random # 生成并打印 seed
|
|
231
|
+
qpc cover --random --seed 42 # 用种子复现
|
|
232
|
+
qpc cover --random --upload --write # 随机配色 + 上传 + 写回
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
约束:
|
|
236
|
+
|
|
237
|
+
- 主标题对背景对比度 ≥ 7:1、强调色对背景 ≥ 4.5:1(WCAG);不达标时调整明度。
|
|
238
|
+
- 强调色色相按配色关系(同色系/邻近色/分裂互补/互补/三角)从背景推导;背景固定在深色、中等饱和范围。
|
|
239
|
+
|
|
240
|
+
同一 seed 生成同一套配色。`--random --write` 将配色写进 `cover.generate`(保留其他字段)。显式参数覆盖导致对比度不达标时,命令拒绝执行并指出对应颜色。
|
|
241
|
+
|
|
242
|
+
颜色仅接受十六进制(`#rgb` / `#rrggbb`)——值会拼进 SVG,限制格式防止注入。
|
|
243
|
+
|
|
244
|
+
排版按 `width / 1200` 等比缩放:标题按显示宽度换行(空格/汉字边界),字号向下收敛至 3 行内,竖条随标题高度。
|
|
245
|
+
|
|
246
|
+
## 认证
|
|
247
|
+
|
|
248
|
+
### 1. 设备码授权(默认)
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
qpc login # 不带参数即设备码;--device 显式指定
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```
|
|
255
|
+
> 向 http://localhost:3000 申请设备授权码
|
|
256
|
+
|
|
257
|
+
请在浏览器中完成授权:
|
|
258
|
+
地址:http://localhost:3000/auth/device
|
|
259
|
+
验证码:WDJB-MJHT
|
|
260
|
+
|
|
261
|
+
> 等待授权完成(Ctrl-C 取消)
|
|
262
|
+
[ok] 已登录:admin · admin@example.com · ADMIN
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
流程(RFC 8628):CLI 申请验证码 → 打开浏览器(预填验证码)→ 页面核对并确认 → CLI 轮询获取 token 落盘。
|
|
266
|
+
|
|
267
|
+
- 密码不经过 CLI,不进 shell history。
|
|
268
|
+
- 验证码 10 分钟有效,输错 5 次作废会话(RFC 8628 §5.1)。
|
|
269
|
+
- 页面显示账号、应用与权限,需显式确认。
|
|
270
|
+
- 无浏览器环境(SSH):`qpc login --no-browser`,在其他设备打开地址输入验证码。
|
|
271
|
+
|
|
272
|
+
### 2. 邮箱 + 密码
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
qpc login --email you@example.com # 交互式,密码不回显
|
|
276
|
+
echo "$PASSWORD" | qpc login --email you@example.com --password-stdin
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
仅提供 `--email` / `--password-stdin` 时走密码登录;`QUANTA_EMAIL` / `QUANTA_PASSWORD` 只是这两个参数的取值来源,不改变默认行为。
|
|
280
|
+
|
|
281
|
+
### 3. 注入令牌
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
QUANTA_TOKEN=<access token> qpc upload my-problem --wait
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
令牌来自浏览器 cookie `quanta_access_token`,15 分钟过期,仅临时使用。`--token` / `QUANTA_TOKEN` 提供的令牌不落盘。
|
|
288
|
+
|
|
289
|
+
### 凭据与续期
|
|
290
|
+
|
|
291
|
+
- 凭据保存在 `~/.config/quanta/credentials.json`(权限 0600,`QUANTA_CONFIG_DIR` 覆盖)。
|
|
292
|
+
- access token 15 分钟,自动用 refresh token 调 `GET /api/refresh` 续期;失败提示重新 `qpc login`。
|
|
293
|
+
- 有 csrf token 时发送 `x-csrf-token`;否则退回 `x-ssr: 1` 通道。
|
|
294
|
+
|
|
295
|
+
## 目录结构(本包)
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
templates/ # qpc init 的脚手架内容(按题型分目录)
|
|
299
|
+
├── frontend/ # 前端题模板
|
|
300
|
+
└── backend_service/# 后端题模板(含 detail.md 与两份 Node 工程)
|
|
301
|
+
src/
|
|
302
|
+
├── index.ts # bin 入口:信号处理、退出码(唯一有副作用处)
|
|
303
|
+
├── program.ts # 程序化入口:defineProblemConfig + 类型
|
|
304
|
+
├── cli.ts # 命令树与顶层错误处理
|
|
305
|
+
├── commands/ # 每个子命令一个文件,编排与输出
|
|
306
|
+
├── core/ # context / env / errors / exit-codes / logger / runtime
|
|
307
|
+
├── domain/ # 配置 schema、判题脚本静态分析、快照、预检规则
|
|
308
|
+
├── services/ # 凭据、HTTP、tRPC、admin API、judge API、OAuth 设备码
|
|
309
|
+
├── ui/ # 输出渲染(文本 / JSON)
|
|
310
|
+
├── utils/ # fs / paths / async / terminal / jwt
|
|
311
|
+
└── templates/ # 读 templates/、替换占位符、组装 ScaffoldFile[]
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
- 脚手架模板是真实文件,用 `{{title}}` / `{{mountPath}}` 等占位符,`qpc init` 时插值;未知占位符报内部错误。
|
|
315
|
+
- `templates/**/gitignore` 交付时改名为 `.gitignore`。
|
|
316
|
+
- 依赖方向单向:`commands → (domain | services | ui) → core/utils`;`domain` 不依赖 `services`,`ui` 不发请求。判题脚本分析、快照、预检规则可独立调用。
|
|
317
|
+
|
|
318
|
+
## 开发
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
pnpm dev <args> # tsx 直跑源码
|
|
322
|
+
pnpm lint # biome check
|
|
323
|
+
pnpm typecheck # tsc --noEmit
|
|
324
|
+
pnpm build # tsup → dist/
|
|
325
|
+
pnpm verify # lint + typecheck + build
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
- 3 空格缩进、单引号、行宽 80(biome,配置见 `biome.json`)。
|
|
329
|
+
- `examples/` 是 `qpc init` 产物,不参与 lint。
|
|
330
|
+
- 新增规则须同步补 `docs/RULES.md`。
|
|
331
|
+
|
|
332
|
+
## 相关文档
|
|
333
|
+
|
|
334
|
+
- `docs/PROBLEM_AUTHORING.md`(仓库根):出题流程与约定。
|
|
335
|
+
- `docs/ARCHITECTURE.md`:模块划分、数据流、设计取舍。
|
|
336
|
+
- `docs/RULES.md`:预检规则编号表。
|
|
337
|
+
- `docs/OAUTH_DEVICE_FLOW.md`:设备码授权实现与服务端配合。
|
|
338
|
+
- `docs/BACKEND_SERVICE_PROBLEM.md`:后端服务题说明。
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|