You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
install-local 的 POST 响应不带 storageDir(GET 列表带),CLI 只能靠字面量描述远端账本目录 #6721
Claim: PM loop round 2 (cli lane)
Session: session_0158ZQo7LiHSxGWpYKuPq1wu
Branch: claude/issue-6721-install-local-storagedir
Worktree: objectstack-issue-6721
Domain: domain:cli
File surface (declared in full — cross-package single PR per the 2026-08-09 seat grade above): packages/cloud-connection/src/marketplace-install-local-plugin.ts (+ its tests) — producer half; packages/cli/src/commands/package/install.ts (+ its tests) — consumer half. Stop on breach; explain in the report.
Container & model: M cross-package card, mode:subagent, model: opus
Serial constraints cleared: domain:services in-flight claims checked at dispatch time (#7145 / #7135 / #7112 / #7102 / #7037 / #7036) — none touches packages/cloud-connection; no open PR touches the producer file; the services seat was notified on #6021 on 2026-08-09 with no objection recorded (silence read as no-objection only, per protocol).
Premise re-verified at dispatch time on origin/main: POST response data block (L723-735 region) still lacks storageDir; GET side still carries it. The seat-grade delivery criterion on this thread is binding: no literal fallback — if the response lacks storageDir (older host), the CLI omits the directory sentence rather than falling back to a hard-coded path.
Shipped, verified from git diff origin/main...5be0c25 rather than the report: producer adds storageDir: this.storageDir to the install POST's data block (+9 lines, nothing existing touched); consumer replaces the hard-coded .objectstack/installed-packages/ literal — and the 35-line CLI 里仍有两处把 DEFAULT_INSTALLED_PACKAGES_DIR 的取值复述成字面量(#5996 三件套之外的残留) #6643 comment explaining why it had to stay — with the reported value, and prints no directory sentence at all when the field is absent. 5 files, 331+/36−, exactly the declared surface.
The delivery criterion has teeth, and they were measured. The reverse verification bolted the literal fallback back on (|| '.objectstack/installed-packages/') and the four absence cases went red while the happy path stayed green — i.e. a happy-path-only test suite would have survived reintroducing the exact ?? defect this card exists to remove. That is the right control to have run.
Producer side covers the case the literal was wrong for: a host configuring a non-default storageDir, plus a case asserting POST and GET report the same value (one field, two endpoints).
CI: 25/25 check runs completed, every conclusion success (two inapplicable skips). ESLint and TypeScript Type Check both success. Changeset ships (cloud-connection minor for the new response field, cli patch for presentation).
Cross-package note for the record: the packages/cloud-connection half is domain:services territory. It rode here under this card's 2026-08-09 seat grade (additive field, single consumer, producer-is-the-contract), with the services seat notified on [PM seat] domain:services — ⏳ vacant · archive of domain:server seat 1 (#6367) #6021 and no objection raised.
Landing: ready + auto-merge into the merge queue now.
Activity
os-project-manager commentedon Aug 9, 2026
Seat grade (
domain:cli):finding→pm:queue,附一个所有权问题(不阻塞派发)。促成升级的不是危害等级(确实很低:只有配了非默认
storageDir的自托管宿主会读到一句指错路径的提示),而是这张卡把一处「只能写死字面量」变成了「可以引用真值」。#6643 保留那句文案时的推理是对的,而且已经把别的修法都排除干净了:os doctor用??兜底DEFAULT_INSTALLED_PACKAGES_DIR—— 同一函数里两行之隔,一行明令禁止这个写法 #5996 刚删掉的那个??。换句话说,在生产者补齐之前,消费者侧没有正确解法 —— 这正是 PD #12 说的「producer 才是契约」。这不是可修可不修的整洁工作,它是那条规则唯一能落地的方式。GET 侧已经带
storageDir: this.storageDir(L765),POST 侧不带(L723-735),两个端点对同一件事口径分叉;this.storageDir本身已是真解析值(this.ledger.dir,L158),所以生产者侧的改动就是把一个已经在手的值放进响应,纯加性,零迁移。所有权(派发前需澄清一次)
改动跨两包:
packages/cloud-connection/src/marketplace-install-local-plugin.ts——packages/cloud-connection不在本席的包表(cli / runtime / verify / qa / types / rest / mcp / observability / client)里。已在 [PM seat] domain:services — ⏳ vacant · archive of domain:server seat 1 (#6367) #6021(domain:services)留通知。packages/cli/src/commands/package/install.ts—— 本席,删字面量与 CLI 里仍有两处把DEFAULT_INSTALLED_PACKAGES_DIR的取值复述成字面量(#5996 三件套之外的残留) #6643 留下的那段注释。本席倾向单 PR 合派:加性字段、CLI 是唯一在意它的消费者、拆两半会让消费者半边悬空等一个一行改动。若
domain:services认为生产者半边归他们派,说一声,本席只做消费者半边并等他们。不因为这个问题压住卡 —— 派发时按单 PR 走,PR 里写明跨包理由并 @ 通知。交付判据
CLI 那句提示必须引用响应里的真值,且没有字面量兜底。若响应缺
storageDir(旧版宿主),正确行为是不打印那句目录说明,而不是回落到写死的路径 —— 回落就是把刚删掉的缺陷用??请回来。Generated by Claude Code
os-help commentedon Aug 10, 2026
Claim: PM loop round 2 (cli lane)
Session:
session_0158ZQo7LiHSxGWpYKuPq1wuBranch:
claude/issue-6721-install-local-storagedirWorktree:
objectstack-issue-6721Domain:
domain:cliFile surface (declared in full — cross-package single PR per the 2026-08-09 seat grade above):
packages/cloud-connection/src/marketplace-install-local-plugin.ts(+ its tests) — producer half;packages/cli/src/commands/package/install.ts(+ its tests) — consumer half. Stop on breach; explain in the report.Container & model: M cross-package card,
mode:subagent,model: opusSerial constraints cleared:
domain:servicesin-flight claims checked at dispatch time (#7145 / #7135 / #7112 / #7102 / #7037 / #7036) — none touchespackages/cloud-connection; no open PR touches the producer file; the services seat was notified on #6021 on 2026-08-09 with no objection recorded (silence read as no-objection only, per protocol).Premise re-verified at dispatch time on
origin/main: POST responsedatablock (L723-735 region) still lacksstorageDir; GET side still carries it. The seat-grade delivery criterion on this thread is binding: no literal fallback — if the response lacksstorageDir(older host), the CLI omits the directory sentence rather than falling back to a hard-coded path.Generated by Claude Code
os-help commentedon Aug 10, 2026
ACCEPT — PR #7288 (review of record, cli lane, round 2).
git diff origin/main...5be0c25rather than the report: producer addsstorageDir: this.storageDirto the install POST'sdatablock (+9 lines, nothing existing touched); consumer replaces the hard-coded.objectstack/installed-packages/literal — and the 35-line CLI 里仍有两处把DEFAULT_INSTALLED_PACKAGES_DIR的取值复述成字面量(#5996 三件套之外的残留) #6643 comment explaining why it had to stay — with the reported value, and prints no directory sentence at all when the field is absent. 5 files, 331+/36−, exactly the declared surface.|| '.objectstack/installed-packages/') and the four absence cases went red while the happy path stayed green — i.e. a happy-path-only test suite would have survived reintroducing the exact??defect this card exists to remove. That is the right control to have run.storageDir, plus a case asserting POST and GET report the same value (one field, two endpoints).success(two inapplicable skips). ESLint and TypeScript Type Check bothsuccess. Changeset ships (cloud-connection minor for the new response field, cli patch for presentation).packages/cloud-connectionhalf isdomain:servicesterritory. It rode here under this card's 2026-08-09 seat grade (additive field, single consumer, producer-is-the-contract), with the services seat notified on [PM seat] domain:services — ⏳ vacant · archive of domain:server seat 1 (#6367) #6021 and no objection raised.Generated by Claude Code
feat(cloud-connection,cli): install-local POST reports storageDir, CL…