Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 4 additions & 33 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,45 +33,16 @@ Coding Code 是 AI 编程助手。
- `rules`:全局 / 项目级规则装载
- `server`:HTTP / SSE 入口
- `client`:HTTP 客户端(`AgentClient` 的实现)
- `core`:通用件(`error` / `result` / `path`),不指向任何功能模块
- `contracts`:跨领域共享契约
- `core`:通用件(`error` / `result` / `path`:路径归一化与工作区数据目录),不指向任何功能模块
- 类型归属:类型跟拥有者走——仅本模块用的进本模块 `types.ts`;跨模块一律 `import type` 指向对方的 `types.ts`
- `layer.ts`:组合根,全量装配

## 架构要求

**依赖倒置**:所有非叶子模块利用 `port.ts`(宽契约;agent 自持的装配端口也在 `agent/port.ts`)声明自己需要的接口和类型定义,使调用者不需要依赖实现方;只允许依赖下层模块。

**分层与允许依赖**:

| 层 | 落点 | 允许依赖 |
|---|---|---|
| L0 通用件 | `core/` | node 内置 + 同目录 |
| L1 共享契约 | `contracts/` | `core/` + 同目录 + 第三方(type-only) |
| L1' 端口契约 | 各 `xxx/port.ts`(含 `agent/port.ts` 的装配端口) | `core/` + `contracts/` |
| L2 实现 | `tools/`、`hooks/`、`session/`、`approval/`、`llm/`、`mcp/`、`context/` … | L0 + L1 |
| L3 组合根 | `layer.ts`、`agent/tool-env.ts` | 全部 |

**架构边界硬规则**(由 `packages/codingcode/test/architecture/boundaries.test.ts` 静态断言,共 29 项):

- **R1** 契约不得 import 实现:`contracts/` 与 `**/port.ts` 的相对 import 只能落在 `core/`、`contracts/` 或同目录
- **R2** 实现不得依赖消费者模块:agent 自持的装配端口 `ToolEnvPort` 只在 `agent/` 内部出现
- **R3** `core/` 零内部依赖:不引用 `core/` 之外的任何 src 模块
- **R4** 一个概念只允许一处类型定义,canonical 落点为 `contracts/`
- **准入**:`core/` 的 import 只能是 node 内置与同目录;`contracts/` 只引用 `core/`、同目录与第三方
- **可解析**:`src/**` 的每条相对 import 都必须能在仓库内找到落点

**类型落点判据**(先判归属,再判引用面):

- 判据一 —— 有无领域归属:不指向任何功能模块的(错误基类、结果容器、路径运算)→ `core/`;指向某功能模块的 → 判据二
- 判据二 —— 引用面,**只作用于领域件**:仅 1 个 src 领域引用 → 回该领域**已有**的归属文件;只出现在某调用方接口签名里 → 内联进调用方;≥2 个 src 领域,或 ≥1 个跨包 → `contracts/`

**机制形状例外**:`z.ZodTypeAny`、SDK client、Effect 的 R 通道类型必须留在叶子模块,不得进 `contracts/`。契约只暴露窄的纯数据描述——MCP 契约返回 `McpToolSpec`,`z.fromJSONSchema` 的转换由拥有机制的 `tools/catalog.ts` 自己做。

## 开发规则

- 禁止用户当前轮未明确要求就主动修改仓库中任何内容,包括源代码、配置文件、文档等
- 禁止用户当前轮未明确要求就主动进行 reset、commit、push 等相关会影响 git 历史或者当前仓库代码的操作,仅用户显式要求进行某类操作才能进行;仅允许 `git diff`、`git log` 等无副作用的操作可以自主进行
- 禁止未在用户指示下补充测试,当开发任务完成后,给用户报告完成程度,由用户决定针对哪些部分写测试
- 禁止只是修改代码格式的无效修改,污染diff内容
- 禁止将工具执行细节泄漏到 agent 编排层及其他模块,agent 只依赖端口契约,不得 import 工具实现
- 禁止将传输协议细节(HTTP / SSE)泄漏到 agent 核心及其他模块,agent 不得依赖 `server/`、`client/`
- 不允许假设“这是未来需要扩展的”,所以现在就不做,应该贴合用户的实际要求
Expand Down Expand Up @@ -99,7 +70,7 @@ Coding Code 是 AI 编程助手。
3. 存在性 / 导出断言——断言文件存在、类 / 函数 / layer 已导出、方法存在。真断裂时编译与上层用例会同时失败,此类用例不提供额外信息。
4. 常量钉死——断言常量等于它自身的字面量。需要守护的是行为,不是常量的副本。
5. 测试内重新实现逻辑——在测试里重写一遍待测算法再断言自己写的副本,只证明写法一致,发现不了实现缺陷。
6. 源码文本 / 结构扫描——用字符串或正则解析源码断言导入、布局或写法。这属于静态分析:类型与导入可解析性由 `tsc` 保证,无需重复;架构分层等 `tsc` 无法表达的约束,改用 ESLint 规则或 AST 解析,而不是正则匹配源码文本(现有 `test/architecture/boundaries.test.ts`、`test/hooks/points-coverage.test.ts` 应按此方向迁移)。
6. 源码文本 / 结构扫描——用字符串或正则解析源码断言导入、布局或写法。这属于静态分析:类型与导入可解析性由 `tsc` 保证,无需重复;架构分层等 `tsc` 无法表达的约束,改用 ESLint 规则或 AST 解析(`test/architecture/boundaries.test.ts`、`test/hooks/points-coverage.test.ts` 已按此实现)。
7. 占位 / 恒真断言——`expect(true).toBe(true)`、只 `toBeDefined()` 不校验值、以及无论如何都会通过的断言。
8. 重复用例——与已有用例覆盖同一行为的副本;发现重复应合并,不要并存。

Expand Down
37 changes: 4 additions & 33 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,46 +33,17 @@ Coding Code 是 AI 编程助手。
- `rules`:全局 / 项目级规则装载
- `server`:HTTP / SSE 入口
- `client`:HTTP 客户端(`AgentClient` 的实现)
- `core`:通用件(`error` / `result` / `path`),不指向任何功能模块
- `contracts`:跨领域共享契约
- `core`:通用件(`error` / `result` / `path`:路径归一化与工作区数据目录),不指向任何功能模块
- 类型归属:类型跟拥有者走——仅本模块用的进本模块 `types.ts`;跨模块一律 `import type` 指向对方的 `types.ts`
- `layer.ts`:组合根,全量装配

## 架构要求

**依赖倒置**:所有非叶子模块利用 `port.ts`(宽契约;agent 自持的装配端口也在 `agent/port.ts`)声明自己需要的接口和类型定义,使调用者不需要依赖实现方;只允许依赖下层模块。

**分层与允许依赖**:

| 层 | 落点 | 允许依赖 |
|---|---|---|
| L0 通用件 | `core/` | node 内置 + 同目录 |
| L1 共享契约 | `contracts/` | `core/` + 同目录 + 第三方(type-only) |
| L1' 端口契约 | 各 `xxx/port.ts`(含 `agent/port.ts` 的装配端口) | `core/` + `contracts/` |
| L2 实现 | `tools/`、`hooks/`、`session/`、`approval/`、`llm/`、`mcp/`、`context/` … | L0 + L1 |
| L3 组合根 | `layer.ts`、`agent/tool-env.ts` | 全部 |

**架构边界硬规则**(由 `packages/codingcode/test/architecture/boundaries.test.ts` 静态断言,共 29 项):

- **R1** 契约不得 import 实现:`contracts/` 与 `**/port.ts` 的相对 import 只能落在 `core/`、`contracts/` 或同目录
- **R2** 实现不得依赖消费者模块:agent 自持的装配端口 `ToolEnvPort` 只在 `agent/` 内部出现
- **R3** `core/` 零内部依赖:不引用 `core/` 之外的任何 src 模块
- **R4** 一个概念只允许一处类型定义,canonical 落点为 `contracts/`
- **准入**:`core/` 的 import 只能是 node 内置与同目录;`contracts/` 只引用 `core/`、同目录与第三方
- **可解析**:`src/**` 的每条相对 import 都必须能在仓库内找到落点

**类型落点判据**(先判归属,再判引用面):

- 判据一 —— 有无领域归属:不指向任何功能模块的(错误基类、结果容器、路径运算)→ `core/`;指向某功能模块的 → 判据二
- 判据二 —— 引用面,**只作用于领域件**:仅 1 个 src 领域引用 → 回该领域**已有**的归属文件;只出现在某调用方接口签名里 → 内联进调用方;≥2 个 src 领域,或 ≥1 个跨包 → `contracts/`

**机制形状例外**:`z.ZodTypeAny`、SDK client、Effect 的 R 通道类型必须留在叶子模块,不得进 `contracts/`。契约只暴露窄的纯数据描述——MCP 契约返回 `McpToolSpec`,`z.fromJSONSchema` 的转换由拥有机制的 `tools/catalog.ts` 自己做。

## 开发规则

- 禁止用户当前轮未明确要求就主动修改仓库中任何内容,包括源代码、配置文件、文档等
- 禁止用户当前轮未明确要求就主动进行 reset、commit、push 等相关会影响 git 历史或者当前仓库代码的操作,仅用户显式要求进行某类操作才能进行;仅允许 `git diff`、`git log` 等无副作用的操作可以自主进行
- 禁止未在用户指示下补充测试,当开发任务完成后,给用户报告完成程度,由用户决定针对哪些部分写测试
- 禁止将工具执行细节泄漏到 agent 编排层及其他模块,agent 只依赖端口契约,不得 import 工具实现
- 禁止只是修改代码格式的无效修改,污染diff内容
- 禁止将传输协议细节(HTTP / SSE)泄漏到 agent 核心及其他模块,agent 不得依赖 `server/`、`client/`
- 不允许假设“这是未来需要扩展的”,所以现在就不做,应该贴合用户的实际要求
- 不允许总是有阶段性计划,分阶段完成很容易导致过程产生一堆没用的死代码
Expand All @@ -99,7 +70,7 @@ Coding Code 是 AI 编程助手。
3. 存在性 / 导出断言——断言文件存在、类 / 函数 / layer 已导出、方法存在。真断裂时编译与上层用例会同时失败,此类用例不提供额外信息。
4. 常量钉死——断言常量等于它自身的字面量。需要守护的是行为,不是常量的副本。
5. 测试内重新实现逻辑——在测试里重写一遍待测算法再断言自己写的副本,只证明写法一致,发现不了实现缺陷。
6. 源码文本 / 结构扫描——用字符串或正则解析源码断言导入、布局或写法。这属于静态分析:类型与导入可解析性由 `tsc` 保证,无需重复;架构分层等 `tsc` 无法表达的约束,改用 ESLint 规则或 AST 解析,而不是正则匹配源码文本(现有 `test/architecture/boundaries.test.ts`、`test/hooks/points-coverage.test.ts` 应按此方向迁移)。
6. 源码文本 / 结构扫描——用字符串或正则解析源码断言导入、布局或写法。这属于静态分析:类型与导入可解析性由 `tsc` 保证,无需重复;架构分层等 `tsc` 无法表达的约束,改用 ESLint 规则或 AST 解析(`test/architecture/boundaries.test.ts`、`test/hooks/points-coverage.test.ts` 已按此实现)。
7. 占位 / 恒真断言——`expect(true).toBe(true)`、只 `toBeDefined()` 不校验值、以及无论如何都会通过的断言。
8. 重复用例——与已有用例覆盖同一行为的副本;发现重复应合并,不要并存。

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ for await (const frame of clients.agent.sendMessage('帮我写一个快排', {
| 运行时 | Node.js (tsx) |
| DI / 错误追踪 | Effect TS 3.x |
| LLM SDK | Vercel AI SDK v6 + @ai-sdk/deepseek + @ai-sdk/openai |
| HTTP 框架 | Hono 4.x |
| HTTP 框架 | @effect/platform(HttpRouter + NodeHttpServer) |
| Desktop | Electron 35 + React 19 + Zustand 5 |
| MCP | @modelcontextprotocol/sdk 1.29.x |
| 校验 | Zod 4.x |
Expand Down
6 changes: 2 additions & 4 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@ Coding Code 的核心哲学是所有行为都可配置。本文档详细介绍
### 完整配置项

```yaml
server:
port: 8080 # HTTP 服务端口

maxSteps: 200 # Agent 最大步数
maxStopContinuations: 2 # 最大停止续行次数

Expand All @@ -47,7 +44,6 @@ memory:

| 字段 | 默认值 | 说明 |
|------|--------|------|
| `server.port` | `8080` | HTTP 服务监听端口 |
| `maxSteps` | `200` | 单次 Agent 执行的最大步数限制 |
| `maxStopContinuations` | `2` | Agent 停止后最大续行次数 |
| `activeModel` | 无(可选) | 覆盖 models.json 中的默认模型,不设置则使用 models.json 配置 |
Expand All @@ -56,6 +52,8 @@ memory:
| `memory.model` | `''` | 记忆提取使用的模型,空字符串回退到主模型 |
| `memory.promptMaxBytes` | `8192` | 注入 system prompt 的记忆内容最大字节数 |

> **HTTP 端口不可配置**。服务启动时监听端口 `0`,由操作系统原子地分配一个空闲端口,避免多实例或“先探测再绑定”之间的竞态。实际端口通过 stdout 的 `CODINGCODE_SERVER_READY:<port>` 上报给拉起方(Desktop、SDK 等)。

---

## models.json
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@
"dependencies": {
"@ai-sdk/deepseek": "^2.0.35",
"@ai-sdk/openai": "^3.0.63",
"@hono/node-server": "^2.0.2",
"@effect/platform": "^0.96.0",
"@effect/platform-node": "^0.96.0",
"@modelcontextprotocol/sdk": "^1.29.0",
"@types/react": "^19.2.14",
"ai": "^6.0.180",
"effect": "^3.21.2",
"globby": "^14.1.0",
"hono": "^4.12.19",
"pino": "^9.6.0",
"pino-pretty": "^13.0.0",
"react": "^19.2.6",
Expand Down
24 changes: 10 additions & 14 deletions packages/codingcode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,15 @@
"./server": "./src/server/index.ts",
"./approval/types": "./src/approval/types.ts",
"./agent/profile": "./src/agent/profile.ts",
"./contracts/frame": "./src/contracts/frame.ts",
"./contracts/frame-io": "./src/contracts/frame-io.ts",
"./sink/types": "./src/sink/types.ts",
"./llm/types": "./src/llm/types.ts",
"./todo/types": "./src/todo/types.ts",
"./session/types": "./src/session/types.ts",
"./mcp/types": "./src/mcp/types.ts",
"./scheduler/types": "./src/scheduler/types.ts",
"./skills/types": "./src/skills/types.ts",
"./tools/types": "./src/tools/types.ts",
"./core/error": "./src/core/error.ts",
"./contracts/error": "./src/contracts/error.ts",
"./contracts/types": "./src/contracts/types.ts",
"./contracts/permission": "./src/contracts/permission.ts",
"./contracts/profile": "./src/contracts/profile.ts",
"./contracts/hooks": "./src/contracts/hooks.ts",
"./contracts/session": "./src/contracts/session.ts",
"./contracts/provider": "./src/contracts/provider.ts",
"./contracts/mcp": "./src/contracts/mcp.ts",
"./contracts/automation": "./src/contracts/automation.ts",
"./contracts/skill": "./src/contracts/skill.ts",
"./contracts/tool": "./src/contracts/tool.ts",
"./checkpoint/types": "./src/checkpoint/types.ts",
"./session/port": "./src/session/port.ts",
"./hooks/types": "./src/hooks/types.ts"
Expand All @@ -34,10 +29,11 @@
"@ai-sdk/openai": "^3.0.63",
"@ai-sdk/provider": "^3.0.0",
"@ai-sdk/provider-utils": "^4.0.0",
"@effect/platform": "0.96.0",
"@effect/platform-node": "0.96.0",
"ai": "^6.0.180",
"cron": "^3.5.0",
"effect": "^3.21.2",
"hono": "^4.12.19",
"pino": "^9.6.0",
"pino-pretty": "^13.0.0",
"yaml": "^2.9.0",
Expand Down
Loading
Loading