@dyyz1993/pi-coding-agent 0.74.23 → 0.74.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/extensions/agent-permissions/index.ts +235 -0
  2. package/dist/extensions/ask-tools/index.ts +115 -0
  3. package/dist/extensions/auto-memory/contract.d.ts +51 -0
  4. package/dist/extensions/auto-memory/contract.d.ts.map +1 -0
  5. package/dist/extensions/auto-memory/contract.js +2 -0
  6. package/dist/extensions/auto-memory/contract.js.map +1 -0
  7. package/dist/extensions/auto-memory/contract.ts +56 -0
  8. package/dist/extensions/auto-memory/index.ts +969 -0
  9. package/dist/extensions/auto-memory/prompts.ts +202 -0
  10. package/dist/extensions/auto-memory/skip-rules.ts +297 -0
  11. package/dist/extensions/auto-memory/utils.ts +208 -0
  12. package/dist/extensions/auto-session-title/index.ts +83 -0
  13. package/dist/extensions/bash-ext/contract.d.ts +79 -0
  14. package/dist/extensions/bash-ext/contract.d.ts.map +1 -0
  15. package/dist/extensions/bash-ext/contract.js +2 -0
  16. package/dist/extensions/bash-ext/contract.js.map +1 -0
  17. package/dist/extensions/bash-ext/contract.ts +69 -0
  18. package/dist/extensions/bash-ext/index.ts +858 -0
  19. package/dist/extensions/claude-hooks-compat/config-loader.ts +49 -0
  20. package/dist/extensions/claude-hooks-compat/handler-runner.ts +377 -0
  21. package/dist/extensions/claude-hooks-compat/if-parser.ts +53 -0
  22. package/dist/extensions/claude-hooks-compat/index.ts +178 -0
  23. package/dist/extensions/claude-hooks-compat/matcher.ts +17 -0
  24. package/dist/extensions/claude-hooks-compat/stdin-builder.ts +27 -0
  25. package/dist/extensions/claude-hooks-compat/types.ts +77 -0
  26. package/dist/extensions/compaction-manager/config.ts +47 -0
  27. package/dist/extensions/compaction-manager/context-fold.ts +63 -0
  28. package/dist/extensions/compaction-manager/index.ts +151 -0
  29. package/dist/extensions/compaction-manager/microcompact.ts +49 -0
  30. package/dist/extensions/compaction-manager/reactive.ts +9 -0
  31. package/dist/extensions/compaction-manager/session-memory.ts +48 -0
  32. package/dist/extensions/coordinator/INTEGRATION.md +376 -0
  33. package/dist/extensions/coordinator/handler.test.ts +277 -0
  34. package/dist/extensions/coordinator/handler.ts +189 -0
  35. package/dist/extensions/coordinator/index.ts +261 -0
  36. package/dist/extensions/coordinator/types.d.ts +100 -0
  37. package/dist/extensions/coordinator/types.d.ts.map +1 -0
  38. package/dist/extensions/coordinator/types.js +2 -0
  39. package/dist/extensions/coordinator/types.js.map +1 -0
  40. package/dist/extensions/coordinator/types.ts +72 -0
  41. package/dist/extensions/file-snapshot/index.ts +131 -0
  42. package/dist/extensions/file-time-guard/README.md +133 -0
  43. package/dist/extensions/file-time-guard/config.ts +13 -0
  44. package/dist/extensions/file-time-guard/index.ts +171 -0
  45. package/dist/extensions/hooks-engine/index.ts +117 -0
  46. package/dist/extensions/lsp/lsp/client/file-tracker.ts +70 -0
  47. package/dist/extensions/lsp/lsp/client/registry.ts +305 -0
  48. package/dist/extensions/lsp/lsp/client/runtime.ts +832 -0
  49. package/dist/extensions/lsp/lsp/config/resolver.ts +573 -0
  50. package/dist/extensions/lsp/lsp/contract.d.ts +101 -0
  51. package/dist/extensions/lsp/lsp/contract.d.ts.map +1 -0
  52. package/dist/extensions/lsp/lsp/contract.js +2 -0
  53. package/dist/extensions/lsp/lsp/contract.js.map +1 -0
  54. package/dist/extensions/lsp/lsp/contract.ts +103 -0
  55. package/dist/extensions/lsp/lsp/hooks/agent-end.ts +169 -0
  56. package/dist/extensions/lsp/lsp/hooks/diagnostics-mode.d.ts +10 -0
  57. package/dist/extensions/lsp/lsp/hooks/diagnostics-mode.d.ts.map +1 -0
  58. package/dist/extensions/lsp/lsp/hooks/diagnostics-mode.js +30 -0
  59. package/dist/extensions/lsp/lsp/hooks/diagnostics-mode.js.map +1 -0
  60. package/dist/extensions/lsp/lsp/hooks/diagnostics-mode.ts +41 -0
  61. package/dist/extensions/lsp/lsp/hooks/writethrough.ts +342 -0
  62. package/dist/extensions/lsp/lsp/index.ts +307 -0
  63. package/dist/extensions/lsp/lsp/lsp.test.ts +684 -0
  64. package/dist/extensions/lsp/lsp/monitoring/server-metrics.ts +176 -0
  65. package/dist/extensions/lsp/lsp/tools/lsp-tool.ts +402 -0
  66. package/dist/extensions/lsp/lsp/utils/dependency-resolver.ts +147 -0
  67. package/dist/extensions/lsp/lsp/utils/diagnostics-wait.ts +41 -0
  68. package/dist/extensions/lsp/lsp/utils/lsp-helpers.d.ts +20 -0
  69. package/dist/extensions/lsp/lsp/utils/lsp-helpers.d.ts.map +1 -0
  70. package/dist/extensions/lsp/lsp/utils/lsp-helpers.js +64 -0
  71. package/dist/extensions/lsp/lsp/utils/lsp-helpers.js.map +1 -0
  72. package/dist/extensions/lsp/lsp/utils/lsp-helpers.ts +76 -0
  73. package/dist/extensions/message-bridge/GUIDE.md +210 -0
  74. package/dist/extensions/message-bridge/index.ts +222 -0
  75. package/dist/extensions/output-guard/index.ts +384 -0
  76. package/dist/extensions/preview/index.ts +278 -0
  77. package/dist/extensions/rules-engine/MATCH_HISTORY_RECONCILIATION.md +111 -0
  78. package/dist/extensions/rules-engine/RULES-ENGINE-GUIDE.md +470 -0
  79. package/dist/extensions/rules-engine/cache.js +232 -0
  80. package/dist/extensions/rules-engine/cache.ts +38 -0
  81. package/dist/extensions/rules-engine/config.js +63 -0
  82. package/dist/extensions/rules-engine/config.ts +70 -0
  83. package/dist/extensions/rules-engine/index.js +1530 -0
  84. package/dist/extensions/rules-engine/index.ts +552 -0
  85. package/dist/extensions/rules-engine/injector.js +68 -0
  86. package/dist/extensions/rules-engine/injector.ts +74 -0
  87. package/dist/extensions/rules-engine/loader.js +179 -0
  88. package/dist/extensions/rules-engine/loader.ts +205 -0
  89. package/dist/extensions/rules-engine/matcher.js +534 -0
  90. package/dist/extensions/rules-engine/matcher.ts +52 -0
  91. package/dist/extensions/rules-engine/types.d.ts +156 -0
  92. package/dist/extensions/rules-engine/types.d.ts.map +1 -0
  93. package/dist/extensions/rules-engine/types.js +2 -0
  94. package/dist/extensions/rules-engine/types.js.map +1 -0
  95. package/dist/extensions/rules-engine/types.ts +169 -0
  96. package/dist/extensions/session-supervisor/checker.ts +116 -0
  97. package/dist/extensions/session-supervisor/config.ts +45 -0
  98. package/dist/extensions/session-supervisor/index.ts +726 -0
  99. package/dist/extensions/session-supervisor/prompts.ts +132 -0
  100. package/dist/extensions/session-supervisor/scheduler.ts +69 -0
  101. package/dist/extensions/session-supervisor/types.ts +215 -0
  102. package/dist/extensions/subagent/README.md +172 -0
  103. package/dist/extensions/subagent/agents/explorer.md +25 -0
  104. package/dist/extensions/subagent/agents/guide.md +27 -0
  105. package/dist/extensions/subagent/agents/planner.md +37 -0
  106. package/dist/extensions/subagent/agents/reviewer.md +35 -0
  107. package/dist/extensions/subagent/agents/scout.md +50 -0
  108. package/dist/extensions/subagent/agents/verification.md +35 -0
  109. package/dist/extensions/subagent/agents/worker.md +24 -0
  110. package/dist/extensions/subagent/agents.ts +25 -0
  111. package/dist/extensions/subagent/index.ts +987 -0
  112. package/dist/extensions/subagent/prompts/implement-and-review.md +10 -0
  113. package/dist/extensions/subagent/prompts/implement.md +10 -0
  114. package/dist/extensions/subagent/prompts/scout-and-plan.md +9 -0
  115. package/dist/extensions/subagent-ext/contract.d.ts +2 -0
  116. package/dist/extensions/subagent-ext/contract.d.ts.map +1 -0
  117. package/dist/extensions/subagent-ext/contract.js +2 -0
  118. package/dist/extensions/subagent-ext/contract.js.map +1 -0
  119. package/dist/extensions/subagent-ext/contract.ts +1 -0
  120. package/dist/extensions/subagent-ext/index.ts +347 -0
  121. package/dist/extensions/subagent-shared/contract.d.ts +25 -0
  122. package/dist/extensions/subagent-shared/contract.d.ts.map +1 -0
  123. package/dist/extensions/subagent-shared/contract.js +2 -0
  124. package/dist/extensions/subagent-shared/contract.js.map +1 -0
  125. package/dist/extensions/subagent-shared/contract.ts +28 -0
  126. package/dist/extensions/subagent-shared/index.ts +4 -0
  127. package/dist/extensions/subagent-shared/render.ts +166 -0
  128. package/dist/extensions/subagent-shared/types.ts +35 -0
  129. package/dist/extensions/subagent-shared/utils.ts +112 -0
  130. package/dist/extensions/subagent-v2/contract.d.ts +2 -0
  131. package/dist/extensions/subagent-v2/contract.d.ts.map +1 -0
  132. package/dist/extensions/subagent-v2/contract.js +2 -0
  133. package/dist/extensions/subagent-v2/contract.js.map +1 -0
  134. package/dist/extensions/subagent-v2/contract.ts +1 -0
  135. package/dist/extensions/subagent-v2/index.ts +599 -0
  136. package/dist/extensions/todo-ext/contract.d.ts +27 -0
  137. package/dist/extensions/todo-ext/contract.d.ts.map +1 -0
  138. package/dist/extensions/todo-ext/contract.js +2 -0
  139. package/dist/extensions/todo-ext/contract.js.map +1 -0
  140. package/dist/extensions/todo-ext/contract.ts +30 -0
  141. package/dist/extensions/todo-ext/index.ts +419 -0
  142. package/package.json +3 -2
@@ -0,0 +1,470 @@
1
+ # Pi Rules Engine v2 — 技术文档
2
+
3
+ > 给 UI 集成方的对接文档。本插件在 pi coding agent 内部运行,通过 `rules-engine` Channel 与外部 UI 面板双向通信。
4
+
5
+ ---
6
+
7
+ ## 1. 架构总览
8
+
9
+ ```
10
+ pi coding agent 进程
11
+ ┌─────────────────────────────────────┐
12
+ │ │
13
+ .claude/rules/ ──┤ ┌─────────────────────────────┐ │
14
+ .opencode/rules/ │ │ rules-engine 插件 │ │
15
+ .pi/rules/ ──┤ │ │ │
16
+ ~/.claude/rules/ │ │ ┌─────┐ ┌───────┐ ┌─────┐ │ │
17
+ │ │ │types│ │matcher│ │cache│ │ │ 外部 UI 面板
18
+ │ │ └─────┘ └───────┘ └─────┘ │ │ (Web / IDE / TUI)
19
+ │ │ ┌──────┐ ┌────────┐ │ │
20
+ │ │ │config│ │injector│ │ │
21
+ │ │ └──────┘ └────────┘ │ │
22
+ │ │ ┌──────┐ ┌──────┐ │ │
23
+ │ │ │loader│ │index │ │ │
24
+ │ │ └──────┘ │(入口)│ │ │
25
+ │ │ └──┬───┘ │ │
26
+ │ └──────────────┼──────────────┘ │
27
+ │ │ │
28
+ │ Channel "rules-engine" │
29
+ │ (JSONL 双向 RPC) │
30
+ └─────────────────┬────────────────────┘
31
+
32
+ stdin/stdout JSONL
33
+
34
+ ┌─────────┴──────────┐
35
+ │ RPC Client │
36
+ │ (Web UI / IDE) │
37
+ └────────────────────┘
38
+ ```
39
+
40
+ ## 2. 源码文件清单
41
+
42
+ ```
43
+ packages/coding-agent/extensions/rules-engine/ # 源码 (714 行)
44
+ ├── types.ts (56行) 类型定义
45
+ ├── matcher.ts (43行) glob 匹配引擎
46
+ ├── loader.ts (163行) frontmatter 解析 + 文件扫描
47
+ ├── config.ts (67行) 多源配置加载
48
+ ├── cache.ts (38行) TTL 缓存 + 去重
49
+ ├── injector.ts (67行) system prompt / tool context / compact 注入
50
+ └── index.ts (280行) 插件入口 (事件钩子 + 工具 + 命令)
51
+
52
+ packages/coding-agent/test/rules-engine/ # 测试 (1333 行, 96 个用例)
53
+ ├── matcher.test.ts (135行, 25 tests)
54
+ ├── loader.test.ts (256行, 30 tests)
55
+ ├── config.test.ts (148行, 12 tests)
56
+ ├── injector.test.ts (176行, 12 tests)
57
+ ├── cache.test.ts (132行, 7 tests)
58
+ └── lifecycle.test.ts (486行, 10 tests) ← 集成测试
59
+ ```
60
+
61
+ ## 3. 完整生命周期
62
+
63
+ ### 3.1 时间线
64
+
65
+ ```
66
+ 时间 事件名 触发时机 做了什么 回收/清理
67
+ ─────────────────────────────────────────────────────────────────────────────────────────────────────────
68
+ T1 session_start 会话启动/加载时 扫描4级目录 设置 status bar
69
+ 解析所有 .md 文件 frontmatter
70
+ 分类: 无条件 vs 条件
71
+ 写入缓存 (30s TTL)
72
+ Channel → 面板: 推送规则清单
73
+
74
+ T2 before_agent_start 每轮 LLM 调用前 取缓存中无条件规则 无 (每轮重建)
75
+ 注入 <system-reminder> 到 custom message
76
+ Channel → 面板: prompt 长度
77
+
78
+ T3 agent_start Agent 循环开始 (观察记录) 无
79
+
80
+ T4 turn_start 每个 turn 开始 (观察记录) 无
81
+
82
+ T5 tool_call read/grep/glob 后 提取目标文件路径 无 (临时注入)
83
+ (read/grep/glob) glob 匹配条件规则
84
+ 注入 <system-reminder> 到 tool_result
85
+ 严重级别 UI 通知
86
+ Channel → 面板: 匹配信息
87
+
88
+ T6 turn_end 每个 turn 结束 (观察记录) 无
89
+
90
+ T7 agent_end Agent 循环结束 Channel → 面板: 完成事件 无
91
+
92
+ T8 session_compact 上下文压缩后 重新注入无条件规则 更新 status bar
93
+ Channel → 面板: 恢复通知
94
+
95
+ T9 session_shutdown 会话关闭时 清除 status bar 清除 status bar
96
+ Channel → 面板: shutdown 事件
97
+ ```
98
+
99
+ ### 3.2 事件顺序图 (一次完整的 prompt 流程)
100
+
101
+ ```
102
+ 用户输入 prompt
103
+
104
+
105
+ input 事件
106
+
107
+
108
+ before_agent_start ◄─── T2: 注入无条件规则到 systemPrompt
109
+
110
+
111
+ agent_start ◄─── T3
112
+
113
+
114
+ context → before_provider_request → after_provider_response
115
+
116
+
117
+ turn_start ◄─── T4
118
+
119
+
120
+ message_start → message_update* → message_end
121
+ │ (如果 LLM 返回 tool_use)
122
+
123
+ tool_call ◄─── T5: read/grep/glob 时注入条件规则
124
+
125
+
126
+ tool_execution_start → tool_execution_update* → tool_execution_end
127
+
128
+
129
+ tool_result
130
+
131
+
132
+ turn_end ◄─── T6
133
+ │ (如果 stopReason === "tool_use", 回到 context)
134
+
135
+ agent_end ◄─── T7
136
+ ```
137
+
138
+ ## 4. Channel 通信协议
139
+
140
+ Channel 名称: `"rules-engine"`
141
+
142
+ 传输格式: JSONL, 每条消息结构:
143
+
144
+ ```json
145
+ { "type": "channel_data", "name": "rules-engine", "data": { ... } }
146
+ ```
147
+
148
+ ### 4.1 插件 → 面板 (推送)
149
+
150
+ | 消息类型 | 时机 | data 结构 |
151
+ |---------|------|-----------|
152
+ | `session_start` | T1: 会话启动时 | 见下方 |
153
+ | `before_agent_start` | T2: 每轮 LLM 调用前 | 见下方 |
154
+ | `agent_end` | T7: Agent 循环结束 | `{ type: "agent_end" }` |
155
+ | `session_shutdown` | T9: 会话关闭 | `{ type: "session_shutdown" }` |
156
+
157
+ #### session_start 消息体 (面板最核心的数据源)
158
+
159
+ ```json
160
+ {
161
+ "type": "session_start",
162
+ "totalRules": 5,
163
+ "unconditional": 3,
164
+ "conditional": 2,
165
+ "rules": [
166
+ {
167
+ "name": "global-coding-standard",
168
+ "title": "Global Coding Standard",
169
+ "scope": "user",
170
+ "source": "~/.claude/rules",
171
+ "isUnconditional": true,
172
+ "severity": "medium",
173
+ "globs": []
174
+ },
175
+ {
176
+ "name": "ts-strict",
177
+ "title": "TypeScript Strict Mode",
178
+ "scope": "project",
179
+ "source": ".claude/rules",
180
+ "isUnconditional": false,
181
+ "severity": "high",
182
+ "globs": ["src/**/*.ts", "src/**/*.tsx"]
183
+ }
184
+ ]
185
+ }
186
+ ```
187
+
188
+ #### before_agent_start 消息体
189
+
190
+ ```json
191
+ {
192
+ "type": "before_agent_start",
193
+ "systemPromptLength": 4523
194
+ }
195
+ ```
196
+
197
+ ### 4.2 面板 → 插件 (拉取/命令)
198
+
199
+ 面板通过 `channel.call()` 发送 RPC 命令, 插件通过 `ServerChannel.handle()` 接收。
200
+
201
+ 当前支持的方法:
202
+
203
+ | 方法 | params 结构 | 说明 |
204
+ |------|------------|------|
205
+ | `rules.getSnapshot` | `{ cwd?: string }` | 获取规则快照 (包含规则列表、匹配历史、生命周期日志) |
206
+
207
+ > **扩展点**: UI 集成方可以定义更多 RPC 方法, 只需在插件的 `channel.handle("method", fn)` 中注册。
208
+
209
+ ### 4.3 使用示例 (RPC Client 端)
210
+
211
+ ```javascript
212
+ const client = new RpcClient();
213
+
214
+ // 获取 channel
215
+ const rulesChannel = client.channel("rules-engine");
216
+
217
+ // 监听推送事件 (服务端通过 ServerChannel.emit() 主动推送)
218
+ rulesChannel.onReceive((data) => {
219
+ if (data.type === "snapshot") {
220
+ updateRulesPanel(data.rules);
221
+ updateStats(data.totalRules, data.unconditional, data.conditional);
222
+ }
223
+ if (data.type === "injected") {
224
+ showInjectedRules(data.injectedRuleNames);
225
+ }
226
+ });
227
+
228
+ // RPC 调用 (自动注入 __call 路由字段)
229
+ const snapshot = await rulesChannel.call("rules.getSnapshot", { cwd: "/path/to/project" });
230
+ ```
231
+
232
+ ## 5. 数据模型
233
+
234
+ ### 5.1 ParsedRule (单条规则)
235
+
236
+ ```typescript
237
+ interface ParsedRule {
238
+ name: string; // 文件名去掉 .md (唯一标识)
239
+ filePath: string; // 磁盘绝对路径
240
+ title: string; // Markdown 首行 # 标题
241
+ content: string; // Markdown body (规则正文)
242
+ scope: "user" | "pi" | "project" | "managed"; // 来源级别
243
+ source: string; // 目录路径标签 (展示用)
244
+ frontmatter: RuleFrontmatter;
245
+ isUnconditional: boolean; // true = 始终注入 <system-reminder>
246
+ }
247
+ ```
248
+
249
+ ### 5.2 RuleFrontmatter (元数据)
250
+
251
+ ```typescript
252
+ interface RuleFrontmatter {
253
+ globs?: string[]; // glob 模式列表 (空=无条件)
254
+ paths?: string[]; // globs 的别名 (向后兼容)
255
+ description?: string;
256
+ severity?: "critical" | "high" | "medium" | "low" | "hint";
257
+ allowedTools?: string[];
258
+ whenToUse?: string;
259
+ // ... 其他可选字段
260
+ }
261
+ ```
262
+
263
+ ### 5.3 Scope 含义
264
+
265
+ | scope | 含义 | 默认扫描路径 |
266
+ |-------|------|-------------|
267
+ | `managed` | 运维管控 | `/etc/claude-code/.claude/rules` |
268
+ | `user` | 用户全局 | `~/.claude/rules/`, `~/.config/opencode/rules/` |
269
+ | `pi` | 项目 pi 配置 | `<project>/.pi/rules/` |
270
+ | `project` | 项目团队共享 | `<project>/.claude/rules/`, `<project>/.opencode/rules/`, `<project>/.trae/rules/` |
271
+
272
+ ### 5.4 Severity 含义
273
+
274
+ | severity | 图标 | 面板建议展示 | 行为 |
275
+ |----------|------|-------------|------|
276
+ | `critical` | 🔴 | 红色高亮, 不可折叠 | 操作匹配文件前强制 warning 通知 |
277
+ | `high` | 🟠 | 橙色标记 | 操作匹配文件前 info 通知 |
278
+ | `medium` | 🟡 | 默认展示 | 静默注入 |
279
+ | `low` | 🔵 | 灰色/折叠 | 仅标注 |
280
+ | `hint` | 💡 | 折叠 | 仅标注 |
281
+
282
+ ## 6. 配置系统
283
+
284
+ ### 6.1 配置文件 (按优先级, 找到即停)
285
+
286
+ 1. `<project>/.rules-config.json`
287
+ 2. `<project>/.pi/rules-config.json`
288
+ 3. `<project>/.claude/rules-config.json`
289
+ 4. `<project>/.opencode/rules-config.json`
290
+
291
+ ### 6.2 配置格式
292
+
293
+ ```json
294
+ {
295
+ "cacheTTL": 30000,
296
+ "notifyOnLoad": true,
297
+ "notifyOnMatch": true,
298
+ "dirs": {
299
+ "user": ["~/.claude/rules"],
300
+ "pi": [".pi/rules"],
301
+ "project": [".claude/rules", ".opencode/rules"],
302
+ "managed": []
303
+ }
304
+ }
305
+ ```
306
+
307
+ ### 6.3 规则文件格式
308
+
309
+ ```markdown
310
+ ---
311
+ globs: "src/**/*.{ts,tsx}"
312
+ severity: high
313
+ description: TypeScript strict mode enforcement
314
+ ---
315
+
316
+ # TypeScript Strict Mode
317
+
318
+ Always use strict TypeScript configuration.
319
+ No `any` types unless absolutely necessary.
320
+ ```
321
+
322
+ ## 7. 缓存策略
323
+
324
+ | 策略 | 值 | 说明 |
325
+ |------|---|------|
326
+ | TTL | 30 秒 (可配置) | 过期后下次调用自动刷新 |
327
+ | 去重 | 按 `filePath` | 同一文件不重复加载 |
328
+ | 手动刷新 | `/rules reload` 或 `rules_reload` 工具 | 立即清缓存重读磁盘 |
329
+
330
+ ## 8. 已注册的 LLM 工具
331
+
332
+ | 工具名 | 参数 | 说明 |
333
+ |--------|------|------|
334
+ | `rules_list` | 无 | 列出所有规则 (按 scope 分组, 含 severity) |
335
+ | `rules_match` | `filePath: string` | 检查路径匹配哪些条件规则 |
336
+ | `rules_reload` | 无 | 清缓存重读磁盘 |
337
+ | `rules_show` | `name: string` | 查看规则完整内容 |
338
+
339
+ ## 9. 已注册的命令
340
+
341
+ ```
342
+ /rules → 等同 /rules list
343
+ /rules list → 列出已加载规则摘要
344
+ /rules reload → 重载规则
345
+ /rules check <path> → 检查路径匹配
346
+ /rules active → 当前活跃规则概览
347
+ ```
348
+
349
+ ## 10. UI 集成建议
350
+
351
+ 以下是 UI 面板方需要考虑的展示维度:
352
+
353
+ ### 10.1 面板布局建议
354
+
355
+ ```
356
+ ┌─ Rules Engine ──────────────────────────────────────┐
357
+ │ │
358
+ │ [Stats Bar] Total: 5 | Unconditional: 3 | Cond: 2 │
359
+ │ │
360
+ │ ┌─ Unconditional Rules ──────────────────────────┐ │
361
+ │ │ 🟡 Global Coding Standard (user) │ │
362
+ │ │ 🔴 Never Push Secrets (project) │ │
363
+ │ │ 🟡 Commit Conventions (project) │ │
364
+ │ └────────────────────────────────────────────────┘ │
365
+ │ │
366
+ │ ┌─ Conditional Rules ────────────────────────────┐ │
367
+ │ │ 🟠 TypeScript Strict src/**/*.ts (project) │ │
368
+ │ │ 🟡 Test Standards test/**/*.ts (project) │ │
369
+ │ └────────────────────────────────────────────────┘ │
370
+ │ │
371
+ │ ┌─ Activity Log ─────────────────────────────────┐ │
372
+ │ │ 10:23:01 session_start: loaded 5 rules │ │
373
+ │ │ 10:23:05 before_agent_start: prompt 4523 chars │ │
374
+ │ │ 10:23:08 tool_call(read): matched ts-strict │ │
375
+ │ │ 10:23:12 agent_end │ │
376
+ │ └────────────────────────────────────────────────┘ │
377
+ │ │
378
+ │ [🔄 Reload] [🔍 Check Path...] │
379
+ └──────────────────────────────────────────────────────┘
380
+ ```
381
+
382
+ ### 10.2 关键交互点
383
+
384
+ | 用户操作 | Channel 消息 | 面板响应 |
385
+ |---------|-------------|---------|
386
+ | 打开项目 | 收到 `session_start` | 展示规则清单 + 统计 |
387
+ | Agent 开始回答 | 收到 `before_agent_start` | 显示 prompt 注入状态 |
388
+ | Agent 读文件 | 收到 tool_call 匹配通知 | 高亮匹配的条件规则 |
389
+ | Agent 完成 | 收到 `agent_end` | 标记空闲 |
390
+ | 上下文压缩 | 收到 compact 通知 | 显示"规则已恢复" |
391
+ | 关闭会话 | 收到 `session_shutdown` | 清空面板 |
392
+ | 点击 Reload | 发送 `{action:"reload"}` | 刷新规则列表 |
393
+ | 输入路径检查 | 发送 `{action:"check", path:...}` | 展示匹配结果 |
394
+
395
+ ### 10.3 实时状态推送 (面板可订阅)
396
+
397
+ 插件在每个生命周期节点通过 Channel 推送事件。面板可维护一个状态机:
398
+
399
+ ```
400
+ IDLE ──session_start──→ LOADING ──rules_loaded──→ READY
401
+ READY ──before_agent_start──→ ACTIVE
402
+ ACTIVE ──tool_call──→ MATCHING (高亮匹配规则)
403
+ MATCHING ──turn_end──→ ACTIVE
404
+ ACTIVE ──agent_end──→ IDLE
405
+ 任意 ──session_shutdown──→ DISPOSED
406
+ ```
407
+
408
+ ## 11. 测试验证
409
+
410
+ 全部 96 个测试用例通过, 覆盖:
411
+
412
+ | 层级 | 测试 | 覆盖内容 |
413
+ |------|------|---------|
414
+ | 单元 | 86 个 | glob 匹配、frontmatter 解析、规则加载、配置发现、缓存 TTL、注入格式、幂等性 |
415
+ | 集成 | 10 个 | session_start 加载 → systemPrompt 注入 → 生命周期事件顺序 → Channel 双向通信 → shutdown 清理 |
416
+
417
+ 运行命令:
418
+ ```bash
419
+ cd packages/coding-agent
420
+ npx tsx ../../node_modules/vitest/dist/cli.js --run test/rules-engine/
421
+ ```
422
+
423
+ ## 12. 文件位置
424
+
425
+ | 文件 | 路径 |
426
+ |------|------|
427
+ | 插件源码 | `packages/coding-agent/extensions/rules-engine/` |
428
+ | 单元测试 | `packages/coding-agent/test/rules-engine/` |
429
+ | Channel 类型 | `packages/coding-agent/src/core/extensions/channel-types.ts` |
430
+ | Channel 管理器 | `packages/coding-agent/src/core/extensions/channel-manager.ts` |
431
+ | Channel 集成测试 | `packages/coding-agent/test/suite/agent-session-channel.test.ts` |
432
+
433
+ ## 13. Claude Code 兼容性
434
+
435
+ 本插件以 Claude Code Rules 规范为基线,同时提供扩展能力。
436
+
437
+ ### 13.1 Frontmatter 兼容
438
+
439
+ | 字段 | Claude Code 原生 | 本插件 | 说明 |
440
+ |------|-----------------|--------|------|
441
+ | `globs` | ✅ 逗号分隔 string | ✅ string 或 string[] | 主字段名 |
442
+ | `paths` | ✅ (globs 别名) | ✅ (globs 别名) | 向后兼容 |
443
+ | `severity` | ❌ | ✅ | critical/high/medium/low/hint |
444
+ | `description` | ❌ | ✅ | 规则描述 |
445
+ | `allowedTools` | ❌ | ✅ | 工具白名单 |
446
+ | `whenToUse` | ❌ | ✅ | 触发说明 |
447
+
448
+ Claude Code 用户写的规则文件可直接使用,无需修改:
449
+ ```markdown
450
+ ---
451
+ globs: **/*.ts, **/*.tsx
452
+ ---
453
+ # TypeScript Rules
454
+ - No `any` types
455
+ ```
456
+
457
+ ### 13.2 匹配引擎
458
+
459
+ 使用 `ignore` npm 包(gitignore 语义),与 Claude Code 原生一致。支持:
460
+ - `**/*.ts` — 递归匹配
461
+ - `src/**` — 目录匹配
462
+ - `*.{ts,tsx}` — 花括号展开(自动展开后传给 ignore)
463
+ - `!**/*.d.ts` — 排除模式
464
+
465
+ ### 13.3 注入方式
466
+
467
+ | 规则类型 | 注入方式 |
468
+ |---------|---------|
469
+ | 无条件规则 | `<system-reminder>` 标签注入 custom message |
470
+ | 条件规则 | `<system-reminder>` 标签注入 tool_result |