@@ -321,49 +321,64 @@ jobs:
321321
322322 // Build detailed changes section
323323 let detailedChanges = '';
324+ let hasChanges = false;
325+
326+ // Build inner content for details
327+ let changesContent = '';
324328
325329 // New files with coverage
326330 if (changesJson.new_files && changesJson.new_files.length > 0) {
327- detailedChanges += '\n### 🆕 New Files\n\n';
328- detailedChanges += '| Class | Coverage | Lines |\n';
329- detailedChanges += '|-------|----------|-------|\n';
331+ hasChanges = true;
332+ changesContent += '\n### 🆕 New Files\n\n';
333+ changesContent += '| Class | Coverage | Lines |\n';
334+ changesContent += '|-------|----------|-------|\n';
330335 for (const file of changesJson.new_files.slice(0, 10)) { // Limit to 10
331336 const emoji = file.coverage >= 80 ? '🟢' : file.coverage >= 60 ? '🟡' : '🔴';
332- detailedChanges += `| ${emoji} \`${file.class}\` | ${file.coverage.toFixed(2)}% | ${file.lines} |\n`;
337+ changesContent += `| ${emoji} \`${file.class}\` | ${file.coverage.toFixed(2)}% | ${file.lines} |\n`;
333338 }
334339 if (changesJson.new_files.length > 10) {
335- detailedChanges += `\n_... and ${changesJson.new_files.length - 10} more new files_\n`;
340+ changesContent += `\n_... and ${changesJson.new_files.length - 10} more new files_\n`;
336341 }
337342 }
338343
339344 // Improved coverage
340345 if (changesJson.improved && changesJson.improved.length > 0) {
341- detailedChanges += '\n### 📈 Coverage Improved\n\n';
342- detailedChanges += '| Class | Before | After | Change |\n';
343- detailedChanges += '|-------|--------|-------|--------|\n';
346+ hasChanges = true;
347+ changesContent += '\n### 📈 Coverage Improved\n\n';
348+ changesContent += '| Class | Before | After | Change |\n';
349+ changesContent += '|-------|--------|-------|--------|\n';
344350 const sortedImproved = changesJson.improved.sort((a, b) => b.diff - a.diff);
345351 for (const file of sortedImproved.slice(0, 10)) { // Limit to 10
346- detailedChanges += `| \`${file.class}\` | ${file.old.toFixed(2)}% | ${file.new.toFixed(2)}% | +${file.diff.toFixed(2)}% |\n`;
352+ changesContent += `| \`${file.class}\` | ${file.old.toFixed(2)}% | ${file.new.toFixed(2)}% | +${file.diff.toFixed(2)}% |\n`;
347353 }
348354 if (changesJson.improved.length > 10) {
349- detailedChanges += `\n_... and ${changesJson.improved.length - 10} more improvements_\n`;
355+ changesContent += `\n_... and ${changesJson.improved.length - 10} more improvements_\n`;
350356 }
351357 }
352358
353359 // Degraded coverage
354360 if (changesJson.degraded && changesJson.degraded.length > 0) {
355- detailedChanges += '\n### 📉 Coverage Decreased\n\n';
356- detailedChanges += '| Class | Before | After | Change |\n';
357- detailedChanges += '|-------|--------|-------|--------|\n';
361+ hasChanges = true;
362+ changesContent += '\n### 📉 Coverage Decreased\n\n';
363+ changesContent += '| Class | Before | After | Change |\n';
364+ changesContent += '|-------|--------|-------|--------|\n';
358365 const sortedDegraded = changesJson.degraded.sort((a, b) => a.diff - b.diff);
359366 for (const file of sortedDegraded.slice(0, 10)) { // Limit to 10
360- detailedChanges += `| \`${file.class}\` | ${file.old.toFixed(2)}% | ${file.new.toFixed(2)}% | ${file.diff.toFixed(2)}% |\n`;
367+ changesContent += `| \`${file.class}\` | ${file.old.toFixed(2)}% | ${file.new.toFixed(2)}% | ${file.diff.toFixed(2)}% |\n`;
361368 }
362369 if (changesJson.degraded.length > 10) {
363- detailedChanges += `\n_... and ${changesJson.degraded.length - 10} more decreases_\n`;
370+ changesContent += `\n_... and ${changesJson.degraded.length - 10} more decreases_\n`;
364371 }
365372 }
366373
374+ // Wrap in collapsible details if there are changes
375+ if (hasChanges) {
376+ const totalFiles = (changesJson.new_files?.length || 0) +
377+ (changesJson.improved?.length || 0) +
378+ (changesJson.degraded?.length || 0);
379+ detailedChanges = `\n<details>\n<summary>📊 File-level Coverage Changes (${totalFiles} files)</summary>\n${changesContent}\n</details>\n`;
380+ }
381+
367382 const comment = `## ${status} Code Coverage Report
368383
369384 | Metric | Value |
0 commit comments