donobu 5.30.0 → 5.31.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.
@@ -43,6 +43,7 @@ function buildDonobuReport(resultsByTest) {
43
43
  const results = resultsByTest.get(test) ?? [];
44
44
  return {
45
45
  annotations: test.annotations,
46
+ tags: test.tags,
46
47
  projectName: getProjectName(test),
47
48
  // Signal "skipped" tests to the renderers the same way the JSON
48
49
  // reporter does.
@@ -356,6 +356,7 @@ function extractTests(jsonData) {
356
356
  isSelfHealed,
357
357
  objective: objectiveAnnotation?.description ?? null,
358
358
  annotations,
359
+ tags: Array.isArray(test.tags) ? test.tags : [],
359
360
  results,
360
361
  projectName: test.projectName ?? '',
361
362
  plan: null,
@@ -1367,6 +1368,7 @@ function renderHtml(report, triage, outputDir) {
1367
1368
  <span class="test-name"><span class="test-file">${esc(displayFileName)}</span> (${esc(test.specTitle)})</span>
1368
1369
  </div>
1369
1370
  ${test.plan ? `<span class="inline-reason" style="color:${reasonCfg(test.plan.plan.failureReason).color}" title="${esc(test.plan.plan.failureReason)}">${esc(reasonCfg(test.plan.plan.failureReason).label)}</span>` : ''}
1371
+ ${test.tags.map((t) => `<span class="test-tag">${esc(t)}</span>`).join('')}
1370
1372
  ${totalStepCount > 0 ? `<span class="test-step-count" title="${totalStepCount} steps">${totalStepCount} steps</span>` : ''}
1371
1373
  <span class="test-duration">${fmtDuration(totalTestDuration)}</span>
1372
1374
  </div>
@@ -1473,6 +1475,7 @@ body::before{content:'';position:fixed;top:-750px;left:50%;transform:translateX(
1473
1475
  .copy-flow-id .check-icon{color:#22c55e}
1474
1476
  .inline-reason{font-size:11px;font-weight:500;flex-shrink:0;padding:1px 8px;border-radius:4px;background:var(--overlay-light)}
1475
1477
  .test-step-count{font-size:11px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,255,255,.04);border-radius:4px}
1478
+ .test-tag{font-size:11px;color:var(--accent);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,127,58,.08);border:1px solid rgba(255,127,58,.2);border-radius:4px}
1476
1479
  .test-duration{font-size:12px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono)}
1477
1480
  .flow-id-detail{display:flex;align-items:center;gap:10px;margin-bottom:4px;padding:8px 12px;background:var(--surface-raised);border:1px solid var(--border-subtle);border-radius:var(--radius)}
1478
1481
  .flow-id-detail .detail-label{margin-bottom:0;font-size:10px;letter-spacing:.8px}
@@ -105,6 +105,9 @@ function renderMarkdown(report) {
105
105
  (!result && test.status === undefined)) {
106
106
  markdown += `**Status**: ⏭️ Skipped \n`;
107
107
  markdown += `**Duration**: N/A \n`;
108
+ if (Array.isArray(test.tags) && test.tags.length > 0) {
109
+ markdown += `**Tags**: ${test.tags.join(' ')} \n`;
110
+ }
108
111
  const objectiveAnnotation = test.annotations?.find((a) => a.type === 'objective');
109
112
  if (objectiveAnnotation) {
110
113
  const objective = (objectiveAnnotation.description || 'No objective provided').replace(/```/g, '\\`\\`\\`');
@@ -142,6 +145,9 @@ function renderMarkdown(report) {
142
145
  const duration = formatDuration(result.duration || 0);
143
146
  markdown += `**Status**: ${status} \n`;
144
147
  markdown += `**Duration**: ${duration} \n`;
148
+ if (Array.isArray(test.tags) && test.tags.length > 0) {
149
+ markdown += `**Tags**: ${test.tags.join(' ')} \n`;
150
+ }
145
151
  if (healed) {
146
152
  markdown += `> ❤️‍🩹 This test was automatically healed by re-running with Donobu treatment plan directives.\n\n`;
147
153
  }
@@ -43,6 +43,7 @@ function buildDonobuReport(resultsByTest) {
43
43
  const results = resultsByTest.get(test) ?? [];
44
44
  return {
45
45
  annotations: test.annotations,
46
+ tags: test.tags,
46
47
  projectName: getProjectName(test),
47
48
  // Signal "skipped" tests to the renderers the same way the JSON
48
49
  // reporter does.
@@ -356,6 +356,7 @@ function extractTests(jsonData) {
356
356
  isSelfHealed,
357
357
  objective: objectiveAnnotation?.description ?? null,
358
358
  annotations,
359
+ tags: Array.isArray(test.tags) ? test.tags : [],
359
360
  results,
360
361
  projectName: test.projectName ?? '',
361
362
  plan: null,
@@ -1367,6 +1368,7 @@ function renderHtml(report, triage, outputDir) {
1367
1368
  <span class="test-name"><span class="test-file">${esc(displayFileName)}</span> (${esc(test.specTitle)})</span>
1368
1369
  </div>
1369
1370
  ${test.plan ? `<span class="inline-reason" style="color:${reasonCfg(test.plan.plan.failureReason).color}" title="${esc(test.plan.plan.failureReason)}">${esc(reasonCfg(test.plan.plan.failureReason).label)}</span>` : ''}
1371
+ ${test.tags.map((t) => `<span class="test-tag">${esc(t)}</span>`).join('')}
1370
1372
  ${totalStepCount > 0 ? `<span class="test-step-count" title="${totalStepCount} steps">${totalStepCount} steps</span>` : ''}
1371
1373
  <span class="test-duration">${fmtDuration(totalTestDuration)}</span>
1372
1374
  </div>
@@ -1473,6 +1475,7 @@ body::before{content:'';position:fixed;top:-750px;left:50%;transform:translateX(
1473
1475
  .copy-flow-id .check-icon{color:#22c55e}
1474
1476
  .inline-reason{font-size:11px;font-weight:500;flex-shrink:0;padding:1px 8px;border-radius:4px;background:var(--overlay-light)}
1475
1477
  .test-step-count{font-size:11px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,255,255,.04);border-radius:4px}
1478
+ .test-tag{font-size:11px;color:var(--accent);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,127,58,.08);border:1px solid rgba(255,127,58,.2);border-radius:4px}
1476
1479
  .test-duration{font-size:12px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono)}
1477
1480
  .flow-id-detail{display:flex;align-items:center;gap:10px;margin-bottom:4px;padding:8px 12px;background:var(--surface-raised);border:1px solid var(--border-subtle);border-radius:var(--radius)}
1478
1481
  .flow-id-detail .detail-label{margin-bottom:0;font-size:10px;letter-spacing:.8px}
@@ -105,6 +105,9 @@ function renderMarkdown(report) {
105
105
  (!result && test.status === undefined)) {
106
106
  markdown += `**Status**: ⏭️ Skipped \n`;
107
107
  markdown += `**Duration**: N/A \n`;
108
+ if (Array.isArray(test.tags) && test.tags.length > 0) {
109
+ markdown += `**Tags**: ${test.tags.join(' ')} \n`;
110
+ }
108
111
  const objectiveAnnotation = test.annotations?.find((a) => a.type === 'objective');
109
112
  if (objectiveAnnotation) {
110
113
  const objective = (objectiveAnnotation.description || 'No objective provided').replace(/```/g, '\\`\\`\\`');
@@ -142,6 +145,9 @@ function renderMarkdown(report) {
142
145
  const duration = formatDuration(result.duration || 0);
143
146
  markdown += `**Status**: ${status} \n`;
144
147
  markdown += `**Duration**: ${duration} \n`;
148
+ if (Array.isArray(test.tags) && test.tags.length > 0) {
149
+ markdown += `**Tags**: ${test.tags.join(' ')} \n`;
150
+ }
145
151
  if (healed) {
146
152
  markdown += `> ❤️‍🩹 This test was automatically healed by re-running with Donobu treatment plan directives.\n\n`;
147
153
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "donobu",
3
- "version": "5.30.0",
3
+ "version": "5.31.0",
4
4
  "description": "Create browser automations with an LLM agent and replay them as Playwright scripts.",
5
5
  "main": "dist/main.js",
6
6
  "module": "dist/esm/main.js",