Zhengqbbb / cz-git

cz-git | czg 🛠️ DX first and more engineered, lightweight, customizable, standard output format Commitizen adapter and CLI
https://cz-git.qbb.sh
MIT License
1.12k stars 41 forks source link

feat(cz-git): add `customOptions` can repeat questions to get answers #105

Closed danyow closed 1 year ago

danyow commented 1 year ago

Related ISSUE

Input follow ISSUE URL address

Type Of Change

Clear Describe

A clear and concise description of what update for target.

Description

Please enter detailed relevant motivation, background and implementation ... descriptive information.

Test Case

Please describe the tests

that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test case.

add customOption

    customOptions: [
      {
        name: 'subject',
        customScopesAlign: 'bottom',
        customScopesAlias: 'custom',
        emptyScopesAlias: 'empty',
        allowCustomScopes: true,
        allowEmptyScopes: true,
        messages: {
          subject: '填写简短精炼的变更描述 :\n',
          generatingByAI: '正在用AI生成你的标题...',
        },
        types: [
          { name: '占位符', value: 'null'},
        ],
        skipQuestions: ['body', 'breaking', 'confirmCommit', 'footer', 'footerPrefix', 'scope'],
        useAI: true,
        maxSubjectLength: 15,
        aiQuestionCB: ({
          maxSubjectLength,
          diff,
          answers,
        }) => {
          return `
          \`\`\`diff\n${diff}\n\`\`\`
          ${maxSubjectLength}个字符以内以 Git diff 代码针对以上内容写一个有见解中文提交消息
          回答的模板如下:
          完成xx需求, 修复xx bug
          `
        }
      },
      {
        name: '描述',
        customScopesAlign: 'bottom',
        customScopesAlias: 'custom',
        emptyScopesAlias: 'empty',
        allowCustomScopes: true,
        allowEmptyScopes: true,
        messages: {
          subject: '填写更加详细的变更描述。\n',
          generatingByAI: '正在用AI生成你的描述...',
        },
        types: [
          { name: '占位符', value: 'null'},
        ],
        skipQuestions: ['body', 'breaking', 'confirmCommit', 'footer', 'footerPrefix', 'scope'],
        useAI: true,
        maxSubjectLength: 50,
        aiQuestionCB: ({
          maxSubjectLength,
          diff,
          answers,
        }) => {
          return `
          \`\`\`diff\n${diff}\n\`\`\`
          ${maxSubjectLength}个字符以内以 Git diff 代码针对以上内容写一个有见解中文提交消息
          回答的模板如下:
          完成xx需求, 
          修复xx bug
          `
        }
      },
    ],

modify the formatMessageCB

    formatMessageCB: ({ defaultHeader, body, breaking, footer, answers }) => {

      let result = defaultHeader
      if (body)
        result += `\n\n${body}`

      if (breaking)
        result += `\n\nBREAKING CHANGE: ${breaking}`

      if (footer)
        result += `\n\n${footer}`
      const defaultKeys = ['type', 'scope', 'subject', 'footerPrefix']
      const keys = Object.keys(answers).filter(t => !defaultKeys.includes(t) && answers[t])
      keys.forEach(key => {
        result += `\n\n${key}: ${answers[key]}`
      });

      return result + coAuthoredBy
    },

https://user-images.githubusercontent.com/15705152/225779833-6a402cd5-3551-45b4-a8c3-f8c13bfa128f.mp4

netlify[bot] commented 1 year ago

Deploy request for cz-git pending review.

Visit the deploys page to approve it

Name Link
Latest commit faa87be7b3dee6e40625c724ab6da76d50ef0f09
Zhengqbbb commented 1 year ago

IMHO, Why not choose retry on there ? 🤔

image
danyow commented 1 year ago

恕我直言,为什么不选择那里?retry🤔

图像

直接中文了, 首先,这次提交并不是着重说想要加入retry这个功能的,这只是个附带功能 核心的目的是让问题变得更多,同时也需要每个问题都能使用 AI 生成答案 再说你的问题,你得 retry 是全部流程走一遍的 retry 我的只是希望 ai 生成失败时再 retry 一次 或者 skip

简单来说 重点是 image

也就是说如果 customOption 足够多就可以生成更多想要的内容

Zhengqbbb commented 1 year ago

这只是个附带功能 核心的目的是让问题变得更多,同时也需要每个问题都能使用 AI 生成答案 再说你的问题,你得 retry 是全部流程走一遍的 retry 我的只是希望 ai 生成失败时再 retry 一次 或者 skip 也就是说如果 customOption 足够多就可以生成更多想要的内容

很抱歉,我不能认同这个功能点,Conventional Commit 是指在突出重点的同时简要阐述信息的约定 这也是我为什么只做了 AI 生成简短描述,更多为了是快速提交普通提交消息以及提供基础模版 如果你要大量的补充消息,那么就意味着真的要认真地来写更多你要表达的详细信息

当然我也注意到可能网络或结果不满意,需要 retry 功能点而不是 exit,所以下个版本我会基于你的分支完成这个功能点

image
danyow commented 1 year ago

那么如果我既要 ai 帮我生成简短阐述信息,但是我需要填写 scope 还有一些再我们项目里面必须填写的所谓的一些规范。这时当下的功能就只能再生成之后再手动修改自己添加,对应一个 懒惰 的程序员来说,我是不想这么做的。

所以我也是添加了 customOptions 这个可有可无的字段以用来重复提问而已。 目前我演示的视频里面只放了 简述详细描述 这两个问题 但我实际生产过程中,会存在更多的信息。 里面部分类似可多选的 scope,例如我们项目里的机型 还有需要希望 ai 生成的详细描述,或者改动点 还有一些和CI相关的,是否构建项目的选项等等若干问题

对于使用者来说,如果不填写 customOptions 和原项目一模一样, 但是如果有像我这种,需要多个问题来构建一次提交信息的,就可以有更多可以折腾的点。

Zhengqbbb commented 1 year ago

我们项目里面必须填写的所谓的一些规范; 实际生产过程中,会存在更多的信息;对应一个 懒惰 的程序员来说,我是不想这么做的

明白,也许 懒惰 的程序员会选择 squash merge PR来管理 repo。 主分支只记录merge commit,每次合并时做好最后一步的摘录提要和信息补充 😜 开发模式尽可能不要被 commit 束缚

这个需求我依然保持开放性,我会在这下下个周末好好考虑该功能 这个星期我太累了 Tip 但如果真的很多很多规范要遵循,你真的要好好考虑 squash merge PR

image image
danyow commented 1 year ago

怎么说呢,对于我们的项目无法很 规范 因为我们同时存在多个主分支,而且也需要频繁的 commit 以构建工程来做真机调试 那么每次的修改信息可以是少量多次,或者是在一天内从多个主分支上产生新的分支来修改多个问题并 commit, 在我们项目中,所以问题的溯源和需求的路线也是需要知道的。

danyow commented 1 year ago

怎么说呢,对于我们的项目无法很 规范 因为我们同时存在多个主分支,而且也需要频繁的 commit 以构建工程来做真机调试 那么每次的修改信息可以是少量多次,或者是在一天内从多个主分支上产生新的分支来修改多个问题并 commit, 在我们项目中,所以问题的溯源和需求的路线也是需要知道的。

因为我是做 unity 的, 很多unity的工程你能可见的 2021.x.xx 2020.x.xx 2019.x.xx 5.xx 等等这类的分支,代表着不同的 unity 版本号。

Zhengqbbb commented 1 year ago

😨哥 你这个 fork publish 做自己的自定义版本会更适合,没关系的。 我必须要对其他使用我依赖包的人负责,希望你能理解