executable-stories-formatters 0.17.0 → 1.0.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.
Files changed (61) hide show
  1. package/README.md +6 -4
  2. package/dist/adapters.cjs.map +1 -1
  3. package/dist/adapters.d.cts +183 -1
  4. package/dist/adapters.d.ts +183 -1
  5. package/dist/adapters.js.map +1 -1
  6. package/dist/cli.js +2525 -16783
  7. package/dist/cli.js.map +1 -1
  8. package/dist/index.cjs +2336 -15957
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +117 -1259
  11. package/dist/index.d.ts +117 -1259
  12. package/dist/index.js +2335 -15950
  13. package/dist/index.js.map +1 -1
  14. package/package.json +15 -11
  15. package/schemas/README.md +0 -1
  16. package/templates/astro-thin/astro.config.mjs +62 -0
  17. package/templates/astro-thin/executable-stories.config.mjs +47 -0
  18. package/templates/astro-thin/gitignore +3 -0
  19. package/templates/astro-thin/package.json +20 -0
  20. package/templates/astro-thin/reports/sample-run.json +133 -0
  21. package/templates/astro-thin/src/content/docs/404.md +20 -0
  22. package/templates/astro-thin/src/content/docs/guides/writing-docs.mdx +7 -0
  23. package/templates/astro-thin/src/content/docs/index.mdx +44 -0
  24. package/templates/astro-thin/src/content.config.ts +26 -0
  25. package/templates/astro-thin/src/styles/stories.css +32 -0
  26. package/templates/astro-thin/tsconfig.json +5 -0
  27. package/dist/index-CXrzCk9p.d.cts +0 -628
  28. package/dist/index-CXrzCk9p.d.ts +0 -628
  29. package/schemas/story-report-v1.json +0 -456
  30. package/templates/astro-starlight/astro.config.mjs +0 -57
  31. package/templates/astro-starlight/gitignore +0 -14
  32. package/templates/astro-starlight/package.json +0 -20
  33. package/templates/astro-starlight/public/stories/assets/.gitkeep +0 -0
  34. package/templates/astro-starlight/public/stories/notes-index.json +0 -4
  35. package/templates/astro-starlight/public/stories/story-report.json +0 -17
  36. package/templates/astro-starlight/src/components/ApiOperations.astro +0 -366
  37. package/templates/astro-starlight/src/components/Checklist.astro +0 -15
  38. package/templates/astro-starlight/src/components/HealthDashboard.astro +0 -171
  39. package/templates/astro-starlight/src/components/PageTitle.astro +0 -53
  40. package/templates/astro-starlight/src/components/VerifiedBy.astro +0 -281
  41. package/templates/astro-starlight/src/components/VerifiedStep.astro +0 -91
  42. package/templates/astro-starlight/src/content/docs/examples/example-adr.mdx +0 -45
  43. package/templates/astro-starlight/src/content/docs/guides/behavior-portal.mdx +0 -41
  44. package/templates/astro-starlight/src/content/docs/guides/writing-docs.mdx +0 -49
  45. package/templates/astro-starlight/src/content/docs/index.mdx +0 -49
  46. package/templates/astro-starlight/src/content/docs/stories/.gitkeep +0 -0
  47. package/templates/astro-starlight/src/content.config.ts +0 -18
  48. package/templates/astro-starlight/src/lib/config.ts +0 -50
  49. package/templates/astro-starlight/src/lib/render-doc-entry.ts +0 -154
  50. package/templates/astro-starlight/src/lib/report-health.ts +0 -61
  51. package/templates/astro-starlight/src/lib/verification.ts +0 -247
  52. package/templates/astro-starlight/src/pages/explorer/explorer.css +0 -729
  53. package/templates/astro-starlight/src/pages/explorer/index.astro +0 -404
  54. package/templates/astro-starlight/src/styles/global.css +0 -293
  55. package/templates/astro-starlight/src/styles/themes/corporate.css +0 -83
  56. package/templates/astro-starlight/src/styles/themes/dashboard.css +0 -76
  57. package/templates/astro-starlight/src/styles/themes/default.css +0 -86
  58. package/templates/astro-starlight/src/styles/themes/minimal.css +0 -87
  59. package/templates/astro-starlight/src/styles/themes/playful.css +0 -77
  60. package/templates/astro-starlight/src/styles/themes/terminal.css +0 -77
  61. package/templates/astro-starlight/tsconfig.json +0 -13
@@ -1,456 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://executable-stories.dev/schemas/story-report-v1.schema.json",
4
- "title": "StoryReport",
5
- "description": "Pre-grouped, denormalized report shape consumed by UI renderers (React, Svelte, Vue, etc.). Stable public contract — additive-only within a major. Distinct from internal TestRunResult.",
6
- "type": "object",
7
- "$ref": "#/$defs/StoryReport",
8
- "$defs": {
9
- "StoryReport": {
10
- "type": "object",
11
- "description": "Top-level report containing all features, runtime metadata, and a pre-computed summary.",
12
- "properties": {
13
- "schemaVersion": {
14
- "type": "string",
15
- "pattern": "^1\\.[0-9]+$",
16
- "description": "Schema version as 'major.minor'. Major bumps are breaking; minors are additive-only. UI packages must accept any 1.x."
17
- },
18
- "runId": {
19
- "type": "string",
20
- "minLength": 1,
21
- "description": "Unique deterministic identifier for this run."
22
- },
23
- "startedAtMs": {
24
- "type": "number",
25
- "minimum": 0,
26
- "description": "Run start time as Unix epoch milliseconds."
27
- },
28
- "finishedAtMs": {
29
- "type": "number",
30
- "minimum": 0,
31
- "description": "Run finish time as Unix epoch milliseconds."
32
- },
33
- "durationMs": {
34
- "type": "number",
35
- "minimum": 0,
36
- "description": "Total run duration in milliseconds."
37
- },
38
- "projectRoot": {
39
- "type": "string",
40
- "minLength": 1,
41
- "description": "Absolute path to the project root (for context only; relative paths in features.sourceFile are preferred)."
42
- },
43
- "packageVersion": {
44
- "type": "string",
45
- "description": "Version of the package under test, if known."
46
- },
47
- "gitSha": {
48
- "type": "string",
49
- "description": "Git commit SHA at the time of the run."
50
- },
51
- "ci": {
52
- "$ref": "#/$defs/CIInfo"
53
- },
54
- "coverage": {
55
- "$ref": "#/$defs/CoverageSummary"
56
- },
57
- "summary": {
58
- "$ref": "#/$defs/Summary",
59
- "description": "Pre-computed counts across all features and scenarios."
60
- },
61
- "features": {
62
- "type": "array",
63
- "items": { "$ref": "#/$defs/Feature" },
64
- "description": "Features grouped by sourceFile, sorted by title."
65
- }
66
- },
67
- "required": ["schemaVersion", "runId", "startedAtMs", "finishedAtMs", "durationMs", "projectRoot", "summary", "features"],
68
- "additionalProperties": false
69
- },
70
- "Summary": {
71
- "type": "object",
72
- "description": "Counts by status. Sums equal 'total'.",
73
- "properties": {
74
- "total": { "type": "integer", "minimum": 0 },
75
- "passed": { "type": "integer", "minimum": 0 },
76
- "failed": { "type": "integer", "minimum": 0 },
77
- "skipped": { "type": "integer", "minimum": 0 },
78
- "pending": { "type": "integer", "minimum": 0 },
79
- "durationMs": { "type": "number", "minimum": 0 }
80
- },
81
- "required": ["total", "passed", "failed", "skipped", "pending", "durationMs"],
82
- "additionalProperties": false
83
- },
84
- "Feature": {
85
- "type": "object",
86
- "description": "A group of scenarios from the same source file.",
87
- "properties": {
88
- "id": {
89
- "type": "string",
90
- "minLength": 1,
91
- "description": "Stable slug derived from the relative source path. Suitable for use as a deep-link anchor."
92
- },
93
- "title": {
94
- "type": "string",
95
- "minLength": 1,
96
- "description": "Display title. Derived from describe block when present, otherwise the file basename."
97
- },
98
- "sourceFile": {
99
- "type": "string",
100
- "minLength": 1,
101
- "description": "Source path, relative to projectRoot when possible."
102
- },
103
- "summary": { "$ref": "#/$defs/Summary" },
104
- "scenarios": {
105
- "type": "array",
106
- "items": { "$ref": "#/$defs/Scenario" },
107
- "description": "Scenarios in this feature, in declaration order."
108
- }
109
- },
110
- "required": ["id", "title", "sourceFile", "summary", "scenarios"],
111
- "additionalProperties": false
112
- },
113
- "Scenario": {
114
- "type": "object",
115
- "description": "A single scenario with its steps, story-level doc entries, and attachments.",
116
- "properties": {
117
- "id": {
118
- "type": "string",
119
- "minLength": 1,
120
- "description": "Stable identifier: '<feature.id>--<slug-of-title>'. Suitable for use as a deep-link anchor."
121
- },
122
- "title": { "type": "string", "minLength": 1 },
123
- "status": { "$ref": "#/$defs/TestStatus" },
124
- "durationMs": { "type": "number", "minimum": 0 },
125
- "tags": {
126
- "type": "array",
127
- "items": { "type": "string" },
128
- "description": "Normalized tags, deduplicated, lowercased."
129
- },
130
- "tickets": {
131
- "type": "array",
132
- "items": { "$ref": "#/$defs/Ticket" }
133
- },
134
- "covers": {
135
- "type": "array",
136
- "items": { "type": "string" },
137
- "description": "Product-code paths/globs this scenario exercises."
138
- },
139
- "sourceLine": { "type": "integer", "minimum": 1 },
140
- "errorMessage": { "type": "string" },
141
- "errorStack": { "type": "string" },
142
- "retry": { "type": "integer", "minimum": 0 },
143
- "retries": { "type": "integer", "minimum": 0 },
144
- "docEntries": {
145
- "type": "array",
146
- "items": { "$ref": "#/$defs/DocEntry" },
147
- "description": "Story-level doc entries (rendered before steps)."
148
- },
149
- "steps": {
150
- "type": "array",
151
- "items": { "$ref": "#/$defs/Step" }
152
- },
153
- "attachments": {
154
- "type": "array",
155
- "items": { "$ref": "#/$defs/Attachment" }
156
- }
157
- },
158
- "required": ["id", "title", "status", "durationMs", "tags", "retry", "retries", "docEntries", "steps", "attachments"],
159
- "additionalProperties": false
160
- },
161
- "Step": {
162
- "type": "object",
163
- "description": "A single BDD step.",
164
- "properties": {
165
- "id": { "type": "string", "minLength": 1 },
166
- "index": { "type": "integer", "minimum": 0 },
167
- "keyword": { "$ref": "#/$defs/StepKeyword" },
168
- "text": { "type": "string" },
169
- "status": { "$ref": "#/$defs/TestStatus" },
170
- "durationMs": { "type": "number", "minimum": 0 },
171
- "errorMessage": { "type": "string" },
172
- "mode": { "$ref": "#/$defs/StepMode" },
173
- "docEntries": {
174
- "type": "array",
175
- "items": { "$ref": "#/$defs/DocEntry" },
176
- "description": "Doc entries attached to this step."
177
- }
178
- },
179
- "required": ["id", "index", "keyword", "text", "status", "durationMs", "docEntries"],
180
- "additionalProperties": false
181
- },
182
- "StepKeyword": {
183
- "type": "string",
184
- "enum": ["Given", "When", "Then", "And", "But"]
185
- },
186
- "StepMode": {
187
- "type": "string",
188
- "enum": ["normal", "skip", "only", "todo", "fails", "concurrent"]
189
- },
190
- "TestStatus": {
191
- "type": "string",
192
- "enum": ["passed", "failed", "skipped", "pending"]
193
- },
194
- "Ticket": {
195
- "type": "object",
196
- "properties": {
197
- "id": { "type": "string", "minLength": 1 },
198
- "url": { "type": "string" }
199
- },
200
- "required": ["id"],
201
- "additionalProperties": false
202
- },
203
- "Attachment": {
204
- "type": "object",
205
- "properties": {
206
- "name": { "type": "string" },
207
- "mediaType": { "type": "string", "minLength": 1 },
208
- "body": { "type": "string" },
209
- "contentEncoding": {
210
- "type": "string",
211
- "enum": ["BASE64", "IDENTITY"]
212
- }
213
- },
214
- "required": ["name", "mediaType", "body", "contentEncoding"],
215
- "additionalProperties": false
216
- },
217
- "CIInfo": {
218
- "type": "object",
219
- "properties": {
220
- "name": { "type": "string" },
221
- "url": { "type": "string" },
222
- "buildNumber": { "type": "string" },
223
- "branch": { "type": "string" },
224
- "commitSha": { "type": "string" },
225
- "prNumber": { "type": "string" }
226
- },
227
- "required": ["name"],
228
- "additionalProperties": false
229
- },
230
- "CoverageSummary": {
231
- "type": "object",
232
- "properties": {
233
- "linesPct": { "type": "number", "minimum": 0, "maximum": 100 },
234
- "branchesPct": { "type": "number", "minimum": 0, "maximum": 100 },
235
- "functionsPct": { "type": "number", "minimum": 0, "maximum": 100 },
236
- "statementsPct": { "type": "number", "minimum": 0, "maximum": 100 }
237
- },
238
- "additionalProperties": false
239
- },
240
- "DocPhase": {
241
- "type": "string",
242
- "enum": ["static", "runtime"]
243
- },
244
- "DocEntry": {
245
- "oneOf": [
246
- { "$ref": "#/$defs/DocNote" },
247
- { "$ref": "#/$defs/DocTag" },
248
- { "$ref": "#/$defs/DocKv" },
249
- { "$ref": "#/$defs/DocCode" },
250
- { "$ref": "#/$defs/DocTable" },
251
- { "$ref": "#/$defs/DocLink" },
252
- { "$ref": "#/$defs/DocSection" },
253
- { "$ref": "#/$defs/DocMermaid" },
254
- { "$ref": "#/$defs/DocScreenshot" },
255
- { "$ref": "#/$defs/DocVideo" },
256
- { "$ref": "#/$defs/DocHtml" },
257
- { "$ref": "#/$defs/DocCustom" }
258
- ]
259
- },
260
- "DocNote": {
261
- "type": "object",
262
- "properties": {
263
- "kind": { "const": "note" },
264
- "text": { "type": "string" },
265
- "phase": { "$ref": "#/$defs/DocPhase" },
266
- "children": {
267
- "type": "array",
268
- "items": { "$ref": "#/$defs/DocEntry" }
269
- }
270
- },
271
- "required": ["kind", "text", "phase"],
272
- "additionalProperties": false
273
- },
274
- "DocTag": {
275
- "type": "object",
276
- "properties": {
277
- "kind": { "const": "tag" },
278
- "names": { "type": "array", "items": { "type": "string" } },
279
- "phase": { "$ref": "#/$defs/DocPhase" },
280
- "children": {
281
- "type": "array",
282
- "items": { "$ref": "#/$defs/DocEntry" }
283
- }
284
- },
285
- "required": ["kind", "names", "phase"],
286
- "additionalProperties": false
287
- },
288
- "DocKv": {
289
- "type": "object",
290
- "properties": {
291
- "kind": { "const": "kv" },
292
- "label": { "type": "string" },
293
- "value": {},
294
- "phase": { "$ref": "#/$defs/DocPhase" },
295
- "children": {
296
- "type": "array",
297
- "items": { "$ref": "#/$defs/DocEntry" }
298
- }
299
- },
300
- "required": ["kind", "label", "value", "phase"],
301
- "additionalProperties": false
302
- },
303
- "DocCode": {
304
- "type": "object",
305
- "properties": {
306
- "kind": { "const": "code" },
307
- "label": { "type": "string" },
308
- "content": { "type": "string" },
309
- "lang": { "type": "string" },
310
- "phase": { "$ref": "#/$defs/DocPhase" },
311
- "children": {
312
- "type": "array",
313
- "items": { "$ref": "#/$defs/DocEntry" }
314
- }
315
- },
316
- "required": ["kind", "label", "content", "phase"],
317
- "additionalProperties": false
318
- },
319
- "DocTable": {
320
- "type": "object",
321
- "properties": {
322
- "kind": { "const": "table" },
323
- "label": { "type": "string" },
324
- "columns": { "type": "array", "items": { "type": "string" } },
325
- "rows": {
326
- "type": "array",
327
- "items": {
328
- "type": "array",
329
- "items": { "type": "string" }
330
- }
331
- },
332
- "phase": { "$ref": "#/$defs/DocPhase" },
333
- "children": {
334
- "type": "array",
335
- "items": { "$ref": "#/$defs/DocEntry" }
336
- }
337
- },
338
- "required": ["kind", "label", "columns", "rows", "phase"],
339
- "additionalProperties": false
340
- },
341
- "DocLink": {
342
- "type": "object",
343
- "properties": {
344
- "kind": { "const": "link" },
345
- "label": { "type": "string" },
346
- "url": { "type": "string" },
347
- "phase": { "$ref": "#/$defs/DocPhase" },
348
- "children": {
349
- "type": "array",
350
- "items": { "$ref": "#/$defs/DocEntry" }
351
- }
352
- },
353
- "required": ["kind", "label", "url", "phase"],
354
- "additionalProperties": false
355
- },
356
- "DocSection": {
357
- "type": "object",
358
- "properties": {
359
- "kind": { "const": "section" },
360
- "title": { "type": "string" },
361
- "markdown": { "type": "string" },
362
- "phase": { "$ref": "#/$defs/DocPhase" },
363
- "children": {
364
- "type": "array",
365
- "items": { "$ref": "#/$defs/DocEntry" }
366
- }
367
- },
368
- "required": ["kind", "title", "markdown", "phase"],
369
- "additionalProperties": false
370
- },
371
- "DocMermaid": {
372
- "type": "object",
373
- "properties": {
374
- "kind": { "const": "mermaid" },
375
- "code": { "type": "string" },
376
- "title": { "type": "string" },
377
- "phase": { "$ref": "#/$defs/DocPhase" },
378
- "children": {
379
- "type": "array",
380
- "items": { "$ref": "#/$defs/DocEntry" }
381
- }
382
- },
383
- "required": ["kind", "code", "phase"],
384
- "additionalProperties": false
385
- },
386
- "DocScreenshot": {
387
- "type": "object",
388
- "properties": {
389
- "kind": { "const": "screenshot" },
390
- "path": { "type": "string" },
391
- "alt": { "type": "string" },
392
- "phase": { "$ref": "#/$defs/DocPhase" },
393
- "children": {
394
- "type": "array",
395
- "items": { "$ref": "#/$defs/DocEntry" }
396
- }
397
- },
398
- "required": ["kind", "path", "phase"],
399
- "additionalProperties": false
400
- },
401
- "DocVideo": {
402
- "type": "object",
403
- "properties": {
404
- "kind": { "const": "video" },
405
- "path": { "type": "string" },
406
- "caption": { "type": "string" },
407
- "poster": { "type": "string" },
408
- "phase": { "$ref": "#/$defs/DocPhase" },
409
- "children": {
410
- "type": "array",
411
- "items": { "$ref": "#/$defs/DocEntry" }
412
- }
413
- },
414
- "required": ["kind", "path", "phase"],
415
- "additionalProperties": false
416
- },
417
- "DocHtml": {
418
- "type": "object",
419
- "properties": {
420
- "kind": { "const": "html" },
421
- "path": { "type": "string" },
422
- "url": { "type": "string" },
423
- "content": { "type": "string" },
424
- "title": { "type": "string" },
425
- "height": { "oneOf": [{ "type": "number" }, { "type": "string" }] },
426
- "phase": { "$ref": "#/$defs/DocPhase" },
427
- "children": {
428
- "type": "array",
429
- "items": { "$ref": "#/$defs/DocEntry" }
430
- }
431
- },
432
- "required": ["kind", "phase"],
433
- "oneOf": [
434
- { "required": ["path"] },
435
- { "required": ["url"] },
436
- { "required": ["content"] }
437
- ],
438
- "additionalProperties": false
439
- },
440
- "DocCustom": {
441
- "type": "object",
442
- "properties": {
443
- "kind": { "const": "custom" },
444
- "type": { "type": "string", "minLength": 1 },
445
- "data": {},
446
- "phase": { "$ref": "#/$defs/DocPhase" },
447
- "children": {
448
- "type": "array",
449
- "items": { "$ref": "#/$defs/DocEntry" }
450
- }
451
- },
452
- "required": ["kind", "type", "data", "phase"],
453
- "additionalProperties": false
454
- }
455
- }
456
- }
@@ -1,57 +0,0 @@
1
- // @ts-check
2
- import starlight from '@astrojs/starlight';
3
- import astroMermaid from 'astro-mermaid';
4
- import remarkGfm from 'remark-gfm';
5
- import { defineConfig } from 'astro/config';
6
-
7
- /*
8
- * Available themes (match HTML formatter themes):
9
- * default — cucumber green, IBM Plex typography
10
- * corporate — navy, Playfair Display serif headings
11
- * terminal — green-on-dark, JetBrains Mono, flat
12
- * minimal — teal, Noto Serif Display headings, warm neutrals
13
- * dashboard — blue, DM Sans + JetBrains Mono
14
- * playful — coral, rounded corners, Source Sans 3
15
- *
16
- * To switch themes, replace `themes/default.css` below with the filename
17
- * of the theme you want (e.g. `./src/styles/themes/corporate.css`).
18
- */
19
-
20
- export default defineConfig({
21
- // GFM tables don't render in .mdx by default — enable them so hand-written
22
- // and generated .mdx pages (ADRs, API coverage, decision logs) show tables.
23
- markdown: {
24
- remarkPlugins: [remarkGfm],
25
- },
26
- integrations: [
27
- astroMermaid(),
28
- starlight({
29
- title: 'Story Docs',
30
- description: 'Living documentation generated from executable stories.',
31
- // Renders a live verification badge under the title of any page that
32
- // declares `verifiedBy` in its frontmatter.
33
- components: {
34
- PageTitle: './src/components/PageTitle.astro',
35
- },
36
- sidebar: [
37
- { label: 'Home', slug: 'index' },
38
- { label: 'Explorer', link: '/explorer/' },
39
- // Hand-written content — edited by the team, never overwritten by a regenerate.
40
- { label: 'Guides', autogenerate: { directory: 'guides' } },
41
- { label: 'Notes', autogenerate: { directory: 'notes' } },
42
- // Autogenerated, not a hard-coded slug — clearing the sample ADR (or the
43
- // whole directory) leaves the build green instead of 404ing on a missing slug.
44
- { label: 'Examples', autogenerate: { directory: 'examples' } },
45
- // Generated from tests by `format --format astro`.
46
- {
47
- label: 'Stories',
48
- autogenerate: { directory: 'stories' },
49
- },
50
- ],
51
- customCss: [
52
- './src/styles/global.css',
53
- './src/styles/themes/default.css',
54
- ],
55
- }),
56
- ],
57
- });
@@ -1,14 +0,0 @@
1
- node_modules/
2
- .astro/
3
- dist/
4
-
5
- # Machine-owned portal output. Regenerated by build-docs / CI.
6
- src/content/docs/stories/*
7
- !src/content/docs/stories/.gitkeep
8
- public/stories/assets/*
9
- !public/stories/assets/.gitkeep
10
- public/stories/story-report.json
11
- public/stories/scenario-links.json
12
- public/stories/notes-index.json
13
- !public/stories/notes-index.json
14
- public/stories/changes.json
@@ -1,20 +0,0 @@
1
- {
2
- "name": "story-docs",
3
- "type": "module",
4
- "version": "0.0.1",
5
- "private": true,
6
- "scripts": {
7
- "dev": "astro dev",
8
- "build": "astro build",
9
- "preview": "astro preview"
10
- },
11
- "dependencies": {
12
- "@astrojs/starlight": "^0.38.3",
13
- "astro": "^6.1.8",
14
- "astro-mermaid": "^2.0.1",
15
- "highlight.js": "^11.10.0",
16
- "marked": "^12.0.0",
17
- "mermaid": "^11.14.0",
18
- "remark-gfm": "^4.0.0"
19
- }
20
- }
@@ -1,4 +0,0 @@
1
- {
2
- "schemaVersion": "1.0",
3
- "notes": []
4
- }
@@ -1,17 +0,0 @@
1
- {
2
- "schemaVersion": "1.0",
3
- "runId": "empty",
4
- "startedAtMs": 0,
5
- "finishedAtMs": 0,
6
- "durationMs": 0,
7
- "projectRoot": "",
8
- "summary": {
9
- "total": 0,
10
- "passed": 0,
11
- "failed": 0,
12
- "skipped": 0,
13
- "pending": 0,
14
- "durationMs": 0
15
- },
16
- "features": []
17
- }