代码看腻了,我让 Seed Evolving 把整个仓库搓成了一座能走进去的 3D 城市

上个月接手了个 Flask 项目。前任走了,文档没有,注释约等于没有,git log 里全是 "fix"、"update"、"再改一下"。
我干这行的老规矩:先通读。tree 打出来一看,三十来个 Python 文件,不多。但读到第三个小时我就开始烦了------文件树是平的,它只告诉我"有什么",不告诉我"什么重要"。哪个文件是核心,哪个是没人管的死角,哪两个模块偷偷互相 import 缠成了一团,这些东西藏在树状图后面,得靠人一行行读出来。
画依赖图?pydeps 那种图我画过,节点一多就变成一坨毛线球,看完更晕。
那天晚上我盯着那个文件树,突然想到一个特别不正经的念头:
要是这些文件是楼呢?
行数多的就盖高一点,被 import 得多的就摆在城中心,模块各占一个街区,import 关系变成楼之间的空中光路,我第一人称走进去逛。哪儿楼最密、哪儿光路最乱,一眼就看出来了。逛累了戴上头显进去转一圈。
这个想法有点疯,但我手上刚好有个能干活的:8 月初 Doubao-Seed-Evolving 完成了第二次升级,官方说 Coding 工程能力、Agent 能力、幻觉控制三块都提了。加上 7 月那次给的 1M 上下文------一口气吃下整个仓库,正好是这个活儿的前置条件。
于是这个周末我就干了这么一件事:让它给我搓一座城市出来。

先看视频效果。 live.csdn.net/v/539204
源码开源:gitcode.com/weixin_5290...
一、为什么这活儿不好干
先说清楚难点在哪,不然听着像"调个库就完事"。
这东西表面是个可视化,实际是三层活儿叠在一起:
第一层,得真读懂代码。 楼高按什么算?行数只是最粗的。真正有信息量的是:这个文件被谁 import、它 import 了谁、里面有几个类几个函数、函数平均多长、有没有循环依赖。这些得靠静态分析真解析出来,不能瞎猜。Python 有 ast 模块能做,但把 from conduit.user.models import User 这种相对/绝对混用的 import 正确映射到文件路径上,边界情况一堆。
第二层,得排布局。 一百来个节点摆在平面上,既不能重叠,又要让"关系近的靠得近"。这是力导向布局那一套,得自己实现或者调库调参。
第三层,得渲染得像样。 Three.js 起个场景不难,难的是好看:氛围雾、辉光、地面反射、光路的流动动画、第一人称的移动手感、还有别一百栋楼就掉到 20 帧。
三层都不是缝合几个 demo 能糊出来的。这也正好是我想拿它压一压的原因。
二、接入:Agent Plan + TRAE
我这次没用命令行,用的是 TRAE 编辑器接。原因很简单------这活儿前端占一半,我得随时看着代码改、看着页面刷新,IDE 里干比在终端里干顺手。
▸ 订套餐
火山引擎控制台里找 Agent Plan,按档订阅。

我订的是 【 Medium 档 49.9/月】。

▸ 两个容易踩的坑
坑一:Key 不是平时那把 Key。 套餐有专属 API Key,跟按量计费那把不是同一个。拿错了照样按量扣费,套餐白订。我第一次就差点拿旧 Key 去配。
坑二:Base URL 也分家。 Anthropic 协议配 https://ark.cn-beijing.volces.com/api/plan,OpenAI 协议配 /api/plan/v3。手一滑写成 /api/v3,恭喜,又回按量计费了。

▸ TRAE 里配

配完切到 doubao-seed-evolving,开干。

三、开场我就甩了一段牢骚
需求文档是没有的。我把那天晚上的念头原样打了进去:
我想要一个东西:把这个仓库变成一座 3D 城市,能在浏览器里第一人称走进去逛。文件是楼,行数多的楼高,被引用多的摆中间,模块分街区,import 关系画成空中的线。最好还能戴 VR 头显进去。
帮我搞出来。
发过去它琢磨了一会儿。我以为它直接开写了,结果没有,先反过来跟我确认了几件事。

这一步我给好评。它要是直接闷头写,很容易写一堆我不要的东西。
四、把架构定下来
聊完之后定的方案,拆成两半,我觉得这个拆法挺对:
makefile
codecity/
├── parser/ # Python 侧:静态分析,出数据
│ ├── scanner.py # 遍历仓库,收文件
│ ├── ast_analyzer.py # ast 解析:类/函数/行数/复杂度
│ ├── import_graph.py # import 关系 → 有向图
│ └── export.py # 导出 city.json
└── web/ # 前端:Three.js 渲染
├── loader.js # 读 city.json
├── layout.js # 力导向布局,算每栋楼的坐标
├── city.js # 建楼:InstancedMesh
├── links.js # 光路:曲线 + 流动 shader
├── controls.js # 第一人称 + WebXR
└── main.js
解析和渲染彻底分开 ,中间用一个 city.json 对接。好处是我以后想支持 Java、Go,只用再写一个 parser,前端一个字不动。这个设计是它提的,我认。
▸ 映射规则
这张表是整个项目的灵魂,我们来回改了几轮才定:
| 代码里的东西 | 城市里的样子 | 为什么这么定 |
|---|---|---|
| 一个文件 | 一栋楼 | 最自然的对应 |
| 文件行数 | 楼的高度 | 一眼看出哪个文件臃肿 |
| 类/函数数量 | 楼的层数(窗户带) | 高而层少 = 大函数警告 |
| 被 import 次数(入度) | 楼的体积 + 越靠城中心 | 被依赖越多越是核心 |
| 所属目录/包 | 一个街区 | 模块边界可视化 |
| import 关系 | 两楼之间的空中光路 | 有向,粒子朝被依赖方流 |
| 循环依赖 | 红色告警光路 | 这是要重点抓的坏味道 |
| 测试文件 | 半透明的楼 | 跟业务代码区分开 |
| 长期没改动的文件(git) | 楼体偏灰、亮灯少 | 死角一眼看出来 |
五、真正开始写
定完方案我干了两件事,跟以前一样的套路。
一是把规矩先立了:不许出现超过 300 行的文件,一个职责一个模块,前端不许把渲染逻辑塞进 main.js。
二是让它自己往下转,一轮干完自己检查自己接着干,我不在旁边一句句喂。

它列了个计划就跑起来了。中间我是真的在摸鱼,偶尔瞟一眼终端。
▸ 第一阶段:解析器
parser 这部分它写得比我预期顺。
ast 那套我原以为要来回纠正------相对导入的层级、from . import x 和 from ..utils import y 的区别、try 里的条件 import,这些边界情况平时自己写都容易漏。它一遍就把 ast.walk 铺开了,条件 import 也能静态看到。

▸ 第二阶段:布局
这一步我以为会翻车,结果还行。
一百来个节点要摆得不重叠、又要关系近的挨着。它没硬上力导向,而是分了两层:街区之间按环形铺开,街区内部按被引用次数往中心排------入度高的落在圆心,边缘留给叶子文件。省了调参的功夫,出来的形状还挺像城市。

▸ 第三阶段:渲染
这是最出效果、也最容易看着不对的部分。

六、翻车记录
老实讲,不是一遍过的。这部分我特意留着写,因为只写顺利的那部分等于没测。
而且第一版翻得挺彻底------它确实交出了一个能跑的 3D 场景,我打开一看,愣了三秒:

看着挺唬人,深蓝底色、发光的楼体、窗户带都有。但这不是城市,这是一根柱子。
我把左上角那行信息栏放大看了一眼,问题全在里头写着:
5 栋楼 · 2 街区 · 0 连线 · 1128 行
五栋楼。零连线。
▸ 翻车一:它扫错了目录
我盯着楼顶的标签才反应过来:文章要求.md、文章草稿.md、实测方案.md。
它扫的是我写文章的那个文件夹,不是我准备好的代码仓库。
我给它的仓库是 Flask、Scrapy、Django 三个,加起来两千多个 Python 文件、六十多万行。结果它把工作目录默认成了当前所在目录,扫出来五个 Markdown 文件,就这么盖了五栋楼。
1128 行------这个数字当时就该让我警觉,我那三个仓库光 Django 一个就 52 万行。
这个错不算蠢,但很典型:它没有跟我确认"扫哪儿",而是拿了一个它以为合理的默认值。 我回头翻我最初那段牢骚,确实没写清路径。所以这一半怪我。
顺着这个根因往下,后面几个问题全是连带反应:
- 0 连线:Markdown 之间没有 import 关系,所以一条光路都画不出来。而光路是这东西的灵魂------我要看的就是依赖关系,结果最想看的那部分整个是空的。
- 五栋楼挤成一坨:节点太少,力导向布局根本铺不开,五栋楼全贴在一起长成一根柱子。布局算法有没有 bug,在这个数据量下压根验证不了。
- 街区叫
_ROOT:地上那个紫色椭圆盘旁边写着_ROOT。这是它内部处理根目录时的占位变量名,直接漏到界面上了。
我把路径明确指给它之后重跑,换成 scrapy 那份终端打印出来的统计就对上了:476 栋楼、2006 条边、19 个循环依赖组,跟我给它的参考数字(83 / 18316 那份是 flask,scrapy 该是 476 个 .py、8 万多行)差不了多少。街区名也不再是 _ROOT,换成了 scrapy/utils、scrapy/core 这种真实包名。楼群铺开了,不再是挤成一坨的那根柱子。
一个默认值的偏差,让整个验证白跑一轮。 这提醒我后面每个任务都得把输入路径写死,别指望它猜。
我的修复提示词:
bash
停一下,你扫错目录了。
我看了界面,左上角信息栏写的是「5 栋楼 · 2 街区 · 0 连线 · 1128 行」,
楼顶标签是 文章要求.md、文章草稿.md、实测方案.md ------
这些是我写文章的 Markdown,不是我要分析的代码仓库。
我要分析的仓库在这三个绝对路径下:
Seed Evolving/demo-repos/flask
Seed Evolving/demo-repos/scrapy
Seed Evolving/demo-repos/django
参考数据(你解析完拿这个对答案,数字差太多就是解析漏了):
- flask 83 个 .py,18316 行
- scrapy 476 个 .py,85458 行
- django 2928 个 .py,524956 行
请你:
1. 把扫描路径改成命令行参数或配置项传入,不要用「当前工作目录」当默认值。
路径没传就直接报错退出,别静默扫当前目录。
2. 只解析 .py 文件,跳过 .git、__pycache__、.venv、node_modules、tests 之外的无关目录。
3. 先拿 scrapy 那个路径跑一遍,跑完把统计打给我看:
文件数、总行数、街区(顶层包)数、import 边数、循环依赖组数。
4. 我要重点确认 import 边数不是 0。之前 0 连线,等于最核心的依赖关系整个没出来。
如果解析 import 有困难(相对导入、try import、条件 import),
告诉我你是怎么处理的,别悄悄跳过。
5. 界面上那个街区名 `_ROOT` 是你的内部占位变量漏出来了,
改成显示真实的包名或目录名。
这一步先不动前端渲染,我要先确认数据是对的。


▸ 翻车二:没有第一人称,是在天上飘
第二个问题是我操作了两下才发现的。
提示栏写着 WASD 移动 · 鼠标 视角 · Shift 加速,看着挺正常。但底下还有一行:
空格 上升 · C 下降
这是飞行模式,不是走路。 相机悬在半空,能上能下能穿墙,跟无人机航拍一样。
我要的不是这个。我要的是穿越火线那种------脚踩在地面上,抬头看楼是仰视的,楼比你高,你得走过去。这两种体验差得远:飞在天上你看到的是一张会动的图表,站在地上你才有"这文件真他妈大"的实感。
尺度感全靠这个。楼再高,你飘在楼顶跟它平视,那种压迫感就没了。
我把这事描述给它:我不要飞,我要走,重力、身高、碰撞都得有。 我的修复提示词:
bash
数据对了,现在改相机。
现在这个是飞行模式,不是我要的。提示栏写着「空格 上升 · C 下降」,
相机悬在半空能上能下能穿墙,跟无人机航拍一样。
我要的是第一人称行走,类似 FPS 游戏(穿越火线那种):
脚踩在地面上,楼比我高,抬头是仰视的,我得走过去。
这两种体验差别很大:飞在天上看到的是一张会动的图表,
站在地面上才有「这个文件真大」的实感。尺度感全靠这个。
具体要求:
1. 用 PointerLockControls,点击画面锁定鼠标,Esc 解锁。
2. 相机高度锁定在人眼高度(1.7 个单位左右,按你的场景尺度换算),
不能靠空格飞起来。
3. 加重力和落地检测,离开地面会掉下来。
4. 加楼体碰撞,不能穿墙。用 AABB 包围盒够了,别为这个上物理引擎。
5. WASD 移动 + Shift 加速保留,但把上升/下降去掉。
6. 保留一个「行走 / 俯视」切换按钮:
俯视模式给我看全局结构,行走模式给我实感,两个都要。
7. 楼的尺度重新校准一下:以人眼高度为基准,
一个 100 行的小文件应该是两三层楼的感觉,
django 里那种几千行的应该是需要抬头才能看到顶的摩天楼。
现在的尺度是按飞行视角调的,落地后大概率不对。
改完告诉我怎么测,我自己走两步验手感。


▸ 翻车三:没有路,没有地面参照
跟第一人称连着的还有一个问题:地面是纯黑的。
除了街区脚下那个紫色椭圆盘,什么都没有。没有街道、没有网格、没有地平线。
飞在天上的时候这不算问题,落到地面上立刻就成大问题了------没有参照物,你根本不知道自己在动。黑漆漆一片走两步,方向感直接丢,也分不清哪儿是街区边界。
真实城市里"路"承担的是两个功能:一是给你空间参照,二是暗示"从这儿能去那儿"。第二点对我们这个场景更有意义------路网本来就该是依赖关系的地面投影。两个模块之间调用频繁,它们的街区之间就该有条主干道。
我提的要求是:
- 地面铺一层网格或反射面,起码得有个参照
- 街区之间生成连接道路,宽度按模块间的调用密度来定
- 街区边缘要有边界,别让楼悬空浮在黑色里
我的修复提示词:
bash
落到地面之后发现一个新问题:地面是纯黑的。
除了街区脚下那个椭圆盘,什么都没有。没有街道、没有网格、没有地平线。
飞在天上时这不算问题,站在地面上立刻就是大问题------
没有参照物我根本不知道自己在动,走两步方向感就丢了。
要加的东西:
1. 地面:
- 铺一层网格或者带反射的地面,起码要有空间参照
- 要有地平线,不然分不清天和地
2. 路网(这条是重点,别当装饰做):
路网应该是依赖关系的地面投影,不是随便画几条线。
- 两个街区之间有 import 关系,就在它们中间生成道路
- 路的宽度按两个模块之间的 import 边数来定:调用越频繁的路越宽
- 走曼哈顿式折线(横竖转折),不要街区中心两两连直线,
直线会变成一张蜘蛛网,而且不像真城市
- 主干道和小巷要有视觉区分(宽度、亮度都可以)
3. 街区边界:
街区要有明确的地面边界,别让楼悬在黑色里。
4. 路面上加一点方向性的流光,暗示依赖方向(谁 import 谁)。
但别做太花,会抢楼的视觉焦点。
拿 scrapy 跑,它有 15 个顶层包,路网应该能看出结构。
我想验证的是:utils/ 那个街区是不是被所有街区连着(入度最高),
core/ 是不是在市中心。

▸ 这三个车翻出来的规律
三个问题回头看,性质完全不同:
| 翻车 | 性质 | 谁的责任 | 它能自己发现吗 |
|---|---|---|---|
| 扫错目录 | 输入前提错 | 我没说清 + 它没确认 | 不能,它以为自己成功了 |
| 飞行而非行走 | 需求理解偏差 | 我说"走进去"说得太含糊 | 不能,得我操作了才发现 |
| 没有路 | 需求遗漏 | 它没往下想 | 不能,代码层面没报错 |
三个都不是代码报错,三个都是"跑起来了但不对"。
这跟我以前的经验对上了:逻辑层的错它自己兜得住------语法错、import 漏了、变量没定义,它跑一遍自己就修了。但**"能跑但不是我要的"这一类,它没眼睛,也没手,它看不见屏幕,也没法拿 WASD 走两步。**
第一个翻车尤其值得记:它交付的时候是有底气的,界面渲染成功、控制台没报错、信息栏正常显示。从它的视角看,任务完成了。 只有我这个知道"应该是两千栋楼"的人才看得出这是个空壳。
所以这活儿省不掉的那部分,就是人得去开、去走、去核对数字。它能把三层技术活都干出来,但"这东西对不对"这个判断,还得我自己下。
七、走进去看看
这才是我要的东西。
▸ 先看俯视图
我用 scrapy 跑的:476 个 Python 文件、85458 行、34 个街区、2006 条内部 import 边。

俯视图一出来,有几个东西是我读文件树时完全没注意到的。
城中心那栋是矮楼。 scrapy/__init__.py 被引用 212 次,入度全场第一,但它只有 38 行------视觉上就是最中心一栋矮墩墩的小楼,四面八方的光路全往它身上扎。真正又高又在中心的是隔壁的 crawler.py,1147 行、被引 187 次,这才是那种"一眼就知道是心脏"的楼。
最高的楼是个测试文件。 tests/utils/bases/download_handlers_http.py,1597 行,比任何业务文件都高。往后数第二第三第四也全是 tests 里的。测试街区的楼普遍比业务街区壮,但入度几乎都是 0------楼很高,没有光路连出去。这个反差在文件树里是看不出来的。
33 栋孤楼。 没有任何光路连着,孤零零站在街区边上。翻了几个看,docs/_ext/ 底下的 sphinx 扩展、extras/ 里的压测脚本,都是"存在但不参与主流程"的那类文件。
19 个循环依赖组,最大一组 64 个文件。 这是 scrapy 的真实架构债,scrapy/__init__.py、addons.py、core/downloader/ 一串全缠在里头。

我读了三小时代码才建立起来的那点结构感,站在这儿抬头看一眼就有了。
▸ 第一人称走一圈
俯视看的是结构,走进去看的是尺度。

眼高锁在 1.7 米,1000 行的楼要仰着脖子看,几千行的那几栋是真的压迫感------这就是我要飞行改行走的原因。飘在楼顶跟它平视,"这文件太大了"这个念头是不会冒出来的;站在楼底下抬头,冒得出来。

走在街区之间能看清路的宽窄。通往 scrapy/utils 那条是最宽的主干道------那个街区入度 616,全场第一,几乎所有街区都往它连。有些街区之间只有一条 0.6 米的小巷,一眼就知道那俩模块基本不来往。

八、代码翻了一眼
界面能跑不算完。这东西我想长期用,代码得翻。
最终就两个文件,Python 侧 431 行,前端 894 行,一共 1325 行。前端没拆成多个 js,全在一个 module 里,但内部按注释切了 12 段------常量、场景、灯光、建筑、路网、布局、控制、碰撞、VR、Tooltip、主循环、加载。要拆随时能拆,逻辑边界是清楚的。
翻的时候有几处让我停下来看了两眼。
楼高不是线性的。
javascript
/**
* 100 行 ≈ 9.5m (两三层楼)
* 1000 行 ≈ 28m (仰脖)
* 5000 行 ≈ 56m (明显摩天楼)
*/
function linesToHeight(lines){
return 3 + 9.2 * Math.sqrt(Math.max(1, lines) / 100);
}
开根号压量纲。scrapy 里最小的文件几行、最大的 1597 行,线性映射的话小文件是薄饼、大文件戳破天,什么都看不出来。而那段注释把四个档位的实际米数标出来,还写了"仰脖""明显摩天楼"------这是给下一个改这个函数的人看的,不是给机器看的。
窗户是 canvas 当场画的,不是贴图。按楼高算层数,四列窗户,每个 65% 概率亮灯,亮度再随机。零外部资源,而且每栋楼的亮灯图案都不一样------用同一张贴图的话,一片楼看过去会有明显重复感。
路宽映射也是幂函数 ,0.7 次幂,count=1 是 0.6m 小巷,count>=80 是 6m 主干道。它还顺手加了"主干道偏青、小巷偏紫"的色区分,这条我没提。
找循环依赖用的是 Tarjan,我以为会拿 DFS 糊一下。注释里还写清了边界:"size>1 或自环"------自环也算循环依赖的一种,这个考虑到了。
最认的是这处。generate_city.py 开头的 docstring 第一条:
python
设计要点:
- 路径必须通过命令行传入;不传直接报错退出(不静默扫当前目录)。
对应代码是硬的,不传路径直接 sys.exit(2)。往下第二条:
python
- 街区名取真实顶层包/目录名,不再出现 `_root` 这种内部占位。
"不再出现"这四个字是有记忆的。 前面那两个翻车------扫错目录、_ROOT 漏到界面上------它修完没只改代码,而是把教训提炼成写在文件最上面的设计约束。下次谁打开这个文件,第一眼就看到。
糙的地方也有。街区配色用了 Python 内置 hash(),注释写的是"稳定 hash",但 Python 3 的字符串 hash 带随机盐,我连跑三次是三个值------同一个仓库扫两遍配色不一样。换成 hashlib 一行的事,但注释里那句"稳定"是它自己写的,它没验证过。另外主流程里 AST 解析跑了两遍,第二遍只为收集自环,第一遍结果缓存下来就能省一半时间。
这两处加起来半小时能收拾干净。1325 行能跑的东西换半小时,这账我算得过来。
▸ 让它自己回顾一遍
收尾时我发了句:从我们对话最开始总结,我让你做了什么、中间改了什么。

它按时间线理了五段:最初需求、三次返工、最后一次小修。
我逐条核对,有几处对得比我自己记得清。
开场那四个选项它记得。 整个仓库、赛博朋克霓虹风、静态 HTML 加 Three.js CDN、新建 code-city/------这是我甩完牢骚它反过来问我、我一条条挑的,隔了一整个下午。
三次返工是编号复述的 ,不是笼统说"改了控制方式"。第二次返工那七条里有一条"保留 WASD+Shift,去掉上下飞,空格改成跳"------这条我自己都忘了提过,翻回聊天记录才确认真说了。
数据也没错:476 文件、85458 行、2006 条边,scrapy/utils 入度 616 排第一落在原点,跟 JSON 里一个不差。
最后连那个小修都记着------俯瞰模式下"点击画面开始行走"的提示不消失,加了个 refreshHint()。那是收尾时我随口提的一句,它单列了一段。
一整个下午、三轮返工、上千行代码来回之后,开场那句牢骚和中间每次改动都还对得上。1M 上下文不是参数表上的数字,是这种"不用我重复第二遍"的体感。
九、算账

一共烧了 2072 AFP。
Medium 档的额度是 5 小时 10000、每周 35000、每月 100000。这一个项目下来,5 小时窗口用掉 21%,周额度 5.9%,月额度 2.1%。
预警一次都没弹过。 说实话我开工前是有点担心的------这活儿要读 476 个文件、来回改三轮、还带 shader 调试,我以为得盯着额度用。结果一个下午的量,连月额度的零头都没吃掉。
时间上,从甩那段牢骚到能第一人称走进去,一个下午。中间大半时间它自己在转,我在旁边摸鱼,偶尔瞟一眼终端。
要是我自己写呢?这三层我分开估:ast 那套 import 解析,相对导入、条件导入、包内映射的边界情况一堆,我摸下来得一天;布局算法调参一天;Three.js 那层最费------建楼、路网、流光 shader、第一人称加碰撞,还得调到不掉帧,两三天。加起来一周左右,而且是那种"每天下班都觉得还差一点"的一周。
一个下午换一周,票价 49.9,月额度还剩 97.9%。这账不用算。
十、这东西现在能干什么
写完我发现它不只是个好看的玩意儿,几个场景是真能用的。
接手陌生项目的第一眼。 这是我原始需求。以后接项目先跑一遍,五分钟建立结构直觉,比闷头读三小时强。
代码评审的辅助。 循环依赖、超大文件、没人引用的死角,在城市里是"看得见"的,不用等 linter 报。scrapy 那份数据里 19 个循环依赖组、33 栋没有任何光路连着的孤楼,都是站在俯视图里一眼扫出来的。
看测试和业务的配比。 这个用法是跑 scrapy 的时候意外发现的------最高那栋楼是个测试文件,1597 行。测试街区的楼普遍比业务街区壮,但入度几乎都是 0。哪些测试写成了巨石、哪些业务模块压根没人测,体量摆在那儿比覆盖率数字直观。
重构前后对比。 重构一遍再生成一次,两座城市摆一起,改动效果一眼看出来。不过想真这么用得先把那个 hash() 换掉,不然两次配色不一样,没法对比。
十一、最后
我原本以为这个念头就是个周末的玩意儿,做完截个图发朋友圈完事。结果它现在真在我 Mac 上留着------上周又接了个仓库,我第一件事是跑了一遍 generate_city.py。
它不是万能的。这次最明显的短板是它看不见屏幕。 三次翻车全是"能跑但不对":扫错目录、飞在天上、地面纯黑。三次都不报错,控制台干干净净,从它的视角看每一轮都交付成功了。第一次尤其典型------它给了我一个渲染正常、信息栏工整的界面,只有我这个知道"应该是两千栋楼"的人才看得出那是个空壳。代码层的错它自己兜得住,"这东西对不对"的判断还得我去开、去走、去核数字。
但在扛住长程任务这件事上,确实跟以前不一样了。一个下午、三轮返工、1325 行代码来回,收尾时它还能把开场那句牢骚和中间每次修改编号复述出来,连我自己忘了提过的"空格改成跳"都记着。以前干这种活儿,聊到后半程我得反复贴回前面的需求,现在没这一步。
后面打算给 parser 加 Java 和 Go 的解析------前端一个字不用动,这是当初解析和渲染分开那个设计留下的好处。再把 CLI 收拾成一行命令能出图。
代码会开源,等我把边角收拾干净。反正模型每周都在迭代,ID 都不用换,下次再干活看看它又长进了多少。

