Skip to content

Commit 91d0218

Browse files
authored
Merge pull request #114 from phantom5099/refactor-arch
初步重构
2 parents 294ea76 + cc38cf9 commit 91d0218

263 files changed

Lines changed: 6425 additions & 13380 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/pr-check.yml‎

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ jobs:
2626
- 'packages/**'
2727
- 'package.json'
2828
- 'pnpm-lock.yaml'
29+
- 'pnpm-workspace.yaml'
2930
- 'tsconfig*.json'
3031
- 'vitest.config.ts'
3132
- 'eslint.config.mjs'
@@ -37,12 +38,14 @@ jobs:
3738
runs-on: ubuntu-latest
3839
steps:
3940
- uses: actions/checkout@v4
40-
- uses: pnpm/action-setup@v3
41+
- uses: pnpm/action-setup@v4
42+
with:
43+
version: 11.3.0
4144
- uses: actions/setup-node@v4
4245
with:
4346
node-version: '22'
4447
cache: 'pnpm'
45-
- run: pnpm install
48+
- run: pnpm install --frozen-lockfile
4649
- run: pnpm run lint
4750

4851
typecheck:
@@ -51,12 +54,14 @@ jobs:
5154
runs-on: ubuntu-latest
5255
steps:
5356
- uses: actions/checkout@v4
54-
- uses: pnpm/action-setup@v3
57+
- uses: pnpm/action-setup@v4
58+
with:
59+
version: 11.3.0
5560
- uses: actions/setup-node@v4
5661
with:
5762
node-version: '22'
5863
cache: 'pnpm'
59-
- run: pnpm install
64+
- run: pnpm install --frozen-lockfile
6065
- run: pnpm run typecheck
6166

6267
test:
@@ -65,12 +70,14 @@ jobs:
6570
runs-on: ubuntu-latest
6671
steps:
6772
- uses: actions/checkout@v4
68-
- uses: pnpm/action-setup@v3
73+
- uses: pnpm/action-setup@v4
74+
with:
75+
version: 11.3.0
6976
- uses: actions/setup-node@v4
7077
with:
7178
node-version: '22'
7279
cache: 'pnpm'
73-
- run: pnpm install
80+
- run: pnpm install --frozen-lockfile
7481
- run: pnpm vitest run
7582

7683
build-desktop:
@@ -79,10 +86,12 @@ jobs:
7986
runs-on: ubuntu-latest
8087
steps:
8188
- uses: actions/checkout@v4
82-
- uses: pnpm/action-setup@v3
89+
- uses: pnpm/action-setup@v4
90+
with:
91+
version: 11.3.0
8392
- uses: actions/setup-node@v4
8493
with:
8594
node-version: '22'
8695
cache: 'pnpm'
87-
- run: pnpm install
96+
- run: pnpm install --frozen-lockfile
8897
- run: pnpm --filter @codingcode/desktop run build

‎.github/workflows/release.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ jobs:
2727

2828
- name: Setup pnpm
2929
uses: pnpm/action-setup@v4
30+
with:
31+
version: 11.3.0
3032

3133
- name: Setup Node.js
3234
uses: actions/setup-node@v4

‎.gitignore‎

Lines changed: 0 additions & 53 deletions
This file was deleted.

‎.prettierignore‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ node_modules/
44
package-lock.json
55
pnpm-lock.yaml
66
*.md
7+
vitest-result.json
8+
test-output*.txt

‎.prettierrc‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
"singleQuote": true,
44
"tabWidth": 2,
55
"trailingComma": "es5",
6-
"printWidth": 100
6+
"printWidth": 100,
7+
"endOfLine": "auto"
78
}

‎docs/configuration.md‎

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,7 @@ context:
4040
memory:
4141
enabled: false # 启用长期记忆
4242
model: "" # 记忆提取模型,空字符串回退主模型
43-
maxBytes: 16384 # 记忆文件最大字节数
44-
promptMaxBytes: 8192 # 注入提示的最大字节数
45-
extraTypes: [] # 自定义记忆类型
46-
disabledTypes: [] # 禁用的记忆类型名
43+
promptMaxBytes: 8192 # 注入提示的记忆内容最大字节数
4744
```
4845
4946
### 字段详细说明
@@ -57,26 +54,7 @@ memory:
5754
| `context.compactionModel` | `''` | 上下文压缩使用的模型,空字符串回退到主会话 LLM |
5855
| `memory.enabled` | `false` | 是否启用长期记忆系统 |
5956
| `memory.model` | `''` | 记忆提取使用的模型,空字符串回退到主模型 |
60-
| `memory.maxBytes` | `16384` | 单个记忆文件的最大字节数 |
6157
| `memory.promptMaxBytes` | `8192` | 注入 system prompt 的记忆内容最大字节数 |
62-
| `memory.extraTypes` | `[]` | 自定义记忆类型列表 |
63-
| `memory.disabledTypes` | `[]` | 禁用的内置记忆类型名列表 |
64-
65-
### 自定义记忆类型示例
66-
67-
```yaml
68-
memory:
69-
enabled: true
70-
extraTypes:
71-
- name: feedback
72-
description: 工作流程中的教训和已验证的方法
73-
enabled: true
74-
- name: decision
75-
description: 重要的架构和设计决策
76-
enabled: true
77-
disabledTypes:
78-
- reference
79-
```
8058

8159
---
8260

‎docs/memory.md‎

Lines changed: 39 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,74 @@
11
# 长期记忆系统
22

3-
Coding Code 支持跨会话的长期记忆,自动从对话中提取和存储关键信息。本文档介绍记忆类型、内容分类、自动提取机制和手动编辑方法。
3+
Coding Code 支持跨会话的长期记忆:自动从对话中提取关键信息,并在下一次会话开始时重新注入。本文档介绍记忆文件、自动提取机制和手动编辑方法。
44

55
---
66

7-
## 内存类型
7+
## 记忆文件
88

9-
记忆文件存储在项目的 `.codingcode/memory.md` 中。
9+
记忆存储为单个 Markdown 文件:
1010

11-
---
12-
13-
## 记忆内容
11+
```
12+
.codingcode/memory.md
13+
```
1414

15-
内置三种记忆类型:
15+
**整个文件就是长期记忆**,没有分区、没有标记块。文件的全部内容会作为记忆注入,也会作为"已有记忆"参与下一次提取。
1616

17-
| 类型 | 提取来源 | 内容 |
18-
|------|---------|------|
19-
| `user` | `[user]` 标签的消息 | 用户角色、技能栈、工作偏好及对 Agent 的纠正 |
20-
| `project` | `[user]` + `[assistant]` 消息 | 架构决策、技术选型、部署信息 |
21-
| `reference` | `[user]` + `[tool:*]` 消息 | 外部资源、文档、Dashboard 链接 |
17+
```markdown
18+
### 项目
19+
- 采用 monorepo 架构,使用 pnpm workspaces
20+
- 入口文件:packages/codingcode/src/cli.ts
2221

23-
可通过 `memory.extraTypes` 添加自定义记忆类型,通过 `memory.disabledTypes` 禁用内置类型。
22+
### 用户偏好
23+
- 偏好结构化 Markdown 输出
24+
```
2425

2526
---
2627

2728
## 自动提取
2829

29-
Agent 在每次会话后自动执行记忆提取:
30+
记忆模式开启后,Agent 在会话结束时自动执行记忆更新:
3031

31-
1. 构建 system prompt,包含各记忆类型的提取指引
32-
2. 发送已有记忆 + 会话记录给 LLM
33-
3. LLM 输出 `<memory>...</memory>` 块
34-
4. 提取块内容,返回新记忆文本(null 表示无新内容)
35-
5. 矛盾时新信息替换旧条目,同一会话以最新为准
32+
1. 读取记忆文件全文作为"已有记忆"
33+
2. 将会话记录(按 `[user]` / `[assistant]` / `[tool:名称]` 标注)与已有记忆一起发送给 LLM
34+
3. LLM 输出整份**最新版记忆**,放在 `<memory>...</memory>` 块中
35+
4. 直接用输出内容整体替换记忆文件(受字节上限约束)
3636

37-
提取使用的模型可通过 `memory.model` 配置,留空则回退到主会话模型。
38-
39-
---
37+
模型自行决定更新哪些内容:可以新增条目、修改过时信息、删除不再相关的内容,代码不做"模型只改动哪部分"的任何假设。若模型没有输出有效内容、或输出与当前文件一致,则不写入。
4038

41-
## 记忆文件格式
39+
### 提取提示词
4240

43-
记忆文件使用 Markdown 格式,自动提取内容包裹在标记块中:
41+
提取行为的规范全部写在提示词中,代码不感知记忆内容结构:
4442

45-
```markdown
46-
<!-- auto:begin -->
47-
### user
48-
- 偏好使用函数式编程风格
49-
- 常用技术栈:React + TypeScript
43+
- 只保留值得跨会话记住的信息:用户偏好与纠正、项目架构决策、技术选型、外部资源与链接等
44+
- 忽略一次性任务、调试过程、报错堆栈、闲聊
45+
- 输出必须是一份完整、自洽的最新记忆,而不是只输出变动部分
46+
- 新旧信息矛盾时以最新为准
47+
- 记忆用 `### 主题` 小节组织,小节下用 `- ` 列要点
5048

51-
### project
52-
- 采用 monorepo 架构,使用 pnpm workspaces
53-
- 入口文件:packages/codingcode/src/cli.ts
49+
提取使用的模型可通过 `memory.model` 配置,留空则回退到主会话模型。
5450

55-
### reference
56-
- [API 文档](https://example.com/api)
57-
<!-- auto:end -->
51+
---
5852

59-
手动添加的内容可以写在标记块之外,不会被自动提取覆盖。
60-
```
53+
## 手动编辑
6154

62-
### 标记块机制
55+
记忆文件就是普通 Markdown,用户可以直接编辑:
6356

64-
- `replaceAutoBlock()`:原子替换 `<!-- auto:begin -->` 和 `<!-- auto:end -->` 之间的内容
65-
- `stripMarkersForPrompt()`:去掉标记后注入系统提示
66-
- `enforceMaxBytes()`:按 `### ` 小节逐个裁剪到字节上限(默认 16384 字节)
67-
- `mergeAutoBlocks()`:以 `### ` 小节名为 key 合并,incoming 覆盖 base
57+
- 手动写下的内容会在下次会话时作为记忆注入 Agent
58+
- 手动编辑也会被下一次自动提取作为"已有记忆"读到;保留、修改还是删除由模型根据后续对话自行决定
59+
- 自动提取在写入前会重新检查文件:若提取期间文件被手动改动,则放弃本次写入,避免覆盖用户编辑
6860

6961
---
7062

7163
## 配置
7264

73-
在 `codingcode.yaml` 中配置记忆系统:
74-
75-
```yaml
76-
memory:
77-
enabled: true # 启用长期记忆(默认 false)
78-
model: "" # 记忆提取模型,空字符串回退到主模型
79-
maxBytes: 16384 # 记忆文件最大字节数
80-
promptMaxBytes: 8192 # 注入提示的最大字节数
81-
extraTypes: [] # 自定义记忆类型
82-
disabledTypes: [] # 禁用的记忆类型名
83-
```
84-
85-
### 自定义记忆类型
65+
在 `~/.codingcode/config.yaml` 中配置记忆系统:
8666

8767
```yaml
8868
memory:
89-
enabled: true
90-
extraTypes:
91-
- name: feedback
92-
description: 工作流程中的教训和已验证的方法
93-
enabled: true
94-
- name: decision
95-
description: 重要的架构和设计决策
96-
enabled: true
97-
disabledTypes:
98-
- reference # 禁用内置的 reference 类型
69+
enabled: true # 启用长期记忆(默认 false)
70+
model: "" # 记忆提取模型,空字符串回退到主模型
71+
promptMaxBytes: 8192 # 注入提示词的记忆内容最大字节数
9972
```
10073
101-
---
102-
103-
## 手动编辑
104-
105-
记忆文件采用 Markdown 格式,支持手动编辑。手动内容可写在 `<!-- auto:end -->` 标记之后,不会被自动提取覆盖:
106-
107-
```markdown
108-
<!-- auto:begin -->
109-
### user
110-
- 偏好使用函数式编程风格
111-
<!-- auto:end -->
112-
113-
### 手动备注
114-
- 项目部署流程:npm run build -> scp dist/ -> pm2 restart
115-
- 数据库连接字符串在 Vault 中
116-
```
74+
记忆文件本身有 16KB 的硬上限,超限时按 `### ` 小节从后往前裁掉超出部分。

‎docs/tools.md‎

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,15 @@ interface ToolVisibilityPolicy {
9797

9898
### 审批流水线(始终生效)
9999

100-
六层决策链,按顺序执行,任一层返回 deny/allow 即终止:
100+
五层决策链,按顺序执行,任一层返回 deny/allow 即终止:
101101

102102
| 层级 | 名称 | 逻辑 |
103103
|------|------|------|
104104
| 1 | **RuleEngine** | 规则引擎匹配,支持 glob 模式匹配工具名和参数,按优先级排序 |
105-
| 2 | **ReadonlyWhitelist** | 只读工具自动放行(read_file, search_code, search_files, fetch_url, web_search, dispatch_agent, todo_write) |
106-
| 3 | **PermissionMode** | 权限模式判断:`bypass`(全部放行)、`acceptEdits`(非破坏性工具放行)、`default`(继续下一层)。`plan` Profile 由独立的 `agent/profile.ts` 中的 `planProfileGateHook` 在 Layer 4 强制,不在此层处理 |
107-
| 4 | **HookPreToolUse** | 钩子决策,可返回 allow/deny/ask/continue,支持 `modifiedInput` 修改参数 |
108-
| 5 | **UserConfirmation** | 异步用户确认,支持 allow/deny/always/never 四种响应,always/never 会持久化为规则 |
109-
| 6 | **AuditLog** | 每一层决策后记录审计日志,通过 `tool.approval.post` 钩子发出 |
105+
| 2 | **PermissionMode** | 权限模式驱动的自动放行:`bypass`(全部放行)、`acceptEdits`(非破坏性工具放行,涵盖只读与编辑工具)、`default`(不自动放行,继续下一层)。只读工具不再有无条件的独立白名单层;`plan` Profile 由 `agent/profile.ts` 中的 `planProfileGateHook` 在下一层强制,不在此层处理 |
106+
| 3 | **HookPreToolUse** | 钩子决策,可返回 allow/deny/ask/continue,支持 `modifiedInput` 修改参数 |
107+
| 4 | **UserConfirmation** | 异步用户确认,支持 allow/deny/always/never 四种响应,always/never 会持久化为规则 |
108+
| 5 | **AuditLog** | 每一层决策后记录审计日志,通过 `tool.approval.post` 钩子发出 |
110109

111110
### 预设安全规则
112111

@@ -130,11 +129,13 @@ interface ToolVisibilityPolicy {
130129
type PermissionMode = 'default' | 'acceptEdits' | 'bypass';
131130
```
132131

133-
- `default`:逐层审批,危险操作需用户确认
134-
- `acceptEdits`:非破坏性工具自动放行,减少确认弹窗
132+
- `default`:不自动放行任何工具(含只读工具),全部逐层审批
133+
- `acceptEdits`:非破坏性工具自动放行(涵盖只读工具与编辑类工具),破坏性工具仍需确认
135134
- `bypass`:全部放行,跳过所有审批(慎用)
136135

137-
> `plan` 不再是 `PermissionMode` 的成员。plan Profile 通过 `AgentProfile.name === 'plan'` 结构化识别,由 `agent/profile.ts` 的 `planProfileGateHook` 和 `PLAN_PROFILE_ALLOWED_TOOLS` 共同限制工具。
136+
> 原独立的 `ReadonlyWhitelist` 层(在 `default` 下也无条件放行只读工具)已废弃,其语义并入 `PermissionMode` 的自动放行判定:`acceptEdits` 视只读工具为非破坏性工具自动放行,`default` 不再自动放行。
137+
138+
> `plan` 不再是 `PermissionMode` 的成员。plan Profile 通过 `AgentProfile.name === 'plan'` 结构化识别,由 `agent/profile.ts` 的 `planProfileGateHook` 和 `PLAN_PROFILE_ALLOWED_TOOLS` 共同限制工具。因只读白名单层已删除,`dispatch_agent` 等在 plan 下不再被流水线上层提前放行,统一由 plan gate 拦截。
138139
139140
### OS 级沙箱(预留)
140141

‎package.json‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,5 @@
5555
"typescript-eslint": "^8.60.1",
5656
"vite": "^6.4.2",
5757
"vitest": "^3.0.0"
58-
},
59-
"pnpm": {
60-
"overrides": {
61-
"vite": "^6.4.2"
62-
}
6358
}
6459
}

0 commit comments

Comments
 (0)