
aider 实战解读从探索陌生仓库到给开源 2048 游戏加一个 10x 随机奖励【免费下载链接】aideraider is AI pair programming in your terminal项目地址: https://gitcode.com/GitHub_Trending/ai/aider本篇基于 aider 官方示例对话实录 2048-game.md 展开。完整记录了一次真实场景开发者进入一个从未见过的 JavaScript 2048 开源项目让 aider 解释这个仓库是什么计分机制如何实现并最终当场提出新需求——10% 概率给 10 倍加分奖励由 aider 直接修改代码并自动提交。读完本文你能完整掌握 aider 探索陌生代码库、按需将文件加入对话上下文、看懂其 ORIGINAL/UPDATED 编辑块与自动 git 提交机制并能把同一套人机协作流程迁移到自己的项目上。这篇对话实录演示了什么该文档位于仓库 aider/website/examples/2048-game.md属于站点 docs 中的 Example chat transcripts示例对话实录合集用于展示 用 aider 编程是一种什么体验。整段对话围绕一个用户此前完全没有看过的开源 JavaScript 2048 游戏项目展开共经历三个回合what is this repo?—— 让模型仅凭已加入会话的文件先描述仓库性质how does the scoring work?—— 模型主动索要关键源文件js/game_manager.js经用户确认后自动加入会话并详细讲解计分逻辑can we add some randomness? maybe 10% of the time give the user a 10x bonus?—— 用户提出功能改造模型给出分步方案、产出编辑块aider 自动落盘修改并提交 commit。实录最值得注意的细节在文档开头即被点明模型想查看某个源文件时aider 会在获得用户许可后把它自动包含进对话会话。这正是 aider 边读边改工作方式的核心也是本文接下来要重点拆解的部分。前置准备克隆一个 git 仓库再启动 aider对话实录第一屏的命令揭示了 aider 的使用前提$ git clone 上游 2048 游戏的开源仓库 $ cd 2048 $ aider整个示例选择的是一个 JavaScript 实现的 2048 网页游戏仓库HTML/CSS 负责界面、JavaScript 负责游戏逻辑、meta 文件负责图标与移动端启动图。它体量小、逻辑清晰、便于演示是非常合适的试手靶场。从中可以提炼出两条可复用的经验aider 面向的是 git 仓库。自动提交、/undo回滚等能力都建立在仓库的提交历史上详见后文所以建议先git clone或进入已有 git 项目再启动用什么语言的项目都行。本次示例是 JavaScript 网页游戏而该文档所在仓库中的其它实录还覆盖了 PythonFlask、Pygame、CSS、Asciinema cast 文件等说明这套探索 改造流程与具体技术栈无关。读懂实录规则先弄清楚 transcript 里各符号的含义直接阅读原始对话前建议先了解 transcript 的排版约定。在 examples/README.md 中有明确说明这对正确理解全文至关重要以开头的行是aider 工具自身的输出如Applied edit to ...、Commit ...####标题行是用户用自然语言输入的聊天消息模型回复中的编辑块edit block会被着色高亮形如hello.py ORIGINAL print(hello) print(goodbye) UPDATED更关键的是 examples/README.md 归纳的三条背后发生了什么每当模型给出一次代码修改建议aider自动把它应用到源文件应用完编辑后aider用一句有描述性的提交信息自动提交到 git模型只能看到并编辑已加入对话会话的文件。用户可以通过启动参数或在对话中输入/add命令添加文件而当模型主动请求查看某个文件时aider 会先询问用户是否同意同意后该文件即被加入会话——实录中会看到每一次文件被加入或移除时都有对应提示。这三点构成了理解整个 2048 示例的框架模型所讲的一切只见其文件它动手改的也只有加入会话的文件。第一回合让模型认识未知仓库用户的第一条消息极其简短#### what is this repo?模型基于启动时加入会话的文件名列表作答这是一个基于 Web 的游戏仓库很可能是 2048 类游戏包含承载游戏逻辑的 JavaScript、负责界面的 HTML/CSS以及图标、触屏启动图等 meta 文件——并主动表示需要特定部分代码或想加新功能请告诉我。这个回合的价值在于展示了 aider 对陌生仓库的初步定位能力即使没有读过源码仅凭仓库文件构成就能给出大体判断同时把主动权交还给用户——下一步看哪里、改哪里由用户决定。第二回合理解计分机制并见识文件加入会话用户接着提问#### how does the scoring work?模型没有凭空猜测而是表示要看相关代码并点名请求文件内容js/game_manager.js认为计分逻辑很可能在其中。随后实录出现关键的工具交互 js/game_manager.js Add these files to the chat? y即模型点名文件 → aider 向用户弹出确认 → 用户输入y同意 → 文件被加入会话。模型随即在上下文中看到文件内容开始讲解。底层机制文件如何进入可看可改集合这一交互对应 aider 的会话文件管理机制。在源码层面对话启动时可把文件名作为参数传入Coder 会把它们存入会话文件集合如 base_coder.py 中维护的abs_fnames而组装给模型的内容则由get_files_content读取会话中途则用/add命令添加、/drop命令移除聊天命令清单见 commands.md其实现位于 commands.py 的cmd_add解析文件名 → 过滤掉被 aiderignore/忽略的文件 → 命中仓库内文件后加入集合而当模型在回复中点名某个尚未加入的文件时从 base_coder.py 中围绕mentioned_rel_fnames/get_file_mentions的处理逻辑可以推断aider 会解析模型消息里出现的文件名、将其与仓库可添加文件匹配再向用户请求确认——这正是实录中Add these files to the chat? y这一行的来源。理解这一点能避免新手常见的困惑为什么我让 aider 改某个文件它却一直说自己看不到 答案是它只能编辑加入会话的文件请务必先用启动参数或/add把它放进来。模型对计分的讲解原文核心内容文件到手后模型的讲解完全对应 2048 的经典规则两个值相同的方块tile合并时生成一个值为两者之和的新方块分数加上新合并方块的数值。对应的关键源码片段如下节选自js/game_manager.jsif (next next.value tile.value !next.mergedFrom) { var merged new Tile(positions.next, tile.value * 2); merged.mergedFrom [tile, next]; self.grid.insertTile(merged); self.grid.removeTile(tile); // Converge the two tiles positions tile.updatePosition(positions.next); // Update the score self.score merged.value; // The mighty 2048 tile if (merged.value 2048) self.won true; }讲解要点是逐行的找到相邻且值相同、且未被合并过的方块tile与next用二者值之和创建新方块merged并以mergedFrom记录来源用于动画插入新方块、移除两个旧方块、更新位置用self.score merged.value累计得分——新增的合并值就是本次得分若合并结果恰好为 2048则self.won true判定获胜代码注释戏称 The mighty 2048 tile。这一段是全文的信息地基用户正是基于得分 合并方块的值这一事实才能在下一回合提出加分时随机翻倍的需求。第三回合实现10% 概率给 10 倍加分奖励用户提出需求#### can we add some randomness? maybe 10% of the time give the user a 10x bonus?模型没有立刻丢代码而是先给出分步实施方案生成一个 0 到 1 之间的随机数判断该随机数是否小于等于 0.1即 10% 概率若命中则把合并方块的值乘上 10 再加进分数。随后是写给js/game_manager.js的编辑块js/game_manager.js ORIGINAL // Update the score self.score merged.value; // Update the score with a 10% chance of 10x bonus var bonus Math.random() 0.1 ? 10 : 1; self.score merged.value * bonus; UPDATED编辑块aider 与模型交换改动的标准协议这段ORIGINAL / UPDATED结构就是 aider 的核心编辑格式edit block。其含义非常直白ORIGINAL部分是源文件中的既有代码UPDATED部分是替换后的新代码。只要模型给出的 ORIGINAL 能在文件中唯一精确匹配aider 就能安全地把改动落到磁盘。这也是为何用户在第一回合的讲解中已经见过被注释的计分行——模型必须照抄原文替换才能成功。从仓库证据看这一格式贯穿整个 edit 类 coder 的实现如 editblock_coder.py、相关 prompts 文件等并在其它实录文档中大量出现更多可用的编辑格式见 edit-formats.md。修改落地与自动提交实录最后是两行带前缀的 aider 工具输出 Applied edit to js/game_manager.js Commit eb9d882 aider: Added a 10% chance of giving the user a 10x bonus when two tiles merge.第一行表示编辑已应用成功第二行表示 aider 已自动创建一次 git 提交提交信息由模型根据 diff 内容自动撰写完整概括了本次改动。源码深挖自动应用与自动 commit 是怎么实现的示例中改完即提交的流畅体验对应 aider 的两个核心机制。自动提交auto commit每轮编辑完成后Coder 会触发auto_commit其入口在 base_coder.py把被编辑的文件集合交给repo.commit成功后记录last_aider_commit_hash并把提交结果回填到对话上下文让模型知道自己改了什么、提交到了哪里。提交信息生成与 aider: 前缀提交的真正执行在 repo.py 的commit方法先取 diff再通过get_commit_messagerepo.py把 # Diffs: 与对话上下文组装成 prompt交给提交信息模型生成一句话 commit message。至于实录中出现的aider:前缀对应 repo.py当开启--attribute-commit-message-author或--attribute-commit-message-committer时aider 生成的提交信息会统一加上aider: 前缀便于在历史里区分AI 做的改动和人类做的改动。与之配套的提交归属控制参数定义在 args.py 附近。默认情况下这些开关关闭提交信息不带前缀具体行为以当前仓库版本和你的启动参数为准。出了问题怎么办自动提交并非不可撤销。在 commands.md 的命令表里可以找到/undo撤销最近一次由 aider 创建的提交/drop用于从会话中移除文件以释放上下文空间/commit则用于提交会话外比如你自己手动改的内容。相关提示在 base_coder.py 的show_undo_hint中也有体现——一旦检测到会话开始后 HEAD 移动过aider 会提醒可用/undo丢弃它的提交。把这套实录转化为可复用的工作流回顾整段对话可以提炼出一个在任何代码库上都适用的 aider 协作节奏先建仓库上下文git clone目标项目后cd进目录再执行aider必要时先把主入口或关键文件用/add加入会话。先理解再动手第一、二回合展示了问清这是什么仓库 → 索要相关源文件 → 弄懂关键逻辑的顺序。模型不会读全部代码它只依据会话内文件作答所以探索阶段的价值在于把该看的文件喂进会话。自然语言提需求模型负责翻译成代码第三回合证明一个附带模糊概率描述的产品想法maybe 10% of the time give the user a 10x bonus可以直接被转译成精确的Math.random() 0.1 ? 10 : 1。信任自动落盘与提交但保留审计手段aider 会逐条应用编辑并自动 commit借助带描述的提交信息、/undo撤销能力以及各编辑格式的文档edit-formats.md可以随时核对、回退每一次 AI 改动。需要提醒的是实录中提交信息以模型在对话当时的状态生成你本地得到的 hash 与措辞会因模型、上下文而异本仓库当前版本下是否需要 aider: 前缀取决于是否开启 args.py 中对应的归属标注参数。本文基于 2048-game.md 的原文对话及其所在仓库的代码实现展开未对示例之外的项目行为做额外推断。【免费下载链接】aideraider is AI pair programming in your terminal项目地址: https://gitcode.com/GitHub_Trending/ai/aider创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考