aub-workspace 0.3.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 (152) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +23 -0
  3. package/bin/aub-workspace.mjs +246 -0
  4. package/package.json +32 -0
  5. package/vendor/aub/apps/editor/dist/assets/_commonjs-dynamic-modules-TDtrdbi3.js +1 -0
  6. package/vendor/aub/apps/editor/dist/assets/angular-importer.lib-dB_jK4mR.js +32 -0
  7. package/vendor/aub/apps/editor/dist/assets/canvas-tools-CuYC7cA2.js +364 -0
  8. package/vendor/aub/apps/editor/dist/assets/design-bridge.lib-DJvaK6AX.js +1 -0
  9. package/vendor/aub/apps/editor/dist/assets/export-agent-prompt.lib-BsP0KNqo.js +2 -0
  10. package/vendor/aub/apps/editor/dist/assets/export-md.lib-DdmdeWgO.js +3 -0
  11. package/vendor/aub/apps/editor/dist/assets/handoff-package.lib-DDYpcEma.js +20 -0
  12. package/vendor/aub/apps/editor/dist/assets/implementation-report.lib-CmsSB_8s.js +1 -0
  13. package/vendor/aub/apps/editor/dist/assets/index-BCH-ek3h.js +2 -0
  14. package/vendor/aub/apps/editor/dist/assets/index-lAnc928Q.css +1 -0
  15. package/vendor/aub/apps/editor/dist/assets/index-vt1nM1M4.js +507 -0
  16. package/vendor/aub/apps/editor/dist/assets/jszip.min-CRfXyL92.js +12 -0
  17. package/vendor/aub/apps/editor/dist/assets/react-vendor-ByX9Pqse.js +40 -0
  18. package/vendor/aub/apps/editor/dist/brand/android-chrome-192x192.png +0 -0
  19. package/vendor/aub/apps/editor/dist/brand/android-chrome-512x512.png +0 -0
  20. package/vendor/aub/apps/editor/dist/brand/app-icon-1024.png +0 -0
  21. package/vendor/aub/apps/editor/dist/brand/app-icon-192.png +0 -0
  22. package/vendor/aub/apps/editor/dist/brand/app-icon-512.png +0 -0
  23. package/vendor/aub/apps/editor/dist/brand/apple-touch-icon.png +0 -0
  24. package/vendor/aub/apps/editor/dist/brand/aub-logo-mark.svg +28 -0
  25. package/vendor/aub/apps/editor/dist/brand/favicon-16x16.png +0 -0
  26. package/vendor/aub/apps/editor/dist/brand/favicon-32x32.png +0 -0
  27. package/vendor/aub/apps/editor/dist/brand/favicon-48x48.png +0 -0
  28. package/vendor/aub/apps/editor/dist/brand/favicon.ico +0 -0
  29. package/vendor/aub/apps/editor/dist/brand/favicon.svg +9 -0
  30. package/vendor/aub/apps/editor/dist/brand/maskable-icon-512.png +0 -0
  31. package/vendor/aub/apps/editor/dist/brand/mstile-150x150.png +0 -0
  32. package/vendor/aub/apps/editor/dist/brand/safari-pinned-tab.svg +8 -0
  33. package/vendor/aub/apps/editor/dist/browserconfig.xml +9 -0
  34. package/vendor/aub/apps/editor/dist/index.html +22 -0
  35. package/vendor/aub/apps/editor/dist/manifest.webmanifest +28 -0
  36. package/vendor/aub/apps/editor/dist/template-previews/admin-table.png +0 -0
  37. package/vendor/aub/apps/editor/dist/template-previews/booking.png +0 -0
  38. package/vendor/aub/apps/editor/dist/template-previews/calendar.png +0 -0
  39. package/vendor/aub/apps/editor/dist/template-previews/catalog.png +0 -0
  40. package/vendor/aub/apps/editor/dist/template-previews/chat.png +0 -0
  41. package/vendor/aub/apps/editor/dist/template-previews/checkout.png +0 -0
  42. package/vendor/aub/apps/editor/dist/template-previews/crm.png +0 -0
  43. package/vendor/aub/apps/editor/dist/template-previews/dashboard.png +0 -0
  44. package/vendor/aub/apps/editor/dist/template-previews/feed.png +0 -0
  45. package/vendor/aub/apps/editor/dist/template-previews/files.png +0 -0
  46. package/vendor/aub/apps/editor/dist/template-previews/kanban.png +0 -0
  47. package/vendor/aub/apps/editor/dist/template-previews/landing.png +0 -0
  48. package/vendor/aub/apps/editor/dist/template-previews/mail.png +0 -0
  49. package/vendor/aub/apps/editor/dist/template-previews/onboarding.png +0 -0
  50. package/vendor/aub/apps/editor/dist/template-previews/pricing.png +0 -0
  51. package/vendor/aub/apps/editor/dist/template-previews/product-detail.png +0 -0
  52. package/vendor/aub/apps/editor/dist/template-previews/settings.png +0 -0
  53. package/vendor/aub/apps/editor/dist/template-previews/wiki.png +0 -0
  54. package/vendor/aub/apps/mcp-server/dist/aub.js +15 -0
  55. package/vendor/aub/apps/mcp-server/dist/context.js +1 -0
  56. package/vendor/aub/apps/mcp-server/dist/http.js +123 -0
  57. package/vendor/aub/apps/mcp-server/dist/index.js +23 -0
  58. package/vendor/aub/apps/mcp-server/dist/repo.js +17 -0
  59. package/vendor/aub/apps/mcp-server/dist/schema.js +42 -0
  60. package/vendor/aub/apps/mcp-server/dist/server.js +80 -0
  61. package/vendor/aub/apps/mcp-server/dist/tools/approve-component-candidate.js +27 -0
  62. package/vendor/aub/apps/mcp-server/dist/tools/diff-blueprints.js +27 -0
  63. package/vendor/aub/apps/mcp-server/dist/tools/export-handoff.js +87 -0
  64. package/vendor/aub/apps/mcp-server/dist/tools/export-prompt.js +35 -0
  65. package/vendor/aub/apps/mcp-server/dist/tools/export-template-authoring-prompt.js +13 -0
  66. package/vendor/aub/apps/mcp-server/dist/tools/generate-template-from-source.js +25 -0
  67. package/vendor/aub/apps/mcp-server/dist/tools/get-aub-session.js +13 -0
  68. package/vendor/aub/apps/mcp-server/dist/tools/get-blueprint.js +28 -0
  69. package/vendor/aub/apps/mcp-server/dist/tools/get-project.js +45 -0
  70. package/vendor/aub/apps/mcp-server/dist/tools/get-workspace-status.js +10 -0
  71. package/vendor/aub/apps/mcp-server/dist/tools/import-design-bridge.js +62 -0
  72. package/vendor/aub/apps/mcp-server/dist/tools/list-blueprints.js +11 -0
  73. package/vendor/aub/apps/mcp-server/dist/tools/list-projects.js +11 -0
  74. package/vendor/aub/apps/mcp-server/dist/tools/lock-blueprint.js +33 -0
  75. package/vendor/aub/apps/mcp-server/dist/tools/migrate-blueprint.js +38 -0
  76. package/vendor/aub/apps/mcp-server/dist/tools/resolve-component.js +51 -0
  77. package/vendor/aub/apps/mcp-server/dist/tools/scaffold-blueprint.js +53 -0
  78. package/vendor/aub/apps/mcp-server/dist/tools/scan-project-ui.js +18 -0
  79. package/vendor/aub/apps/mcp-server/dist/tools/submit-report.js +48 -0
  80. package/vendor/aub/apps/mcp-server/dist/tools/update-aub-session.js +14 -0
  81. package/vendor/aub/apps/mcp-server/dist/tools/validate-blueprint.js +67 -0
  82. package/vendor/aub/apps/mcp-server/dist/tools/validate-project.js +74 -0
  83. package/vendor/aub/apps/mcp-server/dist/tools/write-blueprint.js +72 -0
  84. package/vendor/aub/apps/mcp-server/dist/workspace.js +138 -0
  85. package/vendor/aub/docs/agent-handoff.md +85 -0
  86. package/vendor/aub/docs/agent-handoff.zh-Hant.md +85 -0
  87. package/vendor/aub/docs/template-authoring-agent.md +86 -0
  88. package/vendor/aub/schema/aub-ci.schema.json +34 -0
  89. package/vendor/aub/schema/aub.registry.schema.json +118 -0
  90. package/vendor/aub/schema/design-bridge.schema.json +44 -0
  91. package/vendor/aub/schema/implementation-report.schema.json +93 -0
  92. package/vendor/aub/schema/project-types.ts +72 -0
  93. package/vendor/aub/schema/registry/components.json +118 -0
  94. package/vendor/aub/schema/types.js +13 -0
  95. package/vendor/aub/schema/types.ts +348 -0
  96. package/vendor/aub/schema/ui-blueprint-lock.schema.json +61 -0
  97. package/vendor/aub/schema/ui-blueprint.schema.json +1339 -0
  98. package/vendor/aub/schema/ui-project.schema.json +139 -0
  99. package/vendor/aub/scripts/agent-implementation-benchmark.lib.mjs +125 -0
  100. package/vendor/aub/scripts/angular-importer.lib.mjs +982 -0
  101. package/vendor/aub/scripts/check-editor-bundle-budget.mjs +36 -0
  102. package/vendor/aub/scripts/ci-verify.lib.mjs +256 -0
  103. package/vendor/aub/scripts/ci-verify.mjs +45 -0
  104. package/vendor/aub/scripts/create-authoring-kit.mjs +84 -0
  105. package/vendor/aub/scripts/create-implementation-report.mjs +24 -0
  106. package/vendor/aub/scripts/design-bridge.lib.d.mts +32 -0
  107. package/vendor/aub/scripts/design-bridge.lib.mjs +69 -0
  108. package/vendor/aub/scripts/diff-blueprint.lib.d.mts +18 -0
  109. package/vendor/aub/scripts/diff-blueprint.lib.mjs +148 -0
  110. package/vendor/aub/scripts/diff-blueprint.mjs +25 -0
  111. package/vendor/aub/scripts/export-agent-prompt.lib.d.mts +10 -0
  112. package/vendor/aub/scripts/export-agent-prompt.lib.mjs +160 -0
  113. package/vendor/aub/scripts/export-agent-prompt.mjs +79 -0
  114. package/vendor/aub/scripts/export-md.lib.d.mts +3 -0
  115. package/vendor/aub/scripts/export-md.lib.mjs +302 -0
  116. package/vendor/aub/scripts/export-md.mjs +43 -0
  117. package/vendor/aub/scripts/generate-registry-artifacts.lib.mjs +118 -0
  118. package/vendor/aub/scripts/generate-registry-artifacts.mjs +65 -0
  119. package/vendor/aub/scripts/generate-site-locales.mjs +545 -0
  120. package/vendor/aub/scripts/handoff-package.lib.d.mts +20 -0
  121. package/vendor/aub/scripts/handoff-package.lib.mjs +111 -0
  122. package/vendor/aub/scripts/implementation-report.lib.d.mts +21 -0
  123. package/vendor/aub/scripts/implementation-report.lib.mjs +97 -0
  124. package/vendor/aub/scripts/import-angular-component.mjs +72 -0
  125. package/vendor/aub/scripts/import-design-bridge.mjs +59 -0
  126. package/vendor/aub/scripts/lock-blueprint.lib.d.mts +23 -0
  127. package/vendor/aub/scripts/lock-blueprint.lib.mjs +58 -0
  128. package/vendor/aub/scripts/lock-blueprint.mjs +36 -0
  129. package/vendor/aub/scripts/migrate-blueprint-cli.mjs +28 -0
  130. package/vendor/aub/scripts/migrate-blueprint.d.mts +5 -0
  131. package/vendor/aub/scripts/migrate-blueprint.mjs +95 -0
  132. package/vendor/aub/scripts/package-workspace-cli.mjs +34 -0
  133. package/vendor/aub/scripts/project.lib.d.mts +44 -0
  134. package/vendor/aub/scripts/project.lib.mjs +175 -0
  135. package/vendor/aub/scripts/project.mjs +332 -0
  136. package/vendor/aub/scripts/registry.lib.d.mts +52 -0
  137. package/vendor/aub/scripts/registry.lib.mjs +222 -0
  138. package/vendor/aub/scripts/run-agent-implementation.mjs +423 -0
  139. package/vendor/aub/scripts/run-agent-readability.mjs +145 -0
  140. package/vendor/aub/scripts/run-ollama-prompt.mjs +30 -0
  141. package/vendor/aub/scripts/scaffold-blueprint.lib.d.mts +38 -0
  142. package/vendor/aub/scripts/scaffold-blueprint.lib.mjs +316 -0
  143. package/vendor/aub/scripts/scaffold-blueprint.mjs +86 -0
  144. package/vendor/aub/scripts/score-agent-implementation.mjs +27 -0
  145. package/vendor/aub/scripts/score-agent-readability.mjs +54 -0
  146. package/vendor/aub/scripts/sync-brand-assets.mjs +33 -0
  147. package/vendor/aub/scripts/validate-blueprint.lib.d.mts +14 -0
  148. package/vendor/aub/scripts/validate-blueprint.lib.mjs +136 -0
  149. package/vendor/aub/scripts/validate.mjs +128 -0
  150. package/vendor/aub/scripts/verify-implementation-report.mjs +36 -0
  151. package/vendor/aub/scripts/workspace-loop.lib.d.mts +17 -0
  152. package/vendor/aub/scripts/workspace-loop.lib.mjs +674 -0
@@ -0,0 +1,1339 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/HenryLau1103/AUB/schema/0.3.0/ui-blueprint.schema.json",
4
+ "title": "UI Blueprint",
5
+ "description": "Structured specification of a UI screen for AI coding agents. Source of truth for layout, semantics, interactions, responsive rules, and acceptance criteria.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "version",
10
+ "screen",
11
+ "viewports",
12
+ "nodes",
13
+ "interactions",
14
+ "responsive",
15
+ "acceptance"
16
+ ],
17
+ "properties": {
18
+ "$schema": {
19
+ "type": "string",
20
+ "description": "Optional path or URL to this JSON Schema. Lets editors (e.g. VS Code) provide validation and autocomplete for standalone .ui.json files. Ignored by AUB tooling."
21
+ },
22
+ "version": {
23
+ "type": "string",
24
+ "description": "Semantic version of the schema this document conforms to.",
25
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
26
+ "enum": [
27
+ "0.1.0",
28
+ "0.2.0",
29
+ "0.3.0"
30
+ ],
31
+ "examples": [
32
+ "0.1.0",
33
+ "0.2.0",
34
+ "0.3.0"
35
+ ]
36
+ },
37
+ "screen": {
38
+ "description": "Metadata about the screen this Blueprint describes.",
39
+ "$ref": "#/$defs/screen"
40
+ },
41
+ "viewports": {
42
+ "type": "array",
43
+ "description": "Named viewport sizes the responsive rules reference. At least one required.",
44
+ "minItems": 1,
45
+ "items": {
46
+ "$ref": "#/$defs/viewport"
47
+ }
48
+ },
49
+ "nodes": {
50
+ "type": "array",
51
+ "description": "Tree of semantic UI nodes composing the screen. The first node MUST be the root.",
52
+ "items": {
53
+ "$ref": "#/$defs/node"
54
+ }
55
+ },
56
+ "interactions": {
57
+ "type": "array",
58
+ "description": "User-driven interactions (click, hover, change, submit).",
59
+ "items": {
60
+ "$ref": "#/$defs/interaction"
61
+ }
62
+ },
63
+ "responsive": {
64
+ "type": "array",
65
+ "description": "Per-viewport rules that override or transform node layout/content.",
66
+ "items": {
67
+ "$ref": "#/$defs/responsive"
68
+ }
69
+ },
70
+ "acceptance": {
71
+ "type": "array",
72
+ "description": "Verifiable acceptance items. MUST be ≥5 per screen, must include layout, interaction, responsive, a11y categories.",
73
+ "minItems": 5,
74
+ "items": {
75
+ "$ref": "#/$defs/acceptance"
76
+ }
77
+ },
78
+ "design_system": {
79
+ "$ref": "#/$defs/designSystem"
80
+ },
81
+ "provenance": {
82
+ "$ref": "#/$defs/provenance"
83
+ }
84
+ },
85
+ "$defs": {
86
+ "screen": {
87
+ "type": "object",
88
+ "additionalProperties": false,
89
+ "required": [
90
+ "id",
91
+ "name",
92
+ "type",
93
+ "platform",
94
+ "primary_user_goal"
95
+ ],
96
+ "properties": {
97
+ "id": {
98
+ "type": "string",
99
+ "description": "Unique screen identifier (kebab or dot notation, e.g. 'dashboard.overview').",
100
+ "pattern": "^[a-z0-9][a-z0-9._-]*$",
101
+ "minLength": 1,
102
+ "maxLength": 128
103
+ },
104
+ "name": {
105
+ "type": "string",
106
+ "description": "Human-readable name shown in editors and exports.",
107
+ "minLength": 1,
108
+ "maxLength": 128
109
+ },
110
+ "type": {
111
+ "$ref": "#/$defs/screenType"
112
+ },
113
+ "platform": {
114
+ "type": "string",
115
+ "enum": [
116
+ "web",
117
+ "mobile-web",
118
+ "ios",
119
+ "android",
120
+ "desktop"
121
+ ],
122
+ "description": "Target platform. Drives default responsive rules and component variant."
123
+ },
124
+ "primary_user_goal": {
125
+ "type": "string",
126
+ "description": "One-sentence description of what the user accomplishes on this screen. Used by agents to prioritize layout decisions.",
127
+ "minLength": 1,
128
+ "maxLength": 280
129
+ },
130
+ "notes": {
131
+ "type": "string",
132
+ "description": "Optional free-form notes for the implementing agent. Avoid putting layout intent here — use nodes and acceptance items."
133
+ }
134
+ }
135
+ },
136
+ "screenType": {
137
+ "type": "string",
138
+ "enum": [
139
+ "dashboard",
140
+ "form",
141
+ "landing",
142
+ "settings",
143
+ "admin_table",
144
+ "detail",
145
+ "auth",
146
+ "error",
147
+ "empty",
148
+ "workspace",
149
+ "communication",
150
+ "content",
151
+ "commerce",
152
+ "calendar",
153
+ "files",
154
+ "onboarding"
155
+ ]
156
+ },
157
+ "viewport": {
158
+ "type": "object",
159
+ "additionalProperties": false,
160
+ "required": [
161
+ "id",
162
+ "width",
163
+ "height"
164
+ ],
165
+ "properties": {
166
+ "id": {
167
+ "type": "string",
168
+ "description": "Viewport identifier used by responsive rules.",
169
+ "enum": [
170
+ "desktop",
171
+ "tablet",
172
+ "mobile",
173
+ "wide"
174
+ ]
175
+ },
176
+ "width": {
177
+ "type": "integer",
178
+ "minimum": 320,
179
+ "maximum": 7680
180
+ },
181
+ "height": {
182
+ "type": "integer",
183
+ "minimum": 320,
184
+ "maximum": 4320
185
+ }
186
+ }
187
+ },
188
+ "node": {
189
+ "type": "object",
190
+ "description": "A single UI element. Tree structure is encoded via parent_id + children.",
191
+ "additionalProperties": false,
192
+ "required": [
193
+ "id",
194
+ "type",
195
+ "name",
196
+ "role"
197
+ ],
198
+ "properties": {
199
+ "id": {
200
+ "type": "string",
201
+ "description": "Globally unique node identifier within this Blueprint.",
202
+ "pattern": "^[a-z0-9][a-z0-9._-]*$",
203
+ "minLength": 1,
204
+ "maxLength": 128
205
+ },
206
+ "type": {
207
+ "$ref": "#/$defs/componentType"
208
+ },
209
+ "name": {
210
+ "type": "string",
211
+ "description": "Display name shown in editor tree.",
212
+ "minLength": 1,
213
+ "maxLength": 128
214
+ },
215
+ "role": {
216
+ "type": "string",
217
+ "description": "Agent-facing role/intent. WHY this node exists, not WHAT it looks like.",
218
+ "minLength": 1,
219
+ "maxLength": 280
220
+ },
221
+ "parent_id": {
222
+ "type": [
223
+ "string",
224
+ "null"
225
+ ],
226
+ "description": "Parent node id. null only for the root node.",
227
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
228
+ },
229
+ "children": {
230
+ "type": "array",
231
+ "description": "Ordered list of child node ids. Container nodes only.",
232
+ "items": {
233
+ "type": "string",
234
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
235
+ }
236
+ },
237
+ "layout": {
238
+ "$ref": "#/$defs/layout"
239
+ },
240
+ "placements": {
241
+ "type": "object",
242
+ "description": "Exact geometry keyed by viewport. Coordinates are relative to the parent content box.",
243
+ "additionalProperties": false,
244
+ "properties": {
245
+ "desktop": {
246
+ "$ref": "#/$defs/placement"
247
+ },
248
+ "tablet": {
249
+ "$ref": "#/$defs/placement"
250
+ },
251
+ "mobile": {
252
+ "$ref": "#/$defs/placement"
253
+ },
254
+ "wide": {
255
+ "$ref": "#/$defs/placement"
256
+ }
257
+ }
258
+ },
259
+ "content": {
260
+ "$ref": "#/$defs/content"
261
+ },
262
+ "style": {
263
+ "$ref": "#/$defs/style"
264
+ },
265
+ "states": {
266
+ "type": "array",
267
+ "description": "Visual/behavioral states this node can be in (e.g. default, hover, disabled, loading).",
268
+ "items": {
269
+ "type": "string",
270
+ "enum": [
271
+ "default",
272
+ "hover",
273
+ "focus",
274
+ "active",
275
+ "disabled",
276
+ "loading",
277
+ "empty",
278
+ "error",
279
+ "selected"
280
+ ]
281
+ },
282
+ "uniqueItems": true
283
+ },
284
+ "constraints": {
285
+ "type": "object",
286
+ "additionalProperties": false,
287
+ "description": "Non-violable constraints the implementation must honor.",
288
+ "properties": {
289
+ "min_width": {
290
+ "type": "integer",
291
+ "minimum": 0
292
+ },
293
+ "max_width": {
294
+ "type": "integer",
295
+ "minimum": 0
296
+ },
297
+ "min_height": {
298
+ "type": "integer",
299
+ "minimum": 0
300
+ },
301
+ "max_height": {
302
+ "type": "integer",
303
+ "minimum": 0
304
+ },
305
+ "touch_target_min": {
306
+ "type": "integer",
307
+ "minimum": 24,
308
+ "description": "Minimum interactive area in pixels (Apple HIG 44, Material 48)."
309
+ }
310
+ }
311
+ },
312
+ "source": {
313
+ "$ref": "#/$defs/sourceReference"
314
+ },
315
+ "bindings": {
316
+ "$ref": "#/$defs/bindings"
317
+ },
318
+ "validation": {
319
+ "$ref": "#/$defs/validation"
320
+ },
321
+ "initial_state": {
322
+ "$ref": "#/$defs/initialState"
323
+ }
324
+ },
325
+ "allOf": [
326
+ {
327
+ "description": "Leaf nodes must not declare children.",
328
+ "if": {
329
+ "properties": {
330
+ "type": {
331
+ "$ref": "#/$defs/coreLeafComponentType"
332
+ }
333
+ },
334
+ "required": [
335
+ "type"
336
+ ]
337
+ },
338
+ "then": {
339
+ "properties": {
340
+ "children": {
341
+ "type": "array",
342
+ "maxItems": 0
343
+ }
344
+ }
345
+ }
346
+ },
347
+ {
348
+ "description": "Container nodes must have at least one child when declared.",
349
+ "if": {
350
+ "properties": {
351
+ "type": {
352
+ "$ref": "#/$defs/coreContainerComponentType"
353
+ }
354
+ },
355
+ "required": [
356
+ "type"
357
+ ]
358
+ },
359
+ "then": {
360
+ "anyOf": [
361
+ {
362
+ "required": [
363
+ "children"
364
+ ]
365
+ },
366
+ {
367
+ "not": {
368
+ "required": [
369
+ "children"
370
+ ]
371
+ }
372
+ }
373
+ ]
374
+ }
375
+ }
376
+ ]
377
+ },
378
+ "componentType": {
379
+ "description": "Registered semantic component type. Agents read this to know WHAT a node is. Either a core type or a namespaced project-extension type declared in aub.registry.json.",
380
+ "anyOf": [
381
+ {
382
+ "$ref": "#/$defs/coreComponentType"
383
+ },
384
+ {
385
+ "$ref": "#/$defs/extensionComponentType"
386
+ }
387
+ ]
388
+ },
389
+ "extensionComponentType": {
390
+ "type": "string",
391
+ "description": "Namespaced custom component type (team:component), declared in a project aub.registry.json and resolved by AUB validation. Lets teams extend the vocabulary without editing the core registry.",
392
+ "pattern": "^[a-z][a-z0-9]*:[a-z][a-z0-9_]*$"
393
+ },
394
+ "coreComponentType": {
395
+ "type": "string",
396
+ "enum": [
397
+ "app_shell",
398
+ "page",
399
+ "section",
400
+ "header",
401
+ "sidebar",
402
+ "top_bar",
403
+ "bottom_nav",
404
+ "stack",
405
+ "grid",
406
+ "split_pane",
407
+ "scroll_area",
408
+ "heading",
409
+ "text",
410
+ "card",
411
+ "image",
412
+ "icon",
413
+ "avatar",
414
+ "badge",
415
+ "tag",
416
+ "divider",
417
+ "link",
418
+ "metric_card",
419
+ "data_table",
420
+ "list",
421
+ "detail_panel",
422
+ "chart_placeholder",
423
+ "timeline",
424
+ "activity_feed",
425
+ "calendar",
426
+ "kanban_board",
427
+ "kanban_column",
428
+ "form",
429
+ "field_group",
430
+ "text_input",
431
+ "select",
432
+ "checkbox",
433
+ "radio_group",
434
+ "toggle",
435
+ "slider",
436
+ "date_picker",
437
+ "file_upload",
438
+ "textarea",
439
+ "search_input",
440
+ "rich_text_editor",
441
+ "button",
442
+ "icon_button",
443
+ "button_group",
444
+ "menu",
445
+ "toolbar",
446
+ "command_palette",
447
+ "modal",
448
+ "drawer",
449
+ "toast",
450
+ "alert",
451
+ "empty_state",
452
+ "loading_state",
453
+ "error_state",
454
+ "tabs",
455
+ "breadcrumb",
456
+ "pagination",
457
+ "stepper",
458
+ "nav_item"
459
+ ],
460
+ "description": "Core (built-in) semantic component types. Generated from schema/registry/components.json — do not edit by hand; run `pnpm gen`."
461
+ },
462
+ "coreContainerComponentType": {
463
+ "type": "string",
464
+ "enum": [
465
+ "app_shell",
466
+ "page",
467
+ "section",
468
+ "header",
469
+ "sidebar",
470
+ "top_bar",
471
+ "bottom_nav",
472
+ "stack",
473
+ "grid",
474
+ "split_pane",
475
+ "scroll_area",
476
+ "card",
477
+ "list",
478
+ "detail_panel",
479
+ "timeline",
480
+ "activity_feed",
481
+ "kanban_board",
482
+ "kanban_column",
483
+ "form",
484
+ "field_group",
485
+ "rich_text_editor",
486
+ "button_group",
487
+ "menu",
488
+ "toolbar",
489
+ "command_palette",
490
+ "modal",
491
+ "drawer",
492
+ "tabs",
493
+ "stepper"
494
+ ],
495
+ "description": "Core component types that may contain children. Generated — run `pnpm gen`."
496
+ },
497
+ "coreLeafComponentType": {
498
+ "type": "string",
499
+ "enum": [
500
+ "heading",
501
+ "text",
502
+ "image",
503
+ "icon",
504
+ "avatar",
505
+ "badge",
506
+ "tag",
507
+ "divider",
508
+ "link",
509
+ "metric_card",
510
+ "data_table",
511
+ "chart_placeholder",
512
+ "calendar",
513
+ "text_input",
514
+ "select",
515
+ "checkbox",
516
+ "radio_group",
517
+ "toggle",
518
+ "slider",
519
+ "date_picker",
520
+ "file_upload",
521
+ "textarea",
522
+ "search_input",
523
+ "button",
524
+ "icon_button",
525
+ "toast",
526
+ "alert",
527
+ "empty_state",
528
+ "loading_state",
529
+ "error_state",
530
+ "breadcrumb",
531
+ "pagination",
532
+ "nav_item"
533
+ ],
534
+ "description": "Core component types that must not contain children. Generated — run `pnpm gen`."
535
+ },
536
+ "layout": {
537
+ "type": "object",
538
+ "description": "Container layout contract. Exact child geometry belongs in node.placements, not here.",
539
+ "additionalProperties": false,
540
+ "properties": {
541
+ "mode": {
542
+ "type": "string",
543
+ "enum": [
544
+ "auto",
545
+ "freeform"
546
+ ],
547
+ "description": "auto uses flex/grid flow; freeform uses child placements for the active viewport."
548
+ },
549
+ "display": {
550
+ "type": "string",
551
+ "enum": [
552
+ "flex",
553
+ "grid",
554
+ "block",
555
+ "inline",
556
+ "none"
557
+ ]
558
+ },
559
+ "direction": {
560
+ "type": "string",
561
+ "enum": [
562
+ "row",
563
+ "column",
564
+ "row-reverse",
565
+ "column-reverse"
566
+ ]
567
+ },
568
+ "wrap": {
569
+ "type": "boolean"
570
+ },
571
+ "grid": {
572
+ "type": "object",
573
+ "additionalProperties": false,
574
+ "properties": {
575
+ "columns": {
576
+ "type": "integer",
577
+ "minimum": 1,
578
+ "maximum": 24,
579
+ "description": "Number of grid columns."
580
+ },
581
+ "rows": {
582
+ "type": "integer",
583
+ "minimum": 1
584
+ },
585
+ "template": {
586
+ "type": "string",
587
+ "description": "Optional explicit CSS grid-template-areas value."
588
+ }
589
+ }
590
+ },
591
+ "align": {
592
+ "type": "string",
593
+ "enum": [
594
+ "start",
595
+ "center",
596
+ "end",
597
+ "stretch",
598
+ "baseline"
599
+ ]
600
+ },
601
+ "justify": {
602
+ "type": "string",
603
+ "enum": [
604
+ "start",
605
+ "center",
606
+ "end",
607
+ "space-between",
608
+ "space-around",
609
+ "space-evenly"
610
+ ]
611
+ },
612
+ "gap": {
613
+ "type": "object",
614
+ "additionalProperties": false,
615
+ "properties": {
616
+ "x": {
617
+ "type": "integer",
618
+ "minimum": 0
619
+ },
620
+ "y": {
621
+ "type": "integer",
622
+ "minimum": 0
623
+ }
624
+ }
625
+ },
626
+ "padding": {
627
+ "type": "object",
628
+ "additionalProperties": false,
629
+ "properties": {
630
+ "top": {
631
+ "type": "integer"
632
+ },
633
+ "right": {
634
+ "type": "integer"
635
+ },
636
+ "bottom": {
637
+ "type": "integer"
638
+ },
639
+ "left": {
640
+ "type": "integer"
641
+ }
642
+ }
643
+ },
644
+ "width": {
645
+ "type": "object",
646
+ "additionalProperties": false,
647
+ "properties": {
648
+ "value": {
649
+ "type": "number",
650
+ "minimum": 0
651
+ },
652
+ "unit": {
653
+ "type": "string",
654
+ "enum": [
655
+ "px",
656
+ "%",
657
+ "rem",
658
+ "vw"
659
+ ]
660
+ }
661
+ }
662
+ },
663
+ "height": {
664
+ "type": "object",
665
+ "additionalProperties": false,
666
+ "properties": {
667
+ "value": {
668
+ "type": "number",
669
+ "minimum": 0
670
+ },
671
+ "unit": {
672
+ "type": "string",
673
+ "enum": [
674
+ "px",
675
+ "%",
676
+ "rem",
677
+ "vh"
678
+ ]
679
+ }
680
+ }
681
+ },
682
+ "min_width": {
683
+ "type": "object",
684
+ "additionalProperties": false,
685
+ "properties": {
686
+ "value": {
687
+ "type": "number",
688
+ "minimum": 0
689
+ },
690
+ "unit": {
691
+ "type": "string",
692
+ "enum": [
693
+ "px",
694
+ "%",
695
+ "rem",
696
+ "vw"
697
+ ]
698
+ }
699
+ }
700
+ },
701
+ "max_width": {
702
+ "type": "object",
703
+ "additionalProperties": false,
704
+ "properties": {
705
+ "value": {
706
+ "type": "number",
707
+ "minimum": 0
708
+ },
709
+ "unit": {
710
+ "type": "string",
711
+ "enum": [
712
+ "px",
713
+ "%",
714
+ "rem",
715
+ "vw"
716
+ ]
717
+ }
718
+ }
719
+ }
720
+ }
721
+ },
722
+ "placement": {
723
+ "type": "object",
724
+ "description": "Pixel geometry relative to the parent content box for one viewport.",
725
+ "additionalProperties": false,
726
+ "required": [
727
+ "x",
728
+ "y",
729
+ "width",
730
+ "height"
731
+ ],
732
+ "properties": {
733
+ "x": {
734
+ "type": "number",
735
+ "minimum": 0
736
+ },
737
+ "y": {
738
+ "type": "number",
739
+ "minimum": 0
740
+ },
741
+ "width": {
742
+ "type": "number",
743
+ "exclusiveMinimum": 0
744
+ },
745
+ "height": {
746
+ "type": "number",
747
+ "exclusiveMinimum": 0
748
+ },
749
+ "z_index": {
750
+ "type": "integer",
751
+ "minimum": -1000,
752
+ "maximum": 1000
753
+ },
754
+ "order": {
755
+ "type": "integer"
756
+ },
757
+ "grow": {
758
+ "type": "number",
759
+ "minimum": 0
760
+ },
761
+ "basis": {
762
+ "type": "number",
763
+ "minimum": 0
764
+ },
765
+ "grid_column": {
766
+ "type": "integer",
767
+ "minimum": 1
768
+ },
769
+ "grid_row": {
770
+ "type": "integer",
771
+ "minimum": 1
772
+ },
773
+ "column_span": {
774
+ "type": "integer",
775
+ "minimum": 1,
776
+ "maximum": 24
777
+ },
778
+ "row_span": {
779
+ "type": "integer",
780
+ "minimum": 1,
781
+ "maximum": 24
782
+ }
783
+ }
784
+ },
785
+ "content": {
786
+ "type": "object",
787
+ "description": "Component-specific content. Required fields depend on node.type — see if/then rules below.",
788
+ "additionalProperties": false,
789
+ "properties": {
790
+ "text": {
791
+ "type": "string",
792
+ "description": "Visible text content (label, button caption, heading)."
793
+ },
794
+ "placeholder": {
795
+ "type": "string",
796
+ "description": "Placeholder text for inputs."
797
+ },
798
+ "data_binding": {
799
+ "type": "string",
800
+ "description": "Symbolic reference to a data source, e.g. 'metrics.revenue.current'."
801
+ },
802
+ "columns": {
803
+ "type": "array",
804
+ "description": "Table column definitions.",
805
+ "items": {
806
+ "$ref": "#/$defs/tableColumn"
807
+ },
808
+ "minItems": 1
809
+ },
810
+ "items": {
811
+ "type": "array",
812
+ "description": "List/menu items (when not data-driven).",
813
+ "items": {
814
+ "$ref": "#/$defs/listItem"
815
+ }
816
+ },
817
+ "action": {
818
+ "type": "string",
819
+ "description": "Symbolic action intent, e.g. 'submit', 'navigate:/settings', 'open:detail_panel'."
820
+ },
821
+ "label": {
822
+ "type": "string",
823
+ "description": "Accessible label for form inputs and icon buttons."
824
+ },
825
+ "empty_state": {
826
+ "type": "string",
827
+ "description": "Symbolic id of an empty_state node to render when collection is empty."
828
+ },
829
+ "loading_state": {
830
+ "type": "string",
831
+ "description": "Symbolic id of a loading_state node to render while data loads."
832
+ },
833
+ "error_state": {
834
+ "type": "string",
835
+ "description": "Symbolic id of an error_state node to render on fetch failure."
836
+ },
837
+ "src": {
838
+ "type": "string",
839
+ "description": "Image or media source URL."
840
+ },
841
+ "alt": {
842
+ "type": "string",
843
+ "description": "Alternative text for visual media."
844
+ },
845
+ "icon": {
846
+ "type": "string",
847
+ "description": "Symbolic icon name."
848
+ },
849
+ "value": {
850
+ "type": "string",
851
+ "description": "Representative value shown by the component."
852
+ },
853
+ "helper_text": {
854
+ "type": "string",
855
+ "description": "Supporting or validation text."
856
+ },
857
+ "variant": {
858
+ "type": "string",
859
+ "description": "Semantic component variant such as primary, subtle, or destructive."
860
+ }
861
+ }
862
+ },
863
+ "tableColumn": {
864
+ "type": "object",
865
+ "additionalProperties": false,
866
+ "required": [
867
+ "id",
868
+ "header"
869
+ ],
870
+ "properties": {
871
+ "id": {
872
+ "type": "string",
873
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
874
+ },
875
+ "header": {
876
+ "type": "string",
877
+ "minLength": 1
878
+ },
879
+ "data_binding": {
880
+ "type": "string"
881
+ },
882
+ "sortable": {
883
+ "type": "boolean"
884
+ },
885
+ "filterable": {
886
+ "type": "boolean"
887
+ },
888
+ "cell_kind": {
889
+ "type": "string",
890
+ "enum": [
891
+ "text",
892
+ "number",
893
+ "date",
894
+ "link",
895
+ "icon",
896
+ "action",
897
+ "status",
898
+ "checkbox"
899
+ ]
900
+ },
901
+ "icon": {
902
+ "type": "string"
903
+ },
904
+ "action": {
905
+ "type": "string"
906
+ },
907
+ "sticky": {
908
+ "type": "boolean"
909
+ },
910
+ "align": {
911
+ "type": "string",
912
+ "enum": [
913
+ "start",
914
+ "center",
915
+ "end"
916
+ ]
917
+ },
918
+ "visible_when": {
919
+ "type": "string"
920
+ },
921
+ "width": {
922
+ "type": "object",
923
+ "additionalProperties": false,
924
+ "properties": {
925
+ "value": {
926
+ "type": "number",
927
+ "minimum": 0
928
+ },
929
+ "unit": {
930
+ "type": "string",
931
+ "enum": [
932
+ "px",
933
+ "%",
934
+ "rem"
935
+ ]
936
+ }
937
+ }
938
+ }
939
+ }
940
+ },
941
+ "listItem": {
942
+ "type": "object",
943
+ "additionalProperties": false,
944
+ "required": [
945
+ "id"
946
+ ],
947
+ "properties": {
948
+ "id": {
949
+ "type": "string",
950
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
951
+ },
952
+ "label": {
953
+ "type": "string"
954
+ },
955
+ "icon": {
956
+ "type": "string"
957
+ },
958
+ "action": {
959
+ "type": "string"
960
+ }
961
+ }
962
+ },
963
+ "style": {
964
+ "type": "object",
965
+ "description": "Design tokens and visual constraints. Use token names, not raw values.",
966
+ "additionalProperties": false,
967
+ "properties": {
968
+ "tokens": {
969
+ "type": "object",
970
+ "description": "Design tokens applied to this node (color.surface.primary, typography.heading.h2, etc).",
971
+ "additionalProperties": {
972
+ "type": "string"
973
+ }
974
+ },
975
+ "elevation": {
976
+ "type": "integer",
977
+ "minimum": 0,
978
+ "maximum": 24
979
+ },
980
+ "background": {
981
+ "type": "string"
982
+ },
983
+ "foreground": {
984
+ "type": "string"
985
+ },
986
+ "border": {
987
+ "type": "string"
988
+ },
989
+ "typography": {
990
+ "type": "string"
991
+ },
992
+ "radius": {
993
+ "type": "string"
994
+ },
995
+ "shadow": {
996
+ "type": "string"
997
+ },
998
+ "opacity": {
999
+ "type": "number",
1000
+ "minimum": 0,
1001
+ "maximum": 1
1002
+ },
1003
+ "variant": {
1004
+ "type": "string"
1005
+ }
1006
+ }
1007
+ },
1008
+ "provenance": {
1009
+ "type": "object",
1010
+ "additionalProperties": false,
1011
+ "required": [
1012
+ "source_kind",
1013
+ "importer_version",
1014
+ "source_files"
1015
+ ],
1016
+ "properties": {
1017
+ "source_kind": {
1018
+ "type": "string",
1019
+ "enum": [
1020
+ "native",
1021
+ "angular-component",
1022
+ "html",
1023
+ "figma",
1024
+ "penpot",
1025
+ "image",
1026
+ "other"
1027
+ ]
1028
+ },
1029
+ "framework": {
1030
+ "type": "string"
1031
+ },
1032
+ "importer_version": {
1033
+ "type": "string"
1034
+ },
1035
+ "entry_file": {
1036
+ "type": "string"
1037
+ },
1038
+ "source_files": {
1039
+ "type": "array",
1040
+ "items": {
1041
+ "type": "string"
1042
+ },
1043
+ "uniqueItems": true
1044
+ }
1045
+ }
1046
+ },
1047
+ "sourceReference": {
1048
+ "type": "object",
1049
+ "additionalProperties": false,
1050
+ "required": [
1051
+ "file"
1052
+ ],
1053
+ "properties": {
1054
+ "file": {
1055
+ "type": "string"
1056
+ },
1057
+ "line": {
1058
+ "type": "integer",
1059
+ "minimum": 1
1060
+ },
1061
+ "column": {
1062
+ "type": "integer",
1063
+ "minimum": 1
1064
+ },
1065
+ "selector": {
1066
+ "type": "string"
1067
+ }
1068
+ }
1069
+ },
1070
+ "bindings": {
1071
+ "type": "object",
1072
+ "additionalProperties": false,
1073
+ "properties": {
1074
+ "value": {
1075
+ "type": "string"
1076
+ },
1077
+ "options": {
1078
+ "type": "string"
1079
+ },
1080
+ "visibility": {
1081
+ "type": "string"
1082
+ },
1083
+ "enabled": {
1084
+ "type": "string"
1085
+ },
1086
+ "repeat": {
1087
+ "type": "string"
1088
+ },
1089
+ "selected": {
1090
+ "type": "string"
1091
+ }
1092
+ }
1093
+ },
1094
+ "validation": {
1095
+ "type": "object",
1096
+ "additionalProperties": false,
1097
+ "properties": {
1098
+ "required": {
1099
+ "type": "boolean"
1100
+ },
1101
+ "pattern": {
1102
+ "type": "string"
1103
+ },
1104
+ "min_length": {
1105
+ "type": "number",
1106
+ "minimum": 0
1107
+ },
1108
+ "max_length": {
1109
+ "type": "number",
1110
+ "minimum": 0
1111
+ },
1112
+ "min": {
1113
+ "type": "number"
1114
+ },
1115
+ "max": {
1116
+ "type": "number"
1117
+ }
1118
+ }
1119
+ },
1120
+ "initialState": {
1121
+ "type": "object",
1122
+ "additionalProperties": false,
1123
+ "properties": {
1124
+ "visibility": {
1125
+ "type": "string",
1126
+ "enum": [
1127
+ "visible",
1128
+ "hidden"
1129
+ ]
1130
+ },
1131
+ "expanded": {
1132
+ "type": "boolean"
1133
+ },
1134
+ "selected": {
1135
+ "type": "boolean"
1136
+ }
1137
+ }
1138
+ },
1139
+ "designSystem": {
1140
+ "type": "object",
1141
+ "description": "Named design tokens shared by all nodes in a Blueprint.",
1142
+ "additionalProperties": false,
1143
+ "required": [
1144
+ "name"
1145
+ ],
1146
+ "properties": {
1147
+ "name": {
1148
+ "type": "string",
1149
+ "minLength": 1,
1150
+ "maxLength": 128
1151
+ },
1152
+ "colors": {
1153
+ "$ref": "#/$defs/tokenMap"
1154
+ },
1155
+ "typography": {
1156
+ "$ref": "#/$defs/tokenMap"
1157
+ },
1158
+ "spacing": {
1159
+ "$ref": "#/$defs/tokenMap"
1160
+ },
1161
+ "radii": {
1162
+ "$ref": "#/$defs/tokenMap"
1163
+ },
1164
+ "shadows": {
1165
+ "$ref": "#/$defs/tokenMap"
1166
+ }
1167
+ }
1168
+ },
1169
+ "tokenMap": {
1170
+ "type": "object",
1171
+ "additionalProperties": {
1172
+ "type": "string"
1173
+ }
1174
+ },
1175
+ "interaction": {
1176
+ "type": "object",
1177
+ "additionalProperties": false,
1178
+ "required": [
1179
+ "id",
1180
+ "trigger",
1181
+ "source_node_id",
1182
+ "action",
1183
+ "result_state"
1184
+ ],
1185
+ "properties": {
1186
+ "id": {
1187
+ "type": "string",
1188
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
1189
+ },
1190
+ "trigger": {
1191
+ "type": "string",
1192
+ "enum": [
1193
+ "click",
1194
+ "double_click",
1195
+ "hover",
1196
+ "focus",
1197
+ "blur",
1198
+ "change",
1199
+ "submit",
1200
+ "key_enter",
1201
+ "key_escape",
1202
+ "swipe_left",
1203
+ "swipe_right",
1204
+ "load",
1205
+ "scroll"
1206
+ ]
1207
+ },
1208
+ "source_node_id": {
1209
+ "type": "string",
1210
+ "description": "Node id that emits the trigger.",
1211
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
1212
+ },
1213
+ "action": {
1214
+ "type": "string",
1215
+ "description": "Action intent. Use verb-noun form: 'navigate:/foo', 'open:bar', 'submit:form_x'."
1216
+ },
1217
+ "target": {
1218
+ "type": "string",
1219
+ "description": "Optional target node id or route.",
1220
+ "pattern": "^[a-z0-9./:_\\-]*$"
1221
+ },
1222
+ "result_state": {
1223
+ "type": "string",
1224
+ "description": "What changes as a result. Must be observable and verifiable, not 'looks nice'."
1225
+ }
1226
+ }
1227
+ },
1228
+ "responsive": {
1229
+ "type": "object",
1230
+ "additionalProperties": false,
1231
+ "required": [
1232
+ "viewport",
1233
+ "rule",
1234
+ "target_node_id",
1235
+ "changes"
1236
+ ],
1237
+ "properties": {
1238
+ "viewport": {
1239
+ "type": "string",
1240
+ "enum": [
1241
+ "desktop",
1242
+ "tablet",
1243
+ "mobile",
1244
+ "wide"
1245
+ ]
1246
+ },
1247
+ "rule": {
1248
+ "type": "string",
1249
+ "enum": [
1250
+ "keep",
1251
+ "hide",
1252
+ "drawer",
1253
+ "bottom_nav",
1254
+ "stack",
1255
+ "scroll",
1256
+ "card_list",
1257
+ "col_reduce",
1258
+ "collapse",
1259
+ "expand",
1260
+ "icon_only",
1261
+ "label_only"
1262
+ ]
1263
+ },
1264
+ "target_node_id": {
1265
+ "type": "string",
1266
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
1267
+ },
1268
+ "changes": {
1269
+ "type": "object",
1270
+ "description": "Specific property overrides. Empty object means no change beyond the rule.",
1271
+ "additionalProperties": true
1272
+ }
1273
+ }
1274
+ },
1275
+ "acceptance": {
1276
+ "type": "object",
1277
+ "additionalProperties": false,
1278
+ "required": [
1279
+ "id",
1280
+ "type",
1281
+ "statement",
1282
+ "target",
1283
+ "priority",
1284
+ "verification_method"
1285
+ ],
1286
+ "properties": {
1287
+ "id": {
1288
+ "type": "string",
1289
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
1290
+ },
1291
+ "type": {
1292
+ "type": "string",
1293
+ "enum": [
1294
+ "layout",
1295
+ "interaction",
1296
+ "responsive",
1297
+ "a11y",
1298
+ "content",
1299
+ "performance"
1300
+ ],
1301
+ "description": "Acceptance category. Every screen must include at least one of: layout, interaction, responsive, a11y."
1302
+ },
1303
+ "statement": {
1304
+ "type": "string",
1305
+ "description": "Verifiable assertion. Must be testable, not subjective.",
1306
+ "minLength": 1,
1307
+ "maxLength": 280
1308
+ },
1309
+ "target": {
1310
+ "type": "string",
1311
+ "description": "Node id, viewport id, or selector pattern this acceptance applies to. Comma-separated lists are allowed for multi-target acceptance.",
1312
+ "pattern": "^[A-Za-z0-9.#*\\[\\] ,|>_\\-=()\"']*$"
1313
+ },
1314
+ "priority": {
1315
+ "type": "string",
1316
+ "enum": [
1317
+ "blocker",
1318
+ "must",
1319
+ "should",
1320
+ "nice"
1321
+ ]
1322
+ },
1323
+ "verification_method": {
1324
+ "type": "string",
1325
+ "enum": [
1326
+ "manual_visual",
1327
+ "manual_ia_review",
1328
+ "dom_query",
1329
+ "computed_style",
1330
+ "axe_audit",
1331
+ "screenshot_diff",
1332
+ "interaction_replay",
1333
+ "code_diff"
1334
+ ]
1335
+ }
1336
+ }
1337
+ }
1338
+ }
1339
+ }