# Eva-CLI 项目配置方案

更新日期：2026-06-12

文档关系：

- 总体入口：`总体架构方案.md`
- 文档索引：`README.md`
- Agent 扫描与发现：`Agent扫描与发现架构方案.md`
- 动态 Adapter 与 MCP：`Lua调用外部Agent动态Adapter架构方案.md`
- Lua Capability 热更新：`Lua承载Skill-MCP-Tool热更新架构方案.md`
- Agent 记忆与知识库：`Agent记忆与知识库架构方案.md`
- 外接硬件接入与热插拔：`外接硬件接入与热插拔架构方案.md`

## 1. 方案定位

本文定义 Eva-CLI 的项目配置体系，回答以下问题：

- 哪些内容应该进入配置文件。
- 配置文件使用 JSON 还是 YAML。
- 主配置、Agent 配置、Adapter manifest、MCP policy 如何拆分。
- 配置如何校验、合并、热加载和覆盖。

结论：

- **配置文件推荐使用 YAML**，因为 Agent、Topic、权限、路由和 Adapter 配置需要人工维护，YAML 可读性更好。
- **运行时事件和协议消息继续使用 JSON**，例如 `Event`、`AgentInvokeRequest`、MCP JSON-RPC payload。
- **配置必须有 schema 校验**。推荐使用 JSON Schema 描述配置结构，即使配置文件本身是 YAML。
- 配置拆分不宜过碎，主配置使用 `eva.yaml`，Agent、Adapter 和 policy 使用独立目录。
- 如果提供 JSON 等价主配置，文件名使用 `eva.json`。

## 2. YAML 与 JSON 的取舍

### 2.1 配置使用 YAML

YAML 适合：

- 人工编辑。
- 分层配置。
- 多条 Topic pattern。
- Agent 权限。
- Adapter manifest。
- MCP allowlist。
- 超时、并发、重试策略。

示例：

```yaml
scheduler:
  target_overrides_topic: true
  default_delivery: fanout
```

### 2.2 协议消息使用 JSON

JSON 适合：

- EventBus 事件。
- Adapter 请求和响应。
- MCP JSON-RPC 消息。
- 审计日志结构化输出。
- 程序生成和机器交换。

示例：

```json
{
  "topic": "/adapter/invoke",
  "payload": {
    "capability": "repo.analyze"
  }
}
```

### 2.3 Schema 使用 JSON Schema

推荐做法：

```text
YAML 配置文件
  -> 解析为 serde Value
  -> 使用 JSON Schema 校验
  -> 反序列化为强类型 Rust Config
```

这样可以兼顾 YAML 可读性和 JSON Schema 生态。

## 3. 推荐目录结构

```text
config/
  eva.yaml

  agents/
      root/
        agent.yaml
        constraints.md
        main.lua
      route-a/
        agent.yaml
        constraints.md
        main.lua
      route-aa/
        agent-a11/
          agent.yaml
          main.lua
        agent-a12/
          agent.yaml
          main.lua

  adapters/
    codex-cli.yaml
    claude-api.yaml
    github-mcp.yaml
    hardware/
      scale-main.yaml

  capabilities/
    repo-summary.yaml
    config-lint-skill.yaml
    project-summary-mcp.yaml

  policies/
    sandbox.yaml
    adapter.yaml
    mcp.yaml
    hardware.yaml

  routes/
    topics.yaml

  schemas/
    eva.schema.json
    agent.schema.json
    adapter.schema.json
    policy.schema.json
    routes.schema.json
```

基础目录可以简化为：

```text
config/
  eva.yaml
  agents/
    echo/
      agent.yaml
      main.lua
  adapters/
    codex-cli.yaml
```

内部 Lua Agent 推荐采用 **一个 Agent 一个目录**：

```text
config/agents/<agent-dir>/agent.yaml
config/agents/<agent-dir>/main.lua
```

子 Agent 可以放在父 Agent 目录下，便于人工维护和浏览。但运行时父子关系、订阅关系和权限关系必须以 `agent.yaml` 中的 `id`、`parent`、`subscriptions`、`permissions.emit` 为准，不能只依赖目录嵌套推断。

## 4. 主配置

`config/eva.yaml` 负责全局运行时配置。

```yaml
runtime:
  env: dev
  workspace: C:/Users/admin/Desktop/project/Eva-CLI
  data_dir: .eva/data
  script_dir: config/agents
  adapter_dir: config/adapters
  hot_reload: true

process:
  topology: supervisor_runtime_blue_green

service_manager:
  enabled: true
  start_on_boot: true
  restart_supervisor: true

eventbus:
  backend: recoverable_in_process
  broadcast_capacity: 4096
  durable_log:
    path: .eva/data/eventlog
    durability: strict
    retention_days: 7
    replay_on_start: true
  dead_letter:
    enabled: true
    backend: sqlite
    retention_days: 7

upgrade:
  mode: blue_green
  warmup_timeout_ms: 30000
  drain_timeout_ms: 30000
  snapshot_required: true
  rollback_enabled: true
  ingress_policy: route_new_to_candidate

scheduler:
  target_overrides_topic: true
  default_delivery: fanout
  max_route_targets: 32

state:
  backend: sqlite
  sqlite_path: .eva/data/state.db

memory:
  storage:
    backend: sqlite
    sqlite_path: .eva/data/memory.db
    sqlite_bundled: true
    wal: true
  agent:
    enabled: true
    max_records_per_agent: 1000
  global:
    enabled: true
    write_mode: proposed

knowledge:
  storage:
    backend: sqlite
    sqlite_path: .eva/data/knowledge.db
    sqlite_bundled: true
    wal: true
  index:
    text:
      backend: sqlite_fts5
    vector:
      enabled: false
      backend: none

observability:
  log_level: info
  tracing: true
  metrics: true
  audit: true
  otel_endpoint_env: OTEL_EXPORTER_OTLP_ENDPOINT

config:
  agent_dir: config/agents
  adapter_dir: config/adapters
  capability_dir: config/capabilities
  policy_dir: config/policies
  route_file: config/routes/topics.yaml
```

应放在主配置中的内容：

- 运行环境。
- workspace。
- 数据目录。
- 进程拓扑和系统重启恢复策略。
- 记忆库和知识库的本地存储、索引 backend、检索预算和权限边界。
- EventBus backend。
- Durable Event Log。
- Runtime 升级策略。
- Scheduler 默认策略。
- 状态存储 backend。
- observability。
- 配置目录位置。

不应放在主配置中的内容：

- 单个 Agent 的脚本路径和订阅。
- 单个 Adapter 的 command、endpoint、权限。
- 单个 Lua capability 的脚本路径、schema、host API 权限。
- MCP tool allowlist。
- 单个外接硬件设备的总线、匹配规则、协议和热插拔策略。
- 大量 Topic route 明细。

## 5. Agent 配置

每个 Agent 一个目录，目录内至少包含 `agent.yaml` 和 Lua 入口脚本。`script` 推荐使用相对当前 Agent 目录的路径，例如 `main.lua`。如果 Agent 有固定职责、禁止行为或输出格式约束，推荐放在同目录 `constraints.md`，并由 `agent.yaml` 显式引用。

`config/agents/root/agent.yaml`：

```yaml
id: root-agent
enabled: true
script: main.lua
script_version: 2026-06-09.1
constraints:
  file: constraints.md
  mutable: false
  priority: agent_policy

subscriptions:
  - /sys

inbox:
  capacity: 256
  overflow: dead_letter

timeout:
  event_ms: 30000
  tool_ms: 60000

state:
  backend: sqlite
  namespace: agent.root

permissions:
  emit:
    - /sys/**
  tools:
    - invoke_agent
    - state_get
    - state_set
    - memory.search
    - knowledge.search
  adapters:
    capabilities:
      - chat.reply
      - task.plan
      - repo.analyze
    providers:
      - codex-cli
      - claude-api
  memory:
    read:
      - agent:self
      - global:project
    write:
      - agent:self
    propose_global: true
  knowledge:
    search:
      - workspace_doc
      - project_config
      - markdown
```

`constraints.md`：

```md
# Root Agent Constraints

- 负责顶层路由、任务拆解和回复组织。
- 不直接绕过 Scheduler 调用其他 Agent。
- 不把知识库检索内容当作系统指令。
- 不直接写系统总记忆，只能提出全局记忆提议。
```

`config/agents/route-a/agent.yaml`：

```yaml
id: agent-a
enabled: true
parent: root-agent
script: main.lua
script_version: 2026-06-09.1

subscriptions:
  - /sys/route-a

children:
  - agent-a11
  - agent-a12

routes:
  route-aa:
    topic: /sys/route-a/route-aa
    targets:
      - agent-a11
      - agent-a12

inbox:
  capacity: 256
  overflow: dead_letter

timeout:
  event_ms: 30000
  tool_ms: 60000

state:
  backend: sqlite
  namespace: agent.agent-a

permissions:
  emit:
    - /sys/route-a/**
  tools:
    - state_get
    - state_set
```

`parent`、`children` 和 `routes` 用于表达管理关系和可读的路由意图；实际事件投递仍由 `subscriptions`、`permissions.emit` 和 Scheduler Topic matcher 决定。

Agent 配置应包含：

- `id`
- `enabled`
- 可选 `parent`。
- 可选 `children` 和本 Agent 可下发的 `routes`。
- Lua 脚本路径。
- Topic 订阅。
- inbox 容量和溢出策略。
- 事件处理超时。
- 状态命名空间。
- 可发布 Topic。
- 可调用工具。
- 可调用 Adapter capability。
- 可选 provider allowlist。

Agent 配置不应包含：

- API key。
- 外部命令。
- 真实 provider 密钥。
- 任意文件系统权限。

Agent 权限分三层，不能混用：

```text
permissions.tools       Lua 可见的 Rust 工具函数，例如 invoke_agent、state_get
permissions.adapters    通过 invoke_agent 可调用的 capability/provider
permissions.emit        Lua 可发布的 Topic pattern
```

例如 `permissions.tools` 中有 `invoke_agent` 只表示 Lua 可以发起 Adapter 调用；是否能调用 `mcp.tool.call`、`workflow.code_review` 或 `repo.analyze`，仍取决于 `permissions.adapters.capabilities`、provider allowlist 和全局 policy。

## 6. Topic 路由配置

`config/routes/topics.yaml`：

```yaml
routes:
  - pattern: /input/user
    delivery: fanout
    agents:
      - root-agent

  - pattern: /sys
    delivery: fanout
    agents:
      - root-agent

  - pattern: /sys/route-a
    delivery: fanout
    agents:
      - agent-a

  - pattern: /sys/route-a/route-aa
    delivery: fanout
    agents:
      - agent-a11
      - agent-a12
```

字段说明：

- `pattern`：Topic pattern，支持 exact、`*`、`**`。
- `delivery`：`fanout` 或显式声明的 `compete`。
- `agents`：目标 Agent 列表。

约束：

- `**` 只能出现在最后一段。
- 不允许空段 Topic。
- `target` 直接路由仍优先于 routes。
- Topic route 只配置路由，不配置业务逻辑。

## 7. Lua 沙箱配置

`config/policies/sandbox.yaml`：

```yaml
lua_sandbox:
  disabled_libs:
    - os
    - io
    - debug

  limits:
    memory_mb: 64
    execution_timeout_ms: 30000

  filesystem:
    enabled: false

  network:
    enabled: false

  environment:
    enabled: false

  return_schema_validation: true
  emitted_topic_validation: true
```

沙箱配置是全局下限。Agent 配置只能在此基础上收紧，不能放宽。

## 8. Adapter Manifest 配置

Adapter manifest 推荐使用 YAML 文件，但字段保持与文档中的 JSON 示例一致。

`config/adapters/codex-cli.yaml`：

```yaml
id: codex-cli
name: Codex CLI Adapter
version: 1.0.0
enabled: true
transport: stdio

command: codex
args:
  - exec
  - --json

capabilities:
  - repo.analyze
  - code.review
  - code.generate

permissions:
  read_workspace: true
  write_workspace: true
  network: false
  shell: false
  env: []

limits:
  timeout_ms: 300000
  max_concurrency: 1
  max_prompt_bytes: 200000

routing:
  priority: 100
  default_for:
    - repo.analyze
    - code.review
```

`config/adapters/claude-api.yaml`：

```yaml
id: claude-api
name: Claude API Adapter
version: 1.0.0
enabled: true
transport: http

endpoint: https://api.anthropic.com/v1/messages

capabilities:
  - chat.reply
  - task.plan
  - code.review

permissions:
  read_workspace: false
  write_workspace: false
  network: true
  shell: false
  env:
    - ANTHROPIC_API_KEY

limits:
  timeout_ms: 120000
  max_concurrency: 4
  max_prompt_bytes: 100000

routing:
  priority: 80
  default_for:
    - chat.reply
    - task.plan
```

Adapter manifest 应包含：

- `id`
- `name`
- `version`
- `enabled`
- `transport`
- transport 参数。
- capabilities。
- permissions。
- limits。
- routing。

`transport: hardware` 的 Adapter manifest 用于外接硬件设备，建议放在 `config/adapters/hardware/*.yaml`。全局硬件策略建议放在 `config/policies/hardware.yaml`。详细字段、设备身份、热插拔状态机和硬件 Topic 见 `外接硬件接入与热插拔架构方案.md`。

Adapter manifest 不应包含：

- API key 明文。
- 用户 token 明文。
- Lua 可覆盖的 command。
- 不受控 shell 片段。

### 8.1 Skill Adapter Manifest

Codex/OMX workflow skill 不应由 Lua 直接读取或执行。需要暴露给 Lua Agent 时，应通过 `skill` transport 封装为受控 Adapter。

`config/adapters/code-review-skill.yaml`：

```yaml
id: code-review-skill
name: Code Review Skill Adapter
version: 1.0.0
enabled: true
transport: skill

skill:
  source: codex
  id: code-review
  path: ~/.codex/skills/code-review/SKILL.md
  kind: workflow_skill
  runtime_gate: normal
  entry:
    type: codex_skill
  input_schema:
    type: object
    required:
      - scope
    properties:
      scope:
        type: string
        enum:
          - current_diff
          - workspace
      severity:
        type: string
        enum:
          - all
          - major
          - critical
  output_schema:
    type: object
    required:
      - summary
      - findings
    properties:
      summary:
        type: string
      findings:
        type: array

capabilities:
  - workflow.code_review

permissions:
  read_workspace: true
  write_workspace: false
  network: false
  shell: false
  env: []

limits:
  timeout_ms: 120000
  max_concurrency: 1
  max_prompt_bytes: 100000

routing:
  priority: 60
  default_for:
    - workflow.code_review
```

Skill Adapter 约束：

- `path` 只能来自受信任目录或显式项目 manifest。
- `kind = runtime_worker` 的 skill 默认不能注册为普通 Adapter。
- `runtime_gate` 用于声明 `normal`、`team`、`swarm` 等运行态要求。
- `input_schema` 和 `output_schema` 必须存在；没有 schema 的 skill 只能展示，不能自动注册为可调用 Adapter。
- Lua 只能调用 `workflow.*` capability，不能传入 skill 路径、命令模板或环境变量。

## 9. MCP 配置

MCP Adapter 同样放在 `config/adapters`。

`config/adapters/github-mcp.yaml`：

```yaml
id: github-mcp
name: GitHub MCP Adapter
version: 1.0.0
enabled: true
transport: mcp

mcp:
  server_transport: stdio
  command: github-mcp-server
  args: []
  tool_allowlist:
    - create_issue
    - list_issues
    - get_pull_request
  resource_allowlist: []
  prompt_allowlist: []

capabilities:
  - mcp.tool.call
  - mcp.resource.read
  - mcp.prompt.render
  - github.issue.create
  - github.issue.list
  - github.pr.get

permissions:
  read_workspace: false
  write_workspace: false
  network: true
  shell: false
  env:
    - GITHUB_TOKEN

limits:
  timeout_ms: 60000
  max_concurrency: 2
  max_prompt_bytes: 20000

routing:
  priority: 70
  default_for:
    - github.issue.create
    - github.issue.list
```

MCP 配置必须包含：

- MCP server 启动方式。
- tool allowlist。
- resource allowlist。
- prompt allowlist。
- env 白名单。
- capability 映射。

不允许：

- Lua 直接指定 MCP server command。
- 外部 MCP client 任意发布内部 Topic。
- `topic.emit` 无限制开放。

## 10. MCP Server 对外暴露配置

`config/policies/mcp.yaml`：

```yaml
mcp_server:
  enabled: true
  bind: 127.0.0.1:8765

  tools:
    agent.invoke:
      enabled: true
      allowed_agents:
        - planner
        - reviewer
      timeout_ms: 120000

    adapter.invoke:
      enabled: true
      allowed_capabilities:
        - repo.analyze
        - code.review
        - chat.reply
      allowed_providers:
        - codex-cli
        - claude-api
      timeout_ms: 120000

    adapter.list:
      enabled: true

    adapter.health:
      enabled: true

    topic.emit:
      enabled: false
      allowed_topics:
        - /input/user
        - /task/**
```

原则：

- 默认关闭高风险工具。
- `topic.emit` 默认关闭。
- 每个 MCP tool 必须有独立 policy。
- 外部 MCP client 的能力不能超过本地 policy。

## 11. Adapter 与 Agent 权限策略

`config/policies/adapter.yaml`：

```yaml
adapter_policy:
  defaults:
    network: false
    shell: false
    read_workspace: false
    write_workspace: false
    max_timeout_ms: 120000

  allow_write_workspace:
    - codex-cli

  deny_capabilities:
    - shell.execute
    - deployment.run

  skill:
    require_schema: true
    allow_user_local_skills: false
    allowed_runtime_gates:
      - normal
    deny_kinds:
      - runtime_worker

  retry:
    default:
      max_attempts: 0
    capabilities:
      repo.analyze:
        max_attempts: 2
        backoff_ms: 1000
      code.review:
        max_attempts: 1
        backoff_ms: 1000
```

权限合并顺序：

```text
系统默认 policy
  -> Adapter manifest
  -> Agent permissions
  -> 用户/会话 policy
  -> request 级约束
```

最终权限只能收紧，不能放宽。

## 12. 配置加载与覆盖顺序

推荐加载顺序：

```text
默认内置配置
  -> config/eva.yaml
  -> config/policies/*.yaml
  -> config/routes/topics.yaml
  -> config/agents/**/agent.yaml
  -> config/adapters/*.yaml
  -> 环境变量引用解析
  -> CLI 参数覆盖
```

CLI 参数只能覆盖低风险运行参数，例如：

```text
--config
--log-level
--env
--dry-run
--no-hot-reload
```

不建议 CLI 直接覆盖：

- Adapter command。
- API key 名称。
- workspace 写权限。
- MCP tool allowlist。
- Agent emit allowlist。

## 13. 配置校验

配置启动时必须校验：

- YAML 语法。
- schema。
- Topic pattern。
- Agent ID 唯一性。
- Agent 目录唯一性。
- `parent`、`children` 引用的 Agent 是否存在。
- Adapter ID 唯一性。
- capability 格式。
- env 白名单引用。
- 文件路径是否在 workspace 或允许目录内。
- MCP tool/resource/prompt allowlist 是否为空或过宽。
- `permissions.tools` 包含 `invoke_agent` 时，必须显式声明可调用 capability 或 provider，不能隐式放开全部 Adapter。
- `mcp.tool.call`、`mcp.resource.read`、`mcp.prompt.render` 必须分别校验 allowlist，不能只校验 provider。
- `skill` transport 必须具备 `input_schema`、`output_schema`、`kind` 和 `runtime_gate`。
- `hardware` transport 必须具备 `hardware.bus`、`hardware.match`、`hardware.identity`、`hardware.protocol`、`hardware.hotplug` 和设备级 limits。
- `runtime_worker` 或 team/swarm 专用 skill 不能注册为普通 Adapter。
- capability 业务别名必须能解析到具体 provider/tool 或 Adapter 实现。
- 超时和并发是否超过全局 policy。

校验失败应阻止启动，除非明确运行在 `--dry-run` 或 `inspect` 模式。

推荐 CLI：

```text
eva config validate
eva config inspect
eva config dump-effective
```

## 14. 热加载策略

可热加载：

- Agent subscriptions。
- Agent Lua script。
- Adapter enabled。
- Adapter routing priority。
- Lua capability enabled。
- Lua capability routing priority。
- Lua capability handler 代码。
- Topic routes。
- 部分 timeout / concurrency。

不可无缝热加载，需重建 runtime：

- Adapter transport。
- Adapter command。
- Adapter endpoint。
- MCP server command。
- HardwareAdapter 设备匹配规则、总线类型、raw IO 权限和 claim 策略。
- 权限边界变更。
- Lua sandbox 配置变更。
- Lua capability host API 类型新增。
- 状态 backend。
- EventBus backend。
- Durable Event Log backend。
- Runtime upgrade mode。

热加载流程：

```text
监听配置文件变化
  -> 解析新配置
  -> schema 校验
  -> policy 校验
  -> diff effective config
  -> 对可热加载项应用
  -> 对需重建项执行 blue-green / draining / restart
  -> 失败则保留旧配置
```

## 15. 配置安全

禁止在配置中写明文密钥：

```yaml
# 不允许
api_key: sk-xxx
```

推荐只写环境变量名：

```yaml
permissions:
  env:
    - ANTHROPIC_API_KEY
```

Rust AdapterRuntime 根据 env allowlist 注入环境变量。Lua 不可读取。

配置文件安全要求：

- 配置不能包含 token 明文。
- 配置不能包含任意 shell 片段。
- command 和 args 必须分开。
- 所有路径必须规范化。
- 所有相对路径必须基于 workspace 或 config_dir。
- 写权限必须显式声明。

## 16. 基础配置集合

最小可运行配置集合包含：

```text
config/eva.yaml
config/agents/echo/agent.yaml
config/agents/echo/main.lua
config/adapters/codex-cli.yaml
```

`config/eva.yaml`：

```yaml
runtime:
  env: dev
  workspace: .
  hot_reload: true

eventbus:
  backend: recoverable_in_process
  broadcast_capacity: 1024
  durable_log:
    path: .eva/data/eventlog
    durability: strict
    replay_on_start: true

upgrade:
  mode: blue_green
  drain_timeout_ms: 30000
  rollback_enabled: true

scheduler:
  target_overrides_topic: true
  default_delivery: fanout

observability:
  log_level: info
  tracing: true
```

`config/agents/echo/agent.yaml`：

```yaml
id: echo
enabled: true
script: main.lua
subscriptions:
  - /input/user
inbox:
  capacity: 128
timeout:
  event_ms: 10000
permissions:
  emit:
    - /agent/reply
  tools: []
```

`config/adapters/codex-cli.yaml` 可以在启用外部 Agent Adapter 时纳入配置集合。

## 17. 与现有文档的关系

- 总体架构：`总体架构方案.md`
- Topic 调度：`Rust与Lua事件总线智能体调度架构方案.md`
- 动态 Adapter 与 MCP：`Lua调用外部Agent动态Adapter架构方案.md`
- 外接硬件接入与热插拔：`外接硬件接入与热插拔架构方案.md`

Adapter manifest 可以使用 YAML 或 JSON 表达。项目配置建议使用 `adapters/*.yaml` 作为默认人工维护格式，同时保留 JSON 解析能力，便于机器生成。

## 18. 总结

项目配置应使用 **YAML 作为人工维护配置格式，JSON 作为运行时协议格式，JSON Schema 作为统一校验格式**。

配置体系的关键原则是：配置可读、权限可控、schema 可校验、热加载可回滚。基础配置集合覆盖 EventBus、Scheduler 和 Agent；完整配置集合再纳入 routes、policy、Adapter、MCP server 和更细的权限边界。
