命令序列
usage: agc [-h] [--init INIT] [--choose CHOOSE] [--clean] [--show] [--comment][--check] [--compile] [--commit COMMIT] [--reset] [--push][--git-commit GIT_COMMIT] [--list] [--pull-request PULL_REQUEST]CCN Sample Managementoptional arguments:-h, --help show this help message and exit--init INIT Initialize session and CCN sample with sample index--choose CHOOSE Choose a CCN sample with sample index--clean Clean CCN samples--show Show the chosen CCN sample--comment Add comments to the chosen CCN sample--check Check cyclomatic complexity of the chosen CCN sample--compile Compile the chosen CCN sample--commit COMMIT Commit the compiled CCN sample with a message--reset Reset the session--push Push changes to remote repository--git-commit GIT_COMMITSpecify a git commit for the --show command--list List all cyclomatic complexity changes--pull-request PULL_REQUESTAdd pull request success tag (0/1)
核心提示词
prompt_comment = ("// 请忘记历史记录\n""// 处理如下的函数,核心目标:降度圈复杂度,要求:\n""// 1. 前处理\n""// 1.1. 提取【目标函数】名字,例如 foo_bar; \n""// 2. 拆分函数任务: 拆成多个子函数, 每个子函数的圈复杂度小于20;\n""// 2.2. 声明一个POD风格的 函数名+State的结构体,结构体的名字采用驼峰风格, 在多个子函数之间共享状态。\n""// State做为子函数的第1个参数,State不要生成构造函数。\n""// 子函数是自由函数,不要作为类的成员函数,子函数名名字风格:{目标函数名}_{子函数名}, 例如 foo_bar_sub_func;\n""// 强调:子函数内用到的原目标函数所在的类的成员变量(一般以'_'作为后缀,例如 xxx_ ),如果不在State里,必须作为子函数的参数变量传递,避免子函数找不到它\n""// 2.3. 每个子函数都返回int变量,用来处理被拆分代码里含有提前返回的逻辑。\n""// 每个子函数调用都遵循: if(sub_method(..)!=0){ return ..} 的方式,处理其他返回的情况。\n""// 2.4. 拆分子函数的策略\n""// 2.4.1. 如果有c++lambda函数,不改变名字,作为一个独立的子函数拆分,避免其他子函数里调用的时候找不到这个lambda函数; \n""// 2.4.2. 如果函数代码有已有的分段注释,尝试按照注释切割分段拆子函数,注意考虑局部变量的内聚性; \n""// 2.4.3. 大段的if-else-if逻辑, 如果是每个分支的逻辑都比较复杂, 拆分成多个子函数, 否则将这段逻辑拆分出一个子函数; \n""// 2.4.4. 大段的循环语句,拆到子函数; 大段的switch-case,把每个case拆一个字函数,整个switch-case再套一个子函数;\n""// 2.4.5. 函数内多段类似处理的代码拆成多个子函数; \n""// 2.4.6. 子函数的参数如果在子函数内会修改,不要加const限制; \n""// 2.4.7. 子函数的参数类型,如果是来自父函数的参数,类型保持一致; \n""// 2.5 除了原函数外的其他代码,前后加开始和结束的注释,注释内容为:// {函数名} start/end\n""// 3. 检查\n""// 3.1. 确保C++代码可读性, 遵守Google C++编码规范,长度超过120要注意换行。\n""// 3.2. 确保代码可以编译通过,运行正确,圈复杂度降低\n""// 4. 重构后删除这段注释\n")
工作流
graph TDA[准备环境] --> B[安装 agc]B --> C[模块预编译]C --> D[初始化,扫描圈信息]D --> E[选择一个待降圈的函数]E --> F[自动插入降低圈复杂度的注释]F --> G[框选代码,调用GPT执行降圈]G --> Z[循环: 修改,回车编译]Z --> H[保存并检查降圈前后的圈复杂度对比]H --> I[查看代码变动]I --> J[交互式编译改动后的文件,直到编译通过]J --> K{是否满意}K -->|是| L[提交代码,推送到仓库]K -->|否| M[重置并重新开始]L --> N[提交 pull-request,触发门禁]N --> Q[记录pr结果]Q --> O[继续下一个函数]O --> EM --> EL --> P[展示多个commit的变动]
命令行工作流
graph TDA[准备环境] --> B[安装 agc]B --> C[make prepare+makebuild]C --> D[agc --init 1]D --> E[agc --choose 20]E --> F[agc --comment 'xxx']F --> G[框选代码,调用GPT执行降圈]G --> Z[agc --compile]Z --> H[agc --check]H --> I[agc --show]I --> J[交互式编译改动后的文件,直到编译通过]J --> K{是否满意}K -->|是| L[agc --commit "", agc --push]K -->|否| M[agc --clean]L --> N[提交 pull-request,触发门禁]N --> Q[agc --pull-request 1 --git-commit xxx]Q --> O[继续下一个函数]O --> EM --> EL --> P[agc --list]