harness - 自定义命令
2026年6月14日 下午11:02:29
自定义命令是一种把“常用提示词模板”固化为可复用指令的能力(兼容 Claude Code 的 Custom Commands 规范)。命令本质是带参数占位的 Markdown 模板,执行时替换参数后作为 Agent 任务运行。
1、命令定义文件
命令以 Markdown 文件定义,放在 {harnessHome}/commands/ 目录下:YAML Front Matter 描述元数据,正文即提示词模板。
---
description: 生成一条 git 提交信息
argument-hint: [message]
model: deepseek-v4-flash
---
请根据当前暂存区的变更,生成一条简洁的提交信息。
补充说明:$ARGUMENTS
元数据字段:
| 字段 | 描述 |
|---|---|
description | 命令描述 |
argument-hint | 参数提示(用于补全提示) |
model | 指定执行该命令的模型(可选) |
2、参数占位符
模板正文支持两种占位符(兼容 Claude Code):
$1、$2、$3…:按位置取单个参数。$ARGUMENTS:把所有参数拼接为一个字符串。
替换顺序为“先位置参数、后 $ARGUMENTS”。例如模板 部署 $1 到 $2 环境($ARGUMENTS),传入 ["web", "prod"] 后得到 部署 web 到 prod 环境(web prod)。
3、命名空间(子目录)
commands/ 支持子目录递归扫描,子目录会成为命令的命名空间(用冒号分隔)。例如:
commands/deploy/staging.md→ 命令名deploy:stagingcommands/git/commit.md→ 命令名git:commit
4、注册与查找
命令由 CommandRegistry 管理,可从目录加载,也可用代码注册:
CommandRegistry registry = engine.getCommandRegistry();
// 从目录加载(递归扫描 .md)
registry.load(Paths.get(engine.getWorkspace(), engine.getHarnessCommands()));
// 查找与列举
Command cmd = registry.find("git:commit");
List<Command> all = registry.all(); // 排序后的全部命令
List<String> names = registry.names(); // 命令名列表(用于 Tab 补全)
同名命令只会注册一次,重复注册会被忽略并打印告警。