@stofone/dsh-agent-roster 0.9.1 → 0.10.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 (168) hide show
  1. package/CHANGELOG.md +71 -1
  2. package/README.md +78 -4
  3. package/README.zh.md +44 -1
  4. package/bin/cli.mjs +228 -2
  5. package/client.js +49 -24
  6. package/docs/roster-v2.md +220 -0
  7. package/examples/dist/core-review-1.0.0.json +160 -0
  8. package/examples/dist/research-0.1.0.json +95 -0
  9. package/examples/roles/core-review-correctness/AGENT.md +20 -0
  10. package/examples/roles/core-review-lead/AGENT.md +23 -0
  11. package/examples/roles/core-review-lead-captain/AGENT.md +13 -0
  12. package/examples/roles/core-review-maintainer/AGENT.md +20 -0
  13. package/examples/roles/research-scout/AGENT.md +16 -0
  14. package/examples/roles/research-verifier/AGENT.md +16 -0
  15. package/examples/rosters/core-review/roster.yaml +39 -0
  16. package/examples/rosters/research/roster.yaml +20 -0
  17. package/examples-orchestration/dist/core-review-1.0.0.json +185 -0
  18. package/examples-orchestration/dist/core-review-1.0.0.tasks.json +76 -0
  19. package/examples-orchestration/roles/fixer/AGENT.md +18 -0
  20. package/examples-orchestration/roles/lead/AGENT.md +18 -0
  21. package/examples-orchestration/roles/reviewer/AGENT.md +23 -0
  22. package/examples-orchestration/roles/reviewer/parts/checklist.md +6 -0
  23. package/examples-orchestration/rosters/core-review/overrides/fixer.md +1 -0
  24. package/examples-orchestration/rosters/core-review/roster.yaml +43 -0
  25. package/index.js +8 -1
  26. package/lib/compile2.js +522 -0
  27. package/lib/format-v2.js +196 -0
  28. package/lib/frontmatter.js +113 -0
  29. package/lib/migrate.js +326 -0
  30. package/lib/plan.js +167 -0
  31. package/lib/registry.js +65 -11
  32. package/lib/role.js +498 -0
  33. package/lib/roster2.js +591 -0
  34. package/lib/run.js +188 -0
  35. package/lib/write.js +14 -8
  36. package/orgs/agent-roster-collective/dist/api-design-1.0.0.json +130 -0
  37. package/orgs/agent-roster-collective/dist/content-ops-1.0.0.json +130 -0
  38. package/orgs/agent-roster-collective/dist/contract-review-1.0.0.json +130 -0
  39. package/orgs/agent-roster-collective/dist/data-quality-1.0.0.json +130 -0
  40. package/orgs/agent-roster-collective/dist/db-migration-1.0.0.json +130 -0
  41. package/orgs/agent-roster-collective/dist/docs-writer-1.0.0.json +130 -0
  42. package/orgs/agent-roster-collective/dist/finance-recon-1.0.0.json +130 -0
  43. package/orgs/agent-roster-collective/dist/frontend-ui-1.0.0.json +130 -0
  44. package/orgs/agent-roster-collective/dist/i18n-l10n-1.0.0.json +130 -0
  45. package/orgs/agent-roster-collective/dist/incident-response-1.0.0.json +130 -0
  46. package/orgs/agent-roster-collective/dist/literature-review-1.0.0.json +130 -0
  47. package/orgs/agent-roster-collective/dist/market-research-1.0.0.json +130 -0
  48. package/orgs/agent-roster-collective/dist/ml-eval-1.0.0.json +130 -0
  49. package/orgs/agent-roster-collective/dist/performance-1.0.0.json +130 -0
  50. package/orgs/agent-roster-collective/dist/product-discovery-1.0.0.json +130 -0
  51. package/orgs/agent-roster-collective/dist/qa-regression-1.0.0.json +130 -0
  52. package/orgs/agent-roster-collective/dist/recruiting-1.0.0.json +130 -0
  53. package/orgs/agent-roster-collective/dist/release-manager-1.0.0.json +130 -0
  54. package/orgs/agent-roster-collective/dist/security-audit-1.0.0.json +132 -0
  55. package/orgs/agent-roster-collective/dist/sre-oncall-1.0.0.json +130 -0
  56. package/orgs/agent-roster-collective/dist/support-triage-1.0.0.json +130 -0
  57. package/orgs/agent-roster-collective/roles/api-design-failure-mode/AGENT.md +19 -0
  58. package/orgs/agent-roster-collective/roles/api-design-lead/AGENT.md +19 -0
  59. package/orgs/agent-roster-collective/roles/api-design-schema/AGENT.md +20 -0
  60. package/orgs/agent-roster-collective/roles/content-ops-distributor/AGENT.md +19 -0
  61. package/orgs/agent-roster-collective/roles/content-ops-editor/AGENT.md +19 -0
  62. package/orgs/agent-roster-collective/roles/content-ops-lead/AGENT.md +19 -0
  63. package/orgs/agent-roster-collective/roles/contract-review-clause-reader/AGENT.md +19 -0
  64. package/orgs/agent-roster-collective/roles/contract-review-lead/AGENT.md +19 -0
  65. package/orgs/agent-roster-collective/roles/contract-review-risk-note/AGENT.md +19 -0
  66. package/orgs/agent-roster-collective/roles/data-quality-lead/AGENT.md +19 -0
  67. package/orgs/agent-roster-collective/roles/data-quality-profiler/AGENT.md +19 -0
  68. package/orgs/agent-roster-collective/roles/data-quality-rule-author/AGENT.md +19 -0
  69. package/orgs/agent-roster-collective/roles/db-migration-lead/AGENT.md +19 -0
  70. package/orgs/agent-roster-collective/roles/db-migration-migrator/AGENT.md +19 -0
  71. package/orgs/agent-roster-collective/roles/db-migration-verifier/AGENT.md +19 -0
  72. package/orgs/agent-roster-collective/roles/docs-writer-example-runner/AGENT.md +19 -0
  73. package/orgs/agent-roster-collective/roles/docs-writer-lead/AGENT.md +19 -0
  74. package/orgs/agent-roster-collective/roles/docs-writer-writer/AGENT.md +19 -0
  75. package/orgs/agent-roster-collective/roles/finance-recon-exception/AGENT.md +19 -0
  76. package/orgs/agent-roster-collective/roles/finance-recon-lead/AGENT.md +19 -0
  77. package/orgs/agent-roster-collective/roles/finance-recon-matcher/AGENT.md +19 -0
  78. package/orgs/agent-roster-collective/roles/frontend-ui-a11y-reviewer/AGENT.md +19 -0
  79. package/orgs/agent-roster-collective/roles/frontend-ui-implementer/AGENT.md +19 -0
  80. package/orgs/agent-roster-collective/roles/frontend-ui-lead/AGENT.md +19 -0
  81. package/orgs/agent-roster-collective/roles/i18n-l10n-lead/AGENT.md +19 -0
  82. package/orgs/agent-roster-collective/roles/i18n-l10n-reviewer/AGENT.md +19 -0
  83. package/orgs/agent-roster-collective/roles/i18n-l10n-translator/AGENT.md +19 -0
  84. package/orgs/agent-roster-collective/roles/incident-response-commander/AGENT.md +19 -0
  85. package/orgs/agent-roster-collective/roles/incident-response-scribe/AGENT.md +19 -0
  86. package/orgs/agent-roster-collective/roles/incident-response-triage/AGENT.md +19 -0
  87. package/orgs/agent-roster-collective/roles/literature-review-critic/AGENT.md +19 -0
  88. package/orgs/agent-roster-collective/roles/literature-review-extractor/AGENT.md +19 -0
  89. package/orgs/agent-roster-collective/roles/literature-review-lead/AGENT.md +19 -0
  90. package/orgs/agent-roster-collective/roles/market-research-lead/AGENT.md +19 -0
  91. package/orgs/agent-roster-collective/roles/market-research-researcher/AGENT.md +19 -0
  92. package/orgs/agent-roster-collective/roles/market-research-synthesizer/AGENT.md +19 -0
  93. package/orgs/agent-roster-collective/roles/ml-eval-dataset/AGENT.md +19 -0
  94. package/orgs/agent-roster-collective/roles/ml-eval-lead/AGENT.md +19 -0
  95. package/orgs/agent-roster-collective/roles/ml-eval-metric/AGENT.md +19 -0
  96. package/orgs/agent-roster-collective/roles/performance-lead/AGENT.md +19 -0
  97. package/orgs/agent-roster-collective/roles/performance-load-tester/AGENT.md +19 -0
  98. package/orgs/agent-roster-collective/roles/performance-profiler/AGENT.md +19 -0
  99. package/orgs/agent-roster-collective/roles/product-discovery-interviewer/AGENT.md +19 -0
  100. package/orgs/agent-roster-collective/roles/product-discovery-lead/AGENT.md +19 -0
  101. package/orgs/agent-roster-collective/roles/product-discovery-skeptic/AGENT.md +19 -0
  102. package/orgs/agent-roster-collective/roles/qa-regression-case-writer/AGENT.md +19 -0
  103. package/orgs/agent-roster-collective/roles/qa-regression-flake-hunter/AGENT.md +19 -0
  104. package/orgs/agent-roster-collective/roles/qa-regression-lead/AGENT.md +19 -0
  105. package/orgs/agent-roster-collective/roles/recruiting-lead/AGENT.md +19 -0
  106. package/orgs/agent-roster-collective/roles/recruiting-scheduler/AGENT.md +19 -0
  107. package/orgs/agent-roster-collective/roles/recruiting-screener/AGENT.md +19 -0
  108. package/orgs/agent-roster-collective/roles/release-manager-changelog/AGENT.md +19 -0
  109. package/orgs/agent-roster-collective/roles/release-manager-lead/AGENT.md +19 -0
  110. package/orgs/agent-roster-collective/roles/release-manager-rollback/AGENT.md +19 -0
  111. package/orgs/agent-roster-collective/roles/security-audit-code-auditor/AGENT.md +19 -0
  112. package/orgs/agent-roster-collective/roles/security-audit-lead/AGENT.md +19 -0
  113. package/orgs/agent-roster-collective/roles/security-audit-threat-modeler/AGENT.md +19 -0
  114. package/orgs/agent-roster-collective/roles/sre-oncall-capacity/AGENT.md +19 -0
  115. package/orgs/agent-roster-collective/roles/sre-oncall-lead/AGENT.md +19 -0
  116. package/orgs/agent-roster-collective/roles/sre-oncall-runbook/AGENT.md +19 -0
  117. package/orgs/agent-roster-collective/roles/support-triage-classifier/AGENT.md +19 -0
  118. package/orgs/agent-roster-collective/roles/support-triage-lead/AGENT.md +19 -0
  119. package/orgs/agent-roster-collective/roles/support-triage-responder/AGENT.md +19 -0
  120. package/orgs/agent-roster-collective/rosters/api-design/roster.yaml +26 -0
  121. package/orgs/agent-roster-collective/rosters/content-ops/roster.yaml +25 -0
  122. package/orgs/agent-roster-collective/rosters/contract-review/roster.yaml +25 -0
  123. package/orgs/agent-roster-collective/rosters/data-quality/roster.yaml +26 -0
  124. package/orgs/agent-roster-collective/rosters/db-migration/roster.yaml +26 -0
  125. package/orgs/agent-roster-collective/rosters/docs-writer/roster.yaml +25 -0
  126. package/orgs/agent-roster-collective/rosters/finance-recon/roster.yaml +25 -0
  127. package/orgs/agent-roster-collective/rosters/frontend-ui/roster.yaml +26 -0
  128. package/orgs/agent-roster-collective/rosters/i18n-l10n/roster.yaml +26 -0
  129. package/orgs/agent-roster-collective/rosters/incident-response/roster.yaml +26 -0
  130. package/orgs/agent-roster-collective/rosters/literature-review/roster.yaml +25 -0
  131. package/orgs/agent-roster-collective/rosters/market-research/roster.yaml +25 -0
  132. package/orgs/agent-roster-collective/rosters/ml-eval/roster.yaml +25 -0
  133. package/orgs/agent-roster-collective/rosters/performance/roster.yaml +25 -0
  134. package/orgs/agent-roster-collective/rosters/product-discovery/roster.yaml +25 -0
  135. package/orgs/agent-roster-collective/rosters/qa-regression/roster.yaml +26 -0
  136. package/orgs/agent-roster-collective/rosters/recruiting/roster.yaml +25 -0
  137. package/orgs/agent-roster-collective/rosters/release-manager/roster.yaml +25 -0
  138. package/orgs/agent-roster-collective/rosters/security-audit/roster.yaml +30 -0
  139. package/orgs/agent-roster-collective/rosters/sre-oncall/roster.yaml +26 -0
  140. package/orgs/agent-roster-collective/rosters/support-triage/roster.yaml +25 -0
  141. package/package.json +3 -1
  142. package/schema/compiled.v1.schema.json +391 -0
  143. package/schema/role.v1.schema.json +240 -0
  144. package/schema/roster.v2.schema.json +437 -0
  145. package/examples/core-review/roster.yaml +0 -82
  146. package/examples/research/roster.yaml +0 -42
  147. package/orgs/agent-roster-collective/api-design/roster.yaml +0 -67
  148. package/orgs/agent-roster-collective/content-ops/roster.yaml +0 -55
  149. package/orgs/agent-roster-collective/contract-review/roster.yaml +0 -58
  150. package/orgs/agent-roster-collective/data-quality/roster.yaml +0 -64
  151. package/orgs/agent-roster-collective/db-migration/roster.yaml +0 -64
  152. package/orgs/agent-roster-collective/docs-writer/roster.yaml +0 -59
  153. package/orgs/agent-roster-collective/finance-recon/roster.yaml +0 -63
  154. package/orgs/agent-roster-collective/frontend-ui/roster.yaml +0 -60
  155. package/orgs/agent-roster-collective/i18n-l10n/roster.yaml +0 -60
  156. package/orgs/agent-roster-collective/incident-response/roster.yaml +0 -65
  157. package/orgs/agent-roster-collective/literature-review/roster.yaml +0 -61
  158. package/orgs/agent-roster-collective/market-research/roster.yaml +0 -60
  159. package/orgs/agent-roster-collective/ml-eval/roster.yaml +0 -63
  160. package/orgs/agent-roster-collective/performance/roster.yaml +0 -63
  161. package/orgs/agent-roster-collective/product-discovery/roster.yaml +0 -55
  162. package/orgs/agent-roster-collective/qa-regression/roster.yaml +0 -64
  163. package/orgs/agent-roster-collective/recruiting/roster.yaml +0 -58
  164. package/orgs/agent-roster-collective/release-manager/roster.yaml +0 -59
  165. package/orgs/agent-roster-collective/security-audit/roster.yaml +0 -65
  166. package/orgs/agent-roster-collective/sre-oncall/roster.yaml +0 -60
  167. package/orgs/agent-roster-collective/support-triage/roster.yaml +0 -58
  168. /package/orgs/agent-roster-collective/{security-audit → rosters/security-audit}/capabilities.yaml +0 -0
@@ -0,0 +1,240 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/dsh-agent-roster/dsh-agent-roster/blob/main/schema/role.v1.schema.json",
4
+ "title": "DSH agent roster role",
5
+ "description": "一份角色:frontmatter 是参数(路由、工具策略、片段顺序、预算),正文是人设。校验的权威实现是 lib/role.js;本文件供编辑器与外部工具提示,两者由 test/v2-schema.test.js 对齐。",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "kind",
10
+ "name",
11
+ "version",
12
+ "role"
13
+ ],
14
+ "properties": {
15
+ "$schema": {
16
+ "type": "string",
17
+ "description": "编辑器用的 schema 地址,插件不读它。"
18
+ },
19
+ "kind": {
20
+ "const": "dsh-agent-roster/role@1"
21
+ },
22
+ "name": {
23
+ "$ref": "#/$defs/id",
24
+ "description": "角色身份权威(不是目录名)。同一座角色库里必须唯一。"
25
+ },
26
+ "version": {
27
+ "$ref": "#/$defs/semver",
28
+ "description": "角色自己的版本,与引用它的 roster 版本无关。"
29
+ },
30
+ "role": {
31
+ "type": "string",
32
+ "minLength": 1,
33
+ "maxLength": 120
34
+ },
35
+ "title": {
36
+ "type": "string",
37
+ "minLength": 1,
38
+ "maxLength": 120
39
+ },
40
+ "description": {
41
+ "type": "string",
42
+ "minLength": 1,
43
+ "maxLength": 500
44
+ },
45
+ "tags": {
46
+ "type": "array",
47
+ "maxItems": 16,
48
+ "items": {
49
+ "$ref": "#/$defs/tag"
50
+ }
51
+ },
52
+ "maintainers": {
53
+ "type": "array",
54
+ "maxItems": 16,
55
+ "items": {
56
+ "$ref": "#/$defs/id"
57
+ }
58
+ },
59
+ "license": {
60
+ "type": "string",
61
+ "minLength": 1,
62
+ "maxLength": 120
63
+ },
64
+ "notes": {
65
+ "type": "string",
66
+ "minLength": 1,
67
+ "maxLength": 500
68
+ },
69
+ "route": {
70
+ "$ref": "#/$defs/route"
71
+ },
72
+ "tools": {
73
+ "$ref": "#/$defs/tools"
74
+ },
75
+ "prompt": {
76
+ "$ref": "#/$defs/prompt"
77
+ },
78
+ "skills": {
79
+ "type": "array",
80
+ "maxItems": 16,
81
+ "items": {
82
+ "$ref": "#/$defs/skill"
83
+ }
84
+ },
85
+ "examples": {
86
+ "$ref": "#/$defs/relativePath"
87
+ },
88
+ "requires": {
89
+ "$ref": "#/$defs/requires"
90
+ },
91
+ "onMissing": {
92
+ "enum": [
93
+ "refuse",
94
+ "degraded"
95
+ ],
96
+ "description": "部署缺少声明要求时的行为;默认 refuse。"
97
+ }
98
+ },
99
+ "$defs": {
100
+ "id": {
101
+ "type": "string",
102
+ "pattern": "^[a-z0-9][a-z0-9-]{1,63}$"
103
+ },
104
+ "semver": {
105
+ "type": "string",
106
+ "pattern": "^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"
107
+ },
108
+ "provider": {
109
+ "type": "string",
110
+ "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"
111
+ },
112
+ "model": {
113
+ "type": "string",
114
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:/-]{0,119}$"
115
+ },
116
+ "effort": {
117
+ "enum": [
118
+ "low",
119
+ "medium",
120
+ "high",
121
+ "default"
122
+ ]
123
+ },
124
+ "tag": {
125
+ "type": "string",
126
+ "pattern": "^[a-z0-9][a-z0-9-]{0,31}$"
127
+ },
128
+ "skill": {
129
+ "type": "string",
130
+ "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"
131
+ },
132
+ "toolPattern": {
133
+ "type": "string",
134
+ "pattern": "^[A-Za-z0-9_][A-Za-z0-9_.:-]{0,126}\\*?$"
135
+ },
136
+ "relativePath": {
137
+ "type": "string",
138
+ "minLength": 1,
139
+ "pattern": "^(?!.*\\.\\.)(?![A-Za-z]:[\\\\/])(?!/)(?!.*\\\\)(?:[A-Za-z0-9._-]+/)*[A-Za-z0-9._-]+$",
140
+ "description": "角色/组装目录内的相对路径;不允许绝对路径、.. 与反斜杠。"
141
+ },
142
+ "route": {
143
+ "type": "object",
144
+ "additionalProperties": false,
145
+ "properties": {
146
+ "provider": {
147
+ "$ref": "#/$defs/provider"
148
+ },
149
+ "model": {
150
+ "$ref": "#/$defs/model"
151
+ },
152
+ "reasoningEffort": {
153
+ "$ref": "#/$defs/effort"
154
+ }
155
+ },
156
+ "dependentRequired": {
157
+ "provider": [
158
+ "model"
159
+ ],
160
+ "model": [
161
+ "provider"
162
+ ]
163
+ }
164
+ },
165
+ "scope": {
166
+ "type": "object",
167
+ "additionalProperties": false,
168
+ "properties": {
169
+ "allow": {
170
+ "type": "array",
171
+ "maxItems": 64,
172
+ "items": {
173
+ "$ref": "#/$defs/toolPattern"
174
+ }
175
+ },
176
+ "deny": {
177
+ "type": "array",
178
+ "maxItems": 64,
179
+ "items": {
180
+ "$ref": "#/$defs/toolPattern"
181
+ }
182
+ }
183
+ }
184
+ },
185
+ "tools": {
186
+ "type": "object",
187
+ "additionalProperties": false,
188
+ "properties": {
189
+ "policy": {
190
+ "$ref": "#/$defs/id",
191
+ "description": "direct:部署已声明的 toolPolicy id。"
192
+ },
193
+ "scope": {
194
+ "$ref": "#/$defs/scope",
195
+ "description": "declaration:只作说明,运行时不生效。"
196
+ }
197
+ }
198
+ },
199
+ "prompt": {
200
+ "type": "object",
201
+ "additionalProperties": false,
202
+ "properties": {
203
+ "parts": {
204
+ "type": "array",
205
+ "maxItems": 16,
206
+ "items": {
207
+ "$ref": "#/$defs/relativePath"
208
+ },
209
+ "description": "按顺序拼在正文之后的片段;拼装语义见 docs/roster-v2.md。"
210
+ },
211
+ "budget": {
212
+ "type": "integer",
213
+ "minimum": 1,
214
+ "description": "本角色拼装后的字符预算(不是 token)。"
215
+ }
216
+ }
217
+ },
218
+ "requires": {
219
+ "type": "object",
220
+ "additionalProperties": false,
221
+ "properties": {
222
+ "skills": {
223
+ "type": "array",
224
+ "maxItems": 16,
225
+ "items": {
226
+ "$ref": "#/$defs/skill"
227
+ }
228
+ },
229
+ "toolPolicies": {
230
+ "type": "array",
231
+ "maxItems": 16,
232
+ "items": {
233
+ "$ref": "#/$defs/id"
234
+ }
235
+ }
236
+ },
237
+ "description": "只收有证据源的要求:技能目录、部署声明的 toolPolicies。其余一律 unknown-field。"
238
+ }
239
+ }
240
+ }
@@ -0,0 +1,437 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/dsh-agent-roster/dsh-agent-roster/blob/main/schema/roster.v2.schema.json",
4
+ "title": "DSH agent roster assembly (v2)",
5
+ "description": "一份组装:成员是对 roles/*/AGENT.md 的引用,队长独立成段,编排是一等公民。校验的权威实现是 lib/roster2.js 与 lib/compile2.js;本文件供编辑器提示,两者由 test/v2-schema.test.js 对齐。",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "kind",
10
+ "id",
11
+ "version",
12
+ "members"
13
+ ],
14
+ "properties": {
15
+ "$schema": {
16
+ "type": "string"
17
+ },
18
+ "kind": {
19
+ "const": "dsh-agent-roster/roster@2"
20
+ },
21
+ "id": {
22
+ "$ref": "#/$defs/id"
23
+ },
24
+ "version": {
25
+ "$ref": "#/$defs/semver"
26
+ },
27
+ "title": {
28
+ "type": "string",
29
+ "minLength": 1,
30
+ "maxLength": 120
31
+ },
32
+ "description": {
33
+ "type": "string",
34
+ "minLength": 1,
35
+ "maxLength": 500
36
+ },
37
+ "license": {
38
+ "type": "string",
39
+ "minLength": 1,
40
+ "maxLength": 120
41
+ },
42
+ "notes": {
43
+ "type": "string",
44
+ "minLength": 1,
45
+ "maxLength": 500
46
+ },
47
+ "maintainers": {
48
+ "type": "array",
49
+ "maxItems": 16,
50
+ "items": {
51
+ "$ref": "#/$defs/handle"
52
+ }
53
+ },
54
+ "tags": {
55
+ "type": "array",
56
+ "maxItems": 16,
57
+ "items": {
58
+ "$ref": "#/$defs/tag"
59
+ }
60
+ },
61
+ "defaults": {
62
+ "$ref": "#/$defs/defaults"
63
+ },
64
+ "targets": {
65
+ "type": "array",
66
+ "minItems": 1,
67
+ "items": {
68
+ "enum": [
69
+ "agent-teams/members",
70
+ "agent-teams/orchestration",
71
+ "profile/agent-preset"
72
+ ]
73
+ },
74
+ "description": "编译目标:决定字段落到哪个面。缺省 agent-teams/members。"
75
+ },
76
+ "members": {
77
+ "type": "array",
78
+ "minItems": 1,
79
+ "maxItems": 32,
80
+ "items": {
81
+ "$ref": "#/$defs/member"
82
+ }
83
+ },
84
+ "captain": {
85
+ "$ref": "#/$defs/captain"
86
+ },
87
+ "orchestration": {
88
+ "$ref": "#/$defs/orchestration"
89
+ },
90
+ "requires": {
91
+ "$ref": "#/$defs/requires"
92
+ },
93
+ "onMissing": {
94
+ "enum": [
95
+ "refuse",
96
+ "degraded"
97
+ ]
98
+ }
99
+ },
100
+ "$defs": {
101
+ "handle": {
102
+ "type": "string",
103
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$"
104
+ },
105
+ "id": {
106
+ "type": "string",
107
+ "pattern": "^[a-z0-9][a-z0-9-]{1,63}$"
108
+ },
109
+ "semver": {
110
+ "type": "string",
111
+ "pattern": "^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"
112
+ },
113
+ "provider": {
114
+ "type": "string",
115
+ "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"
116
+ },
117
+ "model": {
118
+ "type": "string",
119
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:/-]{0,119}$"
120
+ },
121
+ "effort": {
122
+ "enum": [
123
+ "low",
124
+ "medium",
125
+ "high",
126
+ "default"
127
+ ]
128
+ },
129
+ "tag": {
130
+ "type": "string",
131
+ "pattern": "^[a-z0-9][a-z0-9-]{0,31}$"
132
+ },
133
+ "skill": {
134
+ "type": "string",
135
+ "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"
136
+ },
137
+ "toolPattern": {
138
+ "type": "string",
139
+ "pattern": "^[A-Za-z0-9_][A-Za-z0-9_.:-]{0,126}\\*?$"
140
+ },
141
+ "roleRef": {
142
+ "type": "string",
143
+ "pattern": "^([a-z0-9][a-z0-9-]{1,63})@((?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?)$",
144
+ "description": "角色引用 name@x.y.z;不写范围、不写 latest。"
145
+ },
146
+ "relativePath": {
147
+ "type": "string",
148
+ "minLength": 1,
149
+ "pattern": "^(?!.*\\.\\.)(?![A-Za-z]:[\\\\/])(?!/)(?!.*\\\\)(?:[A-Za-z0-9._-]+/)*[A-Za-z0-9._-]+$"
150
+ },
151
+ "route": {
152
+ "type": "object",
153
+ "additionalProperties": false,
154
+ "properties": {
155
+ "provider": {
156
+ "$ref": "#/$defs/provider"
157
+ },
158
+ "model": {
159
+ "$ref": "#/$defs/model"
160
+ },
161
+ "reasoningEffort": {
162
+ "$ref": "#/$defs/effort"
163
+ }
164
+ },
165
+ "dependentRequired": {
166
+ "provider": [
167
+ "model"
168
+ ],
169
+ "model": [
170
+ "provider"
171
+ ]
172
+ }
173
+ },
174
+ "scope": {
175
+ "type": "object",
176
+ "additionalProperties": false,
177
+ "properties": {
178
+ "allow": {
179
+ "type": "array",
180
+ "maxItems": 64,
181
+ "items": {
182
+ "$ref": "#/$defs/toolPattern"
183
+ }
184
+ },
185
+ "deny": {
186
+ "type": "array",
187
+ "maxItems": 64,
188
+ "items": {
189
+ "$ref": "#/$defs/toolPattern"
190
+ }
191
+ }
192
+ }
193
+ },
194
+ "tools": {
195
+ "type": "object",
196
+ "additionalProperties": false,
197
+ "properties": {
198
+ "policy": {
199
+ "$ref": "#/$defs/id"
200
+ },
201
+ "scope": {
202
+ "$ref": "#/$defs/scope"
203
+ }
204
+ }
205
+ },
206
+ "defaults": {
207
+ "type": "object",
208
+ "additionalProperties": false,
209
+ "description": "只放能被成员继承的桥接字段;编译时展开成每个人的显式值。",
210
+ "properties": {
211
+ "route": {
212
+ "$ref": "#/$defs/route"
213
+ },
214
+ "tools": {
215
+ "$ref": "#/$defs/tools"
216
+ }
217
+ }
218
+ },
219
+ "memberPrompt": {
220
+ "type": "object",
221
+ "additionalProperties": false,
222
+ "properties": {
223
+ "prepend": {
224
+ "$ref": "#/$defs/relativePath"
225
+ },
226
+ "append": {
227
+ "$ref": "#/$defs/relativePath"
228
+ }
229
+ },
230
+ "description": "只能加在角色拼装结果的两端,不能重排或替换角色内部片段。"
231
+ },
232
+ "member": {
233
+ "type": "object",
234
+ "additionalProperties": false,
235
+ "required": [
236
+ "as",
237
+ "role"
238
+ ],
239
+ "properties": {
240
+ "as": {
241
+ "$ref": "#/$defs/id",
242
+ "description": "成员名(编译产物里的 name)。"
243
+ },
244
+ "role": {
245
+ "$ref": "#/$defs/roleRef"
246
+ },
247
+ "route": {
248
+ "$ref": "#/$defs/route"
249
+ },
250
+ "tools": {
251
+ "$ref": "#/$defs/tools"
252
+ },
253
+ "prompt": {
254
+ "$ref": "#/$defs/memberPrompt"
255
+ },
256
+ "requires": {
257
+ "$ref": "#/$defs/requires"
258
+ },
259
+ "notes": {
260
+ "type": "string",
261
+ "minLength": 1,
262
+ "maxLength": 500
263
+ }
264
+ }
265
+ },
266
+ "captain": {
267
+ "type": "object",
268
+ "additionalProperties": false,
269
+ "description": "队长不是成员:它是创建团队的那个会话。路由与 persona 只能落 profile 配置。",
270
+ "properties": {
271
+ "role": {
272
+ "$ref": "#/$defs/roleRef"
273
+ },
274
+ "route": {
275
+ "$ref": "#/$defs/route"
276
+ },
277
+ "persona": {
278
+ "$ref": "#/$defs/relativePath"
279
+ },
280
+ "notes": {
281
+ "type": "string",
282
+ "minLength": 1,
283
+ "maxLength": 500
284
+ }
285
+ }
286
+ },
287
+ "stage": {
288
+ "type": "object",
289
+ "additionalProperties": false,
290
+ "required": [
291
+ "id"
292
+ ],
293
+ "properties": {
294
+ "id": {
295
+ "$ref": "#/$defs/id"
296
+ },
297
+ "parallel": {
298
+ "type": "array",
299
+ "maxItems": 32,
300
+ "items": {
301
+ "$ref": "#/$defs/id"
302
+ }
303
+ },
304
+ "serial": {
305
+ "type": "array",
306
+ "maxItems": 32,
307
+ "items": {
308
+ "$ref": "#/$defs/id"
309
+ }
310
+ },
311
+ "join": {
312
+ "$ref": "#/$defs/id"
313
+ },
314
+ "on": {
315
+ "type": "string",
316
+ "minLength": 1,
317
+ "maxLength": 120
318
+ },
319
+ "role": {
320
+ "$ref": "#/$defs/roleRef"
321
+ },
322
+ "maxRounds": {
323
+ "type": "integer",
324
+ "minimum": 1,
325
+ "maximum": 5
326
+ }
327
+ }
328
+ },
329
+ "gate": {
330
+ "type": "object",
331
+ "additionalProperties": false,
332
+ "required": [
333
+ "id",
334
+ "after",
335
+ "verify",
336
+ "by"
337
+ ],
338
+ "properties": {
339
+ "id": {
340
+ "$ref": "#/$defs/id"
341
+ },
342
+ "after": {
343
+ "type": "array",
344
+ "maxItems": 12,
345
+ "items": {
346
+ "$ref": "#/$defs/id"
347
+ },
348
+ "description": "等哪些阶段结束;必须是存在的 stage id(机器可校验)。"
349
+ },
350
+ "requires": {
351
+ "type": "array",
352
+ "maxItems": 16,
353
+ "items": {
354
+ "type": "string",
355
+ "minLength": 1,
356
+ "maxLength": 160
357
+ },
358
+ "description": "验收判据(给人读的句子,编译器只钉条数与长度)。"
359
+ },
360
+ "by": {
361
+ "$ref": "#/$defs/id",
362
+ "description": "由哪个成员判定;必须是本组装的成员名。"
363
+ },
364
+ "verify": {
365
+ "type": "array",
366
+ "minItems": 1,
367
+ "maxItems": 8,
368
+ "description": "可执行判据:跑什么命令、期望退出码。门至少要有一条,否则只能自己给自己盖章。",
369
+ "items": {
370
+ "type": "object",
371
+ "additionalProperties": false,
372
+ "required": [
373
+ "command"
374
+ ],
375
+ "properties": {
376
+ "command": {
377
+ "type": "string",
378
+ "minLength": 1,
379
+ "maxLength": 500
380
+ },
381
+ "expectExit": {
382
+ "type": "integer",
383
+ "minimum": 0,
384
+ "maximum": 255
385
+ }
386
+ }
387
+ }
388
+ }
389
+ }
390
+ },
391
+ "orchestration": {
392
+ "type": "object",
393
+ "additionalProperties": false,
394
+ "properties": {
395
+ "shape": {
396
+ "enum": [
397
+ "gate-pipeline"
398
+ ]
399
+ },
400
+ "stages": {
401
+ "type": "array",
402
+ "maxItems": 12,
403
+ "items": {
404
+ "$ref": "#/$defs/stage"
405
+ }
406
+ },
407
+ "gates": {
408
+ "type": "array",
409
+ "maxItems": 12,
410
+ "items": {
411
+ "$ref": "#/$defs/gate"
412
+ }
413
+ }
414
+ }
415
+ },
416
+ "requires": {
417
+ "type": "object",
418
+ "additionalProperties": false,
419
+ "properties": {
420
+ "skills": {
421
+ "type": "array",
422
+ "maxItems": 16,
423
+ "items": {
424
+ "$ref": "#/$defs/skill"
425
+ }
426
+ },
427
+ "toolPolicies": {
428
+ "type": "array",
429
+ "maxItems": 16,
430
+ "items": {
431
+ "$ref": "#/$defs/id"
432
+ }
433
+ }
434
+ }
435
+ }
436
+ }
437
+ }