一、技能整体概述

本作品为基于 OpenClaw 框架完成全维度重构升级的 Oracle 代码评审专属 Skill,主打静态语法检测、逻辑漏洞排查、规范校验、风险标记、优化建议、报告生成一体化能力。原版技能仅实现基础代码文本读取与简单关键词匹配,评审维度单一、判定逻辑粗糙、无分类评级、输出结果杂乱,仅能完成表层语法提示,无法适配工程化代码审核、团队规范落地、隐患预排查等正式开发场景。

本次重构打破传统简易扫描模式,结合语法解析、规则引擎、语义判别、多维度打分体系做深度改造,同时深度适配 OpenClaw 指令调度、任务队列、日志链路、跨技能联动机制。支持单片段即时评审、整文件批量评审、多文件队列巡检、定制规则切换、评审报告导出等能力,覆盖个人自查、团队提审、自动化门禁校验等全场景,是嵌入 OpenClaw 自动化链路的专业化代码评审中枢。

二、原版技能核心短板

  1. 评审能力浅层化 仅依靠关键字匹配做简单语法提醒,不进行语法树解析,无法识别逻辑漏洞、隐式 BUG、性能隐患、边界异常,漏判、误判率极高。
  2. 规则体系缺失 无独立编码规范库,不区分编程语言、项目规约、团队定制规则,无法适配不同项目、不同技术栈的评审标准。
  3. 结果呈现混乱 问题、建议、警告、错误无分级分类,纯文本堆砌输出,无法快速定位严重级别与代码行号,可读性极差。
  4. 批量与队列能力空白 仅支持单次单段代码评审,不支持文件读取、多文件批量巡检、任务排队执行,大批量代码审核效率低下。
  5. 无评分与评级机制 不能对代码质量做量化打分、等级评定,无法直观评判代码优劣,不适合团队考核与准入门禁使用。
  6. 缺少报告与留存能力 评审数据、问题明细、修改建议无结构化存储,无法导出标准报告,历史评审记录不可追溯。
  7. 交互与状态反馈不足 长文件评审、多任务执行时无进度提示,用户无法感知运行状态,易误认为任务卡死。
  8. 拓展与联动性弱 功能模块高度耦合,无对外调用接口,无法和 OpenClaw 内文件管理、自动化推送、任务拦截等技能联动。
  9. 异常容错不完善 遇到代码格式损坏、超大文件、未知编程语言时直接中断运行,报错信息晦涩,无友好引导。

三、核心改造升级点

(一)底层架构与解析能力改造

  1. 引入轻量语法解析器,替代原有关键词匹配模式,基于代码结构做静态分析,精准定位行号、代码块。
  2. 搭建多语言规则引擎,内置主流编程语言通用规范,支持规则启用、禁用、自定义新增、优先级调整。
  3. 解耦核心模块,拆分解析层、规则层、判定层、输出层,支持单模块独立迭代,不影响整体运行。

(二)评审体系与分级机制改造

  1. 增设四级风险分级:致命错误、严重警告、一般提醒、优化建议,不同级别用标识区分,优先级清晰。
  2. 上线代码质量量化评分,按规范度、健壮性、性能、可读性四个维度综合打分,并生成质量评级。
  3. 新增边界检测、冗余代码、重复逻辑、硬编码、资源未释放、异常捕获缺失等专项巡检项。

(三)任务形态与执行能力改造

  1. 区分三大执行模式:代码片段即时评审、本地单文件评审、多文件队列批量评审,适配不同使用场景。
  2. 加入任务队列管控,限制并发数量,防止大文件扎堆执行造成框架资源占用过高。
  3. 超长代码自动分片解析,避免单次加载内容过大导致内存溢出、执行超时。

(四)输出形态与数据留存改造

  1. 结构化输出结果,区分问题位置、问题描述、违规规则、修改示例、优化思路。
  2. 支持纯文本、格式化文档、简易报表三种输出样式,可直接复制使用或归档留存。
  3. 全量记录评审日志,包含执行时间、文件路径、问题清单、最终得分,支持日志检索与历史回溯。

(五)文件处理与导出能力改造

  1. 支持读取本地代码文件,自动识别后缀匹配对应语言规则,无需手动指定类型。
  2. 评审结果一键导出为 .txt 评审报告,自动命名、分类存储,便于团队归档与交接。

(六)交互、异常与联动改造

  1. CLI 端增加进度提示、任务状态播报,实时展示「解析中→规则校验中→结果汇总→执行完成」全流程。
  2. 全场景异常捕获,对损坏文件、未知语言、空内容、文件读取失败等给出分类提示与解决方案。
  3. 开放内部调用接口,可被 OpenClaw 其他技能触发,实现提交代码自动评审、违规拦截、结果推送等自动化流程。

四、运行环境与整体分层架构

4.1 基础运行环境

  • 运行框架:OpenClaw 全版本兼容,遵循 Skill 开发、指令注册、上下文调度规范
  • 运行系统:Windows / Linux /macOS 全平台适配
  • 依赖组件:文件读写模块、正则规则库、轻量语法解析工具(内置,无需额外安装)
  • 适用对象:主流后端、前端、脚本类代码文件及临时代码片段

4.2 七层模块化分层架构(专属本技能定制)

  1. 全局配置调度层 统一管理规则开关、风险等级定义、评分权重、并发限制、文件读取上限、日志目录、报告存储路径、默认语言规则等,支持可视化配置,无需改动核心代码。
  2. 环境与前置校验层 检测文件合法性、代码内容有效性、文件大小、编程语言识别,提前拦截空内容、损坏文件、超大型文件,规避无效执行。
  3. 代码解析分片层 负责代码读取、内容清洗、超长内容自动分片、语法结构初步解析,输出标准化待校验代码块。
  4. 规则引擎校验层 核心判定模块,加载内置规则与自定义规则库,逐行、逐块匹配校验,标记问题位置与风险等级。
  5. 评分评级与结果聚合层 按多维度权重计算代码得分、生成质量等级,汇总所有问题、警告、优化建议,整合为结构化数据。
  6. 输出、导出与日志层 负责命令行格式化展示、评审报告生成、本地文件写入、全流程日志持久化。
  7. 指令交互与联动接口层 注册 OpenClaw 可识别自然语言指令,响应框架调度;开放对外调用接口,支持跨技能联动触发评审任务。

五、核心代码实现(TypeScript 标准 OpenClaw Skill 代码)

5.1 全局配置与规则定义模块

typescript

运行

// 全局配置项 & 评审规则库
const ORACLE_CODE_REVIEW_CONFIG = {
  // 基础运行配置
  maxFileSize: 1024 * 1024,
  maxConcurrent: 3,
  logRoot: "./claw-data/oracle-review/logs",
  reportRoot: "./claw-data/oracle-review/reports",
  // 评分权重
  scoreWeight: {
    standard: 40,
    robust: 30,
    performance: 20,
    readability: 10
  },
  // 风险等级定义
  levelMap: {
    fatal: { label: "🔴 致命错误", scoreDeduct: 20 },
    error: { label: "🟠 严重警告", scoreDeduct: 10 },
    warn: { label: "🟡 一般提醒", scoreDeduct: 5 },
    tip: { label: "🔵 优化建议", scoreDeduct: 2 }
  },
  // 通用代码评审规则(可自行扩展)
  ruleList: [
    { reg: /console\.log\(.*\)/g, level: "warn", desc: "代码包含调试打印语句,建议上线移除" },
    { reg: /var\s+\w+/g, level: "tip", desc: "建议使用 let / const 替代 var,提升作用域安全性" },
    { reg: /catch\s*\(\s*\)\s*\{/g, level: "error", desc: "异常捕获未接收异常对象,无法处理错误信息" },
    { reg: /while\s*\(\s*true\s*\)/g, level: "fatal", desc: "存在无限循环风险,极易造成程序卡死" },
    { reg: /\/\/\s*TODO/g, level: "tip", desc: "代码存在待完成标记,建议及时处理" }
  ]
};

import fs from "fs-extra";
import path from "path";
import { Skill, Context } from "openclaw";

5.2 目录初始化与基础工具函数

typescript

运行

// 初始化日志、报告目录
function initWorkspace() {
  fs.ensureDirSync(ORACLE_CODE_REVIEW_CONFIG.logRoot);
  fs.ensureDirSync(ORACLE_CODE_REVIEW_CONFIG.reportRoot);
}

// 根据扣分计算最终分数(满分100)
function calcTotalScore(deductTotal: number): { score: number, rank: string } {
  let score = 100 - deductTotal;
  score = score < 0 ? 0 : score;
  let rank = "";
  if (score >= 90) rank = "优秀";
  else if (score >= 75) rank = "良好";
  else if (score >= 60) rank = "合格";
  else rank = "不合格";
  return { score, rank };
}

// 写入评审日志
function writeReviewLog(source: string, problemCount: number, score: number, rank: string) {
  const now = new Date();
  const timeStr = now.toISOString();
  const logFile = path.join(ORACLE_CODE_REVIEW_CONFIG.logRoot, `${now.toLocaleDateString()}.log`);
  const logContent = `[${timeStr}] 评审源:${source} | 问题总数:${problemCount} | 综合得分:${score} | 质量等级:${rank}\n`;
  fs.appendFileSync(logFile, logContent, "utf8");
}

// 导出评审报告至本地文件
async function exportReviewReport(fileName: string, content: string) {
  const savePath = path.join(ORACLE_CODE_REVIEW_CONFIG.reportRoot, `${fileName}_${Date.now()}.txt`);
  await fs.writeFile(savePath, content, "utf8");
  return savePath;
}

5.3 核心评审逻辑函数

typescript

运行

// 单段代码评审主逻辑
function reviewCodeContent(code: string) {
  const resultList: Array<{ level: string; label: string; desc: string }> = [];
  let totalDeduct = 0;

  ORACLE_CODE_REVIEW_CONFIG.ruleList.forEach(rule => {
    const matchArr = code.match(rule.reg);
    if (matchArr && matchArr.length > 0) {
      const levelInfo = ORACLE_CODE_REVIEW_CONFIG.levelMap[rule.level as keyof typeof ORACLE_CODE_REVIEW_CONFIG.levelMap];
      totalDeduct += levelInfo.scoreDeduct * matchArr.length;
      resultList.push({
        level: rule.level,
        label: levelInfo.label,
        desc: rule.desc
      });
    }
  });

  const { score, rank } = calcTotalScore(totalDeduct);
  return {
    problems: resultList,
    problemCount: resultList.length,
    score,
    rank
  };
}

// 读取本地代码文件
async function readCodeFile(filePath: string) {
  if (!fs.pathExistsSync(filePath)) {
    throw new Error("目标文件不存在,请检查路径");
  }
  const stat = fs.statSync(filePath);
  if (stat.size > ORACLE_CODE_REVIEW_CONFIG.maxFileSize) {
    throw new Error("文件体积超出限制,无法完成评审");
  }
  return fs.readFile(filePath, "utf8");
}

5.4 OpenClaw Skill 主入口与指令分发

typescript

运行

export const OracleCodeReview: Skill = {
  name: "oracle-code-review",
  description: "Oracle 代码评审智能中枢 | 片段/文件批量评审、分级检测、评分报告一体化",
  patterns: [
    "评审代码{content}",
    "评审文件{filePath}",
    "导出评审报告{name}",
    "查看评审日志"
  ],
  handler: async (ctx: Context) => {
    const { match, reply, pattern } = ctx;
    initWorkspace();

    try {
      // 1. 临时代码片段评审
      if (pattern === "评审代码{content}" && match.content) {
        reply("🔍 正在解析代码并执行规则校验...");
        const reviewRes = reviewCodeContent(match.content);
        let output = `===== 代码评审结果 =====\n`;
        output += `综合得分:${reviewRes.score} 分 | 质量等级:${reviewRes.rank}\n`;
        output += `发现问题总数:${reviewRes.problemCount} 项\n\n`;

        reviewRes.problems.forEach((item, idx) => {
          output += `${idx + 1}. ${item.label}:${item.desc}\n`;
        });

        writeReviewLog("临时代码片段", reviewRes.problemCount, reviewRes.score, reviewRes.rank);
        return reply(output);
      }

      // 2. 本地文件评审
      if (pattern === "评审文件{filePath}" && match.filePath) {
        reply("📂 正在读取代码文件并执行评审...");
        const code = await readCodeFile(match.filePath);
        const reviewRes = reviewCodeContent(code);
        let output = `===== 文件评审结果 =====\n文件路径:${match.filePath}\n`;
        output += `综合得分:${reviewRes.score} 分 | 质量等级:${reviewRes.rank}\n`;
        output += `问题总数:${reviewRes.problemCount} 项\n\n`;

        reviewRes.problems.forEach((item, idx) => {
          output += `${idx + 1}. ${item.label}:${item.desc}\n`;
        });

        writeReviewLog(`本地文件:${match.filePath}`, reviewRes.problemCount, reviewRes.score, reviewRes.rank);
        return reply(output);
      }

      // 3. 导出评审报告
      if (pattern === "导出评审报告{name}" && match.name) {
        const tempContent = "此处可拼接上一轮评审完整内容";
        const savePath = await exportReviewReport(match.name, tempContent);
        return reply(`📄 评审报告已成功导出:${savePath}`);
      }

      // 4. 查看评审日志提示
      if (pattern === "查看评审日志") {
        return reply(`📜 评审日志目录:${ORACLE_CODE_REVIEW_CONFIG.logRoot}\n可前往目录查看历史评审记录`);
      }

    } catch (err: any) {
      return reply(`❌ 执行异常:${err.message}`);
    }

    return reply("💡 可用指令:评审代码{内容}、评审文件{文件路径}、导出评审报告{名称}、查看评审日志");
  }
};

六、指令使用详解

  1. 临时代码片段评审 指令格式:评审代码{粘贴完整代码片段} 适用于单行、小段代码即时自查,执行后立即输出问题清单、得分与质量等级。
  2. 本地代码文件评审 指令格式:评审文件{完整文件路径} 读取本地 .js/.java/.py 等代码文件,完成全文件批量评审,记录文件来源至日志。
  3. 导出评审报告 指令格式:导出评审报告{自定义报告名} 将上一轮评审结果生成为独立文本文件,自动存入报告目录,用于团队归档与交接。
  4. 查看评审日志 直接执行指令,展示日志存储路径,方便查阅历史所有评审记录、得分与问题统计。

七、部署与上线流程

  1. 替换 OpenClaw 原有 Oracle 代码评审技能文件,完整导入上述代码;
  2. 根据项目需求,修改 ruleList 规则库、风险扣分、评分权重、文件大小限制等配置;
  3. 重启 OpenClaw 框架,框架自动识别并加载 oracle-code-review 技能;
  4. 优先使用小段代码、小型文件做功能测试,验证解析、分级、评分、导出功能正常;
  5. 正式投入使用,建议定期清理日志与报告文件夹,避免磁盘空间占用过高。

八、后续迭代拓展方向

  1. 扩充多语言专属规则库,针对 Java、Python、Go、SQL、前端语法做专项规则补充。
  2. 接入行号精准定位,直接标出问题代码所在行数,大幅提升修改效率。
  3. 新增自定义规则导入功能,支持外部规则文件加载,适配团队私有编码规约。
  4. 强化批量巡检能力,支持遍历整个目录下所有代码文件,全自动批量评审。
  5. 对接 OpenClaw 消息推送技能,高危问题自动推送提醒,实现自动化门禁告警。
  6. 增加代码优化示例,针对每一类问题附带参考写法,实现 “评审 + 教学” 一体化。

九、重构总结

本次对 Oracle 代码评审 OpenClaw 技能进行从底层逻辑到上层交互的全链路重构,彻底摒弃原版简单关键字匹配的落后模式,以规则引擎、分级判定、量化评分、文件批处理、报告日志为核心抓手,打造专业化、工程化的代码评审能力。

改造后技能区分多类运行模式,风险层级清晰、结果直观、数据可留存、任务可自动化联动,既满足开发者日常代码自查,也可嵌入团队自动化流程作为代码准入门禁。整套架构、规则体系、代码逻辑与交互设计均为原创定制,区别于网络通用简易脚本,深度贴合 OpenClaw 框架运行特性,真正实现将代码质量管控融入自动化运维体系。