一句话项目 slogan:Optimize the context window. Persist everything else.(把上下文窗口省着用,其它一切都落盘。)
这是「一天一个开源项目」系列的一篇。今天讲 ECC(Everything Claude Code)。
和 agent 协作过半年的人,真正值钱的东西往往不在代码里。它散在三十个会话里:先写测试再实现、review 要换一个干净的上下文、提交前跑哪几个检查、什么任务该拆给子代理。这些规矩你每开一个新会话都得重讲一遍,换个 harness(Claude Code 换 Codex、换 Cursor)更是直接归零。
更麻烦的是第二层:等你终于把它们写成两百个 skill、五十条 rule,系统提示被自己的资源塞满,模型开始忽略中间那段。为了让它记住更多,结果让它忘得更快。
ECC 的赌注是把「工程制度」从散文变成可安装、可校验、有预算的资源:装一次,然后变成 agent 干活的方式。
项目速览
⭐ 290,384 Stars | 🍴 43,022 Forks | 📄 MIT 协议 | 🔧 4,059 次提交 | 🐛 252 个 Open Issues
截至 2026-10-27。仓库创建于 2026-01-18,九个多月长到 29 万星;412 位贡献者里作者 affaan-m 占 1,778 次提交(约 44%)。装起来的体积也不小:ecc-universal 这个 npm 包解压后 19.5 MB。
阅读价值与前置说明
读完你应该能回答:
- 为什么一个「提示词合集」要管自己叫操作系统?它到底在管什么?
- 上下文只有 8000 token 额度时,怎么决定哪三个 skill 进场、哪六条经验被注入?
- 「支持某个 harness」除了写进 README,还能怎么被验证?
- 为什么这个项目的安全工具拒绝用一个没版本号的
npx命令下发? - 一个治理得这么严的项目,在哪几件事上照样是坏的?
前置知识:
- 用过至少一个 coding agent(Claude Code / Codex / Cursor 任一)
- 知道系统提示、skill、hook、子代理这些概念大概是什么
- 可选:了解 CI 里的 schema 校验与快照测试,读第八段会更顺
项目背景与完整档案
官方定位(GitHub 描述):"The agent harness performance optimization system." README 的说法更具体:你的 agent 会写代码,ECC 给它一套工程系统——先计划再动手、用测试验证、换新上下文自审、记住重要的、把重复的成功变成可复用技能。核心流水线就一行:
plan -> test -> implement -> review -> verify -> remember -> improve归属上要说清楚:这是个人主导的项目(作者 affaan-m),不是 Anthropic 官方产物——它装进你自己的 Claude Code / Codex,并不产出模型。README 的 Background 里,作者自述 2025 年 9 月拿过 Anthropic x Forum Ventures 黑客松(作品是 zenith.chat),这组配置是他的「在生产应用里打过仗」的沉淀。另外别把仓库里那句「Built at the Claude Code Hackathon(Cerebral Valley x Anthropic, Feb 2026)」安到 ECC 头上——那句话在 AgentShield 小节里,说的是那个安全工具。
基础信息:
- 仓库:
affaan-m/ECC,当前 v2.2.3(2026-10-01) - npm:
ecc-universal2.2.3;另有安全审计工具ecc-agentshield1.6.0 - 协议:MIT
- 运行要求:Node.js 18+;Claude Code 插件路径还需 Git 与 Claude Code 2.1+
- 代码构成:JavaScript 11.4 MB / Rust 1.9 MB / Python 1.6 MB / Shell 242 KB
- 仓库规模:4,649 个文件;311 个技能(
skills/*/SKILL.md)、71 个 agent、97 个命令、122 条规则文件、518 个测试文件 - 文档成本:
docs/下 1,540 个文件,README 另有 16 种译文
项目数据(截至 2026-10-27):
- ⭐ Stars 290,384 | 🍴 Forks 43,022 | 🐛 Open Issues 252
- 🔧 提交 4,059 | 👥 贡献者 412
- 🗓️ 创建于 2026-01-18,最近推送 2026-10-26
- 🏷️ 版本节奏很密:v2.2.0(08-28)、v2.2.1(09-08)、v2.2.2(09-30)、v2.2.3(10-01)
它解决什么问题
和 agent 长期协作的人都会撞上的墙:
- 经验不可携带:你调出来的工作流写在自己的会话和笔记里;换 harness、换项目、换机器,全部重来
- 规矩不可靠:「请记得先写测试」是一句建议,模型忘了就忘了,没有东西兜底
- 上下文被自己的资源挤爆:技能越写越多,全量加载后系统提示臃肿,模型反而更糊
- 「支持某工具」是一句空话:装完才发现 hooks 在这个 harness 里只是提示文本,不是强制
- agent 的配置本身没人审计:
CLAUDE.md、settings.json、mcp.json、hooks 都是能执行代码的东西,却默认被信任
ECC 的解法分四步:
第一步,制度写成文件。技能、规则、命令、hook 都以仓库根为唯一源(skills/*/SKILL.md、rules/、commands/、hooks/hooks.json),各 harness 侧只做加载映射。
第二步,能在提示之外强制的,就不放进提示。质量检查交给 hook 做确定性执行,而不是指望模型记得。
第三步,进上下文的量要预算化。安装按模块/画像分层(minimal 连 hook 运行时不装),上下文有 token 与条数上限。
第四步,把跨 harness 的支持程度写成可校验的契约。分四档,每档绑定安装路径、验证命令和风险说明,缺一项 CI 就失败。
使用场景:
- 一个人跨多个 agent:白天 Claude Code、晚上 Codex,技能和记忆共用一套
- 团队要统一 agent 行为:把内网规范写进 rules + hooks,用 profile 按项目类型装
- 长任务编排:用子代理分工 + worktree 隔离,配
ecc2的会话控制面 - 给 agent 配置做体检:装第三方插件、改 hook 之前先跑一遍 AgentShield
快速上手
前提:Node.js 18+;走 Claude Code 插件路径还需要 Git 和 Claude Code 2.1+。
最省事的路径(Claude Code 插件,官方推荐):
npx ecc-universal@2.2.3 setup想一次配多个 harness,用引导式安装(可选 Claude Code / Codex / Kimi Code 任意组合,写盘前会预检并要一次确认):
npx ecc-universal@2.2.3 install --guided装完新开一个 Claude Code 会话,验证插件已启用:
/plugin list如果你更信 Claude Code 自己的插件机制,也可以在里面执行:
/plugin marketplace add https://github.com/affaan-m/ECC
/plugin install ecc@ecc两个注意点,都是官方文档强调的:每个 harness 只选一种安装方式(叠加装会把 skill、命令、hook 复制两份);低上下文或本地小模型环境用 --profile minimal(这个画像刻意不装 hook 运行时)。
核心特性拆解
311 个技能——技能是主要工作面:TDD、研究、安全、前端、数据、ML、运维各有成套,按需加载而不是全量塞进提示。
71 个子代理——planner、architect、各语言 reviewer、build-error-resolver、e2e-runner、security-reviewer 等,用有限工具集分派任务,让「写代码的上下文」和「review 的上下文」分开。
97 个命令——/plan、/code-review、/quality-gate、/learn、/instinct-status、/evolve 这些入口。README 说得很直白:命令正在向技能迁移,保留是为了兼容。
Hook 运行时 + 三档强度——hooks 在工具事件上触发,ECC_HOOK_PROFILE 选强度,ECC_DISABLED_HOOKS 能按 ID 精确关掉某一条。这个是「制度」和「建议」的分界线。
规则按语言选装——rules/common/ 之外,TypeScript、Python、Go、Swift、PHP、ArkTS 各自一套,只装你用的。
记忆库(memory vault)——.ecc/memory/ 和 ~/.ecc/memory/ 下的人类可读文档,跨 harness 共享,同时提供 ecc memory CLI 和本地 stdio MCP 两个入口。
AgentShield——扫描 agent 配置本身的漏洞:CLAUDE.md 里的硬编码密钥和注入话术、settings.json 里过宽的 allow 列表、mcp.json 里可疑的服务器、hooks 里的命令注入、agent 定义里不受限的工具权限。
ecc2 控制面——2.0 之后多了一个 Rust 写的守护进程:会话生命周期管理、TUI 看板、worktree、通知、可观测性。
深度设计剖析
设计亮点一:上下文是一次有预算、有排序、且明确「不可观测」的注入决策
常规方案:
绝大多数「agent 增强包」的加载逻辑是「装了就用」:所有 skill 的描述、所有规则、所有学到的经验,一股脑进系统提示。资源少的时候看不出问题,写多了就变成上下文互相挤占——而且没有人知道到底是谁把额度吃掉了。
ECC 的做法:
先把安装本身分层。安装画像(profile)是一组模块的集合,minimal 的说明写着「低上下文 Claude Code 配置,有规则、agent、命令、平台配置和质量流程,但不含 hook 运行时」;full 则列了 33 个模块。想省上下文,先省在安装这一步。
再往上,是两层显式的上下文清单(manifests/context-profiles/):
// lean@1.json
"selection": {
"eager": ["skill:configure-ecc", "skill:context-budget", "skill:ecc-guide"],
"required": ["skill:configure-ecc", "skill:context-budget", "skill:ecc-guide"],
"remainder": "routed"
},
"budget": { "tokens": 8000, "mode": "blocking" }lean@1 只让三个技能常驻(装配置、算上下文预算、看总览),其余全部走「路由」;full@1 是 eager: "all",但预算同样是 8000 token,模式是 report-only。这两份清单的 description 里有句话值得单独拎出来:"this profile does not activate or modify a harness"、"native activation is unobserved"——它们描述的是意图投影,不是强制结果,作者明确告诉你「harness 到底照做没照做,我们观测不到」。
第二层是「直觉」(instincts)注入。ECC 会把会话里学到的模式存成带置信度的直觉,然后决定哪些进上下文。默认值写在环境变量文档里:最多注入 6 条(ECC_MAX_INJECTED_INSTINCTS)、置信度门槛 0.7(ECC_INSTINCT_CONFIDENCE_THRESHOLD)、SessionStart 附加上下文上限 8000 字符(ECC_SESSION_START_MAX_CHARS)。
排序逻辑在 scripts/lib/instinct-relevance.js:
const DEFAULT_PROJECT_SCOPE_BOOST = 0.25
const DEFAULT_STACK_MATCH_BOOST = 0.2项目内范围的直觉 +0.25,domain/trigger/stack 命中当前技术栈的 +0.2。注释把数值的来历交代了:这样一条项目内的 0.7 能(0.7+0.25=0.95)压过一条无关的全局 0.9,一条栈匹配的 0.75 也能压过无关的 0.9。而且这两个值故意不做成环境变量可调——因为相关的那条 issue 要求的是「相关性排序」,不是再多几个旋钮。
几个有说服力的工程细节:
- 匹配按整词切分,不是子串。注释专门点名:避免关键字
go命中单词good。 - 技术栈探测必须便宜:只看项目根目录顶层(非递归),因为这段代码跑在一次会阻塞的 SessionStart hook 里。除了常规语言/框架探测,还额外加
*.tf/*.tfvars→ terraform、dbt_project.yml→ dbt。 - 优雅降级:没有项目内直觉、也没探到技术栈时,所有 boost 归零,排序退化成纯置信度——行为和加这个功能之前一致。
为什么这么做:
因为「记住更多」和「别把窗口塞满」是一对直接冲突的目标。把注入变成一道有上限、有排序的题,才能让「学到的东西变多」不等于「提示变长」。而把兜底的排序权重写死在代码里、把不可观测的部分写进文档,是在承认一件事:这部分结果依赖 harness,ECC 只能管住自己这一侧。
代价:
- 注入上限意味着主动遗忘:第 7 条够格的直觉就是进不去,没有例外通道
- 排序权重不可调,遇到「我的项目就是需要全局经验优先」的场景只能关掉整个排序
- 预算有两种模式:
lean@1是 blocking,full@1只是 report-only;加上「不可观测」的自述,说明这套额度里有一部分是自述而非强制
设计亮点二:把「支持某个 harness」写成能被 CI 打回的契约
常规方案:
跨工具项目的 README 上写一排 logo:Claude Code ✓、Codex ✓、Cursor ✓、Gemini ✓。何为「支持」没有定义,装完发现 hooks 不生效、命令不认、agent 起不来,也很正常。
ECC 的做法:
先定义四种状态,写进 docs/architecture/harness-adapter-compliance.md:
| 状态 | 含义 |
|---|---|
| Native | 能直接为这个 harness 安装或验证该能力面 |
| Adapter-backed | 有薄适配层,但各 harness 的完成度不同 |
| Instruction-backed | 只能提供文件与指引,harness 不暴露 ECC 需要的 hook/会话面 |
| Reference-only | 只能当设计参照,还没有安装器或适配器 |
然后是一张从源码渲染出来的矩阵:它不是手写的表格,而是由 scripts/lib/harness-adapter-compliance.js 生成,用 npm run harness:adapters -- --check 校验公开文档和数据源是否还对得上。
矩阵里每一条适配记录必须带齐九个字段:状态、支持的资产、不支持或不同的能力面、安装方式、验证命令、风险说明、最后验证时间、负责人、来源文档。文档写得很清楚:任何一条公开声明缺安装路径、验证命令、风险说明、负责人、来源文档或验证日期,校验器就失败。
配套的操作原则也只有一句话:"Do not call a harness native until the adapter has an install path and a verification command."
几个能体现这套东西有多较真的条目:
- Codex 标的是
Instruction-backed,风险说明直接写「除非 Codex 有原生 hook 面,否则把 hooks 当作策略文本看待」——不假装有强制力。 - Pi 标
Adapter-backed,同时承认「agent 链、审批提示、持久 todo 需要配套包,不在本适配器内」;风险栏还写明 Pi 扩展以完整用户权限执行。 - DeepSeek Harness 那条更细:命令 hook 走官方桥接,覆盖 7 个桥接事件里的 5 个、23 条命令;并点名
PreCompact、PostToolUseFailure、SessionEnd三个事件没有对应物,配置里「裸的顶层 patch 条目会被静默丢弃」。这种细节写到「哪个事件没有对应物」的粒度,基本只有真跑过的人写得出来。
为什么这么做:
因为跨 harness 的复杂度不会被「支持」两个字吸收,只会转移。把它写成可校验的状态机加字段清单,等于把「我们做到了哪一步」变成可以回归测试的东西——升级 harness 之后跑一遍 --check,声明和数据源对不上就红。
工程价值与代价:
价值是三重的:用户可以按状态预期功能,而不是按 logo;维护者升级适配器时不会忘记改文档;CI 能拦住「README 承诺了但代码没有」这种最常见的漂移。
代价也很清楚:文档变成代码的一部分,改一个适配器要同步改字段、跑校验;四种状态对用户来说是需要学习的额外概念;而且状态再细也回答不了「这个 harness 上 hooks 到底有没有真的跑」——Instruction-backed 本质上就是一句「我们只能提供文本」。
项目细节补充
安全工具自己拒绝被随便分发。 AgentShield 扫的是 agent 配置这个攻击面:CLAUDE.md 里的硬编码密钥与注入话术、settings.json 里过宽的 allow 列表和危险 bypass 开关、mcp.json 里可疑的服务器与 npx 供应链风险、hooks 里的插值注入与静默吞错、agent 定义里不受限的工具权限。但它自己的安装说明有一段「Runner provenance」:这些命令要求已经安装且审查过的 ecc-agentshield,ECC 不提供经过审计的版本 pin,也不允许「用一次性的无版本 npx 跑一下」。一个安全工具先对自己执行这条纪律,比写在口号里可信。
记忆库的三条硬约束。 docs/design/ecc-memory-vault.md 里写着:Markdown 是唯一真源,SQLite 图、embedding、托管系统都只能当索引;记忆是上下文,不是指令——每条新记忆初始 trust: "unreviewed",不能被静默提升成规则或策略;写入是 create-only,永不覆盖已有 ID,取代关系靠新文档加显式链接表达。它连威胁边界都写了:这份实现对「同一 OS 用户下的并发进程」不构成安全边界,因为 Node.js 给不了 openat2 那种保证——需要隔离就用独立账户或容器。
Rust 那 1.9 MB 不是装饰。 ecc2/ 是 2.0 之后加的控制面:session/ 下有 daemon、manager、runtime、store,另有 TUI 看板、worktree、通知和可观测性模块。主体逻辑仍在 JS 和 markdown 里,Rust 只承担「长任务要有人管状态」这件事。
文档成本是真的。 docs/ 1,540 个文件,README 另有 16 种译文,全都签进仓库。好处是各地开发者能读懂;代价是每次改安装流程,翻译版就落后一截——这类项目最后往往靠「英文版为准」的约定兜底。
免费的部分和收费的部分。 README 有一节写得挺直白:ECC 免费,靠赞助和 Pro 用户养着;ECC Pro 换成托管的 GitHub App,加私有仓库分析、PR 触发的审计、AgentShield 扫描、团队用量池和优先支持。开源部分和商业部分的边界写在明面上,不是「先开源再收网」。
它自己承认坏掉的地方。 平台支持表里直接挂着 issue 号:macOS 上独立的 GAN 路径与系统 Bash 3.2 不兼容、且存在评分解析缺陷(#2674);Windows 原生下连续学习的 observer 守护进程和记忆库写入都有未修复缺陷(#2489、#2626)。这种「把坏掉的地方和 bug 号并排放进支持矩阵」的做法,比一张全绿的表格有用得多。
项目资源汇总
官方资源
- GitHub:affaan-m/ECC
- 官网:ecc.tools
- 开源协议:MIT
- 版本:v2.2.3(2026-10-01);npm 包 ecc-universal
- 更新日志:仓库内
CHANGELOG.md;逐版本说明在docs/releases/ - 安装与适配:
docs/architecture/harness-adapter-compliance.md(跨 harness 合规矩阵) - 三份指南:
the-shortform-guide.md(上手)、the-longform-guide.md(上下文经济学、记忆、评测、并行)、the-security-guide.md(提示注入、hooks、MCP、AgentShield) - 安全工具:ecc-agentshield
- 社区:Discord(README 顶部有邀请链接)、GitHub App
相关资源
- AgentShield:agent 配置安全审计器
- DeepSeek Harness:ECC 有一条专门的适配说明(走官方 hooks 桥接)
- Claude Code 插件文档:native 安装路径的宿主侧说明
媒体报道与延伸阅读
- DeepWiki 架构导读(第三方自动生成,覆盖控制面、组件地图、安装画像、跨 harness 分层;注意它滞后于仓库,页面上还写着 68 agents / 290 skills,当前是 71 / 311)
核心要点回顾
- ECC 不是提示词合集,而是把工程制度产品化:311 个技能、71 个 agent、97 个命令、规则和 hook 都以仓库根为唯一源
- 上下文被当成预算管:整体 8000 token、SessionStart 附加 8000 字符、最多注入 6 条直觉、门槛 0.7,排序靠 +0.25 项目内 / +0.2 栈匹配,且这两个权重故意不给调
- 跨 harness 支持是一份四档契约,矩阵由源码生成、
--check校验,缺安装路径或验证命令的声明直接判失败 - 它最可信的地方是写清了「管不到的部分」:profile 只是投影、
Instruction-backed只有策略文本、记忆库不是安全边界
适合谁
- 同时在两三个 coding agent 之间切换、受够了每次重讲规矩的人
- 想把团队规范变成 agent 的强制检查(而不是又一份共读文档)的工程团队
- 需要给 agent 配置做安全体检的平台/安全工程师
- 对上下文工程、资源加载预算这类问题感兴趣的架构爱好者
一句话评价
它最狠的地方不是存了 311 个技能,而是敢在文档里写明哪些技能「装了也不一定生效」。
