第 6 章:Commands——兼容入口与 CLI 控制面
两个容易混淆的“命令系统”
ECC 有两类命令:
commands/*.md:面向 Claude Code 等宿主的 slash command 文档入口,例如plan.md、quality-gate.md、react-review.md。scripts/ecc.js:面向安装、诊断、记忆、会话和控制面的 Node CLI,例如ecc install、ecc doctor、ecc memory。
前者指导模型或用户触发工作流,后者直接操作本地文件、状态和外部 CLI。把两者混为一谈,会误以为 /plan 能直接解析安装 manifest,或以为 ecc doctor 只是一个 prompt。
94 个 slash command 的角色
命令按前缀可以看到几条演进路线:
| 族 | 例子 | 设计意图 |
|---|---|---|
| 核心质量 | plan、code-review、quality-gate、test-coverage | 通用工程闭环 |
| 专项技术 | go-*、rust-*、react-*、kotlin-*、flutter-* | 语言/框架兼容入口 |
| 编排与多 Agent | multi-*、orch-*、epic-*、loop-* | 将任务分解并跟踪执行 |
| 记忆与学习 | learn、learn-eval、instinct-*、promote | 从会话反馈沉淀能力 |
| 运维与治理 | harness-audit、security-scan、auto-update、sessions | 检查和维护运行环境 |
命令是用户体验层的索引,而不是实现层的唯一入口。比如 quality-gate.md 明确说明真正实现位于 scripts/hooks/quality-gate.js,命令只是把 hook 的输入契约解释给人。
scripts/ecc.js 的分发器设计
scripts/ecc.js 不直接实现安装和状态逻辑,而是维护一个 COMMANDS 表,把命令名映射到子脚本:
const COMMANDS = {
install: {script: 'install-apply.js'},
plan: {script: 'install-plan.js'},
doctor: {script: 'doctor.js'},
repair: {script: 'repair.js'},
memory: {script: 'memory.js'},
};
解析流程还有两个细节值得注意:
--dry-run会在统一入口转成ECC_DRY_RUN=1,让子脚本复用预览语义。- 未识别的首参数若是 legacy language 或 flag,会回退到隐式
install;这保留了旧安装命令的兼容性。
实际执行使用 spawnSync,把 cwd、环境、stdio 和退出码统一转发。ito 还会使用安全的调用环境,memory 则保留 stdin 继承,以支持管道输入。
为什么 commands 逐步让位给 skills
命令天然适合短入口,但很容易复制知识、产生旧路径和跨 harness 不一致。Skill 更适合被主 Agent 发现、按需加载、组合和复用。因此 ECC 的迁移策略是:
长期知识/流程 → skills/
用户熟悉的短入口 → commands/ shim
本地状态/副作用 → scripts/ CLI 或 hooks/
这是一种“兼容性优先、canonical surface 前移”的演进,而不是一次性删除 slash command。