跳到主要内容

第 6 章:Commands——兼容入口与 CLI 控制面

两个容易混淆的“命令系统”

ECC 有两类命令:

  1. commands/*.md:面向 Claude Code 等宿主的 slash command 文档入口,例如 plan.mdquality-gate.mdreact-review.md
  2. scripts/ecc.js:面向安装、诊断、记忆、会话和控制面的 Node CLI,例如 ecc installecc doctorecc memory

前者指导模型或用户触发工作流,后者直接操作本地文件、状态和外部 CLI。把两者混为一谈,会误以为 /plan 能直接解析安装 manifest,或以为 ecc doctor 只是一个 prompt。

94 个 slash command 的角色

命令按前缀可以看到几条演进路线:

例子设计意图
核心质量plancode-reviewquality-gatetest-coverage通用工程闭环
专项技术go-*rust-*react-*kotlin-*flutter-*语言/框架兼容入口
编排与多 Agentmulti-*orch-*epic-*loop-*将任务分解并跟踪执行
记忆与学习learnlearn-evalinstinct-*promote从会话反馈沉淀能力
运维与治理harness-auditsecurity-scanauto-updatesessions检查和维护运行环境

命令是用户体验层的索引,而不是实现层的唯一入口。比如 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。

源码定位