上图中文字内容: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;
};
最终效果如下:
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 方法能直接将文本粘贴到光标所在的位置。
效果如下:
获取当前用户最近一次 commit 信息
我在开发同一个需求的时候,所有的 commit 信息都是同一个,所以用截图生成了第一次 commit 之后,后面所有的提交都是使用同样的 commit。
这是一个新的 uTools 自动化脚本,代码如下:
getShareData 方法是获取 vscode 当前活动窗口的根目录,uTools 和 vscode 是两个独立的进程,所以我的方案是 vscode 插件中监听窗口的切换事件,将当前活动的窗口根目录写入本地文件中,uTools 再从文件中读取,一个曲线救国的方案。
执行效果如下:
优化
上面使用了硬编码处理 OCR 识别到结果,而且生成分支名的代码中,打开 AI 会话界面的时候,还涉及了表单数据的传递,这个问题当时头疼了好久都没有想到好的方案。
utools.redirect(['lowcode', 'lowcode'], {
type: 'text',
data: JSON.stringify({
scriptFile,
route: '/chat',
content: requestPrompt,
form: { // 传递表单数据
task,
},
}),
});
接收表单:
接下来优化一下方案,使用 AI 处理 OCR 识别后的结果。
定义 TS 类型,让 AI 按类型定义处理文本
export type TaskInfo = {
// 需求 id,用户发送内容的开头数字部分
taskId: string;
// 需求标题,用户发送内容去掉开头数字部分,请翻译成英文,不要直接翻译,要自然、流畅和地道,这部分内容会作为 git 分支名,请用中划线代替翻译后的空格
taskTitle: string;
};
最终效果如下: