chore(gui): mission work logs — cordis design finalization, tool-card wire archive, incident records chore: missions chore: missions chore(gui): mission ledger — batch-2 answers, parallel dispatch state, jsdom coverage re-scope chore(gui): ledger — night-mode standing orders (self-commit small, no push, 5-min refresh) chore(gui): ledger — jsdom batches 2-4 landed (233 green), coverage probe next chore(gui): ledger — web-ui coverage probe 65%, four-tier fill plan approved chore(gui): ledger — cordis-impl B1 state after third API drop, decisions on file chore(gui): ledger — 01:32 patrol snapshot (jsdom tier-1 landed, coverage-fixer probed) chore(gui): ledger — 01:37 patrol (peer src trio landed, coverage-fixer still silent) chore(gui): ledger — 01:42 patrol (jsdom tier-2 landed, peer committed x2, coverage-fixer 2nd probe) chore(gui): ledger — coverage diagnosis complete (6-file gap list), web-ui at 91.4% chore(gui): ledger — 01:46 patrol (B1 done, jsdom tier-3 landed, coverage fix batch running) chore(gui): ledger — 01:51 patrol (jsdom tails x2 landed, B2 underway) chore(gui): ledger — 01:56 patrol (gateway.ts 337 lines, checkpoint T-7min) chore(gui): ledger — hold/pending split ruling, coverage-fixer externalize-or-restart ultimatum chore(gui): ledger — 02:01 patrol (B2 done, jsdom final arms, coverage ultimatum pending) chore(gui): ledger — 02:03 checkpoint executed (fixer2 respawn, four lanes released, three owners cold-started) chore(gui): ledger — all six lanes acked, type isolation first live proof (client closure clean) chore(gui): ledger — 02:08 patrol (all seven lanes active, wire carrier assembled) docs(gui): respond-design task checkpoint — apiproxy wire-layer recon done chore(gui): ledger — P0-2 contributor AGENTS.md landed (dd28a5019) docs(gui): respond-design checkpoint 2 — host-side recon (stub respond, frame types, approval seam, ACP answerer precedent) docs(gui): OOP debt inventory — seven territories, 2 real debts (createApiProxy, createFixtureApi), rest ruled keep-as-is docs(gui): disambiguation note on the archived i18n design task chore(gui): ledger — 02:12 patrol (exclude removed, mixed-knife incident under reconciliation) chore(gui): ledger — 02:15 wave (jsdom mission closed, OOP audit done, B3 isolation proof, mixed-knife resolved) chore(gui): ledger — 02:17 patrol (attribution reversal filed, arch-session probed) chore(gui): ledger — 02:22 patrol (B4 done, B5+B6 merged batch, arch-session deadline set) docs(gui): respond-design checkpoint 3 — client-side recon (pending map, PendingCard onRespond stub, AbstractApiClient.respond ready, bootHost missing approval mounts) docs(gui): peer carrier territory review — 2 fixes (SSE cancel leak, route-reservation guard), 1 ruling ask (RPC-log visibility), compliance ledger chore(gui): ledger — 02:27 (arch-shell respawn, territory review verdicts routed, ask-deny finding flagged) docs(gui): P1-5 respond design page complete — pending registry, wire answerer, client state machine, first-wins arbitration chore(gui): ledger — 02:31 patrol (respond design complete, B5 wire smoke green, shell knife 1 underway) docs(gui): respond design — add §0 status warning (web host ask defaults to deny), mount-behavior delta, no-timeout ruling with Config discipline chore(gui): ledger — 02:42 patrol (respond line closed pending review, B7 last piece underway) docs(gui): respond design contract review — direction pass, 2 doc fixes (settle-order contradiction, answering-state race), A/B/C compliance ledger docs(gui): respond design — contract review fixes (R1 verify-before-delete arbitration, R2 answering+resolved-frame transition, ask dual-source wording, rejected-is-ok-value note) chore(gui): ledger — 02:46 patrol (respond line final, two user decisions distilled, arch-shell deadline) docs(gui): respond review addendum — contract-gap ruling: approve plan A (ApprovalRequest.id), wire unchanged, drop plan B backscan chore(gui): ledger — cordis B7 summit: real-browser 10/10 green, user acceptance criterion proven docs(gui): respond design — contract gap #4 approved as plan A (ApprovalRequest.id), backscan fallback retired, blade 0 prepended docs(gui): respond design — final polish (owner-approval vs user-go-ahead wording, implementation handoff notes) chore(gui): ledger — 02:51 (shell-exec third respawn with operational script, respond line 4-knife final) chore(gui): ledger — 02:53 wave (respond five-knife true final, B7 closed 12/12, client.ts green) chore(gui): ledger — 02:56 patrol (cordis closeout bounced pending R1/R2/N1, shell-exec first sign of life) chore(gui): ledger — 03:01 patrol (R1/R2/N1 remediation in flight across four files) chore(gui): ledger — cordis line officially closed and archived, verified on disk (24 knives, 12/12, reviews closed) chore(gui): ledger — 03:06 patrol (shell-exec final window, lowered first-knife bar) chore(gui): ledger — 03:11 patrol (shell line iced-broken: three registries on disk) chore(gui): ledger — 03:15 patrol (quiet window, both active lanes within threshold) chore(gui): ledger — 03:20 patrol (shell five files up, api-proxy plan reported) chore(gui): ledger — 03:25 patrol (shell migration in flight with history-preserving moves, webserver green) chore(gui): ledger — 03:30 patrol (shell knife-1 in verification, api-proxy patching) chore(gui): ledger — shell knife 1 accepted (694cecc53), knife 2 released chore(gui): ledger — 03:40 patrol (knife 2 pre-move stage, cold-list spec appears) chore(gui): ledger — 03:45 patrol (rpclog moves staged, api-proxy two specs in flight) chore(gui): ledger — 03:54 patrol (knife-2 code done, coverage full-run final check) docs(gui): coverage-fixer task ledger — fixer2 takeover, per-file fix log, isolated reportsDirectory pitfall chore(gui): ledger — coverage lane closed and accepted (a19f069a5), the PR #443 CI fix knife chore(gui): ledger — 04:04 patrol (knife-2 calibration, sole active lane) chore(gui): ledger — shell knife 2 accepted (f8fb77b95), knife 3 released as final night task chore(gui): ledger — 04:19 patrol (knife-3 past half: callback chain through, ToolCallDetail up) chore(gui): ledger — night closeout summary: seven lanes closed, wake-up decision sheet chore: missions chore: missions chore: missions chore(gui): mission-local browser/probe verify scripts under missions/scripts/ The six acceptance/probe scripts move here as mission-side working material (headers and relative imports adjusted for the new location): carrier-errors, rpclog-panel, session, session-real, webserver-backpressure, webserver-hardening. chore(gui): verify-relocate mission log chore(gui): verify-relocate mission log — R1 guard addendum chore(gui): gates-continue mission log — CI-equivalent sequence all green chore(gui): VS Code 扩展体系双边设计调研报告 chore(gui): 调研追加 4.5 节——git 扩展数据面与 scope 绑定 docs(gui): web plugin system RFC — walkthrough + design notes docs(gui): RFC — restore existing SSE/POST as the v1 transport; envelope rides on it (D16) docs(gui): RFC — envelope demoted to chan-dispatch, scope out of envelope, rpc-log cut, peer deferred, scope tree is native cordis (D17-D21) docs(gui): RFC — hooks re-derived from component needs: useWatch/useAction only, useService removed; sessionHub cut, projections user-space, router rename, loader-only root (D22-D25) docs(gui): RFC — drop stale fork vocabulary (vendored cordis has Fiber only; scope = mintScope pattern), hook idempotence contract (D26-D27) docs(gui): RFC — session precision seam: plugins read scope key (host paradigm), React gets it from tree position via SlotOutlet (D28) docs(gui): RFC — domain hooks owned by plugins over framework primitives; useConversation paradigm carried over (D29) docs(gui): RFC — ctx services are the inter-plugin API (cordis proper); declarations are wire-only; get(id) returns scoped ctx (D30) docs(gui): RFC — full ctx.conversation walkthrough: root-singleton scope-sensitive service, caller-ctx scope key, get(key) as scoped ctx (D31) docs(gui): RFC — no client-side agents collection: session state machine already expresses the duality; agent resolution stays host authority (D32) docs(gui): RFC — v1 stays session-precision, no agent-level isolation; incarnation/agent-axis designs archived in ledger (D33) docs(gui): RFC walkthrough — full rewrite to final state (D16-D33 consolidated), end-to-end chain restored docs(gui): RFC — apiproxy demoted to generic channel routing; domain RPCs dissolve into owner plugins (D34) docs(gui): RFC — TS-interface-first wire contract (zod internal), conversation owns the dialogue frame with pluggable views (D35) docs(gui): RFC — page skeleton (sidebar+conversation), projects as plugin not service, nested slots via owner registries (D36) docs(gui): RFC — SlotMap declaration-merging slot model: single register API, inject-as-ownership, FC-typed registration, typed outlets (D37) docs(gui): RFC — slot props whitelist: identity, display params, materialized snapshot slices, stable UI callbacks (D38) docs(gui): RFC — end-to-end data flow: three transforms, equality protocol table, immer placement; i18n/theme kept standard (D39-D40) docs(gui): RFC — full external-injection model: props carry values + stable injected hooks; shared/client/react example rewritten (D41-D43) docs(gui): RFC final trio — modules.md (agent implementation spec), architecture.md (human walkthrough), plugins.md (business plugin inventory) docs(gui): RFC — props three-source merge (scope-standard useSession auto-injected); keyed key vs list id disambiguated (D44) docs(gui): RFC — inject comment says what it is (the React-facing props bundle); SessionHandle rename; snapshot-production story unified on buildSnapshot docs(gui): RFC architecture — full React component tree walkthrough: props three sources, slot vs plain children, hook taxonomy per node docs(gui): RFC — module map finalized (ui-slots/web-react/connection/runtime/ui-*/web); slots onChange replaced by cordis events; toolcall dimension; detail sidebar default-collapsed with toolName-keyed routing docs(gui): RFC plugins — openDetail relay chain: toolcard calls chat-view injected action, chat-view relays to conversation sidebar chore(gui): progress ledger — full archive rewrite: RFC outcome digest, open gaps, dispatch plan, cold-start entry docs(gui): RFC grill pass 1 — SlotScope axis (root/session) on declares, Gate dependency inversion, inject handle by scope, W5 acceptance list, gantt relay chain fixed docs(gui): figma analysis — sidebar/projects/sessions 区域交互视觉理解报告 docs(gui): figma 解析报告 — details 面板/多视图 tabs/未来功能区盘点 + slot 需求清单 docs(gui): figma 对话主区解析报告 — 消息流/tool calls 变体/审批接管输入框/Header tabs/视觉 token docs(gui): plugins.md rewritten from figma analysis — three-column layout, full slot reservation table, selection channel, composer-takeover approvals, phased scope docs(gui): layout dynamics ruled (drag+collapse both rails, details yields first, composer swap-panel, same-component transition); toolviews promoted to named scope-aware registry docs(gui): P-I scope locked (details minimal, dual theme, chat-view, custom toolview sample); teammate dispatch plan — 6 owners by package, dependency-driven waves, contract arbitration docs(gui): P-I api-contracts (full inter-package API spec) + dispatch plan (T0 skeleton knife, 7-dev roster, task briefs, milestones) docs(gui): api-contracts v2 — scope tree in P-I, bundle loader + per-plugin CSS isolation in P-I, agent-scoped toolviews live, zustand engine, renames (SessionProvider/ObservableSnapshot/SessionBinding), router owns all shell view-state docs(gui): services roster + progressive loading (no blocking loadAll), SlotsService as real cordis Service, renderSlot/renderSuspenseSlot duo, ui-traj teammate docs(gui): loading-chain gaps ruled — dev=rebundle no HMR, ui-primitives package, externals on globals (no import map), host injects __DSH_BOOT__ into HTML (zero round-trip) docs(gui): api-contracts v3 + dispatch v2 final — 12 packages, services merged in, progressive loader, global externals, __DSH_BOOT__ injection, 8-dev roster with convo split and ui-traj docs(gui): v3 amendments — router renamed ctx.layout, ui-trajectory has no service (pure consumer sample), wait-for-settled loading (no Suspense in P-I, ledger 6b) chore(gui): progress — pre-compact final state: v3 revision chain, 8-dev roster, T0 procedure, doc authority order docs(gui): authority banners — modules/architecture get v3 term-mapping headers, walkthrough marked as archived process doc docs(gui): cssdesign token set is THE theme source (--dsw-* variables, data-ds-dark-theme switch); recorded in contracts + progress docs(gui): architecture.md full v3 rewrite — loading chain, 12-package map, service roster, slot/inject/toolviews, data flow, component tree, perf model, all current docs(gui): contracts — UI plugins are dual-entry host plugins (node half serves client asset via ctx.webPlugins; __DSH_BOOT__ derives from it; client-closure gate back in scope) docs(gui): contracts — closure-factory bundles with DI require (no globals), package.json dshWeb declarative discovery (no serve ritual), create-then-send empty state with project picker, ancestry() for breadcrumb, unload stubbed until HMR, props.renderSlot confirmed docs(gui): dshClient declaration (inject/platform/immediately, exports./client), closure-DI require loading — synced across contracts/dispatch/modules/architecture/walkthrough chore(gui): progress — record final loading-chain rulings (dshClient declaration, closure-DI require, startSession) before compact docs(gui): architecture.md — developer-facing whole-web architecture on master baseline 6b16a67cb: what exists, what is new, no process narrative docs(gui): architecture.md — self-contained whole-web architecture: absorbs still-valid substance from the branch RFCs (host layering, four-quadrant RPC, object layer, testing tiers) under the new plugin system as the override chore(gui): progress — final pre-compact snapshot: contracts digest, apiproxy purity ruling, T0 procedure with first-action list docs(gui): api-contracts v3 §3.1 — apiproxy purity principle with three-way existing-code verdicts docs(gui): api-contracts v3 — immediately reinterpreted as static-infra group (8-package dshClient scope, boot manifest reconciliation) docs(gui): api-contracts v3 — immediately corrected to early-load dynamic group (prod shell must not rebundle); loader shell-held; bundles register their export surface into module table docs(gui): architecture — align with immediately=early-load dynamic group ruling; loader shell-held; module-table registration of loaded bundles docs(gui): T0 checklist — 12-package skeleton table, 4-cut sequence, mv/attic/rewire rules (pre-drafted, awaiting go) docs(gui): t0-checklist — pin figma-flows findings (missing font-family base vars, three alias vars behind upstream) docs(gui): dispatch v2.1 — drop cordis-web salvage wording, two-wave staffing, loader/immediately boundary updates docs(gui): progress + t0-checklist ledger — T0 landed, staffing status, execution accounting docs(gui): api-contracts v3 — arbitration round 1: renderBody deps, RootBindingProvider, flush default sync, prune current, loader subpath, config-source P-I bar docs(gui): v3 §3.2 connection 导出清单附录(rt-core 对账)+ rt-core 实现计划档案 docs(gui): progress — T1 milestone, arbitration round 1 ledger, fw-react timeout escalation docs(gui): progress rolling update — per-line battlefield state at 00:2x, mailbox-vs-contract lesson, small-batch discipline reinforced docs(gui): fw-react notes — v3 §2 complete, seven knives, T1/T2 follow-ups docs(fw-slots): archive — four packages landed, open tails logged docs(gui): progress — framework layer complete (web-react five, fw-slots four packages), T2 gated on rt-core runtime knife only docs: api-contracts docs: style-spec docs docs(gui): tsconfig convergence ruling — no host.json, root resumes host-aggregate duty, typecheck = root + client aggregates docs(gui): missions 根三份 07-18 世代档案加「已被取代」头注——指向 web-plugin-rfc 现行权威并注明新旧对应 missions docs(gui): progress rewritten for post-closeout state — wave ledger, architecture finale, teammate roster with handover notes, pending-user-command queue
15 KiB
Figma 解析报告:左侧 Sidebar(projects / sessions 列表)
数据源:
.artifacts/figma/harness-full.json(Figma 文件树,页面0:1 Harness)。解析脚本在.artifacts/figma/(find_nodes.py / dump_tree.py / dump_texts.py,gitignored)。 核心参照物:独立组件稿133:7629 Sidebar(TREE WIP 区,300×920)、组件集14:3080 Cell/27:3260 Folder/14:3304 State、home 屏内嵌 sidebar(34:10632菜单展开态、122:10273普通态、42:28823暗色态、34:11333选中态、43:31859onboarding 态)。
1. Sidebar 整体结构
根 Frame 133:7629:300×920,VERTICAL 自动布局,gap=8,padding 左右 16 / 上下 6,背景 #F9FAFB,右侧 1px 描边 rgba(0,0,0,0.04)。从上到下四块:
| 区块 | 节点 | 尺寸 | 布局 | 内容 |
|---|---|---|---|---|
| 头部 | 133:7630 |
268×126 | VERTICAL gap=16, padBottom=12 | Logo 行 + New Session 按钮 |
| ├ Logo 行 | 133:7631 |
268×60 | HORIZONTAL gap=8, pad 4/8 | 左:logo(鱼形图标+wordmark,#3964FE)+ 「HARNESS」黑底白字小徽章(#0F1115 底、白字 11px/500 Intel One Mono、r=2);右:.Icon_container 28×28 圆形按钮内 ic_ds_panel_left_outline_16(#61666B)=收起 sidebar 按钮 |
| ├ New Session | 133:7634 |
268×38 | HORIZONTAL gap=6, pad 16/8, 居中 | 白底胶囊(r=24,描边黑@10%):ic_ds_new_chat 14px + 「New Session」14px/510 #0F1115。隐藏元素:loading 前缀圈(133:7635)和右侧下拉小箭头(133:7638,10×6 #A3A3A3)——预留「创建中」态和下拉选择(选 workspace?)态 |
| 把手 | 133:7639 Handle |
12×32 | 绝对定位,骑在右边框上、垂直居中(x=右缘-6) | 白底胶囊 r=10、描边黑@10%。实例来自远程库组件集 128:7160 Handle,当前只用 Property 1=normal 变体。所有 19 个 home 屏的 sidebar 都带它、位置一致 ⇒ 确认是 sidebar 折叠/拖宽把手 |
| 列表区 | 133:7640 |
268×717 | VERTICAL gap=4, padBottom=12 | 见下:区头 + 搜索 + Cell 列表 + 底部渐隐 |
| ├ 区头 | 133:7641 Text |
268×36 | HORIZONTAL, padLeft=12 | 「WorkSpace」14px/400 #81858C(弹性占满)+ 右侧两个 28×28 圆形图标钮:ic_ds_Personalization(三条带圆点的横线=分组/视图设置,点击弹 Group by 菜单,见 §3)和 ic_ds_project_add(新建 project/workspace) |
| ├ 搜索框 | 133:7648 Input |
268×54(内框 38 高) | 内框 133:7649:HORIZONTAL pad 14/9, r=24 |
底 #F1F3F5、描边黑@10%;放大镜 14px #ADB2B8 + 占位文字「Search name, keywords...」14px #81858C;隐藏的清除钮(133:7655 圆形 X)输入时出现 |
| ├ Cell 列表 | — | — | 父容器 gap=4 | project 行 54 高、session 行 34 高(见 §2)。展开的 project 后跟其 session 行,再接 spacing(268×20 透明矩形 133:7661)分隔下一批 project |
| ├ 渐隐遮罩 | 133:7666 Gradient |
268×72 | 绝对定位在列表底 | #F9FAFB 透明→不透明的线性渐变,滚动列表底部渐隐效果 |
| Foot | 133:7667 |
268×49 | VERTICAL pad 上下 10 | .Section_Profile(133:7668,268×29,r=12):ic_ds_settings 14px + 「Settings」14px #0F1115;隐藏 Notice 徽章(133:7672,#E4EDFD 底、#5686FE 字 10px,文案「企业账号」/组件原文「Topped-up balance ⓘ」)。组件原名 Yifan_D ⇒ 这行原是 profile 行,现改作 Settings 入口,徽章预留账号类型提示 |
暗色对照(42:28823):背景 #1B1B1C、右描边白@6%;New Session 按钮 #43454A+白@12% 描边;搜索框底 #1B1B1C+白@12% 描边;标题字 #F9FAFB、时间字 #ADB2B8。结构完全一致。
2. Cell 组件集(14:3080)——全部变体
组件集只有 2×2 = 4 个变体,props:Type = project | sub,State = Default | hover。没有 selected/running/archived 变体——选中底色靠实例覆写(见下),running/审批等状态靠内部 State 圆点插槽表达。
Type=project(54 高,两行)——project/workspace 行
14:3079Default:pad 8/6,r=8,无底色。结构:- 前导图标槽 16×20:
Folder实例(§2.1)+ 隐藏的 chevron(16:2673,hover 时换上); IconText(VERTICAL gap=2):标题 14px/400 Inter#0F1115(如 "Code base analysis")+ 第二行会话计数 12px/400 Inter#81858C("8 sessions" / "1 session"——有单复数);- 尾部隐藏的
State圆点 10×10(project 行也可带状态点,默认藏)。
- 前导图标槽 16×20:
25:2671hover:底色#263148 @6%;前导 folder 换成右向 chevron(25:2676);尾部出现 44×16 按钮组27:4668:ic_ds_ellipsis(… more 菜单)+ic_ds_plus(在该 project 里新建 session),both#81858C。
Type=sub(34 高,单行)——session 行
14:3078Default:pad 8/7,r=8。一排 16px 宽的可开关插槽从左到右(每个可见槽位把内容右推 22px=16+gap6,构成树形缩进):arrow-tree(133:8789,TREE WIP 迭代新加的槽):右向小 chevron#ADB2B8(由 chevron_down 旋转来,133:8793可见)=子树展开开关;另有一枚隐藏的向下 chevron133:8790悬在 cell 左侧沟槽(x=cell-11px)——展开态的画法,默认藏;spacing(133:8325,opacity 0,内含 State 实例):缩进占位,需要时可点亮成状态点;State(14:3069):10×10 状态圆点(§2.2),默认 opacity 0;- 两个隐藏
spacing(14:3170/14:3198,内含 chevron):更深缩进的备用槽; arrow(14:3071):8×10 的「└」拐角连线(Vector 546,描边#ADB2B8)=树的分支连接符,标记这行是上一行的子 session;IconText(HORIZONTAL):标题 14px#0F1115(超长截断,样例 "This is a session name which is pretty long")+ 右侧相对时间 12px#81858C(样例值 now / 2min / 1h / 2d / 18d / 2mo)。
16:2570hover:底色#263148 @6%;时间文字隐藏,换成ic_ds_ellipsis(27:4656)… 菜单钮。
实例覆写观察(选中态与树缩进)
- 选中行:会话打开屏
34:11333里当前会话行34:11386覆写底色#263148 @10%(hover 是 6%)⇒ 选中=同色更深一档。 - 树缩进实例样本(
34:11333列表,session tree):- 一级(project 直属):
34:11383"This is a ongoing session"——State 点亮(Ongoing); - 二级:
34:11385"Session"、34:11386"Session is waiting for approval"——arrow拐角可见,State 分别熄灭/amber; - 三级:
34:11390(2mo 行)——多点亮一个 spacing 槽,再缩一级。 - ⇒ 设计支持 session 下再挂子 session 的多级树(对应 fork/subagent 的会话树)。
- 一级(project 直属):
2.1 Folder 组件集(27:3260,5 变体)
| 变体 | 视觉 | 用途 |
|---|---|---|
close(27:3261) |
灰描边闭合文件夹 #81858C |
收起的 project |
open(27:3274) |
灰色打开文件夹 | 展开的 project(非活跃) |
open-active(27:3276) |
蓝色 #3964FE 打开文件夹 |
展开且含当前会话的 project(TREE 稿 133:7656 用的就是它) |
arrow(27:3282) |
右向 chevron #ADB2B8 |
hover/树开关(收起) |
arrow-open(27:3284) |
下向 chevron | 树开关(展开) |
2.2 State 状态点组件集(14:3304,5 变体,10×10 双圆结构:外圈同色 @10% 晕 + 6×6 实心)
旁边有图例 TEXT(122:9191–122:9194),按 y 坐标与变体一一对应:
| 变体 | 颜色 | 图例文案 | 语义 |
|---|---|---|---|
Done(14:3303) |
#22C55E 绿 |
"new task completed" | 有新完成结果未读 |
warning(14:3305) |
#F59E0B 琥珀 |
"need approval" | 等待审批(样例行 "Session is waiting for approval" 用它) |
Ongoing(14:3311) |
蓝色渐变描边圆环(#5686FE→透明,无填充) |
"agent working" | agent 运行中(缺口环≈spinner,可转动) |
Variant5(122:9182) |
#EC1313 红 |
"error" | 出错 |
Active(14:3308) |
填充全部 visible=false(绑定绿色变量但隐藏) | (无图例) | 占位/无状态(已读普通行就是点不亮) |
3. 分组模式(Group by)
- 「Group by Workspace」标签(
122:9529)下一列三块屏:34:10628(菜单展开态)、122:10273(普通亮色)、39:22754(暗色)。列表结构=§1:分组头就是 project 行本身(54 高 Cell),展开的 project 直属其下的 session 行,之后 20pxspacing再列剩余收起的 project。没有单独的分组标题条组件;spacing后面那批 Cell 不是归档区,就是其余收起的 project(此前"归档区"猜测不成立——全部设计稿中未发现任何 archive 元素)。 - Group by 菜单(
34:10628内122:10096 MenuDropdown,白底 r=12,双层投影 0/12/32 黑@8% + 0/0/4 黑@2%,弹出位置正对区头 Personalization 图标下方):- 「Group by」——灰色 14px 分节标签(不可点样式);
- 「WorkSpace」——带
ic_ds_check✓(当前选中); - 「Update」——按更新时间分组/排序;
- 「Status」——按状态分组。
- 菜单项是
.Menu_cell组件(130 宽、40 高、r=10、hover 变体走库里27:5171),另有 16 个隐藏备用项。
- 「Group by Status」标签(
122:10151)下方没有任何屏(全深度坐标扫描 x∈[10800,13500] 只有标签自己)⇒ Status 分组视图未设计,WIP。Update 分组同样无屏。会话打开屏(34:11948,ACTIONS 列)里也出现同一菜单实例(I34:12020/12021),说明菜单是全局常驻能力。 - 「ONBOARDING WIP」屏(
43:31855→sidebar43:31859):列表只有 5 个收起的 project 行,无展开、无 spacing、无渐隐遮罩 ⇒ 初始态全收起。 - 「TREE WIP」区(标签
133:7628)就是独立稿133:7629,即 §2 的多级树设计的宿主。
4. 交互推断
- 行 hover(有原型交互佐证:所有 Cell 实例带
ON_HOVER → CHANGE_TO hover 变体,SMART_ANIMATE ease-out):- project 行:folder 图标→chevron,右侧浮现「…」+「+」;草稿页注记
43:40440「hover 之后 有 + 按钮?」(+=在该 project 下新建 session)。 - session 行:时间→「…」;草稿页注记
43:40439「时间怎么办 hover 出来的 more」。 - 「…」的菜单内容设计稿未给(隐藏
.Menu_cell里有「删除」字样残留,I122:10117;6571:170698,可推有 删除/重命名 类操作)。
- project 行:folder 图标→chevron,右侧浮现「…」+「+」;草稿页注记
- 点击:project 行点击=展开/收起(chevron 语义);session 行点击=打开会话(
34:11333屏当前行深底 @10% 选中态)。 - 树展开:session 行前导
arrow-treechevron(右向=收起,隐藏的下向=展开)⇒ 子 session 可折叠。 - Handle:sidebar 右缘中点 12×32 把手,收起/展开整栏(配合 Logo 行的 panel_left 按钮,双入口)。
- 头部图标钮 hover:
.Icon_container亦带 ON_HOVER 原型跳变(库内置灰底反馈)。 - 草稿页其他相关注记(
43:37430 draft页):43:40436「怎么创建 workspace 或在 workspace 中创建 workspace 创建后是什么?」、43:40437「可能可以这些 sessions 数量 不这样展示」、43:40438「filter 和聚合」、43:40435「Ask question / Waiting for approval 可能不用区分了」⇒ workspace 创建流、计数展示、筛选聚合、状态粒度都还在摇摆,实现时留弹性。
5. 视觉 token 小表
| token | 亮色 | 暗色 |
|---|---|---|
| sidebar 背景 | #F9FAFB |
#1B1B1C |
| sidebar 右描边 | rgba(0,0,0,.04) |
rgba(255,255,255,.06) |
| 主文字(标题/条目) | #0F1115 |
#F9FAFB |
| 次文字(计数/占位/区头) | #81858C |
#ADB2B8(时间) |
| 三级/图标灰 | #ADB2B8、#61666B |
— |
| 行 hover 底 | #263148 @6% |
同 token(变量绑定) |
| 行选中底 | #263148 @10% |
同 token |
| 输入框底/描边 | #F1F3F5 / 黑@10% |
#1B1B1C / 白@12% |
| 按钮底/描边 | #FFFFFF / 黑@10% |
#43454A / 白@12% |
| 品牌蓝(logo、active folder) | #3964FE |
同 |
| 状态色 | 绿 #22C55E、琥珀 #F59E0B、红 #EC1313、运行环 #5686FE 渐变 |
同 |
| 圆角 | 行 8;胶囊(按钮/输入框)24;菜单 12;圆形图标钮 28;Handle 10;徽章 2/4 | 同 |
| 字体字号 | 标题 Inter 14/400;元信息 Inter 12/400;UI 控件 SF Pro 14(按钮 510);HARNESS 徽章 Intel One Mono 11/500 | 同 |
| 关键尺寸 | 栏宽 300(内容 268);Logo 行 60;按钮 38;区头 36;搜索内框 38;project 行 54;session 行 34;行距 4;缩进步长 22(16 槽+6 gap);状态点 10;Handle 12×32 | 同 |
6. 对 plugins.md(projects / sessions 插件)的映射建议
仅建议,不改文档:
- SessionRow 的 props 维度要多一个"树深度/子树"轴:设计支持 session 多级树(fork/subagent),
SessionRow除sessionId+摘要切片外需要depth与hasChildren/expanded;子树折叠是本地观看态(同现有"折叠/展开分组"归属)。 - 状态点是摘要切片的一等字段:green(新完成未读)/amber(待审批)/ring(运行中)/red(错误)/无。前两者含"未读"语义 ⇒ 切片里除 host 状态外还要一个客户端本地的 last-seen 标记(新完成=完成时间 > 上次打开时间),这块归 projects 插件自己的观看态,不必上 host。
- 分组模式(WorkSpace/Update/Status)是 ProjectsBlock 的全局观看态(persist 到本地即可);但设计只画了 WorkSpace 分组,Update/Status 无稿 ⇒ 插件先实现 by-workspace,把 group-by 做成 ProjectsBlock 内部策略函数而非新 slot,后两种进 backlog。
- 没有归档 section:列表=展开块+spacing+其余收起 project,不需要 archive 维度;不要为它预留 slot。
- 行级 actions 收敛:hover「…」(session:删除/重命名类;project:管理类)+ project「+」(=
sessions.create({cwd: 该 project}),正好复用现有sessions.create面)+ic_ds_project_add(区头新建 workspace——若 host 无 project 概念,本质是"带新 cwd 的 create"入口)。菜单内容未定稿,「…」建议做成插件内 dropdown,条目可后补。 - 搜索框("Search name, keywords...")是 projects 插件的本地过滤(global 维度,纯前端 filter),配合草稿注记"filter 和聚合",建议 props 只留
query一根轴。 - New Session 按钮的隐藏下拉箭头提示未来"选 workspace 再创建";NewSessionButton 的
可带 cwd 选择设计已覆盖,无需改。 - sidebar 折叠(Handle + panel_left 双入口)是 layout/shell 级全局观看态,归 sidebar 容器持有,不进 projects 插件。
- 视觉 token(§5)建议进 theme 层变量(亮暗双值都有稿),行 hover/选中用同一颜色
#263148的 6%/10% 两档,实现时做成 token 而非写死两色。
关键节点索引(回查用)
独立稿 133:7629;Cell 集 14:3080(变体 14:3079/25:2671/14:3078/16:2570);Folder 集 27:3260;State 集 14:3304 + 图例 122:9191~9194;Handle 集 128:7160(远程);Group by 菜单 122:10096;菜单展开屏 34:10632;暗色 42:28823;选中态屏 34:11333(选中行 34:11386);onboarding 43:31859;hover 按钮组 27:4668/27:4656;draft 注记 43:40435~40440。