Skip to content

Commit 01fcf7a

Browse files
feat(cli): add short option aliases for command arguments
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
1 parent 60c2035 commit 01fcf7a

8 files changed

Lines changed: 721 additions & 71 deletions

File tree

.progress/PROGRESS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,4 @@ abc123d (or TBD)
4040
| 2026-03-09-4 | 2026-03-09 | Reset scan records and keep only last successful snapshot | `.progress/entries/2026/2026-03-09-4.md` | list, reset-cache, successful-snapshot, runtime-db, cli |
4141
| 2026-03-11-1 | 2026-03-11 | Add incremental base commit support | `.progress/entries/2026/2026-03-11-1.md` | incremental, git-diff, base-ref, cli, deploy |
4242
| 2026-03-11-2 | 2026-03-11 | Override using-git-worktrees with project git workflow | `.progress/entries/2026/2026-03-11-2.md` | skills, git-workflow, worktree, override, opencode |
43+
| 2026-03-11-3 | 2026-03-11 | Add short option aliases for CLI commands | `.progress/entries/2026/2026-03-11-3.md` | cli, argparse, short-options, readme, tests |
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 2026-03-11-3
2+
3+
## Date
4+
2026-03-11
5+
6+
## Title
7+
Add short option aliases for CLI commands
8+
9+
## Background / Issue
10+
当前 `mpy-cli` 的参数以长选项为主,日常使用时输入偏长。用户希望为每个现有命令参数补充单字符短选项,同时保持长选项兼容,并让 README 与测试一起同步约束这套映射。
11+
12+
## Actions / Outcome
13+
- Approach 1: 为所有参数设计全局唯一短选项 -> 可避免跨命令复用,但会引入许多不直观字母,放弃。
14+
- Approach 2: 按子命令局部复用短选项,并优先使用参数名直觉字母 -> 适合 `argparse` 的子命令模型,保留了 `-m/-p/-y/-n` 等常见写法。
15+
- Final approach: 先用 TDD 为 CLI 解析新增短参数回归测试,再在 `mpy_cli/cli.py` 中补齐短选项,并同步更新 `README.md``tests/test_docs_and_ci.py` -> 成功为所有现有参数增加短选项别名,重点解决了 `tree``--path``--port` 的冲突,最终采用 `-a/--path``-p/--port`,全部验证通过。
16+
17+
## Lessons / Refinements
18+
-`argparse` 子命令扩展短参数时,应以“子命令内无冲突、跨子命令可复用”为优先规则,避免为了全局唯一牺牲可记忆性。
19+
- README 约束测试应按命令小节校验关键 token/别名对,而不是整行精确匹配,才能同时保证契约强度与文档可维护性。
20+
21+
## Related Commit Message
22+
TBD
23+
24+
## Related Commit Hash
25+
TBD

README.md

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,11 @@ python3 -m pip install -e <SOURCE_MPY_CLI_PATH>
180180
### `mpy-cli init`
181181

182182
```bash
183-
mpy-cli init [--force] [--no-interactive]
183+
mpy-cli init [-f] [--force] [-n] [--no-interactive]
184184
```
185185

186-
- `--force`:覆盖已有 `.mpy-cli.toml``.mpyignore`
187-
- `--no-interactive`:跳过初始化后的交互配置向导。
186+
- `-f`/`--force`:覆盖已有 `.mpy-cli.toml``.mpyignore`
187+
- `-n`/`--no-interactive`:跳过初始化后的交互配置向导。
188188

189189
### `mpy-cli config`
190190

@@ -208,25 +208,25 @@ mpy-cli config
208208
### `mpy-cli plan`
209209

210210
```bash
211-
mpy-cli plan [--mode {incremental,full}] [--base BASE] [--port PORT] [--no-interactive] [--yes]
211+
mpy-cli plan [-m {incremental,full}] [--mode {incremental,full}] [-b BASE] [--base BASE] [-p PORT] [--port PORT] [-n] [--no-interactive] [-y] [--yes]
212212
```
213213

214-
- `--mode`:指定同步模式(`incremental``full`)。
215-
- `--base`:仅在 `incremental` 模式生效,指定 Git 基准提交;增量集合按“该基准提交 vs 当前工作区”计算。
216-
- `--port`:指定设备端口(如 `/dev/ttyACM0``COM3`)。
217-
- `--no-interactive`:禁用交互提问。
218-
- `--yes`:保留参数;在 `plan` 中不会触发写入确认流程。
214+
- `-m`/`--mode`:指定同步模式(`incremental``full`)。
215+
- `-b`/`--base`:仅在 `incremental` 模式生效,指定 Git 基准提交;增量集合按“该基准提交 vs 当前工作区”计算。
216+
- `-p`/`--port`:指定设备端口(如 `/dev/ttyACM0``COM3`)。
217+
- `-n`/`--no-interactive`:禁用交互提问。
218+
- `-y`/`--yes`:保留参数;在 `plan` 中不会触发写入确认流程。
219219

220220
### `mpy-cli list`
221221

222222
```bash
223-
mpy-cli list [--workers N] [--probe-timeout SECONDS] [--scan-mode MODE] [--reset]
223+
mpy-cli list [-w N] [--workers N] [-t SECONDS] [--probe-timeout SECONDS] [-s MODE] [--scan-mode MODE] [-r] [--reset]
224224
```
225225

226-
- `--workers`:并发探测线程数,默认 `8`;当扫描到很多端口时可提升返回速度。
227-
- `--probe-timeout`:单端口探测超时秒数,默认 `1.0`;慢端口超时后会被跳过,不阻塞全部结果。
228-
- `--scan-mode`:端口探测策略,支持 `known-first``known-only``full-only`,默认 `known-first`
229-
- `--reset`:先清空之前的扫描记录,再立即执行当前这次 `list`
226+
- `-w`/`--workers`:并发探测线程数,默认 `8`;当扫描到很多端口时可提升返回速度。
227+
- `-t`/`--probe-timeout`:单端口探测超时秒数,默认 `1.0`;慢端口超时后会被跳过,不阻塞全部结果。
228+
- `-s`/`--scan-mode`:端口探测策略,支持 `known-first``known-only``full-only`,默认 `known-first`
229+
- `-r`/`--reset`:先清空之前的扫描记录,再立即执行当前这次 `list`
230230
- 默认会先读取运行时数据库里“上一次扫描成功过”的端口,仅对“成功缓存端口与当前 `mpremote connect list` 交集”做探测;若没有发现设备,再回退到当前可用端口全量探测。
231231
- 该策略兼容 macOS / Linux / Windows:是否“当前可用”以本次 `mpremote connect list` 结果为准,因此 `COM3` 这类 Windows 端口同样可用。
232232
- 自动扫描串口,并对选中的端口进行受控并发探测,返回所有可访问的 MicroPython 设备。
@@ -241,97 +241,97 @@ mpy-cli list
241241
当本机串口很多、默认探测较慢时,可按需调高并发并缩短超时:
242242

243243
```bash
244-
mpy-cli list --workers 12 --probe-timeout 1.0
244+
mpy-cli list -w 12 -t 1.0
245245
```
246246

247247
如果你想直接忽略缓存、每次都对当前端口全量探测:
248248

249249
```bash
250-
mpy-cli list --scan-mode full-only
250+
mpy-cli list -s full-only
251251
```
252252

253253
如果你想先清空之前的扫描记录,再做一次全新的 list:
254254

255255
```bash
256-
mpy-cli list --reset
256+
mpy-cli list -r
257257
```
258258

259259
输出会包含当前探测到的所有可用 MicroPython 设备,例如端口、实现版本、平台与机型信息。
260260

261261
### `mpy-cli deploy`
262262

263263
```bash
264-
mpy-cli deploy [--mode {incremental,full}] [--base BASE] [--port PORT] [--no-interactive] [--yes]
264+
mpy-cli deploy [-m {incremental,full}] [--mode {incremental,full}] [-b BASE] [--base BASE] [-p PORT] [--port PORT] [-n] [--no-interactive] [-y] [--yes]
265265
```
266266

267-
- `--mode`:指定同步模式(`incremental``full`)。
268-
- `--base`:仅在 `incremental` 模式生效,指定 Git 基准提交;未提供时默认对比 `HEAD` 与当前工作区。
269-
- `--port`:指定设备端口。
270-
- `--no-interactive`:禁用交互提问。
271-
- `--yes`:跳过执行前确认(包括全量模式二次确认)。
267+
- `-m`/`--mode`:指定同步模式(`incremental``full`)。
268+
- `-b`/`--base`:仅在 `incremental` 模式生效,指定 Git 基准提交;未提供时默认对比 `HEAD` 与当前工作区。
269+
- `-p`/`--port`:指定设备端口。
270+
- `-n`/`--no-interactive`:禁用交互提问。
271+
- `-y`/`--yes`:跳过执行前确认(包括全量模式二次确认)。
272272

273273
推荐用法:
274274

275275
```bash
276-
mpy-cli deploy --no-interactive --yes
276+
mpy-cli deploy -n -y
277277
```
278278

279279
进行 `config` 之后直接无交互烧入
280280

281281
### `mpy-cli upload`
282282

283283
```bash
284-
mpy-cli upload [--local LOCAL] [--remote REMOTE] [--port PORT] [--no-interactive] [--yes]
284+
mpy-cli upload [-l LOCAL] [--local LOCAL] [-r REMOTE] [--remote REMOTE] [-p PORT] [--port PORT] [-n] [--no-interactive] [-y] [--yes]
285285
```
286286

287-
- `--local`:本地文件路径(如 `seekfree_demo/E01_demo.py`)。
288-
- `--remote`:设备目标路径;不传时交互模式默认优先使用“相对 `source_dir` 路径”,若本地文件不在 `source_dir` 下则回退为本地输入路径,可手动修改。
289-
- `--port`:指定设备端口。
290-
- `--no-interactive`:禁用交互提问;此时需显式提供 `--local``--remote`
291-
- `--yes`:跳过执行前确认。
287+
- `-l`/`--local`:本地文件路径(如 `seekfree_demo/E01_demo.py`)。
288+
- `-r`/`--remote`:设备目标路径;不传时交互模式默认优先使用“相对 `source_dir` 路径”,若本地文件不在 `source_dir` 下则回退为本地输入路径,可手动修改。
289+
- `-p`/`--port`:指定设备端口。
290+
- `-n`/`--no-interactive`:禁用交互提问;此时需显式提供 `--local``--remote`
291+
- `-y`/`--yes`:跳过执行前确认。
292292

293293
推荐用法:
294294

295295
```bash
296-
mpy-cli upload --local <LOCAL>
296+
mpy-cli upload -l <LOCAL>
297297
```
298298

299299
填写字段 `LOCAL` 指定本地文件路径之后交互式确认远程路径
300300

301301
### `mpy-cli run`
302302

303303
```bash
304-
mpy-cli run [--path PATH] [--port PORT] [--no-interactive] [--yes]
304+
mpy-cli run [-f PATH] [--path PATH] [-p PORT] [--port PORT] [-n] [--no-interactive] [-y] [--yes]
305305
```
306306

307-
- `--path`:设备目标文件路径,语义为相对 `device_upload_dir`
308-
- `--port`:指定设备端口。
309-
- `--no-interactive`:禁用交互提问;此时需显式提供 `--path`
310-
- `--yes`:跳过执行前确认。
307+
- `-f`/`--path`:设备目标文件路径,语义为相对 `device_upload_dir`
308+
- `-p`/`--port`:指定设备端口。
309+
- `-n`/`--no-interactive`:禁用交互提问;此时需显式提供 `--path`
310+
- `-y`/`--yes`:跳过执行前确认。
311311

312312
推荐用法:
313313

314314
```bash
315-
mpy-cli run --path main.py
315+
mpy-cli run -f main.py
316316
```
317317

318318
若配置 `device_upload_dir = "apps/demo"`,则会执行 `:apps/demo/main.py`
319319

320320
### `mpy-cli delete`
321321

322322
```bash
323-
mpy-cli delete [--path PATH] [--port PORT] [--no-interactive] [--yes]
323+
mpy-cli delete [-f PATH] [--path PATH] [-p PORT] [--port PORT] [-n] [--no-interactive] [-y] [--yes]
324324
```
325325

326-
- `--path`:设备目标路径,语义为相对 `device_upload_dir`,可为文件或目录。
327-
- `--port`:指定设备端口。
328-
- `--no-interactive`:禁用交互提问;此时需显式提供 `--path`
329-
- `--yes`:跳过执行前确认。
326+
- `-f`/`--path`:设备目标路径,语义为相对 `device_upload_dir`,可为文件或目录。
327+
- `-p`/`--port`:指定设备端口。
328+
- `-n`/`--no-interactive`:禁用交互提问;此时需显式提供 `--path`
329+
- `-y`/`--yes`:跳过执行前确认。
330330

331331
推荐用法:
332332

333333
```bash
334-
mpy-cli delete --path obsolete.py
334+
mpy-cli delete -f obsolete.py
335335
```
336336

337337
若配置 `device_upload_dir = "apps/demo"`,则会删除 `:apps/demo/obsolete.py`
@@ -340,17 +340,17 @@ mpy-cli delete --path obsolete.py
340340
### `mpy-cli tree`
341341

342342
```bash
343-
mpy-cli tree [--path PATH] [--port PORT] [--no-interactive]
343+
mpy-cli tree [-a PATH] [--path PATH] [-p PORT] [--port PORT] [-n] [--no-interactive]
344344
```
345345

346-
- `--path`:设备目标目录路径,语义为相对 `device_upload_dir`;不传时默认读取 `device_upload_dir` 根目录。
347-
- `--port`:指定设备端口。
348-
- `--no-interactive`:禁用交互提问;此时需通过 `--port` 或配置文件提供端口。
346+
- `-a`/`--path`:设备目标目录路径,语义为相对 `device_upload_dir`;不传时默认读取 `device_upload_dir` 根目录。
347+
- `-p`/`--port`:指定设备端口。
348+
- `-n`/`--no-interactive`:禁用交互提问;此时需通过 `--port` 或配置文件提供端口。
349349

350350
推荐用法:
351351

352352
```bash
353-
mpy-cli tree --path .
353+
mpy-cli tree -a .
354354
```
355355

356356
若配置 `device_upload_dir = "apps/demo"`,则默认读取 `:apps/demo`;例如 `--path services` 会读取 `:apps/demo/services`
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# CLI 短参数同义设计文档
2+
3+
## 背景
4+
5+
当前 `mpy-cli` 的子命令参数以长选项为主,可读性较好,但在高频命令行使用场景下输入偏长。用户希望为每个命令的每个参数补充单字符短选项,同一语义可以同时支持长短两种写法。
6+
7+
## 目标
8+
9+
- 为所有现有子命令参数增加单字符短选项同义。
10+
- 保持现有长选项行为完全兼容。
11+
- 允许短选项在不同子命令内复用,不强求全局唯一。
12+
- 保持 `README.md`、CLI 帮助输出与测试同步。
13+
14+
## 方案对比
15+
16+
### 方案 A(推荐)按参数名直觉分配,子命令内解决冲突
17+
18+
- 优先使用参数名首字母,例如 `--mode -> -m``--port -> -p`
19+
- 若同一子命令内冲突,再为冲突参数选次优字母。
20+
- 优点:大多数参数一眼可猜,记忆成本最低。
21+
- 缺点:少量参数需要非首字母,如 `--no-interactive -> -n`
22+
23+
### 方案 B 统一按参数类别分配
24+
25+
- 路径类、布尔类、模式类分别使用固定字母集合。
26+
- 优点:风格整齐。
27+
- 缺点:不如按参数名直接映射直观,用户仍需额外记规则。
28+
29+
### 方案 C 仅为高频参数补短选项
30+
31+
- 减少冲突与文档维护成本。
32+
- 缺点:不满足“每个命令的每个参数都增加短选项”的需求。
33+
34+
最终采用方案 A。
35+
36+
## 命令设计
37+
38+
### `init`
39+
40+
```bash
41+
mpy-cli init [-f|--force] [-n|--no-interactive]
42+
```
43+
44+
### `list`
45+
46+
```bash
47+
mpy-cli list [-w|--workers N] [-t|--probe-timeout SECONDS] [-s|--scan-mode MODE] [-r|--reset]
48+
```
49+
50+
### `plan` / `deploy`
51+
52+
```bash
53+
mpy-cli plan [-m|--mode {incremental,full}] [-b|--base BASE] [-p|--port PORT] [-n|--no-interactive] [-y|--yes]
54+
mpy-cli deploy [-m|--mode {incremental,full}] [-b|--base BASE] [-p|--port PORT] [-n|--no-interactive] [-y|--yes]
55+
```
56+
57+
### `upload`
58+
59+
```bash
60+
mpy-cli upload [-l|--local PATH] [-r|--remote PATH] [-p|--port PORT] [-n|--no-interactive] [-y|--yes]
61+
```
62+
63+
### `run`
64+
65+
```bash
66+
mpy-cli run [-f|--path PATH] [-p|--port PORT] [-n|--no-interactive] [-y|--yes]
67+
```
68+
69+
### `delete`
70+
71+
```bash
72+
mpy-cli delete [-f|--path PATH] [-p|--port PORT] [-n|--no-interactive] [-y|--yes]
73+
```
74+
75+
### `tree`
76+
77+
```bash
78+
mpy-cli tree [-a|--path PATH] [-p|--port PORT] [-n|--no-interactive]
79+
```
80+
81+
- `tree``--path``--port` 均可能争用 `-p`
82+
- 为保证高频串口参数的一致性,保留 `--port -> -p`
83+
- `tree --path` 退让为 `-a`,取自 p`a`th 中次优可用字符,虽然不如 `-p` 直觉,但可避免同一子命令歧义。
84+
85+
## 架构与影响面
86+
87+
1.`mpy_cli/cli.py``build_parser()` 中为每个 `add_argument()` 增加短选项别名。
88+
2. 参数 `dest`、默认值、行为分支不变,仅扩展 `argparse` 接受的输入形式。
89+
3.`tests/test_cli.py` 中新增回归测试,覆盖典型短选项解析结果。
90+
4. 更新 `README.md` 的命令示例与参数总览。
91+
5.`tests/test_docs_and_ci.py` 对 README/参数文本有同步校验,需要一并更新。
92+
93+
## 错误处理
94+
95+
- 不引入新的业务错误码。
96+
- 若短选项冲突,问题应在解析器构建阶段暴露,因此实现时需确保同一子命令内唯一。
97+
- 长选项保持兼容,避免破坏现有脚本或用户习惯。
98+
99+
## 测试策略
100+
101+
-`tests/test_cli.py` 中增加短选项解析测试:
102+
- `plan/deploy``-m/-b/-p/-n/-y`
103+
- `list``-w/-t/-s/-r`
104+
- `upload``-l/-r/-p/-n/-y`
105+
- `run/delete/tree` 的冲突参数映射
106+
- 运行 `tests/test_docs_and_ci.py`,确保 README 与 CLI 定义同步。
107+
- 运行全量测试,确认短选项扩展没有影响既有行为。
108+
109+
## 验收标准
110+
111+
- 每个现有 CLI 参数都存在一个可用的单字符短选项。
112+
- 长选项与既有行为保持兼容。
113+
- 同一子命令内不存在短选项冲突。
114+
- README、帮助输出、测试全部同步通过。

0 commit comments

Comments
 (0)