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

代码看腻了,我让 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 xfrom ..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/utilsscrapy/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 里那种几千行的应该是需要抬头才能看到顶的摩天楼。
   现在的尺度是按飞行视角调的,落地后大概率不对。

改完告诉我怎么测,我自己走两步验手感。

▸ 翻车三:没有路,没有地面参照

跟第一人称连着的还有一个问题:地面是纯黑的

除了街区脚下那个紫色椭圆盘,什么都没有。没有街道、没有网格、没有地平线。

飞在天上的时候这不算问题,落到地面上立刻就成大问题了------没有参照物,你根本不知道自己在动。黑漆漆一片走两步,方向感直接丢,也分不清哪儿是街区边界。

真实城市里"路"承担的是两个功能:一是给你空间参照,二是暗示"从这儿能去那儿"。第二点对我们这个场景更有意义------路网本来就该是依赖关系的地面投影。两个模块之间调用频繁,它们的街区之间就该有条主干道。

我提的要求是:

  1. 地面铺一层网格或反射面,起码得有个参照
  2. 街区之间生成连接道路,宽度按模块间的调用密度来定
  3. 街区边缘要有边界,别让楼悬空浮在黑色里

我的修复提示词:

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__.pyaddons.pycore/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 都不用换,下次再干活看看它又长进了多少。

相关推荐
mit6.8242 小时前
archived
后端·python·flask
用户298698530142 小时前
效率工具分享:3 款免费 Markdown 转 Word 在线转换器
人工智能·后端
程序员天天困2 小时前
Spring Boot i18n 国际化实战:从资源文件到多语言接口完整指南
spring boot·后端·编程语言
睡觉时不困4422 小时前
8.conda 与 uv 环境管理完全指南:从概念到实战避坑
后端
是小李呀2 小时前
Spring Boot 配置加载机制解析:Docker 部署中 `spring.profiles.active` 与 `spring.config.location` 的本质区别
后端
步行cgn2 小时前
MyBatis 多参数绑定错误:Parameter 'name' not found 详解与解决方案
后端
步行cgn2 小时前
MyBatis 对单个简单类型参数的默认处理详解
后端
吃饱了得干活2 小时前
Java并发安全:看这一篇就懂了!
java·后端·面试
早点睡9752 小时前
向量检索原理入门:从 ANN 到 HNSW
后端·面试