refactor: 清理未使用代码并添加未来功能标记
Some checks failed
CI / Rust Check (push) Has been cancelled
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
Some checks failed
CI / Rust Check (push) Has been cancelled
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
style: 统一代码格式和注释风格 docs: 更新多个功能文档的完整度和状态 feat(runtime): 添加路径验证工具支持 fix(pipeline): 改进条件判断和变量解析逻辑 test(types): 为ID类型添加全面测试用例 chore: 更新依赖项和Cargo.lock文件 perf(mcp): 优化MCP协议传输和错误处理
This commit is contained in:
447
plans/whimsical-mapping-patterson-agent-a62540065e70912bf.md
Normal file
447
plans/whimsical-mapping-patterson-agent-a62540065e70912bf.md
Normal file
@@ -0,0 +1,447 @@
|
||||
# ZCLAW 前端代码审查报告
|
||||
|
||||
**审查日期**: 2026-03-25
|
||||
**审查范围**: Intelligence Layer Phase 4 前端实现
|
||||
**审查员**: Code Reviewer Agent
|
||||
|
||||
---
|
||||
|
||||
## 执行摘要
|
||||
|
||||
本次审查针对 ZCLAW 项目的 Intelligence Layer Phase 4 前端实现。整体来看,**后端 Rust 实现质量较高**,但**前端存在一个严重的阻塞性问题** - `personaStore.ts` 文件包含严重的语法错误,完全无法编译。
|
||||
|
||||
### 问题严重性分布
|
||||
|
||||
| 严重性 | 数量 | 说明 |
|
||||
|--------|------|------|
|
||||
| **CRITICAL (必须修复)** | 1 | personaStore.ts 语法错误导致编译失败 |
|
||||
| **IMPORTANT (应该修复)** | 4 | 类型安全、API 集成、错误处理问题 |
|
||||
| **SUGGESTION (建议改进)** | 3 | 代码组织、文档、测试相关 |
|
||||
|
||||
---
|
||||
|
||||
## 一、CRITICAL 问题 (必须立即修复)
|
||||
|
||||
### 1.1 personaStore.ts 语法完全损坏
|
||||
|
||||
**文件**: `G:\ZClaw_openfang\desktop\src\store\personaStore.ts`
|
||||
|
||||
**问题描述**: 该文件包含严重的语法错误,看起来像是 AI 生成的代码片段被错误地粘贴在一起,无法通过 TypeScript 编译。
|
||||
|
||||
**具体问题**:
|
||||
|
||||
```typescript
|
||||
// 第 19-26 行 - 完全无效的语法
|
||||
import {
|
||||
toFrontendMemory, (e: MemoryEntryForAnalysis): MemoryEntryForAnalysis[] {
|
||||
toFrontendProposal = (p: EvolutionProposal): FrontendProposal => {
|
||||
const current = result.proposals.map((proposal) => proposal);
|
||||
const accepted = result.proposals.filter(p => p.status === ProposalStatus::Pending);
|
||||
const dismissed = result.proposals.filter(p => p.id !== proposal.id);
|
||||
return proposals;
|
||||
},}
|
||||
```
|
||||
|
||||
**问题分析**:
|
||||
1. 第 19 行开始了一个 import 语句,但立即混入了函数定义
|
||||
2. 使用了 Rust 风格的 `::` 语法 (`ProposalStatus::Pending`)
|
||||
3. 第 26-32 行包含不完整的代码片段
|
||||
4. 整个文件没有有效的 Zustand store 定义
|
||||
|
||||
**影响**:
|
||||
- 前端项目无法编译
|
||||
- Persona Evolution 功能完全不可用
|
||||
- 可能影响其他 store 的正常工作
|
||||
|
||||
**修复建议**:
|
||||
1. 完全重写该文件
|
||||
2. 参考 `meshStore.ts` 的实现模式
|
||||
3. 确保使用正确的 TypeScript/JavaScript 语法
|
||||
4. 添加完整的类型定义和 store 结构
|
||||
|
||||
**正确实现示例**:
|
||||
|
||||
```typescript
|
||||
import { create } from 'zustand';
|
||||
import { invoke } from '@tauri-apps/api/core';
|
||||
import type {
|
||||
EvolutionResult,
|
||||
EvolutionProposal,
|
||||
PersonaEvolverConfig,
|
||||
} from '../lib/intelligence-client';
|
||||
|
||||
export interface PersonaEvolutionState {
|
||||
currentAgentId: string;
|
||||
proposals: EvolutionProposal[];
|
||||
history: EvolutionResult[];
|
||||
isLoading: boolean;
|
||||
error: string | null;
|
||||
config: PersonaEvolverConfig;
|
||||
showProposalsPanel: boolean;
|
||||
|
||||
// Actions
|
||||
evolve: (agentId: string) => Promise<void>;
|
||||
acceptProposal: (proposalId: string) => Promise<void>;
|
||||
dismissProposal: (proposalId: string) => Promise<void>;
|
||||
loadHistory: (limit?: number) => Promise<void>;
|
||||
updateConfig: (config: Partial<PersonaEvolverConfig>) => Promise<void>;
|
||||
clearError: () => void;
|
||||
}
|
||||
|
||||
export const usePersonaEvolutionStore = create<PersonaEvolutionState>((set, get) => ({
|
||||
currentAgentId: 'default',
|
||||
proposals: [],
|
||||
history: [],
|
||||
isLoading: false,
|
||||
error: null,
|
||||
config: {
|
||||
auto_profile_update: true,
|
||||
min_preferences_for_update: 3,
|
||||
min_conversations_for_evolution: 5,
|
||||
enable_instruction_refinement: true,
|
||||
enable_soul_evolution: true,
|
||||
max_proposals_per_cycle: 3,
|
||||
},
|
||||
showProposalsPanel: false,
|
||||
|
||||
evolve: async (agentId: string) => {
|
||||
set({ isLoading: true, error: null });
|
||||
try {
|
||||
const result = await invoke<EvolutionResult>('persona_evolve', {
|
||||
agentId,
|
||||
memories: [], // TODO: Get memories from memory store
|
||||
});
|
||||
set((state) => ({
|
||||
history: [result, ...state.history],
|
||||
proposals: result.proposals,
|
||||
isLoading: false,
|
||||
}));
|
||||
} catch (err) {
|
||||
set({
|
||||
error: err instanceof Error ? err.message : String(err),
|
||||
isLoading: false,
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
acceptProposal: async (proposalId: string) => {
|
||||
try {
|
||||
const proposal = get().proposals.find((p) => p.id === proposalId);
|
||||
if (!proposal) return;
|
||||
|
||||
await invoke('persona_apply_proposal', { proposal });
|
||||
set((state) => ({
|
||||
proposals: state.proposals.filter((p) => p.id !== proposalId),
|
||||
}));
|
||||
} catch (err) {
|
||||
set({ error: err instanceof Error ? err.message : String(err) });
|
||||
}
|
||||
},
|
||||
|
||||
dismissProposal: async (proposalId: string) => {
|
||||
set((state) => ({
|
||||
proposals: state.proposals.filter((p) => p.id !== proposalId),
|
||||
}));
|
||||
},
|
||||
|
||||
loadHistory: async (limit = 10) => {
|
||||
try {
|
||||
const history = await invoke<EvolutionResult[]>('persona_evolution_history', { limit });
|
||||
set({ history });
|
||||
} catch (err) {
|
||||
console.error('Failed to load evolution history:', err);
|
||||
}
|
||||
},
|
||||
|
||||
updateConfig: async (config: Partial<PersonaEvolverConfig>) => {
|
||||
try {
|
||||
const newConfig = { ...get().config, ...config };
|
||||
await invoke('persona_evolver_update_config', { config: newConfig });
|
||||
set({ config: newConfig });
|
||||
} catch (err) {
|
||||
set({ error: err instanceof Error ? err.message : String(err) });
|
||||
}
|
||||
},
|
||||
|
||||
clearError: () => set({ error: null }),
|
||||
}));
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、IMPORTANT 问题 (应该修复)
|
||||
|
||||
### 2.1 intelligence-client.ts 缺少类型导出
|
||||
|
||||
**文件**: `G:\ZClaw_openfang\desktop\src\lib\intelligence-client.ts`
|
||||
|
||||
**问题描述**: `personaStore.ts` 尝试导入 `ProfileUpdate` 和 `PersonaEvolverConfig` 等类型,但这些类型在后端定义,前端 `intelligence-client.ts` 没有正确导出。
|
||||
|
||||
**位置**: 第 114-131 行
|
||||
|
||||
**当前代码**:
|
||||
```typescript
|
||||
export type {
|
||||
HeartbeatConfig,
|
||||
// ... 其他类型
|
||||
IdentitySnapshot,
|
||||
} from './intelligence-backend';
|
||||
```
|
||||
|
||||
**缺失类型**:
|
||||
- `ProfileUpdate`
|
||||
- `EvolutionProposal`
|
||||
- `EvolutionResult`
|
||||
- `EvolutionChangeType`
|
||||
- `EvolutionInsight`
|
||||
- `InsightCategory`
|
||||
- `PersonaEvolverConfig`
|
||||
- `PersonaEvolverState`
|
||||
|
||||
**修复建议**:
|
||||
1. 在 `intelligence-client.ts` 添加缺失的类型导出
|
||||
2. 或者在 `intelligence-backend.ts` 中添加前端兼容的类型定义
|
||||
|
||||
### 2.2 WorkflowRecommendations.tsx 缺少 Mesh 命令的 Accept/Dismiss 处理
|
||||
|
||||
**文件**: `G:\ZClaw_openfang\desktop\src\components\WorkflowRecommendations.tsx`
|
||||
|
||||
**问题描述**: 组件调用了 `acceptRecommendation` 和 `dismissRecommendation`,但后端 Tauri 命令 (`mesh_accept_recommendation`, `mesh_dismiss_recommendation`) 没有在 `mesh.rs` 中实现。
|
||||
|
||||
**位置**: 第 82-83 行
|
||||
```typescript
|
||||
onAccept={() => acceptRecommendation(rec.id)}
|
||||
onDismiss={() => dismissRecommendation(rec.id)}
|
||||
```
|
||||
|
||||
**后端缺失**: `mesh.rs` 中只有以下命令:
|
||||
- `mesh_init`
|
||||
- `mesh_analyze`
|
||||
- `mesh_record_activity`
|
||||
- `mesh_get_patterns`
|
||||
- `mesh_update_config`
|
||||
- `mesh_decay_patterns`
|
||||
|
||||
**修复建议**:
|
||||
1. 在 `mesh.rs` 添加 `mesh_accept_recommendation` 和 `mesh_dismiss_recommendation` 命令
|
||||
2. 或者在 `meshStore.ts` 中实现本地状态管理,不依赖后端
|
||||
|
||||
### 2.3 kernel-client.ts Triggers API 错误处理不一致
|
||||
|
||||
**文件**: `G:\ZClaw_openfang\desktop\src\lib\kernel-client.ts`
|
||||
|
||||
**问题描述**: Triggers API 方法中,部分方法使用 try-catch 返回空数组,部分直接抛出异常。
|
||||
|
||||
**不一致示例**:
|
||||
|
||||
```typescript
|
||||
// 第 771-788 行 - 捕获错误返回空数组
|
||||
async listTriggers(): Promise<{...}> {
|
||||
try {
|
||||
const triggers = await invoke<...>('trigger_list');
|
||||
return { triggers };
|
||||
} catch (error) {
|
||||
console.error('[kernel-client] listTriggers error:', error);
|
||||
return { triggers: [] }; // 返回空数组
|
||||
}
|
||||
}
|
||||
|
||||
// 第 871-883 行 - 直接抛出异常
|
||||
async updateTrigger(id: string, updates: {...}): Promise<{...}> {
|
||||
return invoke<...>('trigger_update', { id, updates }); // 不捕获错误
|
||||
}
|
||||
```
|
||||
|
||||
**修复建议**:
|
||||
统一错误处理策略:
|
||||
1. 查询类方法 (list, get) 可以返回空值/空数组
|
||||
2. 修改类方法 (create, update, delete) 应该抛出错误让调用方处理
|
||||
|
||||
### 2.4 meshStore.ts 使用 localStorage 获取 agentId
|
||||
|
||||
**文件**: `G:\ZClaw_openfang\desktop\src\store\meshStore.ts`
|
||||
|
||||
**问题描述**: 多处使用 `localStorage.getItem('currentAgentId')` 获取 agent ID,这种方式容易出错且难以维护。
|
||||
|
||||
**位置**: 第 60, 82, 96, 111, 119, 129, 140 行
|
||||
|
||||
**示例**:
|
||||
```typescript
|
||||
const agentId = localStorage.getItem('currentAgentId') || 'default';
|
||||
```
|
||||
|
||||
**问题**:
|
||||
1. 如果 localStorage 中的值与实际状态不同步会导致数据不一致
|
||||
2. 没有类型安全保证
|
||||
3. 测试困难
|
||||
|
||||
**修复建议**:
|
||||
1. 在 store 中维护 `currentAgentId` 状态
|
||||
2. 或从父级 store/props 获取 agentId
|
||||
|
||||
---
|
||||
|
||||
## 三、SUGGESTION 问题 (建议改进)
|
||||
|
||||
### 3.1 WorkflowRecommendations.tsx 组件职责过重
|
||||
|
||||
**文件**: `G:\ZClaw_openfang\desktop\src\components\WorkflowRecommendations.tsx`
|
||||
|
||||
**观察**: 组件包含 341 行代码,包含两个子组件和复杂的类型处理逻辑。
|
||||
|
||||
**建议**:
|
||||
1. 将 `RecommendationCard` 和 `PatternCard` 提取到单独文件
|
||||
2. 将 `getPatternTypeLabel` 函数提取到 utils 文件
|
||||
|
||||
### 3.2 缺少单元测试
|
||||
|
||||
**观察**: 新增的前端文件 (`personaStore.ts`, `meshStore.ts`, `WorkflowRecommendations.tsx`) 没有对应的测试文件。
|
||||
|
||||
**建议**:
|
||||
根据项目 `testing.md` 规范,添加单元测试确保 80% 覆盖率。
|
||||
|
||||
### 3.3 后端 Rust 文档注释不一致
|
||||
|
||||
**观察**: `trigger_evaluator.rs` 中部分函数缺少文档注释,如 `evaluate_composite` 使用了 Pin<Box> 复杂类型但没有充分解释。
|
||||
|
||||
**建议**:
|
||||
添加更详细的文档注释,解释设计决策。
|
||||
|
||||
---
|
||||
|
||||
## 四、计划对齐分析
|
||||
|
||||
### 4.1 与 vivid-drifting-brook.md 计划的对比
|
||||
|
||||
| 计划项 | 实现状态 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 文件工具路径验证 | 未在本次审查范围 | 需要单独验证 |
|
||||
| MCP 客户端集成 | 未在本次审查范围 | 需要单独验证 |
|
||||
| Triggers/Approvals API | **部分实现** | 后端有类型,前端有 API,但 Tauri 命令缺失 |
|
||||
| Pattern Detector | **完成** | `pattern_detector.rs` 实现完整 |
|
||||
| Workflow Recommender | **完成** | `recommender.rs` 实现完整 |
|
||||
| Adaptive Mesh | **完成** | `mesh.rs` 实现完整,缺少 accept/dismiss 命令 |
|
||||
| Trigger Evaluator | **完成** | `trigger_evaluator.rs` 实现完整 |
|
||||
| Persona Evolver | **后端完成** | Rust 实现完整,前端 store 损坏 |
|
||||
|
||||
### 4.2 偏离分析
|
||||
|
||||
**无正当理由的偏离**:
|
||||
- `personaStore.ts` 的损坏代码不应该被提交
|
||||
|
||||
**合理的偏离**:
|
||||
- 后端实现比计划更完善,增加了 Tauri 命令支持
|
||||
|
||||
---
|
||||
|
||||
## 五、代码质量评估
|
||||
|
||||
### 5.1 后端 Rust 代码 (优秀)
|
||||
|
||||
**优点**:
|
||||
1. 完整的类型定义和文档注释
|
||||
2. 遵循 Rust 最佳实践
|
||||
3. 包含单元测试
|
||||
4. 错误处理适当
|
||||
|
||||
**示例** (`mesh.rs` 第 54-63 行):
|
||||
```rust
|
||||
impl Default for MeshConfig {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
enabled: true,
|
||||
min_confidence: 0.6,
|
||||
max_recommendations: 5,
|
||||
analysis_window_hours: 24,
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 前端 TypeScript 代码 (混合)
|
||||
|
||||
**优点**:
|
||||
1. `intelligence-client.ts` 和 `kernel-client.ts` 实现完整
|
||||
2. `meshStore.ts` 遵循 Zustand 最佳实践
|
||||
3. `WorkflowRecommendations.tsx` UI 实现完整
|
||||
|
||||
**缺点**:
|
||||
1. `personaStore.ts` 完全损坏
|
||||
2. 类型导出不完整
|
||||
3. 缺少测试
|
||||
|
||||
---
|
||||
|
||||
## 六、安全性检查
|
||||
|
||||
### 6.1 通过项
|
||||
|
||||
- [x] 无硬编码密钥
|
||||
- [x] 用户输入通过 Tauri invoke 传递 (类型安全)
|
||||
- [x] 无 XSS 风险 (React 自动转义)
|
||||
|
||||
### 6.2 注意事项
|
||||
|
||||
- `localStorage` 使用可能存在数据泄露风险 (非敏感数据)
|
||||
|
||||
---
|
||||
|
||||
## 七、行动项清单
|
||||
|
||||
### 必须修复 (阻塞)
|
||||
|
||||
1. **[CRITICAL]** 完全重写 `personaStore.ts` 文件
|
||||
- 负责人: 前端开发者
|
||||
- 预计时间: 2-4 小时
|
||||
|
||||
### 应该修复 (高优先级)
|
||||
|
||||
2. **[IMPORTANT]** 在 `intelligence-client.ts` 添加缺失的类型导出
|
||||
- 预计时间: 30 分钟
|
||||
|
||||
3. **[IMPORTANT]** 在 `mesh.rs` 添加 `mesh_accept_recommendation` 和 `mesh_dismiss_recommendation` 命令
|
||||
- 预计时间: 1 小时
|
||||
|
||||
4. **[IMPORTANT]** 统一 `kernel-client.ts` 中的错误处理策略
|
||||
- 预计时间: 1 小时
|
||||
|
||||
5. **[IMPORTANT]** 重构 `meshStore.ts` 中的 agentId 获取方式
|
||||
- 预计时间: 30 分钟
|
||||
|
||||
### 建议改进 (低优先级)
|
||||
|
||||
6. **[SUGGESTION]** 拆分 `WorkflowRecommendations.tsx` 组件
|
||||
- 预计时间: 1-2 小时
|
||||
|
||||
7. **[SUGGESTION]** 添加前端单元测试
|
||||
- 预计时间: 4-6 小时
|
||||
|
||||
8. **[SUGGESTION]** 完善后端文档注释
|
||||
- 预计时间: 1 小时
|
||||
|
||||
---
|
||||
|
||||
## 八、总结
|
||||
|
||||
### 优点
|
||||
|
||||
1. **后端实现质量高**: Rust 代码结构清晰,类型安全,文档完整
|
||||
2. **架构设计合理**: Intelligence Layer 的模块划分清晰
|
||||
3. **核心功能完整**: Pattern Detection 和 Workflow Recommendation 实现完善
|
||||
|
||||
### 需要改进
|
||||
|
||||
1. **personaStore.ts 必须重写**: 当前代码完全不可用
|
||||
2. **类型导出不完整**: 前端无法正确使用后端定义的类型
|
||||
3. **API 不一致**: 部分 Tauri 命令缺失,错误处理策略不统一
|
||||
|
||||
### 建议
|
||||
|
||||
1. **立即修复 personaStore.ts** - 这是阻塞性问题
|
||||
2. **添加 CI 检查** - 确保类似损坏代码不会合并
|
||||
3. **补充单元测试** - 防止回归问题
|
||||
|
||||
---
|
||||
|
||||
**审查完成时间**: 2026-03-25
|
||||
**下一步**: 修复 CRITICAL 问题后可继续开发
|
||||
Reference in New Issue
Block a user