@stofone/dsh-agent-roster 0.12.0 → 0.13.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 +48 -0
- package/README.md +19 -10
- package/README.zh.md +18 -10
- package/client.js +334 -165
- package/examples/dist/core-review-1.0.0.json +9 -0
- package/examples/dist/research-0.1.0.json +7 -0
- package/examples-orchestration/dist/core-review-1.0.0.json +9 -0
- package/index.js +104 -66
- package/lib/compile2.js +13 -4
- package/locale/en.json +11 -8
- package/locale/zh.json +11 -8
- package/orgs/agent-roster-collective/dist/api-design-1.0.0.json +10 -0
- package/orgs/agent-roster-collective/dist/content-ops-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/contract-review-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/data-quality-1.0.0.json +10 -0
- package/orgs/agent-roster-collective/dist/db-migration-1.0.0.json +10 -0
- package/orgs/agent-roster-collective/dist/docs-writer-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/finance-recon-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/frontend-ui-1.0.0.json +10 -0
- package/orgs/agent-roster-collective/dist/i18n-l10n-1.0.0.json +10 -0
- package/orgs/agent-roster-collective/dist/incident-response-1.0.0.json +10 -0
- package/orgs/agent-roster-collective/dist/literature-review-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/market-research-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/ml-eval-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/performance-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/product-discovery-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/qa-regression-1.0.0.json +10 -0
- package/orgs/agent-roster-collective/dist/recruiting-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/release-manager-1.0.0.json +9 -0
- package/orgs/agent-roster-collective/dist/security-audit-1.0.0.json +10 -0
- package/orgs/agent-roster-collective/dist/sre-oncall-1.0.0.json +10 -0
- package/orgs/agent-roster-collective/dist/support-triage-1.0.0.json +9 -0
- package/package.json +1 -1
- package/schema/compiled.v1.schema.json +30 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,52 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.13.1] - 2026-11-03
|
|
8
|
+
|
|
9
|
+
### The local rosters are the front page
|
|
10
|
+
|
|
11
|
+
0.13.0 opened on the library tab. That got the metaphor right and the priority wrong: the rosters you
|
|
12
|
+
already manage are what you come back to every day, and they were one tab away. The panel now lands on
|
|
13
|
+
**Rosters** — local, searchable, with its tag pool — and the library marketplace is the second tab.
|
|
14
|
+
|
|
15
|
+
- Tab order is `Rosters, Library, Teams, Sources, Health`; the default tab is `rosters` again.
|
|
16
|
+
- Nothing moved between the two: both read the same snapshot, both filter by tag, and the tag pools stay
|
|
17
|
+
independent (local-only vs everything in view) so neither one silently changes the other's counts.
|
|
18
|
+
|
|
19
|
+
## [0.13.0] - 2026-11-03
|
|
20
|
+
|
|
21
|
+
### A tab that behaves like a marketplace, not a filter on a list
|
|
22
|
+
|
|
23
|
+
0.12.0 put a search field above the tabs. That was still the wrong shape: search belonged to a page about
|
|
24
|
+
collections, and browsing still meant "pick a source, then read". The panel now opens on its own **Library**
|
|
25
|
+
tab — search, tags, and one list that spans this machine and every subscribed source.
|
|
26
|
+
|
|
27
|
+
- `GET /plugins/dsh-agent-roster/catalog` returns every roster in view in one response: this machine plus
|
|
28
|
+
each subscribed collection, with tags, member counts, member roles and where each one lives.
|
|
29
|
+
- The tag strip is a real filter: counts are computed from everything in view, multiple tags are AND, and
|
|
30
|
+
the selection never writes back to a file. The segmented control switches between **by source** (this
|
|
31
|
+
machine, then one group per collection) and **flat** (one list, source named per row).
|
|
32
|
+
- Search keeps its own route and its own ranking (`lib/search.js`): two characters, 240 ms debounce, and the
|
|
33
|
+
in-flight request is aborted when you keep typing, so typing never queues requests.
|
|
34
|
+
- Compiled artifacts now carry what it takes to be *found*: `source.title`, `description`, `tags`, `license`
|
|
35
|
+
and `maintainers`. A subscribed roster is one file (`dist/<id>-<ver>.json`) resolved through `files` in the
|
|
36
|
+
index — previously the artifact knew its id and version and nothing else, so remote results could only be
|
|
37
|
+
searched by id.
|
|
38
|
+
- The panel's tag chips were inheriting the sidebar's full-width row form; they are now chips (own width,
|
|
39
|
+
pill border, count attached), and the narrow layout gets the same 18px gutter as the rest of the page.
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
|
|
43
|
+
- The header lookup field is gone; its behaviour lives inside the Library tab. `lookup.*` strings were
|
|
44
|
+
replaced by `catalog.*` (both locales).
|
|
45
|
+
- `flattenCompiledToRoster` and `rosterViewOf` now fall back to artifact metadata, so a remote roster keeps
|
|
46
|
+
its title and tags after being flattened into a v1 document.
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
|
|
50
|
+
- `GET /catalog` and search share one `gatherEntries()` path; before, each route assembled local + remote
|
|
51
|
+
entries itself, which is how a cache or concurrency fix lands in one and not the other.
|
|
52
|
+
|
|
7
53
|
## [0.12.0] - 2026-11-03
|
|
8
54
|
|
|
9
55
|
### The panel answers "which one", not "show me everything"
|
|
@@ -581,6 +627,8 @@ point is now one search field above the tabs.
|
|
|
581
627
|
且所有返回值先过 `lib/json.js#lossless`。
|
|
582
628
|
|
|
583
629
|
[Unreleased]: https://github.com/dsh-agent-roster/dsh-agent-roster/compare/v0.12.0...main
|
|
630
|
+
[0.13.1]: https://github.com/dsh-agent-roster/dsh-agent-roster/compare/v0.13.0...v0.13.1
|
|
631
|
+
[0.13.0]: https://github.com/dsh-agent-roster/dsh-agent-roster/compare/v0.12.0...v0.13.0
|
|
584
632
|
[0.12.0]: https://github.com/dsh-agent-roster/dsh-agent-roster/compare/v0.11.1...v0.12.0
|
|
585
633
|
[0.11.1]: https://github.com/dsh-agent-roster/dsh-agent-roster/compare/v0.11.0...v0.11.1
|
|
586
634
|
[0.11.0]: https://github.com/dsh-agent-roster/dsh-agent-roster/compare/v0.10.7...v0.11.0
|
package/README.md
CHANGED
|
@@ -306,22 +306,31 @@ id belongs to the team, and the plugin never writes team state. What it does own
|
|
|
306
306
|
failure that only exists on a red card never reaches the next compile, which is exactly how a gate
|
|
307
307
|
turns into decoration.
|
|
308
308
|
|
|
309
|
-
##
|
|
309
|
+
## The library tab: find by capability, not by source
|
|
310
310
|
|
|
311
|
-
The panel
|
|
312
|
-
|
|
311
|
+
The panel opens on **Rosters** — the local ones: what you work with every day, its tags and members, ready
|
|
312
|
+
to filter or edit. The second tab is the **Library**, meant to read like a plugin marketplace: one search
|
|
313
|
+
field, one row of tags, and one list that spans this machine and every subscribed source.
|
|
313
314
|
|
|
314
315
|
```
|
|
315
316
|
要找什么能力?例:数据质量、发版、代码评审
|
|
316
317
|
```
|
|
317
318
|
|
|
318
|
-
|
|
319
|
-
(`标签:数据质量 · 成员角色:数据质量工程师`) and where it lives (`来自 agent-roster-collective`),
|
|
320
|
-
carries the action
|
|
319
|
+
Two characters in, after a 240 ms pause, the panel asks `/search` a question. Every row says **why** it
|
|
320
|
+
matched (`标签:数据质量 · 成员角色:数据质量工程师`) and where it lives (`来自 agent-roster-collective`),
|
|
321
|
+
and carries the next action — open it locally, or pull that collection — inside the row.
|
|
322
|
+
|
|
323
|
+
With an empty field it **browses**: `/catalog` flattens this machine and the subscribed sources in one
|
|
324
|
+
response, the tag strip summarises every tag in view with its count (multiple tags are AND), and the
|
|
325
|
+
segmented control switches between **by source** (this machine, then one group per collection) and **flat**
|
|
326
|
+
(one list, source named per row). Tag filtering is view state only; it never writes back to a file.
|
|
321
327
|
|
|
322
328
|
Multiple words are AND, not OR: `data kubernetes` returns nothing rather than every roster that merely
|
|
323
|
-
mentions "data". Ranking is a pure function in `lib/search.js`, so it is unit-tested rather than
|
|
324
|
-
|
|
329
|
+
mentions "data". Ranking is a pure function in `lib/search.js`, so it is unit-tested rather than eyeballed.
|
|
330
|
+
|
|
331
|
+
Subscribed rosters resolve through `files` in the index, which points at a concrete compiled artifact
|
|
332
|
+
(`dist/<id>-<ver>.json`). The artifact carries its own title, description, tags, licence and maintainers,
|
|
333
|
+
so finding a roster from a distance costs one file — not a clone.
|
|
325
334
|
|
|
326
335
|
## Tools
|
|
327
336
|
|
|
@@ -385,7 +394,7 @@ data directory, the team state directory and the version.
|
|
|
385
394
|
|
|
386
395
|
A badge at the top summarises how many items need attention
|
|
387
396
|
|
|
388
|
-
The client plugin adds an **Agent Roster** entry to the left sidebar: one row in the `sidebar.panellist` slot plus the matching key in the `main` slot. Clicking the row opens a full-width page with
|
|
397
|
+
The client plugin adds an **Agent Roster** entry to the left sidebar: one row in the `sidebar.panellist` slot plus the matching key in the `main` slot. Clicking the row opens a full-width page with five tabs — the panel is not only a viewer:
|
|
389
398
|
|
|
390
399
|
| Tab | What you can do |
|
|
391
400
|
|---|---|
|
|
@@ -509,7 +518,7 @@ test/ unit tests
|
|
|
509
518
|
|
|
510
519
|
Verified on this machine:
|
|
511
520
|
|
|
512
|
-
- `npm test` —
|
|
521
|
+
- `npm test` — 308/308 passing (format, parse, validate, registry, paths, bridge, verify buckets, digests and provenance, roster diff, capability requirements and the capability gate, library organization, registry schema, lossless JSON, write plan/apply, all routes, panel snapshot and hints, dictionary consistency, tool contracts, client loader contract, library snapshot, config view, package manifest, declared fields and captain block, schema/constant alignment, the v2 role/roster/compiled layers and their schema alignment, v1→v2 migration, run records feeding the plan, remote registry and one-click install).
|
|
513
522
|
- `npm run smoke` — `apply()` registers all six tools through a real `defineTool` from a DSH bundle; `roster_list` / `roster_show` / `roster_create` / `roster_verify` / `roster_diff` execute, every output survives `lossless` checks, `path` overrides are honored, effect disposal runs cleanly. The same command then loads `client.js` against a stubbed module table and asserts the three slot registrations, style injection and effect disposal.
|
|
514
523
|
- CLI: `validate --dir examples` returns exit 0 over both example libraries.
|
|
515
524
|
- Installed into a real profile with the plugin manager (`plugin_manager install_bundle` against this directory → `link:` dependency + bundle entry); the profile re-reads the linked files on restart.
|
package/README.zh.md
CHANGED
|
@@ -292,21 +292,28 @@ node bin/cli.mjs compile --roster examples-orchestration/rosters/core-review \
|
|
|
292
292
|
|
|
293
293
|
回执由执行施工图的队长会话写,不由插件写:任务 id 属于团队,插件从不写团队状态。插件负责的是合并——只活在红卡上的失败,下一次编译就消失了,门也就变成了装饰。
|
|
294
294
|
|
|
295
|
-
##
|
|
295
|
+
## 档案库:按能力找,而不是按来源翻
|
|
296
296
|
|
|
297
|
-
|
|
298
|
-
|
|
297
|
+
面板的**首屏是本机档案**(第一个页签):你每天打交道的那些档案、它们的标签与成员,进来就能看见、能筛选、能改。
|
|
298
|
+
第二个页签是**档案库**,定位接近一个插件市场:一个搜索框、一排标签、一份横跨本机与所有订阅来源的清单。
|
|
299
299
|
|
|
300
300
|
```
|
|
301
301
|
要找什么能力?例:数据质量、发版、代码评审
|
|
302
302
|
```
|
|
303
303
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
304
|
+
输入两个字以上,停顿 240 毫秒后向 `/search` 提一个问题。每一行都写清**为什么命中**
|
|
305
|
+
(`标签:数据质量 · 成员角色:数据质量工程师`)与**它住在哪**(`来自 agent-roster-collective`),
|
|
306
|
+
并把下一步放在行内:本机的「打开」,远端的「拉取」。
|
|
307
|
+
|
|
308
|
+
不输入时是**浏览**:`/catalog` 一次把本机与订阅来源摊平返回;上方标签池汇总全库出现过的标签与计数,
|
|
309
|
+
多选是「且」;右侧可以在**按来源**(本机 + 每个 collection 各一组)与**平铺**(一份清单,来源写在行内)
|
|
310
|
+
之间切换。标签筛选只影响视图,不写回文件。
|
|
307
311
|
|
|
308
312
|
多个词是「且」不是「或」:`data kubernetes` 一条都不返,而不是把所有提到 data 的档案都堆上来。
|
|
309
|
-
|
|
313
|
+
排序是 `lib/search.js` 里的纯函数,所以它被单测钉住,而不是靠肉眼看着顺。
|
|
314
|
+
|
|
315
|
+
订阅来源的档案在索引里由 `files` 指向具体的编译产物(`dist/<id>-<ver>.json`)。产物自带标题、描述、
|
|
316
|
+
标签、许可与维护者——「从远处找一份档案」因此只需要拉一个文件,不必先克隆一个仓库。
|
|
310
317
|
|
|
311
318
|
## 工具
|
|
312
319
|
|
|
@@ -363,11 +370,12 @@ node bin/cli.mjs compile --roster examples-orchestration/rosters/core-review \
|
|
|
363
370
|
团队状态目录与版本号也列在同一处。导入与新建档案挪到档案页签的搜索框右侧,刷新只属于档案源页签
|
|
364
371
|
(绕过一小时的缓存,直接回源读公共索引)。
|
|
365
372
|
|
|
366
|
-
客户端插件在左侧全局栏新增一行 **Agent Roster** 图标(`sidebar.panellist` 列表槽),并在 `main` 槽用同一个面板 id
|
|
373
|
+
客户端插件在左侧全局栏新增一行 **Agent Roster** 图标(`sidebar.panellist` 列表槽),并在 `main` 槽用同一个面板 id 注册整页内容;点图标即在主区域打开,宽度与对话页一致。面板分五个页签,不只是看:
|
|
367
374
|
|
|
368
375
|
| 页签 | 能做什么 |
|
|
369
376
|
|---|---|
|
|
370
|
-
| 档案 | 浏览每个工作区 × 每座档案库,展开成员;**新建 / 编辑 / 复制 / 删除 / 导入 / 导出**档案。编辑器有表单与源码两种模式(源码就是文件原文);写之前由宿主校验,覆盖已有文件会留一份 `.bak
|
|
377
|
+
| 档案 | 浏览每个工作区 × 每座档案库,展开成员;**新建 / 编辑 / 复制 / 删除 / 导入 / 导出**档案。编辑器有表单与源码两种模式(源码就是文件原文);写之前由宿主校验,覆盖已有文件会留一份 `.bak`;顶上有搜索框与标签池 |
|
|
378
|
+
| 档案库 | 按能力找档案:搜索(横跨本机与订阅来源,命中给出处)、标签筛选、按来源聚合或平铺,行内直接打开或拉取 |
|
|
371
379
|
| 团队 | 读一个配置好的状态目录(默认 `.agent-teams`),列出运行时真正建出来的每个团队:档案、成员档案与模型路由、每个持久化成员是否真的与其档案一致,以及该团队的任务 |
|
|
372
380
|
| 档案源 | 列出订阅的公共 registry 目录,每个 collection 一个「拉取到本机」按钮;可展开先看里面有哪些档案 |
|
|
373
381
|
| 体检 | 把「配置有没有指错」集中一处:目录解析到了哪、状态目录在不在、有多少声明未被确认,以及该改哪个设置 |
|
|
@@ -479,7 +487,7 @@ test/ 单测
|
|
|
479
487
|
|
|
480
488
|
本机已验证:
|
|
481
489
|
|
|
482
|
-
- `npm test` ——
|
|
490
|
+
- `npm test` —— 308/308 通过(格式、解析、校验、扫描、路径、桥接、核对四桶、摘要与溯源、档案差异、能力要求与能力闸门、档案库组织、索引 schema、无损 JSON、写入计划与执行、六条路由、快照与提示、两本词典一致、工具契约、客户端加载器契约、包清单、配置视图、样式 token 约束、声明层字段与队长段、schema 与常量对齐、v2 角色/组装/编译三层及其 schema 对齐、v1→v2 迁移、执行回执并入施工图)。
|
|
483
491
|
- `npm run smoke` —— 用真实 DSH bundle 的 `defineTool` 注册六个工具,逐个调用:输出全部通过无损校验、`path` 覆盖生效、释放干净;同一条命令随后用桩模块表加载 `client.js`,断言三处槽位注册、样式只注入一次、effect 可回收。
|
|
484
492
|
- CLI:`validate --dir examples` 对两座示例库退出码 0。
|
|
485
493
|
- 用插件管理器真的装进了本机 profile(`plugin_manager install_bundle` 指向本仓库 → `link:` 依赖 + bundle 条目),重启后按链接读取本仓库文件。
|