new-subcommand · v1.0.0 · 2026-09-22 · sha256 83b813cff1129487
new-subcommand v1.0.0A
Immutable. This exact content is served forever at /api/v1/blob/83b813cff1129487.
---
name: new-subcommand
description: 为 DevKeel CLI 新增子命令的标准开发流程
metadata:
version: "1.0.0"
author: "devkeel"
domain: cli-node
triggers:
- 新增命令
- 添加子命令
- new command
- add subcommand
---
# 子命令实现
## 何时使用
为 DevKeel CLI 新增一个子命令时(如 `harness <new-cmd>`)。
## 流程
### Step 1: 注册命令
在 `src/index.ts` 中添加:
```typescript
import { runNewCmd } from './commands/new-cmd.js'
program
.command('new-cmd')
.description('中文功能描述')
.option('--flag', '选项说明')
.action((opts) => runNewCmd(opts))
```
### Step 2: 实现命令层
创建 `src/commands/new-cmd.ts`:
```typescript
import * as p from '@clack/prompts'
import { someLogic } from '../lib/new-cmd.js'
export async function runNewCmd(opts?: { flag?: boolean }): Promise<void> {
p.intro('harness new-cmd')
// 交互 + 调用 lib
p.outro('完成')
}
```
命令层只做:读参数 → 交互 → 调用 lib → 输出结果。
### Step 3: 实现逻辑层
创建 `src/lib/new-cmd.ts`:
- 纯函数,不引入 `@clack/prompts`
- 文件操作前 `fs.existsSync` 守卫
- 返回 plain object 或 null,不 throw
### Step 4: 编写测试
创建 `tests/new-cmd.test.ts`:
- 临时目录隔离(`fs.mkdtempSync`)
- 真实文件系统验证
- 覆盖正常路径 + 缺失输入 + 幂等性
### Step 5: 验证
```bash
pnpm lint && pnpm test && pnpm build
node bin/devkeel.js new-cmd --help
```
## Checklist
- [ ] `src/index.ts` 注册命令
- [ ] `src/commands/new-cmd.ts` 交互层
- [ ] `src/lib/new-cmd.ts` 逻辑层(如有复杂逻辑)
- [ ] `tests/new-cmd.test.ts` 测试
- [ ] `pnpm lint` + `pnpm test` 通过