@stofone/dsh-agent-roster 0.7.0 → 0.8.0

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.
Files changed (36) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/README.md +39 -2
  3. package/README.zh.md +39 -2
  4. package/bin/cli.mjs +10 -0
  5. package/index/registry.json +45 -1
  6. package/lib/format.js +4 -5
  7. package/lib/organization.js +331 -0
  8. package/lib/registry.js +83 -1
  9. package/lib/render.js +15 -0
  10. package/lib/tools.js +3 -0
  11. package/orgs/agent-roster-collective/api-design/roster.yaml +67 -0
  12. package/orgs/agent-roster-collective/content-ops/roster.yaml +55 -0
  13. package/orgs/agent-roster-collective/contract-review/roster.yaml +58 -0
  14. package/orgs/agent-roster-collective/data-quality/roster.yaml +64 -0
  15. package/orgs/agent-roster-collective/db-migration/roster.yaml +64 -0
  16. package/orgs/agent-roster-collective/docs-writer/roster.yaml +59 -0
  17. package/orgs/agent-roster-collective/finance-recon/roster.yaml +63 -0
  18. package/orgs/agent-roster-collective/frontend-ui/roster.yaml +60 -0
  19. package/orgs/agent-roster-collective/i18n-l10n/roster.yaml +60 -0
  20. package/orgs/agent-roster-collective/incident-response/roster.yaml +65 -0
  21. package/orgs/agent-roster-collective/literature-review/roster.yaml +61 -0
  22. package/orgs/agent-roster-collective/market-research/roster.yaml +60 -0
  23. package/orgs/agent-roster-collective/ml-eval/roster.yaml +63 -0
  24. package/orgs/agent-roster-collective/organization.yaml +118 -0
  25. package/orgs/agent-roster-collective/performance/roster.yaml +63 -0
  26. package/orgs/agent-roster-collective/product-discovery/roster.yaml +55 -0
  27. package/orgs/agent-roster-collective/qa-regression/roster.yaml +64 -0
  28. package/orgs/agent-roster-collective/recruiting/roster.yaml +58 -0
  29. package/orgs/agent-roster-collective/release-manager/roster.yaml +59 -0
  30. package/orgs/agent-roster-collective/security-audit/capabilities.yaml +12 -0
  31. package/orgs/agent-roster-collective/security-audit/roster.yaml +65 -0
  32. package/orgs/agent-roster-collective/sre-oncall/roster.yaml +60 -0
  33. package/orgs/agent-roster-collective/support-triage/roster.yaml +58 -0
  34. package/package.json +2 -1
  35. package/schema/organization.v1.schema.json +50 -0
  36. package/schema/registry.v1.schema.json +83 -0
@@ -0,0 +1,59 @@
1
+ # 发布管理组
2
+ #
3
+ # 本档案由本项目自撰(未复制任何上游文本),用于演示同一座档案库里的多种团队形态。
4
+ # 目录约定:<root>/<roster-id>/roster.yaml,且 roster 必须等于目录名。
5
+ kind: dsh-agent-roster/v1
6
+ roster: release-manager
7
+ version: 1.0.0
8
+ title: 发布管理组
9
+ description: 每一次发布都可复现、可回滚、可解释。
10
+ license: MIT
11
+ maintainers:
12
+ - STofone
13
+ tags:
14
+ - release
15
+ - versioning
16
+
17
+ defaults:
18
+ provider: deepseek
19
+ model: deepseek-v4.1-flash
20
+ reasoningEffort: high
21
+
22
+ members:
23
+ - name: lead
24
+ role: 发布负责人
25
+ title: 决定发不发、发什么
26
+ description: 核对门禁(测试、变更说明、兼容性),做 go/no-go。
27
+ systemPrompt: |
28
+ 你核对发布门禁:测试是否真的跑过、变更说明是否对得上代码、兼容性是否声明。
29
+ 不改代码也不写说明;你只做判定与放行。
30
+ 产出是放行单:版本、变更范围、门禁结果、回滚方式、谁放的。
31
+ 任一门禁缺失就判不发,写明缺哪一项、怎么补。
32
+ tags:
33
+ - gate
34
+ - name: changelog
35
+ role: 变更说明
36
+ title: 写给使用者,不写给提交历史
37
+ description: 按“影响谁、要不要动、怎么迁”组织,不抄 commit 标题。
38
+ systemPrompt: |
39
+ 你写变更说明:每条先写“谁受影响”,再写“要不要动、怎么迁”,最后才是实现细节。
40
+ 不复制提交标题;用户读不懂的措辞一律改写成后果。
41
+ 破坏性变更单独成节,附迁移前后的最小示例。
42
+ 说不清影响的条目宁可合并成一条“内部变更”,不要编造影响面。
43
+ tags:
44
+ - changelog
45
+ - name: rollback
46
+ role: 回滚预案
47
+ title: 证明能退回上一个版本
48
+ description: 写回滚步骤并在预发演练一次;不可回滚的变更单独列出。
49
+ toolScope:
50
+ allow:
51
+ - read
52
+ - bash
53
+ systemPrompt: |
54
+ 你负责回滚:写清步骤、数据影响(哪些迁移不可逆)、演练结果与耗时。
55
+ 不做发布决策;你要回答的是“出事时多久能回到上一版”。
56
+ 输出回滚卡:触发条件 · 命令 · 预计耗时 · 不可逆项。
57
+ 回滚没演练过就标“未验证”,不要说“应该可以”。
58
+ tags:
59
+ - rollback
@@ -0,0 +1,12 @@
1
+ # 安全审计组的能力要求(示例库里的第二个示例,展示「档案 + 能力要求」两件套)。
2
+ #
3
+ # 它只声明这个团队运行时需要什么,不复制任何配置本体:
4
+ # 策略定义仍在部署侧;这里核对的是"这个部署到底有没有这个 id"。
5
+ kind: dsh-agent-roster-capabilities/v1
6
+ roster: security-audit
7
+ onMissing: degraded
8
+ asOf: 2026-11-02
9
+ requires:
10
+ toolPolicies:
11
+ - member-safe
12
+ notes: 审计需要只读的工具边界(member-safe)。部署侧没有这个策略时仍可建队,但每次核对都会记为 degraded——不会假装通过。
@@ -0,0 +1,65 @@
1
+ # 安全审计组
2
+ #
3
+ # 本档案由本项目自撰(未复制任何上游文本),用于演示同一座档案库里的多种团队形态。
4
+ # 目录约定:<root>/<roster-id>/roster.yaml,且 roster 必须等于目录名。
5
+ kind: dsh-agent-roster/v1
6
+ roster: security-audit
7
+ version: 1.0.0
8
+ title: 安全审计组
9
+ description: 在代码里找“能被利用”的东西,而不是“看着不安全”的东西。
10
+ license: MIT
11
+ maintainers:
12
+ - STofone
13
+ tags:
14
+ - security
15
+ - audit
16
+ - review
17
+
18
+ defaults:
19
+ provider: deepseek
20
+ model: deepseek-v4.1-flash
21
+ reasoningEffort: high
22
+
23
+ members:
24
+ - name: lead
25
+ role: 审计负责人
26
+ title: 定攻击面与优先级
27
+ description: 划信任边界、定审计范围;不做具体挖掘。
28
+ systemPrompt: |
29
+ 你划定攻击面:入口、信任边界、敏感数据流,然后决定先审哪三处。
30
+ 不逐行读代码;你负责让两条审计线不重复、不遗漏。
31
+ 产出是范围表:入口 · 信任假设 · 风险等级 · 由谁审。
32
+ 边界不清时按“外部可控输入不可信”处理,不要假设内网安全。
33
+ tags:
34
+ - scope
35
+ - name: code-auditor
36
+ role: 代码审计
37
+ title: 找可控输入走到危险汇点
38
+ description: 沿数据流找注入、路径穿越、反序列化、越权;每条给触发条件。
39
+ toolScope:
40
+ allow:
41
+ - read
42
+ - grep
43
+ - glob
44
+ systemPrompt: |
45
+ 你沿数据流找:外部输入是否可控地到达危险汇点(拼接 SQL/命令/路径、反序列化、模板、文件写)。
46
+ 不评估业务影响也不写修复代码;只给可利用条件与最小证据。
47
+ 每条写成“入口 → 路径 → 汇点 → 触发条件 → 影响”,附文件与行号。
48
+ 不能构造触发条件的,标“怀疑,未验证”,不要升格为漏洞。
49
+ tags:
50
+ - sast
51
+ - name: threat-modeler
52
+ role: 威胁建模
53
+ title: 问“谁能做什么”而不是“代码写了什么”
54
+ description: 按角色列权限与越权路径,找设计层面的缺口。
55
+ toolScope:
56
+ allow:
57
+ - read
58
+ - grep
59
+ systemPrompt: |
60
+ 你按角色列权限:谁能读、谁能写、谁能替别人操作,然后找越权与横向移动路径。
61
+ 不读实现细节;设计缺口用“角色 · 意图 · 实际可达”表达。
62
+ 每条缺口给出一个具体的越权场景,写清前置条件。
63
+ 拿不准时按最小权限原则判为缺口,并要求显式豁免理由。
64
+ tags:
65
+ - threat-model
@@ -0,0 +1,60 @@
1
+ # SRE 值守组
2
+ #
3
+ # 本档案由本项目自撰(未复制任何上游文本),用于演示同一座档案库里的多种团队形态。
4
+ # 目录约定:<root>/<roster-id>/roster.yaml,且 roster 必须等于目录名。
5
+ kind: dsh-agent-roster/v1
6
+ roster: sre-oncall
7
+ version: 1.0.0
8
+ title: SRE 值守组
9
+ description: 值守不是盯屏:定告警阈值、写手册、算容量。
10
+ license: MIT
11
+ maintainers:
12
+ - STofone
13
+ tags:
14
+ - sre
15
+ - oncall
16
+ - capacity
17
+
18
+ defaults:
19
+ provider: deepseek
20
+ model: deepseek-v4.1-flash
21
+ reasoningEffort: high
22
+
23
+ members:
24
+ - name: lead
25
+ role: 值守负责人
26
+ title: 决定什么值得叫醒人
27
+ description: 审告警:能否行动、是否重复、是否该降级为看板。
28
+ systemPrompt: |
29
+ 你审每一条告警:收到的人能做什么、是否与别的告警重复、是否该只进看板。
30
+ 不写查询语句;你负责信噪比与值守负担。
31
+ 产出是告警清单:条件 · 动作 · 是否叫醒 · 升级路径。
32
+ 无法行动的告警一律降级,不能靠“先留着”维持噪音。
33
+ tags:
34
+ - alerting
35
+ - name: runbook
36
+ role: 手册编写
37
+ title: 半夜三点也能照着做
38
+ description: 写症状、判定、处置、回滚;每步都有期望输出。
39
+ systemPrompt: |
40
+ 你写手册:症状识别、判定命令、处置步骤、回滚,每步给期望输出。
41
+ 不解释系统设计;读者是在压力下照做的人。
42
+ 每份手册开头写“什么情况下不用看这本手册”。
43
+ 步骤依赖未验证的假设时标注“需先确认 X”,不要省略。
44
+ tags:
45
+ - runbook
46
+ - name: capacity
47
+ role: 容量与成本
48
+ title: 算清增长与拐点
49
+ description: 按增长曲线算余量、成本与扩容触发点。
50
+ toolScope:
51
+ allow:
52
+ - read
53
+ - bash
54
+ systemPrompt: |
55
+ 你按增长曲线算余量:当前水位、增长速率、扩容触发点、成本影响。
56
+ 不做架构改造建议;你给的是数字与触发条件。
57
+ 输出“指标 · 当前 · 增速 · 触线时间 · 扩容动作 · 成本”。
58
+ 数据不足时给区间并标明假设,不要编精确值。
59
+ tags:
60
+ - capacity
@@ -0,0 +1,58 @@
1
+ # 客服分诊组
2
+ #
3
+ # 本档案由本项目自撰(未复制任何上游文本),用于演示同一座档案库里的多种团队形态。
4
+ # 目录约定:<root>/<roster-id>/roster.yaml,且 roster 必须等于目录名。
5
+ kind: dsh-agent-roster/v1
6
+ roster: support-triage
7
+ version: 1.0.0
8
+ title: 客服分诊组
9
+ description: 把每条来信分到“能自助、要人接、是缺陷”三条路之一。
10
+ license: MIT
11
+ maintainers:
12
+ - STofone
13
+ tags:
14
+ - support
15
+ - triage
16
+
17
+ defaults:
18
+ provider: deepseek
19
+ model: deepseek-v4.1-flash
20
+ reasoningEffort: high
21
+
22
+ members:
23
+ - name: lead
24
+ role: 分诊负责人
25
+ title: 定分类口径与升级线
26
+ description: 维护分类表与升级条件;不直接回复用户。
27
+ systemPrompt: |
28
+ 你维护分诊口径:三类(可自助 / 需人工 / 疑似缺陷)各自的判定条件与升级线。
29
+ 不写具体回复;你负责让分诊结果可复核。
30
+ 产出是分类表 + 每条判定的边界例子(含一个反例)。
31
+ 口径冲突时按“宁可升级”处理,并记下这次冲突用于改口径。
32
+ tags:
33
+ - taxonomy
34
+ - name: classifier
35
+ role: 来信分诊
36
+ title: 读一遍来信,给出分类与依据
37
+ description: 按口径分类,摘出关键句作为依据;不确定就升级。
38
+ toolScope:
39
+ allow:
40
+ - read
41
+ systemPrompt: |
42
+ 你按口径给每条来信分类,并摘出决定分类的那句原话。
43
+ 不回复用户,也不承诺时间;你的产出是分类 + 依据 + 建议下一步。
44
+ 输出“来信摘要 · 分类 · 依据原句 · 建议动作”,一条一行。
45
+ 两类都像时标“不确定并升级”,不要赌。
46
+ tags:
47
+ - classification
48
+ - name: responder
49
+ role: 回复撰写
50
+ title: 先承认问题,再给可执行下一步
51
+ description: 按分诊结论写回复,含复现所需信息与替代方案。
52
+ systemPrompt: |
53
+ 你写回复:先复述对方遇到的问题,再给可执行的下一步(含需要的环境信息)。
54
+ 不承诺未定的修复时间,也不猜测根因;不确定就写“我们还在确认”。
55
+ 每条回复控制在 150 字内,附一条“若仍不行,请提供 X”。
56
+ 涉及退款、赔偿、法律措辞时停下转人工,不要自行承诺。
57
+ tags:
58
+ - response
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stofone/dsh-agent-roster",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "多 Agent 团队的静态成员档案定义与校验层:档案库在面板里看得见、改得动,团队成员的人设、模型与工具边界固化成可校验、可版本化的文件,并在 dsh-agent-teams 创建成员时把档案桥接给运行时。",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -23,6 +23,7 @@
23
23
  "schema",
24
24
  "icon.svg",
25
25
  "examples",
26
+ "orgs",
26
27
  "README.md",
27
28
  "README.zh.md",
28
29
  "CHANGELOG.md",
@@ -0,0 +1,50 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/STofone/dsh-agent-roster/blob/main/schema/organization.v1.schema.json",
4
+ "title": "DSH agent roster organization document",
5
+ "description": "一座档案库的目录页:声明库里有哪几份档案、各自什么状态。校验的权威实现是 lib/organization.js;本文件供编辑器与外部工具提示,两者由 test/organization.test.js 对齐。",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["kind", "organization", "rosters"],
9
+ "properties": {
10
+ "$schema": {
11
+ "type": "string",
12
+ "description": "编辑器用的 schema 地址,插件不读它。"
13
+ },
14
+ "kind": { "const": "dsh-agent-roster-organization/v1" },
15
+ "organization": {
16
+ "$ref": "#/$defs/id",
17
+ "description": "组织 id,同时是档案库根目录名。位置即身份。"
18
+ },
19
+ "title": { "type": "string", "maxLength": 120 },
20
+ "description": { "type": "string", "maxLength": 500 },
21
+ "license": { "type": "string", "maxLength": 120 },
22
+ "homepage": { "type": "string", "maxLength": 200, "pattern": "^https?://\\S+$" },
23
+ "maintainers": {
24
+ "type": "array",
25
+ "maxItems": 16,
26
+ "items": { "type": "string", "minLength": 1, "maxLength": 120 }
27
+ },
28
+ "rosters": {
29
+ "type": "array",
30
+ "minItems": 1,
31
+ "maxItems": 64,
32
+ "description": "登记在案的档案。声明了却找不到目录会报错;目录在却没登记会告警。",
33
+ "items": {
34
+ "type": "object",
35
+ "additionalProperties": false,
36
+ "required": ["id"],
37
+ "properties": {
38
+ "id": { "$ref": "#/$defs/id" },
39
+ "title": { "type": "string", "maxLength": 120 },
40
+ "status": { "enum": ["active", "archived"] },
41
+ "origin": { "type": "string", "maxLength": 120 },
42
+ "note": { "type": "string", "maxLength": 300 }
43
+ }
44
+ }
45
+ }
46
+ },
47
+ "$defs": {
48
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]{1,63}$" }
49
+ }
50
+ }
@@ -0,0 +1,83 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/STofone/dsh-agent-roster/blob/main/schema/registry.v1.schema.json",
4
+ "title": "DSH agent roster registry document",
5
+ "description": "公共档案索引:登记若干 collection(仓库 + 目录 + 确有哪几份档案),供订阅与一键安装。权威校验实现是 lib/remote.js#validateRegistry;本文件供编辑器与外部工具提示,两者由 test/registry-schema.test.js 对齐。注意:运行时对未知字段只告警不判错,这里写成 additionalProperties:false 是为了让编辑器早点指出拼写错误。",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["kind", "collections"],
9
+ "properties": {
10
+ "$schema": {
11
+ "type": "string",
12
+ "description": "编辑器用的 schema 地址,插件不读它。"
13
+ },
14
+ "kind": { "const": "dsh-agent-roster-registry/v1" },
15
+ "version": { "type": "integer", "minimum": 1 },
16
+ "generatedAt": {
17
+ "type": "string",
18
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$",
19
+ "description": "上一次校验通过的时间,由 CI 或维护者盖章。"
20
+ },
21
+ "generator": { "type": "string", "maxLength": 200 },
22
+ "source": { "type": "string", "maxLength": 200 },
23
+ "collections": {
24
+ "type": "array",
25
+ "maxItems": 500,
26
+ "items": {
27
+ "type": "object",
28
+ "additionalProperties": false,
29
+ "required": ["id", "repo"],
30
+ "properties": {
31
+ "id": { "$ref": "#/$defs/id" },
32
+ "title": { "type": "string", "maxLength": 120 },
33
+ "description": { "type": "string", "maxLength": 500 },
34
+ "repo": {
35
+ "type": "string",
36
+ "pattern": "^(?:github:)?[A-Za-z0-9][A-Za-z0-9_.-]{0,38}/[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$",
37
+ "description": "仓库坐标,形如 github:owner/repo。"
38
+ },
39
+ "ref": {
40
+ "type": "string",
41
+ "pattern": "^(?:[A-Za-z0-9][A-Za-z0-9._-]{0,127}|[0-9a-f]{40})$",
42
+ "default": "main",
43
+ "description": "分支、标签或 40 位 commit。"
44
+ },
45
+ "path": {
46
+ "type": "string",
47
+ "pattern": "^(?:/)?(?:[A-Za-z0-9._-]+/)*[A-Za-z0-9._-]*$",
48
+ "default": "rosters",
49
+ "description": "仓库内存放档案的目录。"
50
+ },
51
+ "rosters": {
52
+ "type": "array",
53
+ "maxItems": 200,
54
+ "description": "目录里确实存在的档案 id。索引不撒谎:不存在的 id 会被 registry sync 剔除。",
55
+ "items": { "$ref": "#/$defs/id" }
56
+ },
57
+ "tags": {
58
+ "type": "array",
59
+ "maxItems": 16,
60
+ "items": {
61
+ "type": "string",
62
+ "pattern": "^[a-z0-9][a-z0-9-]{0,31}$"
63
+ }
64
+ },
65
+ "license": { "type": "string", "maxLength": 120 },
66
+ "maintainers": {
67
+ "type": "array",
68
+ "maxItems": 16,
69
+ "items": { "type": "string", "minLength": 1, "maxLength": 120 }
70
+ },
71
+ "homepage": { "type": "string", "maxLength": 200, "pattern": "^https?://\\S+$" }
72
+ }
73
+ }
74
+ }
75
+ },
76
+ "$defs": {
77
+ "id": {
78
+ "type": "string",
79
+ "pattern": "^[a-z0-9][a-z0-9-]{1,63}$",
80
+ "description": "kebab-case 标识,与档案目录名同规则。"
81
+ }
82
+ }
83
+ }