跳转到内容

规则系统与多语言分层

规则系统与多语言分层

学习目标

本章要解决什么问题:理解 ECC 如何在 12 种语言生态系统中保持规则的一致性,同时允许语言特化。

读完本章后,你将了解:

  • 规则分层架构(Common + Per-Language)
  • Prompt Defense 基线的注入策略
  • 按需安装的规则模块裁剪
  • 规则与技能的边界定义

前置知识

本章涉及提示工程的基础知识,建议先阅读:


项目实践

规则分层架构

ECC 的规则系统分为两层:

rules/
├── common/ # 通用规则(所有语言共享)
│ ├── agents.md # Agent 使用指南
│ ├── code-review.md # 代码审查标准
│ ├── coding-style.md # 编码风格
│ ├── development-workflow.md
│ ├── git-workflow.md
│ ├── hooks.md
│ ├── patterns.md
│ ├── performance.md
│ ├── security.md
│ └── testing.md
└── {language}/ # 语言特定规则(按需安装)
├── typescript/
├── python/
├── golang/
├── java/
├── kotlin/
├── rust/
├── cpp/
├── csharp/
├── dart/
├── fsharp/
├── perl/
├── php/
└── ...

加载顺序:Common 规则始终加载,语言规则按安装配置加载。这意味着 TypeScript 项目的 Agent 会加载 rules/common/*.md + rules/typescript/*.md

语言规则的内容结构

每种语言的规则目录通常包含:

rules/typescript/
├── coding-standards.md # TypeScript 编码标准
├── testing.md # TypeScript 测试策略
├── security.md # TypeScript 安全注意事项
└── patterns.md # TypeScript 设计模式

每个语言规则文件顶部都注入 Prompt Defense 基线,确保即使文件被单独使用,安全上下文仍然存在。

按需安装

规则模块支持按语言裁剪安装:

Terminal window
# 只安装 TypeScript 规则
bash install.sh --target claude --modules rules-typescript
# 安装 TypeScript + Python 规则
bash install.sh --target claude --modules rules-typescript,rules-python

这使得不需要多语言支持的用户可以减少安装的文件数。

规则 vs 技能的边界

ECC 明确区分规则和技能的职责:

维度规则(Rules)技能(Skills)
触发方式Always-on(始终生效)On-demand(按需激活)
内容编码风格、安全指南、工作流约束具体工作流、模式、示例
格式Markdown 指令SKILL.md(When to Use + How It Works + Examples)
安装rules/ 目录skills/ 目录
示例”函数 <50 行”、“不可变操作""TDD 工作流步骤”、“React 组件测试模式”

为什么不在每个 SKILL.md 中重复语言规则? 规则是 always-on,技能是 on-demand。如果在每个技能中重复语言规则,会导致:

  • 维护负担:修改规则需要更新所有技能
  • 不一致:技能可能使用过时的规则版本
  • 上下文浪费:每次加载技能都携带重复的规则

.claude/rules/ 中的项目级规则

除了 rules/ 目录中的可安装规则,ECC 自身也通过 .claude/rules/ 定义了项目级规则:

.claude/rules/
├── node.md # Node.js 项目特定规则
├── everything-claude-code-guardrails.md # 自动生成的护栏
└── ...

这些规则是 ECC 项目开发过程中的约定,不是通用的可安装规则。

AGENTS.md 中的核心原则

ECC 的根目录 AGENTS.md 定义了五个核心原则,这些原则作用于所有代理:

  1. Agent-First — 委托给专业代理处理领域任务
  2. Test-Driven — 实现前先写测试,80%+ 覆盖率
  3. Security-First — 安全不妥协,验证所有输入
  4. Immutability — 始终创建新对象,不修改现有对象
  5. Plan Before Execute — 复杂功能先规划再实现

这些原则通过 AGENTS.md 的加载机制(Claude Code 自动读取)注入到所有会话中。


问题与规避

规则冲突

问题:Common 规则和 Language 规则可能冲突(如 Common 规定函数 <50 行,Language 规定 <100 行)。

ECC 的规避

  • Common 规则定义最低标准,Language 规则可以更严格但不能更宽松
  • 冲突时以更具体的规则为准(Language > Common)
  • CI 检查规则文件中的明显冲突

规则过时

问题:语言/框架更新后规则可能过时。

规避方案

  • 规则文件标注 versionDate
  • 社区 PR 可以更新特定语言的规则
  • 规则更新遵循 CONTRIBUTING.md 中的 PR 模板

Prompt Defense 重复注入

问题:每个规则文件顶部都重复注入 Prompt Defense Baseline,导致文件变大。

ECC 的权衡

  • 优势:防止文件被单独提取后丢失安全上下文
  • 代价:文本重复
  • 结论:安全上下文比文件大小更重要

设计取舍

为什么用 Markdown 而非 JSON Schema 定义规则?

规则定义为 Markdown 文件:

  • 优势:LLM 直接理解自然语言,人类也可阅读和编辑
  • 代价:无法用 Schema 自动验证规则的一致性
  • 替代方案:JSON/YAML 结构化规则 + LLM 翻译。ECC 选择 Markdown 因为自然语言指令对 LLM 更有效

Common + Per-Language 两层 vs 单层

ECC 选择两层规则架构:

  • 优势:Common 层保持一致性,Language 层允许特化
  • 代价:需要维护两套文件,安装时需要正确组合
  • 替代方案:单层 + 所有规则混在一起。ECC 认为两层更清晰,且支持按需安装

参考来源

  • 源码验证: rules/ 目录结构 — Common + Per-Language 分层
  • 源码验证: rules/common/ 中 10 个通用规则文件
  • 源码验证: rules/typescript/, rules/python/ 等 12 种语言规则
  • 源码验证: AGENTS.md — 五个核心原则
  • 源码验证: .claude/rules/node.md — 项目级规则
  • 系统提示组装策略 — Prompt Defense 基线注入