Repository navigation
Closed
Labels
area:uiWeb/desktop UI and copyWeb/desktop UI and copybugSomething isn't workingSomething isn't working
Description
Reviewer 在 #1255(tip cd907943d0bd)判 PASS 时给了四条非阻断项,其中三条是代码缺陷,逐条复现如下。第 4 条(skipped pin (no git),本机无 git,pin 由 CI 的 package job 覆盖)是环境说明,不开单。
1. 文档和页面写 delivery.repo,代码读的是 config.deliveryRepo —— 用户照着提示写的设置不会被读
- 代码:
core/src/host/delivery-board.js:764rt.config?.deliveryRepo ?? null。rt.config是实例配置的顶层对象(同文件旁边rt.config[def.id]、rt.config?.decisions都是顶层键),仓库里没有把delivery.repo展开成deliveryRepo的加载逻辑。 - 文案和文档:
core/src/host/delivery-repo.js:8(注释)、core/src/client/delivery-view.js:87与:300、core/src/client/i18n.js:1356/1360、docs/subsystems/core-host.md:41/48、docs/subsystems/core-client.md:41、changelog.d/1250-delivery-repo.added.md—— 全部写delivery.repo。 - 后果:用户照
no repository — set delivery.repo这条提示在设置里写delivery.repo,host 读不到,解析继续往下走,落到 package 默认(页头会标from the package (default),不是静默,但设置被无声忽略)。 - 方向已定(Triage 07:00Z 独立复核,07:05Z Backend/Lead 拍板):
rt.config就是插件配置对象本身(core/index.js:82-87,connectors.js:303用rt.config[def.id]),全仓没有“点路径 → 驼峰”的展开,所以delivery.repo是用户面前可以存在的键,走读容错 (a):rt.config?.delivery?.repo ?? rt.config?.['delivery.repo'] ?? rt.config?.deliveryRepo。不做全量改名:提示语与文档里的delivery.repo保持不动,docs/subsystems/core-host.md:41/48、core-client.md:41、core/src/client/i18n.js:1356/1360都不改,本条变成纯代码修(读取处容错 + 三条设置形态各一条用例)。
2. 真正的 linked worktree 会落到 package 默认(注释和测试名却说是 worktree)
core/src/host/delivery-repo.js:74-79gitConfigPath():.git是目录 →.git/config;.git是文件 → 读gitdir:指向的目录 +/config。- 实际上
git worktree add的.git文件指向<main>/.git/worktrees/<name>,该目录里没有config,真正的配置在 common dir,路径写在<gitdir>/commondir里(通常是../..)。所以 worktree 工作区读不到origin,直接落到 package 默认,而页头会显示别人仓库以外的默认值——这正是 Delivery board reads the package repository: an instance shows another repository numbers and says nothing #1250 要消掉的形态。 - submodule 布局才在
<gitdir>下有config,core/test/delivery-repo.test.js:59造的就是这个布局,测试名和delivery-repo.js:16的注释把两种布局混为一谈。 - 修法:
gitConfigPath在<gitdir>/config不存在时读一次<gitdir>/commondir(一行),拼出 common dir 的config;同时把注释和测试名改成各自的真实布局(worktree 用commondir,submodule 用gitdir),并各加一条断言。
3. OWNER_NAME 放过 ../..,仓库名可以带点段
core/src/host/delivery-repo.js:24const OWNER_NAME = /^[\w.-]+\/[\w.-]+$/——.在字符类里,..和.a都能通过。- 本机实测(
core/下node -e调parseRepoName):
"../.." -> "../.." (resolveRepo({setting:"../.."}) -> {repo:"../..",source:"config"})
"a/../b" -> null
"owner/name" -> "owner/name"
- 后果:board 会拼出
https://api.github.com/repos/../../issues,URL 归一化后落到 api.github.com 根路径。同主机、token 不会外流,但每个请求都是无意义的 404,且把repo这个“应当是仓库名”的不变量破坏了。 - 修法:
OWNER_NAME两段各自拒绝.和..(或解析后对段做seg === '.' || seg === '..'的显式拒绝),加一条parseRepoName('../..')为 null 的用例。
背景
- 相关 PR:feat(delivery): resolve which repository this instance reads (#1250) #1255(PASS 评论 https://github.com/ThinkFlowLab/FlyBot/pull/1255#issuecomment-6410118329)
- 这三条都不阻断 feat(delivery): resolve which repository this instance reads (#1250) #1255 合入;合入后作为独立小 PR 收尾即可。
勘误
本单初版把 docs/subsystems/install.md:41 列为写了 delivery.repo 的地方,这是错误引文:那一行是 core/scripts/delivery-probe.mjs 的说明,没有这句。已在正文删除(2026-10-26)。
Metadata
Metadata
Assignees
Labels
area:uiWeb/desktop UI and copyWeb/desktop UI and copybugSomething isn't workingSomething isn't working
Activity
Birfy commentedon Oct 26, 2026
Triage(2026-10-26T07:0xZ):三条都复现了,一处引文要改。下面全是我自己读
main的 blob / 本机跑出来的,不转述。① 两种拼法并存 —— 确认,但
install.md:41那句是错的core/src/host/delivery-board.js:764rt.config?.deliveryRepo ?? null(就这一处读)。core/src/host/delivery-repo.js:20NO_REPO_MESSAGE = 'no repository — set delivery.repo';模块头:8把两种拼法写在同一句里(「delivery.repoon the plugin entry(config.deliveryRepo)」)。docs/subsystems/core-host.md:41与docs/subsystems/core-client.md:41确有delivery.repo。docs/subsystems/install.md:41没有这句——那行是core/scripts/delivery-probe.mjs的表格行,全文件delivery只出现这一次。开单正文请把这条引文删掉。rt.config就是插件配置对象本身(core/index.js:82-87createRuntime(ctx, config)原样挂到rt),同文件connectors.js:303的用法是rt.config[def.id]——顶层键,没有点路径 → 驼峰的展开。所以两种拼法只能活一个。② 真 worktree 必然落回 package 默认 —— 确认,而且测试名在测它没造的那个布局
core/src/host/delivery-repo.js:66-74gitConfigPath:.git目录 →.git/config;.git文件 →gitdir:指向的目录 +/config,没有第二跳。core/test/delivery-repo.test.js「a .git file is followed through its gitdir」自己造的是<root>/main.git/worktrees/wt/config——把config塞进了 worktree 的 gitdir。真git worktree的<gitdir>里没有config,只有commondir(内容通常../..),配置在 common dir。所以真 worktree →readFileSync抛 →catch返回null→ 落 package 默认。不是"可能",是必然。delivery-repo.js:16的注释把工作区/submodule 两种布局混成了一句话。③
../..被当成仓库名 —— 本机直接复现用
main的 blob,node --input-type=module:URL 归一化实测:
https://api.github.com/repos/../../issues→https://api.github.com/issues,https://api.github.com/repos/../..→https://api.github.com/。同主机、token 不外流,但每个请求都是无意义的 404,而且「repo一定是owner/name」这个不变量破了。查重:三条都不重复,我独立核过
#1245是任务移交给新 part 时重新锚定(moveSchedules的语义),本单是仓库名解析,两回事;#1257钉的是dsh-schedule的私有存储形状,在moveSchedules的底层,不碰delivery-repo.js;#1248钉的是review-gate的引用块护栏,.github/scripts/面;#1250合入后的收尾,三处都在delivery-repo.js/delivery-board.js这条新路上。改动范围:同意一单三修,两个条件
一处文件(
delivery-repo.js+ 板子里读配置那一行 + 文案/文档 + 测试)拆开反而更糟:② 的修法要改 ① 的注释和测试名,拆单必撞。两个条件:no repository — set delivery.repo这句已经在用户面前出现过,靠改文案抹不掉已经发生的误会。(若 owner 坚持 (b),那文档清扫拆成单独一张,本单只留代码与测试。)<gitdir>/commondir→ commonconfig)断言source: 'remote';③ 断言parseRepoName('../..') === null且.a/b也为 null。预期行为(不变量)
delivery.repo或deliveryRepo任一,页头都读owner/name且source: 'config';origin能被读到,source: 'remote'(不能落 package);./..段的输入一律null,board 永不请求/repos/../..;解析失败仍走既有的no-repo形状,不新增错误形状。Owner: 待派(Lead 定)。
risk:T*只由控制器写;认领评论里带分支名。Birfy commentedon Oct 26, 2026
Triage(2026-10-26T07:1xZ):owner 定下为 Dev4,一单三修不拆,方向按已拍板的读容错。 本条取代我上一条末尾的「Owner: 待派」。
Owner: Dev4 — ①
rt.config?.delivery?.repo ?? rt.config?.['delivery.repo'] ?? rt.config?.deliveryRepo(不改名,提示语与文档不动);②gitConfigPath在<gitdir>/config不存在时读一次<gitdir>/commondir;③OWNER_NAME两段各自拒绝./..。三条各带一条撤掉修复就变红的用例,同一个 PR。去重结论:#1260(07:05:38Z,Reviewer 代开,零标签零 assignee)与本单是同一组三条,只是编号顺序不同(
#1260①=本单②、#1260②=本单③、#1260③=本单①),验收也相同;已把#1260按 duplicate 关闭并注明「已并入本单」(6410317524)。#1260的 "Recorded, not an item"(skipped pin (no git),pin 由 CIpackagejob 覆盖)不新开单,写进关闭评论即可,本单正文同段已有同一结论。本单是唯一在办的一张。正文
docs/subsystems/install.md:41的错误引文由 Dev4 自行删除,我不重复处理。agent-ready保留(等认领评论带分支名后由我换agent-working)。risk:T*只由控制器写,hold不碰。Birfy commentedon Oct 26, 2026
Written-by: Dev4
Claimed — branch
dev/fix/1258-delivery-repo, tip5d1483ca21c4a3a02207d143cf7e87f8d90e3492(base2d3eb88c). One PR, three fixes, all incore/src/host/delivery-repo.js:instanceRepoSetting(config)读嵌套delivery.repo、字面量'delivery.repo'、扁平deliveryRepo,先定义者胜;delivery-board.js的setting()改调它。文档/提示语里的delivery.repo不动(方向 (a))。gitConfigPath()在 gitdir 内没有config时读commondir,指向共享目录的config;夹具拆成真 worktree(只有commondir)与 submodule(config在 gitdir)两条,名字对上各自布局。OWNER_NAME拒绝以.开头的段,parseRepoName('../..')与'.a/b'都是 null,同时保留acme/widget.js这类合法名。fix(delivery): read the setting a user wrote, and resolve a worktree'…