Don't repeat yourself,让 AI 高效、准确的干活 - (三)git 分支命名、commit 信息生成

337 阅读3分钟

image.png

上图中文字内容:1449016 【PC客户端】锁屏界面-锁屏状态体验优化+登录页换图

这是一个需求标题,需要根据这个标题生成 git 分支名称以及 git commit 信息。格式如下:

分支名:feat/T1449016_lock-screen-ui-enhancements

commit 信息: feat(T1449016): #1449016/【PC客户端】锁屏界面-锁屏状态体验优化+登录页换图

为什么是这个格式,团队规范,公司要求

接下来本文介绍如何以最快的速度生成如上格式的信息。

工具为 uTools 的 “自动化脚本” 插件。

分支名生成

使用 OCR 识别出截图内容,代码如下:

 const availableFormats = clipboard.availableFormats('clipboard');
  if (!availableFormats.some((s) => s.includes('image'))) {
    return '剪贴板里没有截图';
  }
  const base64 = clipboard.readImage('clipboard').toDataURL();
  const ocrRes = await ocr({ base64, model: 'ocr_system' });

硬编码处理 OCR 识别的结果:

 const ocrRes = await ocr({ base64, model: 'ocr_system' });
  let task = '';
  let title = '';
  if (ocrRes.result?.texts && ocrRes.result.texts.length > 1) {
    task = ocrRes.result.texts[0].trim();
    title = ocrRes.result.texts[1].trimStart();
  } else {
    const result = ocrRes.result?.texts?.[0]?.trimStart() || '';
    const match = result.match(/^(\d+)(.*)/);
    if (match) {
      task = match[1]; // 开头的数字部分
      title = match[2]; // 其余的内容
    }
  }

拼接 prompt,让 AI 进行翻译:

 const requestPrompt = `
下面是一个需求的简要索说明,需要根据这个说明创建 git 分支,请给出英文分支名,不要直接翻译,要自然、流畅和地道,不要加 feature、feat 等分支特性,用户自己处理

'''
${title}
'''
`;

拼接最终分支名称:

export const askChatGPT = async (data: {
  messages: LLMMessage;
  handleChunk: (chunck: string) => void;
  form: {
    task: string;
  };
}) => {
  const res = await askOpenai({ ...data });
  data.handleChunk(`
	
完整分支名:
\`\`\`
feat/T${data.form.task}_${res.content.replace(/```/g, '').replace(/`/g, '')}
\`\`\`		
`);
  return res;
};

最终效果如下:

utools-9.gif

commit 信息生成

逻辑比较简单,全部都是通过硬编码实现,没有借助 AI :

export const bootstrap = async (scriptFile?: string) => {
  const availableFormats = clipboard.availableFormats('clipboard');
  if (!availableFormats.some((s) => s.includes('image'))) {
    return '剪贴板里没有截图';
  }
  const base64 = clipboard.readImage('clipboard').toDataURL();
  const ocrRes = await ocr({ base64, model: 'ocr_system' });
  if (ocrRes.result?.texts && ocrRes.result.texts.length > 1) {
    const task = ocrRes.result.texts[0].trim();
    const title = ocrRes.result.texts[1].trimStart();
    utools.outPlugin();
    utools.hideMainWindowPasteText(`feat(T${task}): #${task}/${title}`);
  } else {
    const result = ocrRes.result?.texts?.[0]?.trimStart() || '';
    const match = result.match(/^(\d+)(.*)/);
    if (match) {
      const task = match[1]; // 开头的数字部分
      const title = match[2]; // 其余的内容
      utools.outPlugin();
      utools.hideMainWindowPasteText(`feat(T${task}): #${task}/${title}`);
    } else {
      return result;
    }
  }
};

utools 的 hideMainWindowPasteText 方法能直接将文本粘贴到光标所在的位置。

效果如下:

utools-8.gif

获取当前用户最近一次 commit 信息

我在开发同一个需求的时候,所有的 commit 信息都是同一个,所以用截图生成了第一次 commit 之后,后面所有的提交都是使用同样的 commit。

这是一个新的 uTools 自动化脚本,代码如下:

carbon.png

getShareData 方法是获取 vscode 当前活动窗口的根目录,uTools 和 vscode 是两个独立的进程,所以我的方案是 vscode 插件中监听窗口的切换事件,将当前活动的窗口根目录写入本地文件中,uTools 再从文件中读取,一个曲线救国的方案。

执行效果如下:

utools-7.gif

优化

上面使用了硬编码处理 OCR 识别到结果,而且生成分支名的代码中,打开 AI 会话界面的时候,还涉及了表单数据的传递,这个问题当时头疼了好久都没有想到好的方案。

utools.redirect(['lowcode', 'lowcode'], {
      type: 'text',
      data: JSON.stringify({
        scriptFile,
        route: '/chat',
        content: requestPrompt,
        form: { // 传递表单数据
          task, 
        },
      }),
    });

接收表单:

carbon1.png

接下来优化一下方案,使用 AI 处理 OCR 识别后的结果。

定义 TS 类型,让 AI 按类型定义处理文本

export type TaskInfo = {
  // 需求 id,用户发送内容的开头数字部分
  taskId: string;
  // 需求标题,用户发送内容去掉开头数字部分,请翻译成英文,不要直接翻译,要自然、流畅和地道,这部分内容会作为 git 分支名,请用中划线代替翻译后的空格
  taskTitle: string;
};

最终效果如下:

image.png