掃描并修復(fù)代碼中的 FIXME 注釋)
人工智能AI Agent代碼智能體AI 應(yīng)用CLI開發(fā)工具【免費(fèi)下載鏈接】forgecodeAI enabled pair programmer for Claude, GPT, O Series, Grok, Deepseek, Gemini and 300 models項(xiàng)目地址https://gitcode.com/gh_mirrors/forge39/forgecode點(diǎn)擊查看免費(fèi)下載fixme是 Forge 內(nèi)置的快捷命令slash command它讓 AI 自動(dòng)遍歷當(dāng)前項(xiàng)目源碼文件中的FIXME注釋并逐一嘗試修復(fù)對應(yīng)代碼。本文以 .forge/commands/fixme.md 為骨架結(jié)合倉庫中命令加載、解析與優(yōu)先級的源碼實(shí)現(xiàn)講解該命令的文件格式、工作原理、注冊機(jī)制以及如何舉一反三編寫屬于自己的自定義命令。1.fixme命令是什么fixme是 ForgeAI enabled pair programmer預(yù)置的一條內(nèi)置命令。它的完整定義存放在倉庫根目錄的 .forge/commands/fixme.md全文如下--- name: fixme description: Looks for all the fixme comments in the code and attempts to fix them --- Find all the FIXME comments in source-code files and attempt to fix them.它的語義非常直接掃描源碼文件里所有FIXME注釋然后嘗試修復(fù)它們。也就是說當(dāng)你在 Forge 對話中敲入:fixmeAgent 會(huì)先通過文件搜索定位所有包含F(xiàn)IXME標(biāo)記的源碼文件再逐條分析注釋上下文、判斷遺留問題并直接動(dòng)手修改代碼把問題修掉。在 crates/forge_app/src/fixtures/git_ls_files_many_extensions.txt 這個(gè)倉庫自帶的目錄清單 fixture 中可以看到.forge/commands/fixme.md與check.md、pr_description.md一同出現(xiàn)在.forge/commands/目錄下印證了這類命令文件正是以獨(dú)立 Markdown 文件的形式存在于該目錄中。2. 命令文件的結(jié)構(gòu)YAML frontmatter Markdown 正文從fixme.md可以看出Forge 的每條自定義命令都由兩部分組成YAML frontmatter元數(shù)據(jù)區(qū)位于文檔開頭的---與---之間用于聲明命令的name與description。Markdown 正文提示詞區(qū)frontmatter 之后的所有內(nèi)容就是真正發(fā)給模型的提示詞prompt指導(dǎo) Agent 如何執(zhí)行該命令。這套格式在源碼中被嚴(yán)格建模。Command結(jié)構(gòu)體定義于 crates/forge_domain/src/command.rs注釋明確寫著命令從 Forge 的命令目錄中發(fā)現(xiàn)的.md文件中加載name和description來自 YAML frontmatterprompt則是文件正文pub struct Command { /// 調(diào)用該命令時(shí)使用的名字如 github-pr-description pub name: String, /// 在命令列表中展示的簡短描述 pub description: String, /// 提示詞模板正文frontmatter 之后的 Markdown 內(nèi)容 pub prompt: OptionString, }解析邏輯在 crates/forge_services/src/command.rs 的parse_command_file函數(shù)中先用gray_matter庫以 YAML 引擎解析 frontmatter再做類型安全的反序列化最后把正文部分掛到prompt字段上fn parse_command_file(content: str) - ResultCommand { let gray_matter Matter::YAML::new(); let result gray_matter.parse::Command(content)?; let command result .data .context(Empty command frontmatter)? .prompt(result.content); Ok(command) }Command結(jié)構(gòu)體上標(biāo)注了#[derive(Deserialize)]因此 frontmatter 中的name、description會(huì)被自動(dòng)映射為結(jié)構(gòu)體字段frontmatter 缺失時(shí)解析會(huì)報(bào)錯(cuò)Empty command frontmatter。這一點(diǎn)與fixme.md嚴(yán)格成對出現(xiàn)的name/description鍵完全一致。倉庫測試 crates/forge_services/src/command.rs 中的用例也驗(yàn)證了這一格式test_parse_basic_command用 fixture basic.md 斷言name、description與prompt都被正確解析test_parse_command_with_multiline_prompt則用 multiline.md 驗(yàn)證正文支持多行 Markdown步驟列表等也就是說像fixme這樣的正文完全可以寫得非常詳細(xì)Agent 會(huì)完整讀取。3.fixme命令的注冊與加載機(jī)制fixme不是寫在二進(jìn)制里的硬編碼邏輯而是以標(biāo)準(zhǔn)命令文件的形式被加載器統(tǒng)一發(fā)現(xiàn)并注冊。整條鏈路在 crates/forge_services/src/command.rs 的CommandLoaderService中實(shí)現(xiàn)加載內(nèi)置命令init_default()先把二進(jìn)制內(nèi)嵌的命令如github-pr-description源碼見 commands/github-pr-description.md加載進(jìn)來作為最低優(yōu)先級。加載全局自定義命令從command_path()默認(rèn)base_path/commands即~/forge/commands讀取所有*.md文件。加載項(xiàng)目本地命令從command_path_local()讀取項(xiàng)目根目錄下的.forge/commands/目錄fixme.md正是在這一層被發(fā)現(xiàn)的。解決命名沖突resolve_command_conflicts用 HashMap 按名字去重、保留最后一條從而形成項(xiàng)目本地 全局自定義 內(nèi)置的優(yōu)先級順序。命令目錄的路徑定義在 crates/forge_domain/src/env.rs/// 全局命令目錄base_path/commands pub fn command_path(self) - PathBuf { self.base_path.join(commands) } /// 項(xiàng)目本地命令目錄.forge/commands pub fn command_path_local(self) - PathBuf { self.cwd.join(.forge/commands) }目錄掃描由init_command_dir完成目錄不存在時(shí)直接返回空存在時(shí)通過DirectoryReaderInfra并行讀取目錄下所有*.md文件并以文件名去掉擴(kuò)展名作為命令名——這正是fixme.md對應(yīng)命令名為fixme的原因。也就是說如果你想新增一條命令只需在.forge/commands/下新建一個(gè) Markdown 文件即可文件名即命令名。項(xiàng)目根目錄的 README.md 也給出了同樣的使用說明“Custom commands: Place YAML files in.forge/commands/(project) or~/forge/commands/(global) to define shortcut commands available via:commandname.” 即命令可通過:命令名的形式在對話中直接觸發(fā)。test_parse_builtin_commands測試用例把fixme當(dāng)作內(nèi)置命令 fixture 來解析并斷言其name、description、prompt均非空進(jìn)一步確認(rèn)fixme是經(jīng)過測試保障的標(biāo)準(zhǔn)內(nèi)置命令。4. 實(shí)際使用方式在 Forge 會(huì)話中直接輸入:fixmeForge 會(huì)解析出fixme命令的提示詞即“在源碼文件中找出所有 FIXME 注釋并嘗試修復(fù)”隨后 Agent 按提示詞執(zhí)行定位搜索當(dāng)前項(xiàng)目源碼中的FIXME注釋大小寫通常不敏感README 中:fixme的說明原文即為fixme comments。分析逐個(gè)閱讀注釋上下文判斷該處遺留的問題性質(zhì)與修復(fù)意圖。修復(fù)在保證不破壞其他邏輯的前提下直接修改源碼把注釋對應(yīng)的缺陷或待辦事項(xiàng)落地解決。驗(yàn)證修復(fù)后可結(jié)合:check同樣注冊在內(nèi)置命令列表中的檢查命令或項(xiàng)目測試來確認(rèn)改動(dòng)沒有引入回歸。使用前提是當(dāng)前會(huì)話所在的目錄是一個(gè) Forge 項(xiàng)目即存在.forge/配置并且項(xiàng)目源碼可被 Agent 通過文件工具正常讀寫。5. 舉一反三編寫你自己的自定義命令理解了fixme.md的格式與加載機(jī)制后完全可以自己編寫類似的命令。例如在項(xiàng)目根目錄.forge/commands/下新建refactor.md--- name: refactor description: Find duplicated code blocks and suggest refactoring --- Scan the source-code files for duplicated code blocks that appear in three or more places. For each duplication found: 1. Summarize the repeated logic and its locations. 2. Propose a refactoring that extracts the shared logic. 3. Apply the refactoring and verify the code still compiles.保存后在新的 Forge 會(huì)話中直接輸入:refactor即可觸發(fā)。需要注意命令名即文件名去掉.md后綴前端name字段應(yīng)與文件名保持一致避免歧義description會(huì)展示在命令列表中建議寫清楚命令的作用正文 prompt 可以像 multiline.md 那樣使用多行列表讓 Agent 按步驟執(zhí)行若與內(nèi)置命令重名項(xiàng)目本地命令會(huì)覆蓋全局與內(nèi)置版本優(yōu)先級項(xiàng)目本地 全局自定義 內(nèi)置。6. 小結(jié)fixme命令是 Forge 自定義命令機(jī)制的一個(gè)典型樣本它由.forge/commands/fixme.md這樣一個(gè)“YAML frontmatter Markdown 正文”的文件定義經(jīng) crates/forge_services/src/command.rs 的加載器掃描、解析與去重后注冊為:fixme快捷命令最終把“掃描并修復(fù) FIXME 注釋”的意圖作為提示詞交給 Agent 執(zhí)行。掌握這套文件格式與加載優(yōu)先級你就能像fixme一樣把團(tuán)隊(duì)里高頻的編碼巡檢、重構(gòu)、代碼生成等重復(fù)工作沉淀為一條條可復(fù)用的 Forge 命令。贊分享人工智能AI Agent代碼智能體AI 應(yīng)用CLI開發(fā)工具【免費(fèi)下載鏈接】forgecodeAI enabled pair programmer for Claude, GPT, O Series, Grok, Deepseek, Gemini and 300 models項(xiàng)目地址https://gitcode.com/gh_mirrors/forge39/forgecode點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Bitwarden Clients 代碼庫中的 Angular FIXME 與 ESLint 抑制注釋清理實(shí)戰(zhàn)指南Bitwarden Clients 代碼庫中的 Angular FIXME 與 ESLint 抑制注釋清理實(shí)戰(zhàn)指南 導(dǎo)讀 本文聚焦 Bitwarden clie前端桌面應(yīng)用CLI應(yīng)用安全Foundry forge-lint 的 todo-comment 規(guī)則用 TODO/FIXME 標(biāo)記審計(jì)未完成代碼Foundry forge lint 的 todo comment 規(guī)則用 TODO/FIXME 標(biāo)記審計(jì)未完成代碼 TODO 與 FIXME 是開發(fā)過程中最區(qū)塊鏈開發(fā)工具ESLint no-warning-comments 規(guī)則詳解用注釋規(guī)范攔截 TODO、FIXME 與 XXXESLint no warning comments 規(guī)則詳解用注釋規(guī)范攔截 TODO、FIXME 與 XXX 本篇技術(shù)指南以 ESLint 內(nèi)置規(guī)則 no開發(fā)工具Lint靜態(tài)分析代碼質(zhì)量上一篇用相機(jī)陀螺儀數(shù)據(jù)完成視頻防抖Gyroflow 能做什么、從哪開始下一篇ET 框架 Buff 系統(tǒng)速成事件驅(qū)動(dòng) 五檔數(shù)值Debuff 不再牽一發(fā)動(dòng)全身創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考