docs: docs/ 里 13 条 cli.ts 行号引用改钉符号锚(22 → 9,改前 11/11 全错) - #857
Conversation
#852 量过:docs/ 下按 blob/main 钉 cli.ts 行号的引用,锚文本带符号名、可机器判定的 11 条里 **漂移 11、仍对 0**。这次把能确定唯一锚串的都改掉。 改法照 #845 已确立的形状: 改前 [`cli.ts:228 loadProfile`](…/blob/main/agent-network/bin/cli.ts#L228) 改后 [`cli.ts`](…/blob/main/agent-network/bin/cli.ts) —— 搜 `function loadProfile(` 13 条的真实位置(改之前它们全都指错了): adminUtokPath 文档说 28 实际 138 saveGlobal 文档说 77-81 实际 1000 saveServerConfig 文档说 89-95 实际 1047 saveAdminUtok 文档说 105-111 实际 1062 loadProfile 文档说 228 实际 1208 saveProfile 文档说 246-273 实际 1272 setupCommand 文档说 556 实际 1860 ensureMcpJson 文档说 1644 实际 4300 runCommand 文档说 2044 实际 5641 renameCommand 文档说 2583 / 2629 实际 6911 deleteCommand 文档说 2800-2840 实际另处 dashboardReleaseTag 文档说 347 实际另处 每一条新锚串都逐条核过在 cli.ts 里**唯一**(13 条,非唯一 0 条)。 `RuntimeName` 那条**没有改**:它在 cli.ts 里出现 13 次,做不出唯一锚 —— 与其钉一个 含糊的锚,不如留着行号,等有人给它一个能唯一定位的写法。 剩下 9 条锚文本里没有符号名(形如 `[cli.ts:1724](…#L1724)`),机械改不了, 需要人读源码判断它当初想指的是什么。留给 #852。
接上一提交。这 6 条的锚文本里没有符号名,机械改不了,是逐条读上下文判出它当初
想指什么、再去源码里定位的:
node-lifecycle.md:206 正文说 notifyServerOffline → 搜 `async function notifyServerOffline(`
node-lifecycle.md:213 正文说「确认流程」 → 搜 `This will delete "${displayName}" (node_id:`
node-lifecycle.md:383 正文直接写了 resolveNodeRef → 搜 `function resolveNodeRef(`
architecture.md:316 正文说写 .mcp.json → 搜 `.mcp.json: commhub → .anet/node-server.js`
architecture.md:326 正文引了 compare-by-content → 搜 `if (src !== dst)`
architecture.md:328 RuntimeName type → 🔴 它已经不在 cli.ts 里了
最后一条值得单说:文档写「RuntimeName type cli.ts:145」,但 cli.ts 里
`type RuntimeName =` 出现 **0 次** —— 这个类型已经搬到
`agent-network/src/normalize-runtime.ts:16`。这不是行号漂移,是文件都换了。
所以这条改的是链接目标,不只是锚。
「确认流程」那条要小心:`Run again with --force to confirm.` 在 cli.ts 里出现 **2 次**
(deleteCommand 8143 / networkCommand 10173),不能拿它当锚。读上下文确认文档说的是
节点删除,才选了 deleteCommand 里唯一的那句。
每条锚串都核过唯一。node-lifecycle.md 的行号 pin 已归零。
|
追加一个提交( 新修的 6 条,每条都是读上下文判出它当初想指什么、再去源码定位的:
🔴 RuntimeName 那条不是行号漂移,是文件都换了。 文档写「RuntimeName type cli.ts:145」,但 cli.ts 里 「确认流程」那条差点选错锚:
剩余 3 条(锚文本无任何线索,连正文都没说它指什么函数): pitfalls 那条我已定位到候选: |
这 3 条的锚文本里没有符号名,是逐条读正文判出来的:
architecture.md:520 正文自己就写着「`sub === "dashboard"` 分支」
→ 链接去掉行号即可,锚已经在正文里(唯一,cli.ts:6092)
RFC-002:37 「参考实现」指的是 anet channel add/ls
→ 搜 `async function channelCommand(`(唯一,cli.ts:8159)
pitfalls.md:80 「candidates 数组:源文件搜索顺序」
→ cli.ts 里 `const candidates` 有 4 处,其中 1024 与 4333
都是 node-server.js 解析顺序。判据是 4333 那处的注释
`// dist/src/node-server.js(npm 包混淆后产物,优先)`
与 pitfalls 正文第 1 条逐字对应,1024 那处不是。
→ 搜那条注释(唯一)
至此 docs/ 下 blob/main 形式的 cli.ts 行号引用为 0。每条锚串都核过在源码里唯一。
|
再追加一个提交( 这 3 条锚文本里没有符号名,是逐条读正文判出来的:
这是这批里唯一一条两个候选都长得像的,如果按「找个差不多的就钉上」处理,就会钉错一个 —— 而钉错之后它仍然是「锚串存在、链接能开」,没有任何门会报。 仓内其余 8 条(不在本 PR 范围)#851 合了之后只剩 |
复核:本条结论仍成立,但范围之外还有同类的 6 条,全部也是错的一、结论仍成立(2026-08-14 复核)
🔴 二、我按更宽的范围数了一遍:
|
| 引用位置 | 声称 | 该行现在是什么 | 那个符号实际在第几行 |
|---|---|---|---|
docs/architecture.md:48 |
cli.ts:558-598 settingSources: [] |
// "Reached maximum number of turns (5)" … |
2238 |
docs/message-lifecycle.md:41 |
cli.ts:864 msgType !== "task" … |
inboxDir: string; |
该表达式已不存在 |
docs/message-lifecycle.md:142 |
cli.ts:864 同上 |
inboxDir: string; |
同上 |
docs/message-lifecycle.md:198 |
cli.ts:1102 ["new_task","broadcast"].includes(ev.type) |
if (AUTH_TOKEN) headers["Authorization"] = … |
5687 |
docs/message-lifecycle.md:199 |
cli.ts:836 shouldSkipMessage |
warn(\cleared ${key} …`)` |
4610 / 4695 |
docs/node-lifecycle.md:196 |
cli.ts:1159 心跳 setInterval |
try { |
1231 / 5942 / 5993 |
漂移幅度不小:settingSources 声称 558,实际 2238;includes(ev.type) 声称 1102,实际 5687。
其中 msgType !== "task" 这个表达式在当前代码里已经找不到了 ——
那两处引用不只是行号漂了,是它描述的判断本身可能已经改写,需要人看一眼再决定钉哪。
建议
不必扩大本条的范围(小范围是它能做完的原因),但标题/正文最好把范围写死成
「agent-network/bin/cli.ts 的 22 条」,否则读者会以为 docs/ 下的 cli.ts 引用都处理过了 ——
改一半比不改更糟,因为看起来像已经修过了。
那 6 条我不在这里动,建议另开一条跟踪(或在本条里显式写"不含 agent-node/src/cli.ts 的 6 条")。
(只读:全部读 origin/main,临时 worktree 用完即 remove;未改任何文档。)
推进 #852。
docs/下的cli.ts行号引用 22 → 9,13 条改钉符号锚。为什么必须改
#852 量过:
docs/下锚文本带符号名、因而可机器判定的引用有 11 条 ——漂移 11 条,仍然对的 0 条。这批引用现有的任何一道门都照不到:
DOC_ROOT = "docs-site",不覆盖docs/;指着一行正常代码、只是不是声称的那个符号」只能碰到 2/11。
改法(照 #845 已确立的形状)
行号会漂,符号不会。读者用
git grep一次定位。改之前它们错到什么程度
origin/main实际adminUtokPathsaveGlobalsaveServerConfigsaveAdminUtokloadProfilesaveProfilesetupCommandensureMcpJsonrunCommandrenameCommand不是漂了几行,是差了几千行 —— 点进去看到的是完全无关的代码。
承重复核:每条新锚串在
cli.ts里唯一RuntimeName那条故意没改:它在cli.ts里出现 13 次,做不出唯一锚。与其钉一个含糊的锚(那正是 #845 踩过的坑:锚串确实存在,只是落在别的地方),
不如留着行号,等有人给它一个能唯一定位的写法。
剩下的 9 条:机械改不了,留给 #852
它们的锚文本里根本没有符号名:
要修它们得人读源码,判断当初那段话想指的是什么 —— 没有机械办法。
这正是 #852 说的「剩下 9/11 要符号级校验」的那部分工作量。
顺带发现(不在本 PR 范围)
docs/qa/weekly/2026-W19.md不是 UTF-8(position 2467 处 invalid continuation byte),任何按 UTF-8 读全目录的脚本都会在它上面炸。本 PR 的处理是跳过它。