Repository navigation
fix(app): list draft projects from every connected Environment - #402
Conversation
|
React Doctor found no new issues. 🎉 Reviewed by React Doctor for commit |
commit: |
|
auto-merge: no head out of
needs human review (multi-Environment draft path). |
Runtime proofIsolated desktop verify (CDP 9333, separate PIE_HOME). Web 4180/4190 were held by another worktree, so this run did not touch them. Drive: draft picker on the isolated sample project.
recording-001.webm is that drive. SSH to the laptop refused with a version mismatch, so the multi-Environment group labels were not on this live window. Those labels are covered by the Chromium component test. recording-001.webm |
|
auto-merge: no head out of
not presentation-only; leave for human review. |
Runtime proofIsolated web verify at http://localhost:4190/ (single Environment: this device). Drive: draft project picker.
recording-001.webm is that drive. Group labels need a second connected Environment; this run had none, so that split is covered by the Chromium component test, not this window. recording-001.webm |
|
auto-merge: no head out of
not presentation-only; leave for human review. |
Review-and-merge gate record — not merged
Required CI observed for this head
Blocking gate and conclusion
Stopped before code review and independent verification; not merged. These are gate observations, not an implementation-quality verdict. No branch update, conflict resolution, CI rerun, protection bypass or fix-and-merge was performed. Revisit only after a relevant change resolves the recorded blocker: an author-provided head containing current |
32aff86 to
d19b36f
Compare
本轮审查入口检查:等待 CI
当前 GitHub 状态为
本轮停止在入口检查,未进行代码审查或独立验收,未合并;这不是对实现质量的结论。前次评论针对旧 head 的门禁状态不代表当前版本。 下一轮条件:当前候选版本的所有 required checks 均实际成功,且保持非 Draft、无冲突、不落后于 base。届时从 CI 开始审查;不因未变化的等待状态重复评论。本轮未更新分支、解决冲突或重跑 CI。 |
|
auto-merge: no head out of
fail closed; no update-branch. |
The draft picker only listed the active Environment's projects, so a linked host's projects were invisible until its Environment became the draft target. The picker now fans project.list across every connected Environment (same prefixed cache keys the sidebar uses), groups and labels each Environment when more than one has projects, and picking a project writes the owning Environment's id into the draft URL. Non-project chats stay local: clearing the project drops the environment hint, and a linked host's picker hides every path back to null (no clear, no Choose project, no Don't-work button) because chat-folder allocation under ~/Pie is local-only.
A grouped project dropdown mixed every host. Pick the Environment first; the project list is only that Environment's imported projects.
Do not pick an Environment first. The project list splits connected hosts into labeled groups; choosing a project addresses that host.
d19b36f to
4f920b7
Compare
审查阻塞:新增远端加载会丢失已输入的草稿
P1 — 不要让其他 Environment 的首次加载卸载草稿编辑器用户已经在本地草稿输入内容时,新 SSH Environment 连接完成会加入 卸载不是无损隐藏:use-chat-input-controller.ts L24–40 会 dispose 编辑器,而 DraftComposer L48–64 没有提供 onDispose/initialContent 保存与恢复。远端加载结束后新建的是空编辑器,未发送文本丢失;远端慢请求也会阻塞原本可用的本地草稿。 需作者保持已挂载草稿及其输入不受无关 Environment 加载影响,并补充回归覆盖:本地输入 → 新远端首次列表 pending → resolve/reject → 本地文本仍在且本地可用。已有新增测试只覆盖 ProjectSelect 的分组和选中回调,没有覆盖此路由/编辑器生命周期。 结论与证据边界代码审查未通过,未合并。 上述是源码与生命周期调用链确认的问题,不声称已用真实 SSH/UI 重现。按门禁顺序,未进入独立运行验收,未运行本地测试或截图/视频验收;历史作者证据不能替代新 head 的独立验收。没有修改代码或自行修复。当前身份是 PR 作者,使用此评论记录本应 Request changes 的阻塞,不替代任何必需审批。 作者修复并提交新 head 后,重新从当前 base、required CI、审查开始;通过后仍需独立 Web/Desktop 的跨 Environment、清除归属和失败路径验证及截图/视频证据。 |
|
auto-merge: no head out of
Din review-first: no squash-merge. |
|
Current head |
|
auto-merge: no head out of
fail closed — comment only (Din review-first; no merge). |
Draft-loss repair submitted — independent acceptance still requiredRepair commit The loading gate no longer replaces an available draft when an unrelated Environment starts its first project-list request. It still waits for the active Environment, and for unresolved catalogs when no imported projects are available. No persistence, RPC contract or shared component changes. Added a Chromium regression at the actual draft-route/editor seam, using real TanStack queries and the real editor with controlled RPC links and an Environment feed (not a live SSH proof). Local input → remote first-load pending → remote resolve/reject must retain the same editor DOM node and exact text, with local submit still enabled. The final regression assertions failed on the old gate (editor replaced by Loader) and passed after the fix. Both outcomes plus existing project-picker cases: 4/4 passed. App typecheck, scoped formatting, commit-hook lint and React Doctor 100/100 passed. A test-placement boundary violation found by the hook was corrected by locating the test at the route composition root, not suppressing the rule. Ordinary history-preserving push; no conflict resolution, force-push or protection bypass. New CI, independent full-PR review and real Web/Desktop cross-Environment verification with screenshots/video remain outstanding. No merge or deferred auto-merge armed. |
Queue update after verified #423 merge — waiting at CIHead Required CI for this new head is queued/in progress at this observation, so no old-head review or acceptance is carried forward. The earlier repair/self-test record is not independent acceptance. No additional repair was made. No merge or deferred auto-merge. Continue only after the applicable blocker is resolved and the new version passes required CI → review → independent acceptance. |
|
auto-merge: no head Out of the allowed groups; hits exclusions:
|
Keep main's Project extension wording and this branch's grouped draft picker note.
|
Merged current Conflict was only
|
Review and verification record — approved, merging
Review
Independent verificationClean worktree at this head. Locked install. Isolated
Gaps (accepted, not blocking)
Evidence below. The local sample path in the open-picker frame and video is masked with a grey bar. 402-web-pick-send.webm402-web-clear-allocate.webm |
|
Merged as 257f0da (squash, head guard |



















What
The draft picker only listed the active Environment's projects, so a linked host's projects were invisible until its Environment became the draft target. The picker now:
project.listacross every connected Environment — same prefixed cache keys the sidebar and catalog worker use, so it subscribes to warm caches;environmentIdinto?environmentId=when a project is picked.Non-project chats stay local (
~/Pieallocation is local-only, per CONTEXT.md): clearing the project drops theenvironmentIdhint, and a linked host's picker hides every path back to null — no clear (X), no Choose project item, no Don't work in a project. A stale/draft?environmentId=<remote>URL with no project disables send instead of allocating remotely.The empty-import draft state now appears only when every connected Environment has no imported projects; a remote-only catalog is enough to compose.
Verification
pnpm exec vitest run --config apps/app/vitest.browser.config.ts src/features/projects/project-select.test.tsx— 3 tests in real Chromium: local null mode keeps clear + Don't-work button;requireProjecthides every path back to null; multi-Environment popup renders both labels and picking a remote project emits the owningenvironmentId.pnpm --filter @getpie/app test— 199 passed.turbo run typecheck lint:check --filter=@getpie/app+oxfmt --check— clean; react-doctor--scope changed --blocking warning100/100.pie-verify webrun (Vite is strictPort), and no SSH Environment is connected here, so the grouped popup was proven via the browser test rather than a driven UI. Happy to attach runtime captures once 4190 frees up.