Inkstone(砚)· proto-10 · Review 报告 面

代码审阅批注

需修改
审阅范围 3 个文件 / +86 −24 / 置信度 94% / 耗时 1.4s
批注综述 — 整体变更逻辑结构清晰,契约边界划分良好。但存在 1 处高危路径遍历隐患(允许通过相对路径越界逃逸出安全工作区),以及 1 处异步竞态无 Abort 信号的问题。修复 P0 补丁后建议合入。
综合维度盘点
维度 状态 重点关注
安全与边界 P0 阻断 入参未过滤 ../,存在路径越界写入风险
逻辑与竞态 P1 警告 快速切换 session 时旧请求覆盖新状态(缺少 signal)
架构与依赖 良好 严格遵守单向依赖原则,无循环引用
测试覆盖 需补充 核心边界校验分支缺少单元测试
审查发现 3
P0 路径拼接缺少工作区防穿越校验 paths.ts:45-48
成因:直接调用 path.resolve(root, userInput),畸形入参(../../etc/passwd)可逃逸出工作区沙箱。
推荐补丁TypeScript
export function getTargetFilePath(root: string, userInput: string): string {
- const targetPath = path.resolve(root, userInput);
+ const targetPath = resolveSafeRelativePath(root, userInput);
+ if (!targetPath) throw new SecurityBoundaryError('Path traversal: ' + userInput);
return targetPath;
}
P1 异步加载未传递 AbortController 信号 use-review-subagent-results.ts:32
成因:hostClient.request 未挂载 AbortSignal,高频切换 session 时慢响应覆写新状态。
推荐补丁TypeScript
const reload = useCallback(async (): Promise<void> => {
- const response = await hostClient.request({ type: 'subagent/results', parentSessionId: sessionId });
+ const response = await hostClient.request({ type: 'subagent/results', parentSessionId: sessionId }, { signal });
if (response.success) setResults(response.data.items ?? []);
}, [hostClient, sessionId]);
P2 硬编码颜色未对接 Inkstone Token region-inspector.css:88
成因:直接写入 #17161b,切换墨面时无法自动反色。
推荐补丁CSS
.inspector-summary-title {
- color: #17161b;
+ color: var(--t1);
font-weight: 600;
}
验证清单
TypeScript 类型全仓通过 (pnpm typecheck)
现有单元测试无回归
需补写路径穿越防御单测 (paths.test.ts)
"采纳补丁"自动应用修复到工作区