@stofone/dsh-agent-roster 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,26 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.1] - 2026-11-03
8
+
9
+ ### Expansion stops clipping itself
10
+
11
+ - **No more scroll boxes inside expansions.** 0.8.3 capped the expanded collection list at
12
+ `max-height: 340px` with its own scrollbar; with 21 rosters that reads as "the list is cut off".
13
+ The cap and the nested scroller are gone — the panel root is the only thing that scrolls, and
14
+ an expanded section simply grows.
15
+ - **The sources tab gets its page padding back** (`16px 28px 28px`); its collections had been
16
+ rendering flush against the window edge, hard against `overflow-x: hidden`.
17
+ - **Source collections use the ledger row**, like rosters and teams. They were still emitting
18
+ `.rstr-card*` class names whose rules disappeared in the 0.9.0 ledger rewrite, so the tab
19
+ rendered unstyled elements. A regression assertion now forbids those class names returning.
20
+ - **Member rows keep name and role on one line**: `toolPolicy` moved from the head to the meta
21
+ strip, where the model, effort and prompt size already sit.
22
+ - **Wider id column with a title tooltip**, so `agent-roster-collective` is readable instead of
23
+ truncated to `agent-roster-collec…`.
24
+ - The CSS guard now asserts the opposite of what it did in 0.8.3: expansions must carry neither
25
+ `max-height` nor `overflow`, because nested scrolling is what made the content look incomplete.
26
+
7
27
  ## [0.9.0] - 2026-11-03
8
28
 
9
29
  ### The roster list is a ledger
@@ -356,7 +376,8 @@
356
376
  - 工具返回值含 `undefined` 键,运行时按 `value is not lossless JSON` 整次拒绝;缺失值统一写 `null`,
357
377
  且所有返回值先过 `lib/json.js#lossless`。
358
378
 
359
- [Unreleased]: https://github.com/dsh-agent-roster/dsh-agent-roster/compare/v0.9.0...main
379
+ [Unreleased]: https://github.com/dsh-agent-roster/dsh-agent-roster/compare/v0.9.1...main
380
+ [0.9.1]: https://github.com/dsh-agent-roster/dsh-agent-roster/releases/tag/v0.9.1
360
381
  [0.9.0]: https://github.com/dsh-agent-roster/dsh-agent-roster/releases/tag/v0.9.0
361
382
  [0.8.3]: https://github.com/dsh-agent-roster/dsh-agent-roster/releases/tag/v0.8.3
362
383
  [0.8.2]: https://github.com/dsh-agent-roster/dsh-agent-roster/releases/tag/v0.8.2
package/README.md CHANGED
@@ -268,7 +268,7 @@ member and finally `roster_verify`. Creating the team stays with the runtime.
268
268
 
269
269
  ## Sidebar panel
270
270
 
271
- The roster list is a **ledger, not a wall of cards**: one row per roster — a 3px state edge (lit only when something is wrong, quiet when it is fine), a monospace id column, the title with a one-line description, right-aligned counts (members / errors / warnings / deployment), and a quiet pair of actions (edit, expand). Duplicate, copy-create and delete moved into the expanded area, which turns 105 buttons across 21 rosters into 42. Below 860px the tag pool becomes a top row and the metadata wraps.
271
+ The roster list is a **ledger, not a wall of cards**: one row per roster — a 3px state edge (lit only when something is wrong, quiet when it is fine), a monospace id column, the title with a one-line description, right-aligned counts (members / errors / warnings / deployment), and a quiet pair of actions (edit, expand). Duplicate, copy-create and delete moved into the expanded area, which turns 105 buttons across 21 rosters into 42. Below 860px the tag pool becomes a top row and the metadata wraps. Expansions never build their own scroll box: the panel root is the only scroller, so an expanded section grows as tall as its content instead of showing "just a few rows".
272
272
 
273
273
  The panel takes the full page width; nothing constrains it to a reading column. The archive list has
274
274
  a **tag pool** on the left: every tag present in the library, with how many archives carry it. Clicking
package/README.zh.md CHANGED
@@ -262,7 +262,7 @@ node bin/cli.mjs validate --dir orgs/agent-roster-collective
262
262
 
263
263
  面板铺满整个页面宽度,外层容器不设阅读列宽度。
264
264
 
265
- 档案列表是**账本,不是卡片墙**:一行一份档案——左沿 3 像素状态色(只有出错或有提醒时才亮,正常的档案不标记)、等宽字体的 id 列、标题与一句话描述、右侧计数(成员数 / 错误 / 提醒 / 部署态),最后是一对安静的操作(编辑、展开成员)。复制、复制建队、删除收在展开区里,21 份档案的 105 个按钮因此变成 42 个。窄于 860 像素时标签池从左侧栏变成顶上一行、元数据自动折行。
265
+ 档案列表是**账本,不是卡片墙**:一行一份档案——左沿 3 像素状态色(只有出错或有提醒时才亮,正常的档案不标记)、等宽字体的 id 列、标题与一句话描述、右侧计数(成员数 / 错误 / 提醒 / 部署态),最后是一对安静的操作(编辑、展开成员)。复制、复制建队、删除收在展开区里,21 份档案的 105 个按钮因此变成 42 个。窄于 860 像素时标签池从左侧栏变成顶上一行、元数据自动折行。展开区不另建小滚动盒:整页只有面板根滚动,展开多少内容就撑多高,不会出现「展开了却只看得到几条」。
266
266
 
267
267
  档案列表左侧是**标签池**:列出全库出现过的标签
268
268
  以及各标签的档案数,点标签即筛选——多选是「且」,一个按钮清除选择。标签池只影响视图,不会把
package/client.js CHANGED
@@ -474,9 +474,8 @@ window.__ModuleLoader__.load({
474
474
  h(
475
475
  "div",
476
476
  { className: "rstr-member-head" },
477
- h("strong", null, member.name),
477
+ h("strong", { className: "rstr-member-name" }, member.name),
478
478
  member.role ? h(Chip, null, member.role) : null,
479
- member.toolPolicy ? h(Chip, { tone: "policy" }, `${t("member.policy")}: ${member.toolPolicy}`) : null,
480
479
  ),
481
480
  member.description ? h("p", { className: "rstr-member-desc" }, member.description) : null,
482
481
  Array.isArray(member.aliases) && member.aliases.length > 0
@@ -485,6 +484,7 @@ window.__ModuleLoader__.load({
485
484
  h(
486
485
  "div",
487
486
  { className: "rstr-member-meta" },
487
+ member.toolPolicy ? h(Chip, { tone: "policy" }, member.toolPolicy) : null,
488
488
  member.model ? h("span", null, `${t("member.model")}: ${member.model}`) : null,
489
489
  member.reasoningEffort ? h("span", null, `${t("member.effort")}: ${member.reasoningEffort}`) : null,
490
490
  member.fallback ? h("span", null, `${t("member.fallback")}: ${member.fallback}`) : null,
@@ -1755,22 +1755,34 @@ window.__ModuleLoader__.load({
1755
1755
  collections.map((collection) =>
1756
1756
  h(
1757
1757
  "article",
1758
- { key: `${collection.origin?.source ?? ""}::${collection.id}`, className: "rstr-card" },
1759
- h(
1760
- "header",
1761
- { className: "rstr-card-head" },
1762
- h("h3", { className: "rstr-card-title" }, collection.title || collection.id),
1763
- h(Badge, { tone: "neutral" }, t("source.registered", { count: collection.rosters?.length ?? 0 })),
1764
- ),
1765
- collection.description ? h("p", { className: "rstr-card-desc" }, collection.description) : null,
1766
- h(
1767
- "p",
1768
- { className: "rstr-muted rstr-small" },
1769
- `${t("source.repo")} ${collection.repo ?? ""}@${collection.ref ?? "main"}${collection.path ? `/${collection.path}` : ""}`,
1770
- ),
1758
+ {
1759
+ key: `${collection.origin?.source ?? ""}::${collection.id}`,
1760
+ className: openId === collection.id ? "rstr-row rstr-row-open" : "rstr-row",
1761
+ },
1771
1762
  h(
1772
1763
  "div",
1773
- { className: "rstr-card-actions" },
1764
+ { className: "rstr-row-body" },
1765
+ h("code", { className: "rstr-row-id", title: collection.id }, collection.id),
1766
+ h(
1767
+ "div",
1768
+ { className: "rstr-row-text" },
1769
+ h(
1770
+ "h3",
1771
+ { className: "rstr-row-title" },
1772
+ collection.title || collection.id,
1773
+ h(Badge, { tone: "neutral" }, t("source.registered", { count: collection.rosters?.length ?? 0 })),
1774
+ ),
1775
+ collection.description ? h("p", { className: "rstr-row-desc" }, collection.description) : null,
1776
+ h(
1777
+ "p",
1778
+ { className: "rstr-source-meta" },
1779
+ `${collection.repo ?? ""}@${collection.ref ?? "main"}${collection.path ? `/${collection.path}` : ""}`,
1780
+ ),
1781
+ ),
1782
+ h("div", { className: "rstr-row-stats" }, h("span", null, `${collection.rosters?.length ?? 0}`)),
1783
+ h(
1784
+ "div",
1785
+ { className: "rstr-row-actions" },
1774
1786
  h(
1775
1787
  "button",
1776
1788
  {
@@ -1785,6 +1797,7 @@ window.__ModuleLoader__.load({
1785
1797
  "button",
1786
1798
  { type: "button", className: "rstr-btn", onClick: () => toggle(collection) },
1787
1799
  openId === collection.id ? t("source.hide") : t("source.open"),
1800
+ ),
1788
1801
  ),
1789
1802
  ),
1790
1803
  openId === collection.id
@@ -2301,7 +2314,7 @@ window.__ModuleLoader__.load({
2301
2314
 
2302
2315
  .rstr-row-body {
2303
2316
  display: grid;
2304
- grid-template-columns: minmax(88px, 140px) minmax(0, 1fr) auto auto;
2317
+ grid-template-columns: minmax(110px, 176px) minmax(0, 1fr) auto auto;
2305
2318
  align-items: baseline;
2306
2319
  gap: 8px 16px;
2307
2320
  padding: 13px 8px 13px 0;
@@ -2336,11 +2349,12 @@ window.__ModuleLoader__.load({
2336
2349
  .rstr-row-detail {
2337
2350
  display: flex;
2338
2351
  flex-direction: column;
2339
- gap: 12px;
2340
- padding: 10px 14px 18px 14px;
2352
+ gap: 14px;
2353
+ padding: 12px 16px 20px 16px;
2341
2354
  margin: 0 0 12px -1px;
2342
2355
  min-width: 0;
2343
2356
  background: var(--dsw-alias-bg-layer-2);
2357
+ border-left: 2px solid var(--dsw-alias-border-l2);
2344
2358
  }
2345
2359
  .rstr-row-detail-actions { display: flex; gap: 6px; flex-wrap: wrap; padding-top: 4px; }
2346
2360
 
@@ -2394,21 +2408,33 @@ window.__ModuleLoader__.load({
2394
2408
 
2395
2409
  /* ---- 档案源 ----------------------------------------------------------- */
2396
2410
 
2397
- .rstr-sources { display: flex; flex-direction: column; gap: 0; border-top: 1px solid var(--dsw-alias-border-l2); }
2411
+ .rstr-sources { display: flex; flex-direction: column; gap: 0; min-width: 0; padding: 16px 28px 28px; border-top: 1px solid var(--dsw-alias-border-l2); }
2398
2412
  .rstr-sources-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
2413
+ /* 展开区自己滚会把内容关进小盒子(曾经 max-height:320px 就是"显示不全"的来源)。
2414
+ 整页只有 .rstr-page 一个滚动容器,展开区只负责把高度撑开。 */
2399
2415
  .rstr-source-detail {
2400
2416
  display: flex;
2401
2417
  flex-direction: column;
2402
- gap: 2px;
2418
+ gap: 4px;
2403
2419
  min-width: 0;
2404
- max-height: 320px;
2405
- overflow-y: auto;
2406
- overflow-x: hidden;
2407
- padding: 6px 0 10px 15px;
2420
+ padding: 8px 0 12px 15px;
2421
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
2422
+ border-left: 2px solid var(--dsw-alias-border-l2);
2423
+ margin-left: 2px;
2424
+ }
2425
+ .rstr-source-roster {
2426
+ display: grid;
2427
+ grid-template-columns: minmax(120px, 180px) minmax(0, 1fr) auto;
2428
+ align-items: baseline;
2429
+ gap: 4px 14px;
2430
+ min-width: 0;
2431
+ font-size: 12px;
2432
+ padding: 4px 6px 4px 0;
2408
2433
  border-bottom: 1px solid var(--dsw-alias-border-l1);
2409
2434
  }
2410
- .rstr-source-roster { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; min-width: 0; font-size: 12px; padding: 3px 0; }
2411
- .rstr-source-roster > .rstr-muted { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2435
+ .rstr-source-roster:last-of-type { border-bottom: none; }
2436
+ .rstr-source-roster > .rstr-muted { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2437
+ .rstr-source-meta { margin: 2px 0 0 0; min-width: 0; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 11px; color: var(--dsw-alias-label-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2412
2438
 
2413
2439
  /* ---- 通用件 ----------------------------------------------------------- */
2414
2440
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stofone/dsh-agent-roster",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "多 Agent 团队的静态成员档案定义与校验层:档案库在面板里看得见、改得动,团队成员的人设、模型与工具边界固化成可校验、可版本化的文件,并在 dsh-agent-teams 创建成员时把档案桥接给运行时。",
5
5
  "type": "module",
6
6
  "main": "index.js",